61 lines
2.0 KiB
Bash
Executable File
61 lines
2.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
umask 077
|
|
|
|
while read -t2 -r cmdline; do
|
|
cmd=(${cmdline})
|
|
for (( i=0; i<${#cmd[@]}; i++ )); do
|
|
arg="${cmd[$i]}"
|
|
|
|
arg="${arg}x"
|
|
arg="$(sed 's/+s/ /g' <<< "${arg}")"
|
|
arg="$(sed 's/+n/\n/g' <<< "${arg}")"
|
|
arg="$(sed 's/+t/\t/g' <<< "${arg}")"
|
|
arg="$(sed 's/+p/+/g' <<< "${arg}")"
|
|
arg="${arg%x}"
|
|
|
|
cmd[$i]="${arg}"
|
|
done
|
|
if (( "${#cmd[@]}" > 0 )); then
|
|
case "${cmd[0]}" in
|
|
ping) ;;
|
|
exec|pty)
|
|
if (( "${#cmd[@]}" < 3 )); then
|
|
echo >&2 "usage: (exec|pty) UUID ARG..."
|
|
else
|
|
if [[ "${cmd[0]}" == pty ]]; then
|
|
maybe_pty=/var/cache/riju/share/riju-pty
|
|
else
|
|
maybe_pty=
|
|
fi
|
|
uuid="${cmd[1]}"
|
|
args=("${cmd[@]:2}")
|
|
stdin="/var/cache/riju/share/cmd-${uuid}-stdin"
|
|
stdout="/var/cache/riju/share/cmd-${uuid}-stdout"
|
|
stderr="/var/cache/riju/share/cmd-${uuid}-stderr"
|
|
status="/var/cache/riju/share/cmd-${uuid}-status"
|
|
live="/var/cache/riju/share/cmd-${uuid}-live"
|
|
mkfifo "${stdin}" "${stdout}" "${stderr}" "${status}" "${live}"
|
|
(
|
|
set +e
|
|
(
|
|
runuser -u riju -- bash -c "exec ${maybe_pty:-} \"\$@\"" -- "${args[@]}" < "${stdin}" > "${stdout}" 2> "${stderr}"
|
|
echo "$?"
|
|
) > "${status}"
|
|
) &
|
|
bg=$!
|
|
while kill -0 "$bg" 2>/dev/null; do
|
|
sleep 1
|
|
echo "ping" 2>/dev/null || break
|
|
done > "${live}" &
|
|
fi
|
|
;;
|
|
*)
|
|
echo >&2 "unrecognized command: ${cmd[0]}"
|
|
;;
|
|
esac
|
|
fi
|
|
done < /var/cache/riju/share/control
|