Initial test version of binbox, a bash packer
This commit is contained in:
parent
8d298f94e5
commit
8d9d447533
1 changed files with 175 additions and 0 deletions
175
binbox
Executable file
175
binbox
Executable file
|
|
@ -0,0 +1,175 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# binbox: Creates a multi-binary script that self-contains the input scripts.
|
||||||
|
# Symlinking to the resulting binary with the name of one of the original scripts will trigger
|
||||||
|
# said script. The idea is similar to `busybox`.
|
||||||
|
|
||||||
|
DAISY_INTERNAL=1
|
||||||
|
. daisy.source
|
||||||
|
|
||||||
|
ARGS=$@
|
||||||
|
|
||||||
|
function help()
|
||||||
|
{
|
||||||
|
echo "$DAISY_BIN is a utility that allows you to generate busybox-style combined binaries."
|
||||||
|
echo "To access the original functionality of an input binary, you can either use a symlink or"
|
||||||
|
echo "call the function like so: 'combi-bin input-bin <input-bin args>."
|
||||||
|
echo ""
|
||||||
|
echo "> Usage:"
|
||||||
|
echo "Creating boxed binary: $DAISY_BIN -o <BOXED_BIN> <-s source files> <-p include files verbatim> -i INPUT_BINS ..."
|
||||||
|
echo "<X> Unpacking a boxed binary: $DAISY_BIN -e <BOXED_BIN>"
|
||||||
|
echo "View this screen: $DAISY_BIN <noargs>"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $@ == '' ]]; then
|
||||||
|
help
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define some building blocks
|
||||||
|
CASE_P1="case $BINARY in"
|
||||||
|
CASE_PM1=" $OPTION)"
|
||||||
|
CASE_PM2=" exec $OTPION_fn"
|
||||||
|
CASE_PM3=" ;;"
|
||||||
|
CASE_CM1=" *)"
|
||||||
|
CASE_CM2=" exec help_fn"
|
||||||
|
CASE_CM3=" ;;"
|
||||||
|
CASE_P2="esac"
|
||||||
|
|
||||||
|
FUNC_P1="function $OPTION_fn() {"
|
||||||
|
FUNC_P2=" exit($?)"
|
||||||
|
FUNC_P3="}"
|
||||||
|
|
||||||
|
BASIC_P1="BINARY=$0"
|
||||||
|
|
||||||
|
# Start parsing args
|
||||||
|
inputs=()
|
||||||
|
output=""
|
||||||
|
|
||||||
|
inputs=()
|
||||||
|
output=""
|
||||||
|
includes=()
|
||||||
|
sources=()
|
||||||
|
|
||||||
|
args=("$@")
|
||||||
|
i=0
|
||||||
|
b=0
|
||||||
|
s=0
|
||||||
|
p=0
|
||||||
|
while [ $i -lt $# ]; do
|
||||||
|
case "${args[$i]}" in
|
||||||
|
-i)
|
||||||
|
((i++))
|
||||||
|
while [ $i -lt $# ] && [[ ! "${args[$i]}" =~ ^- ]]; do
|
||||||
|
inputs+=("${args[$i]}")
|
||||||
|
((i++))
|
||||||
|
((b++))
|
||||||
|
done
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
-s)
|
||||||
|
((i++))
|
||||||
|
while [ $i -lt $# ] && [[ ! "${args[$i]}" =~ ^- ]]; do
|
||||||
|
sources+=("${args[$i]}")
|
||||||
|
((i++))
|
||||||
|
((s++))
|
||||||
|
done
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
-p)
|
||||||
|
((i++))
|
||||||
|
while [ $i -lt $# ] && [[ ! "${args[$i]}" =~ ^- ]]; do
|
||||||
|
includes+=("${args[$i]}")
|
||||||
|
((i++))
|
||||||
|
((p++))
|
||||||
|
done
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
-o)
|
||||||
|
((i++))
|
||||||
|
output="${args[$i]}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
((i++))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Input binaries: ${inputs[*]}"
|
||||||
|
echo "Include files: ${includes[*]}"
|
||||||
|
echo "Source files: ${sources[*]}"
|
||||||
|
echo "Output binary: $output"
|
||||||
|
|
||||||
|
if [ "$b" -eq 0 ]; then
|
||||||
|
echo "Missing input binaries!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$output" == "" ]]; then
|
||||||
|
echo "Missing output file!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
function add()
|
||||||
|
{
|
||||||
|
echo "$@" >> "$output"
|
||||||
|
}
|
||||||
|
|
||||||
|
rm -rf "$output"
|
||||||
|
|
||||||
|
# Now to construct the binary
|
||||||
|
# >>> Section 1, includes
|
||||||
|
add "#!/bin/bash"
|
||||||
|
add "# Multi-call binary generated by LACKADAISICAL binbox"
|
||||||
|
add "# $output information:"
|
||||||
|
add "# Contained modules: ${inputs[*]}"
|
||||||
|
add "# Files included verbatim: ${includes[*]}"
|
||||||
|
add "# Files sourced: ${sources[*]}"
|
||||||
|
add "# Symlink to this binary with the module name to invoke it, or"
|
||||||
|
add "# use '$output <func>' to do the same."
|
||||||
|
|
||||||
|
for f in "${sources[@]}"; do
|
||||||
|
add ". $f"
|
||||||
|
done
|
||||||
|
|
||||||
|
for f in "${includes[@]}"; do
|
||||||
|
add ""
|
||||||
|
add "# Included file $f"
|
||||||
|
add "$(cat "$f")"
|
||||||
|
done
|
||||||
|
|
||||||
|
add ""
|
||||||
|
add "if [[ \$# -eq 0 ]]; then"
|
||||||
|
add " echo 'Available modules:'"
|
||||||
|
for f in "${inputs[@]}"; do
|
||||||
|
add "echo '$f'"
|
||||||
|
done
|
||||||
|
add " exit 0"
|
||||||
|
add "fi"
|
||||||
|
|
||||||
|
|
||||||
|
# >>> Section 2: Modules
|
||||||
|
for f in "${inputs[@]}"; do
|
||||||
|
add "# Module '$f':"
|
||||||
|
add "function $f()"
|
||||||
|
add "{"
|
||||||
|
add "$(cat "$f" | grep -v "#!")"
|
||||||
|
add "}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# >>> Section 3: Module selection
|
||||||
|
add "SYMED=1"
|
||||||
|
add "BINSELF=\$(basename \$0 | rev | cut -d "/" -f 1 | rev)"
|
||||||
|
add "BOXFILE=$(basename \"$output\")"
|
||||||
|
add "if [[ \$BINSELF == \$BOXFILE ]]; then"
|
||||||
|
add " SYMED=0"
|
||||||
|
add "fi"
|
||||||
|
|
||||||
|
add "if [[ \$SYMED -eq 0 ]]; then"
|
||||||
|
add " eval \$@"
|
||||||
|
add " exit \$?"
|
||||||
|
add "fi"
|
||||||
|
|
||||||
|
add "if [[ \$SYMED -eq 1 ]]; then"
|
||||||
|
add " eval \$(basename \$0) \$@"
|
||||||
|
add "fi"
|
||||||
|
|
||||||
|
|
||||||
|
chmod +x "$output"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue