@whyour/qinglong 2.18.2-3 → 2.18.2-6

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 (176) hide show
  1. package/package.json +4 -4
  2. package/shell/preload/client.js +149 -40
  3. package/shell/preload/client.py +200 -30
  4. package/shell/preload/sitecustomize.js +1 -1
  5. package/shell/preload/sitecustomize.py +1 -1
  6. package/shell/share.sh +1 -1
  7. package/shell/update.sh +4 -1
  8. package/static/build/api/cron.js +10 -40
  9. package/static/build/api/system.js +15 -0
  10. package/static/build/app.js +1 -0
  11. package/static/build/config/index.js +2 -2
  12. package/static/build/config/util.js +17 -2
  13. package/static/build/data/notify.js +5 -6
  14. package/static/build/interface/schedule.js +9 -0
  15. package/static/build/loaders/bootAfter.js +12 -0
  16. package/static/build/loaders/initFile.js +2 -2
  17. package/static/build/loaders/initTask.js +14 -11
  18. package/static/build/protos/api.js +1285 -168
  19. package/static/build/protos/cron.js +46 -41
  20. package/static/build/protos/health.js +12 -13
  21. package/static/build/schedule/addCron.js +5 -5
  22. package/static/build/schedule/api.js +86 -1
  23. package/static/build/services/cron.js +70 -32
  24. package/static/build/services/notify.js +3 -4
  25. package/static/build/services/system.js +16 -1
  26. package/static/build/services/user.js +2 -1
  27. package/static/build/validation/schedule.js +42 -0
  28. package/static/dist/1134.b851963c.async.js +1 -0
  29. package/static/dist/1174.41a43fee.async.js +1 -0
  30. package/static/dist/1212.f87fd07a.async.js +1 -0
  31. package/static/dist/1706.ac98cb3f.async.js +1 -0
  32. package/static/dist/1887.9e0d3da8.async.js +1 -0
  33. package/static/dist/1969.d61ba5fb.async.js +1 -0
  34. package/static/dist/198.db47fc1a.async.js +1 -0
  35. package/static/dist/2003.8eafeca8.async.js +1 -0
  36. package/static/dist/2208.03c2cf4a.async.js +1 -0
  37. package/static/dist/2231.29b754cf.async.js +1 -0
  38. package/static/dist/2336.0756f45f.async.js +1 -0
  39. package/static/dist/2506.a6334794.async.js +1 -0
  40. package/static/dist/2577.aa8fe709.async.js +1 -0
  41. package/static/dist/2636.70ece391.async.js +1 -0
  42. package/static/dist/2750.7aa38add.async.js +1 -0
  43. package/static/dist/2783.0787fd60.async.js +1 -0
  44. package/static/dist/2843.e968a7af.async.js +1 -0
  45. package/static/dist/2905.a8f810e1.async.js +1 -0
  46. package/static/dist/293.80d14a4f.async.js +1 -0
  47. package/static/dist/2958.1a7daa3c.async.js +1 -0
  48. package/static/dist/3055.a99f8e4c.async.js +1 -0
  49. package/static/dist/3617.b7d4b2ed.async.js +1 -0
  50. package/static/dist/3711.9814cb8c.async.js +1 -0
  51. package/static/dist/3730.3654e8fa.async.js +1 -0
  52. package/static/dist/3840.801ded2b.async.js +1 -0
  53. package/static/dist/4324.5a5887d1.async.js +1 -0
  54. package/static/dist/4462.02fd0a33.async.js +1 -0
  55. package/static/dist/4481.4d51cf36.async.js +1 -0
  56. package/static/dist/4507.8541bc6d.async.js +1 -0
  57. package/static/dist/4559.faab3673.async.js +1 -0
  58. package/static/dist/4756.64d6d0a4.async.js +1 -0
  59. package/static/dist/4818.c83facd7.async.js +1 -0
  60. package/static/dist/4821.64537e48.async.js +1 -0
  61. package/static/dist/{8142.e3e82eda.async.js → 4934.1ca6b6b0.async.js} +1 -1
  62. package/static/dist/4944.3be3e188.async.js +1 -0
  63. package/static/dist/5.3ebdd181.async.js +1 -0
  64. package/static/dist/5232.f4b06476.async.js +1 -0
  65. package/static/dist/5325.54777fe5.async.js +1 -0
  66. package/static/dist/5363.2fedc735.async.js +1 -0
  67. package/static/dist/5436.f2e37c36.async.js +1 -0
  68. package/static/dist/5580.48b4722f.async.js +1 -0
  69. package/static/dist/5662.678b0cfb.async.js +1 -0
  70. package/static/dist/5759.45438497.async.js +1 -0
  71. package/static/dist/5876.93680102.async.js +1 -0
  72. package/static/dist/5878.32535c39.async.js +1 -0
  73. package/static/dist/591.1c6b5df7.async.js +1 -0
  74. package/static/dist/6367.8b0e838c.async.js +1 -0
  75. package/static/dist/6431.c50479be.async.js +1 -0
  76. package/static/dist/6437.91ff515b.async.js +1 -0
  77. package/static/dist/6598.01b8b308.async.js +1 -0
  78. package/static/dist/6711.84451b08.async.js +1 -0
  79. package/static/dist/6841.e92e9802.async.js +1 -0
  80. package/static/dist/685.2419bacf.async.js +1 -0
  81. package/static/dist/7036.fdeb74d0.async.js +1 -0
  82. package/static/dist/7272.1c73bcc5.async.js +1 -0
  83. package/static/dist/7278.96bf439f.async.js +1 -0
  84. package/static/dist/752.66fdc531.async.js +1 -0
  85. package/static/dist/7540.6bb57f5f.async.js +1 -0
  86. package/static/dist/7647.e9446154.async.js +1 -0
  87. package/static/dist/7661.6684ddda.async.js +1 -0
  88. package/static/dist/7714.1e826854.async.js +1 -0
  89. package/static/dist/7846.7d689939.async.js +1 -0
  90. package/static/dist/7993.ed86bf44.async.js +1 -0
  91. package/static/dist/8025.7dc65c6a.async.js +1 -0
  92. package/static/dist/8038.58b0571f.async.js +1 -0
  93. package/static/dist/8080.056470f6.async.js +1 -0
  94. package/static/dist/8142.a074ddf1.async.js +1 -0
  95. package/static/dist/831.9756b44d.async.js +1 -0
  96. package/static/dist/8315.3c15bde0.async.js +1 -0
  97. package/static/dist/8394.452e865e.async.js +1 -0
  98. package/static/dist/8416.69691e31.async.js +1 -0
  99. package/static/dist/8526.bb556c43.async.js +1 -0
  100. package/static/dist/8682.597beedb.async.js +1 -0
  101. package/static/dist/8776.e8798a5a.async.js +1 -0
  102. package/static/dist/8779.3e755010.async.js +1 -0
  103. package/static/dist/8826.b3f9fa78.async.js +1 -0
  104. package/static/dist/8851.a57942be.async.js +1 -0
  105. package/static/dist/8878.8367da80.async.js +1 -0
  106. package/static/dist/9033.f2e29d04.async.js +1 -0
  107. package/static/dist/9082.9f6c6520.async.js +1 -0
  108. package/static/dist/9095.816eeb1a.async.js +1 -0
  109. package/static/dist/9187.4bacb25e.async.js +1 -0
  110. package/static/dist/9308.3202ac13.async.js +1 -0
  111. package/static/dist/9674.1b962b29.chunk.css +1 -0
  112. package/static/dist/9674.962a6cda.async.js +1 -0
  113. package/static/dist/9853.695fdd64.async.js +1 -0
  114. package/static/dist/9974.c867bc89.async.js +1 -0
  115. package/static/dist/index.html +2 -2
  116. package/static/dist/{layouts__index.c986408d.async.js → layouts__index.623b87d2.async.js} +1 -1
  117. package/static/dist/preload_helper.68e6986a.js +1 -0
  118. package/static/dist/{src__pages__config__index.de6dca30.async.js → src__pages__config__index.622b6ee8.async.js} +1 -1
  119. package/static/dist/src__pages__crontab__const.323d5124.async.js +1 -0
  120. package/static/dist/{src__pages__crontab__detail.80d30a01.async.js → src__pages__crontab__detail.c7d28d13.async.js} +1 -1
  121. package/static/dist/src__pages__crontab__index.b6a281d6.async.js +1 -0
  122. package/static/dist/{src__pages__crontab__logModal.6a345e8a.async.js → src__pages__crontab__logModal.0767c532.async.js} +1 -1
  123. package/static/dist/src__pages__crontab__modal.b20074c2.async.js +1 -0
  124. package/static/dist/src__pages__crontab__type.db7c1858.async.js +1 -0
  125. package/static/dist/src__pages__dependence__modal.1bb8572d.async.js +1 -0
  126. package/static/dist/{src__pages__diff__index.a4176b58.async.js → src__pages__diff__index.013b7c75.async.js} +1 -1
  127. package/static/dist/src__pages__env__editNameModal.115bb8ea.async.js +1 -0
  128. package/static/dist/{src__pages__env__index.f3bfe0c7.async.js → src__pages__env__index.7205e719.async.js} +1 -1
  129. package/static/dist/{src__pages__env__modal.066399fd.async.js → src__pages__env__modal.d923acdb.async.js} +1 -1
  130. package/static/dist/{src__pages__error__index.656c9940.async.js → src__pages__error__index.a17578c5.async.js} +1 -1
  131. package/static/dist/{src__pages__initialization__index.75484c39.async.js → src__pages__initialization__index.684197ee.async.js} +1 -1
  132. package/static/dist/{src__pages__log__index.8a782756.async.js → src__pages__log__index.43024b22.async.js} +1 -1
  133. package/static/dist/{src__pages__login__index.8a653852.async.js → src__pages__login__index.cd6e3152.async.js} +1 -1
  134. package/static/dist/{src__pages__script__editModal.e7bf71bd.async.js → src__pages__script__editModal.10dd9857.async.js} +1 -1
  135. package/static/dist/src__pages__script__editNameModal.7d1cc6b4.async.js +1 -0
  136. package/static/dist/src__pages__script__index.1d172186.async.js +1 -0
  137. package/static/dist/src__pages__script__renameModal.09dfb133.async.js +1 -0
  138. package/static/dist/src__pages__script__saveModal.21b81bcc.async.js +1 -0
  139. package/static/dist/src__pages__script__setting.c6503aaf.async.js +1 -0
  140. package/static/dist/{src__pages__setting__about.f6325812.chunk.css → src__pages__setting__about.e6db5090.chunk.css} +1 -1
  141. package/static/dist/src__pages__setting__appModal.b115baf8.async.js +1 -0
  142. package/static/dist/{src__pages__setting__checkUpdate.04c00c9c.async.js → src__pages__setting__checkUpdate.c152dfaf.async.js} +1 -1
  143. package/static/dist/{src__pages__setting__dependence.55c598d0.chunk.css → src__pages__setting__dependence.28ecea01.chunk.css} +1 -1
  144. package/static/dist/{src__pages__setting__dependence.0dd0969b.async.js → src__pages__setting__dependence.f3afc194.async.js} +1 -1
  145. package/static/dist/{src__pages__setting__index.d666f8ec.chunk.css → src__pages__setting__index.7cf46d4a.chunk.css} +1 -1
  146. package/static/dist/src__pages__setting__index.f6051186.async.js +1 -0
  147. package/static/dist/{src__pages__setting__notification.b038afec.async.js → src__pages__setting__notification.b7722a0b.async.js} +1 -1
  148. package/static/dist/{src__pages__setting__other.55c598d0.chunk.css → src__pages__setting__other.28ecea01.chunk.css} +1 -1
  149. package/static/dist/src__pages__setting__other.45f67bd2.async.js +1 -0
  150. package/static/dist/{src__pages__setting__security.af57bd6a.async.js → src__pages__setting__security.534a5e67.async.js} +1 -1
  151. package/static/dist/{src__pages__setting__systemLog.501844bd.async.js → src__pages__setting__systemLog.cb8a2174.async.js} +1 -1
  152. package/static/dist/{src__pages__subscription__index.b43143e7.async.js → src__pages__subscription__index.30fefd8e.async.js} +1 -1
  153. package/static/dist/{src__pages__subscription__logModal.02c80eb3.async.js → src__pages__subscription__logModal.9bf0b4f6.async.js} +1 -1
  154. package/static/dist/src__pages__subscription__modal.10cd630d.async.js +1 -0
  155. package/static/dist/static/codicon.63b8ee5b.ttf +0 -0
  156. package/static/dist/{umi.e783bacd.js → umi.e6d28cd5.js} +1 -1
  157. package/version.yaml +9 -6
  158. package/static/dist/2208.c1a40612.async.js +0 -1
  159. package/static/dist/3127.2579e73a.async.js +0 -1
  160. package/static/dist/4402.49bbe98d.async.js +0 -1
  161. package/static/dist/8826.37966028.async.js +0 -1
  162. package/static/dist/preload_helper.6482f199.js +0 -1
  163. package/static/dist/src__pages__crontab__index.9e38b6dc.async.js +0 -1
  164. package/static/dist/src__pages__crontab__modal.78b1e588.async.js +0 -1
  165. package/static/dist/src__pages__crontab__type.bde5cda4.async.js +0 -1
  166. package/static/dist/src__pages__dependence__modal.e6696a7c.async.js +0 -1
  167. package/static/dist/src__pages__env__editNameModal.02322e80.async.js +0 -1
  168. package/static/dist/src__pages__script__editNameModal.c048343e.async.js +0 -1
  169. package/static/dist/src__pages__script__index.9d9099c1.async.js +0 -1
  170. package/static/dist/src__pages__script__renameModal.357c6c72.async.js +0 -1
  171. package/static/dist/src__pages__script__saveModal.61fcb1fe.async.js +0 -1
  172. package/static/dist/src__pages__script__setting.f2d78204.async.js +0 -1
  173. package/static/dist/src__pages__setting__appModal.9eeaeee7.async.js +0 -1
  174. package/static/dist/src__pages__setting__index.46a8e768.async.js +0 -1
  175. package/static/dist/src__pages__setting__other.0d869d58.async.js +0 -1
  176. package/static/dist/src__pages__subscription__modal.a61ece75.async.js +0 -1
