mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
core: use with hydro center
This commit is contained in:
1 parent
866aa56f78
commit
76744e0584
6 files changed
+117
-12
No files matched your search
@@ -0,0 +1,80 @@
|
|||||||
|
import db from 'hydrooj/dist/service/db';
|
||||||
|
import {
|
||||||
|
Handler, param, post, Route, Types,
|
||||||
|
} from 'hydrooj/dist/service/server';
|
||||||
|
import { RemoteOnlineJudgeError } from 'hydrooj/dist/error';
|
||||||
|
import crypto from 'crypto';
|
||||||
|
import yaml from 'js-yaml';
|
||||||
|
import superagent from 'superagent';
|
||||||
|
|
||||||
|
function decrypt(encrypted: string) {
|
||||||
|
if (!encrypted) throw new Error();
|
||||||
|
const decipher = crypto.createDecipheriv('des-ecb', 'hydro-oj', '');
|
||||||
|
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
|
||||||
|
decrypted += decipher.final('utf8');
|
||||||
|
return decrypted;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module 'hydrooj/dist/interface' {
|
||||||
|
interface Collections {
|
||||||
|
dataReport: any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const coll = db.collection('dataReport');
|
||||||
|
|
||||||
|
class DataReportHandler extends Handler {
|
||||||
|
noCheckPermView = true;
|
||||||
|
|
||||||
|
@post('instanceId', Types.String)
|
||||||
|
@post('payload', Types.String)
|
||||||
|
async post(domainId: string, instanceId: string, _payload: string) {
|
||||||
|
const payload: any = yaml.load(decrypt(_payload));
|
||||||
|
await coll.updateOne({ _id: instanceId }, {
|
||||||
|
$set: {
|
||||||
|
version: payload.version,
|
||||||
|
name: payload.name,
|
||||||
|
url: payload.url,
|
||||||
|
addons: payload.addons,
|
||||||
|
mem: payload.memory,
|
||||||
|
osinfo: payload.osinfo,
|
||||||
|
cpu: payload.cpu,
|
||||||
|
ip: this.request.ip,
|
||||||
|
flags: payload.flags,
|
||||||
|
update: new Date(),
|
||||||
|
domainCount: payload.domainCount,
|
||||||
|
userCount: payload.userCount,
|
||||||
|
problemCount: payload.problemCount,
|
||||||
|
discussionCount: payload.discussionCount,
|
||||||
|
recordCount: payload.recordCount,
|
||||||
|
},
|
||||||
|
}, { upsert: true });
|
||||||
|
this.response.body = 'success';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProxySendRequestHandler extends Handler {
|
||||||
|
@param('endpoint', Types.String)
|
||||||
|
@param('domainId', Types.String)
|
||||||
|
@param('url', Types.String)
|
||||||
|
@param('tokenId', Types.String)
|
||||||
|
@param('expire', Types.UnsignedInt)
|
||||||
|
async post(_d: string, endpoint: string, domainId: string, url: string, tokenId: string, expire: number) {
|
||||||
|
let res = await superagent.post(`${url}d/${domainId}/problem/send`)
|
||||||
|
.send({ operation: 'info', token: tokenId })
|
||||||
|
.catch((e) => e);
|
||||||
|
if (res instanceof Error) throw new RemoteOnlineJudgeError(res.message);
|
||||||
|
res = await superagent.post(`${endpoint}/problem/receive`).send({
|
||||||
|
operation: 'request', url: `${url}d/${domainId}/problem/send`, tokenId, expire,
|
||||||
|
}).catch((e) => e);
|
||||||
|
if (res instanceof Error) throw new RemoteOnlineJudgeError(res.message);
|
||||||
|
this.response.body = { code: 0 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apply() {
|
||||||
|
Route('data_report', '/center/report', DataReportHandler);
|
||||||
|
Route('proxy_send', '/center/send', ProxySendRequestHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
global.Hydro.handler.center = apply;
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "@hydrooj/center",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"main": "package.json",
|
||||||
|
"repository": "https://github.com/hydro-dev/Hydro.git",
|
||||||
|
"author": "undefined <i@undefined.moe>",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
|
"superagent": "^6.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hydrooj",
|
"name": "hydrooj",
|
||||||
"version": "2.25.6",
|
"version": "2.25.7",
|
||||||
"bin": "bin/hydrooj.js",
|
"bin": "bin/hydrooj.js",
|
||||||
"main": "dist/loader.js",
|
"main": "dist/loader.js",
|
||||||
"typings": "dist/loader.d.ts",
|
"typings": "dist/loader.d.ts",
|
||||||
|
|||||||
@@ -43,10 +43,20 @@ export class ProblemSendHandler extends Handler {
|
|||||||
}
|
}
|
||||||
const [url, expire] = system.getMany(['server.url', 'session.saved_expire_seconds']);
|
const [url, expire] = system.getMany(['server.url', 'session.saved_expire_seconds']);
|
||||||
const tokenId = await token.createOrUpdate(token.TYPE_EXPORT, expire, { domainId, pids: Array.from(pids) });
|
const tokenId = await token.createOrUpdate(token.TYPE_EXPORT, expire, { domainId, pids: Array.from(pids) });
|
||||||
await superagent.post(`${target[1]}/d/${target[0]}/problem/receive`)
|
const res = system.get('server.proxy')
|
||||||
.send({
|
? await superagent.post(`${system.get('server.center')}/send`)
|
||||||
operation: 'request', url: `${url}d/${domainId}/problem/send`, tokenId, expire,
|
.send({
|
||||||
}).catch(logAndReturn(logger));
|
endpoint: `${target[1]}/d/${target[0]}`,
|
||||||
|
domainId,
|
||||||
|
url,
|
||||||
|
tokenId,
|
||||||
|
expire,
|
||||||
|
}).catch(logAndReturn(logger))
|
||||||
|
: await superagent.post(`${target[1]}/d/${target[0]}/problem/receive`)
|
||||||
|
.send({
|
||||||
|
operation: 'request', url: `${url}d/${domainId}/problem/send`, tokenId, expire,
|
||||||
|
}).catch(logAndReturn(logger));
|
||||||
|
if (res instanceof Error) throw new RemoteOnlineJudgeError(res.message);
|
||||||
this.back();
|
this.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,6 +164,8 @@ SystemSetting(
|
|||||||
Setting('setting_smtp', 'smtp.port', 465, 'number', 'smtp.port', 'SMTP Server Port'),
|
Setting('setting_smtp', 'smtp.port', 465, 'number', 'smtp.port', 'SMTP Server Port'),
|
||||||
Setting('setting_smtp', 'smtp.from', null, 'text', 'smtp.from', 'Mail From'),
|
Setting('setting_smtp', 'smtp.from', null, 'text', 'smtp.from', 'Mail From'),
|
||||||
Setting('setting_smtp', 'smtp.secure', false, 'boolean', 'smtp.secure', 'SSL'),
|
Setting('setting_smtp', 'smtp.secure', false, 'boolean', 'smtp.secure', 'SSL'),
|
||||||
|
Setting('setting_server', 'server.center', 'https://hydro.undefined.moe:8443/center', 'text', 'server.center', '', FLAG_HIDDEN),
|
||||||
|
Setting('setting_server', 'server.proxy', false, 'boolean', 'server.proxy', 'Use hydro center proxy to send problems'),
|
||||||
Setting('setting_server', 'server.name', 'Hydro', 'text', 'server.name', 'Server Name'),
|
Setting('setting_server', 'server.name', 'Hydro', 'text', 'server.name', 'Server Name'),
|
||||||
Setting('setting_server', 'server.worker', 1, 'number', 'server.worker', 'Server Workers Number'),
|
Setting('setting_server', 'server.worker', 1, 'number', 'server.worker', 'Server Workers Number'),
|
||||||
Setting('setting_server', 'server.hostname', 'oj.undefined.moe', 'text', 'server.hostname', 'Server Hostname'),
|
Setting('setting_server', 'server.hostname', 'oj.undefined.moe', 'text', 'server.hostname', 'Server Hostname'),
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export async function feedback(): Promise<[string, StatusUpdate]> {
|
|||||||
} = global.Hydro.model;
|
} = global.Hydro.model;
|
||||||
const version = require('hydrooj/package.json').version;
|
const version = require('hydrooj/package.json').version;
|
||||||
const [mid, $update, inf] = await sysinfo.update();
|
const [mid, $update, inf] = await sysinfo.update();
|
||||||
const [installid, name, url] = system.getMany(['installid', 'server.name', 'server.url']);
|
const [installId, name, url] = system.getMany(['installid', 'server.name', 'server.url']);
|
||||||
const [domainCount, userCount, problemCount, discussionCount, recordCount] = await Promise.all([
|
const [domainCount, userCount, problemCount, discussionCount, recordCount] = await Promise.all([
|
||||||
domain.getMulti().count(),
|
domain.getMulti().count(),
|
||||||
user.getMulti().count(),
|
user.getMulti().count(),
|
||||||
@@ -33,7 +33,7 @@ export async function feedback(): Promise<[string, StatusUpdate]> {
|
|||||||
record.coll.find().count(),
|
record.coll.find().count(),
|
||||||
]);
|
]);
|
||||||
const payload = crypt(dump({
|
const payload = crypt(dump({
|
||||||
_id: installid + mid.toString(),
|
mid: mid.toString(),
|
||||||
version,
|
version,
|
||||||
name,
|
name,
|
||||||
url,
|
url,
|
||||||
@@ -47,11 +47,12 @@ export async function feedback(): Promise<[string, StatusUpdate]> {
|
|||||||
osinfo: inf.osinfo,
|
osinfo: inf.osinfo,
|
||||||
cpu: inf.cpu,
|
cpu: inf.cpu,
|
||||||
}));
|
}));
|
||||||
superagent.post('https://feedback.undefined.moe/')
|
superagent.post(`${system.get('server.center')}/report`)
|
||||||
.send({ payload })
|
.send({ installId, payload })
|
||||||
.catch(() => {
|
.then((res) => {
|
||||||
logger.warn('Cannot connect to hydro center.');
|
if (res.body.updateUrl) system.set('server.center', res.body.updateUrl);
|
||||||
});
|
})
|
||||||
|
.catch(() => logger.warn('Cannot connect to hydro center.'));
|
||||||
return [mid, $update];
|
return [mid, $update];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user