Files
Hydro/packages/hydrooj/src/check.ts
T
2021-08-01 17:48:55 +08:00

60 lines
1.9 KiB
TypeScript

// TODO check more
import os from 'os';
import { Dictionary } from 'lodash';
import * as system from './model/system';
import db from './service/db';
const c = {};
type CheckItem = (context: any, log: Function, warn: Function, error: Function) => Promise<void>;
const checks: Dictionary<CheckItem> = {
async checkDb(ctx, log, warn, error) {
try {
const coll = db.collection('check');
const d = await coll.findOne({ _id: 'check' });
if (!d) await coll.insertOne({ _id: 'check', value: 'check' });
await coll.createIndex('check');
await coll.deleteOne({ _id: 'check' });
await coll.drop();
} catch (e) {
error(`Mongo Error: Database read-write failed.\n${e.message}`);
}
},
// TODO check storage
async checkSystem(ctx, log, warn) {
const platform = os.platform();
if (platform !== 'linux') {
warn(`Hydro is running on ${platform}, suggest to use linux4.4+.`);
}
},
async checkMail(ctx, log, warn) {
const from = system.get('smtp.from');
if (!from) warn('SMTP account was not provided, email verification disabled.');
},
async checkSetting(ctx, log, warn) {
const url = system.get('server.url');
if (url === '/') warn("server.url wasn't set.");
const header = system.get('server.xff');
if (header && !ctx.request.ip) warn('IP header seems incorrect.\nCheck dashboard>settings>server.');
},
};
export async function start(ctx, log, warn, error, cb: (id: string) => void) {
const id = String.random(6);
cb(id);
for (const name in checks) {
if (c[id]) {
delete c[id];
return;
}
// eslint-disable-next-line no-await-in-loop
await checks[name](ctx, log, warn, error);
}
}
export async function cancel(id: string) {
c[id] = true;
}