#!/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..2000}; do pkill -u runner$newinc --signal SIGKILL; done" > /dev/null 2>&1 & rm -rf $basepath/tmp/$epoch