// 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; const checks: Dictionary = { 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}`); } }, async checkPerm(ctx, log, warn) { const { username } = os.userInfo(); if (username === 'root') warn('Hydro should not be run as root.'); // TODO check cwd read-write }, 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 checkIpHeader(ctx, log, warn) { 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; }