@bprotsyk/aso-core 2.1.37 → 2.1.39

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 (105) hide show
  1. package/README.md +1 -1
  2. package/lib/app/app-integration.d.ts +53 -53
  3. package/lib/app/app-integration.js +63 -63
  4. package/lib/app/app-list-item.d.ts +5 -5
  5. package/lib/app/app-list-item.js +2 -2
  6. package/lib/app/app-type.d.ts +4 -4
  7. package/lib/app/app-type.js +8 -8
  8. package/lib/app/app.d.ts +208 -290
  9. package/lib/app/app.js +156 -156
  10. package/lib/general/cloudflare-domain.d.ts +42 -42
  11. package/lib/general/cloudflare-domain.js +12 -12
  12. package/lib/general/domain.d.ts +110 -169
  13. package/lib/general/domain.js +62 -62
  14. package/lib/general/namecheap-domain.d.ts +85 -132
  15. package/lib/general/namecheap-domain.js +14 -14
  16. package/lib/general/push.d.ts +6 -6
  17. package/lib/general/push.js +2 -2
  18. package/lib/general/queue.d.ts +2 -2
  19. package/lib/general/queue.js +1 -1
  20. package/lib/general/shape.d.ts +18 -18
  21. package/lib/general/shape.js +36 -36
  22. package/lib/index.d.ts +26 -26
  23. package/lib/index.js +69 -69
  24. package/lib/keitaro/keitaro-campaign.d.ts +31 -31
  25. package/lib/keitaro/keitaro-campaign.js +5 -5
  26. package/lib/keitaro/keitaro-domain.d.ts +6 -6
  27. package/lib/keitaro/keitaro-domain.js +2 -2
  28. package/lib/keitaro/keitaro-offer.d.ts +7 -7
  29. package/lib/keitaro/keitaro-offer.js +2 -2
  30. package/lib/keitaro/keitaro-stream.d.ts +20 -20
  31. package/lib/keitaro/keitaro-stream.js +2 -2
  32. package/lib/network/keitaro/http.d.ts +2 -2
  33. package/lib/network/keitaro/http.js +12 -12
  34. package/lib/network/keitaro/keitaro-service.d.ts +50 -48
  35. package/lib/network/keitaro/keitaro-service.js +283 -293
  36. package/lib/offers/list.d.ts +42 -435
  37. package/lib/offers/list.js +12 -12
  38. package/lib/offers/offer.d.ts +91 -152
  39. package/lib/offers/offer.js +42 -42
  40. package/lib/offers/offerwall/offerwall-home-dialog-data.d.ts +6 -6
  41. package/lib/offers/offerwall/offerwall-home-dialog-data.js +2 -2
  42. package/lib/offers/offerwall/offerwall-offer.d.ts +12 -12
  43. package/lib/offers/offerwall/offerwall-offer.js +2 -2
  44. package/lib/offers/offerwall/offerwall-response.d.ts +6 -6
  45. package/lib/offers/offerwall/offerwall-response.js +2 -2
  46. package/lib/offers/offerwall/offerwall-section.d.ts +6 -6
  47. package/lib/offers/offerwall/offerwall-section.js +2 -2
  48. package/lib/offers/section.d.ts +47 -60
  49. package/lib/offers/section.js +20 -20
  50. package/lib/panel/app/upsert-flash-app-request.d.ts +31 -31
  51. package/lib/panel/app/upsert-flash-app-request.js +2 -2
  52. package/lib/panel/auth.d.ts +9 -9
  53. package/lib/panel/auth.js +2 -2
  54. package/lib/panel/flash/upsert-flash-app-request.d.ts +31 -31
  55. package/lib/panel/flash/upsert-flash-app-request.js +2 -2
  56. package/lib/panel/user.d.ts +46 -59
  57. package/lib/panel/user.js +28 -28
  58. package/lib/templates/nginx-template.conf +35 -35
  59. package/lib/templates/nginx-template.d.ts +1 -1
  60. package/lib/templates/nginx-template.js +39 -39
  61. package/lib/templates/nginx-template.ts +35 -35
  62. package/lib/utils/general.d.ts +11 -11
  63. package/lib/utils/general.js +40 -40
  64. package/lib/utils/huawei/converter.d.ts +2 -2
  65. package/lib/utils/huawei/converter.js +53 -53
  66. package/lib/utils/keitaro-utils.d.ts +13 -13
  67. package/lib/utils/keitaro-utils.js +614 -569
  68. package/lib/utils/server-util.js +303 -303
  69. package/package.json +51 -51
  70. package/src/app/app-integration.ts +66 -66
  71. package/src/app/app-list-item.ts +4 -4
  72. package/src/app/app-type.ts +3 -3
  73. package/src/app/app.ts +317 -317
  74. package/src/general/cloudflare-domain.ts +44 -44
  75. package/src/general/domain.ts +106 -106
  76. package/src/general/namecheap-domain.ts +63 -63
  77. package/src/general/push.ts +5 -5
  78. package/src/general/queue.ts +4 -4
  79. package/src/general/shape.tsx +55 -55
  80. package/src/index.ts +32 -32
  81. package/src/keitaro/keitaro-campaign.ts +35 -35
  82. package/src/keitaro/keitaro-domain.ts +5 -5
  83. package/src/keitaro/keitaro-offer.ts +6 -6
  84. package/src/keitaro/keitaro-stream.ts +19 -19
  85. package/src/network/keitaro/http.ts +8 -8
  86. package/src/network/keitaro/keitaro-service.ts +348 -364
  87. package/src/offers/list.ts +22 -19
  88. package/src/offers/offer.ts +80 -80
  89. package/src/offers/offerwall/offerwall-home-dialog-data.ts +6 -6
  90. package/src/offers/offerwall/offerwall-offer.ts +12 -12
  91. package/src/offers/offerwall/offerwall-response.ts +7 -7
  92. package/src/offers/offerwall/offerwall-section.ts +7 -7
  93. package/src/offers/section.ts +29 -29
  94. package/src/panel/app/upsert-flash-app-request.ts +39 -39
  95. package/src/panel/auth.ts +9 -9
  96. package/src/panel/user.ts +38 -38
  97. package/src/templates/nginx-template.ts +35 -35
  98. package/src/utils/data.csv +65 -65
  99. package/src/utils/general.ts +36 -36
  100. package/src/utils/huawei/converter.ts +55 -55
  101. package/src/utils/keitaro-utils.ts +717 -664
  102. package/src/utils/map-apps.json +4747 -4747
  103. package/src/utils/server-util.ts +368 -368
  104. package/src/utils/update-postbacks.js +27 -27
  105. package/tsconfig.json +20 -20
