linux-boot-probe: mounted/40grub2 add tests for handling escaped $ " \ LP1737604-linux-boot-probe
authorTJ <git@iam.tj>
Sat, 16 Dec 2017 11:09:53 +0000 (11:09 +0000)
committerTJ <git@iam.tj>
Sat, 16 Dec 2017 11:09:53 +0000 (11:09 +0000)
linux-boot-probes/mounted/common/40grub2
tests/linux-boot-probes/boot/grub/grub.cfg
tests/linux-boot-probes/boot/test19.initrd [new file with mode: 0644]
tests/linux-boot-probes/boot/test19.linux [new file with mode: 0644]
tests/linux-boot-probes/boot/test20.initrd [new file with mode: 0644]
tests/linux-boot-probes/boot/test20.linux [new file with mode: 0644]
tests/linux-boot-probes/usr/lib/linux-boot-probes/mounted/40grub2 [deleted file]
tests/linux-boot-probes/usr/share/os-prober/common.sh [deleted file]

index 31e0c50..56bdba3 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/sh
-. usr/share/os-prober/common.sh
+. /usr/share/os-prober/common.sh
 set -e
 
 partition="$1"
@@ -46,14 +46,14 @@ parse_grub_menu () {
         # strip all of: --option=abcd --option='ab cd' --option="ab cd" menuentry { command block
         # and everything else except the first quoted string or non-space word
         # and remove any : from the remaining title
-        title=$( printf "%s" "$line"  | sed -n "s/^[[:blank:]]*//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/--[^ ]*=\(\([\"']\)[^\"']*\2 \|[^ ]* \)//g; p" )
-        title=$( printf "%s" "$title" | sed -n "s/{//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/menuentry//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/^[ ]*\(\([\"']\{1\}\)\(.*\)\2\|\([^\"' ][^ ]*\)\).*/\3\4/; p" )
-        title=$( printf "%s" "$title" | sed -n "s/\\\\'//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/''//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/://g; p" )
+        title=$( printf '%s' "$line"  | sed -n "s/^[[:blank:]]*//; p" )
+        title=$( printf '%s' "$title" | sed -n "s/--[^ ]*=\(\([\"']\)[^\"']*\2 \|[^ ]* \)//g; p" )
+        title=$( printf '%s' "$title" | sed -n "s/{//; p" )
+        title=$( printf '%s' "$title" | sed -n "s/menuentry//; p" )
+        title=$( printf '%s' "$title" | sed -n "s/^[ ]*\(\([\"']\{1\}\)\(.*\)\2\|\([^\"' ][^ ]*\)\).*/\3\4/; p" )
+        title=$( printf '%s' "$title" | sed -n "s/\\\\'//; p" )
+        title=$( printf '%s' "$title" | sed -n "s/''//; p" )
+        title=$( printf '%s' "$title" | sed -n "s/://g; p" )
                                if [ -z "$title" ]; then
           echo "No title: $line"
                                        ignore_item=1
index 2abf486..81369df 100644 (file)
@@ -78,3 +78,15 @@ menuentry --class=class17 --id='id 17' 'test'\''17' arg17_1 arg17_2 {
   linux /test17.linux ROOT=vmtest17 "test17=test 17"
   initrd /test17.initrd
 }
