125 lines
2.6 KiB
Bash
Executable File
125 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
umask 077
|
|
|
|
ROOT="${FBTERM_ROOT:?FBTERM_ROOT no definido}"
|
|
|
|
# R2: mientras fbterm-run esta activo, el pane no esta disponible.
|
|
rm -f "$ROOT/prompt.ready"
|
|
JOB_ID="${1:-}"
|
|
|
|
case "$JOB_ID" in
|
|
''|*[!A-Za-z0-9._-]*)
|
|
printf 'FBTERM_ERROR=INVALID_JOB_ID\n' >&2
|
|
exit 64
|
|
;;
|
|
esac
|
|
|
|
JOB="$ROOT/jobs/$JOB_ID"
|
|
CMD="$JOB/command.bash"
|
|
TIMEOUT_FILE="$JOB/timeout.seconds"
|
|
|
|
if [ ! -f "$CMD" ]; then
|
|
printf 'FBTERM_ERROR=COMMAND_NOT_FOUND JOB_ID=%s\n' "$JOB_ID" >&2
|
|
exit 66
|
|
fi
|
|
|
|
TIMEOUT_S='120'
|
|
|
|
if [ -f "$TIMEOUT_FILE" ]; then
|
|
VALUE="$(cat "$TIMEOUT_FILE" 2>/dev/null || true)"
|
|
case "$VALUE" in
|
|
''|*[!0-9]*)
|
|
;;
|
|
*)
|
|
if [ "$VALUE" -ge 1 ] 2>/dev/null &&
|
|
[ "$VALUE" -le 3600 ] 2>/dev/null
|
|
then
|
|
TIMEOUT_S="$VALUE"
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
OUT_FIFO="$JOB/stdout.fifo"
|
|
ERR_FIFO="$JOB/stderr.fifo"
|
|
|
|
STDOUT="$JOB/stdout.bin"
|
|
STDERR="$JOB/stderr.bin"
|
|
|
|
rm -f "$OUT_FIFO" "$ERR_FIFO"
|
|
|
|
mkfifo "$OUT_FIFO" "$ERR_FIFO"
|
|
|
|
: > "$STDOUT"
|
|
: > "$STDERR"
|
|
|
|
date -Ins > "$JOB/started.at"
|
|
|
|
sha256sum "$CMD" |
|
|
awk '{print $1}' > "$JOB/command.sha256"
|
|
|
|
tee "$STDOUT" < "$OUT_FIFO" &
|
|
OUT_TEE_PID=$!
|
|
|
|
tee "$STDERR" < "$ERR_FIFO" >&2 &
|
|
ERR_TEE_PID=$!
|
|
|
|
/usr/bin/timeout \
|
|
--signal=TERM \
|
|
--kill-after=2s \
|
|
"${TIMEOUT_S}s" \
|
|
bash --noprofile --norc "$CMD" \
|
|
> "$OUT_FIFO" \
|
|
2> "$ERR_FIFO"
|
|
|
|
RC=$?
|
|
|
|
wait "$OUT_TEE_PID"
|
|
OUT_TEE_RC=$?
|
|
|
|
wait "$ERR_TEE_PID"
|
|
ERR_TEE_RC=$?
|
|
|
|
printf '%s\n' "$RC" > "$JOB/exit.code"
|
|
printf '%s\n' "$OUT_TEE_RC" > "$JOB/stdout-tee.exit"
|
|
printf '%s\n' "$ERR_TEE_RC" > "$JOB/stderr-tee.exit"
|
|
|
|
sha256sum "$STDOUT" |
|
|
awk '{print $1}' > "$JOB/stdout.sha256"
|
|
|
|
sha256sum "$STDERR" |
|
|
awk '{print $1}' > "$JOB/stderr.sha256"
|
|
|
|
stat -c '%s' "$STDOUT" > "$JOB/stdout.bytes"
|
|
stat -c '%s' "$STDERR" > "$JOB/stderr.bytes"
|
|
|
|
date -Ins > "$JOB/finished.at"
|
|
|
|
{
|
|
printf 'JOB_ID=%s\n' "$JOB_ID"
|
|
printf 'EXIT=%s\n' "$RC"
|
|
printf 'COMMAND_SHA256=%s\n' \
|
|
"$(cat "$JOB/command.sha256")"
|
|
printf 'STDOUT_SHA256=%s\n' \
|
|
"$(cat "$JOB/stdout.sha256")"
|
|
printf 'STDERR_SHA256=%s\n' \
|
|
"$(cat "$JOB/stderr.sha256")"
|
|
printf 'STDOUT_BYTES=%s\n' \
|
|
"$(cat "$JOB/stdout.bytes")"
|
|
printf 'STDERR_BYTES=%s\n' \
|
|
"$(cat "$JOB/stderr.bytes")"
|
|
printf 'STDOUT_TEE_EXIT=%s\n' "$OUT_TEE_RC"
|
|
printf 'STDERR_TEE_EXIT=%s\n' "$ERR_TEE_RC"
|
|
} > "$JOB/result.tmp"
|
|
|
|
mv "$JOB/result.tmp" "$JOB/result.env"
|
|
touch "$JOB/DONE"
|
|
|
|
rm -f "$OUT_FIFO" "$ERR_FIFO"
|
|
|
|
printf 'FBTERM_JOB_COMPLETE JOB_ID=%s EXIT=%s\n' \
|
|
"$JOB_ID" "$RC"
|
|
|
|
exit "$RC"
|