piston/lxc/execute

95 lines
1.5 KiB
Bash
Executable File

#!/usr/bin/env bash
dir="$( cd "$( dirname "$0" )" && pwd )"
if [ -z "$1" ]; then
echo "invalid args"
exit
fi
if [ -z "$2" ]; then
echo "invalid args"
exit
fi
lang=$1
epoch=$(date +%s%3N)
basepath="/var/lib/lxc/piston/rootfs"
filepath="/tmp/$epoch/code.code"
argpath="/tmp/$epoch/args.args"
arg=$(basename $argpath)
# write arg file
mkdir -p $basepath/tmp/$epoch
chmod 777 $basepath/tmp/$epoch
cat $2 > $basepath$filepath
echo "${@:3}" > $basepath$argpath
# process incrementor
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
bin=
case "$lang" in
"python2")
bin=python2
;;
"python" | "python3")
bin=python3
;;
"ruby")
bin=ruby
;;
"javascript" | "js" | "node")
bin=node
;;
"c")
bin=c
;;
"cpp" | "c++")
bin=cpp
;;
"go")
bin=go
;;
"c#" | "csharp" | "cs")
bin=csharp
;;
"r")
bin=r
;;
"php")
bin=php
;;
"nasm" | "asm")
bin=nasm
;;
"java")
bin=java
;;
*)
echo "invalid language"
exit
esac
# runner
lxc-attach -n piston -- \
/bin/bash -c "\
PATH=/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin \
bash /exec/$bin $newinc $epoch 2>&1 | head -c 65536"
# process janitor
lxc-attach -n piston -- \
/bin/bash -c "\
for i in {1..100}; do pkill -u runner$newinc --signal SIGKILL; done ;\
find /tmp/* -user runner$newinc -exec /bin/rm -rf {} \;\
"
rm -rf $basepath/tmp/$epoch