From 35d955683e82158365c2e34bac741254a0ba3d06 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Sat, 22 Aug 2020 21:19:34 +0200 Subject: [PATCH] prepare script passes shellcheck --- posix/prepare | 129 +++++++++++++++++++++++++++----------------------- 1 file changed, 70 insertions(+), 59 deletions(-) diff --git a/posix/prepare b/posix/prepare index 13f54b5..dde0a3a 100755 --- a/posix/prepare +++ b/posix/prepare @@ -3,11 +3,13 @@ # NEEDED: lz4 readelf tar cat awk cut sed sh sort WORKDIR="$(basename "$1")" -SYS_LIBDIR='/lib' +if [ -z "$LIBPATH" ]; then + LIBPATH='/lib' +fi PRELOAD_SCRIPT='preload' -LIBLIST=$WORKDIR/liblist -SUMFILE=$WORKDIR/checksum -tmpfile=$WORKDIR/tt +LIBLIST="$WORKDIR"/liblist +SUMFILE="$WORKDIR"/checksum +tmpfile="$WORKDIR"/tt die () { @@ -17,67 +19,71 @@ die () getlibs () { - tmplist=$WORKDIR/tmplist + tmplist="$WORKDIR"/tmplist - touch $LIBLIST + touch "$LIBLIST" # Take the executable and get the first level dependencies readelf -d "$1" | grep NEEDED | awk '{print $5}' | - sed s/\\[/\ / | sed s/\\]/\ / > $tmplist + sed s/\\[/\ / | sed s/\\]/\ / > "$tmplist" # While there are more dependencies - while [ "$(cat $tmplist)" ]; do + while [ "$(cat "$tmplist")" ]; do # Add them to the master file - cat $LIBLIST $tmplist > $tmpfile - mv -f $tmpfile $LIBLIST + cat "$LIBLIST" "$tmplist" > "$tmpfile" + mv -f "$tmpfile" "$LIBLIST" # Copy them to lib/ - while read l; do - find -L $SYS_LIBDIR -maxdepth 2 -name "$l" -exec cp -n {} $WORKDIR/lib/ \; - done < $tmplist + while read -r l; do + ( IFS=: + for p in $LIBPATH; do + find -L "$p" -maxdepth 2 -name "$l" -exec cp -n {} "$WORKDIR"/lib/ \; + done + ) + done < "$tmplist" # Extract their dependencies - touch $tmpfile - for f in $WORKDIR/lib/*; do - if [ "$(grep -F "$(basename "$f")" "$tmplist")" ]; then + touch "$tmpfile" + for f in "$WORKDIR"/lib/*; do + if grep -Fq "$(basename "$f")" "$tmplist"; then readelf -d "$f" | grep NEEDED | awk '{print $5}' | - sed s/\\[/\ / | sed s/\\]/\ / >> $tmpfile + sed s/\\[/\ / | sed s/\\]/\ / >> "$tmpfile" fi done - sort -u $tmpfile > $tmplist + sort -u "$tmpfile" > "$tmplist" done - sort -u $LIBLIST > $tmpfile - mv -f $tmpfile $LIBLIST - rm -f $tmplist + sort -u "$LIBLIST" > "$tmpfile" + mv -f "$tmpfile" "$LIBLIST" + rm -f "$tmplist" } -if ! [ $WORKDIR ]; then +if ! [ "$WORKDIR" ]; then die 'Not enough arguments' fi -if ! test -d $WORKDIR ; then +if ! [ -d "$WORKDIR" ]; then die 'Argument is not a directory' fi -if test -e $WORKDIR/bin; then - if ! test -d $WORKDIR/bin; then +if [ -e "$WORKDIR"/bin ]; then + if ! [ -d "$WORKDIR"/bin ]; then die 'bin/ is not a directory' fi else die 'Directory does not contain bin/' fi -if ! test -e $WORKDIR/id; then +if ! [ -e "$WORKDIR"/id ]; then die 'id file not present' fi -if ls -1 $WORKDIR/bin; then - for f in $WORKDIR/bin/*; do - if ! test -x $f; then +if ls -1 "$WORKDIR"/bin; then + for f in "$WORKDIR"/bin/*; do + if ! [ -x "$f" ]; then die "$f is not executable" fi done @@ -86,60 +92,65 @@ else fi # Create necessary directories and files -mkdir -p $WORKDIR/lib -mkdir -p $WORKDIR/man -mkdir -p $WORKDIR/ext -touch $WORKDIR/env +mkdir -p "$WORKDIR"/lib +mkdir -p "$WORKDIR"/ext +mkdir -p "$WORKDIR"/man +touch "$WORKDIR"/env # TODO: add usage and error checking -DIRNAME="$WORKDIR"/"$(head -1 $WORKDIR/id | awk '{print $1}')" - -if test -s $LIBLIST; then - rm -f $LIBLIST +DIRNAME="$WORKDIR"/"$(head -1 "$WORKDIR"/id | awk '{print $1}')" + +echo "Fetching binary dependencies..." +if [ -s "$WORKDIR"/deps ]; then + while read -r d; do + ( IFS=: + for p in $PATH; do + find -L "$p" -maxdepth 2 -name "$d" -exec cp -n {} "$WORKDIR"/bin/ \; + done + ) + done < "$tmplist" fi echo "Fetching dependencies and stripping binaries..." # TODO: get al binary dependencies from deps file # Get all dependencies and strip them -for b in $WORKDIR/bin/*; do - getlibs $b - strip $b +for b in "$WORKDIR"/bin/*; do + getlibs "$b" + strip "$b" done echo "Stripping libraries..." -for l in $WORKDIR/lib/*; do - strip $l +for l in "$WORKDIR"/lib/*; do + strip "$l" done echo "Compressing destination directory..." -if test -d $DIRNAME; then - rm -rf $DIRNAME +if [ -d "$DIRNAME" ]; then + rm -rf "$DIRNAME" fi -mkdir -p $DIRNAME +mkdir -p "$DIRNAME" -cp -r $WORKDIR/bin $DIRNAME/ -cp -r $WORKDIR/lib $DIRNAME/ -cp -r $WORKDIR/man $DIRNAME/ -cp -r $WORKDIR/ext $DIRNAME/ -cp $WORKDIR/env $DIRNAME/ -cp $WORKDIR/id $DIRNAME/ +cp -r "$WORKDIR"/bin "$DIRNAME"/ +cp -r "$WORKDIR"/lib "$DIRNAME"/ +cp -r "$WORKDIR"/man "$DIRNAME"/ +cp -r "$WORKDIR"/ext "$DIRNAME"/ +cp "$WORKDIR"/env "$DIRNAME"/ +cp "$WORKDIR"/id "$DIRNAME"/ -tar -c -f $DIRNAME.tar -C $WORKDIR "$(basename $DIRNAME)" -md5sum -b $DIRNAME.tar | cut -d " " -f1 > $SUMFILE -lz4 --rm -9 -c $DIRNAME.tar > "$DIRNAME".tar.lz4 +tar -c -f "$DIRNAME".tar -C "$WORKDIR" "$(basename "$DIRNAME")" +md5sum -b "$DIRNAME".tar | cut -d " " -f1 > "$SUMFILE" +lz4 --rm -9 -c "$DIRNAME.tar" > "$DIRNAME".tar.lz4 echo "Injecting payload..." -cat "$PRELOAD_SCRIPT" | -sed s/SUM/"$(cat $SUMFILE)"/ | +sed s/SUM/"$(cat "$SUMFILE")"/ "$PRELOAD_SCRIPT" | sed s/ID/"$(basename "$DIRNAME")"/ | awk '!/^ *#/ && NF' > tpp size="$(wc -c tpp | cut -d " " -f1)" strsize="$(echo "BYTES" | wc -c)" numsize="$(echo "$size" | wc -c)" -normsize="$(expr "$size" - "$(expr "$strsize" - "$numsize")")" +normsize="$((size - (strsize - numsize)))" -cat tpp | -sed s/BYTES/"$normsize"/ > tpr +sed s/BYTES/"$normsize"/ tpp > tpr cat tpr "$DIRNAME".tar.lz4 > "$DIRNAME".ti echo "Cleaning up..."