Compare commits
13 Commits
160832fb93
...
7d90cddf27
Author | SHA1 | Date |
---|---|---|
Thomas Hobson | 7d90cddf27 | |
Omar Brikaa | 989ea52bfa | |
Thomas Hobson | 7c6148c8d1 | |
Thomas Hobson | b6629b3354 | |
Thomas Hobson | c6a7ccc77c | |
Thomas Hobson | 8165770cfd | |
Thomas Hobson | 874cc815e9 | |
Thomas Hobson | 9e81d2ff67 | |
Thomas Hobson | 1b6563d181 | |
Brikaa | 5cdc71d268 | |
Brikaa | e5ac7a2acc | |
Brikaa | 474c986879 | |
Brikaa | 56a3c91a6a |
|
@ -146,7 +146,7 @@ router.ws('/connect', async (ws, req) => {
|
|||
eventBus.on("exit", (stage, status) => ws.send(JSON.stringify({type: "exit", stage, ...status})))
|
||||
|
||||
ws.on("message", async (data) => {
|
||||
|
||||
|
||||
try{
|
||||
const msg = JSON.parse(data);
|
||||
|
||||
|
@ -194,7 +194,7 @@ router.ws('/connect', async (ws, req) => {
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}catch(error){
|
||||
ws.send(JSON.stringify({type: "error", message: error.message}))
|
||||
ws.close(4002, "Notified Error")
|
||||
|
|
|
@ -146,26 +146,31 @@ class Job {
|
|||
|
||||
|
||||
const kill_timeout = set_timeout(
|
||||
_ => proc.kill('SIGKILL'),
|
||||
async _ => {
|
||||
logger.info(`Timeout exceeded timeout=${timeout} uuid=${this.uuid}`)
|
||||
process.kill(proc.pid, 'SIGKILL')
|
||||
},
|
||||
timeout
|
||||
);
|
||||
|
||||
proc.stderr.on('data', data => {
|
||||
proc.stderr.on('data', async data => {
|
||||
if(eventBus !== null) {
|
||||
eventBus.emit("stderr", data);
|
||||
} else if (stderr.length > config.output_max_size) {
|
||||
proc.kill('SIGKILL');
|
||||
logger.info(`stderr length exceeded uuid=${this.uuid}`)
|
||||
process.kill(proc.pid, 'SIGKILL')
|
||||
} else {
|
||||
stderr += data;
|
||||
output += data;
|
||||
}
|
||||
});
|
||||
|
||||
proc.stdout.on('data', data => {
|
||||
proc.stdout.on('data', async data => {
|
||||
if(eventBus !== null){
|
||||
eventBus.emit("stdout", data);
|
||||
} else if (stdout.length > config.output_max_size) {
|
||||
proc.kill('SIGKILL');
|
||||
logger.info(`stdout length exceeded uuid=${this.uuid}`)
|
||||
process.kill(proc.pid, 'SIGKILL')
|
||||
} else {
|
||||
stdout += data;
|
||||
output += data;
|
||||
|
@ -179,6 +184,7 @@ class Job {
|
|||
proc.stdout.destroy();
|
||||
|
||||
await this.cleanup_processes()
|
||||
logger.debug(`Finished exit cleanup uuid=${this.uuid}`)
|
||||
};
|
||||
|
||||
proc.on('exit', async (code, signal) => {
|
||||
|
@ -284,36 +290,47 @@ class Job {
|
|||
this.state = job_states.EXECUTED;
|
||||
}
|
||||
|
||||
async cleanup_processes() {
|
||||
async cleanup_processes(dont_wait = []) {
|
||||
let processes = [1];
|
||||
logger.debug(`Cleaning up processes uuid=${this.uuid}`)
|
||||
|
||||
while (processes.length > 0) {
|
||||
processes = await new Promise((resolve, reject) =>
|
||||
cp.execFile('ps', ['awwxo', 'pid,ruid'], (err, stdout) => {
|
||||
if (err === null) {
|
||||
const lines = stdout.split('\n').slice(1); //Remove header with slice
|
||||
const procs = lines.map(line => {
|
||||
const [pid, ruid] = line
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.map(n => parseInt(n));
|
||||
processes = []
|
||||
|
||||
return { pid, ruid };
|
||||
});
|
||||
|
||||
resolve(procs);
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
})
|
||||
);
|
||||
const proc_ids = await fs.readdir("/proc");
|
||||
|
||||
|
||||
processes = await Promise.all(proc_ids.map(async (proc_id) => {
|
||||
if(isNaN(proc_id)) return -1;
|
||||
try{
|
||||
const proc_status = await fs.read_file(path.join("/proc",proc_id,"status"));
|
||||
const proc_lines = proc_status.to_string().split("\n")
|
||||
const uid_line = proc_lines.find(line=>line.starts_with("Uid:"))
|
||||
const [_, ruid, euid, suid, fuid] = uid_line.split(/\s+/);
|
||||
|
||||
|
||||
if(ruid == this.uid || euid == this.uid)
|
||||
return parse_int(proc_id)
|
||||
|
||||
}catch{
|
||||
return -1
|
||||
}
|
||||
|
||||
return -1
|
||||
}))
|
||||
|
||||
processes = processes.filter(p => p > 0)
|
||||
|
||||
if(processes.length > 0)
|
||||
logger.debug(`Got processes to kill: ${processes} uuid=${this.uuid}`)
|
||||
|
||||
|
||||
processes = processes.filter(proc => proc.ruid === this.uid);
|
||||
|
||||
for (const proc of processes) {
|
||||
// First stop the processes, but keep their resources allocated so they cant re-fork
|
||||
try {
|
||||
process.kill(proc.pid, 'SIGSTOP');
|
||||
process.kill(proc, 'SIGSTOP');
|
||||
} catch {
|
||||
// Could already be dead
|
||||
}
|
||||
|
@ -322,14 +339,17 @@ class Job {
|
|||
for (const proc of processes) {
|
||||
// Then clear them out of the process tree
|
||||
try {
|
||||
process.kill(proc.pid, 'SIGKILL');
|
||||
process.kill(proc, 'SIGKILL');
|
||||
} catch {
|
||||
// Could already be dead and just needs to be waited on
|
||||
}
|
||||
|
||||
wait_pid(proc.pid);
|
||||
if(!dont_wait.includes(proc))
|
||||
wait_pid(proc);
|
||||
}
|
||||
}
|
||||
|
||||
logger.debug(`Cleaned up processes uuid=${this.uuid}`)
|
||||
}
|
||||
|
||||
async cleanup_filesystem() {
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "piston-cli",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "piston-cli",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"axios": "^0.21.2",
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
## Naming Languages
|
||||
|
||||
Languages should be named after their interpreters, and the command line binaries you call.
|
||||
Languages should be named after their interpreters, and the command line binaries you call. The language version should use semantic versioning.
|
||||
For example, the full name of the standard python interpreter is `CPython`, however we would name it `python`, after the main binary which it provides.
|
||||
In the example of NodeJS, we would call this `node`, after the main binary.
|
||||
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
#!/bin/bash
|
||||
|
||||
PREFIX=$(realpath $(dirname $0))
|
||||
|
||||
mkdir -p build/iverilog
|
||||
cd build/iverilog
|
||||
curl -L https://github.com/steveicarus/iverilog/archive/refs/tags/v11_0.tar.gz -o iverilog.tar.gz
|
||||
tar xzf iverilog.tar.gz --strip-components=1
|
||||
|
||||
chmod +x ./autoconf.sh
|
||||
./autoconf.sh
|
||||
./configure --prefix="$PREFIX"
|
||||
make -j$(nproc)
|
||||
make install -j$(nproc)
|
||||
|
||||
cd ../../
|
||||
rm -rf build
|
|
@ -0,0 +1,4 @@
|
|||
#!/bin/bash
|
||||
|
||||
rename 's/$/\.v/' "$@" # Add .v extension
|
||||
iverilog *.v
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/bash
|
||||
export PATH=$PWD/bin:$PATH
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"language": "iverilog",
|
||||
"version": "11.0.0",
|
||||
"aliases": ["verilog", "vvp"]
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
#!/bin/bash
|
||||
|
||||
shift
|
||||
vvp a.out "$@"
|
|
@ -0,0 +1,7 @@
|
|||
module hello;
|
||||
initial
|
||||
begin
|
||||
$display("OK");
|
||||
$finish ;
|
||||
end
|
||||
endmodule
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
PREFIX=$(realpath $(dirname $0))
|
||||
|
||||
curl https://www.sqlite.org/2021/sqlite-amalgamation-3360000.zip -o sqlite.zip
|
||||
unzip -q sqlite.zip
|
||||
rm -rf sqlite.zip
|
||||
|
||||
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION sqlite-amalgamation-3360000/shell.c sqlite-amalgamation-3360000/sqlite3.c -o sqlite3
|
||||
|
||||
rm -rf sqlite-amalgamation-3360000
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/bash
|
||||
export PATH=$PWD:$PATH
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"language": "sqlite3",
|
||||
"version": "3.36.0",
|
||||
"aliases": ["sqlite", "sql"]
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
|
||||
sqlite3 < "$1"
|
|
@ -0,0 +1 @@
|
|||
SELECT 'OK';
|
6
piston
6
piston
|
@ -19,6 +19,7 @@ case $1 in
|
|||
echo "Commands:"
|
||||
echo " select <environment> Select the environment"
|
||||
echo " docker_compose <args...> Interact directly with the docker-compose for the selected environment"
|
||||
echo " logs Show docker-compose logs"
|
||||
echo
|
||||
echo " start Starts piston"
|
||||
echo " stop Stops piston"
|
||||
|
@ -37,18 +38,19 @@ case $1 in
|
|||
echo " clean-repo Remove all packages from local repo"
|
||||
echo " build-pkg <package> <version> Build a package"
|
||||
echo " rebuild Build and restart the docker container"
|
||||
|
||||
|
||||
else
|
||||
|
||||
echo " Switch to developement environment for more info"
|
||||
echo " > piston select dev"
|
||||
|
||||
|
||||
fi
|
||||
;;
|
||||
|
||||
|
||||
select) echo "$2" > .piston_env ;;
|
||||
docker_compose) shift; docker_compose "$@";;
|
||||
logs) docker_compose logs -f ;;
|
||||
|
||||
restart) docker_compose restart ;;
|
||||
start) docker_compose up -d ;;
|
||||
|
|
|
@ -42,10 +42,10 @@
|
|||
<br>
|
||||
|
||||
# Notes About Hacktoberfest
|
||||
|
||||
|
||||
While we are accepting pull requests for Hacktoberfest, we will reject any low-quality PRs.
|
||||
If we see PR abuse for Hacktoberfest, we will stop providing Hacktoberfest approval for pull requests.
|
||||
|
||||
|
||||
We are accepting PRs for:
|
||||
* Packages - updating package versions, adding new packages
|
||||
* Documentation updates
|
||||
|
@ -343,6 +343,7 @@ Content-Type: application/json
|
|||
`golfscript`,
|
||||
`groovy`,
|
||||
`haskell`,
|
||||
`iverilog`,
|
||||
`java`,
|
||||
`javascript`,
|
||||
`jelly`,
|
||||
|
@ -374,6 +375,7 @@ Content-Type: application/json
|
|||
`ruby`,
|
||||
`rust`,
|
||||
`scala`,
|
||||
`sqlite3`,
|
||||
`swift`,
|
||||
`typescript`,
|
||||
`basic`,
|
||||
|
|
|
@ -9,7 +9,7 @@ RUN apt-get update && apt-get install -y unzip autoconf build-essential libssl-d
|
|||
libncursesw5-dev python3-pip libgmp-dev libmpfr-dev python2 libffi-dev gfortran\
|
||||
libreadline-dev libblas-dev liblapack-dev libpcre3-dev libarpack2-dev libfftw3-dev \
|
||||
libglpk-dev libqhull-dev libqrupdate-dev libsuitesparse-dev libsundials-dev \
|
||||
libbz2-dev liblzma-dev libpcre2-dev && \
|
||||
libbz2-dev liblzma-dev libpcre2-dev gperf bison flex g++ && \
|
||||
ln -sf /bin/bash /bin/sh && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
update-alternatives --install /usr/bin/python python /usr/bin/python3.7 2
|
||||
|
|
Loading…
Reference in New Issue