@whyour/qinglong 2.18.3-3 → 2.19.0-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +7 -9
- package/docker/310.Dockerfile +18 -9
- package/docker/Dockerfile +18 -9
- package/docker/docker-entrypoint.sh +14 -15
- package/docker/front.conf +0 -32
- package/ecosystem.config.js +5 -25
- package/package.json +9 -11
- package/sample/notify.js +5 -3
- package/shell/check.sh +0 -2
- package/shell/preload/sitecustomize.js +38 -15
- package/shell/preload/sitecustomize.py +42 -18
- package/shell/share.sh +23 -75
- package/shell/update.sh +21 -20
- package/static/build/api/health.js +32 -0
- package/static/build/api/index.js +4 -0
- package/static/build/api/log.js +1 -1
- package/static/build/api/script.js +2 -3
- package/static/build/api/system.js +1 -0
- package/static/build/api/update.js +47 -0
- package/static/build/api/user.js +2 -2
- package/static/build/app.js +70 -21
- package/static/build/config/const.js +2 -1
- package/static/build/config/index.js +32 -25
- package/static/build/config/util.js +72 -89
- package/static/build/data/dependence.js +1 -13
- package/static/build/data/notify.js +1 -0
- package/static/build/loaders/app.js +7 -9
- package/static/build/loaders/db.js +1 -3
- package/static/build/loaders/express.js +1 -9
- package/static/build/loaders/initData.js +7 -8
- package/static/build/loaders/initFile.js +0 -1
- package/static/build/loaders/logger.js +34 -15
- package/static/build/middlewares/monitoring.js +56 -0
- package/static/build/schedule/api.js +47 -8
- package/static/build/schedule/client.js +1 -1
- package/static/build/services/cron.js +12 -6
- package/static/build/services/dependence.js +10 -9
- package/static/build/services/grpc.js +97 -0
- package/static/build/services/health.js +74 -0
- package/static/build/services/http.js +68 -0
- package/static/build/services/metrics.js +82 -0
- package/static/build/services/notify.js +3 -3
- package/static/build/services/system.js +8 -1
- package/static/build/services/user.js +21 -5
- package/static/build/shared/pLimit.js +13 -1
- package/static/dist/{2208.03c2cf4a.async.js → 2208.98ccac5f.async.js} +1 -1
- package/static/dist/8826.faecf076.async.js +1 -0
- package/static/dist/8851.cf7e0ebc.async.js +1 -0
- package/static/dist/index.html +2 -2
- package/static/dist/layouts__index.6e23431c.async.js +1 -0
- package/static/dist/{preload_helper.1b1a7a9f.js → preload_helper.67e88ed6.js} +1 -1
- package/static/dist/{src__pages__crontab__index.5eb33581.async.js → src__pages__crontab__index.d6d37f6a.async.js} +1 -1
- package/static/dist/{src__pages__crontab__modal.b20074c2.async.js → src__pages__crontab__modal.dcd053b5.async.js} +1 -1
- package/static/dist/src__pages__dependence__modal.7f588c0b.async.js +1 -0
- package/static/dist/src__pages__env__editNameModal.411043e2.async.js +1 -0
- package/static/dist/{src__pages__env__modal.d923acdb.async.js → src__pages__env__modal.7d952f26.async.js} +1 -1
- package/static/dist/src__pages__error__index.837f4753.async.js +1 -0
- package/static/dist/{src__pages__initialization__index.684197ee.async.js → src__pages__initialization__index.5bd471c5.async.js} +1 -1
- package/static/dist/src__pages__script__editNameModal.32bb2f80.async.js +1 -0
- package/static/dist/src__pages__script__index.53f99bee.async.js +1 -0
- package/static/dist/{src__pages__script__renameModal.09dfb133.async.js → src__pages__script__renameModal.8232c924.async.js} +1 -1
- package/static/dist/{src__pages__script__saveModal.21b81bcc.async.js → src__pages__script__saveModal.8e358e84.async.js} +1 -1
- package/static/dist/{src__pages__script__setting.c6503aaf.async.js → src__pages__script__setting.dcdd7253.async.js} +1 -1
- package/static/dist/{src__pages__setting__appModal.b115baf8.async.js → src__pages__setting__appModal.25adf30e.async.js} +1 -1
- package/static/dist/src__pages__setting__dependence.95dd01e7.async.js +1 -0
- package/static/dist/src__pages__setting__index.3b426f9f.async.js +1 -0
- package/static/dist/src__pages__setting__notification.989e57d6.async.js +1 -0
- package/static/dist/src__pages__setting__security.7623a492.async.js +1 -0
- package/static/dist/src__pages__setting__systemLog.2e8cc7a0.async.js +1 -0
- package/static/dist/src__pages__subscription__modal.46a69195.async.js +1 -0
- package/static/dist/{umi.32588872.js → umi.b7656bb3.js} +1 -1
- package/version.yaml +12 -6
- package/back.d.ts +0 -9
- package/other.config.js +0 -13
- package/static/build/loaders/update.js +0 -79
- package/static/build/public.js +0 -34
- package/static/build/schedule/index.js +0 -52
- package/static/build/update.js +0 -29
- package/static/dist/8826.b3f9fa78.async.js +0 -1
- package/static/dist/8851.a57942be.async.js +0 -1
- package/static/dist/layouts__index.623b87d2.async.js +0 -1
- package/static/dist/src__pages__dependence__modal.1bb8572d.async.js +0 -1
- package/static/dist/src__pages__env__editNameModal.115bb8ea.async.js +0 -1
- package/static/dist/src__pages__error__index.a17578c5.async.js +0 -1
- package/static/dist/src__pages__script__editNameModal.7d1cc6b4.async.js +0 -1
- package/static/dist/src__pages__script__index.0cd08dcd.async.js +0 -1
- package/static/dist/src__pages__setting__dependence.f3afc194.async.js +0 -1
- package/static/dist/src__pages__setting__index.34ed674c.async.js +0 -1
- package/static/dist/src__pages__setting__notification.b7722a0b.async.js +0 -1
- package/static/dist/src__pages__setting__security.534a5e67.async.js +0 -1
- package/static/dist/src__pages__setting__systemLog.cb8a2174.async.js +0 -1
- package/static/dist/src__pages__subscription__modal.10cd630d.async.js +0 -1
|
@@ -29,20 +29,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
29
29
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
30
30
|
};
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
-
exports.updateLinuxMirrorFile = exports.detectOS = exports.setSystemTimezone = exports.rmPath = exports.safeJSONParse = exports.getUniqPath = exports.parseContentVersion = exports.parseVersion = exports.getPid = exports.killTask = exports.psTree = exports.parseBody = exports.parseHeaders = exports.promiseExecSuccess = exports.promiseExec = exports.readDir = exports.readDirs = exports.dirSort = exports.concurrentRun = exports.handleLogPath = exports.createFile = exports.fileExist = exports.getPlatform = exports.
|
|
32
|
+
exports.updateLinuxMirrorFile = exports.detectOS = exports.isDemoEnv = exports.getUninstallCommand = exports.getInstallCommand = exports.setSystemTimezone = exports.rmPath = exports.safeJSONParse = exports.getUniqPath = exports.parseContentVersion = exports.parseVersion = exports.getPid = exports.killTask = exports.psTree = exports.parseBody = exports.parseHeaders = exports.promiseExecSuccess = exports.promiseExec = exports.readDir = exports.readDirs = exports.dirSort = exports.concurrentRun = exports.handleLogPath = exports.createFile = exports.fileExist = exports.getPlatform = exports.getToken = exports.getLastModifyFilePath = exports.removeAnsi = exports.getFileContentByName = void 0;
|
|
33
33
|
const fs = __importStar(require("fs/promises"));
|
|
34
34
|
const path = __importStar(require("path"));
|
|
35
|
-
const got_1 = __importDefault(require("got"));
|
|
36
|
-
const iconv_lite_1 = __importDefault(require("iconv-lite"));
|
|
37
35
|
const child_process_1 = require("child_process");
|
|
38
36
|
const form_data_1 = __importDefault(require("form-data"));
|
|
39
|
-
const
|
|
37
|
+
const ps_tree_1 = __importDefault(require("ps-tree"));
|
|
40
38
|
const util_1 = require("util");
|
|
41
39
|
const js_yaml_1 = require("js-yaml");
|
|
42
40
|
const index_1 = __importDefault(require("./index"));
|
|
43
41
|
const const_1 = require("./const");
|
|
44
42
|
const logger_1 = __importDefault(require("../loaders/logger"));
|
|
45
43
|
const utils_1 = require("../shared/utils");
|
|
44
|
+
const dependence_1 = require("../data/dependence");
|
|
46
45
|
const os_1 = __importDefault(require("os"));
|
|
47
46
|
__exportStar(require("./share"), exports);
|
|
48
47
|
let osType;
|
|
@@ -87,73 +86,6 @@ function getToken(req) {
|
|
|
87
86
|
return '';
|
|
88
87
|
}
|
|
89
88
|
exports.getToken = getToken;
|
|
90
|
-
async function getNetIp(req) {
|
|
91
|
-
const ipArray = [
|
|
92
|
-
...new Set([
|
|
93
|
-
...(req.headers['x-real-ip'] || '').split(','),
|
|
94
|
-
...(req.headers['x-forwarded-for'] || '').split(','),
|
|
95
|
-
req.ip,
|
|
96
|
-
...req.ips,
|
|
97
|
-
req.socket.remoteAddress,
|
|
98
|
-
]),
|
|
99
|
-
].filter(Boolean);
|
|
100
|
-
let ip = ipArray[0];
|
|
101
|
-
if (ipArray.length > 1) {
|
|
102
|
-
for (let i = 0; i < ipArray.length; i++) {
|
|
103
|
-
const ipNumArray = ipArray[i].split('.');
|
|
104
|
-
const tmp = ipNumArray[0] + '.' + ipNumArray[1];
|
|
105
|
-
if (tmp === '192.168' ||
|
|
106
|
-
(ipNumArray[0] === '172' &&
|
|
107
|
-
ipNumArray[1] >= 16 &&
|
|
108
|
-
ipNumArray[1] <= 32) ||
|
|
109
|
-
tmp === '10.7' ||
|
|
110
|
-
tmp === '127.0') {
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
ip = ipArray[i];
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
ip = ip.substr(ip.lastIndexOf(':') + 1, ip.length);
|
|
118
|
-
if (ip.includes('127.0') || ip.includes('192.168') || ip.includes('10.7')) {
|
|
119
|
-
ip = '';
|
|
120
|
-
}
|
|
121
|
-
if (!ip) {
|
|
122
|
-
return { address: `获取失败`, ip };
|
|
123
|
-
}
|
|
124
|
-
try {
|
|
125
|
-
const csdnApi = got_1.default
|
|
126
|
-
.get(`https://searchplugin.csdn.net/api/v1/ip/get?ip=${ip}`, {
|
|
127
|
-
timeout: 10000,
|
|
128
|
-
retry: 0,
|
|
129
|
-
})
|
|
130
|
-
.text();
|
|
131
|
-
const pconlineApi = got_1.default
|
|
132
|
-
.get(`https://whois.pconline.com.cn/ipJson.jsp?ip=${ip}&json=true`, {
|
|
133
|
-
timeout: 10000,
|
|
134
|
-
retry: 0,
|
|
135
|
-
})
|
|
136
|
-
.buffer();
|
|
137
|
-
const [csdnBody, pconlineBody] = await await Promise.all([
|
|
138
|
-
csdnApi,
|
|
139
|
-
pconlineApi,
|
|
140
|
-
]);
|
|
141
|
-
const csdnRes = JSON.parse(csdnBody);
|
|
142
|
-
const pconlineRes = JSON.parse(iconv_lite_1.default.decode(pconlineBody, 'GBK'));
|
|
143
|
-
let address = '';
|
|
144
|
-
if (csdnBody && csdnRes.code == 200) {
|
|
145
|
-
address = csdnRes.data.address;
|
|
146
|
-
}
|
|
147
|
-
else if (pconlineRes && pconlineRes.addr) {
|
|
148
|
-
address = pconlineRes.addr;
|
|
149
|
-
}
|
|
150
|
-
return { address, ip };
|
|
151
|
-
}
|
|
152
|
-
catch (error) {
|
|
153
|
-
return { address: `获取失败`, ip };
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
exports.getNetIp = getNetIp;
|
|
157
89
|
function getPlatform(userAgent) {
|
|
158
90
|
const ua = userAgent.toLowerCase();
|
|
159
91
|
const testUa = (regexp) => regexp.test(ua);
|
|
@@ -301,22 +233,47 @@ async function readDirs(dir, baseDir = '', blacklist = [], sort = dirSort) {
|
|
|
301
233
|
}
|
|
302
234
|
exports.readDirs = readDirs;
|
|
303
235
|
async function readDir(dir, baseDir = '', blacklist = []) {
|
|
304
|
-
const
|
|
305
|
-
const
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
const
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
236
|
+
const absoluteDir = path.join(baseDir, dir);
|
|
237
|
+
const relativePath = path.relative(baseDir, absoluteDir);
|
|
238
|
+
try {
|
|
239
|
+
const files = await fs.readdir(absoluteDir);
|
|
240
|
+
const result = [];
|
|
241
|
+
for (const file of files) {
|
|
242
|
+
const subPath = path.join(absoluteDir, file);
|
|
243
|
+
const stats = await fs.lstat(subPath);
|
|
244
|
+
const key = path.join(relativePath, file);
|
|
245
|
+
if (blacklist.includes(file) || stats.isSymbolicLink()) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (stats.isDirectory()) {
|
|
249
|
+
result.push({
|
|
250
|
+
title: file,
|
|
251
|
+
type: 'directory',
|
|
252
|
+
key,
|
|
253
|
+
parent: relativePath,
|
|
254
|
+
createTime: stats.birthtime.getTime(),
|
|
255
|
+
children: [],
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
result.push({
|
|
260
|
+
title: file,
|
|
261
|
+
type: 'file',
|
|
262
|
+
key,
|
|
263
|
+
parent: relativePath,
|
|
264
|
+
size: stats.size,
|
|
265
|
+
createTime: stats.birthtime.getTime(),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
if (error.code === 'ENOENT') {
|
|
273
|
+
return [];
|
|
274
|
+
}
|
|
275
|
+
throw error;
|
|
276
|
+
}
|
|
320
277
|
}
|
|
321
278
|
exports.readDir = readDir;
|
|
322
279
|
async function promiseExec(command) {
|
|
@@ -408,11 +365,11 @@ function parseBody(body, contentType, valueFormatFn) {
|
|
|
408
365
|
exports.parseBody = parseBody;
|
|
409
366
|
function psTree(pid) {
|
|
410
367
|
return new Promise((resolve, reject) => {
|
|
411
|
-
(0,
|
|
368
|
+
(0, ps_tree_1.default)(pid, (err, children) => {
|
|
412
369
|
if (err) {
|
|
413
370
|
reject(err);
|
|
414
371
|
}
|
|
415
|
-
resolve(
|
|
372
|
+
resolve(children.map((x) => Number(x.PID)).filter((x) => !isNaN(x)));
|
|
416
373
|
});
|
|
417
374
|
});
|
|
418
375
|
}
|
|
@@ -517,6 +474,32 @@ async function setSystemTimezone(timezone) {
|
|
|
517
474
|
}
|
|
518
475
|
}
|
|
519
476
|
exports.setSystemTimezone = setSystemTimezone;
|
|
477
|
+
function getInstallCommand(type, name) {
|
|
478
|
+
const baseCommands = {
|
|
479
|
+
[dependence_1.DependenceTypes.nodejs]: 'pnpm add -g',
|
|
480
|
+
[dependence_1.DependenceTypes.python3]: 'pip3 install --disable-pip-version-check --root-user-action=ignore',
|
|
481
|
+
[dependence_1.DependenceTypes.linux]: 'apt install -y',
|
|
482
|
+
};
|
|
483
|
+
let command = baseCommands[type];
|
|
484
|
+
if (type === dependence_1.DependenceTypes.python3 && const_1.PYTHON_INSTALL_DIR) {
|
|
485
|
+
command = `${command} --prefix=${const_1.PYTHON_INSTALL_DIR}`;
|
|
486
|
+
}
|
|
487
|
+
return `${command} ${name.trim()}`;
|
|
488
|
+
}
|
|
489
|
+
exports.getInstallCommand = getInstallCommand;
|
|
490
|
+
function getUninstallCommand(type, name) {
|
|
491
|
+
const baseCommands = {
|
|
492
|
+
[dependence_1.DependenceTypes.nodejs]: 'pnpm remove -g',
|
|
493
|
+
[dependence_1.DependenceTypes.python3]: 'pip3 uninstall --disable-pip-version-check --root-user-action=ignore -y',
|
|
494
|
+
[dependence_1.DependenceTypes.linux]: 'apt remove -y',
|
|
495
|
+
};
|
|
496
|
+
return `${baseCommands[type]} ${name.trim()}`;
|
|
497
|
+
}
|
|
498
|
+
exports.getUninstallCommand = getUninstallCommand;
|
|
499
|
+
function isDemoEnv() {
|
|
500
|
+
return process.env.DeployEnv === 'demo';
|
|
501
|
+
}
|
|
502
|
+
exports.isDemoEnv = isDemoEnv;
|
|
520
503
|
async function getOSReleaseInfo() {
|
|
521
504
|
const osRelease = await fs.readFile('/etc/os-release', 'utf8');
|
|
522
505
|
return osRelease;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DependenceModel = exports.
|
|
3
|
+
exports.DependenceModel = exports.versionDependenceCommandTypes = exports.GetDependenceCommandTypes = exports.DependenceTypes = exports.DependenceStatus = exports.Dependence = void 0;
|
|
4
4
|
const _1 = require(".");
|
|
5
5
|
const sequelize_1 = require("sequelize");
|
|
6
6
|
class Dependence {
|
|
@@ -35,12 +35,6 @@ var DependenceTypes;
|
|
|
35
35
|
DependenceTypes[DependenceTypes["python3"] = 1] = "python3";
|
|
36
36
|
DependenceTypes[DependenceTypes["linux"] = 2] = "linux";
|
|
37
37
|
})(DependenceTypes || (exports.DependenceTypes = DependenceTypes = {}));
|
|
38
|
-
var InstallDependenceCommandTypes;
|
|
39
|
-
(function (InstallDependenceCommandTypes) {
|
|
40
|
-
InstallDependenceCommandTypes[InstallDependenceCommandTypes["pnpm add -g"] = 0] = "pnpm add -g";
|
|
41
|
-
InstallDependenceCommandTypes[InstallDependenceCommandTypes["pip3 install --disable-pip-version-check --root-user-action=ignore"] = 1] = "pip3 install --disable-pip-version-check --root-user-action=ignore";
|
|
42
|
-
InstallDependenceCommandTypes[InstallDependenceCommandTypes["apt-get install -y"] = 2] = "apt-get install -y";
|
|
43
|
-
})(InstallDependenceCommandTypes || (exports.InstallDependenceCommandTypes = InstallDependenceCommandTypes = {}));
|
|
44
38
|
var GetDependenceCommandTypes;
|
|
45
39
|
(function (GetDependenceCommandTypes) {
|
|
46
40
|
GetDependenceCommandTypes[GetDependenceCommandTypes["pnpm ls -g "] = 0] = "pnpm ls -g ";
|
|
@@ -53,12 +47,6 @@ var versionDependenceCommandTypes;
|
|
|
53
47
|
versionDependenceCommandTypes[versionDependenceCommandTypes["=="] = 1] = "==";
|
|
54
48
|
versionDependenceCommandTypes[versionDependenceCommandTypes["="] = 2] = "=";
|
|
55
49
|
})(versionDependenceCommandTypes || (exports.versionDependenceCommandTypes = versionDependenceCommandTypes = {}));
|
|
56
|
-
var unInstallDependenceCommandTypes;
|
|
57
|
-
(function (unInstallDependenceCommandTypes) {
|
|
58
|
-
unInstallDependenceCommandTypes[unInstallDependenceCommandTypes["pnpm remove -g"] = 0] = "pnpm remove -g";
|
|
59
|
-
unInstallDependenceCommandTypes[unInstallDependenceCommandTypes["pip3 uninstall --disable-pip-version-check --root-user-action=ignore -y"] = 1] = "pip3 uninstall --disable-pip-version-check --root-user-action=ignore -y";
|
|
60
|
-
unInstallDependenceCommandTypes[unInstallDependenceCommandTypes["apt-get remove -y"] = 2] = "apt-get remove -y";
|
|
61
|
-
})(unInstallDependenceCommandTypes || (exports.unInstallDependenceCommandTypes = unInstallDependenceCommandTypes = {}));
|
|
62
50
|
exports.DependenceModel = _1.sequelize.define('Dependence', {
|
|
63
51
|
name: sequelize_1.DataTypes.STRING,
|
|
64
52
|
type: sequelize_1.DataTypes.NUMBER,
|
|
@@ -9,21 +9,19 @@ const logger_1 = __importDefault(require("./logger"));
|
|
|
9
9
|
const initData_1 = __importDefault(require("./initData"));
|
|
10
10
|
const deps_1 = __importDefault(require("./deps"));
|
|
11
11
|
const initTask_1 = __importDefault(require("./initTask"));
|
|
12
|
-
|
|
12
|
+
const initFile_1 = __importDefault(require("./initFile"));
|
|
13
|
+
exports.default = async ({ app }) => {
|
|
13
14
|
(0, depInjector_1.default)();
|
|
14
15
|
logger_1.default.info('✌️ Dependency loaded');
|
|
15
|
-
console.log('✌️ Dependency loaded');
|
|
16
|
-
await (0, initData_1.default)();
|
|
17
|
-
logger_1.default.info('✌️ Init data loaded');
|
|
18
|
-
console.log('✌️ Init data loaded');
|
|
19
16
|
await (0, deps_1.default)();
|
|
20
17
|
logger_1.default.info('✌️ Link deps loaded');
|
|
21
|
-
|
|
18
|
+
(0, initFile_1.default)();
|
|
19
|
+
logger_1.default.info('✌️ Init file loaded');
|
|
20
|
+
await (0, initData_1.default)();
|
|
21
|
+
logger_1.default.info('✌️ Init data loaded');
|
|
22
22
|
(0, initTask_1.default)();
|
|
23
23
|
logger_1.default.info('✌️ Init task loaded');
|
|
24
|
-
|
|
25
|
-
(0, express_1.default)({ app: expressApp });
|
|
24
|
+
(0, express_1.default)({ app });
|
|
26
25
|
logger_1.default.info('✌️ Express loaded');
|
|
27
|
-
console.log('✌️ Express loaded');
|
|
28
26
|
};
|
|
29
27
|
//# sourceMappingURL=app.js.map
|
|
@@ -58,12 +58,10 @@ exports.default = async () => {
|
|
|
58
58
|
await data_1.sequelize.query('alter table Crontabs add column task_after TEXT');
|
|
59
59
|
}
|
|
60
60
|
catch (error) { }
|
|
61
|
-
console.log('✌️ DB loaded');
|
|
62
61
|
logger_1.default.info('✌️ DB loaded');
|
|
63
62
|
}
|
|
64
63
|
catch (error) {
|
|
65
|
-
|
|
66
|
-
logger_1.default.error(error);
|
|
64
|
+
logger_1.default.error('✌️ DB load failed', error);
|
|
67
65
|
}
|
|
68
66
|
};
|
|
69
67
|
//# sourceMappingURL=db.js.map
|
|
@@ -12,25 +12,17 @@ const express_jwt_1 = require("express-jwt");
|
|
|
12
12
|
const util_1 = require("../config/util");
|
|
13
13
|
const express_urlrewrite_1 = __importDefault(require("express-urlrewrite"));
|
|
14
14
|
const celebrate_1 = require("celebrate");
|
|
15
|
-
const http_proxy_middleware_1 = require("http-proxy-middleware");
|
|
16
15
|
const serverEnv_1 = require("../config/serverEnv");
|
|
17
|
-
const logger_1 = __importDefault(require("./logger"));
|
|
18
16
|
const store_1 = require("../shared/store");
|
|
19
17
|
exports.default = ({ app }) => {
|
|
20
18
|
app.set('trust proxy', 'loopback');
|
|
21
19
|
app.use((0, cors_1.default)());
|
|
22
20
|
app.get(`${config_1.default.api.prefix}/env.js`, serverEnv_1.serveEnv);
|
|
23
21
|
app.use(`${config_1.default.api.prefix}/static`, express_1.default.static(config_1.default.uploadPath));
|
|
24
|
-
app.use('/api/public', (0, http_proxy_middleware_1.createProxyMiddleware)({
|
|
25
|
-
target: `http://0.0.0.0:${config_1.default.publicPort}/api`,
|
|
26
|
-
changeOrigin: true,
|
|
27
|
-
pathRewrite: { '/api/public': '' },
|
|
28
|
-
logger: logger_1.default,
|
|
29
|
-
}));
|
|
30
22
|
app.use(body_parser_1.default.json({ limit: '50mb' }));
|
|
31
23
|
app.use(body_parser_1.default.urlencoded({ limit: '50mb', extended: true }));
|
|
32
24
|
app.use((0, express_jwt_1.expressjwt)({
|
|
33
|
-
secret: config_1.default.secret,
|
|
25
|
+
secret: config_1.default.jwt.secret,
|
|
34
26
|
algorithms: ['HS384'],
|
|
35
27
|
}).unless({
|
|
36
28
|
path: [...config_1.default.apiWhiteList, /^\/open\//],
|
|
@@ -70,21 +70,20 @@ exports.default = async () => {
|
|
|
70
70
|
type: system_1.AuthDataType.authConfig,
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
-
const installDependencies = () => {
|
|
74
|
-
|
|
75
|
-
dependence_2.DependenceModel.findAll({
|
|
73
|
+
const installDependencies = async () => {
|
|
74
|
+
const docs = await dependence_2.DependenceModel.findAll({
|
|
76
75
|
where: {},
|
|
77
76
|
order: [
|
|
78
77
|
['type', 'DESC'],
|
|
79
78
|
['createdAt', 'DESC'],
|
|
80
79
|
],
|
|
81
80
|
raw: true,
|
|
82
|
-
}).then(async (docs) => {
|
|
83
|
-
await dependence_2.DependenceModel.update({ status: dependence_2.DependenceStatus.queued, log: [] }, { where: { id: docs.map((x) => x.id) } });
|
|
84
|
-
setTimeout(() => {
|
|
85
|
-
dependenceService.installDependenceOneByOne(docs);
|
|
86
|
-
}, 5000);
|
|
87
81
|
});
|
|
82
|
+
await dependence_2.DependenceModel.update({ status: dependence_2.DependenceStatus.queued, log: [] }, { where: { id: docs.map((x) => x.id) } });
|
|
83
|
+
setTimeout(async () => {
|
|
84
|
+
await dependenceService.installDependenceOneByOne(docs);
|
|
85
|
+
require('./bootAfter').default();
|
|
86
|
+
}, 5000);
|
|
88
87
|
};
|
|
89
88
|
// 初始化更新 linux/python/nodejs 镜像源配置
|
|
90
89
|
if ((_b = systemConfig.info) === null || _b === void 0 ? void 0 : _b.pythonMirror) {
|
|
@@ -8,24 +8,43 @@ require("winston-daily-rotate-file");
|
|
|
8
8
|
const config_1 = __importDefault(require("../config"));
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
10
|
const levelMap = {
|
|
11
|
-
info: '
|
|
12
|
-
warn: '
|
|
13
|
-
error: '
|
|
14
|
-
debug: '
|
|
15
|
-
};
|
|
16
|
-
const customFormat = winston_1.default.format.combine(winston_1.default.format.splat(), winston_1.default.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston_1.default.format.align(), winston_1.default.format.printf((i) => `[${levelMap[i.level]}${i.level}] [${[i.timestamp]}]: ${i.message}`));
|
|
17
|
-
const defaultOptions = {
|
|
18
|
-
format: customFormat,
|
|
19
|
-
datePattern: "YYYY-MM-DD",
|
|
20
|
-
maxSize: "20m",
|
|
21
|
-
maxFiles: "7d",
|
|
11
|
+
info: 'ℹ️',
|
|
12
|
+
warn: '⚠️',
|
|
13
|
+
error: '❌',
|
|
14
|
+
debug: '🐛', // debug调试图标
|
|
22
15
|
};
|
|
16
|
+
const baseFormat = [
|
|
17
|
+
winston_1.default.format.splat(),
|
|
18
|
+
winston_1.default.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
19
|
+
winston_1.default.format.align(),
|
|
20
|
+
];
|
|
21
|
+
const consoleFormat = winston_1.default.format.combine(winston_1.default.format.colorize({ level: true }), ...baseFormat, winston_1.default.format.printf((info) => {
|
|
22
|
+
return `[${info.level} ${info.timestamp}]:${info.message}`;
|
|
23
|
+
}));
|
|
24
|
+
const plainFormat = winston_1.default.format.combine(winston_1.default.format.uncolorize(), ...baseFormat, winston_1.default.format.printf((info) => {
|
|
25
|
+
return `[${levelMap[info.level] || ''}${info.level} ${info.timestamp}]:${info.message}`;
|
|
26
|
+
}));
|
|
27
|
+
const consoleTransport = new winston_1.default.transports.Console({
|
|
28
|
+
format: consoleFormat,
|
|
29
|
+
level: 'debug',
|
|
30
|
+
});
|
|
31
|
+
const fileTransport = new winston_1.default.transports.DailyRotateFile({
|
|
32
|
+
filename: path_1.default.join(config_1.default.systemLogPath, '%DATE%.log'),
|
|
33
|
+
datePattern: 'YYYY-MM-DD',
|
|
34
|
+
maxSize: '20m',
|
|
35
|
+
maxFiles: '7d',
|
|
36
|
+
format: plainFormat,
|
|
37
|
+
level: config_1.default.logs.level || 'info',
|
|
38
|
+
});
|
|
23
39
|
const LoggerInstance = winston_1.default.createLogger({
|
|
24
|
-
level:
|
|
40
|
+
level: 'debug',
|
|
25
41
|
levels: winston_1.default.config.npm.levels,
|
|
26
|
-
transports: [
|
|
27
|
-
|
|
28
|
-
],
|
|
42
|
+
transports: [consoleTransport, fileTransport],
|
|
43
|
+
exceptionHandlers: [consoleTransport, fileTransport],
|
|
44
|
+
rejectionHandlers: [consoleTransport, fileTransport],
|
|
45
|
+
});
|
|
46
|
+
LoggerInstance.on('error', (error) => {
|
|
47
|
+
console.error('Logger error:', error);
|
|
29
48
|
});
|
|
30
49
|
exports.default = LoggerInstance;
|
|
31
50
|
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getMetrics = exports.monitoringMiddleware = void 0;
|
|
7
|
+
const logger_1 = __importDefault(require("../loaders/logger"));
|
|
8
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
9
|
+
const metrics_1 = require("../services/metrics");
|
|
10
|
+
const requestMetrics = [];
|
|
11
|
+
const monitoringMiddleware = (req, res, next) => {
|
|
12
|
+
const start = perf_hooks_1.performance.now();
|
|
13
|
+
const originalEnd = res.end;
|
|
14
|
+
res.end = function (chunk, encoding, cb) {
|
|
15
|
+
const duration = perf_hooks_1.performance.now() - start;
|
|
16
|
+
const metric = {
|
|
17
|
+
method: req.method,
|
|
18
|
+
path: req.path,
|
|
19
|
+
duration,
|
|
20
|
+
statusCode: res.statusCode,
|
|
21
|
+
timestamp: Date.now(),
|
|
22
|
+
platform: req.platform,
|
|
23
|
+
};
|
|
24
|
+
requestMetrics.push(metric);
|
|
25
|
+
metrics_1.metricsService.record('http_request', duration, Object.assign({ method: req.method, path: req.path, statusCode: res.statusCode.toString() }, (req.platform && { platform: req.platform })));
|
|
26
|
+
if (requestMetrics.length > 1000) {
|
|
27
|
+
requestMetrics.shift();
|
|
28
|
+
}
|
|
29
|
+
if (duration > 1000) {
|
|
30
|
+
logger_1.default.warn(`Slow request detected: ${req.method} ${req.path} took ${duration.toFixed(2)}ms`);
|
|
31
|
+
}
|
|
32
|
+
return originalEnd.call(this, chunk, encoding, cb);
|
|
33
|
+
};
|
|
34
|
+
next();
|
|
35
|
+
};
|
|
36
|
+
exports.monitoringMiddleware = monitoringMiddleware;
|
|
37
|
+
const getMetrics = () => {
|
|
38
|
+
return {
|
|
39
|
+
totalRequests: requestMetrics.length,
|
|
40
|
+
averageDuration: requestMetrics.reduce((acc, curr) => acc + curr.duration, 0) /
|
|
41
|
+
requestMetrics.length,
|
|
42
|
+
requestsByMethod: requestMetrics.reduce((acc, curr) => {
|
|
43
|
+
acc[curr.method] = (acc[curr.method] || 0) + 1;
|
|
44
|
+
return acc;
|
|
45
|
+
}, {}),
|
|
46
|
+
requestsByPlatform: requestMetrics.reduce((acc, curr) => {
|
|
47
|
+
if (curr.platform) {
|
|
48
|
+
acc[curr.platform] = (acc[curr.platform] || 0) + 1;
|
|
49
|
+
}
|
|
50
|
+
return acc;
|
|
51
|
+
}, {}),
|
|
52
|
+
recentRequests: requestMetrics.slice(-10),
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
exports.getMetrics = getMetrics;
|
|
56
|
+
//# sourceMappingURL=monitoring.js.map
|
|
@@ -25,13 +25,6 @@ const cron_1 = __importDefault(require("../services/cron"));
|
|
|
25
25
|
typedi_1.Container.set('logger', logger_1.default);
|
|
26
26
|
const getEnvs = async (call, callback) => {
|
|
27
27
|
try {
|
|
28
|
-
if (!call.request.searchValue) {
|
|
29
|
-
return callback(null, {
|
|
30
|
-
code: 400,
|
|
31
|
-
data: [],
|
|
32
|
-
message: 'searchValue is required',
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
28
|
const envService = typedi_1.Container.get(env_1.default);
|
|
36
29
|
const data = await envService.envs(call.request.searchValue);
|
|
37
30
|
callback(null, {
|
|
@@ -60,9 +53,17 @@ const createEnv = async (call, callback) => {
|
|
|
60
53
|
};
|
|
61
54
|
exports.createEnv = createEnv;
|
|
62
55
|
const updateEnv = async (call, callback) => {
|
|
56
|
+
var _a;
|
|
63
57
|
try {
|
|
58
|
+
if (!((_a = call.request.env) === null || _a === void 0 ? void 0 : _a.id)) {
|
|
59
|
+
return callback(null, {
|
|
60
|
+
code: 400,
|
|
61
|
+
data: undefined,
|
|
62
|
+
message: 'id parameter is required',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
64
65
|
const envService = typedi_1.Container.get(env_1.default);
|
|
65
|
-
const data = await envService.update((0, pick_1.default)(call.request.env, ['id', 'name', 'value', '
|
|
66
|
+
const data = await envService.update((0, pick_1.default)(call.request.env, ['id', 'name', 'value', 'remarks']));
|
|
66
67
|
callback(null, { code: 200, data });
|
|
67
68
|
}
|
|
68
69
|
catch (e) {
|
|
@@ -72,6 +73,12 @@ const updateEnv = async (call, callback) => {
|
|
|
72
73
|
exports.updateEnv = updateEnv;
|
|
73
74
|
const deleteEnvs = async (call, callback) => {
|
|
74
75
|
try {
|
|
76
|
+
if (!call.request.ids || call.request.ids.length === 0) {
|
|
77
|
+
return callback(null, {
|
|
78
|
+
code: 400,
|
|
79
|
+
message: 'ids parameter is required',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
75
82
|
const envService = typedi_1.Container.get(env_1.default);
|
|
76
83
|
await envService.remove(call.request.ids);
|
|
77
84
|
callback(null, { code: 200 });
|
|
@@ -83,6 +90,13 @@ const deleteEnvs = async (call, callback) => {
|
|
|
83
90
|
exports.deleteEnvs = deleteEnvs;
|
|
84
91
|
const moveEnv = async (call, callback) => {
|
|
85
92
|
try {
|
|
93
|
+
if (!call.request.id) {
|
|
94
|
+
return callback(null, {
|
|
95
|
+
code: 400,
|
|
96
|
+
data: undefined,
|
|
97
|
+
message: 'id parameter is required',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
86
100
|
const envService = typedi_1.Container.get(env_1.default);
|
|
87
101
|
const data = await envService.move(call.request.id, {
|
|
88
102
|
fromIndex: call.request.fromIndex,
|
|
@@ -97,6 +111,12 @@ const moveEnv = async (call, callback) => {
|
|
|
97
111
|
exports.moveEnv = moveEnv;
|
|
98
112
|
const disableEnvs = async (call, callback) => {
|
|
99
113
|
try {
|
|
114
|
+
if (!call.request.ids || call.request.ids.length === 0) {
|
|
115
|
+
return callback(null, {
|
|
116
|
+
code: 400,
|
|
117
|
+
message: 'ids parameter is required',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
100
120
|
const envService = typedi_1.Container.get(env_1.default);
|
|
101
121
|
await envService.disabled(call.request.ids);
|
|
102
122
|
callback(null, { code: 200 });
|
|
@@ -108,6 +128,12 @@ const disableEnvs = async (call, callback) => {
|
|
|
108
128
|
exports.disableEnvs = disableEnvs;
|
|
109
129
|
const enableEnvs = async (call, callback) => {
|
|
110
130
|
try {
|
|
131
|
+
if (!call.request.ids || call.request.ids.length === 0) {
|
|
132
|
+
return callback(null, {
|
|
133
|
+
code: 400,
|
|
134
|
+
message: 'ids parameter is required',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
111
137
|
const envService = typedi_1.Container.get(env_1.default);
|
|
112
138
|
await envService.enabled(call.request.ids);
|
|
113
139
|
callback(null, { code: 200 });
|
|
@@ -119,6 +145,12 @@ const enableEnvs = async (call, callback) => {
|
|
|
119
145
|
exports.enableEnvs = enableEnvs;
|
|
120
146
|
const updateEnvNames = async (call, callback) => {
|
|
121
147
|
try {
|
|
148
|
+
if (!call.request.ids || call.request.ids.length === 0) {
|
|
149
|
+
return callback(null, {
|
|
150
|
+
code: 400,
|
|
151
|
+
message: 'ids parameter is required',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
122
154
|
const envService = typedi_1.Container.get(env_1.default);
|
|
123
155
|
await envService.updateNames({
|
|
124
156
|
ids: call.request.ids,
|
|
@@ -133,6 +165,13 @@ const updateEnvNames = async (call, callback) => {
|
|
|
133
165
|
exports.updateEnvNames = updateEnvNames;
|
|
134
166
|
const getEnvById = async (call, callback) => {
|
|
135
167
|
try {
|
|
168
|
+
if (!call.request.id) {
|
|
169
|
+
return callback(null, {
|
|
170
|
+
code: 400,
|
|
171
|
+
data: undefined,
|
|
172
|
+
message: 'id parameter is required',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
136
175
|
const envService = typedi_1.Container.get(env_1.default);
|
|
137
176
|
const data = await envService.getDb({ id: call.request.id });
|
|
138
177
|
callback(null, {
|
|
@@ -8,7 +8,7 @@ const cron_1 = require("../protos/cron");
|
|
|
8
8
|
const config_1 = __importDefault(require("../config"));
|
|
9
9
|
class Client {
|
|
10
10
|
constructor() {
|
|
11
|
-
this.client = new cron_1.CronClient(`0.0.0.0:${config_1.default.
|
|
11
|
+
this.client = new cron_1.CronClient(`0.0.0.0:${config_1.default.grpcPort}`, grpc_js_1.credentials.createInsecure(), { 'grpc.enable_http_proxy': 0 });
|
|
12
12
|
}
|
|
13
13
|
addCron(request) {
|
|
14
14
|
return new Promise((resolve, reject) => {
|
|
@@ -58,6 +58,9 @@ let CronService = class CronService {
|
|
|
58
58
|
const tab = new cron_1.Crontab(payload);
|
|
59
59
|
tab.saved = false;
|
|
60
60
|
const doc = await this.insert(tab);
|
|
61
|
+
if ((0, util_1.isDemoEnv)()) {
|
|
62
|
+
return doc;
|
|
63
|
+
}
|
|
61
64
|
if (!this.isSpecialSchedule(doc.schedule)) {
|
|
62
65
|
await client_1.default.addCron([
|
|
63
66
|
{
|
|
@@ -80,7 +83,7 @@ let CronService = class CronService {
|
|
|
80
83
|
const tab = new cron_1.Crontab(Object.assign(Object.assign({}, doc), payload));
|
|
81
84
|
tab.saved = false;
|
|
82
85
|
const newDoc = await this.updateDb(tab);
|
|
83
|
-
if (doc.isDisabled === 1) {
|
|
86
|
+
if (doc.isDisabled === 1 || (0, util_1.isDemoEnv)()) {
|
|
84
87
|
return newDoc;
|
|
85
88
|
}
|
|
86
89
|
await client_1.default.delCron([String(newDoc.id)]);
|
|
@@ -444,6 +447,9 @@ let CronService = class CronService {
|
|
|
444
447
|
command: this.makeCommand(doc),
|
|
445
448
|
extra_schedules: doc.extra_schedules || [],
|
|
446
449
|
}));
|
|
450
|
+
if ((0, util_1.isDemoEnv)()) {
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
447
453
|
await client_1.default.addCron(crons);
|
|
448
454
|
await this.setCrontab();
|
|
449
455
|
}
|
|
@@ -506,11 +512,8 @@ let CronService = class CronService {
|
|
|
506
512
|
const tabs = data !== null && data !== void 0 ? data : (await this.crontabs());
|
|
507
513
|
var crontab_string = '';
|
|
508
514
|
tabs.data.forEach((tab) => {
|
|
509
|
-
var _a;
|
|
510
|
-
const _schedule = tab.schedule && tab.schedule.split(/ +/);
|
|
511
515
|
if (tab.isDisabled === 1 ||
|
|
512
|
-
|
|
513
|
-
((_a = tab.extra_schedules) === null || _a === void 0 ? void 0 : _a.length) ||
|
|
516
|
+
this.isNodeCron(tab) ||
|
|
514
517
|
this.isSpecialSchedule(tab.schedule)) {
|
|
515
518
|
crontab_string += '# ';
|
|
516
519
|
crontab_string += tab.schedule;
|
|
@@ -558,7 +561,6 @@ let CronService = class CronService {
|
|
|
558
561
|
}
|
|
559
562
|
async autosave_crontab() {
|
|
560
563
|
const tabs = await this.crontabs();
|
|
561
|
-
this.setCrontab(tabs);
|
|
562
564
|
const regularCrons = tabs.data
|
|
563
565
|
.filter((x) => x.isDisabled !== 1 && !this.isSpecialSchedule(x.schedule))
|
|
564
566
|
.map((doc) => ({
|
|
@@ -568,7 +570,11 @@ let CronService = class CronService {
|
|
|
568
570
|
command: this.makeCommand(doc),
|
|
569
571
|
extra_schedules: doc.extra_schedules || [],
|
|
570
572
|
}));
|
|
573
|
+
if ((0, util_1.isDemoEnv)()) {
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
571
576
|
await client_1.default.addCron(regularCrons);
|
|
577
|
+
this.setCrontab(tabs);
|
|
572
578
|
}
|
|
573
579
|
async bootTask() {
|
|
574
580
|
const tabs = await this.crontabs();
|