diff --git a/acpi_override.patch b/acpi_override.patch deleted file mode 100644 index 1d85528..0000000 --- a/acpi_override.patch +++ /dev/null @@ -1,38 +0,0 @@ -dracut: Implement ACPI table overriding - -An example config file for this feature could be: - -/etc/dracut.conf.d/03-acpi-override.conf - -with this content: -acpi_override="yes" -acpi_table_dir="/etc/dracut.conf.d/acpi_tables" - -Then all files ending with *.aml will be put into the early cpio -(kernel/firmware/acpi) and will be used to replace the BIOS provided tables -if the kernel supports this feature. - -Signed-off-by: Thomas Renninger - -Index: dracut-033/dracut.sh -=================================================================== ---- dracut-033.orig/dracut.sh -+++ dracut-033/dracut.sh -@@ -1322,6 +1322,17 @@ if [[ $early_microcode = yes ]]; then - done - fi - -+if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then -+ dinfo "*** Packaging ACPI tables to override BIOS provided ones ***" -+ _dest_dir="$early_cpio_dir/d/kernel/firmware/acpi" -+ mkdir -p $_dest_dir -+ for table in $acpi_table_dir/*.aml; do -+ dinfo " Adding ACPI table: $table" -+ cp $table $_dest_dir -+ create_early_cpio="yes" -+ done -+fi -+ - rm -f -- "$outfile" - dinfo "*** Creating image file ***" - if [[ $create_early_cpio = yes ]]; then diff --git a/dracut-033.tar.xz b/dracut-033.tar.xz index 331c691..898c134 100644 --- a/dracut-033.tar.xz +++ b/dracut-033.tar.xz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca2c1fa21efe9e11181b69fa915a1f6cb0b92ff92a9b4981052bd7ad07b83423 -size 237200 +oid sha256:8bd7c77c29bf7288465431f741f768dfd00a84f02129b0447cc0d6ef21d98e88 +size 218040 diff --git a/dracut.changes b/dracut.changes index 4d2ccea..2e4a782 100644 --- a/dracut.changes +++ b/dracut.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Mon Oct 7 08:58:00 UTC 2013 - trenn@suse.de + +- Update to mainline git version 033, b7d1b6f904a5b0bdd9a5ad19149f3. +- Remove all patches which went mainline +- Fix missing root fs slash in lib/udev/rules.d resulting in: + /var/tmp/initramfs.Lusf6flib/udev/rules.d +- bcache: removed, it's in the upstream bcache-tools package + mainline git commit: 49268028b90f6344f79e3510d2 +- Fix bad she-bang in mkinitrd_setup_dummy + ------------------------------------------------------------------- Fri Oct 4 17:23:19 UTC 2013 - tittiatcoke@gmail.com diff --git a/dracut.spec b/dracut.spec index b70fb30..b84754b 100644 --- a/dracut.spec +++ b/dracut.spec @@ -44,28 +44,10 @@ Patch1: use_initrd_insteadof_initramfs.patch Patch2: use_sysconfig_values_correctly.patch # PATCH-FIX-OPENSUSE At the moment we have 2 paths that contain udev files (/lib/udev and /usr/lib/udev) - tittiatcoke@gmail.com Patch3: use_all_paths_udev.patch -# PATCH-FIX-UPSTREAM ACPI early table override support in early cpio - trenn@suse.de -Patch4: generalize_early_cpio.patch -# PATCH-FIX-UPSTREAM Do not create early_cpio if no suitable microcode exists - trenn@suse.de -Patch5: microcode_cleanup.patch -# PATCH-FIX-UPSTREAM Implement ACPI table overriding - trenn@suse.de -Patch6: acpi_override.patch -# PATCH-FIX-OPENSUSE SUSE mkinitrd compatibility: Introduce -i -k parameters - trenn@suse.de -Patch7: mkinitrd_allow_no_option.patch -# PATCH-FIX-OPENSUSE SUSE mkinitrd compatibility: allow multiple arguments per param - trenn@suse.de -Patch8: mkinitrd_allow_multiple_args.patch -# PATCH-FIX-UPSTREAM Limit an output to essential one implementing --quiet option - trenn@suse.de -Patch9: quiet_options.patch -# PATCH-FIX-OPENSUSE SUSE mkinitrd compatibility: Allow a call w/o passing any parameters - trenn@suse.de -Patch10: implement_default.patch -# PATCH-FIX-OPENSUSE SUSE mkinitrd compatibility: add -d to pass rootfs and dummy -s - trenn@suse.de -Patch11: root_fs.patch -# PATCH-FIX-OPENSUSE Build host only images for default_kernel_images and -i/-k ones - trenn@suse.de -Patch12: suse_host_only.patch # PATCH-FIX-OPENSUSE Write caller and used parameters to syslog if mkinitrd is called - trenn@suse.de -Patch13: suse_only_logger.patch +Patch4: suse_only_logger.patch # PATCH-FIX-OPENSUSE Call the update-bootloader after dracut finished creating the initrd - tittiatcoke@gmail.com -Patch14: mkinitrd_update_bootloader.diff +Patch5: mkinitrd_update_bootloader.diff BuildRequires: bash BuildRequires: dash @@ -145,15 +127,6 @@ This package contains tools to assemble the local initrd and host configuration. %patch3 -p1 %patch4 -p1 %patch5 -p1 -%patch6 -p1 -%patch7 -p1 -%patch8 -p1 -%patch9 -p1 -%patch10 -p1 -%patch11 -p1 -%patch12 -p1 -%patch13 -p1 -%patch14 -p1 %build %configure\ @@ -324,8 +297,6 @@ rm -rf %{buildroot} %dir %{dracutlibdir}/modules.d/03modsign %{dracutlibdir}/modules.d/03modsign/load-modsign-keys.sh %{dracutlibdir}/modules.d/03modsign/module-setup.sh -%dir %{dracutlibdir}/modules.d/90bcache -%{dracutlibdir}/modules.d/90bcache/module-setup.sh %dir %{dracutlibdir}/modules.d/00bash %{dracutlibdir}/modules.d/00bash/module-setup.sh %config(noreplace) %{_sysconfdir}/logrotate.d/dracut diff --git a/generalize_early_cpio.patch b/generalize_early_cpio.patch deleted file mode 100644 index 010ae54..0000000 --- a/generalize_early_cpio.patch +++ /dev/null @@ -1,62 +0,0 @@ -dracut: Generlize microcode early cpio usage - -ACPI early table override also may need to place files into an early cpio. -Reflect this in variable and file names. -This change is renaming only and does not introduce any real change. - -Signed-off-by: Thomas Renninger - -Index: dracut-033/dracut.sh -=================================================================== ---- dracut-033.orig/dracut.sh -+++ dracut-033/dracut.sh -@@ -696,9 +696,9 @@ readonly initdir="$(mktemp --tmpdir="$TM - } - - if [[ $early_microcode = yes ]]; then -- readonly microcode_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_microcode.XXXXXX)" -- [ -d "$microcode_dir" ] || { -- printf "%s\n" "dracut: mktemp --tmpdir=\"$TMPDIR/\" -d -t early_microcode.XXXXXX failed." >&2 -+ readonly early_cpio_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)" -+ [ -d "$early_cpio_dir" ] || { -+ printf "%s\n" "dracut: mktemp --tmpdir=\"$TMPDIR/\" -d -t early_cpio.XXXXXX failed." >&2 - exit 1 - } - fi -@@ -707,7 +707,7 @@ trap ' - ret=$?; - [[ $outfile ]] && [[ -f $outfile.$$ ]] && rm -f -- "$outfile.$$"; - [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; }; -- [[ $keep ]] && echo "Not removing $microcode_dir." >&2 || { [[ $microcode_dir ]] && rm -Rf -- "$microcode_dir"; }; -+ [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; }; - [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir"; - exit $ret; - ' EXIT -@@ -1296,7 +1296,7 @@ if [[ $early_microcode = yes ]]; then - dinfo "*** Generating early-microcode cpio image ***" - ucode_dir=(amd-ucode intel-ucode) - ucode_dest=(AuthenticAMD.bin GenuineIntel.bin) -- _dest_dir="$microcode_dir/d/kernel/x86/microcode" -+ _dest_dir="$early_cpio_dir/d/kernel/x86/microcode" - _dest_idx="0 1" - mkdir -p $_dest_dir - if [[ $hostonly ]]; then -@@ -1316,14 +1316,15 @@ if [[ $early_microcode = yes ]]; then - fi - done - done -- (cd "$microcode_dir/d"; find . -print0 | cpio --null -o -H newc --quiet >../ucode.cpio) -+ create_early_cpio="yes" - fi - - rm -f -- "$outfile" - dinfo "*** Creating image file ***" --if [[ $early_microcode = yes ]]; then -+if [[ $create_early_cpio = yes ]]; then - # The microcode blob is _before_ the initramfs blob, not after -- mv $microcode_dir/ucode.cpio $outfile.$$ -+ (cd "$early_cpio_dir/d"; find . -print0 | cpio --null -o -H newc --quiet >../early.cpio) -+ mv $early_cpio_dir/early.cpio $outfile.$$ - fi - if ! ( umask 077; cd "$initdir"; find . -print0 | cpio --null -R 0:0 -H newc -o --quiet| \ - $compress >> "$outfile.$$"; ); then diff --git a/implement_default.patch b/implement_default.patch deleted file mode 100644 index ce944dc..0000000 --- a/implement_default.patch +++ /dev/null @@ -1,91 +0,0 @@ -mkinitrd-dracut.sh: Allow mkinitrd call without passing any parameters - -Before this gave a "usage" error. -Now boot_dir (by default /boot) is scanned for available kernels and sane -initrd default targets get defined and the corresponding initramfs files -are generated. - -Signed-off-by: Thomas Renninger - -Index: dracut-033/mkinitrd-dracut.sh -=================================================================== ---- dracut-033.orig/mkinitrd-dracut.sh -+++ dracut-033/mkinitrd-dracut.sh -@@ -46,6 +46,67 @@ read_arg() { - fi - } - -+# Taken over from SUSE mkinitrd -+default_kernel_images() { -+ local regex kernel_image kernel_version version_version initrd_image -+ local qf='%{NAME}-%{VERSION}-%{RELEASE}\n' -+ -+ case "$(uname -m)" in -+ s390|s390x) -+ regex='image' -+ ;; -+ ppc|ppc64) -+ regex='vmlinux' -+ ;; -+ i386|x86_64) -+ regex='vmlinuz' -+ ;; -+ arm*) -+ regex='[uz]Image' -+ ;; -+ aarch64) -+ regex='Image' -+ ;; -+ *) regex='vmlinu.' -+ ;; -+ esac -+ -+ # user mode linux -+ if grep -q UML /proc/cpuinfo; then -+ regex='linux' -+ fi -+ -+ kernel_images="" -+ initrd_images="" -+ for kernel_image in $(ls $boot_dir \ -+ | sed -ne "\|^$regex\(-[0-9.]\+-[0-9]\+-[a-z0-9]\+$\)\?|p" \ -+ | grep -v kdump$ ) ; do -+ -+ # Note that we cannot check the RPM database here -- this -+ # script is itself called from within the binary kernel -+ # packages, and rpm does not allow recursive calls. -+ -+ [ -L "$boot_dir/$kernel_image" ] && continue -+ [ "${kernel_image%%.gz}" != "$kernel_image" ] && continue -+ kernel_version=$(/usr/bin/get_kernel_version \ -+ $boot_dir/$kernel_image 2> /dev/null) -+ initrd_image=$(echo $kernel_image | sed -e "s|${regex}|initrd|") -+ if [ "$kernel_image" != "$initrd_image" -a \ -+ -n "$kernel_version" -a \ -+ -d "/lib/modules/$kernel_version" ]; then -+ kernel_images="$kernel_images $boot_dir/$kernel_image" -+ initrd_images="$initrd_images $boot_dir/$initrd_image" -+ fi -+ done -+ for kernel_image in $kernel_images;do -+ kernels="$kernels ${kernel_image#*-}" -+ done -+ for initrd_image in $initrd_images;do -+ targets="$targets $initrd_image" -+ done -+ -+} -+ - while (($# > 0)); do - case ${1%%=*} in - --with-usb) read_arg usbmodule "$@" || shift $? -@@ -124,7 +185,8 @@ while (($# > 0)); do - shift - done - --[[ $targets && $kernels ]] || usage -+[[ $targets && $kernels ]] || default_kernel_images -+[[ $targets && $kernels ]] || (error "No kernel found in $boot_dir" && usage) - - # We can have several targets/kernels, transform the list to an array - targets=( $targets ) diff --git a/microcode_cleanup.patch b/microcode_cleanup.patch deleted file mode 100644 index 55ff7eb..0000000 --- a/microcode_cleanup.patch +++ /dev/null @@ -1,30 +0,0 @@ -dracut: Do not create early_cpio if no suitable microcode exist in hostonly -case - -Intel microcodes only exist for very specific family/model/stepping CPUs. -If no microcode gets added, there is no need to create an empty -(only directories) cpio later that gets glued to the initrd. - -This also fixes: - -Index: dracut-033/dracut.sh -=================================================================== ---- dracut-033.orig/dracut.sh -+++ dracut-033/dracut.sh -@@ -1311,12 +1311,15 @@ if [[ $early_microcode = yes ]]; then - dinfo "*** Constructing ${ucode_dest[$idx]} ****" - if [[ $hostonly ]]; then - _src=$(get_ucode_file) -+ if ! [[ -r $_fwdir/$_fw/$_src ]];then -+ break; -+ fi - fi - cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]} -+ create_early_cpio="yes" - fi - done - done -- create_early_cpio="yes" - fi - - rm -f -- "$outfile" diff --git a/mkinitrd_allow_no_option.patch b/mkinitrd_allow_no_option.patch deleted file mode 100644 index 31896d3..0000000 --- a/mkinitrd_allow_no_option.patch +++ /dev/null @@ -1,88 +0,0 @@ -mkinitrd-dracut.sh: Introduce -i -k parameters - -In SUSE, one can pass a list of kernel files via -k parameter. -For each an initrd is generated as passed via -i parameters. - -Make the dracut mkinitrd wrapper compatible to those. -For now only one kernel file and initrd target can be specified. -This will get enhanced with a follow-up patch. - -Signed-off-by: Thomas Renninger - -diff --git a/mkinitrd-dracut.sh b/mkinitrd-dracut.sh -old mode 100644 -new mode 100755 -index ffea2d1..ace7725 ---- a/mkinitrd-dracut.sh -+++ b/mkinitrd-dracut.sh -@@ -1,6 +1,8 @@ - #!/bin/bash --norc - kver=$(uname -r) - -+boot_dir="/boot" -+ - error() { echo "$@" >&2; } - - usage () { -@@ -80,10 +82,27 @@ while (($# > 0)); do - --looppath*) ;; - --dsdt*) ;; - --bootchart) ;; -- *) if [[ ! $target ]]; then -- target=$1 -- elif [[ ! $kernel ]]; then -- kernel=$1 -+ -b) read_arg boot_dir "$@" || shift -+ if [ ! -d $boot_dir ];then -+ error "Boot directory $boot_dir does not exist" -+ exit 1 -+ fi -+ ;; -+ -k) # Would be nice to get a list of images here -+ read_arg kernel_images "$@" || shift -+ for kernel_image in $kernel_images;do -+ kernels="$kernels ${kernel_image#*-}" -+ done -+ ;; -+ -i) read_arg initrd_images "$@" || shift -+ for initrd_image in $initrd_images;do -+ targets="$targets $boot_dir/$initrd_images" -+ done -+ ;; -+ *) if [[ ! $targets ]]; then -+ targets=$1 -+ elif [[ ! $kernels ]]; then -+ kernels=$1 - else - usage - fi;; -@@ -91,11 +110,24 @@ while (($# > 0)); do - shift - done - --[[ $target && $kernel ]] || usage --[[ $img_vers ]] && target="$target-$kernel" -+[[ $targets && $kernels ]] || usage -+ -+# We can have several targets/kernels, transform the list to an array -+targets=( $targets ) -+[[ $kernels ]] && kernels=( $kernels ) - --if [[ $basicmodules ]]; then -+for ((i=0 ; $i<${#targets[@]} ; i++)); do -+ -+ if [[ $img_vers ]];then -+ target="${targets[$i]}-${kernels[$i]}" -+ else -+ target="${targets[$i]}" -+ fi -+ kernel="${kernels[$i]}" -+ -+ if [[ $basicmodules ]]; then - dracut $dracut_args --add-drivers "$basicmodules" "$target" "$kernel" --else -+ else - dracut $dracut_args "$target" "$kernel" --fi -+ fi -+done diff --git a/mkinitrd_setup_dummy b/mkinitrd_setup_dummy index a5798db..6461f02 100644 --- a/mkinitrd_setup_dummy +++ b/mkinitrd_setup_dummy @@ -1,3 +1,3 @@ -#/bin/bash +#!/bin/bash true diff --git a/quiet_options.patch b/quiet_options.patch deleted file mode 100644 index 14b6675..0000000 --- a/quiet_options.patch +++ /dev/null @@ -1,61 +0,0 @@ -mkinitrd-dracut.sh: Implement --quiet|-q option - -Dracut is rather verbose. This optional parameter is to limit the output -to the essential: For each generated initrd show the kernel, target and -possibly additional options passed to dracut. - -Signed-off-by: Thomas Renninger - -diff --git a/mkinitrd-dracut.sh b/mkinitrd-dracut.sh -index d8e92f3..803abc0 100755 ---- a/mkinitrd-dracut.sh -+++ b/mkinitrd-dracut.sh -@@ -2,6 +2,7 @@ - kver=$(uname -r) - - boot_dir="/boot" -+quiet=0 - - error() { echo "$@" >&2; } - -@@ -89,6 +90,7 @@ while (($# > 0)); do - --looppath*) ;; - --dsdt*) ;; - --bootchart) ;; -+ --quiet|-q) quiet=1;; - -b) read_arg boot_dir "$@" || shift $? - if [ ! -d $boot_dir ];then - error "Boot directory $boot_dir does not exist" -@@ -128,6 +130,7 @@ done - targets=( $targets ) - [[ $kernels ]] && kernels=( $kernels ) - -+echo "Creating: target|kernel|dracut args|basicmodules " - for ((i=0 ; $i<${#targets[@]} ; i++)); do - - if [[ $img_vers ]];then -@@ -137,9 +140,21 @@ for ((i=0 ; $i<${#targets[@]} ; i++)); do - fi - kernel="${kernels[$i]}" - -- if [[ $basicmodules ]]; then -- dracut $dracut_args --add-drivers "$basicmodules" "$target" "$kernel" -+ # Duplicate code: No way found how to redirect output based on $quiet -+ if [[ $quiet == 1 ]];then -+ echo "$target|$kernel|$dracut_args|$basicmodules" -+ if [[ $basicmodules ]]; then -+ dracut $dracut_args --add-drivers "$basicmodules" "$target" \ -+ "$kernel" &>/dev/null -+ else -+ dracut $dracut_args "$target" "$kernel" &>/dev/null -+ fi - else -- dracut $dracut_args "$target" "$kernel" -+ if [[ $basicmodules ]]; then -+ dracut $dracut_args --add-drivers "$basicmodules" "$target" \ -+ "$kernel" -+ else -+ dracut $dracut_args "$target" "$kernel" -+ fi - fi - done diff --git a/root_fs.patch b/root_fs.patch deleted file mode 100644 index 3a165c4..0000000 --- a/root_fs.patch +++ /dev/null @@ -1,31 +0,0 @@ -mkinitrd-dracut.sh: Also allow -d to specify the root_fs and -s dummy - --d is the SUSE mkinitrd version option to pass the rootfs. --s is to enable splash which may not be needed, but some callers rely on it, -not to return an error. - -Make this wrapper compatible to it. - -Signed-off-by: Thomas Renninger - -Index: dracut-033/mkinitrd-dracut.sh -=================================================================== ---- dracut-033.orig/mkinitrd-dracut.sh -+++ dracut-033/mkinitrd-dracut.sh -@@ -124,7 +124,7 @@ while (($# > 0)); do - --preload) read_arg modname "$@" || shift $? - basicmodules="$basicmodules $modname";; - --image-version) img_vers=yes;; -- --rootfs) read_arg rootfs "$@" || shift $? -+ --rootfs|-d) read_arg rootfs "$@" || shift $? - dracut_args="${dracut_args} --filesystems $rootfs";; - --nocompress) dracut_args="$dracut_args --no-compress";; - --help) usage -n;; -@@ -151,6 +151,7 @@ while (($# > 0)); do - --looppath*) ;; - --dsdt*) ;; - --bootchart) ;; -+ -s) ;; - --quiet|-q) quiet=1;; - -b) read_arg boot_dir "$@" || shift $? - if [ ! -d $boot_dir ];then diff --git a/suse_host_only.patch b/suse_host_only.patch deleted file mode 100644 index ff4d3a9..0000000 --- a/suse_host_only.patch +++ /dev/null @@ -1,64 +0,0 @@ -mkinitrd-dracut.sh: Build host images for default_kernel_images and -i/-k paths - -default_kernel_images and -i/-k paths are new (SuSE) code paths and -would have resulted in usage errors before. - -There we want to build host only images for faster building and -smaller images. -Also force creation (overriding) of initrd images in these code paths. - -Signed-off-by: Thomas Renninger - -diff --git a/mkinitrd-dracut.sh b/mkinitrd-dracut.sh -index f7b53f1..a1519ea 100755 ---- a/mkinitrd-dracut.sh -+++ b/mkinitrd-dracut.sh -@@ -3,6 +3,8 @@ kver=$(uname -r) - - boot_dir="/boot" - quiet=0 -+host_only=0 -+force=0 - - error() { echo "$@" >&2; } - -@@ -104,7 +106,8 @@ default_kernel_images() { - for initrd_image in $initrd_images;do - targets="$targets $initrd_image" - done -- -+ host_only=1 -+ force=1 - } - - while (($# > 0)); do -@@ -119,8 +122,8 @@ while (($# > 0)); do - --version) - echo "mkinitrd: dracut compatibility wrapper" - exit 0;; -- -v|--verbose) dracut_args="${dracut_args} -v";; -- -f|--force) dracut_args="${dracut_args} -f";; -+ -v|--verbose) dracut_args="${dracut_args} -v --keep";; -+ -f|--force) force=1;; - --preload) read_arg modname "$@" || shift $? - basicmodules="$basicmodules $modname";; - --image-version) img_vers=yes;; -@@ -164,6 +167,8 @@ while (($# > 0)); do - for kernel_image in $kernel_images;do - kernels="$kernels ${kernel_image#*-}" - done -+ host_only=1 -+ force=1 - ;; - -i) read_arg initrd_images "$@" || shift $? - for initrd_image in $initrd_images;do -@@ -193,6 +198,9 @@ done - targets=( $targets ) - [[ $kernels ]] && kernels=( $kernels ) - -+[[ $host_only == 1 ]] && dracut_args="${dracut_args} -H" -+[[ $force == 1 ]] && dracut_args="${dracut_args} -f" -+ - echo "Creating: target|kernel|dracut args|basicmodules " - for ((i=0 ; $i<${#targets[@]} ; i++)); do - diff --git a/use_all_paths_udev.patch b/use_all_paths_udev.patch index c51de8c..e588a8a 100644 --- a/use_all_paths_udev.patch +++ b/use_all_paths_udev.patch @@ -1,3 +1,5 @@ +Index: dracut-033/dracut-functions.sh +=================================================================== --- dracut-033.orig/dracut-functions.sh +++ dracut-033/dracut-functions.sh @@ -872,7 +872,7 @@ inst_rules() { @@ -5,7 +7,7 @@ for _rule in "$@"; do if [ "${_rule#/}" = "$_rule" ]; then - for r in ${udevdir}/rules.d ${hostonly:+/etc/udev/rules.d}; do -+ for r in ${udevdir}/rules.d lib/udev/rules.d ${hostonly:+/etc/udev/rules.d}; do ++ for r in ${udevdir}/rules.d /lib/udev/rules.d ${hostonly:+/etc/udev/rules.d}; do if [[ -e $r/$_rule ]]; then _found="$r/$_rule" inst_rule_programs "$_found"