Moving out live-helpers from initramfs-tools specifics.
[live-boot-grml.git] / bin / live-snapshot
index 08e5fd6..e684824 100755 (executable)
@@ -3,11 +3,11 @@
 # live-snapshot - utility to manage Debian Live systems snapshots
 #
 #   This program mounts a device (fallback to /tmpfs under $MOUNTP
 # live-snapshot - utility to manage Debian Live systems snapshots
 #
 #   This program mounts a device (fallback to /tmpfs under $MOUNTP
-#   and saves the /live/cow (or a different directory) filesystem in it
+#   and saves the /live/overlway (or a different directory) filesystem in it
 #   for reuse in another live-boot session.
 #   Look at the manpage for more informations.
 #
 #   for reuse in another live-boot session.
 #   Look at the manpage for more informations.
 #
-# Copyright (C) 2006-2008 Marco Amadori <marco.amadori@gmail.com>
+# Copyright (C) 2006-2011 Marco Amadori <marco.amadori@gmail.com>
 # Copyright (C) 2008 Chris Lamb <chris@chris-lamb.co.uk>
 #
 # This program is free software: you can redistribute it and/or modify
 # Copyright (C) 2008 Chris Lamb <chris@chris-lamb.co.uk>
 #
 # This program is free software: you can redistribute it and/or modify
@@ -23,7 +23,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 #
-# On Debian systems, the complete text of the GNU General Public License
+# The complete text of the GNU General Public License
 # can be found in /usr/share/common-licenses/GPL-3 file.
 
 # declare here two vars from /etc/live.conf because of "set -u"
 # can be found in /usr/share/common-licenses/GPL-3 file.
 
 # declare here two vars from /etc/live.conf because of "set -u"
@@ -37,9 +37,41 @@ else
        set -e
 fi
 
        set -e
 fi
 
