Init
This commit is contained in:
parent
f8132f2ffd
commit
10ffad73cd
|
@ -0,0 +1,208 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
IMAGE=""
|
||||||
|
OUTPUT=""
|
||||||
|
|
||||||
|
for flag in "$@"; do
|
||||||
|
case $flag in
|
||||||
|
--output)
|
||||||
|
shift
|
||||||
|
OUTPUT="$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--image)
|
||||||
|
shift
|
||||||
|
IMAGE="$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$IMAGE" ]; then echo Please specify --image; exit 1; fi
|
||||||
|
if [ -z "$OUTPUT" ]; then echo Please specify --output; exit 1; fi
|
||||||
|
|
||||||
|
if test -v WORKDIR; then
|
||||||
|
if [ -d "$WORKDIR" ]; then
|
||||||
|
echo [*] WORKDIR $WORKDIR
|
||||||
|
OUTPUT="$WORKDIR/$OUTPUT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$OUTPUT" ]; then echo File $OUTPUT already exists.; exit 1; fi
|
||||||
|
|
||||||
|
echo [*] Binarifing $IMAGE...
|
||||||
|
|
||||||
|
TMP=$(mktemp -d)
|
||||||
|
|
||||||
|
echo [*] Pulling OCI Image..
|
||||||
|
skopeo copy $IMAGE oci:$TMP/image:latest;
|
||||||
|
|
||||||
|
##
|
||||||
|
|
||||||
|
echo [*] Unpacking OCI Image...
|
||||||
|
./umoci unpack --rootless --image $TMP/image:latest $TMP/bundle
|
||||||
|
|
||||||
|
echo [*] Tarballing OCI Bundle..
|
||||||
|
tar -c -C $TMP -f $TMP/bundle.tar ./bundle;
|
||||||
|
|
||||||
|
cat << 'EOF' > $TMP/init.sh
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo [*] Working at \"$(pwd)\"
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
echo [*] Extracting OCI bundle...
|
||||||
|
tar xf bundle.tar
|
||||||
|
|
||||||
|
echo [*] Modifing config.json...
|
||||||
|
|
||||||
|
CONFIG_FILE="./bundle/config.json"
|
||||||
|
TEMP_FILE="temp_config.$$"
|
||||||
|
MOUNTS_ARGS=()
|
||||||
|
ENV_VARS=()
|
||||||
|
CMD_ARGS=()
|
||||||
|
IN_CMD_ARGS=false
|
||||||
|
|
||||||
|
for arg in "$@"; do
|
||||||
|
if [ "$IN_CMD_ARGS" = false ]; then
|
||||||
|
case "$arg" in
|
||||||
|
--mount)
|
||||||
|
IN_MOUNT=true
|
||||||
|
;;
|
||||||
|
--env)
|
||||||
|
IN_ENV=true
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
IN_CMD_ARGS=true
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [ "$IN_MOUNT" = true ]; then
|
||||||
|
MOUNTS_ARGS+=("$arg")
|
||||||
|
IN_MOUNT=false
|
||||||
|
elif [ "$IN_ENV" = true ]; then
|
||||||
|
ENV_VARS+=("$arg")
|
||||||
|
IN_ENV=false
|
||||||
|
else
|
||||||
|
echo "** Non flag argument found. Anything after this will be passed to container."
|
||||||
|
IN_CMD_ARGS=true
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
CMD_ARGS+=("$arg")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for mount in "${MOUNTS_ARGS[@]}"; do
|
||||||
|
src=$(echo "$mount" | cut -d: -f1)
|
||||||
|
dst=$(echo "$mount" | cut -d: -f2 | cut -d: -f1)
|
||||||
|
opts=$(echo "$mount" | grep -oE ':[^:]+$' | cut -d: -f2)
|
||||||
|
|
||||||
|
if [[ "$opts" == "ro" ]]; then
|
||||||
|
mountOpts=("ro")
|
||||||
|
else
|
||||||
|
mountOpts=("rbind" "rw")
|
||||||
|
fi
|
||||||
|
|
||||||
|
mountOptsJson=$(printf '%s\n' "${mountOpts[@]}" | ./jq -R . | ./jq -s .)
|
||||||
|
|
||||||
|
./jq --arg dst "$dst" --arg src "$src" --argjson opts "$mountOptsJson" \
|
||||||
|
'.mounts += [{"destination": $dst, "type": "bind", "source": $src, "options": $opts}]' \
|
||||||
|
"$CONFIG_FILE" > "$TEMP_FILE" && mv "$TEMP_FILE" "$CONFIG_FILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
for env_var in "${ENV_VARS[@]}"; do
|
||||||
|
./jq --arg env_var "$env_var" '.process.env += [$env_var]' \
|
||||||
|
"$CONFIG_FILE" > "$TEMP_FILE" && mv "$TEMP_FILE" "$CONFIG_FILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${#CMD_ARGS[@]} -gt 0 ]; then
|
||||||
|
for cmd_arg in "${CMD_ARGS[@]}"; do
|
||||||
|
./jq --arg cmd_arg "$cmd_arg" '.process.args += [$cmd_arg]' \
|
||||||
|
"$CONFIG_FILE" > "$TEMP_FILE" && mv "$TEMP_FILE" "$CONFIG_FILE"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo [*] Running crun...
|
||||||
|
A=$(basename $(realpath .))
|
||||||
|
./crun run -b bundle ${A#*.}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo [*] Creating Self-Extracting Binary...
|
||||||
|
init="$TMP/init.sh"
|
||||||
|
files=("$TMP/bundle.tar" "./jq" "./umoci" "./crun")
|
||||||
|
out="$TMP/output.sh"
|
||||||
|
|
||||||
|
# echo [*] Tarballing OCI Image..
|
||||||
|
# tar -c -C $TMP -f $TMP/image.tar ./image;
|
||||||
|
|
||||||
|
# cat << 'EOF' > $TMP/init.sh
|
||||||
|
# #!/bin/bash
|
||||||
|
|
||||||
|
# echo [*] Working at \"$(pwd)\"
|
||||||
|
# cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
# echo [*] Extracting OCI Image...
|
||||||
|
# ./busybox tar xf image.tar
|
||||||
|
|
||||||
|
# echo [*] Unpacking OCI Image...
|
||||||
|
# ./busybox sh -c "./umoci unpack --rootless --image image:latest bundle"
|
||||||
|
|
||||||
|
# echo [*] Running crun...
|
||||||
|
# A=$(basename $(realpath .))
|
||||||
|
# ./busybox sh -c "./crun run -b bundle ${A#*.}"
|
||||||
|
# ./busybox sh
|
||||||
|
# EOF
|
||||||
|
|
||||||
|
# echo [*] Creating Self-Extracting Binary...
|
||||||
|
# init="$TMP/init.sh"
|
||||||
|
# files=("$TMP/image.tar" "./busybox" "./umoci" "./crun")
|
||||||
|
# out="$TMP/output.sh"
|
||||||
|
|
||||||
|
cat << EOF > ${out}
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
PAYLOADSTART=__PAYLOADSTART__
|
||||||
|
|
||||||
|
TEMP_DIR=\$(mktemp -d)
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
rm -rf "\$TEMP_DIR"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
tail -n +\$PAYLOADSTART "\$0" | tar x -C "\$TEMP_DIR"
|
||||||
|
|
||||||
|
chmod +x "\$TEMP_DIR/$(basename ${init})"
|
||||||
|
|
||||||
|
WORKDIR="\$(pwd)"
|
||||||
|
|
||||||
|
cd \$TEMP_DIR
|
||||||
|
|
||||||
|
WORKDIR=\"$WORKDIR\" EXTRACTED="\$TEMP_DIR" "\$TEMP_DIR/$(basename ${init})" "\$@"
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "## DATA ##" >> ${out}
|
||||||
|
|
||||||
|
tmptar=$(mktemp)
|
||||||
|
tar cf "$tmptar" -C "$(dirname $init)" "$(basename $init)"
|
||||||
|
for file in "${files[@]}"; do
|
||||||
|
tar rf "$tmptar" -C "$(dirname $file)" "$(basename $file)"
|
||||||
|
done
|
||||||
|
|
||||||
|
for i in $(tar tf $tmptar); do echo [*] - $i; done
|
||||||
|
|
||||||
|
cat $tmptar >> "$out"
|
||||||
|
payload_line=$(grep -n '^## DATA ##' -oa ${out} | cut -d: -f1)
|
||||||
|
payload_line=$((payload_line + 1))
|
||||||
|
|
||||||
|
sed -i "s/PAYLOADSTART=__PAYLOADSTART__/PAYLOADSTART=${payload_line}/" ${out}
|
||||||
|
|
||||||
|
cat "$out" > "$OUTPUT";
|
||||||
|
chmod +x "$OUTPUT";
|
||||||
|
|
||||||
|
echo [*] Successfully binarified to $OUTPUT
|
|
@ -0,0 +1,57 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ $# -lt 2 ]; then
|
||||||
|
echo "Usage: $0 <init> <files...>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
out=$(mktemp)
|
||||||
|
init="$1"
|
||||||
|
shift
|
||||||
|
files=("$@")
|
||||||
|
|
||||||
|
cat > ${out} << EOF
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
PAYLOAD_LINE=__PAYLOAD_LINE__
|
||||||
|
|
||||||
|
TEMP_DIR=\$(mktemp -d)
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
rm -rf "\$TEMP_DIR"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
tail -n +\$PAYLOAD_LINE "\$0" | tar x -C "\$TEMP_DIR"
|
||||||
|
|
||||||
|
chmod +x "\$TEMP_DIR/${init}"
|
||||||
|
|
||||||
|
WORKDIR="\$(pwd)"
|
||||||
|
|
||||||
|
cd \$TEMP_DIR
|
||||||
|
|
||||||
|
WORKDIR="\$WORKDIR" EXTRACTED="\$TEMP_DIR" "\$TEMP_DIR/${init}" "\$@"
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "## DATA ##" >> ${out}
|
||||||
|
|
||||||
|
tmptar=$(mktemp)
|
||||||
|
tar cf "$tmptar" -C "$(dirname $init)" "$(basename $init)"
|
||||||
|
for file in "${files[@]}"; do
|
||||||
|
tar rf "$tmptar" -C "$(dirname $file)" "$(basename $file)"
|
||||||
|
done
|
||||||
|
echo "makebin init: $(basename $init), files: (" $(tar tf $tmptar) ")";
|
||||||
|
echo;
|
||||||
|
cat "$tmptar" >> "$out"
|
||||||
|
rm "$tmptar"
|
||||||
|
|
||||||
|
payload_line=$(grep -n '^## DATA ##' -oa ${out} | cut -d: -f1)
|
||||||
|
payload_line=$((payload_line + 1))
|
||||||
|
|
||||||
|
sed -i "s/PAYLOAD_LINE=__PAYLOAD_LINE__/PAYLOAD_LINE=${payload_line}/" ${out}
|
||||||
|
|
||||||
|
cat ${out} > mybinary;
|
||||||
|
chmod +x mybinary;
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue