@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.
Files changed (92) hide show
  1. package/.env.example +7 -9
  2. package/docker/310.Dockerfile +18 -9
  3. package/docker/Dockerfile +18 -9
  4. package/docker/docker-entrypoint.sh +14 -15
  5. package/docker/front.conf +0 -32
  6. package/ecosystem.config.js +5 -25
  7. package/package.json +9 -11
  8. package/sample/notify.js +5 -3
  9. package/shell/check.sh +0 -2
  10. package/shell/preload/sitecustomize.js +38 -15
  11. package/shell/preload/sitecustomize.py +42 -18
  12. package/shell/share.sh +23 -75
  13. package/shell/update.sh +21 -20
  14. package/static/build/api/health.js +32 -0
  15. package/static/build/api/index.js +4 -0
  16. package/static/build/api/log.js +1 -1
  17. package/static/build/api/script.js +2 -3
  18. package/static/build/api/system.js +1 -0
  19. package/static/build/api/update.js +47 -0
  20. package/static/build/api/user.js +2 -2
  21. package/static/build/app.js +70 -21
  22. package/static/build/config/const.js +2 -1
  23. package/static/build/config/index.js +32 -25
  24. package/static/build/config/util.js +72 -89
  25. package/static/build/data/dependence.js +1 -13
  26. package/static/build/data/notify.js +1 -0
  27. package/static/build/loaders/app.js +7 -9
  28. package/static/build/loaders/db.js +1 -3
  29. package/static/build/loaders/express.js +1 -9
  30. package/static/build/loaders/initData.js +7 -8
  31. package/static/build/loaders/initFile.js +0 -1
  32. package/static/build/loaders/logger.js +34 -15
  33. package/static/build/middlewares/monitoring.js +56 -0
  34. package/static/build/schedule/api.js +47 -8
  35. package/static/build/schedule/client.js +1 -1
  36. package/static/build/services/cron.js +12 -6
  37. package/static/build/services/dependence.js +10 -9
  38. package/static/build/services/grpc.js +97 -0
  39. package/static/build/services/health.js +74 -0
  40. package/static/build/services/http.js +68 -0
  41. package/static/build/services/metrics.js +82 -0
  42. package/static/build/services/notify.js +3 -3
  43. package/static/build/services/system.js +8 -1
  44. package/static/build/services/user.js +21 -5
  45. package/static/build/shared/pLimit.js +13 -1
  46. package/static/dist/{2208.03c2cf4a.async.js → 2208.98ccac5f.async.js} +1 -1
  47. package/static/dist/8826.faecf076.async.js +1 -0
  48. package/static/dist/8851.cf7e0ebc.async.js +1 -0
  49. package/static/dist/index.html +2 -2
  50. package/static/dist/layouts__index.6e23431c.async.js +1 -0
  51. package/static/dist/{preload_helper.1b1a7a9f.js → preload_helper.67e88ed6.js} +1 -1
  52. package/static/dist/{src__pages__crontab__index.5eb33581.async.js → src__pages__crontab__index.d6d37f6a.async.js} +1 -1
  53. package/static/dist/{src__pages__crontab__modal.b20074c2.async.js → src__pages__crontab__modal.dcd053b5.async.js} +1 -1
  54. package/static/dist/src__pages__dependence__modal.7f588c0b.async.js +1 -0
  55. package/static/dist/src__pages__env__editNameModal.411043e2.async.js +1 -0
  56. package/static/dist/{src__pages__env__modal.d923acdb.async.js → src__pages__env__modal.7d952f26.async.js} +1 -1
  57. package/static/dist/src__pages__error__index.837f4753.async.js +1 -0
  58. package/static/dist/{src__pages__initialization__index.684197ee.async.js → src__pages__initialization__index.5bd471c5.async.js} +1 -1
  59. package/static/dist/src__pages__script__editNameModal.32bb2f80.async.js +1 -0
  60. package/static/dist/src__pages__script__index.53f99bee.async.js +1 -0
  61. package/static/dist/{src__pages__script__renameModal.09dfb133.async.js → src__pages__script__renameModal.8232c924.async.js} +1 -1
  62. package/static/dist/{src__pages__script__saveModal.21b81bcc.async.js → src__pages__script__saveModal.8e358e84.async.js} +1 -1
  63. package/static/dist/{src__pages__script__setting.c6503aaf.async.js → src__pages__script__setting.dcdd7253.async.js} +1 -1
  64. package/static/dist/{src__pages__setting__appModal.b115baf8.async.js → src__pages__setting__appModal.25adf30e.async.js} +1 -1
  65. package/static/dist/src__pages__setting__dependence.95dd01e7.async.js +1 -0
  66. package/static/dist/src__pages__setting__index.3b426f9f.async.js +1 -0
  67. package/static/dist/src__pages__setting__notification.989e57d6.async.js +1 -0
  68. package/static/dist/src__pages__setting__security.7623a492.async.js +1 -0
  69. package/static/dist/src__pages__setting__systemLog.2e8cc7a0.async.js +1 -0
  70. package/static/dist/src__pages__subscription__modal.46a69195.async.js +1 -0
  71. package/static/dist/{umi.32588872.js → umi.b7656bb3.js} +1 -1
  72. package/version.yaml +12 -6
  73. package/back.d.ts +0 -9
  74. package/other.config.js +0 -13
  75. package/static/build/loaders/update.js +0 -79
  76. package/static/build/public.js +0 -34
  77. package/static/build/schedule/index.js +0 -52
  78. package/static/build/update.js +0 -29
  79. package/static/dist/8826.b3f9fa78.async.js +0 -1
  80. package/static/dist/8851.a57942be.async.js +0 -1
  81. package/static/dist/layouts__index.623b87d2.async.js +0 -1
  82. package/static/dist/src__pages__dependence__modal.1bb8572d.async.js +0 -1
  83. package/static/dist/src__pages__env__editNameModal.115bb8ea.async.js +0 -1
  84. package/static/dist/src__pages__error__index.a17578c5.async.js +0 -1
  85. package/static/dist/src__pages__script__editNameModal.7d1cc6b4.async.js +0 -1
  86. package/static/dist/src__pages__script__index.0cd08dcd.async.js +0 -1
  87. package/static/dist/src__pages__setting__dependence.f3afc194.async.js +0 -1
  88. package/static/dist/src__pages__setting__index.34ed674c.async.js +0 -1
  89. package/static/dist/src__pages__setting__notification.b7722a0b.async.js +0 -1
  90. package/static/dist/src__pages__setting__security.534a5e67.async.js +0 -1
  91. package/static/dist/src__pages__setting__systemLog.cb8a2174.async.js +0 -1
  92. 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.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.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 pstree_remy_1 = __importDefault(require("pstree.remy"));
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 relativePath = path.relative(baseDir, dir);
305
- const files = await fs.readdir(dir);
306
- const result = files
307
- .filter((x) => !blacklist.includes(x))
308
- .map(async (file) => {
309
- const subPath = path.join(dir, file);
310
- const stats = await fs.lstat(subPath);
311
- const key = path.join(relativePath, file);
312
- return {
313
- title: file,
314
- type: stats.isDirectory() ? 'directory' : 'file',
315
- key,
316
- parent: relativePath,
317
- };
318
- });
319
- return result;
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, pstree_remy_1.default)(pid, (err, pids) => {
368
+ (0, ps_tree_1.default)(pid, (err, children) => {
412
369
  if (err) {
413
370
  reject(err);
414
371
  }
415
- resolve(pids.filter((x) => !isNaN(x)));
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.unInstallDependenceCommandTypes = exports.versionDependenceCommandTypes = exports.GetDependenceCommandTypes = exports.InstallDependenceCommandTypes = exports.DependenceTypes = exports.DependenceStatus = exports.Dependence = void 0;
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,
@@ -160,6 +160,7 @@ class EmailNotification extends NotificationBaseInfo {
160
160
  this.emailService = '';
161
161
  this.emailUser = '';
162
162
  this.emailPass = '';
163
+ this.emailTo = '';
163
164
  }
164
165
  }
165
166
  exports.EmailNotification = EmailNotification;
@@ -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
- exports.default = async ({ expressApp }) => {
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
- console.log('✌️ Link deps loaded');
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
- console.log('✌️ Init task loaded');
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
- console.error('✌️ DB load failed');
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) {
@@ -115,6 +115,5 @@ exports.default = async () => {
115
115
  }
116
116
  }
117
117
  logger_1.default.info('✌️ Init file down');
118
- console.log('✌️ Init file down');
119
118
  };
120
119
  //# sourceMappingURL=initFile.js.map
@@ -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: '\ue6f5',
12
- warn: '\ue880',
13
- error: '\ue602',
14
- debug: '\ue67f'
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: config_1.default.logs.level,
40
+ level: 'debug',
25
41
  levels: winston_1.default.config.npm.levels,
26
- transports: [
27
- new winston_1.default.transports.DailyRotateFile(Object.assign({ filename: path_1.default.join(config_1.default.systemLogPath, '%DATE%.log') }, defaultOptions))
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', 'remark']));
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.cronPort}`, grpc_js_1.credentials.createInsecure(), { 'grpc.enable_http_proxy': 0 });
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
- _schedule.length !== 5 ||
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();