-. /usr/share/initramfs-tools/scripts/live-helpers
+## Begin FIXME: this is an embedded copy of the old 'live-helpers' initramfs script
+if [ ! -x "/bin/fstype" ]
+then
+       # klibc not in path -> not in initramfs
+       export PATH="${PATH}:/usr/lib/klibc/bin"
+fi
+
+# handle upgrade path from old udev (using udevinfo) to
+# recent versions of udev (using udevadm info)
+if [ -x /sbin/udevadm ]
+then
+       udevinfo='/sbin/udevadm info'
+else
+       udevinfo='udevinfo'
+fi
+
+old_root_overlay_label="live-rw"
+old_home_overlay_label="home-rw"
+custom_overlay_label="custom-ov"
+root_snapshot_label="live-sn"
+old_root_snapshot_label="live-sn"
+home_snapshot_label="home-sn"
+persistence_list="live-persistence.conf"
+
+# include all scripts for the time being until snapshots are either dropped or cleaned up
+for _SCRIPT in /lib/live/boot/*
+do
+       if [ -e "${_SCRIPT}" ]
+       then
+               . ${_SCRIPT}
+       fi
+done
+## End FIXME: this is an embedded copy of the old 'live-helpers' initramfs script
 
 
-LIVE_CONF="/etc/live.conf"
+LIVE_CONF="/etc/live/boot.d/snapshot.conf"
 
 if [ -r "${LIVE_CONF}" ]
 then
 
 if [ -r "${LIVE_CONF}" ]
 then
@@ -57,7 +89,7 @@ SAFE_TMPDIR="/live"
 # Permits multiple runs
 MOUNTP="$(mktemp -d -p ${SAFE_TMPDIR} live-snapshot-mnt.XXXXXX)"
 DEST="${MOUNTP}/live-sn.cpio.gz"
 # Permits multiple runs
 MOUNTP="$(mktemp -d -p ${SAFE_TMPDIR} live-snapshot-mnt.XXXXXX)"
 DEST="${MOUNTP}/live-sn.cpio.gz"
-DEF_SNAP_COW="/live/cow"
+DEF_SNAP_COW="/live/overlay"
 TMP_FILELIST="${PROGRAM}.list"
 
 # Command line defaults and declarations
 TMP_FILELIST="${PROGRAM}.list"
 
 # Command line defaults and declarations
@@ -125,12 +157,12 @@ Version ()
 {
        echo "${PROGRAM}"
        echo
 {
        echo "${PROGRAM}"
        echo
-       echo "Copyright (C) 2006 Marco Amadori <marco.amadori@gmail.com>"
+       echo "Copyright (C) 2006-2011 Marco Amadori <marco.amadori@gmail.com>"
        echo "Copyright (C) 2008 Chris Lamb <chris@chris-lamb.co.uk>"
        echo
        echo "This program is free software; you can redistribute it and/or modify"
        echo "it under the terms of the GNU General Public License as published by"
        echo "Copyright (C) 2008 Chris Lamb <chris@chris-lamb.co.uk>"
        echo
        echo "This program is free software; you can redistribute it and/or modify"
        echo "it under the terms of the GNU General Public License as published by"
-       echo "the Free Software Foundation; either version 2 of the License, or"
+       echo "the Free Software Foundation; either version 3 of the License, or"
        echo "(at your option) any later version."
        echo
        echo "This program is distributed in the hope that it will be useful,"
        echo "(at your option) any later version."
        echo
        echo "This program is distributed in the hope that it will be useful,"
@@ -142,10 +174,10 @@ Version ()
        echo "along with this program; if not, write to the Free Software"
        echo "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA"
        echo
        echo "along with this program; if not, write to the Free Software"
        echo "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA"
        echo
-       echo "On Debian systems, the complete text of the GNU General Public License"
-       echo "can be found in /usr/share/common-licenses/GPL-2 file."
+       echo "The complete text of the GNU General Public License"
+       echo "can be found in /usr/share/common-licenses/GPL-3 file."
        echo
        echo
-       echo "Homepage: <http://debian-live.alioth.debian.org/>"
+       echo "Homepage: <http://live.debian.net/>"
 
        exit 0
 }
 
        exit 0
 }
@@ -242,7 +274,7 @@ Defaults ()
        # Parse resync string
        if [ -n "${SNAP_RESYNC_STRING}" ]
        then
        # Parse resync string
        if [ -n "${SNAP_RESYNC_STRING}" ]
        then
-               SNAP_COW=$(echo "${SNAP_RESYNC_STRING}" | sed -e 's|^/root\([^:.]*\).*$|'"${DEF_SNAP_COW}"'\1|')
+               SNAP_COW=$(echo "${SNAP_RESYNC_STRING}" | sed -r -e 's#^([^:]*).*$#'"${DEF_SNAP_COW}"'\1#')
                SNAP_DEV=$(echo "${SNAP_RESYNC_STRING}" | cut -f2 -d ':')
                SNAP_MNT=$(echo "${SNAP_RESYNC_STRING}" | cut -f3 -d ':')
                DEST="${MOUNTP}/${SNAP_MNT}"
                SNAP_DEV=$(echo "${SNAP_RESYNC_STRING}" | cut -f2 -d ':')
                SNAP_MNT=$(echo "${SNAP_RESYNC_STRING}" | cut -f3 -d ':')
                DEST="${MOUNTP}/${SNAP_MNT}"
@@ -365,7 +397,7 @@ Do_filelist ()
 
        if [ -f "${SNAP_LIST}" ]
        then
 
        if [ -f "${SNAP_LIST}" ]
        then
-               # if SNAP_COW == /live/cow/home, SNAP_RW = /home
+               # if SNAP_COW == /live/overlay/home, SNAP_RW = /home
                SNAP_RW=$(echo "${SNAP_COW}" | sed -e "s|${DEF_SNAP_COW}||g")
                if [ -z "${SNAP_RW}" ]
                then
                SNAP_RW=$(echo "${SNAP_COW}" | sed -e "s|${DEF_SNAP_COW}||g")
                if [ -z "${SNAP_RW}" ]
                then
@@ -409,6 +441,13 @@ Do_filelist ()
 Do_snapshot ()
 {
        TMP_FILELIST=$(mktemp -p "${SAFE_TMPDIR}" "${TMP_FILELIST}.XXXXXX")
 Do_snapshot ()
 {
        TMP_FILELIST=$(mktemp -p "${SAFE_TMPDIR}" "${TMP_FILELIST}.XXXXXX")
+       if [ -e "${EXCLUDE_LIST}" ]
+       then
+               # Create a TMP filelist removing empty lines (grep -f does not like them)
+               # and comments (for speedup and LST)
+               TMP_EXCLUDE_LIST=$(mktemp -p "${SAFE_TMPDIR}" "${PROGRAM}_excludelist.XXXXXX")
+               grep -v '^#.*$' "${EXCLUDE_LIST}" | grep -v '^ *$' > "${TMP_EXCLUDE_LIST}"
+       fi
 
        case "${SNAP_TYPE}" in
                squashfs)
 
        case "${SNAP_TYPE}" in
                squashfs)
@@ -420,7 +459,7 @@ Do_snapshot ()
                        if [ -e "${EXCLUDE_LIST}" ]
                        then
                                # Add explicitly excluded files
                        if [ -e "${EXCLUDE_LIST}" ]
                        then
                                # Add explicitly excluded files
-                               grep -v '^#.*$' "${EXCLUDE_LIST}" | grep -v '^ *$' >> "${TMP_FILELIST}"
+                               cat "${TMP_EXCLUDE_LIST}" >> "${TMP_FILELIST}"
                        fi
 
                        cd "${OLDPWD}"
                        fi
 
                        cd "${OLDPWD}"
@@ -439,12 +478,13 @@ Do_snapshot ()
                        cd "${WORKING_DIR}"
                        if [ -e "${EXCLUDE_LIST}" ]
                        then
                        cd "${WORKING_DIR}"
                        if [ -e "${EXCLUDE_LIST}" ]
                        then
+
                                # Convert \0 to \n and tag existing (rare but possible) \n in filenames,
                                # this to let grep -F -v do a proper work in filtering out
                                cat "${TMP_FILELIST}" | \
                                        tr '\n' '\1' | \
                                        tr '\0' '\n' | \
                                # Convert \0 to \n and tag existing (rare but possible) \n in filenames,
                                # this to let grep -F -v do a proper work in filtering out
                                cat "${TMP_FILELIST}" | \
                                        tr '\n' '\1' | \
                                        tr '\0' '\n' | \
-                                       grep -F -v -f "${EXCLUDE_LIST}" | \
+                                       grep -F -v -f "${TMP_EXCLUDE_LIST}" | \
                                        tr '\n' '\0' | \
                                        tr '\1' '\n' | \
                                        eval $COPY_CMD || exit 1
                                        tr '\n' '\0' | \
                                        tr '\1' '\n' | \
                                        eval $COPY_CMD || exit 1
@@ -468,10 +508,14 @@ Do_snapshot ()
                        ;;
        esac
 
                        ;;
        esac
 
-       if [ -f "${TMP_FILELIST}" ]
-       then
-               rm -f "${TMP_FILELIST}"
-       fi
+       # Remove temporary file lists
+       for filelist in "${TMP_FILELIST}" "${TMP_EXCLUDE_LIST}"
+       do
+               if [ -f "${filelist}" ]
+               then
+                       rm -f "${filelist}"
+               fi
+       done
 }
 
 Clean ()
 }
 
 Clean ()
@@ -505,9 +549,9 @@ Warn_user ()
                                ;;
                esac
 
                                ;;
                esac
 
-               if grep -qv persistent /proc/cmdline
+               if grep -qv persistence /proc/cmdline
                then
                then
-                       echo "Remember to boot this live system with \"persistent\" specified at boot prompt." > /dev/null 1>&2
+                       echo "Remember to boot this live system with \"persistence\" specified at boot prompt." > /dev/null 1>&2
                fi
        fi
 }
                fi
        fi
 }