57 lines
1.3 KiB
JavaScript
57 lines
1.3 KiB
JavaScript
import { spawn } from "child_process";
|
|
import fs from "fs";
|
|
|
|
import { v4 as getUUID } from "uuid";
|
|
|
|
import { langs } from "./langs";
|
|
import { MIN_UID, MAX_UID, borrowUser, ignoreUsers } from "./users";
|
|
import {
|
|
privilegedSetup,
|
|
privilegedSpawn,
|
|
privilegedTeardown,
|
|
run,
|
|
} from "./util";
|
|
|
|
function die(msg) {
|
|
console.error(msg);
|
|
process.exit(1);
|
|
}
|
|
|
|
function log(msg) {
|
|
console.log(msg);
|
|
}
|
|
|
|
async function main() {
|
|
const dirs = await new Promise((resolve, reject) =>
|
|
fs.readdir("/tmp/riju", (err, dirs) => (err ? reject(err) : resolve(dirs)))
|
|
);
|
|
const uids = (
|
|
await Promise.all(
|
|
dirs.map(
|
|
(dir) =>
|
|
new Promise((resolve, reject) =>
|
|
fs.stat(`/tmp/riju/${dir}`, (err, stat) =>
|
|
err ? reject(err) : resolve(stat.uid)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
).filter((uid) => uid >= MIN_UID && uid < MAX_UID);
|
|
await ignoreUsers(uids, log);
|
|
const uuid = getUUID();
|
|
const { uid, returnUID } = await borrowUser(log);
|
|
await run(privilegedSetup({ uid, uuid }), log);
|
|
const args = privilegedSpawn({ uid, uuid }, ["bash"]);
|
|
const proc = spawn(args[0], args.slice(1), {
|
|
stdio: "inherit",
|
|
});
|
|
await new Promise((resolve, reject) => {
|
|
proc.on("error", reject);
|
|
proc.on("close", resolve);
|
|
});
|
|
await run(privilegedTeardown({ uid, uuid }), log);
|
|
await returnUID();
|
|
}
|
|
|
|
main().catch(die);
|