@@ -18,6 +18,7 @@ async function startServer() {
18
18
  logger_1.default.debug(`✌️ 后端服务启动成功!`);
19
19
  console.debug(`✌️ 后端服务启动成功!`);
20
20
  (_a = process.send) === null || _a === void 0 ? void 0 : _a.call(process, 'ready');
21
+ require('./loaders/bootAfter').default();
21
22
  })
22
23
  .on('error', (err) => {
23
24
  logger_1.default.error(err);
@@ -39,8 +39,8 @@ const systemLogPath = path_1.default.join(dataPath, 'syslog/');
39
39
  const envFile = path_1.default.join(preloadPath, 'env.sh');
40
40
  const jsEnvFile = path_1.default.join(preloadPath, 'env.js');
41
41
  const pyEnvFile = path_1.default.join(preloadPath, 'env.py');
42
- const jsNotifyFile = path_1.default.join(preloadPath, 'notify.js');
43
- const pyNotifyFile = path_1.default.join(preloadPath, 'notify.py');
42
+ const jsNotifyFile = path_1.default.join(preloadPath, '__ql_notify__.js');
43
+ const pyNotifyFile = path_1.default.join(preloadPath, '__ql_notify__.py');
44
44
  const confFile = path_1.default.join(configPath, 'config.sh');
45
45
  const crontabFile = path_1.default.join(configPath, 'crontab.list');
46
46
  const authConfigFile = path_1.default.join(configPath, 'auth.json');
@@ -29,7 +29,7 @@ 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.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.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"));
@@ -485,7 +485,7 @@ function safeJSONParse(value) {
485
485
  return JSON.parse(value);
486
486
  }
487
487
  catch (error) {
488
- logger_1.default.error('[JSON.parse失败]', error);
488
+ logger_1.default.error('[safeJSONParse失败]', error);
489
489
  return {};
490
490
  }
491
491
  }
@@ -502,6 +502,21 @@ async function rmPath(path) {
502
502
  }
503
503
  }
