@whyour/qinglong 2.18.3-3 → 2.19.0-0
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 -20
- 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 +67 -0
- package/static/build/services/metrics.js +82 -0
- package/static/build/services/notify.js +2 -2
- package/static/build/services/system.js +8 -1
- package/static/build/services/user.js +11 -4
- 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,21 @@ 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.getNetIp = exports.getToken = exports.getLastModifyFilePath = exports.removeAnsi = exports.getFileContentByName = void 0;
|
|
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.getNetIp = 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
35
|
const got_1 = __importDefault(require("got"));
|
|
36
36
|
const iconv_lite_1 = __importDefault(require("iconv-lite"));
|
|
37
37
|
const child_process_1 = require("child_process");
|
|
38
38
|
const form_data_1 = __importDefault(require("form-data"));
|
|
39
|
-
const
|
|
39
|
+
const ps_tree_1 = __importDefault(require("ps-tree"));
|
|
40
40
|
const util_1 = require("util");
|
|
41
41
|
const js_yaml_1 = require("js-yaml");
|
|
42
42
|
const index_1 = __importDefault(require("./index"));
|
|
43
43
|
const const_1 = require("./const");
|
|
44
44
|
const logger_1 = __importDefault(require("../loaders/logger"));
|
|
45
45
|
const utils_1 = require("../shared/utils");
|
|
46
|
+
const dependence_1 = require("../data/dependence");
|
|
46
47
|
const os_1 = __importDefault(require("os"));
|
|
47
48
|
__exportStar(require("./share"), exports);
|
|
48
49
|
let osType;
|
|
@@ -301,22 +302,47 @@ async function readDirs(dir, baseDir = '', blacklist = [], sort = dirSort) {
|
|
|
301
302
|
}
|
|
302
303
|
exports.readDirs = readDirs;
|
|
303
304
|
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
|
-
|
|
305
|
+
const absoluteDir = path.join(baseDir, dir);
|
|
306
|
+
const relativePath = path.relative(baseDir, absoluteDir);
|
|
307
|
+
try {
|
|
308
|
+
const files = await fs.readdir(absoluteDir);
|
|
309
|
+
const result = [];
|
|
310
|
+
for (const file of files) {
|
|
311
|
+
const subPath = path.join(absoluteDir, file);
|
|
312
|
+
const stats = await fs.lstat(subPath);
|
|
313
|
+
const key = path.join(relativePath, file);
|
|
314
|
+
if (blacklist.includes(file) || stats.isSymbolicLink()) {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (stats.isDirectory()) {
|
|
318
|
+
result.push({
|
|
319
|
+
title: file,
|
|
320
|
+
type: 'directory',
|
|
321
|
+
key,
|
|
322
|
+
parent: relativePath,
|
|
323
|
+
createTime: stats.birthtime.getTime(),
|
|
324
|
+
children: [],
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
result.push({
|
|
329
|
+
title: file,
|
|
330
|
+
type: 'file',
|
|
331
|
+
key,
|
|
332
|
+
parent: relativePath,
|
|
333
|
+
size: stats.size,
|
|
334
|
+
createTime: stats.birthtime.getTime(),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return result;
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
if (error.code === 'ENOENT') {
|
|
342
|
+
return [];
|
|
343
|
+
}
|
|
344
|
+
throw error;
|
|
345
|
+
}
|
|
320
346
|
}
|
|
321
347
|
exports.readDir = readDir;
|
|
322
348
|
async function promiseExec(command) {
|
|
@@ -408,11 +434,11 @@ function parseBody(body, contentType, valueFormatFn) {
|
|
|
408
434
|
exports.parseBody = parseBody;
|
|
409
435
|
function psTree(pid) {
|
|
410
436
|
return new Promise((resolve, reject) => {
|
|
411
|
-
(0,
|
|
437
|
+
(0, ps_tree_1.default)(pid, (err, children) => {
|
|
412
438
|
if (err) {
|
|
413
439
|
reject(err);
|
|
414
440
|
}
|
|
415
|
-
resolve(
|
|
441
|
+
resolve(children.map((x) => Number(x.PID)).filter((x) => !isNaN(x)));
|
|
416
442
|
});
|
|
417
443
|
});
|
|
418
444
|
}
|
|
@@ -517,6 +543,32 @@ async function setSystemTimezone(timezone) {
|
|
|
517
543
|
}
|
|
518
544
|
}
|
|
519
545
|
exports.setSystemTimezone = setSystemTimezone;
|
|
546
|
+
function getInstallCommand(type, name) {
|
|
547
|
+
const baseCommands = {
|
|
548
|
+
[dependence_1.DependenceTypes.nodejs]: 'pnpm add -g',
|
|
549
|
+
[dependence_1.DependenceTypes.python3]: 'pip3 install --disable-pip-version-check --root-user-action=ignore',
|
|
550
|
+
[dependence_1.DependenceTypes.linux]: 'apt install -y',
|
|
551
|
+
};
|
|
552
|
+
let command = baseCommands[type];
|
|
553
|
+
if (type === dependence_1.DependenceTypes.python3 && const_1.PYTHON_INSTALL_DIR) {
|
|
554
|
+
command = `${command} --prefix=${const_1.PYTHON_INSTALL_DIR}`;
|
|
555
|
+
}
|
|
556
|
+
return `${command} ${name.trim()}`;
|
|
557
|
+
}
|
|
558
|
+
exports.getInstallCommand = getInstallCommand;
|
|
559
|
+
function getUninstallCommand(type, name) {
|
|
560
|
+
const baseCommands = {
|
|
561
|
+
[dependence_1.DependenceTypes.nodejs]: 'pnpm remove -g',
|
|
562
|
+
[dependence_1.DependenceTypes.python3]: 'pip3 uninstall --disable-pip-version-check --root-user-action=ignore -y',
|
|
563
|
+
[dependence_1.DependenceTypes.linux]: 'apt remove -y',
|
|
564
|
+
};
|
|
565
|
+
return `${baseCommands[type]} ${name.trim()}`;
|
|
566
|
+
}
|
|
567
|
+
exports.getUninstallCommand = getUninstallCommand;
|
|
568
|
+
function isDemoEnv() {
|
|
569
|
+
return process.env.DeployEnv === 'demo';
|
|
570
|
+
}
|
|
571
|
+
exports.isDemoEnv = isDemoEnv;
|
|
520
572
|
async function getOSReleaseInfo() {
|
|
521
573
|
const osRelease = await fs.readFile('/etc/os-release', 'utf8');
|
|
522
574
|
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();
|
|
@@ -109,6 +109,7 @@ let DependenceService = class DependenceService {
|
|
|
109
109
|
docs.forEach((dep) => {
|
|
110
110
|
this.installOrUninstallDependency(dep, isInstall, force);
|
|
111
111
|
});
|
|
112
|
+
return pLimit_1.default.waitDependencyQueueDone();
|
|
112
113
|
}
|
|
113
114
|
async reInstall(ids) {
|
|
114
115
|
await dependence_1.DependenceModel.update({ status: dependence_1.DependenceStatus.queued, log: [] }, { where: { id: ids } });
|
|
@@ -120,8 +121,8 @@ let DependenceService = class DependenceService {
|
|
|
120
121
|
const docs = await dependence_1.DependenceModel.findAll({ where: { id: ids } });
|
|
121
122
|
for (const doc of docs) {
|
|
122
123
|
pLimit_1.default.removeQueuedDependency(doc);
|
|
123
|
-
let depInstallCommand =
|
|
124
|
-
let depUnInstallCommand =
|
|
124
|
+
let depInstallCommand = (0, util_1.getInstallCommand)(doc.type, doc.name);
|
|
125
|
+
let depUnInstallCommand = (0, util_1.getUninstallCommand)(doc.type, doc.name);
|
|
125
126
|
const isLinuxDependence = doc.type === dependence_1.DependenceTypes.linux;
|
|
126
127
|
if (isLinuxDependence) {
|
|
127
128
|
const osType = await (0, util_2.detectOS)();
|
|
@@ -206,13 +207,13 @@ let DependenceService = class DependenceService {
|
|
|
206
207
|
? dependence_1.DependenceStatus.installing
|
|
207
208
|
: dependence_1.DependenceStatus.removing;
|
|
208
209
|
await dependence_1.DependenceModel.update({ status }, { where: { id: depIds } });
|
|
209
|
-
let
|
|
210
|
-
?
|
|
211
|
-
:
|
|
210
|
+
let command = isInstall
|
|
211
|
+
? (0, util_1.getInstallCommand)(dependency.type, depName)
|
|
212
|
+
: (0, util_1.getUninstallCommand)(dependency.type, depName);
|
|
212
213
|
if (isLinuxDependence) {
|
|
213
|
-
|
|
214
|
-
? linuxCommand.install
|
|
215
|
-
: linuxCommand.uninstall
|
|
214
|
+
command = isInstall
|
|
215
|
+
? `${linuxCommand.install} ${depName.trim()}`
|
|
216
|
+
: `${linuxCommand.uninstall} ${depName.trim()}`;
|
|
216
217
|
}
|
|
217
218
|
const startTime = (0, dayjs_1.default)();
|
|
218
219
|
const message = `开始${actionText}依赖 ${depName},开始时间 ${startTime.format('YYYY-MM-DD HH:mm:ss')}\n\n`;
|
|
@@ -265,7 +266,7 @@ let DependenceService = class DependenceService {
|
|
|
265
266
|
const proxyStr = dependenceProxyFileExist
|
|
266
267
|
? `source ${config_1.default.dependenceProxyFile} &&`
|
|
267
268
|
: '';
|
|
268
|
-
const cp = (0, cross_spawn_1.spawn)(`${proxyStr} ${
|
|
269
|
+
const cp = (0, cross_spawn_1.spawn)(`${proxyStr} ${command}`, {
|
|
269
270
|
shell: '/bin/bash',
|
|
270
271
|
});
|
|
271
272
|
cp.stdout.on('data', async (data) => {
|