From 1c6cdfc6ffdac826a71cabfac31114c736fefb19 Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 28 Aug 2022 21:06:40 +0800 Subject: [PATCH] judge: update config loader --- packages/hydrojudge/package.json | 2 +- packages/hydrojudge/src/config.ts | 97 +++++++++++------------- packages/hydrojudge/src/hosts/builtin.ts | 5 +- 3 files changed, 46 insertions(+), 58 deletions(-) diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index f034e0776..1fd454113 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -12,8 +12,8 @@ "fs-extra": "^10.1.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", - "mongodb": "^3.7.3", "p-queue": "^7.3.0", + "schemastery": "^3.5.3", "shell-quote": "^1.7.3", "ws": "^8.8.1" }, diff --git a/packages/hydrojudge/src/config.ts b/packages/hydrojudge/src/config.ts index 564728377..676ee7332 100644 --- a/packages/hydrojudge/src/config.ts +++ b/packages/hydrojudge/src/config.ts @@ -3,63 +3,52 @@ import path from 'path'; import cac from 'cac'; import fs from 'fs-extra'; import yaml from 'js-yaml'; +import Schema from 'schemastery'; const argv = cac().parse(); -// eslint-disable-next-line @typescript-eslint/naming-convention -let CONFIG_FILE = path.resolve(os.homedir(), '.config', 'hydro', 'judge.yaml'); -const config = { - cache_dir: path.resolve(os.homedir(), '.cache', 'hydro', 'judge'), - tmp_dir: path.resolve(os.tmpdir(), 'hydro', 'judge'), - tmpfs_size: '256m', - stdio_size: '32m', - memoryMax: '512m', - strict_memory: false, - sandbox_host: 'http://localhost:5050', - testcases_max: 100, - total_time_limit: 60, - processLimit: 32, - parallelism: 2, - singleTaskParallelism: 2, - rerun: 0, - rate: 1, - config: null, - langs: null, - env: `\ -PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -HOME=/w`, - hosts: {}, - secret: String.random(32), -}; +const JudgeSettings = Schema.object({ + cache_dir: Schema.string().default(path.resolve(os.homedir(), '.cache', 'hydro', 'judge')), + tmp_dir: Schema.string().default(path.resolve(os.tmpdir(), 'hydro', 'judge')), + tmpfs_size: Schema.string().pattern(/^\d+[kmg]b?$/g).default('256m'), + stdio_size: Schema.string().pattern(/^\d+[kmg]b?$/g).default('32m'), + memoryMax: Schema.string().pattern(/^\d+[kmg]b?$/g).default('512m'), + strict_memory: Schema.boolean().default(false), + sandbox_host: Schema.string().role('link').default('http://localhost:5050'), + testcases_max: Schema.number().default(100), + total_time_limit: Schema.number().default(60), + processLimit: Schema.number().default(32), + parallelism: Schema.number().default(2), + singleTaskParallelism: Schema.number().default(2), + rerun: Schema.number().default(0), + rate: Schema.number().default(1), + env: Schema.string().default('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nHOME=/w'), + host: Schema.any(), + secret: Schema.string().default(String.random(32)), +}); -export function getConfig(key: keyof typeof config) { - return global.Hydro ? global.Hydro.model.system.get(`hydrojudge.${key}`) ?? config[key] : config[key]; -} +const config = global.Hydro + ? JudgeSettings({}) + : (() => { + const cfg = JudgeSettings({}); + const configFilePath = (process.env.CONFIG_FILE || argv.options.config) + ? path.resolve(process.env.CONFIG_FILE || argv.options.config) + : path.resolve(os.homedir(), '.config', 'hydro', 'judge.yaml'); -if (fs.existsSync(path.resolve(process.cwd(), '.env'))) { - const env = {}; - const f = fs.readFileSync('.env').toString(); - for (const line of f) { - const a = line.split('='); - env[a[0]] = a[1]; - } - Object.assign(process.env, env); -} + if (process.env.TEMP_DIR || argv.options.tmp) { + cfg.tmp_dir = path.resolve(process.env.TEMP_DIR || argv.options.tmp); + } + if (process.env.CACHE_DIR || argv.options.cache) { + cfg.cache_dir = path.resolve(process.env.CACHE_DIR || argv.options.cache); + } + if (process.env.EXECUTION_HOST || argv.options.sandbox) { + cfg.sandbox_host = path.resolve(process.env.EXECUTION_HOST || argv.options.sandbox); + } + const configFile = fs.readFileSync(configFilePath, 'utf-8'); + Object.assign(cfg, yaml.load(configFile) as any); + return JudgeSettings(cfg); + })(); -if (!global.Hydro) { - // standalone - if (process.env.CONFIG_FILE || argv.options.config) { - CONFIG_FILE = path.resolve(process.env.CONFIG_FILE || argv.options.config); - } - if (process.env.TEMP_DIR || argv.options.tmp) { - config.tmp_dir = path.resolve(process.env.TEMP_DIR || argv.options.tmp); - } - if (process.env.CACHE_DIR || argv.options.cache) { - config.cache_dir = path.resolve(process.env.CACHE_DIR || argv.options.cache); - } - if (process.env.EXECUTION_HOST || argv.options.sandbox) { - config.sandbox_host = path.resolve(process.env.EXECUTION_HOST || argv.options.sandbox); - } - const configFile = fs.readFileSync(CONFIG_FILE).toString(); - Object.assign(config, yaml.load(configFile) as any); -} +export const getConfig: (key: K) => typeof config[K] = global.Hydro + ? (key) => global.Hydro.model.system.get(`hydrojudge.${key}`) ?? config[key] + : (key) => config[key]; diff --git a/packages/hydrojudge/src/hosts/builtin.ts b/packages/hydrojudge/src/hosts/builtin.ts index 68b18292f..2201ab91c 100644 --- a/packages/hydrojudge/src/hosts/builtin.ts +++ b/packages/hydrojudge/src/hosts/builtin.ts @@ -2,7 +2,6 @@ /* eslint-disable no-await-in-loop */ import path from 'path'; import fs from 'fs-extra'; -import { ObjectID } from 'mongodb'; import type { JudgeResultBody } from 'hydrooj'; import { end, next } from 'hydrooj/src/handler/judge'; import { Logger } from 'hydrooj/src/logger'; @@ -28,7 +27,7 @@ const session = { getNext(t: Context) { return (data: Partial) => { logger.debug('Next: %d %o', data); - data.rid = new ObjectID(t.rid); + data.rid = t.rid as any; if (data.case) data.case.message ||= ''; next(data); }; @@ -36,7 +35,7 @@ const session = { getEnd(t: Context) { return (data: Partial) => { data.key = 'end'; - data.rid = new ObjectID(t.rid); + data.rid = t.rid as any; logger.info('End: status=%d score=%d time=%dms memory=%dkb', data.status, data.score, data.time, data.memory); end(data); };