tazpanel annotate installer.cgi @ rev 260

installer.cgi: hide and check passwords
author Dominique Corbex <domcox@slitaz.org>
date Sat Mar 03 12:14:00 2012 +0100 (2012-03-03)
parents a254da4c8c28
children 9bcc77055db5
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/\&nbsp;/g')
domcox@258 101 line=$(echo $line | sed 's/</\&lt;/g')
domcox@258 102 line=$(echo $line | sed 's/>/\&gt;/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 ="&#x2716; 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 ="&#x2716; Invalid chars";
domcox@260 379 return false;
domcox@260 380 } else {
domcox@260 381 msg.style.color = "limegreen";
domcox@260 382 msg.innerHTML = "&#x2714;";
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 = "&#x2716; 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 ="&#x2716; 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 ="&#x2716; 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 = "&#x2714; Strong!";
domcox@260 425 } else if (mediumRegex.test(pwd1.value)) {
domcox@260 426 msg.style.color = "limegreen";
domcox@260 427 msg.innerHTML = "&#x2714; Medium!";
domcox@260 428 } else {
domcox@260 429 msg.style.color = "orange";
domcox@260 430 msg.innerHTML = "&#x2714; 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 = "&#x2716; 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 ="&#x2716; 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 ="&#x2716; Invalid chars";
domcox@260 468 return false;
domcox@260 469 } else {
domcox@260 470 msg.style.color = "limegreen";
domcox@260 471 msg.innerHTML = "&#x2714;";
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 = "&#x2714; No Password";
domcox@260 489 } else if (false == enoughRegex.test(pwd1.value)) {
domcox@260 490 msg.style.color = "tomato";
domcox@260 491 msg.innerHTML ="&#x2716; 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 ="&#x2716; 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 = "&#x2714; Strong!";
domcox@260 500 } else if (mediumRegex.test(pwd1.value)) {
domcox@260 501 msg.style.color = "limegreen";
domcox@260 502 msg.innerHTML = "&#x2714; Medium!";
domcox@260 503 } else {
domcox@260 504 msg.style.color = "orange";
domcox@260 505 msg.innerHTML = "&#x2714; 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 = "&#x2716; 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