Only looking at boot.d files if they have the .conf suffix to allow putting other...
[live-boot-grml.git] / scripts / live-helpers
index 860e6ff..889d157 100644 (file)
@@ -1158,8 +1158,8 @@ link_files ()
        # live-boot normally does (into $rootmnt)).
 
        # remove multiple /:s and ensure ending on /
-       local src_dir="$(echo "${1}"/ | sed -e 's|/\+|/|g')"
-       local dest_dir="$(echo "${2}"/ | sed -e 's|/\+|/|g')"
+       local src_dir="$(trim_path ${1})/"
+       local dest_dir="$(trim_path ${2})/"
        local src_mask="${3}"
 
        # This check can only trigger on the inital, non-recursive call since
@@ -1181,18 +1181,19 @@ link_files ()
                        if [ ! -d "${dest}" ]
                        then
                                mkdir -p "${dest}"
-                               prev="$(dirname "${dest}")"
-                               chown_ref "${prev}" "${dest}"
-                               chmod_ref "${prev}" "${dest}"
+                               chown_ref "${src}" "${dest}"
+                               chmod_ref "${src}" "${dest}"
                        fi
                        link_files "${src}" "${dest}" "${src_mask}"
                else
+                       local final_src=${src}
                        if [ -n "${src_mask}" ]
                        then
-                               src="$(echo ${src} | sed "s|^${src_mask}||")"
+                               final_src="$(echo ${final_src} | sed "s|^${src_mask}||")"
                        fi
                        rm -rf "${dest}" 2> /dev/null
-                       ln -s "${src}" "${dest}"
+                       ln -s "${final_src}" "${dest}"
+                       chown_ref "${src}" "${dest}"
                fi
        done
 }
@@ -1321,7 +1322,7 @@ get_custom_mounts ()
                                        linkfiles)
                                                opt_linkfiles="yes"
                                                ;;
-                                       union)
+                                       union|bind)
                                                ;;
                                        *)
                                                log_warning_msg "Skipping custom mount with unkown option: ${opt}"
@@ -1387,25 +1388,27 @@ activate_custom_mounts ()
 
        while read device source dest options # < ${custom_mounts}
        do
+               local opt_bind="yes"
                local opt_linkfiles=""
                local opt_union=""
                for opt in $(echo ${options} | tr ',' ' ');
                do
                        case "${opt}" in
+                               bind)
+                                       opt_bind="yes"
+                                       unset opt_linkfiles opt_union
+                                       ;;
                                linkfiles)
                                        opt_linkfiles="yes"
+                                       unset opt_bind opt_union
                                        ;;
                                union)
                                        opt_union="yes"
+                                       unset opt_bind opt_linkfiles
                                        ;;
                        esac
                done
 
-               if [ -n "${opt_linkfiles}" ] && [ -n "${opt_union}" ]
-               then
-                       log_warning_msg "Skipping custom mount ${dest} with options ${options}: \"linkfiles\" and \"union\" are mutually exclusive options"
-               fi
-
                if [ -n "$(what_is_mounted_on "${dest}")" ]
                then
                        log_warning_msg "Skipping custom mount ${dest}: $(what_is_mounted_on "${dest}") is already mounted there"
@@ -1453,7 +1456,8 @@ activate_custom_mounts ()
                                mkdir -p "${source}"
                                chown_ref "${dest}" "${source}"
                                chmod_ref "${dest}" "${source}"
-                       else
+                       elif [ -n "${opt_bind}" ]
+                       then
                                # ensure that $dest is not copied *into* $source
                                mkdir -p "$(dirname ${source})"
                                cp -a "${dest}" "${source}"
@@ -1462,49 +1466,73 @@ activate_custom_mounts ()
 
                # XXX: If CONFIG_AUFS_ROBR is added to the Debian kernel we can
                # ignore the loop below and set rofs_dest_backing=$dest