+menuentry --class=class18 --id='id 18' "test\\18" arg18_1 arg18_2 {
+  linux /test18.linux ROOT=vmtest18 "test17=test 18"
+  initrd /test18.initrd
+}
+menuentry --class=class19 --id='id 19' "\$test 19" arg19_1 arg19_2 {
+  linux /test19.linux ROOT=vmtest19 "test19=test 19"
+  initrd /test19.initrd
+}
+menuentry --class=class20 --id='id 20' "test \"20" arg20_1 arg20_2 {
+  linux /test20.linux ROOT=vmtest20 "test20=test 20"
+  initrd /test20.initrd
+}
diff --git a/tests/linux-boot-probes/boot/test19.initrd b/tests/linux-boot-probes/boot/test19.initrd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/linux-boot-probes/boot/test19.linux b/tests/linux-boot-probes/boot/test19.linux
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/linux-boot-probes/boot/test20.initrd b/tests/linux-boot-probes/boot/test20.initrd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/linux-boot-probes/boot/test20.linux b/tests/linux-boot-probes/boot/test20.linux
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/linux-boot-probes/usr/lib/linux-boot-probes/mounted/40grub2 b/tests/linux-boot-probes/usr/lib/linux-boot-probes/mounted/40grub2
deleted file mode 100755 (executable)
index 31e0c50..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/bin/sh
-. usr/share/os-prober/common.sh
-set -e
-
-partition="$1"
-bootpart="$2"
-mpoint="$3"
-type="$4"
-
-found_item=0
-
-entry_result () {
-       if [ "$ignore_item" = 0 ] && \
-          [ -n "$kernel" ] && \
-          [ -e "$mpoint/$kernel" ]; then
-               result "$rootpart:$bootpart:$title:$kernel:$initrd:$parameters"
-               found_item=1
-       fi
-       kernel=""
-       parameters=""
-       initrd=""
-       title=""
-       ignore_item=0
-}
-
-parse_grub_menu () {
-       mpoint="$1"
-       rootpart="$2"
-       bootpart="$3"
-       
-       kernel=""
-       parameters=""
-       initrd=""
-       title=""
-       ignore_item=0
-
-       while read line; do
-               debug "parsing: $line"
-               set -f
-               set -- $line
-               set +f
-               case "$1" in
-                       menuentry)
-                               entry_result
-                               shift 1
-        # strip all of: --option=abcd --option='ab cd' --option="ab cd" menuentry { command block
-        # and everything else except the first quoted string or non-space word
-        # and remove any : from the remaining title
-        title=$( printf "%s" "$line"  | sed -n "s/^[[:blank:]]*//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/--[^ ]*=\(\([\"']\)[^\"']*\2 \|[^ ]* \)//g; p" )
-        title=$( printf "%s" "$title" | sed -n "s/{//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/menuentry//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/^[ ]*\(\([\"']\{1\}\)\(.*\)\2\|\([^\"' ][^ ]*\)\).*/\3\4/; p" )
-        title=$( printf "%s" "$title" | sed -n "s/\\\\'//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/''//; p" )
-        title=$( printf "%s" "$title" | sed -n "s/://g; p" )
-                               if [ -z "$title" ]; then
-          echo "No title: $line"
-                                       ignore_item=1
-                               elif echo "$title" | grep -q '(on /dev/[^)]*)$'; then
-                                       log "Skipping entry '$title':"
-                                       log "appears to be an automatic reference taken from another menu.lst"
-                                       ignore_item=1
-                               fi
-                       ;;
-                       linux)
-                               # Hack alert: sed off any (hdn,n) but
-                               # assume the kernel is on the same
-                               # partition.
-                               kernel="$(echo "$2" | sed 's/(.*)//')"
-                               shift 2
-                               parameters="$@"
-                               # Systems with a separate /boot will not have
-                               # the path to the kernel in grub.cfg.
-                               if [ "$partition" != "$bootpart" ]; then
-                                       kernel="/boot$kernel"
-                               fi
-                       ;;
-                       initrd)
-                               initrd="$(echo "$2" | sed 's/(.*)//')"
-                               # Initrd same.
-                               if [ "$partition" != "$bootpart" ]; then
-                                       initrd="/boot$initrd"
-                               fi
-                       ;;
-                       "}")
-                               entry_result
-                       ;;
-               esac
-       done
-
-       entry_result
-}
-
-if [ -e "$mpoint/boot/grub/grub.cfg" ] && \
-   ([ ! -e "$mpoint/boot/grub/menu.lst" ] || \
-    [ "$mpoint/boot/grub/grub.cfg" -nt "$mpoint/boot/grub/menu.lst" ]); then
-       debug "parsing grub.cfg"
-       parse_grub_menu "$mpoint" "$partition" "$bootpart" < "$mpoint/boot/grub/grub.cfg"
-elif [ -e "$mpoint/boot/grub2/grub.cfg" ]; then
-       debug "parsing grub.cfg"
-       parse_grub_menu "$mpoint" "$partition" "$bootpart" < "$mpoint/boot/grub2/grub.cfg"
-fi
-
-if [ "$found_item" = 0 ]; then
-       exit 1
-else
-       exit 0
-fi
diff --git a/tests/linux-boot-probes/usr/share/os-prober/common.sh b/tests/linux-boot-probes/usr/share/os-prober/common.sh
deleted file mode 100644 (file)
index e1646d4..0000000
+++ /dev/null
@@ -1,298 +0,0 @@
-newns () {
-  [ "$OS_PROBER_NEWNS" ] || exec /usr/lib/os-prober/newns "$0" "$@"
-}
-
-cleanup_tmpdir=false
-cleanup () {
-  if $cleanup_tmpdir; then
-    rm -rf "$OS_PROBER_TMP"
-  fi
-}
-
-require_tmpdir() {
-  if [ -z "$OS_PROBER_TMP" ]; then
-    if type mktemp >/dev/null 2>&1; then
-      export OS_PROBER_TMP="$(mktemp -d /tmp/os-prober.XXXXXX)"
-      cleanup_tmpdir=:
-      trap cleanup EXIT HUP INT QUIT TERM
-    else
-      export OS_PROBER_TMP=/tmp
-    fi
-  fi
-}
-
-count_for() {
-  _labelprefix="$1"
-  _result=$(grep "^${_labelprefix} " /var/lib/os-prober/labels 2>/dev/null || true)
-
-  if [ -z "$_result" ]; then
-    return
-  else
-    echo "$_result" | cut -d' ' -f2
-  fi
-}
-
-count_next_label() {
-  require_tmpdir
-
-  _labelprefix="$1"
-  _cfor="$(count_for "${_labelprefix}")"
-
-  if [ -z "$_cfor" ]; then
-    echo "${_labelprefix} 1" >> /var/lib/os-prober/labels
-  else
-    sed "s/^${_labelprefix} ${_cfor}/${_labelprefix} $(($_cfor + 1))/" /var/lib/os-prober/labels > "$OS_PROBER_TMP/os-prober.tmp"
-    mv "$OS_PROBER_TMP/os-prober.tmp" /var/lib/os-prober/labels
-  fi
-  
-  echo "${_labelprefix}${_cfor}"
-}
-
-progname=
-cache_progname() {
-  case $progname in
-    '')
-      progname="${0##*/}"
-      ;;
-  esac
-}
-
-log() {
-  cache_progname
-  logger -t "$progname" "$@"
-}
-
-error() {
-  log "error: $@"
-}
-
-warn() {
-  log "warning: $@"
-}
-
-debug() {
-  if [ -z "$OS_PROBER_DISABLE_DEBUG" ]; then
-    log "debug: $@"
-  fi
-}
-
-result () {
-  log "result:" "$@"
-  echo "$@"
-}
-
-# shim to make it easier to use os-prober outside d-i
-if ! type mapdevfs >/dev/null 2>&1; then
-  mapdevfs () {
-    readlink -f "$1"
-  }
-fi
-
-item_in_dir () {
-       if [ "$1" = "-q" ]; then
-               q="-q"
-               shift 1
-       else
-               q=""
-       fi
-       [ -d "$2" ] || return 1
-       # find files with any case
-       ls -1 "$2" | grep $q -i "^$1$"
-}
-
-# We can't always tell the filesystem type up front, but if we have the
-# information then we should use it. Note that we can't use block-attr here
-# as it's only available in udebs.
-# If not detected after different attempts then "NOT-DETECTED" will be printed
-# because function is not supposed to exit error codes.
-fs_type () {
-       local fstype=""
-       if (export PATH="/lib/udev:$PATH"; type vol_id) >/dev/null 2>&1; then
-               PATH="/lib/udev:$PATH" \
-                       fstype=$(vol_id --type "$1" 2>/dev/null || true)
-               [ -z "$fstype" ] || { echo "$fstype"; return; }
-       fi
-       if type lsblk >/dev/null 2>&1 ; then
-               fstype=$(lsblk --nodeps --noheading --output FSTYPE -- "$1" || true)
-               [ -z "$fstype" ] || { echo "$fstype"; return; }
-       fi
-       if type blkid >/dev/null 2>&1; then
-               fstype=$(blkid -o value -s TYPE "$1" 2>/dev/null || true)
-               [ -z "$fstype" ] || { echo "$fstype"; return; }
-       fi
-       echo "NOT-DETECTED"
-}
-
-is_dos_extended_partition() {
-       if type blkid >/dev/null 2>&1; then
-               local output
-
-               output="$(blkid -o export $1)"
-
-               # old blkid (util-linux << 2.24) errors out on extended p.
-               if [ "$?" = "2" ]; then
-                       return 0
-               fi
-
-               # dos partition type and no filesystem type?...
-               if echo $output | grep -q ' PTTYPE=dos ' &&
-                               ! echo $output | grep -q ' TYPE='; then
-                       return 0
-               else
-                       return 1
-               fi
-       fi
-
-       return 1
-}
-
-parse_proc_mounts () {
-       while read -r line; do
-               set -f
-               set -- $line
-               set +f
-               printf '%s %s %s\n' "$(mapdevfs "$1")" "$2" "$3"
-       done
-}
-
-parsefstab () {
-       while read -r line; do
-               case "$line" in
-                       "#"*)
-                               :       
-                       ;;
-                       *)
-                               set -f
-                               set -- $line
-                               set +f
-                               printf '%s %s %s\n' "$1" "$2" "$3"
-                       ;;
-               esac
-       done
-}
-
-unescape_mount () {
-       printf %s "$1" | \
-               sed 's/\\011/   /g; s/\\012/\n/g; s/\\040/ /g; s/\\134/\\/g'
-}
-
-find_label () {
-       local output
-       if type blkid >/dev/null 2>&1; then
-               # Hopefully everyone has blkid by now
-               output="$(blkid -o device -t LABEL="$1")" || return 1
-               echo "$output" | head -n1
-       elif [ -h "/dev/disk/by-label/$1" ]; then
-               # Last-ditch fallback
-               readlink -f "/dev/disk/by-label/$1"
-       else
-               return 1
-       fi
-}
-
-find_uuid () {
-       local output
-       if type blkid >/dev/null 2>&1; then
-               # Hopefully everyone has blkid by now
-               output="$(blkid -o device -t UUID="$1")" || return 1
-               echo "$output" | head -n1
-       elif [ -h "/dev/disk/by-uuid/$1" ]; then
-               # Last-ditch fallback
-               readlink -f "/dev/disk/by-uuid/$1"
-       else
-               return 1
-       fi
-}
-
-# Sets $mountboot as output variables.  This is very messy, but POSIX shell
-# isn't really up to the task of doing it more cleanly.
-linux_mount_boot () {
-       partition="$1"
-       tmpmnt="$2"
-
-       bootpart=""
-       mounted=""
-       if [ -e "$tmpmnt/etc/fstab" ]; then
-               # Try to mount any /boot partition.
-               bootmnt=$(parsefstab < "$tmpmnt/etc/fstab" | grep " /boot ") || true
-               if [ -n "$bootmnt" ]; then
-                       set -f
-                       set -- $bootmnt
-                       set +f
-                       boottomnt=""
-
-                       # Try to map labels and UUIDs ourselves if possible,
-                       # so that we can check whether they're already
-                       # mounted somewhere else.
-                       tmppart="$1"
-                       if echo "$1" | grep -q "LABEL="; then
-                               label="$(echo "$1" | cut -d = -f 2)"
-                               if tmppart="$(find_label "$label")"; then
-                                       debug "mapped LABEL=$label to $tmppart"
-                               else
-                                       debug "found boot partition LABEL=$label for Linux system on $partition, but cannot map to existing device"
-                                       mountboot="$partition 0"
-                                       return
-                               fi
-                       elif echo "$1" | grep -q "UUID="; then
-                               uuid="$(echo "$1" | cut -d = -f 2)"
-                               if tmppart="$(find_uuid "$uuid")"; then
-                                       debug "mapped UUID=$uuid to $tmppart"
-                               else
-                                       debug "found boot partition UUID=$uuid for Linux system on $partition, but cannot map to existing device"
-                                       mountboot="$partition 0"
-                                       return
-                               fi
-                       fi
-                       shift
-                       set -- "$(mapdevfs "$tmppart")" "$@"
-
-                       if grep -q "^$1 " "$OS_PROBER_TMP/mounted-map"; then
-                               bindfrom="$(grep "^$1 " "$OS_PROBER_TMP/mounted-map" | head -n1 | cut -d " " -f 2)"
-                               bindfrom="$(unescape_mount "$bindfrom")"
-                               if [ "$bindfrom" != "$tmpmnt/boot" ]; then
-                                       if mount --bind "$bindfrom" "$tmpmnt/boot"; then
-                                               mounted=1
-                                               bootpart="$1"
-                                       else
-                                               debug "failed to bind-mount $bindfrom onto $tmpmnt/boot"
-                                       fi
-                               fi
-                       fi
-                       if [ "$mounted" ]; then
-                               :
-                       elif [ -e "$1" ]; then
-                               bootpart="$1"
-                               boottomnt="$1"
-                       elif [ -e "$tmpmnt/$1" ]; then
-                               bootpart="$1"
-                               boottomnt="$tmpmnt/$1"
-                       elif [ -e "/target/$1" ]; then
-                               bootpart="$1"
-                               boottomnt="/target/$1"
-                       else
-                               bootpart=""
-                       fi
-
-                       if [ ! "$mounted" ]; then
-                               if [ -z "$bootpart" ]; then
-                                       debug "found boot partition $1 for linux system on $partition, but cannot map to existing device"
-                               else
-                                       debug "found boot partition $bootpart for linux system on $partition"
-                                       if type grub-mount >/dev/null 2>&1 && \
-                                          grub-mount "$boottomnt" "$tmpmnt/boot" 2>/dev/null; then
-                                               mounted=1
-                                       fi
-                               fi
-                       fi
-               fi
-       fi
-       if [ -z "$bootpart" ]; then
-               bootpart="$partition"
-       fi
-       if [ -z "$mounted" ]; then
-               mounted=0
-       fi
-
-       mountboot="$bootpart $mounted"
-}