diff --git a/packages/hydrooj/src/entry/common.ts b/packages/hydrooj/src/entry/common.ts index c8b57a987..269f4c027 100644 --- a/packages/hydrooj/src/entry/common.ts +++ b/packages/hydrooj/src/entry/common.ts @@ -1,6 +1,7 @@ /* eslint-disable no-await-in-loop */ /* eslint-disable no-eval */ import fs from 'fs'; +import os from 'os'; import path from 'path'; import yaml from 'js-yaml'; import { Logger } from '../logger'; @@ -99,9 +100,15 @@ export async function setting(pending: string[], fail: string[], modelSetting: t try { const cfg: any = yaml.load(fs.readFileSync(p).toString()); for (const key in cfg) { + let val; + if (typeof cfg[key].default === 'string') { + val = cfg[key].default + .replace(/\$TEMP/g, os.tmpdir()) + .replace(/\$HOME/g, os.homedir()); + } map[cfg[key].category || 'system']( modelSetting.Setting( - name, `${name}.${key}`, cfg[key].range, cfg[key].default, + name, `${name}.${key}`, cfg[key].range, val, cfg[key].type || 'text', cfg[key].name || key, cfg[key].desc || '', ), ); diff --git a/packages/hydrooj/src/entry/master.ts b/packages/hydrooj/src/entry/master.ts index 0afb9a8d8..686937bb3 100644 --- a/packages/hydrooj/src/entry/master.ts +++ b/packages/hydrooj/src/entry/master.ts @@ -10,7 +10,6 @@ import { Logger } from '../logger'; import options from '../options'; import * as bus from '../service/bus'; import db from '../service/db'; -import storage from '../service/storage'; const logger = new Logger('entry/master'); const tmpdir = path.resolve(os.tmpdir(), 'hydro'); @@ -64,7 +63,8 @@ export async function load(call: Entry) { const sopts = { endPoint, accessKey, secretKey, bucket, region, endPointForUser, endPointForJudge, }; - await storage.start(sopts); + const storage = require('../service/storage'); + storage.start(sopts); require('../service/monitor'); for (const i of builtinModel) require(`../model/${i}`); const scripts = require('../upgrade'); diff --git a/packages/hydrooj/src/entry/worker.ts b/packages/hydrooj/src/entry/worker.ts index a69635835..ca43efe28 100644 --- a/packages/hydrooj/src/entry/worker.ts +++ b/packages/hydrooj/src/entry/worker.ts @@ -8,7 +8,6 @@ import { import options from '../options'; import * as bus from '../service/bus'; import db from '../service/db'; -import storage from '../service/storage'; import { Logger } from '../logger'; const logger = new Logger('loader/worker'); @@ -42,7 +41,8 @@ export async function load() { const sopts = { endPoint, accessKey, secretKey, bucket, region, endPointForUser, endPointForJudge, }; - await storage.start(sopts); + const storage = require('../service/storage'); + storage.start(sopts); if (argv.loaderDetail) logger.info('finish: storage.connect'); for (const i of builtinLib) require(`../lib/${i}`); if (argv.loaderDetail) logger.info('finish: lib.builtin'); @@ -67,9 +67,7 @@ export async function load() { if (argv.loaderDetail) logger.info('finish: setting'); await handler(pending, fail); if (argv.loaderDetail) logger.info('finish: handler.extra'); - for (const i in global.Hydro.handler) { - await global.Hydro.handler[i](); - } + for (const i in global.Hydro.handler) await global.Hydro.handler[i](); if (argv.loaderDetail) logger.info('finish: handler.apply'); const notfound = require('../handler/notfound'); await notfound.apply(); diff --git a/packages/hydrooj/src/model/system.ts b/packages/hydrooj/src/model/system.ts index 6872a6ed4..3f5b7d76a 100644 --- a/packages/hydrooj/src/model/system.ts +++ b/packages/hydrooj/src/model/system.ts @@ -36,9 +36,10 @@ export function getMany(keys: string[]): any[] { return keys.map((key) => cache[key]); } -export async function set(_id: K, value: SystemKeys[K]): Promise -export async function set(_id: string, value: K): Promise -export async function set(_id: string, value: any) { +export async function set(_id: K, value: SystemKeys[K], boardcast?: boolean): Promise +export async function set(_id: string, value: K, boardcast?: boolean): Promise +export async function set(_id: string, value: any, boardcast = true) { + if (boardcast) bus.boardcast('system/setting', { [_id]: value }); const res = await coll.findOneAndUpdate( { _id }, { $set: { value } }, @@ -69,6 +70,10 @@ export async function runConfig() { bus.emit('database/config'); } +bus.on('system/setting', (args) => { + for (const key in args) set(key, args[key], false); +}); + global.Hydro.model.system = { runConfig, get, diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index be5ce3494..ce06437c2 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -118,6 +118,7 @@ export function off(name: K, listener: EventMap[K]) { export async function parallel(name: K, ...args: Parameters): Promise { const tasks: Promise[] = []; + if (argv.showBus) logger.debug('parallel: %s %o', name, args); for (const callback of _hooks[name] || []) { tasks.push(callback.apply(this, args)); } @@ -166,7 +167,8 @@ async function messageHandler(worker: cluster.Worker, msg: any) { for (const i in cluster.workers) { cluster.workers[i].send(msg); } - } else global.Hydro.service.bus.emit(msg.eventName, ...msg.payload); + } + emit(msg.eventName, ...msg.payload); } else if (msg.event === 'stat') { global.Hydro.stat.reqCount += msg.count; } else await emit(msg.event, ...msg.payload);