From ee5ae03d58ea17bc343430218814f636a65c3d44 Mon Sep 17 00:00:00 2001
From: Tim Serong <tserong@suse.com>
Date: Mon, 22 Jul 2013 20:06:54 +1000
Subject: [PATCH] Enable running disk-image-create on SUSE Linux

- Ensures /sbin and friends are in $PATH when invoked (without this,
  various sudo invocations fail in exciting ways).
- Use dib-run-parts in lib/common-functions instead of run-parts
  (neither SLES nor openSUSE ship run-parts).
- Ensure dib-run-parts doesn't descend into subdirectories (same
  behaviour as run-parts).
- Move dib-run-parts from root.d to bin (cleaner, consistent with
  other elements with separate bin scripts).
- Tested by building Ubuntu image on openSUSE 12.3.
- Note: this doesn't add support for creating SUSE images, it just
  lets you run disk-image-create on SUSE-based distros.

Change-Id: I906c6bc3cf51cdf2c4415adeae1ca250faac25e1
---
 bin/dib-run-parts                                    | 1 +
 elements/dib-run-parts/{root.d => bin}/dib-run-parts | 4 +++-
 elements/dib-run-parts/root.d/90-base-dib-run-parts  | 3 ++-
 lib/common-defaults                                  | 7 +++++++
 lib/common-functions                                 | 2 +-
 5 files changed, 14 insertions(+), 3 deletions(-)
 create mode 120000 bin/dib-run-parts
 rename elements/dib-run-parts/{root.d => bin}/dib-run-parts (90%)
 mode change 100644 => 100755

diff --git a/bin/dib-run-parts b/bin/dib-run-parts
new file mode 120000
index 000000000..055c8b3c0
--- /dev/null
+++ b/bin/dib-run-parts
@@ -0,0 +1 @@
+../elements/dib-run-parts/bin/dib-run-parts
\ No newline at end of file
diff --git a/elements/dib-run-parts/root.d/dib-run-parts b/elements/dib-run-parts/bin/dib-run-parts
old mode 100644
new mode 100755
similarity index 90%
rename from elements/dib-run-parts/root.d/dib-run-parts
rename to elements/dib-run-parts/bin/dib-run-parts
index b528c9eec..3edd9aeb2
--- a/elements/dib-run-parts/root.d/dib-run-parts
+++ b/elements/dib-run-parts/bin/dib-run-parts
@@ -45,7 +45,9 @@ fi
 # We specifically only want to sort *by the numbers*.
 # Lexical sorting is not guaranteed, and identical numbers may be
 # parallelized later
-targets=$(find $target_dir -type f -executable -printf '%f\n' | grep -E "$allowed_regex" | LANG=C sort -n)
+# Note: -maxdepth 1 ensures only files in the target directory (but not
+# subdirectories) are run, which is the way run-parts behaves.
+targets=$(find $target_dir -maxdepth 1 -type f -executable -printf '%f\n' | grep -E "$allowed_regex" | LANG=C sort -n)
 
 PROFILE_DIR=$(mktemp -d /tmp/profiledir.XXXXXX)
 
diff --git a/elements/dib-run-parts/root.d/90-base-dib-run-parts b/elements/dib-run-parts/root.d/90-base-dib-run-parts
index fe4ca43dd..eec2c50d2 100755
--- a/elements/dib-run-parts/root.d/90-base-dib-run-parts
+++ b/elements/dib-run-parts/root.d/90-base-dib-run-parts
@@ -1,5 +1,6 @@
 #!/bin/bash
+
 home=$(dirname $0)
 exec sudo install -m 0755 -o root -g root -D \
-    $home/dib-run-parts \
+    $home/../bin/dib-run-parts \
     $TARGET_ROOT/usr/local/bin/dib-run-parts
diff --git a/lib/common-defaults b/lib/common-defaults
index ff06fe781..6fb8eaf75 100644
--- a/lib/common-defaults
+++ b/lib/common-defaults
@@ -40,3 +40,10 @@ _BASE_ELEMENT_DIR=$(dirname $0)/../elements
 ELEMENTS_PATH=${ELEMENTS_PATH:+"$ELEMENTS_PATH:$_BASE_ELEMENT_DIR"}
 export ELEMENTS_PATH=${ELEMENTS_PATH:-$_BASE_ELEMENT_DIR}
 export DIB_OFFLINE=${DIB_OFFLINE:-''}
+
+# /sbin and friends aren't automatically included in $PATH when running sudo
+# on SUSE Linux which breaks various pieces of this script in exciting ways,
+# so inject them into the current $PATH if they're not there.
+if ! [[ "$PATH" =~ "/sbin" ]] ; then
+  export PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
+fi
diff --git a/lib/common-functions b/lib/common-functions
index c6382d245..f80d5f42a 100644
--- a/lib/common-functions
+++ b/lib/common-functions
@@ -155,7 +155,7 @@ function run_d() {
     check_element
     check_break before-$1 bash
     if [ -d ${TMP_HOOKS_PATH}/$1.d ] ; then
-      run-parts ${TMP_HOOKS_PATH}/$1.d
+      ${SCRIPT_HOME}/dib-run-parts ${TMP_HOOKS_PATH}/$1.d
     fi
     check_break after-$1 bash
 }