rev |
line source |
pascal@208
|
1 #!/bin/sh
|
pascal@208
|
2 #
|
pascal@208
|
3 # Main CGI interface for Tazinst, the SliTaz installer.
|
pascal@208
|
4 #
|
pankso@254
|
5 # Copyright (C) 2012 SliTaz GNU/Linux - BSD License
|
pascal@208
|
6 #
|
pascal@208
|
7 # Authors : Dominique Corbex <domcox@slitaz.org>
|
pascal@208
|
8 #
|
pascal@208
|
9
|
domcox@258
|
10 VERSION=0.25
|
pascal@208
|
11
|
pascal@208
|
12 # Common functions from libtazpanel
|
pascal@208
|
13 . lib/libtazpanel
|
pascal@208
|
14 header
|
pascal@208
|
15 get_config
|
pascal@208
|
16
|
pascal@208
|
17 # Include gettext helper script.
|
pascal@208
|
18 . /usr/bin/gettext.sh
|
pascal@208
|
19
|
pascal@208
|
20 # Export package name for gettext.
|
pascal@208
|
21 TEXTDOMAIN='installer'
|
pascal@208
|
22 export TEXTDOMAIN
|
pascal@208
|
23
|
pascal@208
|
24 TITLE="- Installer"
|
pascal@208
|
25
|
pascal@208
|
26 # Tazinst required version
|
pascal@208
|
27 TAZINST_REQUIRED_VERSION="3.3"
|
pascal@208
|
28
|
pascal@208
|
29 # Tazinst setup file
|
pascal@208
|
30 INSTFILE=/var/lib/tazinst.conf
|
pascal@208
|
31
|
pascal@208
|
32
|
pascal@208
|
33 write_setup()
|
pascal@208
|
34 {
|
pascal@208
|
35 if [ -e "$INSTFILE" ]; then
|
pascal@208
|
36 # Install type
|
pascal@208
|
37 INST_TYPE=$(GET INST_TYPE)
|
pascal@208
|
38 # Source File
|
pascal@208
|
39 case "$INST_TYPE" in
|
pascal@208
|
40 usb)
|
pascal@208
|
41 SRC_FILE=$(GET SRC_USB) ;;
|
pascal@208
|
42 iso)
|
pascal@208
|
43 SRC_FILE=$(GET SRC_ISO) ;;
|
pascal@208
|
44 web)
|
pascal@208
|
45 SRC_FILE=$(GET SRC_WEB) ;;
|
pascal@208
|
46 esac
|
pascal@208
|
47 SRC_FILE=$(echo "$SRC_FILE" | sed 's/\//\\\//'g)
|
pascal@208
|
48 [ -n $(GET URL) ] && SRC_WEB=$(GET URL)
|
pascal@208
|
49 # Main Partition
|
pascal@208
|
50 TGT_PARTITION=$(echo "$(GET TGT_PARTITION)" | sed 's/\//\\\//'g)
|
pascal@208
|
51 [ -n "$(GET MAIN_FMT)" ] && TGT_FS=$(GET MAIN_FS) || TGT_FS=""
|
pascal@208
|
52 # Home Partition
|
domcox@258
|
53 if [ -n "$(GET HOME_SELECT)" ] ; then
|
domcox@258
|
54 TGT_HOME=$(echo "$(GET TGT_HOME)" | sed 's/\//\\\//'g)
|
domcox@258
|
55 [ -n "$(GET HOME_FS)" ] && TGT_HOME_FS=$(GET HOME_FS)
|
pascal@208
|
56 else
|
pascal@208
|
57 TGT_HOME=""
|
pascal@208
|
58 TGT_HOME_FS=""
|
pascal@208
|
59 fi
|
pascal@208
|
60 # Hostname
|
pascal@208
|
61 TGT_HOSTNAME=$(GET TGT_HOSTNAME)
|
pascal@208
|
62 # Root pwd
|
pascal@208
|
63 TGT_ROOT_PWD=$(GET TGT_ROOT_PWD)
|
pascal@208
|
64 # User Login
|
pascal@208
|
65 TGT_USER=$(GET TGT_USER)
|
pascal@208
|
66 # User Pwd
|
pascal@208
|
67 TGT_USER_PWD=$(GET TGT_USER_PWD)
|
pascal@208
|
68 # Grub
|
pascal@208
|
69 TGT_GRUB=$(GET TGT_GRUB)
|
pascal@208
|
70 [ "$TGT_GRUB" == "yes" ] || TGT_GRUB=no
|
pascal@208
|
71 # Win Dual-Boot
|
pascal@208
|
72 TGT_WINBOOT=$(GET TGT_WINBOOT)
|
pascal@208
|
73
|
pascal@208
|
74 # Save changes to INSTFILE
|
pascal@208
|
75 sed -i s/"^INST_TYPE=.*"/"INST_TYPE=\"$INST_TYPE\"/" $INSTFILE
|
pascal@208
|
76 sed -i s/"^SRC_FILE=.*"/"SRC_FILE=\"$SRC_FILE\"/" $INSTFILE
|
pascal@208
|
77 sed -i s/"^TGT_PARTITION=.*"/"TGT_PARTITION=\"$TGT_PARTITION\"/" $INSTFILE
|
pascal@208
|
78 sed -i s/"^TGT_FS=.*"/"TGT_FS=\"$TGT_FS\"/" $INSTFILE
|
pascal@208
|
79 sed -i s/"^TGT_HOME=.*"/"TGT_HOME=\"$TGT_HOME\"/" $INSTFILE
|
pascal@208
|
80 sed -i s/"^TGT_HOME_FS=.*"/"TGT_HOME_FS=\"$TGT_HOME_FS\"/" $INSTFILE
|
pascal@208
|
81 sed -i s/"^TGT_HOSTNAME=.*"/"TGT_HOSTNAME=\"$TGT_HOSTNAME\"/" $INSTFILE
|
pascal@208
|
82 sed -i s/"^TGT_ROOT_PWD=.*"/"TGT_ROOT_PWD=\"$TGT_ROOT_PWD\"/" $INSTFILE
|
pascal@208
|
83 sed -i s/"^TGT_USER=.*"/"TGT_USER=\"$TGT_USER\"/" $INSTFILE
|
pascal@208
|
84 sed -i s/"^TGT_USER_PWD=.*"/"TGT_USER_PWD=\"$TGT_USER_PWD\"/" $INSTFILE
|
pascal@208
|
85 sed -i s/"^TGT_GRUB=.*"/"TGT_GRUB=\"$TGT_GRUB\"/" $INSTFILE
|
pascal@208
|
86 sed -i s/"^TGT_WINBOOT=.*"/"TGT_WINBOOT=\"$TGT_WINBOOT\"/" $INSTFILE
|
pascal@208
|
87 fi
|
pascal@208
|
88 }
|
pascal@208
|
89
|
domcox@258
|
90 read_setup()
|
pascal@208
|
91 {
|
domcox@258
|
92 # various checks on setup file
|
domcox@258
|
93 if [ -e "$INSTFILE" ]; then
|
domcox@258
|
94 # validity check + reformat output
|
domcox@258
|
95 IFS=$'\n'
|
domcox@258
|
96 for line in $(tazinst check $INSTFILE)
|
domcox@258
|
97 do
|
domcox@258
|
98 line=$(echo $line | sed 's/\[1m//g')
|
domcox@258
|
99 line=$(echo $line | sed 's/\[0m//g')
|
domcox@258
|
100 line=$(echo $line | sed 's/\s/\ /g')
|
domcox@258
|
101 line=$(echo $line | sed 's/</\</g')
|
domcox@258
|
102 line=$(echo $line | sed 's/>/\>/g')
|
domcox@258
|
103 echo "<font color=\"red\">$line<br /></font>"
|
domcox@258
|
104 done
|
domcox@258
|
105 unset IFS
|
domcox@258
|
106 else
|
domcox@258
|
107 # no setup file found: creating
|
domcox@258
|
108 gettext "Creating setup file $INSTFILE."
|
domcox@258
|
109 tazinst new $INSTFILE
|
domcox@258
|
110 if [ ! -e "$INSTFILE" ]; then
|
domcox@258
|
111 cat <<EOT
|
domcox@258
|
112 <font color="red">$(gettext "Setup File Error")<br />
|
domcox@258
|
113 $(gettext "The setup file <strong>$INSTFILE</strong> doesn't exist.")</font><br />
|
domcox@258
|
114 EOT
|
domcox@258
|
115 else
|
domcox@258
|
116 if [ ! -r $INSTFILE ]; then
|
domcox@258
|
117 cat <<EOT
|
domcox@258
|
118 <font color="red">$(gettext "Setup File Error")<br />
|
domcox@258
|
119 $(gettext "The setup file <strong>$INSTFILE</strong> is not readable.
|
domcox@258
|
120 Check permissions and ownership.")</font><br />
|
domcox@258
|
121 EOT
|
domcox@258
|
122 fi
|
domcox@258
|
123 fi
|
domcox@258
|
124 fi
|
domcox@258
|
125 # read setup file
|
domcox@258
|
126 . $INSTFILE
|
pascal@208
|
127 }
|
pascal@208
|
128
|
pascal@208
|
129 select_action()
|
pascal@208
|
130 {
|
pascal@208
|
131 cat <<EOT
|
pascal@208
|
132 <div id="wrapper">
|
pascal@208
|
133 <h2>$(gettext "SliTaz Installer")</h2>
|
paul@209
|
134 <p>$(gettext "The SliTaz Installer installs or upgrades SliTaz to a hard disk
|
paul@209
|
135 drive from a device like a Live-CD or LiveUSB key, from a SliTaz ISO file, or
|
pascal@208
|
136 from the web by downloading an ISO file.")<p>
|
pascal@208
|
137 </div>
|
pascal@208
|
138 EOT
|
pascal@208
|
139 }
|
pascal@208
|
140
|
pascal@208
|
141 select_gparted()
|
pascal@208
|
142 {
|
pascal@208
|
143 cat <<EOT
|
pankso@254
|
144 <div class="box">
|
pankso@254
|
145 <h4>$(gettext "About")</h4>
|
pankso@254
|
146 <p>
|
pankso@254
|
147 $(gettext "Before installation, you may need to resize partitions
|
pankso@254
|
148 on your hard disk drive in order to make space for SliTaz GNU/Linux.
|
paul@257
|
149 You can graphically manage your partitions with Gparted")
|
pankso@254
|
150 </p>
|
pankso@254
|
151 </div>
|
domcox@258
|
152 <a class="button" href="$SCRIPT_NAME?page=gparted">$(gettext "Execute Gparted")</a>
|
pascal@208
|
153 EOT
|
pascal@208
|
154 }
|
pascal@208
|
155
|
pascal@208
|
156 select_install()
|
pascal@208
|
157 {
|
pascal@208
|
158 cat <<EOT
|
pankso@254
|
159 <div class="box">
|
pankso@254
|
160 <h4>$(gettext "Install")</h4>
|
pankso@254
|
161 <p>
|
pankso@254
|
162 $(gettext "Install SliTaz on a partition of your hard disk drive. If
|
pascal@208
|
163 you decide to format your HDD, all data will be lost. If you do not
|
pascal@208
|
164 format, all data except for any existing /home directory will be removed,
|
pankso@254
|
165 the home directory will be kept as is.")
|
pankso@254
|
166 </p>
|
pankso@254
|
167 </div>
|
pankso@254
|
168 <p>
|
pankso@254
|
169 <a class="button" href="$SCRIPT_NAME?page=install">$(gettext "Install SliTaz")</a>
|
pascal@208
|
170 EOT
|
pascal@208
|
171 }
|
pascal@208
|
172
|
pascal@208
|
173 select_upgrade()
|
pascal@208
|
174 {
|
pascal@208
|
175 cat <<EOT
|
pankso@254
|
176 <div class="box">
|
pankso@254
|
177 <h4>$(gettext "Upgrade")</h4>
|
pankso@254
|
178 <p>
|
pankso@254
|
179 $(gettext "Upgrade an already installed SliTaz system on your hard disk
|
pascal@208
|
180 drive. Your /home /etc /var/www directories will be kept, all other directories
|
paul@209
|
181 will be removed. Any additional packages added to your old Slitaz system
|
pankso@254
|
182 will be updated as long you have an active internet connection.")
|
pankso@254
|
183 </p>
|
pankso@254
|
184 </div>
|
pankso@254
|
185 <p>
|
pankso@254
|
186 <a class="button" href="$SCRIPT_NAME?page=upgrade">$(gettext "Upgrade SliTaz")</a>
|
pankso@254
|
187 </p>
|
pascal@208
|
188 EOT
|
pascal@208
|
189 }
|
pascal@208
|
190
|
pascal@208
|
191 display_action()
|
pascal@208
|
192 {
|
pascal@208
|
193 case $1 in
|
pascal@208
|
194 install)
|
pascal@208
|
195 cat << EOT
|
pascal@208
|
196 <div id="wrapper">
|
pascal@208
|
197 <h3>$(gettext "Install SliTaz")</h3>
|
pascal@208
|
198 <p>$(gettext "You're going to install SliTaz on a partition of your hard disk drive. If
|
pascal@208
|
199 you decide to format your HDD, all data will be lost. If you do not
|
pascal@208
|
200 format, all data except for any existing /home directory will be removed,
|
pascal@208
|
201 the home directory will be kept as is.")<p>
|
pascal@208
|
202 </div>
|
pascal@208
|
203 <input type="hidden" name="INST_ACTION" value="$1">
|
pascal@208
|
204 EOT
|
pascal@208
|
205 ;;
|
pascal@208
|
206 upgrade)
|
pascal@208
|
207 cat << EOT
|
pascal@208
|
208 <div id="wrapper">
|
pascal@208
|
209 <h2>$(gettext "Upgrade SliTaz")</h2>
|
pascal@208
|
210 <p>$(gettext "You're going to upgrade an already installed SliTaz system on your hard disk
|
pascal@208
|
211 drive. Your /home /etc /var/www directories will be kept, all other directories
|
paul@209
|
212 will be removed. Any additional packages added to your old Slitaz system
|
pascal@208
|
213 will be updated as long you have an active internet connection.")<p>
|
pascal@208
|
214 </div>
|
pascal@208
|
215 <input type="hidden" name="INST_ACTION" value="$1">
|
pascal@208
|
216 EOT
|
pascal@208
|
217 ;;
|
pascal@208
|
218 esac
|
pascal@208
|
219 }
|
pascal@208
|
220
|
pascal@208
|
221 select_source()
|
pascal@208
|
222 {
|
pascal@208
|
223 cat <<EOT
|
pascal@208
|
224 <a name="source"></a>
|
pascal@208
|
225 <h4>$(gettext "Source")</h4>
|
domcox@260
|
226 <div class="box">
|
domcox@260
|
227 <input type="radio" name="INST_TYPE" value="cdrom" $([ "$INST_TYPE" == "cdrom" ] && echo "checked") id="cdrom" />
|
domcox@260
|
228 <label for="cdrom">$(gettext "LiveCD")</td></label>
|
domcox@260
|
229 <br />
|
domcox@260
|
230 <input type="radio" name="INST_TYPE" value="usb" $([ "$INST_TYPE" == "usb" ] && echo "checked") id="usb" />
|
domcox@260
|
231 <label for="usb">$(gettext "LiveUSB"):
|
domcox@260
|
232 <select name="SRC_USB">
|
pascal@208
|
233 EOT
|
pascal@208
|
234 # List disks if plugged USB device
|
pascal@208
|
235 usb=0
|
pascal@208
|
236 if [ -d /proc/scsi/usb-storage ]; then
|
pascal@208
|
237 for DEV in /sys/block/sd* ; do
|
pascal@208
|
238 if readlink $DEV | grep -q usb; then
|
pascal@208
|
239 DEV=$(basename $DEV)
|
pascal@208
|
240 if [ -d /sys/block/${DEV}/${DEV}1 ]; then
|
pascal@208
|
241 for i in $(fdisk -l /dev/$DEV | awk '/^\/dev/ {printf "%s ", $1}') ; do
|
pascal@208
|
242 echo "<option value='$i' $([ "$i" == "$SRC_FILE" ] && echo "selected") >$i</option>"
|
pascal@208
|
243 usb=$usb+1
|
pascal@208
|
244 done
|
pascal@208
|
245 fi
|
pascal@208
|
246 fi
|
pascal@208
|
247 done
|
pascal@208
|
248 fi
|
pascal@208
|
249 if [ $usb -lt 1 ]; then
|
pascal@208
|
250 echo "<option value="">$(gettext "Not found")</option>"
|
pascal@208
|
251 fi
|
pascal@208
|
252 cat << EOT
|
domcox@260
|
253 </select>
|
domcox@260
|
254 </label>
|
domcox@260
|
255 <br />
|
domcox@260
|
256 <input type="radio" name="INST_TYPE" value="iso" $([ "$INST_TYPE" == "iso" ] && echo "checked") id="iso" />
|
domcox@260
|
257 <label for="iso">$(gettext "ISO file"):</label>
|
domcox@260
|
258 <input type="url" size="50" name="SRC_ISO" $([ "$INST_TYPE" == "iso" ] && echo -e "value=\"$SRC_FILE\"") placeholder="$(gettext "Full path to the ISO image file")" />
|
domcox@260
|
259 <br />
|
domcox@260
|
260 <input type="radio" name="INST_TYPE" value="web" $([ "$INST_TYPE" == "web" ] && echo "checked") id="web" />
|
domcox@260
|
261 <label for="web">$(gettext "Web"):
|
domcox@260
|
262 <a class="button" onclick="document.forms['ConfigForm'].url.value = '$(tazinst showurl stable)'; return true;">$(gettext "Stable")</a>
|
domcox@260
|
263 <a class="button" onclick="document.forms['ConfigForm'].url.value = '$(tazinst showurl cooking)'; return true;">$(gettext "Cooking")</a>
|
domcox@260
|
264 $(gettext "URL:")
|
domcox@260
|
265 <input id="url" type="url" size="55" name="SRC_WEB" value="$get_SRC_WEB" placeholder="$(gettext "Full url to an ISO image file")" />
|
domcox@260
|
266 </label>
|
domcox@260
|
267 </div>
|
pascal@208
|
268 EOT
|
pascal@208
|
269 }
|
pascal@208
|
270
|
pascal@208
|
271 select_partition()
|
pascal@208
|
272 {
|
domcox@260
|
273 cat <<EOT
|
pascal@208
|
274 <a name="partition"></a>
|
pascal@208
|
275 <h4></span>$(gettext "Main Partition")</h4>
|
domcox@260
|
276 <div class="box">
|
domcox@260
|
277 $(gettext "Partition to use:")
|
domcox@260
|
278 <select name="TGT_PARTITION">
|
pascal@208
|
279 EOT
|
pascal@208
|
280 # List partitions
|
pascal@208
|
281 if fdisk -l | grep -q ^/dev/ ; then
|
domcox@258
|
282 echo "<option value="">$(gettext "None")</option>"
|
pascal@208
|
283 for i in $(fdisk -l | awk '/^\/dev/ {printf "%s " $1}'); do
|
pascal@208
|
284 echo "<option value='$i' $([ "$i" == "$TGT_PARTITION" ] && echo "selected")>$i</option>"
|
pascal@208
|
285 done
|
pascal@208
|
286 else
|
pascal@208
|
287 echo "<option value="">$(gettext "Not found")</option>"
|
pascal@208
|
288 fi
|
pascal@208
|
289 cat << EOT
|
domcox@260
|
290 </select>
|
domcox@260
|
291 <br />
|
domcox@260
|
292 <input type="checkbox" name="MAIN_FMT" value="yes" $([ -n "$TGT_FS" ] && echo "checked") id="mainfs" />
|
domcox@260
|
293 <label for="mainfs">$(gettext "Format partition as"):</label>
|
domcox@260
|
294 <select name="MAIN_FS">
|
pascal@208
|
295 EOT
|
pascal@208
|
296 scan_mkfs
|
pascal@208
|
297 for i in $FS
|
pascal@208
|
298 do
|
pascal@208
|
299 echo "<option value='$i' $([ "$i" == "$TGT_FS" ] && echo "selected")>$i</option>"
|
pascal@208
|
300 done
|
pascal@208
|
301 cat <<EOT
|
pascal@208
|
302 </select>
|
domcox@260
|
303 </div>
|
pascal@208
|
304 EOT
|
pascal@208
|
305 }
|
pascal@208
|
306
|
pascal@208
|
307 select_old_slitaz()
|
pascal@208
|
308 {
|
domcox@260
|
309 cat <<EOT
|
pascal@208
|
310 <a name="partition"></a>
|
pascal@208
|
311 <h4></span>$(gettext "Existing SliTaz Partition")</h4>
|
domcox@260
|
312 <div class="box">
|
domcox@260
|
313 $(gettext "Partition in use:")
|
domcox@260
|
314 <select name="TGT_PARTITION">
|
pascal@208
|
315 EOT
|
pascal@208
|
316 # List partitions
|
pascal@208
|
317 if fdisk -l | grep -q ^/dev/ ; then
|
domcox@258
|
318 echo "<option value="">$(gettext "None")</option>"
|
pascal@208
|
319 for i in `blkid | cut -d ":" -f 1`; do
|
pascal@208
|
320 echo "<option value='$i' $([ "$i" == "$TGT_PARTITION" ] && echo "selected")>$i</option>"
|
pascal@208
|
321 done
|
pascal@208
|
322 else
|
pascal@208
|
323 echo "<option value="">$(gettext "Not found")</option>"
|
pascal@208
|
324 fi
|
pascal@208
|
325 cat <<EOT
|
pascal@208
|
326 </select>
|
domcox@260
|
327 </div>
|
pascal@208
|
328 EOT
|
pascal@208
|
329 }
|
pascal@208
|
330
|
pascal@208
|
331 select_home()
|
pascal@208
|
332 {
|
pascal@208
|
333 cat <<EOT
|
pascal@208
|
334 <a name="home"></a>
|
pascal@208
|
335 <h4>$(gettext "Home partition")</h4>
|
domcox@258
|
336 <input type="checkbox" name="HOME_SELECT" value="yes" $([ -n "$TGT_HOME" ] && echo "checked") id="homepart" />
|
domcox@260
|
337 <label for="homepart">$(gettext "Use a separate partition for /home:")</label>
|
domcox@260
|
338 <select name="TGT_HOME">
|
pascal@208
|
339 EOT
|
pascal@208
|
340 # List disk if plugged USB device
|
pascal@208
|
341 if fdisk -l | grep -q ^/dev/ ; then
|
domcox@258
|
342 echo "<option value="">$(gettext "None")</option>"
|
pascal@208
|
343 for i in $(fdisk -l | awk '/^\/dev/ {printf "%s " $1}'); do
|
pascal@208
|
344 echo "<option value='$i' $([ "$i" == "$TGT_HOME" ] && echo "selected")>$i</option>"
|
pascal@208
|
345 done
|
pascal@208
|
346 else
|
pascal@208
|
347 echo "<option value="">$(gettext "Not found")</option>"
|
pascal@208
|
348 fi
|
pascal@208
|
349 cat <<EOT
|
domcox@260
|
350 </select>
|
pascal@208
|
351
|
domcox@260
|
352 <input type="checkbox" name="HOME_FMT" value="yes" $([ -n "$TGT_HOME_FS" ] && echo "checked") id="homefs" />
|
domcox@260
|
353 <label for="homefs">$(gettext "Format partition as:")</label>
|
domcox@260
|
354 <select name="HOME_FS">"
|
pascal@208
|
355 EOT
|
pascal@208
|
356 for i in $FS
|
pascal@208
|
357 do
|
pascal@208
|
358 echo "<option value='$i' $([ "$i" == "$TGT_HOME_FS" ] && echo "selected")>$i</option>"
|
pascal@208
|
359 done
|
pascal@208
|
360 echo "</select>"
|
pascal@208
|
361 }
|
pascal@208
|
362
|
pascal@208
|
363 select_hostname()
|
pascal@208
|
364 {
|
pascal@208
|
365 cat << EOT
|
domcox@260
|
366 <script type="text/javascript">
|
domcox@260
|
367 function checkHostname(){
|
domcox@260
|
368 var host = document.getElementById('h1');
|
domcox@260
|
369 var msg = document.getElementById('hostAlert');
|
domcox@260
|
370 var enoughRegex = new RegExp("(?=.{3,}).*", "g");
|
domcox@260
|
371 var incharRegex = new RegExp("^[A-Za-z0-9_]{3,20}$");
|
domcox@260
|
372 if (false == enoughRegex.test(host.value)) {
|
domcox@260
|
373 msg.style.color = "tomato";
|
domcox@260
|
374 msg.innerHTML ="✖ Too short";
|
domcox@260
|
375 return false;
|
domcox@260
|
376 } else if (false == incharRegex.test(host.value)) {
|
domcox@260
|
377 msg.style.color = "tomato";
|
domcox@260
|
378 msg.innerHTML ="✖ Invalid chars";
|
domcox@260
|
379 return false;
|
domcox@260
|
380 } else {
|
domcox@260
|
381 msg.style.color = "limegreen";
|
domcox@260
|
382 msg.innerHTML = "✔";
|
domcox@260
|
383 }
|
domcox@260
|
384 }
|
domcox@260
|
385 </script>
|
pascal@208
|
386 <a name="hostname"></a>
|
pascal@208
|
387 <h4>$(gettext "Host")</h4>
|
pascal@208
|
388 $(gettext "Hostname:")
|
domcox@260
|
389 <input type="text" id="h1" name="TGT_HOSTNAME" value="$TGT_HOSTNAME" placeholder="$(gettext "Name of your system")" onkeyup="checkHostname(); return false;" />
|
domcox@260
|
390 <span id="hostAlert"></span>
|
pascal@208
|
391 EOT
|
pascal@208
|
392 }
|
pascal@208
|
393
|
pascal@208
|
394 select_root()
|
pascal@208
|
395 {
|
pascal@208
|
396 cat << EOT
|
domcox@260
|
397 <script type="text/javascript">
|
domcox@260
|
398 function checkRootPwd(){
|
domcox@260
|
399 var pwd1 = document.getElementById('p1');
|
domcox@260
|
400 var pwd2 = document.getElementById('p2');
|
domcox@260
|
401 var msg = document.getElementById('rootPwdAlert');
|
domcox@260
|
402 if(pwd1.value == pwd2.value){
|
domcox@260
|
403 // passwords match.
|
domcox@260
|
404 pwd2.style.backgroundColor = "white";
|
domcox@260
|
405 // various checks
|
domcox@260
|
406 var enoughRegex = new RegExp("(?=.{4,}).*", "g");
|
domcox@260
|
407 var incharRegex = new RegExp("^[A-Za-z0-9!@#$%^&*()_]{4,20}$");
|
domcox@260
|
408 var strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g");
|
domcox@260
|
409 var mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g");
|
domcox@260
|
410 if (pwd1.value.length==0) {
|
domcox@260
|
411 msg.style.color = "tomato";
|
domcox@260
|
412 msg.innerHTML = "✖ Missing Password";
|
domcox@260
|
413 return false;
|
domcox@260
|
414 } else if (false == enoughRegex.test(pwd1.value)) {
|
domcox@260
|
415 msg.style.color = "tomato";
|
domcox@260
|
416 msg.innerHTML ="✖ Too short";
|
domcox@260
|
417 return false;
|
domcox@260
|
418 } else if (false == incharRegex.test(pwd1.value)) {
|
domcox@260
|
419 msg.style.color = "tomato";
|
domcox@260
|
420 msg.innerHTML ="✖ Invalid chars";
|
domcox@260
|
421 return false;
|
domcox@260
|
422 } else if (strongRegex.test(pwd1.value)) {
|
domcox@260
|
423 msg.style.color = "limegreen";
|
domcox@260
|
424 msg.innerHTML = "✔ Strong!";
|
domcox@260
|
425 } else if (mediumRegex.test(pwd1.value)) {
|
domcox@260
|
426 msg.style.color = "limegreen";
|
domcox@260
|
427 msg.innerHTML = "✔ Medium!";
|
domcox@260
|
428 } else {
|
domcox@260
|
429 msg.style.color = "orange";
|
domcox@260
|
430 msg.innerHTML = "✔ Weak";
|
domcox@260
|
431 }
|
domcox@260
|
432 }else{
|
domcox@260
|
433 // passwords do not match.
|
domcox@260
|
434 pwd2.style.backgroundColor = "lightsalmon";
|
domcox@260
|
435 msg.style.color = "tomato";
|
domcox@260
|
436 msg.innerHTML = "✖ Do Not Match!"
|
domcox@260
|
437 return false;
|
domcox@260
|
438 }
|
domcox@260
|
439 }
|
domcox@260
|
440 </script>
|
domcox@260
|
441
|
pascal@208
|
442 <a name="root"></a>
|
pascal@208
|
443 <h4>$(gettext "Root")</h4>
|
pascal@208
|
444 $(gettext "Root passwd:")
|
domcox@260
|
445 <input type="password" id="p1" name="TGT_ROOT_PWD" value="$TGT_ROOT_PWD" placeholder="$(gettext "Password of root")" onkeyup="checkRootPwd(); return false;" />
|
domcox@260
|
446 $(gettext "Confirm password:")
|
domcox@260
|
447 <input type="password" id="p2" value="$TGT_ROOT_PWD" placeholder="$(gettext "Password of root")" onkeyup="checkRootPwd(); return false;" />
|
domcox@260
|
448 <span id="rootPwdAlert"></span>
|
pascal@208
|
449 EOT
|
pascal@208
|
450 }
|
pascal@208
|
451
|
pascal@208
|
452 select_user()
|
pascal@208
|
453 {
|
pascal@208
|
454 cat << EOT
|
domcox@260
|
455 <script type="text/javascript">
|
domcox@260
|
456 function checkUserLogin(){
|
domcox@260
|
457 var user = document.getElementById('u1');
|
domcox@260
|
458 var msg = document.getElementById('userLoginAlert');
|
domcox@260
|
459 var enoughRegex = new RegExp("(?=.{3,}).*", "g");
|
domcox@260
|
460 var incharRegex = new RegExp("^[A-Za-z0-9_]{3,20}$");
|
domcox@260
|
461 if (false == enoughRegex.test(user.value)) {
|
domcox@260
|
462 msg.style.color = "tomato";
|
domcox@260
|
463 msg.innerHTML ="✖ Too short";
|
domcox@260
|
464 return false;
|
domcox@260
|
465 } else if (false == incharRegex.test(user.value)) {
|
domcox@260
|
466 msg.style.color = "tomato";
|
domcox@260
|
467 msg.innerHTML ="✖ Invalid chars";
|
domcox@260
|
468 return false;
|
domcox@260
|
469 } else {
|
domcox@260
|
470 msg.style.color = "limegreen";
|
domcox@260
|
471 msg.innerHTML = "✔";
|
domcox@260
|
472 }
|
domcox@260
|
473 }
|
domcox@260
|
474 function checkUserPwd(){
|
domcox@260
|
475 var pwd1 = document.getElementById('p3');
|
domcox@260
|
476 var pwd2 = document.getElementById('p4');
|
domcox@260
|
477 var msg = document.getElementById('userPwdAlert');
|
domcox@260
|
478 if(pwd1.value == pwd2.value){
|
domcox@260
|
479 // passwords match.
|
domcox@260
|
480 pwd2.style.backgroundColor = "white";
|
domcox@260
|
481 // various checks
|
domcox@260
|
482 var enoughRegex = new RegExp("(?=.{3,}).*", "g");
|
domcox@260
|
483 var incharRegex = new RegExp("^[A-Za-z0-9!@#$%^&*()_]{3,20}$");
|
domcox@260
|
484 var strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g");
|
domcox@260
|
485 var mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g");
|
domcox@260
|
486 if (pwd1.value.length==0) {
|
domcox@260
|
487 msg.style.color = "orange";
|
domcox@260
|
488 msg.innerHTML = "✔ No Password";
|
domcox@260
|
489 } else if (false == enoughRegex.test(pwd1.value)) {
|
domcox@260
|
490 msg.style.color = "tomato";
|
domcox@260
|
491 msg.innerHTML ="✖ Too short";
|
domcox@260
|
492 return false;
|
domcox@260
|
493 } else if (false == incharRegex.test(pwd1.value)) {
|
domcox@260
|
494 msg.style.color = "tomato";
|
domcox@260
|
495 msg.innerHTML ="✖ Invalid chars";
|
domcox@260
|
496 return false;
|
domcox@260
|
497 } else if (strongRegex.test(pwd1.value)) {
|
domcox@260
|
498 msg.style.color = "limegreen";
|
domcox@260
|
499 msg.innerHTML = "✔ Strong!";
|
domcox@260
|
500 } else if (mediumRegex.test(pwd1.value)) {
|
domcox@260
|
501 msg.style.color = "limegreen";
|
domcox@260
|
502 msg.innerHTML = "✔ Medium!";
|
domcox@260
|
503 } else {
|
domcox@260
|
504 msg.style.color = "orange";
|
domcox@260
|
505 msg.innerHTML = "✔ Weak";
|
domcox@260
|
506 }
|
domcox@260
|
507 }else{
|
domcox@260
|
508 // passwords do not match.
|
domcox@260
|
509 pwd2.style.backgroundColor = "lightsalmon";
|
domcox@260
|
510 msg.style.color = "tomato";
|
domcox@260
|
511 msg.innerHTML = "✖ Do Not Match!"
|
domcox@260
|
512 return false;
|
domcox@260
|
513 }
|
domcox@260
|
514 }
|
domcox@260
|
515 </script>
|
pascal@208
|
516 <a name="user"></a>
|
pascal@208
|
517 <h4>$(gettext "User")</h4>
|
pascal@208
|
518 $(gettext "User login:")
|
domcox@260
|
519 <input type="text" id="u1" name="TGT_USER" value="$TGT_USER" placeholder="$(gettext "Name of the first user")" onkeyup="checkUserLogin(); return false;" />
|
domcox@260
|
520 <span id="userLoginAlert"></span>
|
domcox@260
|
521 <br /><br />
|
pascal@208
|
522 $(gettext "User passwd:")
|
domcox@260
|
523 <input type="password" id="p3" name="TGT_USER_PWD" value="$TGT_USER_PWD" placeholder="$(gettext "Password of the first user")" onkeyup="checkUserPwd(); return false;" />
|
domcox@260
|
524 $(gettext "Confirm password:")
|
domcox@260
|
525 <input type="password" id="p4" value="$TGT_USER_PWD" placeholder="$(gettext "Password of the first user")" onkeyup="checkUserPwd(); return false;" />
|
domcox@260
|
526 <span id="userPwdAlert"></span>
|
pascal@208
|
527 EOT
|
pascal@208
|
528 }
|
pascal@208
|
529
|
pascal@208
|
530 select_grub()
|
pascal@208
|
531 {
|
pascal@208
|
532 cat << EOT
|
pascal@208
|
533 <a name="grub"></a>
|
pascal@208
|
534 <h4>$(gettext "Grub")</h4>
|
pascal@208
|
535 <input type="checkbox" name="TGT_GRUB" value="yes" $([ "$TGT_GRUB" == "yes" ] && echo "checked") id="grub" />
|
pascal@208
|
536 <label for="grub">$(gettext "Install Grub bootloader")<br /></label>
|
pascal@208
|
537 <input type="checkbox" name="TGT_WINBOOT" value="auto" $([ -n "$TGT_WINBOOT" ] && echo "checked") id="dualboot" />
|
pascal@208
|
538 <label for="dualboot">$(gettext "Enable Windows Dual-Boot")</label>
|
pascal@208
|
539 EOT
|
pascal@208
|
540 }
|
pascal@208
|
541
|
pascal@208
|
542 moveto_page()
|
pascal@208
|
543 {
|
pascal@208
|
544 case $1 in
|
pascal@208
|
545 *)
|
pascal@208
|
546 page=home
|
pascal@208
|
547 title1=$(gettext "Back to Installer Start Page") ;;
|
pascal@208
|
548 esac
|
pascal@208
|
549 case $2 in
|
pascal@208
|
550 write|run)
|
pascal@208
|
551 title2=$(gettext "Proceed to SliTaz installation") ;;
|
pascal@208
|
552 reboot)
|
pascal@208
|
553 title2=$(gettext "Installation complete. You can now restart (reboot)") ;;
|
pascal@208
|
554 failed)
|
pascal@208
|
555 title2=$(gettext "Installation failed. See log") ;;
|
pascal@208
|
556 *)
|
pascal@208
|
557 page=home
|
pascal@208
|
558 title2=$(gettext "Back to Installer Start Page") ;;
|
pascal@208
|
559 esac
|
pascal@208
|
560 cat <<EOT
|
pascal@208
|
561 <script type="text/javascript">
|
pascal@208
|
562 function SubmitForm() {
|
domcox@260
|
563 if (false == checkHostname()) {
|
domcox@260
|
564 alert("Hostname error");
|
domcox@260
|
565 } else if (false == checkRootPwd()) {
|
domcox@260
|
566 alert("Root password error");
|
domcox@260
|
567 } else if (false == checkUserLogin()) {
|
domcox@260
|
568 alert("User login error");
|
domcox@260
|
569 } else if (false == checkUserPwd()) {
|
domcox@260
|
570 alert("User password error");
|
domcox@260
|
571 } else {
|
domcox@260
|
572 var r=confirm("$(gettext "Do you really want to continue?")");
|
domcox@260
|
573 if (r==true)
|
domcox@260
|
574 {
|
domcox@260
|
575 document.ConfigForm.submit();
|
domcox@260
|
576 }
|
pascal@208
|
577 }
|
pascal@208
|
578 }
|
pascal@208
|
579 </script>
|
pascal@208
|
580 <hr />
|
pascal@208
|
581 <input type="hidden" name="page" value="$2" />
|
pascal@208
|
582 <a class="button" value="$1" href="$SCRIPT_NAME?page=$1" >$title1</a>
|
pascal@208
|
583 <a class="button" value="$2" onclick="SubmitForm()">$title2</a>
|
pascal@208
|
584 EOT
|
pascal@208
|
585 }
|
pascal@208
|
586
|
pascal@208
|
587 page_redirection()
|
pascal@208
|
588 {
|
pascal@208
|
589 cat <<EOT
|
pascal@208
|
590 <html>
|
pascal@208
|
591 <head>
|
pascal@208
|
592 <title>$(gettext "A web page that points a browser to a different page after 2 seconds")</title>
|
pascal@208
|
593 <meta http-equiv="refresh" content="0; URL=$SCRIPT_NAME?page=$1">
|
pascal@208
|
594 <meta name="keywords" content="automatic redirection">
|
pascal@208
|
595 </head>
|
pascal@208
|
596 <body>
|
paul@209
|
597 $(gettext "If your browser doesn't automatically redirect within a few seconds,
|
paul@209
|
598 you may want to go there manually")
|
pascal@208
|
599 <a href="$SCRIPT_NAME?page=$1">$1</a>
|
pascal@208
|
600 </body>
|
pascal@208
|
601 </html>
|
pascal@208
|
602 EOT
|
pascal@208
|
603 }
|
pascal@208
|
604
|
pascal@208
|
605 check_ressources()
|
pascal@208
|
606 {
|
pascal@208
|
607 local code
|
pascal@208
|
608 code=0
|
pascal@208
|
609 # Check tazinst
|
pascal@208
|
610 if ! tazinst usage | grep -q Usage: ; then
|
pascal@208
|
611 cat <<EOT
|
pascal@208
|
612 <h3>$(gettext "Tazinst Error")</h3>
|
pascal@208
|
613 <p><strong>tazinst</strong>, $(gettext "the lightweight SliTaz HDD installer
|
paul@209
|
614 is missing. Any installation can not be done without tazinst.")</p>
|
pascal@208
|
615 <p>$(gettext "Check tazinst' permissions, or reinstall the slitaz-tools package:")</p>
|
pascal@208
|
616 <code># tazpkg get-install slitaz-tools --forced</code>
|
pascal@208
|
617 EOT
|
pascal@208
|
618 code=1
|
pascal@208
|
619 else
|
pascal@208
|
620 # Check tazinst required version
|
pascal@208
|
621 v=$(tazinst version | tr -d '[:alpha:]')
|
pascal@208
|
622 r=$TAZINST_REQUIRED_VERSION
|
pascal@208
|
623 if ! (echo "$v" | awk -v r=$r '{v=$v+0}{ if (v < r) exit 1}') ; then
|
pascal@208
|
624 cat <<EOT
|
pascal@208
|
625 <h3>$(gettext "Tazinst Error")</h3>
|
pascal@208
|
626 <p><strong>tazinst</strong> ($v) $(gettext "is not at the required version ($r),
|
pascal@208
|
627 use tazinst in a xterm or reinstall the slitaz-tools package:")</p>
|
pascal@208
|
628 <code># tazpkg get-install slitaz-tools --forced</code>
|
pascal@208
|
629 EOT
|
pascal@208
|
630 code=1
|
pascal@208
|
631 fi
|
pascal@208
|
632 fi
|
pascal@208
|
633 return $code
|
pascal@208
|
634 }
|
pascal@208
|
635
|
pascal@208
|
636 run_tazinst()
|
pascal@208
|
637 {
|
pascal@208
|
638 echo "<h4>$(gettext "Proceeding: ()")</h4>"
|
pascal@208
|
639 gettext "Please wait until processing is complete"
|
pascal@208
|
640 table_start
|
pascal@208
|
641 tazinst $(GET INST_ACTION) $INSTFILE | \
|
pascal@208
|
642 awk '{print "<tr><td><tt>" $0 "</tt></td></tr>"}'
|
pascal@208
|
643 table_end
|
pascal@208
|
644 return $(grep -c "cancelled on error" $INSTFILE)
|
pascal@208
|
645 }
|
pascal@208
|
646
|
pascal@208
|
647 tazinst_log()
|
pascal@208
|
648 {
|
pascal@208
|
649 echo "<pre>"
|
pascal@208
|
650 tazinst log
|
pascal@208
|
651 echo "</pre>"
|
pascal@208
|
652 }
|
pascal@208
|
653
|
pascal@208
|
654 scan_mkfs()
|
pascal@208
|
655 {
|
pascal@208
|
656 for path in /bin /sbin /usr/bin /usr/sbin
|
pascal@208
|
657 do
|
pascal@208
|
658 [ -e $path/mkfs.btrfs ] && FS=btrfs
|
pascal@208
|
659 [ -e $path/mkfs.cramfs ] && FS="$FS cramfs"
|
pascal@208
|
660 [ -e $path/mkfs.ext2 ] && FS="$FS ext2"
|
pascal@208
|
661 [ -e $path/mkfs.ext3 ] && FS="$FS ext3"
|
pascal@208
|
662 [ -e $path/mkfs.ext4 ] && FS="$FS ext4"
|
pascal@208
|
663 [ -e $path/mkfs.jfs ] && FS="$FS jfs"
|
pascal@208
|
664 [ -e $path/mkfs.minix ] && FS="$FS minix"
|
pascal@208
|
665 [ -e $path/mkfs.reiserfs ] && FS="$FS reiserfs"
|
pascal@208
|
666 [ -e $path/mkfs.xfs ] && FS="$FS xfs"
|
pascal@208
|
667 done
|
pascal@208
|
668 }
|
pascal@208
|
669
|
pascal@208
|
670 form_start()
|
pascal@208
|
671 {
|
pascal@208
|
672 cat <<EOT
|
pascal@208
|
673 <form name="ConfigForm" method="get" action="$SCRIPT_NAME">
|
pascal@208
|
674 EOT
|
pascal@208
|
675 }
|
pascal@208
|
676
|
pascal@208
|
677 form_end()
|
pascal@208
|
678 {
|
pascal@208
|
679 echo "</form>"
|
pascal@208
|
680 }
|
pascal@208
|
681
|
pascal@208
|
682 #
|
pascal@208
|
683 # Main
|
pascal@208
|
684 #
|
pascal@208
|
685
|
pascal@208
|
686 case "$(GET page)" in
|
pascal@208
|
687 gparted)
|
pascal@208
|
688 /usr/sbin/gparted
|
pascal@208
|
689 xhtml_header
|
pascal@208
|
690 page_redirection home
|
pascal@208
|
691 ;;
|
pascal@208
|
692 install)
|
pascal@208
|
693 xhtml_header
|
pascal@208
|
694 form_start
|
pascal@208
|
695 display_action install
|
domcox@258
|
696 read_setup
|
pascal@208
|
697 select_source
|
pascal@208
|
698 select_partition
|
pascal@208
|
699 select_home
|
pascal@208
|
700 select_hostname
|
pascal@208
|
701 select_root
|
pascal@208
|
702 select_user
|
pascal@208
|
703 select_grub
|
pascal@208
|
704 moveto_page home write
|
pascal@208
|
705 form_end
|
pascal@208
|
706 ;;
|
pascal@208
|
707 upgrade)
|
pascal@208
|
708 xhtml_header
|
pascal@208
|
709 form_start
|
pascal@208
|
710 display_action upgrade
|
domcox@258
|
711 read_setup
|
pascal@208
|
712 select_source
|
pascal@208
|
713 select_old_slitaz
|
pascal@208
|
714 select_grub
|
pascal@208
|
715 moveto_page home write
|
pascal@208
|
716 form_end
|
pascal@208
|
717 ;;
|
pascal@208
|
718 write)
|
pascal@208
|
719 write_setup
|
pascal@208
|
720 xhtml_header
|
pascal@208
|
721 if ! (tazinst check $INSTFILE); then
|
pascal@208
|
722 page_redirection $(GET INST_ACTION)
|
pascal@208
|
723 else
|
pascal@208
|
724 read_setup
|
pascal@208
|
725 form_start
|
pascal@208
|
726 display_action $(GET INST_ACTION)
|
pascal@208
|
727 if run_tazinst; then
|
pascal@208
|
728 moveto_page home reboot
|
pascal@208
|
729 else
|
pascal@208
|
730 moveto_page home failed
|
pascal@208
|
731 fi
|
pascal@208
|
732 form_end
|
pascal@208
|
733 fi
|
pascal@208
|
734 ;;
|
pascal@208
|
735 reboot)
|
pascal@208
|
736 reboot ;;
|
pascal@208
|
737 home)
|
pascal@208
|
738 xhtml_header
|
pascal@208
|
739 select_action
|
pascal@208
|
740 select_gparted
|
pascal@208
|
741 select_install
|
pascal@208
|
742 select_upgrade
|
pascal@208
|
743 ;;
|
pascal@208
|
744 failed)
|
pascal@208
|
745 xhtml_header
|
pascal@208
|
746 display_log
|
pascal@208
|
747 ;;
|
domcox@234
|
748 menu_install)
|
domcox@234
|
749 xhtml_header
|
domcox@234
|
750 if check_ressources; then
|
domcox@258
|
751 page_redirection install
|
domcox@234
|
752 fi
|
domcox@234
|
753 ;;
|
domcox@234
|
754 menu_upgrade)
|
domcox@234
|
755 xhtml_header
|
domcox@234
|
756 if check_ressources; then
|
domcox@258
|
757 page_redirection upgrade
|
domcox@234
|
758 fi
|
domcox@234
|
759 ;;
|
pascal@208
|
760 *)
|
pascal@208
|
761 xhtml_header
|
pascal@208
|
762 if check_ressources; then
|
pascal@208
|
763 page_redirection home
|
pascal@208
|
764 fi
|
pascal@208
|
765 ;;
|
pascal@208
|
766 esac
|
pascal@208
|
767
|
pascal@208
|
768 xhtml_footer
|
pascal@208
|
769
|
pascal@208
|
770 exit 0
|