-               rofs_dest_backing=""
-               for d in ${rootmnt}/live/rofs/*
-               do
-                       if [ -n "${rootmnt}" ]
-                       then
-                               rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")"
-                       else
-                               rofs_dest_backing="${d}/${dest}"
-                       fi
-                       if [ -d "${rofs_dest_backing}" ]
-                       then
-                               break
-                       else
-                               rofs_dest_backing=""
-                       fi
-               done
+               local rofs_dest_backing=""
+               if [ -n "${opt_linkfiles}"]
+               then
+                       for d in ${rootmnt}/live/rofs/*
+                       do
+                               if [ -n "${rootmnt}" ]
+                               then
+                                       rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")"
+                               else
+                                       rofs_dest_backing="${d}/${dest}"
+                               fi
+                               if [ -d "${rofs_dest_backing}" ]
+                               then
+                                       break
+                               else
+                                       rofs_dest_backing=""
+                               fi
+                       done
+               fi
 
-               if [ -z "${PERSISTENT_READONLY}" ]
+               if [ -n "${opt_linkfiles}" ] && [ -z "${PERSISTENT_READONLY}" ]
                then
-                       if [ -n "${opt_linkfiles}" ]
-                       then
-                               links_source="${source}"
-                               links_dest="${dest}"
-                       elif [ -n "${opt_union}" ]
+                       link_files ${source} ${dest} ${rootmnt}
+               elif [ -n "${opt_linkfiles}" ] && [ -n "${PERSISTENT_READONLY}" ]
+               then
+                       mkdir -p ${rootmnt}/live/persistent
+                       local links_source=$(mktemp -d ${rootmnt}/live/persistent/links-source-XXXXXX)
+                       chown_ref ${source} ${links_source}
+                       chmod_ref ${source} ${links_source}
+                       # We put the cow dir in the below strange place to
+                       # make it absolutely certain that the link source
+                       # has its own directory and isn't nested with some
+                       # other custom mount (if so that mount's files would
+                       # be linked, causing breakage.
+                       if [ -n "${rootmnt}" ]
                        then
-                               do_union ${dest} ${source} ${rofs_dest_backing}
+                               local cow_dir="/cow/live/persistent/$(basename ${links_source})"
                        else
-                               mount --bind "${source}" "${dest}"
-                       fi
-               else
-                       if [ -n "${opt_linkfiles}" ]
-                       then
-                               links_dest="${dest}"
-                               dest="$(mktemp -d ${persistent_backing}/links_source-XXXXXX)"
-                               links_source="${dest}"
+                               # This is happens if persistence is activated
+                               # post boot
+                               local cow_dir="/live/cow/live/persistent/$(basename ${links_source})"
                        fi
+                       mkdir -p ${cow_dir}
+                       chown_ref "${source}" "${cow_dir}"
+                       chmod_ref "${source}" "${cow_dir}"
+                       do_union ${links_source} ${cow_dir} ${source} ${rofs_dest_backing}
+                       link_files ${links_source} ${dest} ${rootmnt}
+               elif [ -n "${opt_union}" ] && [ -z "${PERSISTENT_READONLY}" ]
+               then
+                       do_union ${dest} ${source} ${rofs_dest_backing}
+               elif [ -n "${opt_bind}" ] && [ -z "${PERSISTENT_READONLY}" ]
+               then
+                       mount --bind "${source}" "${dest}"
+               elif [ -n "${opt_bind}" -o -n "${opt_union}" ] && [ -n "${PERSISTENT_READONLY}" ]
+               then
+                       # bind-mount and union mount are handled the same
+                       # in read-only mode, but note that rofs_dest_backing
+                       # is non-empty (and necessary) only for unions
                        if [ -n "${rootmnt}" ]
                        then
-                               cow_dir="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")"
+                               local cow_dir="$(echo ${dest} | sed -e "s|^${rootmnt}|/cow/|")"
                        else
-                               cow_dir="/live/cow/${dest}"
+                               # This is happens if persistence is activated
+                               # post boot
+                               local cow_dir="/live/cow/${dest}"
                        fi
-                       if [ -e "${cow_dir}" ]
+                       if [ -e "${cow_dir}" ] && [ -z "${opt_linkfiles}" ]
                        then
                                # If an earlier custom mount has files here
                                # it will "block" the current mount's files
@@ -1517,11 +1545,6 @@ activate_custom_mounts ()
                        do_union ${dest} ${cow_dir} ${source} ${rofs_dest_backing}
                fi
 
-               if [ -n "${opt_linkfiles}" ]
-               then
-                       link_files "${links_source}" "${links_dest}" "${rootmnt}"
-               fi
-
                PERSISTENCE_IS_ON="1"
                export PERSISTENCE_IS_ON