Adding upstream version 1.95.3.
[live-boot-grml.git] / scripts / live
index 73a965e..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,119 +31,290 @@ if [ ! -f /live.vars ]; then
     touch /live.vars
 fi
 
-parse_cmdline ()
+Arguments ()
 {
-    PRESEEDS=
-    # looking for live-initramfs specifics options as kernel parameters
-    for x in $(cat /proc/cmdline); do
-        case $x in
-            userfullname=*)
-                export USERFULLNAME=${x#userfullname=}
-                export LIVECONF="changed"
-                ;;
-            hostname=*)
-                export HOSTNAME=${x#hostname=}
-                export LIVECONF="changed"
-                ;;
-            username=*)
-                export USERNAME=${x#username=}
-                export LIVECONF="changed"
-                ;;
-            netboot*)
-                export NETBOOT=${x#netboot=} ;;
-            access=*)
-                export ACCESS=${x#access=} ;;
-            xdebconf)
-                export XDEBCONF="Yes" ;;
-           xvideomode=*)
-               export XVIDEOMODE="${x#xvideomode=}" ;;
-            toram)
-                export TORAM="Yes" ;;
-            todisk=*)
-                export TODISK=${x#todisk=} ;;
-           noswap)
-               export NOSWAP="Yes" ;;
-           noautologin)
-               export NOAUTOLOGIN="Yes" ;;
-           noxautologin)
-               export NOXAUTOLOGIN="Yes" ;;
-           nosudo)
-               export NOSUDO="Yes" ;;
-            showmounts)
-                export SHOWMOUNTS="Yes" ;;
-            persistent)
-                export PERSISTENT="Yes" ;;
-            nopersistent)
-                export PERSISTENT="" ;;
-            ip*)
-                STATICIP=${x#ip=}
-                if [ "${STATICIP}" == "" ]; then
-                    STATICIP="frommedia"
-                fi
-                export STATICIP ;;
-            live-getty)
-                export LIVE_GETTY=1 ;;
-            bootfrom=*|live-media=*)
-                export LIVE_MEDIA=${x#*=} ;;
-            live-media-encryption=*|encryption=*)
-                export LIVE_MEDIA_ENCRYPTION=${x#*=} ;;
-            live-media-timeout=*)
-                export LIVE_MEDIA_TIMEOUT=${x#live-media-timeout=} ;;
-            live-media-offset=*)
-                export LIVE_MEDIA_OFFSET=${x#live-media-offset=} ;;
-            locale=*|debian-installer/locale=*)
-                export LOCALE=${x#*=} ;;
-            keyb=*|kbd-chooser/method=*)
-                export KBD=${x#*=} ;;
-            klayout=*|console-setup/layoutcode=*)
-                export KLAYOUT=${x#*=} ;;
-            koptions=*)
-                export KOPTIONS=${x#koptions=} ;;
-            kvariant=*|console-setup/variantcode=*)
-                export KVARIANT=${x#*=} ;;
-            kmodel=*|console-setup/modelcode=*)
-                export KMODEL=${x#*=} ;;
-            module=*)
-                export MODULE=${x#module=} ;;
-            preseed/file=*|file=*)
-                export LOCATION="${x#*=}" ;;
-            */*=*)
-                question="${x%%=*}"
-                value="${x#*=}"
-                PRESEEDS="${PRESEEDS}\"${question}=${value}\" "
-                ;;
-            console=*)
-                export DEFCONSOLE="${x#*=}" ;;
-        esac
-    done
-
-    # sort of compatibility with netboot.h from linux docs
-    if [ -z "${NETBOOT}" ]; then
-        if [ "${ROOT}" == "/dev/nfs" ]; then
-            NETBOOT="nfs"
-            export NETBOOT
-        elif [ "${ROOT}" == "/dev/cifs" ]; then
-            NETBOOT="cifs"
-            export NETBOOT
-        fi
-    fi
-
-    if [ -z "${MODULE}" ]; then
-        MODULE=order
-    fi
+       PRESEEDS=""
+
+       for ARGUMENT in `cat /proc/cmdline`
+       do
+               case "${ARGUMENT}" in
+                       access=*)
+                               ACCESS="${ARGUMENT#access=}"
+                               export ACCESS
+                               ;;
+
+                       console=*)
+                               DEFCONSOLE="${ARGUMENT#*=}"
+                               export DEFCONFSOLE
+                               ;;
+
+                       debug)
+                               DEBUG="Yes"
+                               export DEBUG
+
+                               set -x
+                               ;;
+
+                       fetch=*)
+                                FETCH="${ARGUMENT#fetch=}"
+                                export FETCH
+                                ;;
+
+                       hostname=*)
+                               HOSTNAME="${ARGUMENT#hostname=}"
+                               LIVECONF="changed"
+                               export HOSTNAME LIVECONF
+                               ;;
+
+                       username=*)
+                               USERNAME="${ARGUMENT#username=}"
+                               LIVECONF="changed"
+                               export USERNAME LIVECONF
+                               ;;
+
+                       userfullname=*)
+                               USERFULLNAME="${ARGUMENT#userfullname=}"
+                               LIVECONF="changed"
+                               export USERFULLNAME LIVECONF
+                               ;;
+
+                       ip=*)
+                               STATICIP="${ARGUMENT#ip=}"
+
+                               if [ -z "${STATICIP}" ]
+                               then
+                                       STATICIP="frommedia"
+                               fi
+
+                               export STATICIP
+                               ;;
+
+                       keyb=*|kbd-chooser/method=*)
+                               KBD="${ARGUMENT#*=}"
+                               export KBD
+                               ;;
+
+                       klayout=*|console-setup/layoutcode=*)
+                               KLAYOUT="${ARGUMENT#*=}"
+                               export KLAYOUT
+                               ;;
+
+                       kvariant=*|console-setup/variantcode=*)
+                               KVARIANT="${ARGUMENT#*=}"
+                               export KVARIANT
+                               ;;
+
+                       kmodel=*|console-setup/modelcode=*)
+                               KMODEL="${ARGUMENT#*=}"
+                               export KMODEL
+                               ;;
+
+                       koptions=*)
+                               KOPTIONS="${ARGUMENT#koptions=}"
+                               export KOPTIONS
+                               ;;
+
+                       live-getty)
+                               LIVE_GETTY="1"
+                               export LIVE_GETTY
+                               ;;
+
+                       live-media=*|bootfrom=*)
+                               LIVE_MEDIA="${ARGUMENT#*=}"
+                               export LIVE_MEDIA
+                               ;;
+
+                       live-media-encryption=*|encryption=*)
+                               LIVE_MEDIA_ENCRYPTION="${ARGUMENT#*=}"
+                               export LIVE_MEDIA_ENCRYPTION
+                               ;;
+
+                       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="${ARGUMENT#live-media-timeout=}"
+                               export LIVE_MEDIA_TIMEOUT
+                               ;;
+
+                       locale=*|debian-installer/locale=*)
+                               LOCALE="${ARGUMENT#*=}"
+                               export LOCALE
+                               ;;
+
+                       module=*)
+                               MODULE="${ARGUMENT#module=}"
+                               export MODULE
+                               ;;
+
+                       netboot=*)
+                               NETBOOT="${ARGUMENT#netboot=}"
+                               export NETBOOT
+                               ;;
+
+                       nfsopts=*)
+                               NFSOPTS="${ARGUMENT#nfsopts=}"
+                               export NFSOPTS
+                               ;;
+
+                       noautologin)
+                               NOAUTOLOGIN="Yes"
+                               export NOAUTOLOGIN
+                               ;;
+
+                       noxautologin)
+                               NOXAUTOLOGIN="Yes"
+                               export NOXAUTOLOGIN
+                               ;;
+
+                       nofastboot)
+                               NOFASTBOOT="Yes"
+                               export NOFASTBOOT
+                               ;;
+
+                       nopersistent)
+                               PERSISTENT=""
+                               export PERSISTENT
+                               ;;
+
+                       nosudo)
+                               NOSUDO="Yes"
+                               export NOSUDO
+                               ;;
+
+                       noswap)
+                               NOSWAP="Yes"
+                               export NOSWAP
+                               ;;
+
+                       persistent)
+                               PERSISTENT="Yes"
+                               export PERSISTENT
+                               ;;
+
+                       preseed/file=*|file=*)
+                               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="${ARGUMENT%%=*}"
+                               value="${ARGUMENT#*=}"
+                               PRESEEDS="${PRESEEDS}\"${question}=${value}\" "
+                               export PRESEEDS
+                               ;;
+
+                       showmounts)
+                               SHOWMOUNTS="Yes"
+                               export SHOWMOUNTS
+                               ;;
+
+                       timezone=*)
+                               TIMEZONE="${ARGUMENT#timezone=}"
+                               export TIMEZONE
+                               ;;
+
+                       todisk=*)
+                               TODISK="${ARGUMENT#todisk=}"
+                               export TODISK
+                               ;;
+
+                       toram)
+                               TORAM="Yes"
+                               export TORAM
+                               ;;
+
+                       union=*)
+                               UNIONTYPE="${ARGUMENT#union=}"
+                               export UNIONTYPE
+                               ;;
+
+                       utc=*)
+                               UTC="${ARGUMENT#utc=}"
+                               export UTC
+                               ;;
+
+                       xdebconf)
+                               XDEBCONF="Yes"
+                               export XDEBCONF
+                               ;;
+
+                       xvideomode=*)
+                               XVIDEOMODE="${ARGUMENT#xvideomode=}"
+                               export XVIDEOMODE
+                               ;;
+               esac
+       done
+
+       # sort of compatibility with netboot.h from linux docs
+       if [ -z "${NETBOOT}" ]
+       then
+               if [ "${ROOT}" = "/dev/nfs" ]
+               then
+                       NETBOOT="nfs"
+                       export NETBOOT
+               elif [ "${ROOT}" = "/dev/cifs" ]
+               then
+                       NETBOOT="cifs"
+                       export NETBOOT
+               fi
+       fi
+
+       if [ -z "${MODULE}" ]
+       then
+               MODULE="filesystem"
+               export MODULE
+       fi
+
+       if [ -z "${UNIONTYPE}" ]
+       then
+               UNIONTYPE="unionfs"
+               export UNIONTYPE
+       fi
 }
 
-is_live_path() {
-    path=$1
-    if [ -d "$path/live" ]; then
-        if [ "$(echo $path/live/*.squashfs)" != "$path/live/*.squashfs" ] ||
-            [ "$(echo $path/live/*.ext2)" != "$path/live/*.ext2" ] ||
-            [ "$(echo $path/live/*.ext3)" != "$path/live/*.ext3" ] ||
-            [ "$(echo $path/live/*.dir)" != "$path/live/*.dir" ]; then
-            return 0
-        fi
-    fi
-    return 1
+is_live_path()
+{
+       DIRECTORY="${1}"
+
+       if [ -d "${DIRECTORY}"/"${LIVE_MEDIA_PATH}" ]
+       then
+               for FILESYSTEM in squashfs ext2 ext3 xfs dir
+               do
+                       if [ "`echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}`" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}" ]
+                       then
+                               return 0
+                       fi
+               done
+       fi
+
+       return 1
 }
 
 get_backing_device() {
@@ -172,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
@@ -232,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
 }
@@ -257,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
@@ -271,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
@@ -411,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,
@@ -423,29 +635,43 @@ 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
 
-    # Read image names from ${MODULE}.lst if it exists
-    if [ -e "${image_directory}/${MODULE}.lst" ]; then
-        for image in $(cat "${image_directory}/${MODULE}.lst"); do
-            image_string="${image_string} ${image_directory}/${image}";
-        done
-    else
-        # If ${MODULE}.lst does not exist, create a list of images
-        for image_type in "ext2" "ext3" "squashfs" "dir"; do
-            for image in "${image_directory}"/*."${image_type}"; do
-               if [ -e "${image}" ]; then
-                   image_string="${image_string} ${image}";
-               fi
-            done
-        done
-        # Now sort the list
-        image_string=$(echo ${image_string} | sed -e 's/ /\n/g' | sort )
-    fi
+       # Read image names from ${MODULE}.module if it exists
+       if [ -e "${image_directory}/filesystem.${MODULE}.module" ]
+       then
+               for IMAGE in `cat ${image_directory}/filesystem.${MODULE}.module`
+               do
+                       image_string="${image_string} ${image_directory}/${image}"
+               done
+       elif [ -e "${image_directory}/${MODULE}.module" ]
+       then
+               for IMAGE in `cat ${image_directory}/${MODULE}.module`
+               do
+                       image_string="${image_string} ${image_directory}/${image}"
+               done
+       else
+               # ${MODULE}.module does not exist, create a list of images
+               for FILESYSTEM in squashfs ext2 ext3 xfs dir
+               do
+                       for IMAGE in "${image_directory}"/*."${FILESYSTEM}"
+                       do
+                               if [ -e "${IMAGE}" ]
+                               then
+                                       image_string="${image_string} ${IMAGE}"
+                               fi
+                       done
+               done
+
+               # Now sort the list
+               image_string="`echo ${image_string} | sed -e 's/ /\n/g' | sort `"
+       fi
 
     mkdir -p "${croot}"
     for image in ${image_string}; do
@@ -483,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
@@ -514,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 ()
@@ -608,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"
@@ -621,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
@@ -648,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