Adding upstream version 1.95.3.
[live-boot-grml.git] / scripts / live
index 26fde4d..a73da84 100755 (executable)
@@ -2,24 +2,25 @@
 
 # set -e
 
-export PATH=/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:/usr/bin:/usr/sbin:/bin:/sbin
+export PATH="/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:/usr/bin:/usr/sbin:/bin:/sbin"
 
 echo "/root/lib" >> /etc/ld.so.conf
 echo "/root/usr/lib" >> /etc/ld.so.conf
 
-mountpoint=/live_media
+mountpoint="/live/image"
+LIVE_MEDIA_PATH="live"
 
 root_persistence="live-rw"
 home_persistence="home-rw"
 root_snapshot_label="live-sn"
 home_snapshot_label="home-sn"
 
-USERNAME=user
+USERNAME="user"
 USERFULLNAME="Live user"
-HOSTNAME=host
-BUILD_SYSTEM=Custom
+HOSTNAME="host"
+BUILD_SYSTEM="Custom"
 
-mkdir -p $mountpoint
+mkdir -p "${mountpoint}"
 
 [ -f /etc/live.conf ] && . /etc/live.conf
 export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM
@@ -30,45 +31,55 @@ if [ ! -f /live.vars ]; then
     touch /live.vars
 fi
 
-parse_cmdline ()
+Arguments ()
 {
-       PRESEEDS=
+       PRESEEDS=""
 
-       # looking for live-initramfs specifics options as kernel parameters
-
-       for x in $(cat /proc/cmdline)
+       for ARGUMENT in `cat /proc/cmdline`
        do
-               case $x in
+               case "${ARGUMENT}" in
                        access=*)
-                               ACCESS=${x#access=}
+                               ACCESS="${ARGUMENT#access=}"
                                export ACCESS
                                ;;
 
                        console=*)
-                               DEFCONSOLE="${x#*=}"
+                               DEFCONSOLE="${ARGUMENT#*=}"
                                export DEFCONFSOLE
                                ;;
 
+                       debug)
+                               DEBUG="Yes"
+                               export DEBUG
+
+                               set -x
+                               ;;
+
+                       fetch=*)
+                                FETCH="${ARGUMENT#fetch=}"
+                                export FETCH
+                                ;;
+
                        hostname=*)
-                               HOSTNAME=${x#hostname=}
+                               HOSTNAME="${ARGUMENT#hostname=}"
                                LIVECONF="changed"
                                export HOSTNAME LIVECONF
                                ;;
 
                        username=*)
-                               USERNAME=${x#username=}
+                               USERNAME="${ARGUMENT#username=}"
                                LIVECONF="changed"
                                export USERNAME LIVECONF
                                ;;
 
                        userfullname=*)
-                               USERFULLNAME=${x#userfullname=}
+                               USERFULLNAME="${ARGUMENT#userfullname=}"
                                LIVECONF="changed"
                                export USERFULLNAME LIVECONF
                                ;;
 
-                       ip*)
-                               STATICIP=${x#ip=}
+                       ip=*)
+                               STATICIP="${ARGUMENT#ip=}"
 
                                if [ -z "${STATICIP}" ]
                                then
@@ -79,70 +90,77 @@ parse_cmdline ()
                                ;;
 
                        keyb=*|kbd-chooser/method=*)
-                               KBD=${x#*=}
+                               KBD="${ARGUMENT#*=}"
                                export KBD
                                ;;
 
                        klayout=*|console-setup/layoutcode=*)
-                               KLAYOUT=${x#*=}
+                               KLAYOUT="${ARGUMENT#*=}"
                                export KLAYOUT
                                ;;
 
                        kvariant=*|console-setup/variantcode=*)
-                               KVARIANT=${x#*=}
+                               KVARIANT="${ARGUMENT#*=}"
                                export KVARIANT
                                ;;
 
                        kmodel=*|console-setup/modelcode=*)
-                               KMODEL=${x#*=}
+                               KMODEL="${ARGUMENT#*=}"
+                               export KMODEL
                                ;;
 
                        koptions=*)
