69 lines
1.6 KiB
Bash
Executable File
69 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
dir="$( cd "$( dirname "$0" )" && pwd )"
|
|
|
|
touch $dir/lockfile
|
|
|
|
if [ -z "$1" ] || [ -z "$2" ]; then
|
|
echo "invalid args"
|
|
exit
|
|
fi
|
|
|
|
lang=$1
|
|
epoch=$(date +%s%N)
|
|
basepath="/var/lib/lxc/piston/rootfs"
|
|
filepath="/tmp/$epoch/code.code"
|
|
argpath="/tmp/$epoch/args.args"
|
|
stdinpath="/tmp/$epoch/stdin.stdin"
|
|
arg=$(basename $argpath)
|
|
|
|
# write arg file
|
|
mkdir -p $basepath/tmp/$epoch
|
|
chmod 777 $basepath/tmp/$epoch
|
|
cat $2 > $basepath$filepath
|
|
echo $3 > $basepath$stdinpath
|
|
echo -n "${@:4}" > $basepath$argpath
|
|
|
|
# process incrementor
|
|
exec 200>$dir/lockfile
|
|
flock -x 200
|
|
oldinc=$(cat $dir/i | awk '{$1=$1};1')
|
|
newinc=$(expr $oldinc + 1)
|
|
|
|
if (( newinc >= 151 )); then
|
|
newinc=1
|
|
echo 1 > $dir/i
|
|
else
|
|
echo $newinc > $dir/i
|
|
fi
|
|
exec 200>&-
|
|
|
|
# prevent users from spying on each other
|
|
lxc-attach --clear-env -n piston -- \
|
|
/bin/bash -l -c "
|
|
chown runner$newinc: -R /tmp/$epoch
|
|
chmod 700 /tmp/$epoch
|
|
" > /dev/null 2>&1
|
|
|
|
# runner
|
|
timeout -s KILL 20 \
|
|
lxc-attach --clear-env -n piston -- \
|
|
/bin/bash -l -c "runuser runner$newinc /exec/$lang $newinc $epoch"
|
|
|
|
# process janitor
|
|
lxc-attach --clear-env -n piston -- \
|
|
/bin/bash -l -c "
|
|
for i in {1..100}
|
|
do
|
|
pkill -u runner$newinc --signal SIGKILL
|
|
done
|
|
|
|
find /tmp -user runner$newinc -delete
|
|
find /var/tmp -user runner$newinc -delete
|
|
find /var/lock -user runner$newinc -delete
|
|
find /dev/shm -user runner$newinc -delete
|
|
find /run/lock -user runner$newinc -delete
|
|
" > /dev/null 2>&1 &
|
|
|
|
rm -rf $basepath/tmp/$epoch
|