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