-                               KOPTIONS=${x#koptions=}
+                               KOPTIONS="${ARGUMENT#koptions=}"
+                               export KOPTIONS
                                ;;
 
                        live-getty)
-                               LIVE_GETTY=1
+                               LIVE_GETTY="1"
                                export LIVE_GETTY
                                ;;
 
                        live-media=*|bootfrom=*)
-                               LIVE_MEDIA=${x#*=}
+                               LIVE_MEDIA="${ARGUMENT#*=}"
                                export LIVE_MEDIA
                                ;;
 
                        live-media-encryption=*|encryption=*)
-                               LIVE_MEDIA_ENCRYPTION=${x#*=}
+                               LIVE_MEDIA_ENCRYPTION="${ARGUMENT#*=}"
                                export LIVE_MEDIA_ENCRYPTION
                                ;;
 
                        live-media-offset=*)
-                               LIVE_MEDIA_OFFSET=${x#live-media-offset=}
+                               LIVE_MEDIA_OFFSET="${ARGUMENT#live-media-offset=}"
                                export LIVE_MEDIA_OFFSET
                                ;;
 
+                       live-media-path=*)
+                               LIVE_MEDIA_PATH="${ARGUMENT#live-media-path=}"
+                               export LIVE_MEDIA_PATH
+                               ;;
+
                        live-media-timeout=*)
-                               LIVE_MEDIA_TIMEOUT=${x#live-media-timeout=}
+                               LIVE_MEDIA_TIMEOUT="${ARGUMENT#live-media-timeout=}"
                                export LIVE_MEDIA_TIMEOUT
                                ;;
 
                        locale=*|debian-installer/locale=*)
-                               LOCALE=${x#*=}
+                               LOCALE="${ARGUMENT#*=}"
                                export LOCALE
                                ;;
 
                        module=*)
-                               MODULE=${x#module=}
+                               MODULE="${ARGUMENT#module=}"
                                export MODULE
                                ;;
 
-                       netboot*)
-                               NETBOOT=${x#netboot=}
+                       netboot=*)
+                               NETBOOT="${ARGUMENT#netboot=}"
                                export NETBOOT
                                ;;
 
-                       nfsopts=)
-                               NFSOPTS=${x#nfsopts=}
+                       nfsopts=*)
+                               NFSOPTS="${ARGUMENT#nfsopts=}"
                                export NFSOPTS
                                ;;
 
@@ -156,6 +174,11 @@ parse_cmdline ()
                                export NOXAUTOLOGIN
                                ;;
 
+                       nofastboot)
+                               NOFASTBOOT="Yes"
+                               export NOFASTBOOT
+                               ;;
+
                        nopersistent)
                                PERSISTENT=""
                                export PERSISTENT
@@ -177,15 +200,33 @@ parse_cmdline ()
                                ;;
 
                        preseed/file=*|file=*)
-                               LOCATION="${x#*=}"
+                               LOCATION="${ARGUMENT#*=}"
                                export LOCATION
                                ;;
 
+                       url=*)
+                               location="${ARGUMENT#url=}"
+
+                               mount -n -o bind /sys /root/sys
+                               mount -n -o bind /proc /root/proc
+                               mount -n -o bind /dev /root/dev
+
+                               mkdir -p /root/var/run/network
+                               chroot /root ifup -a
+                               chroot /root wget -P /tmp "$location"
+                               chroot /root ifdown -a
+
+                               umount /root/sys
+                               umount /root/proc
+                               umount /root/dev
+
+                               LOCATION="/tmp/$(basename "$location")"
+                               ;;
+
                        */*=*)
-                               question="${x%%=*}"
-                               value="${x#*=}"
+                               question="${ARGUMENT%%=*}"
+                               value="${ARGUMENT#*=}"
                                PRESEEDS="${PRESEEDS}\"${question}=${value}\" "
-
                                export PRESEEDS
                                ;;
 
@@ -194,8 +235,13 @@ parse_cmdline ()
                                export SHOWMOUNTS
                                ;;
 
+                       timezone=*)
+                               TIMEZONE="${ARGUMENT#timezone=}"
+                               export TIMEZONE
+                               ;;
+
                        todisk=*)
-                               TODISK=${x#todisk=}
+                               TODISK="${ARGUMENT#todisk=}"
                                export TODISK
                                ;;
 
@@ -204,13 +250,23 @@ parse_cmdline ()
                                export TORAM
                                ;;
 
+                       union=*)
+                               UNIONTYPE="${ARGUMENT#union=}"
+                               export UNIONTYPE
+                               ;;
+
+                       utc=*)
+                               UTC="${ARGUMENT#utc=}"
+                               export UTC
+                               ;;
+
                        xdebconf)
                                XDEBCONF="Yes"
                                export XDEBCONF
                                ;;
 
                        xvideomode=*)
-                               XVIDEOMODE="${x#xvideomode=}"
+                               XVIDEOMODE="${ARGUMENT#xvideomode=}"
                                export XVIDEOMODE
                                ;;
                esac
@@ -233,6 +289,13 @@ parse_cmdline ()
        if [ -z "${MODULE}" ]
        then
                MODULE="filesystem"
+               export MODULE
+       fi
+
+       if [ -z "${UNIONTYPE}" ]
+       then
+               UNIONTYPE="unionfs"
+               export UNIONTYPE
        fi
 }
 
@@ -240,11 +303,11 @@ is_live_path()
 {
        DIRECTORY="${1}"
 
-       if [ -d "${DIRECTORY}"/live ]
+       if [ -d "${DIRECTORY}"/"${LIVE_MEDIA_PATH}" ]
        then
                for FILESYSTEM in squashfs ext2 ext3 xfs dir
                do
-                       if [ "`echo ${DIRECTORY}/live/*.${FILESYSTEM}`" != "${DIRECTORY}/live/*.${FILESYSTEM}" ]
+                       if [ "`echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}`" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}" ]
                        then
                                return 0
                        fi
@@ -281,11 +344,12 @@ match_files_in_dir() {
 mount_images_in_directory() {
     directory="$1"
     rootmnt="$2"
-    if match_files_in_dir "$directory/live/*.squashfs" ||
-        match_files_in_dir "$directory/live/*.ext2" ||
-        match_files_in_dir "$directory/live/*.ext3" ||
-        match_files_in_dir "$directory/live/*.dir"; then
-        setup_unionfs "$directory/live" "$rootmnt"
+
+    if match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.squashfs" ||
+        match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.ext2" ||
+        match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.ext3" ||
+        match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.dir"; then
+        setup_unionfs "$directory/${LIVE_MEDIA_PATH}" "$rootmnt"
     else
         :
     fi
@@ -341,13 +405,22 @@ copy_live_to() {
         return 1
     fi
 
-    # begin copying..
+    # begin copying (or uncompressing)
     mkdir "${copyto}"
     echo "mount -t ${fstype} ${mount_options} ${dev} ${copyto}"
     mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}"
-    cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files
-    umount ${copyfrom}
-    mount -r --move ${copyto} ${copyfrom}
+
+    if [ "$extension" == "tgz" ]; then
+       cd "${copyto}"
+       tar zxf "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
+       rm -f "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
+       mount -r --move "${copyto}" "${rootmnt}"
+       cd "${OLDPWD}"
+    else
+       cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files
+       umount ${copyfrom}
+       mount -r --move ${copyto} ${copyfrom}
+    fi
     rmdir ${copyto}
     return 0
 }
@@ -366,6 +439,19 @@ do_netmount() {
         NFSROOT=${ROOTSERVER}:${ROOTPATH}
     fi
 
+    # source relevant ipconfig output
+    . /tmp/net-${DEVICE}.conf
+    export HOSTNAME
+
+    if [ -n "${FETCH}" ] && do_httpmount; then
+       rc=0
+       return ${rc}
+    fi
+
+    if [ "${NFSROOT#*:}" = "$NFSROOT" ] && [ "$NETBOOT" != "cifs" ]; then
+       NFSROOT=${ROOTSERVER}:${NFSROOT}
+    fi
+
     [ "$quiet" != "y" ] && log_begin_msg "Trying netboot from ${NFSROOT}"
 
     if [ "${NETBOOT}" != "nfs" ] && do_cifsmount ; then
@@ -380,6 +466,23 @@ do_netmount() {
     return ${rc}
 }
 
+do_httpmount() {
+    rc=1
+    extension=`echo "${FETCH}" | sed 's/\(.*\)\.\(.*\)/\2/'`
+    case "${extension}" in
+       squashfs|tgz|tar)
+           [ "$quiet" != "y" ] && log_begin_msg "Trying wget ${FETCH} -O ${mountpoint}/$(basename ${FETCH})"
+           mkdir -p "${mountpoint}/${LIVE_MEDIA_PATH}"
+           wget "${FETCH}" -O "${mountpoint}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
+           [ $? -eq 0 ] && rc=0
+           [ "${extension}" == "tgz" ] && live_dest="ram"
+           ;;
+       *)
+           [ "$quiet" != "y" ] && log_begin_msg "Unrecognized archive extension for ${FETCH}"
+    esac
+    return ${rc}
+}
+
 do_nfsmount() {
     rc=1
     modprobe "${MP_QUIET}" nfs
@@ -520,7 +623,7 @@ setup_unionfs() {
     image_directory="$1"
     rootmnt="$2"
 
-    modprobe "${MP_QUIET}" -b unionfs
+    modprobe "${MP_QUIET}" -b ${UNIONTYPE}
 
     # run-init can't deal with images in a subdir, but we're going to
     # move all of these away before it runs anyway.  No, we're not,
@@ -532,8 +635,10 @@ setup_unionfs() {
     # Let's just mount the read-only file systems first
     rofsstring=""
     rofslist=""
-    if [ "${NETBOOT}" = "nfs" ] ; then
-        roopt="nfsro" # go aroung a bug in nfs-unionfs locking
+    minor_kernel_version=`uname -r|cut -c 5-|sed 's/[^0-9].*//'`
+    if [ "${NETBOOT}" = "nfs" ] && [ "${minor_kernel_version}" -lt 22 ]; then
+        # go aroung a bug in nfs-unionfs locking for unionfs <= 1.4
+        roopt="nfsro"
     else
         roopt="ro"
     fi
