summaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2015-09-02 15:41:38 +0800
committerJeremy Kerr <jk@ozlabs.org>2015-09-02 15:41:38 +0800
commite75fa5f6bf36233c3bd72e9854d244908af9a391 (patch)
treea3cec7462727b4c3278bc5d5ab25d1d6484b5cf0 /utils
parent0b71e584078dbe370ed37bcc26f2815d138d28fc (diff)
downloadpetitboot-e75fa5f6bf36233c3bd72e9854d244908af9a391.zip
petitboot-e75fa5f6bf36233c3bd72e9854d244908af9a391.tar.gz
pb-plugin: Only require a fixed plugin extension, instead of full name
Currently, the `pb-plugin scan` code requires a fixed archive name at the root of distributed media. This means that vendors need to have a fixed name, and can only ship one plugin per device. This change shifts the requirement to just a filename extension (.pb-plugin) instead. To handle this, we now look for any plugin with a .pb-plugin extension, and so may find multiple plugins on a device. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'utils')
-rwxr-xr-xutils/pb-plugin190
1 files changed, 139 insertions, 51 deletions
diff --git a/utils/pb-plugin b/utils/pb-plugin
index 1f8a591..c6c9ef9 100755
--- a/utils/pb-plugin
+++ b/utils/pb-plugin
@@ -2,8 +2,7 @@
__dest=/
__pb_mount_dir=/var/petitboot/mnt/dev/
-__plugin_basedir=/tmp/
-plugin_file=pb-plugin.cpio.gz
+plugin_ext=pb-plugin
plugin_meta=pb-plugin.conf
plugin_meta_dir=etc/preboot-plugins/
plugin_meta_path=$plugin_meta_dir$plugin_meta
@@ -179,21 +178,20 @@ do_install()
plugin_info
}
-do_scan()
+do_scan_mount()
{
- local found dev plugin_path __meta_tmp
- found=0
- for mnt in $__pb_mount_dir/*
- do
- dev=$(basename $mnt)
- plugin_path="$mnt/$plugin_file"
+ local mnt dev plugin_path __meta_tmp
+ mnt=$1
+ dev=$(basename $mnt)
+ for plugin_path in $mnt/*.$plugin_ext
+ do
[ -e "$plugin_path" ] || continue
# extract plugin metadata to a temporary directory
__meta_tmp=$(mktemp -d)
[ -d $__meta_tmp ] || continue
- gunzip -c "$plugin_path" |
+ gunzip -c "$plugin_path" 2>/dev/null |
(cd $__meta_tmp &&
cpio -i -d $plugin_meta_path 2>/dev/null)
if ! [ $? = 0 -a -e "$plugin_path" ]
@@ -215,6 +213,16 @@ do_scan()
rm -rf $__meta_tmp
found=1
done
+}
+
+do_scan()
+{
+ local found mnt
+ found=0
+ for mnt in $__pb_mount_dir/*
+ do
+ do_scan_mount $mnt
+ done
if [ "$found" = 0 ]
then
@@ -283,7 +291,9 @@ EOF
cat <<EOF > $file
PLUGIN_VENDOR='$vendorname'
+PLUGIN_VENDOR_ID='$vendorshortname'
PLUGIN_NAME='$pluginname'
+PLUGIN_ID='$pluginshortname'
PLUGIN_VERSION='$version'
PLUGIN_DATE='$date'
PLUGIN_EXECUTABLES='$executables'
@@ -326,37 +336,44 @@ do_create()
fi
# Sanity check metadata file
- (
- . $meta_file
- if [ ! -n "$PLUGIN_VENDOR" ]
- then
- echo "error: no PLUGIN_VENDOR defined in metadata" &>2
- exit 1
- fi
- if [ ! -n "$PLUGIN_NAME" ]
- then
- echo "error: no PLUGIN_NAME defined in metadata" &>2
- exit 1
- fi
- if [ ! -n "$PLUGIN_VERSION" ]
- then
- echo "error: no PLUGIN_VERSION defined in metadata" &>2
- exit 1
- fi
- if [ ! -n "$PLUGIN_DATE" ]
- then
- echo "error: no PLUGIN_DATE defined in metadata" &>2
- exit 1
- fi
- if [ ! -n "$PLUGIN_EXECUTABLES" ]
- then
- echo "error: no PLUGIN_EXECUTABLES defined in metadata"\ &>2
- exit 1
- fi
-
- ) || exit 1
+ . $meta_file
+ if [ ! -n "$PLUGIN_VENDOR" ]
+ then
+ echo "error: no PLUGIN_VENDOR defined in metadata" &>2
+ exit 1
+ fi
+ if [ ! -n "$PLUGIN_VENDOR_ID" ]
+ then
+ echo "error: no PLUGIN_VENDOR_ID defined in metadata" &>2
+ exit 1
+ fi
+ if [ ! -n "$PLUGIN_NAME" ]
+ then
+ echo "error: no PLUGIN_NAME defined in metadata" &>2
+ exit 1
+ fi
+ if [ ! -n "$PLUGIN_ID" ]
+ then
+ echo "error: no PLUGIN_ID defined in metadata" &>2
+ exit 1
+ fi
+ if [ ! -n "$PLUGIN_VERSION" ]
+ then
+ echo "error: no PLUGIN_VERSION defined in metadata" &>2
+ exit 1
+ fi
+ if [ ! -n "$PLUGIN_DATE" ]
+ then
+ echo "error: no PLUGIN_DATE defined in metadata" &>2
+ exit 1
+ fi
+ if [ ! -n "$PLUGIN_EXECUTABLES" ]
+ then
+ echo "error: no PLUGIN_EXECUTABLES defined in metadata" &>2
+ exit 1
+ fi
- outfile=$plugin_file
+ outfile=${PLUGIN_ID}-${PLUGIN_VERSION}.${plugin_ext}
(
cd $src
@@ -369,21 +386,17 @@ do_create()
echo
echo "User-visible metadata:"
-
- (
- . $meta_file
- plugin_info | sed -e 's/^/ /'
- )
+ plugin_info | sed -e 's/^/ /'
echo
-
cat <<EOF
Plugin created in:
$outfile
Ship this file in the top-level-directory of a USB device or CD to have it
-automatically discoverable by 'pb-plugin scan'.
+automatically discoverable by 'pb-plugin scan'. This file can be re-named,
+but must retain the .$plugin_ext extension to be discoverable.
EOF
}
@@ -436,10 +449,81 @@ test_scan()
(
cd $mnt_dir;
find -mindepth 1 | cpio -o -Hnewc 2>/dev/null
- ) | gzip -c > $mnt_dir/$plugin_file
+ ) | gzip -c > $mnt_dir/test.$plugin_ext
+
+ do_scan | grep -q 'test'
+}
+
+test_scan_nogzip()
+{
+ __pb_mount_dir="$test_tmpdir/mnt"
+ mnt_dir="$__pb_mount_dir/sda"
+ stderr_file="$test_tmpdir/stderr"
+
+ mkdir -p $mnt_dir
+ echo "invalid" > $mnt_dir/nogzip.$plugin_ext
+
+ do_scan 2>$stderr_file | grep -q 'No plugins'
+
+ [ $? = 0 ] || return 1
+
+ if [ -s "$stderr_file" ]
+ then
+ echo "Scan with invalid (non-gzip) file produced error output" \
+ >&2
+ cat "$stderr_file"
+ return 1
+ fi
+ true
+}
+
+test_scan_nocpio()
+{
+ __pb_mount_dir="$test_tmpdir/mnt"
+ mnt_dir="$__pb_mount_dir/sda"
+ stderr_file="$test_tmpdir/stderr"
+
+ mkdir -p $mnt_dir
+ echo "invalid" | gzip -c > $mnt_dir/nogzip.$plugin_ext
+
+ do_scan 2>$stderr_file | grep -q 'No plugins'
+
+ [ $? = 0 ] || return 1
- do_scan | grep -q 'test 1'
- rc=$?
+ if [ -s "$stderr_file" ]
+ then
+ echo "Scan with invalid (non-cpio) file produced error output" \
+ >&2
+ cat "$stderr_file"
+ return 1
+ fi
+ true
+}
+
+test_scan_multiple()
+{
+ __pb_mount_dir="$test_tmpdir/mnt"
+ mnt_dir="$__pb_mount_dir/sda"
+ outfile=$test_tmpdir/scan.out
+
+ for i in 1 2
+ do
+ mkdir -p $mnt_dir/$plugin_meta_dir
+ (
+ echo "PLUGIN_NAME=test-$i"
+ echo "PLUGIN_VERSION=1"
+ echo "PLUGIN_EXECUTABLES=/bin/sh"
+ ) > $mnt_dir/$plugin_meta_path
+ (
+ cd $mnt_dir;
+ find -mindepth 1 | cpio -o -Hnewc 2>/dev/null
+ ) | gzip -c > $mnt_dir/test-${i}.$plugin_ext
+ rm -rf $mnt_dir/$plugin_meta_dir
+ done
+
+ do_scan >$outfile
+
+ grep -q 'test-1' $outfile && grep -q 'test-2' $outfile
}
test_empty_scan()
@@ -507,6 +591,9 @@ do_tests()
do_test test_http_download
do_test test_ftp_download
do_test test_scan
+ do_test test_scan_nogzip
+ do_test test_scan_nocpio
+ do_test test_scan_multiple
do_test test_empty_scan
if [ $test_failed = 0 ]
@@ -514,9 +601,10 @@ do_tests()
echo "$n tests passed"
else
echo "Tests failed"
- false
fi
rm -rf "$tests_tmpdir"
+
+ [ $test_failed = 0 ]
}
case "$1" in
OpenPOWER on IntegriCloud