@@ -1,368 +1,368 @@
1
- // import { NodeSSH } from "node-ssh";
2
- // import ChildProcess from "child_process";
3
- // // import Client from "ssh2-sftp-client";
4
- // import fs from "fs";
5
- // import mustache from "mustache";
6
- // import path from "path";
7
- // import unzipper from 'unzipper';
8
-
9
- // const { promisify } = require("util");
10
- // const execPromise = promisify(ChildProcess.exec);
11
-
12
- // export let IP = "185.123.53.227";
13
- // export let PASSWORD = "xUA3oOX06Kfc9m12rZ";
14
- // export let HOST = "cg-main-server.com";
15
- // export let PORT = 56777;
16
-
17
- // interface FileObject {
18
- // name: string;
19
- // content: string; // Це буде Base64 закодовані дані
20
- // }
21
-
22
- // interface ISFTP {
23
- // host: string;
24
- // port: number;
25
- // username: string;
26
- // password: string;
27
- // }
28
-
29
- // export class ServerUtil {
30
- // DOMAIN_HOME = "/etc/nginx/sites-enabled";
31
-
32
- // ssh?: NodeSSH
33
- // sftpConfig?: ISFTP;
34
-
35
- // constructor(sftpConfig?: ISFTP) {
36
- // this.ssh = new NodeSSH();
37
- // this.sftpConfig = sftpConfig;
38
- // }
39
-
40
- // async connectSSH(): Promise<void> {
41
- // await this?.ssh?.connect({
42
- // host: this?.sftpConfig?.host,
43
- // port: this?.sftpConfig?.port,
44
- // username: this?.sftpConfig?.username,
45
- // password: this?.sftpConfig?.password,
46
- // });
47
- // }
48
-
49
- // async ensureConnected(): Promise<void> {
50
- // if (!this?.ssh?.isConnected()) {
51
- // await this.connectSSH(); // Підключення, якщо ще не підключено
52
- // }
53
- // }
54
-
55
-
56
- // // Выконує команду або по SSH або локально, повертаючи текст незалежно від результату (помилка чи успіх)
57
- // async exec(command: string, options?: any): Promise<string> {
58
- // await this.ensureConnected();
59
- // if (this?.ssh?.isConnected()) {
60
- // return (await this?.ssh?.execCommand(command, options)).stdout;
61
- // } else {
62
- // return await new Promise<string>((resolve) => {
63
- // execPromise(command, (err: string, stdout: string) => {
64
- // resolve(stdout);
65
- // });
66
- // });
67
- // }
68
- // }
69
-
70
- // // SSH
71
- // async generateSSHKey(): Promise<string> {
72
- // await this.exec(`ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< n`);
73
- // let sshFingerprint = await this.exec(`cat ~/.ssh/id_rsa.pub`);
74
- // return sshFingerprint;
75
- // }
76
-
77
- // // create Directories in /Var
78
- // async createDirectories(): Promise<void> {
79
- // await this.exec(`mkdir -p /var/www/ai`);
80
- // }
81
-
82
- // // install git
83
- // async installGit(): Promise<void> {
84
- // await this.exec(`apt-get update; apt-get install -y git`);
85
- // }
86
-
87
- // // add ssh to bitbucket
88
- // async addBitbucketToKnownHosts(): Promise<void> {
89
- // await this.exec(`ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts`);
90
- // }
91
-
92
- // // clone bitbucket Repository
93
- // async cloneRepository(repoName: string, targetPath: string): Promise<void> {
94
- // let gitResponse = await this.exec(
95
- // `git clone git@bitbucket.org:bprtsk/${repoName}.git`,
96
- // { cwd: targetPath }
97
- // );
98
- // if (
99
- // gitResponse.includes(
100
- // `Please make sure you have the correct access rights`
101
- // )
102
- // ) {
103
- // throw new Error(`No access to the remote repository!`);
104
- // }
105
- // }
106
-
107
- // // не знаю чи треба але додав ?
108
-
109
- // // async checkoutBranch(branch: string, repoPath: string): Promise<void> {
110
- // // await this.exec(`git checkout -b ${branch}; git branch --set-upstream-to=origin/${branch} ${branch}; git reset --hard origin/${branch};`, { cwd: repoPath });
111
- // // }
112
-
113
- // // не знаю чи треба але додав ?
114
-
115
- // // async installJava(): Promise<void> {
116
- // // await this.exec(`apt-get update; apt-get install -y default-jre default-jdk`);
117
- // // }
118
-
119
- // // install Nginx
120
-
121
- // async installNginx(): Promise<void> {
122
- // await this.exec(`apt-get update; apt-get install -y nginx`);
123
- // await this.exec(`systemctl enable nginx`);
124
- // await this.exec(`systemctl start nginx`);
125
- // }
126
-
127
- // // Nginx
128
- // async isNginxActive(): Promise<boolean> {
129
- // try {
130
- // let result = await this.exec("systemctl status nginx");
131
- // if (result.includes("Active: active")) return true;
132
- // } catch (e) {
133
- // console.error(e);
134
- // }
135
-
136
- // return false;
137
- // }
138
-
139
- // // Mongo
140
- // async isMongoActive(): Promise<boolean> {
141
- // try {
142
- // let result = await this.exec("systemctl status mongod");
143
- // if (result.includes("Active: active")) return true;
144
- // } catch (e) {
145
- // console.error(e);
146
- // }
147
-
148
- // return false;
149
- // }
150
-
151
- // mongoInstallCommand = `
152
- // echo "deb http://security.ubuntu.com/ubuntu focal-security main" | tee /etc/apt/sources.list.d/focal-security.list;
153
- // apt-get update;
154
- // apt-get install libssl1.1;
155
- // rm /etc/apt/sources.list.d/focal-security.list;
156
-
157
- // curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -;
158
- // echo "deb http://security.ubuntu.com/ubuntu impish-security main" | tee /etc/apt/sources.list.d/impish-security.list;
159
- // echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list;
160
- // apt-get update;
161
- // apt-get install -y mongodb-org;
162
- // systemctl enable mongod.service;
163
- // systemctl start mongod;
164
- // `;
165
-
166
- // // checking if nginx configuration exists
167
- // async domainNginxConfigExists(host: string): Promise<boolean> {
168
- // try {
169
- // let result = await this.exec(
170
- // `ls ${this.DOMAIN_HOME}/${host}.nginx.ssl.conf`
171
- // );
172
- // if (result.includes("No such file or directory")) return false;
173
- // } catch (e) {
174
- // console.error(e);
175
- // }
176
-
177
- // return true;
178
- // }
179
-
180
- // // checking if the ssl certificate exists
181
- // async domainNginxCertsExist(host: string): Promise<boolean> {
182
- // try {
183
- // let result = await this.exec(`ls /etc/letsencrypt/live/${host}`);
184
- // if (result.includes("No such file or directory")) return false;
185
- // } catch (e) {
186
- // console.error(e);
187
- // }
188
- // return true;
189
- // }
190
-
191
- // // Certbot CRON
192
- // async isCerbotActive(): Promise<boolean> {
193
- // try {
194
- // let result = await this.exec("which certbot");
195
- // if (result.includes("/usr/bin/certbot")) return true;
196
- // } catch (e) {
197
- // console.error(e);
198
- // }
199
-
200
- // return false;
201
- // }
202
-
203
- // // install certbot
204
- // async setupCertbot(): Promise<boolean> {
205
- // await this?.ssh?.execCommand(`apt-get install -y certbot python3-certbot-nginx;`);
206
-
207
- // return true;
208
- // }
209
-
210
- // async setupSSL(email: string, host: string): Promise<void> {
211
- // // Прямий виклик this?.ssh?.execCommand
212
- // let certbotResponse = await this?.ssh?.execCommand(
213
- // `certbot --non-interactive --agree-tos --nginx -m "${email}" -d "${host}"`
214
- // );
215
-
216
- // if (certbotResponse?.stdout.includes(`Some challenges have failed.`)) {
217
- // throw new Error("Certbot encountered an error");
218
- // }
219
-
220
- // await this?.ssh?.execCommand(
221
- // `echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -`
222
- // );
223
- // }
224
-
225
-
226
- // // Git
227
- // async refresh(): Promise<boolean> {
228
- // await this.exec(`git stash; rm-rf built; git pull`);
229
-
230
- // return true;
231
- // }
232
-
233
- // async uploadDirectoryToSftp(
234
- // localPath: string,
235
- // remotePath: string,
236
- // sftpConfig: any) {
237
- // // const sftp = new Client();
238
-
239
- // try {
240
- // // await sftp.connect(sftpConfig);
241
-
242
- // const stats = fs.statSync(localPath);
243
-
244
- // if (stats.isDirectory()) {
245
- // // Якщо це директорія
246
- // // await sftp.mkdir(remotePath, true).catch(async (err) => {
247
- // // if (err.code !== 4) { // Ігноруємо помилку "Directory already exists"
248
- // // console.error(`Помилка під час створення папки: ${remotePath}`, err);
249
- // // throw err;
250
- // // }
251
- // // });
252
-
253
- // const items = fs.readdirSync(localPath, { withFileTypes: true });
254
-
255
- // for (const item of items) {
256
- // const localItemPath = path.join(localPath, item.name);
257
- // const remoteItemPath = `${remotePath}/${item.name}`;
258
-
259
- // if (item.isDirectory()) {
260
- // await this.uploadDirectoryToSftp(localItemPath, remoteItemPath, sftpConfig);
261
- // } else {
262
- // // await sftp.put(localItemPath, remoteItemPath);
263
- // console.log(`Передано файл: ${localItemPath} -> ${remoteItemPath}`);
264
- // }
265
- // }
266
-
267
- // } else if (stats.isFile()) {
268
- // // Якщо це файл
269
- // // await sftp.put(localPath, remotePath);
270
- // console.log(`Передано файл: ${localPath} -> ${remotePath}`);
271
- // }
272
-
273
- // console.log('Усі файли та папки успішно передані.');
274
- // } catch (err) {
275
- // console.error('Помилка під час передавання файлів через SFTP:', err);
276
- // } finally {
277
- // // await sftp.end();
278
- // }
279
- // }
280
-
281
- // ensureDirectoryExistence(dirPath: string) {
282
- // if (!fs.existsSync(dirPath)) {
283
- // fs.mkdirSync(dirPath, { recursive: true });
284
- // }
285
- // }
286
-
287
- // async generateNginxConfig(domain: string, rootPath: string): Promise<string> {
288
- // const templatePath = path.join(
289
- // __dirname,
290
- // "..",
291
- // "templates",
292
- // "nginx-template.conf"
293
- // );
294
- // const template = fs.readFileSync(templatePath, "utf8");
295
- // let config = mustache.render(template, { domain, rootPath });
296
- // // Заміна закодованих символів назад на їх оригінальні значення
297
- // config = config.replace(/&#x2F;/g, '/');
298
- // return config;
299
- // }
300
-
301
-
302
- // async extractUploadedZip(name: string, file: any, extractToPath: string) {
303
- // const zipFilePath = file.path;
304
- // const outputDir = path.join(extractToPath, name);
305
-
306
- // console.log('Looking for ZIP file at:', zipFilePath);
307
- // console.log('Extracting to:', outputDir);
308
-
309
- // this.ensureDirectoryExistence(outputDir);
310
-
311
- // if (!fs.existsSync(zipFilePath)) {
312
- // console.error('Error: File not found:', zipFilePath);
313
- // return;
314
- // }
315
-
316
- // try {
317
- // await new Promise((resolve, reject) => {
318
- // fs.createReadStream(zipFilePath)
319
- // .pipe(unzipper.Parse())
320
- // .on('entry', (entry) => {
321
- // // Видаляємо перший сегмент шляху, щоб уникнути кореневої директорії
322
- // const entryPath = path.join(
323
- // outputDir,
324
- // ...entry.path.split('/').slice(1)
325
- // );
326
-
327
- // if (entry.type === 'Directory') {
328
- // this.ensureDirectoryExistence(entryPath);
329
- // } else {
330
- // this.ensureDirectoryExistence(path.dirname(entryPath));
331
- // entry.pipe(fs.createWriteStream(entryPath));
332
- // }
333
- // })
334
- // .on('close', resolve)
335
- // .on('error', reject);
336
- // });
337
-
338
- // console.log('File successfully extracted.');
339
- // } catch (err) {
340
- // console.error('Error extracting file:', err);
341
- // }
342
- // }
343
-
344
- // async ensureDirectoryExistsViaSSH(remoteDir: string) {
345
-
346
- // try {
347
- // // Перевірка, чи існує директорія, і створення її, якщо вона не існує
348
- // const command = `if [ ! -d "${remoteDir}" ]; then mkdir -p "${remoteDir}"; fi`;
349
- // await this?.ssh?.execCommand(command);
350
- // console.log(`Перевірено або створено папку: ${remoteDir}`);
351
- // } catch (err) {
352
- // console.error(
353
- // 'Помилка під час перевірки або створення папки через SSH:',
354
- // err
355
- // );
356
- // throw err;
357
- // } finally {
358
- // this?.ssh?.dispose();
359
- // }
360
- // }
361
- // async disconnectSSH(): Promise<void> {
362
- // this?.ssh?.dispose();
363
- // }
364
-
365
-
366
- // }
367
-
368
-
1
+ // import { NodeSSH } from "node-ssh";
2
+ // import ChildProcess from "child_process";
3
+ // // import Client from "ssh2-sftp-client";
4
+ // import fs from "fs";
5
+ // import mustache from "mustache";
6
+ // import path from "path";
7
+ // import unzipper from 'unzipper';
8
+
9
+ // const { promisify } = require("util");
10
+ // const execPromise = promisify(ChildProcess.exec);
11
+
12
+ // export let IP = "185.123.53.227";
13
+ // export let PASSWORD = "xUA3oOX06Kfc9m12rZ";
14
+ // export let HOST = "cg-main-server.com";
15
+ // export let PORT = 56777;
16
+
17
+ // interface FileObject {
18
+ // name: string;
19
+ // content: string; // Це буде Base64 закодовані дані
20
+ // }
21
+
22
+ // interface ISFTP {
23
+ // host: string;
24
+ // port: number;
25
+ // username: string;
26
+ // password: string;
27
+ // }
28
+
29
+ // export class ServerUtil {
30
+ // DOMAIN_HOME = "/etc/nginx/sites-enabled";
31
+
32
+ // ssh?: NodeSSH
33
+ // sftpConfig?: ISFTP;
34
+
35
+ // constructor(sftpConfig?: ISFTP) {
36
+ // this.ssh = new NodeSSH();
37
+ // this.sftpConfig = sftpConfig;
38
+ // }
39
+
40
+ // async connectSSH(): Promise<void> {
41
+ // await this?.ssh?.connect({
42
+ // host: this?.sftpConfig?.host,
43
+ // port: this?.sftpConfig?.port,
44
+ // username: this?.sftpConfig?.username,
45
+ // password: this?.sftpConfig?.password,
46
+ // });
47
+ // }
48
+
49
+ // async ensureConnected(): Promise<void> {
50
+ // if (!this?.ssh?.isConnected()) {
51
+ // await this.connectSSH(); // Підключення, якщо ще не підключено
52
+ // }
53
+ // }
54
+
55
+
56
+ // // Выконує команду або по SSH або локально, повертаючи текст незалежно від результату (помилка чи успіх)
57
+ // async exec(command: string, options?: any): Promise<string> {
58
+ // await this.ensureConnected();
59
+ // if (this?.ssh?.isConnected()) {
60
+ // return (await this?.ssh?.execCommand(command, options)).stdout;
61
+ // } else {
62
+ // return await new Promise<string>((resolve) => {
63
+ // execPromise(command, (err: string, stdout: string) => {
64
+ // resolve(stdout);
65
+ // });
66
+ // });
67
+ // }
68
+ // }
69
+
70
+ // // SSH
71
+ // async generateSSHKey(): Promise<string> {
72
+ // await this.exec(`ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< n`);
73
+ // let sshFingerprint = await this.exec(`cat ~/.ssh/id_rsa.pub`);
74
+ // return sshFingerprint;
75
+ // }
76
+
77
+ // // create Directories in /Var
78
+ // async createDirectories(): Promise<void> {
79
+ // await this.exec(`mkdir -p /var/www/ai`);
80
+ // }
81
+
82
+ // // install git
83
+ // async installGit(): Promise<void> {
84
+ // await this.exec(`apt-get update; apt-get install -y git`);
85
+ // }
86
+
87
+ // // add ssh to bitbucket
88
+ // async addBitbucketToKnownHosts(): Promise<void> {
89
+ // await this.exec(`ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts`);
90
+ // }
91
+
92
+ // // clone bitbucket Repository
93
+ // async cloneRepository(repoName: string, targetPath: string): Promise<void> {
94
+ // let gitResponse = await this.exec(
95
+ // `git clone git@bitbucket.org:bprtsk/${repoName}.git`,
96
+ // { cwd: targetPath }
97
+ // );
98
+ // if (
99
+ // gitResponse.includes(
100
+ // `Please make sure you have the correct access rights`
101
+ // )
102
+ // ) {
103
+ // throw new Error(`No access to the remote repository!`);
104
+ // }
105
+ // }
106
+
107
+ // // не знаю чи треба але додав ?
108
+
109
+ // // async checkoutBranch(branch: string, repoPath: string): Promise<void> {
110
+ // // await this.exec(`git checkout -b ${branch}; git branch --set-upstream-to=origin/${branch} ${branch}; git reset --hard origin/${branch};`, { cwd: repoPath });
111
+ // // }
112
+
113
+ // // не знаю чи треба але додав ?
114
+
115
+ // // async installJava(): Promise<void> {
116
+ // // await this.exec(`apt-get update; apt-get install -y default-jre default-jdk`);
117
+ // // }
118
+
119
+ // // install Nginx
120
+
121
+ // async installNginx(): Promise<void> {
122
+ // await this.exec(`apt-get update; apt-get install -y nginx`);
123
+ // await this.exec(`systemctl enable nginx`);
124
+ // await this.exec(`systemctl start nginx`);
125
+ // }
126
+
127
+ // // Nginx
128
+ // async isNginxActive(): Promise<boolean> {
129
+ // try {
130
+ // let result = await this.exec("systemctl status nginx");
131
+ // if (result.includes("Active: active")) return true;
132
+ // } catch (e) {
133
+ // console.error(e);
134
+ // }
135
+
136
+ // return false;
137
+ // }
138
+
139
+ // // Mongo
140
+ // async isMongoActive(): Promise<boolean> {
141
+ // try {
142
+ // let result = await this.exec("systemctl status mongod");
143
+ // if (result.includes("Active: active")) return true;
144
+ // } catch (e) {
145
+ // console.error(e);
146
+ // }
147
+
148
+ // return false;
149
+ // }
150
+
151
+ // mongoInstallCommand = `
152
+ // echo "deb http://security.ubuntu.com/ubuntu focal-security main" | tee /etc/apt/sources.list.d/focal-security.list;
153
+ // apt-get update;
154
+ // apt-get install libssl1.1;
155
+ // rm /etc/apt/sources.list.d/focal-security.list;
156
+
157
+ // curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -;
158
+ // echo "deb http://security.ubuntu.com/ubuntu impish-security main" | tee /etc/apt/sources.list.d/impish-security.list;
159
+ // echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list;
160
+ // apt-get update;
161
+ // apt-get install -y mongodb-org;
162
+ // systemctl enable mongod.service;
163
+ // systemctl start mongod;
164
+ // `;
165
+
166
+ // // checking if nginx configuration exists
167
+ // async domainNginxConfigExists(host: string): Promise<boolean> {
168
+ // try {
169
+ // let result = await this.exec(
170
+ // `ls ${this.DOMAIN_HOME}/${host}.nginx.ssl.conf`
171
+ // );
172
+ // if (result.includes("No such file or directory")) return false;
173
+ // } catch (e) {
174
+ // console.error(e);
175
+ // }
176
+
177
+ // return true;
178
+ // }
179
+
180
+ // // checking if the ssl certificate exists
181
+ // async domainNginxCertsExist(host: string): Promise<boolean> {
182
+ // try {
183
+ // let result = await this.exec(`ls /etc/letsencrypt/live/${host}`);
184
+ // if (result.includes("No such file or directory")) return false;
185
+ // } catch (e) {
186
+ // console.error(e);
187
+ // }
188
+ // return true;
189
+ // }
190
+
191
+ // // Certbot CRON
192
+ // async isCerbotActive(): Promise<boolean> {
193
+ // try {
194
+ // let result = await this.exec("which certbot");
195
+ // if (result.includes("/usr/bin/certbot")) return true;
196
+ // } catch (e) {
197
+ // console.error(e);
198
+ // }
199
+
200
+ // return false;
201
+ // }
202
+
203
+ // // install certbot
204
+ // async setupCertbot(): Promise<boolean> {
205
+ // await this?.ssh?.execCommand(`apt-get install -y certbot python3-certbot-nginx;`);
206
+
207
+ // return true;
208
+ // }
209
+
210
+ // async setupSSL(email: string, host: string): Promise<void> {
211
+ // // Прямий виклик this?.ssh?.execCommand
212
+ // let certbotResponse = await this?.ssh?.execCommand(
213
+ // `certbot --non-interactive --agree-tos --nginx -m "${email}" -d "${host}"`
214
+ // );
215
+
216
+ // if (certbotResponse?.stdout.includes(`Some challenges have failed.`)) {
217
+ // throw new Error("Certbot encountered an error");
218
+ // }
219
+
220
+ // await this?.ssh?.execCommand(
221
+ // `echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -`
222
+ // );
223
+ // }
224
+
225
+
226
+ // // Git
227
+ // async refresh(): Promise<boolean> {
228
+ // await this.exec(`git stash; rm-rf built; git pull`);
229
+
230
+ // return true;
231
+ // }
232
+
233
+ // async uploadDirectoryToSftp(
234
+ // localPath: string,
235
+ // remotePath: string,
236
+ // sftpConfig: any) {
237
+ // // const sftp = new Client();
238
+
239
+ // try {
240
+ // // await sftp.connect(sftpConfig);
241
+
242
+ // const stats = fs.statSync(localPath);
243
+
244
+ // if (stats.isDirectory()) {
245
+ // // Якщо це директорія
246
+ // // await sftp.mkdir(remotePath, true).catch(async (err) => {
247
+ // // if (err.code !== 4) { // Ігноруємо помилку "Directory already exists"
248
+ // // console.error(`Помилка під час створення папки: ${remotePath}`, err);
249
+ // // throw err;
250
+ // // }
251
+ // // });
252
+
253
+ // const items = fs.readdirSync(localPath, { withFileTypes: true });
254
+
255
+ // for (const item of items) {
256
+ // const localItemPath = path.join(localPath, item.name);
257
+ // const remoteItemPath = `${remotePath}/${item.name}`;
258
+
259
+ // if (item.isDirectory()) {
260
+ // await this.uploadDirectoryToSftp(localItemPath, remoteItemPath, sftpConfig);
261
+ // } else {
262
+ // // await sftp.put(localItemPath, remoteItemPath);
263
+ // console.log(`Передано файл: ${localItemPath} -> ${remoteItemPath}`);
264
+ // }
265
+ // }
266
+
267
+ // } else if (stats.isFile()) {
268
+ // // Якщо це файл
269
+ // // await sftp.put(localPath, remotePath);
270
+ // console.log(`Передано файл: ${localPath} -> ${remotePath}`);
271
+ // }
272
+
273
+ // console.log('Усі файли та папки успішно передані.');
274
+ // } catch (err) {
275
+ // console.error('Помилка під час передавання файлів через SFTP:', err);
276
+ // } finally {
277
+ // // await sftp.end();
278
+ // }
279
+ // }
280
+
281
+ // ensureDirectoryExistence(dirPath: string) {
282
+ // if (!fs.existsSync(dirPath)) {
283
+ // fs.mkdirSync(dirPath, { recursive: true });
284
+ // }
285
+ // }
286
+
287
+ // async generateNginxConfig(domain: string, rootPath: string): Promise<string> {
288
+ // const templatePath = path.join(
289
+ // __dirname,
290
+ // "..",
291
+ // "templates",
292
+ // "nginx-template.conf"
293
+ // );
294
+ // const template = fs.readFileSync(templatePath, "utf8");
295
+ // let config = mustache.render(template, { domain, rootPath });
296
+ // // Заміна закодованих символів назад на їх оригінальні значення
297
+ // config = config.replace(/&#x2F;/g, '/');
298
+ // return config;
299
+ // }
300
+
301
+
302
+ // async extractUploadedZip(name: string, file: any, extractToPath: string) {
303
+ // const zipFilePath = file.path;
304
+ // const outputDir = path.join(extractToPath, name);
305
+
306
+ // console.log('Looking for ZIP file at:', zipFilePath);
307
+ // console.log('Extracting to:', outputDir);
308
+
309
+ // this.ensureDirectoryExistence(outputDir);
310
+
311
+ // if (!fs.existsSync(zipFilePath)) {
312
+ // console.error('Error: File not found:', zipFilePath);
313
+ // return;
314
+ // }
315
+
316
+ // try {
317
+ // await new Promise((resolve, reject) => {
318
+ // fs.createReadStream(zipFilePath)
319
+ // .pipe(unzipper.Parse())
320
+ // .on('entry', (entry) => {
321
+ // // Видаляємо перший сегмент шляху, щоб уникнути кореневої директорії
322
+ // const entryPath = path.join(
323
+ // outputDir,
324
+ // ...entry.path.split('/').slice(1)
325
+ // );
326
+
327
+ // if (entry.type === 'Directory') {
328
+ // this.ensureDirectoryExistence(entryPath);
329
+ // } else {
330
+ // this.ensureDirectoryExistence(path.dirname(entryPath));
331
+ // entry.pipe(fs.createWriteStream(entryPath));
332
+ // }
333
+ // })
334
+ // .on('close', resolve)
335
+ // .on('error', reject);
336
+ // });
337
+
338
+ // console.log('File successfully extracted.');
339
+ // } catch (err) {
340
+ // console.error('Error extracting file:', err);
341
+ // }
342
+ // }
343
+
344
+ // async ensureDirectoryExistsViaSSH(remoteDir: string) {
345
+
346
+ // try {
347
+ // // Перевірка, чи існує директорія, і створення її, якщо вона не існує
348
+ // const command = `if [ ! -d "${remoteDir}" ]; then mkdir -p "${remoteDir}"; fi`;
349
+ // await this?.ssh?.execCommand(command);
350
+ // console.log(`Перевірено або створено папку: ${remoteDir}`);
351
+ // } catch (err) {
352
+ // console.error(
353
+ // 'Помилка під час перевірки або створення папки через SSH:',
354
+ // err
355
+ // );
356
+ // throw err;
357
+ // } finally {
358
+ // this?.ssh?.dispose();
359
+ // }
360
+ // }
361
+ // async disconnectSSH(): Promise<void> {
362
+ // this?.ssh?.dispose();
363
+ // }
364
+
365
+
366
+ // }
367
+
368
+