@@ -604,7 +709,7 @@ setup_unionfs() {
 
     mount ${cowdevice} -t ${cow_fstype} -o rw /cow || panic "Can not mount $cowdevice on /cow"
 
-    mount -t unionfs -o dirs=/cow=rw:$rofsstring unionfs "$rootmnt" || panic "Unionfs mount failed"
+    mount -t ${UNIONTYPE} -o dirs=/cow=rw:$rofsstring ${UNIONTYPE} "$rootmnt" || panic "${UNIONTYPE} mount failed"
 
     # Adding other custom mounts
     if [ -n "${PERSISTENT}" ]; then
@@ -635,8 +740,8 @@ setup_unionfs() {
     fi
 
     # shows cow fs on /cow for use by live-snapshot
-    mkdir -p "${rootmnt}/cow"
-    mount -o bind /cow "${rootmnt}/cow"
+    mkdir -p "${rootmnt}/live/cow"
+    mount -o bind /cow "${rootmnt}/live/cow"
 }
 
 check_dev ()
@@ -729,7 +834,7 @@ mountroot() {
     exec > live.log
     exec 2>&1
 
-    parse_cmdline
+    Arguments
 
     set_usplash_timeout
     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-premount"
@@ -742,7 +847,7 @@ mountroot() {
 
     set_usplash_timeout
 
-    if [ ! -z "${NETBOOT}" ]; then
+    if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ]; then
         if do_netmount ; then
             livefs_root="${mountpoint}"
         else
@@ -769,7 +874,7 @@ mountroot() {
         live_dest="${TODISK}"
     fi
     if [ "${live_dest}" ]; then
-        log_begin_msg "Copying live_media to ${live_dest}"
+        log_begin_msg "Copying live media to ${live_dest}"
         copy_live_to "${livefs_root}" "${live_dest}"
         log_end_msg
     fi