504
504
  exports.rmPath = rmPath;
505
+ async function setSystemTimezone(timezone) {
506
+ try {
507
+ if (!(await fileExist(`/usr/share/zoneinfo/${timezone}`))) {
508
+ throw new Error('Invalid timezone');
509
+ }
510
+ await promiseExec(`ln -sf /usr/share/zoneinfo/${timezone} /etc/localtime`);
511
+ await promiseExec(`echo "${timezone}" > /etc/timezone`);
512
+ return true;
513
+ }
514
+ catch (error) {
515
+ logger_1.default.error('[setSystemTimezone失败]', error);
516
+ return false;
517
+ }
518
+ }
519
+ exports.setSystemTimezone = setSystemTimezone;
505
520
  async function getOSReleaseInfo() {
506
521
  const osRelease = await fs.readFile('/etc/os-release', 'utf8');
507
522
  return osRelease;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WxPusherBotNotification = exports.NtfyNotification = exports.LarkNotification = exports.WebhookNotification = exports.ChronocatNotification = exports.PushMeNotification = exports.EmailNotification = exports.WePlusBotNotification = exports.PushPlusNotification = exports.IGotNotification = exports.AibotkNotification = exports.WeWorkAppNotification = exports.WeWorkBotNotification = exports.DingtalkBotNotification = exports.TelegramBotNotification = exports.BarkNotification = exports.ChatNotification = exports.PushDeerNotification = exports.ServerChanNotification = exports.GoCqHttpBotNotification = exports.GotifyNotification = exports.NotificationMode = void 0;
3
+ exports.WxPusherBotNotification = exports.NtfyNotification = exports.LarkNotification = exports.WebhookNotification = exports.ChronocatNotification = exports.PushMeNotification = exports.EmailNotification = exports.WePlusBotNotification = exports.PushPlusNotification = exports.IGotNotification = exports.AibotkNotification = exports.WeWorkAppNotification = exports.WeWorkBotNotification = exports.DingtalkBotNotification = exports.TelegramBotNotification = exports.BarkNotification = exports.synologyChatNotification = exports.PushDeerNotification = exports.ServerChanNotification = exports.GoCqHttpBotNotification = exports.GotifyNotification = exports.NotificationMode = void 0;
4
4
  var NotificationMode;
5
5
  (function (NotificationMode) {
6
6
  NotificationMode["gotify"] = "gotify";
@@ -60,14 +60,13 @@ class PushDeerNotification extends NotificationBaseInfo {
60
60
  }
61
61
  }
62
62
  exports.PushDeerNotification = PushDeerNotification;
63
- class ChatNotification extends NotificationBaseInfo {
63
+ class synologyChatNotification extends NotificationBaseInfo {
64
64
  constructor() {
65
65
  super(...arguments);
66
- this.chatUrl = '';
67
- this.chatToken = '';
66
+ this.synologyChatUrl = '';
68
67
  }
69
68
  }
70
- exports.ChatNotification = ChatNotification;
69
+ exports.synologyChatNotification = synologyChatNotification;
71
70
  class BarkNotification extends NotificationBaseInfo {
72
71
  constructor() {
73
72
  super(...arguments);
@@ -77,7 +76,7 @@ class BarkNotification extends NotificationBaseInfo {
77
76
  this.barkGroup = 'qinglong';
78
77
  this.barkLevel = 'active';
79
78
  this.barkUrl = '';
80
- this.barkArchive = "";
79
+ this.barkArchive = '';
81
80
  }
82
81
  }
83
82
  exports.BarkNotification = BarkNotification;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScheduleType = void 0;
4
+ var ScheduleType;
5
+ (function (ScheduleType) {
6
+ ScheduleType["BOOT"] = "@boot";
7
+ ScheduleType["ONCE"] = "@once";
8
+ })(ScheduleType || (exports.ScheduleType = ScheduleType = {}));
9
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1,12 @@
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
+ const typedi_1 = __importDefault(require("typedi"));
7
+ const cron_1 = __importDefault(require("../services/cron"));
8
+ exports.default = async () => {
9
+ const cronService = typedi_1.default.get(cron_1.default);
10
+ await cronService.bootTask();
11
+ };
12
+ //# sourceMappingURL=bootAfter.js.map
@@ -29,8 +29,8 @@ const sampleNotifyJsFile = path_1.default.join(samplePath, 'notify.js');
29
29
  const sampleNotifyPyFile = path_1.default.join(samplePath, 'notify.py');
30
30
  const scriptNotifyJsFile = path_1.default.join(scriptPath, 'sendNotify.js');
31
31
  const scriptNotifyPyFile = path_1.default.join(scriptPath, 'notify.py');
32
- const jsNotifyFile = path_1.default.join(preloadPath, 'notify.js');
33
- const pyNotifyFile = path_1.default.join(preloadPath, 'notify.py');
32
+ const jsNotifyFile = path_1.default.join(preloadPath, '__ql_notify__.js');
33
+ const pyNotifyFile = path_1.default.join(preloadPath, '__ql_notify__.py');
34
34
  const TaskBeforeFile = path_1.default.join(configPath, 'task_before.sh');
35
35
  const TaskBeforeJsFile = path_1.default.join(configPath, 'task_before.js');
36
36
  const TaskBeforePyFile = path_1.default.join(configPath, 'task_before.py');
@@ -32,17 +32,20 @@ exports.default = async () => {
32
32
  }, true);
33
33
  // 运行删除日志任务
34
34
  const data = await systemService.getSystemConfig();
35
- if (data && data.info && data.info.logRemoveFrequency) {
36
- const rmlogCron = {
37
- id: data.id,
38
- name: '删除日志',
39
- command: `ql rmlog ${data.info.logRemoveFrequency}`,
40
- runOrigin: 'system',
41
- };
42
- await scheduleService.cancelIntervalTask(rmlogCron);
43
- scheduleService.createIntervalTask(rmlogCron, {
44
- days: data.info.logRemoveFrequency,
45
- }, true);
35
+ if (data && data.info) {
36
+ if (data.info.logRemoveFrequency) {
37
+ const rmlogCron = {
38
+ id: data.id,
39
+ name: '删除日志',
40
+ command: `ql rmlog ${data.info.logRemoveFrequency}`,
41
+ runOrigin: 'system',
42
+ };
43
+ await scheduleService.cancelIntervalTask(rmlogCron);
44
+ scheduleService.createIntervalTask(rmlogCron, {
45
+ days: data.info.logRemoveFrequency,
46
+ }, true);
47
+ }
48
+ systemService.updateTimezone(data.info);
46
49
  }
47
50
  await subscriptionService.setSshConfig();
48
51
  const subs = await subscriptionService.list();