@bprotsyk/aso-core 2.0.47 → 2.0.49

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 (241) hide show
  1. package/README.md +1 -1
  2. package/docs/assets/highlight.css +22 -22
  3. package/docs/assets/main.js +58 -58
  4. package/docs/assets/style.css +1279 -1279
  5. package/docs/enums/PanelUserAccessScope.html +126 -126
  6. package/docs/functions/ASO_v0.toDefault.html +80 -80
  7. package/docs/functions/ASO_v1.toDefault.html +80 -80
  8. package/docs/functions/ASO_v2.toDefault.html +78 -78
  9. package/docs/functions/ASO_v3.toDefault.html +77 -77
  10. package/docs/functions/ASO_v4.toDefault.html +75 -75
  11. package/docs/functions/ASO_v5.toDefault.html +76 -76
  12. package/docs/functions/ColoredText.html +92 -92
  13. package/docs/functions/ShapeDiv.html +109 -109
  14. package/docs/index.html +82 -82
  15. package/docs/interfaces/ASOConfigFetch.IUsageLogEntry.html +1413 -1413
  16. package/docs/interfaces/ASOConfigFetch.IUsageLogRequest.html +103 -103
  17. package/docs/interfaces/ASOConfigFetch.IUsageLogResponse.html +108 -108
  18. package/docs/interfaces/ASO_v0.IAuthorizationActionMapping.html +145 -145
  19. package/docs/interfaces/ASO_v0.IColoredSpan.html +89 -89
  20. package/docs/interfaces/ASO_v0.IColoredSpanMapping.html +89 -89
  21. package/docs/interfaces/ASO_v0.IColoredString.html +89 -89
  22. package/docs/interfaces/ASO_v0.IColoredStringMapping.html +89 -89
  23. package/docs/interfaces/ASO_v0.IConfig.html +556 -556
  24. package/docs/interfaces/ASO_v0.IConfigMapping.html +229 -229
  25. package/docs/interfaces/ASO_v0.ILocalization.html +516 -516
  26. package/docs/interfaces/ASO_v0.ILocalizationMap.html +77 -77
  27. package/docs/interfaces/ASO_v0.ILocalizationMapping.html +502 -502
  28. package/docs/interfaces/ASO_v0.IOfferResult.html +103 -103
  29. package/docs/interfaces/ASO_v0.IOfferResultEmoji.html +82 -82
  30. package/docs/interfaces/ASO_v0.IOfferResultMapping.html +117 -117
  31. package/docs/interfaces/ASO_v0.IOfferSectionMapping.html +108 -108
  32. package/docs/interfaces/ASO_v0.IOffersSection.html +96 -96
  33. package/docs/interfaces/ASO_v0.ISectionPalette.html +152 -152
  34. package/docs/interfaces/ASO_v0.ISectionPaletteMapping.html +152 -152
  35. package/docs/interfaces/ASO_v1.IAuthorizationActionMapping.html +145 -145
  36. package/docs/interfaces/ASO_v1.IColoredSpan.html +89 -89
  37. package/docs/interfaces/ASO_v1.IColoredSpanMapping.html +89 -89
  38. package/docs/interfaces/ASO_v1.IColoredString.html +89 -89
  39. package/docs/interfaces/ASO_v1.IColoredStringMapping.html +89 -89
  40. package/docs/interfaces/ASO_v1.IConfig.html +549 -549
  41. package/docs/interfaces/ASO_v1.IConfigMapping.html +229 -229
  42. package/docs/interfaces/ASO_v1.ILocalization.html +481 -481
  43. package/docs/interfaces/ASO_v1.ILocalizationMap.html +77 -77
  44. package/docs/interfaces/ASO_v1.ILocalizationMapping.html +481 -481
  45. package/docs/interfaces/ASO_v1.IOfferResult.html +103 -103
  46. package/docs/interfaces/ASO_v1.IOfferResultEmoji.html +82 -82
  47. package/docs/interfaces/ASO_v1.IOfferResultMapping.html +117 -117
  48. package/docs/interfaces/ASO_v1.IOfferSectionMapping.html +108 -108
  49. package/docs/interfaces/ASO_v1.IOffersSection.html +101 -101
  50. package/docs/interfaces/ASO_v1.ISectionPalette.html +152 -152
  51. package/docs/interfaces/ASO_v1.ISectionPaletteMapping.html +152 -152
  52. package/docs/interfaces/ASO_v2.IAuthorizationActionMapping.html +138 -138
  53. package/docs/interfaces/ASO_v2.IColoredSpanMapping.html +89 -89
  54. package/docs/interfaces/ASO_v2.IColoredString.html +89 -89
  55. package/docs/interfaces/ASO_v2.IColoredStringMapping.html +89 -89
  56. package/docs/interfaces/ASO_v2.IConfig.html +493 -493
  57. package/docs/interfaces/ASO_v2.IConfigMapping.html +201 -201
  58. package/docs/interfaces/ASO_v2.ILocalization.html +474 -474
  59. package/docs/interfaces/ASO_v2.ILocalizationMap.html +75 -75
  60. package/docs/interfaces/ASO_v2.ILocalizationMapping.html +362 -362
  61. package/docs/interfaces/ASO_v2.IOfferResult.html +110 -110
  62. package/docs/interfaces/ASO_v2.IOfferResultMapping.html +117 -117
  63. package/docs/interfaces/ASO_v2.IOfferSectionMapping.html +108 -108
  64. package/docs/interfaces/ASO_v2.IOffersSection.html +101 -101
  65. package/docs/interfaces/ASO_v2.ISectionPalette.html +152 -152
  66. package/docs/interfaces/ASO_v2.ISectionPaletteMapping.html +152 -152
  67. package/docs/interfaces/ASO_v3.IAuthorizationActionMapping.html +138 -138
  68. package/docs/interfaces/ASO_v3.IColoredSpanMapping.html +89 -89
  69. package/docs/interfaces/ASO_v3.IColoredString.html +89 -89
  70. package/docs/interfaces/ASO_v3.IColoredStringMapping.html +89 -89
  71. package/docs/interfaces/ASO_v3.IConfig.html +514 -514
  72. package/docs/interfaces/ASO_v3.IConfigMapping.html +208 -208
  73. package/docs/interfaces/ASO_v3.ILocalization.html +446 -446
  74. package/docs/interfaces/ASO_v3.ILocalizationMap.html +74 -74
  75. package/docs/interfaces/ASO_v3.ILocalizationMapping.html +341 -341
  76. package/docs/interfaces/ASO_v3.IOfferResultMapping.html +117 -117
  77. package/docs/interfaces/ASO_v3.IOfferSectionMapping.html +108 -108
  78. package/docs/interfaces/ASO_v3.IOffersSection.html +101 -101
  79. package/docs/interfaces/ASO_v3.ISectionPalette.html +152 -152
  80. package/docs/interfaces/ASO_v3.ISectionPaletteMapping.html +152 -152
  81. package/docs/interfaces/ASO_v4.IAuthorizationActionMapping.html +138 -138
  82. package/docs/interfaces/ASO_v4.IColoredSpanMapping.html +89 -89
  83. package/docs/interfaces/ASO_v4.IColoredString.html +89 -89
  84. package/docs/interfaces/ASO_v4.IColoredStringMapping.html +89 -89
  85. package/docs/interfaces/ASO_v4.IConfig.html +514 -514
  86. package/docs/interfaces/ASO_v4.IConfigMapping.html +131 -131
  87. package/docs/interfaces/ASO_v4.ILocalization.html +369 -369
  88. package/docs/interfaces/ASO_v4.ILocalizationMap.html +72 -72
  89. package/docs/interfaces/ASO_v4.ILocalizationMapping.html +257 -257
  90. package/docs/interfaces/ASO_v4.IOfferResultMapping.html +117 -117
  91. package/docs/interfaces/ASO_v4.IOfferSectionMapping.html +89 -89
  92. package/docs/interfaces/ASO_v4.LocalizedString.html +82 -82
  93. package/docs/interfaces/ASO_v5.IAuthorizationActionMapping.html +138 -138
  94. package/docs/interfaces/ASO_v5.IColoredSpan.html +89 -89
  95. package/docs/interfaces/ASO_v5.IColoredSpanMapping.html +89 -89
  96. package/docs/interfaces/ASO_v5.IColoredString.html +89 -89
  97. package/docs/interfaces/ASO_v5.IColoredStringMapping.html +89 -89
  98. package/docs/interfaces/ASO_v5.IConfig.html +542 -542
  99. package/docs/interfaces/ASO_v5.IConfigMapping.html +159 -159
  100. package/docs/interfaces/ASO_v5.ILocalization.html +411 -411
  101. package/docs/interfaces/ASO_v5.ILocalizationMap.html +73 -73
  102. package/docs/interfaces/ASO_v5.ILocalizationMapping.html +299 -299
  103. package/docs/interfaces/ASO_v5.IOfferResultMapping.html +117 -117
  104. package/docs/interfaces/ASO_v5.IOfferSectionMapping.html +89 -89
  105. package/docs/interfaces/ASO_v5.LocalizedString.html +82 -82
  106. package/docs/interfaces/IAsoConfigResponse.html +81 -81
  107. package/docs/interfaces/IAsoCustomizedOffer.html +116 -116
  108. package/docs/interfaces/IAsoDefaultConfig.html +443 -443
  109. package/docs/interfaces/IAsoOfferResponse.html +81 -81
  110. package/docs/interfaces/IAsoSection.html +88 -88
  111. package/docs/interfaces/IAsoSingleOffer.html +88 -88
  112. package/docs/interfaces/IAuthToken.html +102 -102
  113. package/docs/interfaces/IColoredTextProps.html +74 -74
  114. package/docs/interfaces/IFlashApp.html +144 -144
  115. package/docs/interfaces/IFlashAppListItem.html +88 -88
  116. package/docs/interfaces/IGradient.html +95 -95
  117. package/docs/interfaces/IOffer.html +137 -137
  118. package/docs/interfaces/IOfferWallAuthConfig.html +130 -130
  119. package/docs/interfaces/IOfferWallAuthLocalization.html +102 -102
  120. package/docs/interfaces/IOfferWallAuthSubmitRequest.html +74 -74
  121. package/docs/interfaces/IOfferWallAuthSubmitResponse.html +74 -74
  122. package/docs/interfaces/IOfferWallHomeDialogData.html +95 -95
  123. package/docs/interfaces/IOfferWallOffer.html +109 -109
  124. package/docs/interfaces/IOfferWallResponse.html +81 -81
  125. package/docs/interfaces/IOfferWallSection.html +88 -88
  126. package/docs/interfaces/IPanelUser.html +1405 -1405
  127. package/docs/interfaces/IPush.html +95 -95
  128. package/docs/interfaces/IShape.html +102 -102
  129. package/docs/interfaces/IStroke.html +81 -81
  130. package/docs/interfaces/IUpsertFlashAppRequest.html +214 -214
  131. package/docs/interfaces/IUpsertFlashAppResponse.html +81 -81
  132. package/docs/modules/ASOConfigFetch.html +63 -63
  133. package/docs/modules/ASO_v0.html +96 -96
  134. package/docs/modules/ASO_v1.html +96 -96
  135. package/docs/modules/ASO_v2.html +92 -92
  136. package/docs/modules/ASO_v3.html +90 -90
  137. package/docs/modules/ASO_v4.html +86 -86
  138. package/docs/modules/ASO_v5.html +88 -88
  139. package/docs/modules.html +133 -133
  140. package/docs/variables/FlashAppSchema.html +83 -83
  141. package/docs/variables/PanelUserSchema.html +83 -83
  142. package/lib/app/app-integration.d.ts +53 -53
  143. package/lib/app/app-integration.js +63 -63
  144. package/lib/app/app-list-item.d.ts +5 -5
  145. package/lib/app/app-list-item.js +2 -2
  146. package/lib/app/app-type.d.ts +4 -4
  147. package/lib/app/app-type.js +8 -8
  148. package/lib/app/app.d.ts +206 -189
  149. package/lib/app/app.js +232 -221
  150. package/lib/general/cloudflare-domain.d.ts +42 -42
  151. package/lib/general/cloudflare-domain.js +12 -12
  152. package/lib/general/domain.d.ts +106 -106
  153. package/lib/general/domain.js +60 -60
  154. package/lib/general/namecheap-domain.d.ts +85 -86
  155. package/lib/general/namecheap-domain.js +14 -14
  156. package/lib/general/push.d.ts +6 -6
  157. package/lib/general/push.js +2 -2
  158. package/lib/general/queue.d.ts +2 -2
  159. package/lib/general/queue.js +1 -1
  160. package/lib/general/shape.d.ts +18 -18
  161. package/lib/general/shape.js +36 -36
  162. package/lib/index.d.ts +26 -26
  163. package/lib/index.js +69 -68
  164. package/lib/keitaro/keitaro-campaign.d.ts +31 -31
  165. package/lib/keitaro/keitaro-campaign.js +5 -5
  166. package/lib/keitaro/keitaro-domain.d.ts +6 -6
  167. package/lib/keitaro/keitaro-domain.js +2 -2
  168. package/lib/keitaro/keitaro-offer.d.ts +7 -7
  169. package/lib/keitaro/keitaro-offer.js +2 -2
  170. package/lib/keitaro/keitaro-stream.d.ts +20 -20
  171. package/lib/keitaro/keitaro-stream.js +2 -2
  172. package/lib/network/keitaro/http.d.ts +2 -2
  173. package/lib/network/keitaro/http.js +12 -12
  174. package/lib/network/keitaro/keitaro-service.d.ts +50 -50
  175. package/lib/network/keitaro/keitaro-service.js +260 -260
  176. package/lib/offers/list.d.ts +37 -37
  177. package/lib/offers/list.js +12 -12
  178. package/lib/offers/offer.d.ts +91 -91
  179. package/lib/offers/offer.js +42 -42
  180. package/lib/offers/offerwall/offerwall-home-dialog-data.d.ts +6 -6
  181. package/lib/offers/offerwall/offerwall-home-dialog-data.js +2 -2
  182. package/lib/offers/offerwall/offerwall-offer.d.ts +12 -12
  183. package/lib/offers/offerwall/offerwall-offer.js +2 -2
  184. package/lib/offers/offerwall/offerwall-response.d.ts +6 -6
  185. package/lib/offers/offerwall/offerwall-response.js +2 -2
  186. package/lib/offers/offerwall/offerwall-section.d.ts +6 -6
  187. package/lib/offers/offerwall/offerwall-section.js +2 -2
  188. package/lib/offers/section.d.ts +47 -47
  189. package/lib/offers/section.js +20 -20
  190. package/lib/panel/auth.d.ts +8 -8
  191. package/lib/panel/auth.js +2 -2
  192. package/lib/panel/flash/upsert-flash-app-request.d.ts +33 -29
  193. package/lib/panel/flash/upsert-flash-app-request.js +2 -2
  194. package/lib/panel/user.d.ts +46 -46
  195. package/lib/panel/user.js +28 -28
  196. package/lib/templates/nginx-template.conf +35 -35
  197. package/lib/utils/general.d.ts +11 -11
  198. package/lib/utils/general.js +40 -40
  199. package/lib/utils/huawei/converter.d.ts +2 -2
  200. package/lib/utils/huawei/converter.js +53 -53
  201. package/lib/utils/keitaro-utils.d.ts +15 -15
  202. package/lib/utils/keitaro-utils.js +541 -541
  203. package/lib/utils/server-util.d.ts +42 -42
  204. package/lib/utils/server-util.js +292 -292
  205. package/package.json +54 -54
  206. package/src/app/app-integration.ts +66 -66
  207. package/src/app/app-list-item.ts +4 -4
  208. package/src/app/app-type.ts +3 -3
  209. package/src/app/app.ts +383 -366
  210. package/src/general/cloudflare-domain.ts +44 -44
  211. package/src/general/domain.ts +104 -104
  212. package/src/general/namecheap-domain.ts +63 -63
  213. package/src/general/push.ts +5 -5
  214. package/src/general/queue.ts +4 -4
  215. package/src/general/shape.tsx +55 -55
  216. package/src/index.ts +32 -32
  217. package/src/keitaro/keitaro-campaign.ts +35 -35
  218. package/src/keitaro/keitaro-domain.ts +5 -5
  219. package/src/keitaro/keitaro-offer.ts +6 -6
  220. package/src/keitaro/keitaro-stream.ts +19 -19
  221. package/src/network/keitaro/http.ts +8 -8
  222. package/src/network/keitaro/keitaro-service.ts +322 -322
  223. package/src/offers/list.ts +19 -19
  224. package/src/offers/offer.ts +80 -80
  225. package/src/offers/offerwall/offerwall-home-dialog-data.ts +6 -6
  226. package/src/offers/offerwall/offerwall-offer.ts +12 -12
  227. package/src/offers/offerwall/offerwall-response.ts +7 -7
  228. package/src/offers/offerwall/offerwall-section.ts +7 -7
  229. package/src/offers/section.ts +29 -29
  230. package/src/panel/auth.ts +8 -8
  231. package/src/panel/flash/upsert-flash-app-request.ts +41 -40
  232. package/src/panel/user.ts +38 -38
  233. package/src/templates/nginx-template.conf +35 -35
  234. package/src/utils/data.csv +65 -65
  235. package/src/utils/general.ts +36 -36
  236. package/src/utils/huawei/converter.ts +55 -55
  237. package/src/utils/keitaro-utils.ts +626 -626
  238. package/src/utils/map-apps.json +4747 -4747
  239. package/src/utils/server-util.ts +368 -368
  240. package/src/utils/update-postbacks.js +27 -27
  241. package/tsconfig.json +20 -20
@@ -1,292 +1,292 @@
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.ServerUtil = exports.PORT = exports.HOST = exports.PASSWORD = exports.IP = void 0;
7
- const node_ssh_1 = require("node-ssh");
8
- const child_process_1 = __importDefault(require("child_process"));
9
- const ssh2_sftp_client_1 = __importDefault(require("ssh2-sftp-client"));
10
- const fs_1 = __importDefault(require("fs"));
11
- const mustache_1 = __importDefault(require("mustache"));
12
- const path_1 = __importDefault(require("path"));
13
- const unzipper_1 = __importDefault(require("unzipper"));
14
- const { promisify } = require("util");
15
- const execPromise = promisify(child_process_1.default.exec);
16
- exports.IP = "185.123.53.227";
17
- exports.PASSWORD = "xUA3oOX06Kfc9m12rZ";
18
- exports.HOST = "cg-main-server.com";
19
- exports.PORT = 56777;
20
- class ServerUtil {
21
- DOMAIN_HOME = "/etc/nginx/sites-enabled";
22
- ssh;
23
- sftpConfig;
24
- constructor(sftpConfig) {
25
- this.ssh = new node_ssh_1.NodeSSH();
26
- this.sftpConfig = sftpConfig;
27
- }
28
- async connectSSH() {
29
- await this.ssh.connect({
30
- host: this.sftpConfig.host,
31
- port: this.sftpConfig.port,
32
- username: this.sftpConfig.username,
33
- password: this.sftpConfig.password,
34
- });
35
- }
36
- async ensureConnected() {
37
- if (!this.ssh.isConnected()) {
38
- await this.connectSSH(); // Підключення, якщо ще не підключено
39
- }
40
- }
41
- // Выконує команду або по SSH або локально, повертаючи текст незалежно від результату (помилка чи успіх)
42
- async exec(command, options) {
43
- await this.ensureConnected();
44
- if (this.ssh.isConnected()) {
45
- return (await this.ssh.execCommand(command, options)).stdout;
46
- }
47
- else {
48
- return await new Promise((resolve) => {
49
- execPromise(command, (err, stdout) => {
50
- resolve(stdout);
51
- });
52
- });
53
- }
54
- }
55
- // SSH
56
- async generateSSHKey() {
57
- await this.exec(`ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< n`);
58
- let sshFingerprint = await this.exec(`cat ~/.ssh/id_rsa.pub`);
59
- return sshFingerprint;
60
- }
61
- // create Directories in /Var
62
- async createDirectories() {
63
- await this.exec(`mkdir -p /var/www/ai`);
64
- }
65
- // install git
66
- async installGit() {
67
- await this.exec(`apt-get update; apt-get install -y git`);
68
- }
69
- // add ssh to bitbucket
70
- async addBitbucketToKnownHosts() {
71
- await this.exec(`ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts`);
72
- }
73
- // clone bitbucket Repository
74
- async cloneRepository(repoName, targetPath) {
75
- let gitResponse = await this.exec(`git clone git@bitbucket.org:bprtsk/${repoName}.git`, { cwd: targetPath });
76
- if (gitResponse.includes(`Please make sure you have the correct access rights`)) {
77
- throw new Error(`No access to the remote repository!`);
78
- }
79
- }
80
- // не знаю чи треба але додав ?
81
- // async checkoutBranch(branch: string, repoPath: string): Promise<void> {
82
- // await this.exec(`git checkout -b ${branch}; git branch --set-upstream-to=origin/${branch} ${branch}; git reset --hard origin/${branch};`, { cwd: repoPath });
83
- // }
84
- // не знаю чи треба але додав ?
85
- // async installJava(): Promise<void> {
86
- // await this.exec(`apt-get update; apt-get install -y default-jre default-jdk`);
87
- // }
88
- // install Nginx
89
- async installNginx() {
90
- await this.exec(`apt-get update; apt-get install -y nginx`);
91
- await this.exec(`systemctl enable nginx`);
92
- await this.exec(`systemctl start nginx`);
93
- }
94
- // Nginx
95
- async isNginxActive() {
96
- try {
97
- let result = await this.exec("systemctl status nginx");
98
- if (result.includes("Active: active"))
99
- return true;
100
- }
101
- catch (e) {
102
- console.error(e);
103
- }
104
- return false;
105
- }
106
- // Mongo
107
- async isMongoActive() {
108
- try {
109
- let result = await this.exec("systemctl status mongod");
110
- if (result.includes("Active: active"))
111
- return true;
112
- }
113
- catch (e) {
114
- console.error(e);
115
- }
116
- return false;
117
- }
118
- mongoInstallCommand = `
119
- echo "deb http://security.ubuntu.com/ubuntu focal-security main" | tee /etc/apt/sources.list.d/focal-security.list;
120
- apt-get update;
121
- apt-get install libssl1.1;
122
- rm /etc/apt/sources.list.d/focal-security.list;
123
-
124
- curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -;
125
- echo "deb http://security.ubuntu.com/ubuntu impish-security main" | tee /etc/apt/sources.list.d/impish-security.list;
126
- 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;
127
- apt-get update;
128
- apt-get install -y mongodb-org;
129
- systemctl enable mongod.service;
130
- systemctl start mongod;
131
- `;
132
- // checking if nginx configuration exists
133
- async domainNginxConfigExists(host) {
134
- try {
135
- let result = await this.exec(`ls ${this.DOMAIN_HOME}/${host}.nginx.ssl.conf`);
136
- if (result.includes("No such file or directory"))
137
- return false;
138
- }
139
- catch (e) {
140
- console.error(e);
141
- }
142
- return true;
143
- }
144
- // checking if the ssl certificate exists
145
- async domainNginxCertsExist(host) {
146
- try {
147
- let result = await this.exec(`ls /etc/letsencrypt/live/${host}`);
148
- if (result.includes("No such file or directory"))
149
- return false;
150
- }
151
- catch (e) {
152
- console.error(e);
153
- }
154
- return true;
155
- }
156
- // Certbot CRON
157
- async isCerbotActive() {
158
- try {
159
- let result = await this.exec("which certbot");
160
- if (result.includes("/usr/bin/certbot"))
161
- return true;
162
- }
163
- catch (e) {
164
- console.error(e);
165
- }
166
- return false;
167
- }
168
- // install certbot
169
- async setupCertbot() {
170
- await this.ssh.execCommand(`apt-get install -y certbot python3-certbot-nginx;`);
171
- return true;
172
- }
173
- async setupSSL(email, host) {
174
- // Прямий виклик this.ssh.execCommand
175
- let certbotResponse = await this.ssh.execCommand(`certbot --non-interactive --agree-tos --nginx -m "${email}" -d "${host}"`);
176
- if (certbotResponse.stdout.includes(`Some challenges have failed.`)) {
177
- throw new Error("Certbot encountered an error");
178
- }
179
- await this.ssh.execCommand(`echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -`);
180
- }
181
- // Git
182
- async refresh() {
183
- await this.exec(`git stash; rm-rf built; git pull`);
184
- return true;
185
- }
186
- async uploadDirectoryToSftp(localPath, remotePath, sftpConfig) {
187
- const sftp = new ssh2_sftp_client_1.default();
188
- try {
189
- await sftp.connect(sftpConfig);
190
- const stats = fs_1.default.statSync(localPath);
191
- if (stats.isDirectory()) {
192
- // Якщо це директорія
193
- await sftp.mkdir(remotePath, true).catch(async (err) => {
194
- if (err.code !== 4) { // Ігноруємо помилку "Directory already exists"
195
- console.error(`Помилка під час створення папки: ${remotePath}`, err);
196
- throw err;
197
- }
198
- });
199
- const items = fs_1.default.readdirSync(localPath, { withFileTypes: true });
200
- for (const item of items) {
201
- const localItemPath = path_1.default.join(localPath, item.name);
202
- const remoteItemPath = `${remotePath}/${item.name}`;
203
- if (item.isDirectory()) {
204
- await this.uploadDirectoryToSftp(localItemPath, remoteItemPath, sftpConfig);
205
- }
206
- else {
207
- await sftp.put(localItemPath, remoteItemPath);
208
- console.log(`Передано файл: ${localItemPath} -> ${remoteItemPath}`);
209
- }
210
- }
211
- }
212
- else if (stats.isFile()) {
213
- // Якщо це файл
214
- await sftp.put(localPath, remotePath);
215
- console.log(`Передано файл: ${localPath} -> ${remotePath}`);
216
- }
217
- console.log('Усі файли та папки успішно передані.');
218
- }
219
- catch (err) {
220
- console.error('Помилка під час передавання файлів через SFTP:', err);
221
- }
222
- finally {
223
- await sftp.end();
224
- }
225
- }
226
- ensureDirectoryExistence(dirPath) {
227
- if (!fs_1.default.existsSync(dirPath)) {
228
- fs_1.default.mkdirSync(dirPath, { recursive: true });
229
- }
230
- }
231
- async generateNginxConfig(domain, rootPath) {
232
- const templatePath = path_1.default.join(__dirname, "..", "templates", "nginx-template.conf");
233
- const template = fs_1.default.readFileSync(templatePath, "utf8");
234
- let config = mustache_1.default.render(template, { domain, rootPath });
235
- // Заміна закодованих символів назад на їх оригінальні значення
236
- config = config.replace(/&#x2F;/g, '/');
237
- return config;
238
- }
239
- async extractUploadedZip(name, file, extractToPath) {
240
- const zipFilePath = file.path;
241
- const outputDir = path_1.default.join(extractToPath, name);
242
- console.log('Looking for ZIP file at:', zipFilePath);
243
- console.log('Extracting to:', outputDir);
244
- this.ensureDirectoryExistence(outputDir);
245
- if (!fs_1.default.existsSync(zipFilePath)) {
246
- console.error('Error: File not found:', zipFilePath);
247
- return;
248
- }
249
- try {
250
- await new Promise((resolve, reject) => {
251
- fs_1.default.createReadStream(zipFilePath)
252
- .pipe(unzipper_1.default.Parse())
253
- .on('entry', (entry) => {
254
- // Видаляємо перший сегмент шляху, щоб уникнути кореневої директорії
255
- const entryPath = path_1.default.join(outputDir, ...entry.path.split('/').slice(1));
256
- if (entry.type === 'Directory') {
257
- this.ensureDirectoryExistence(entryPath);
258
- }
259
- else {
260
- this.ensureDirectoryExistence(path_1.default.dirname(entryPath));
261
- entry.pipe(fs_1.default.createWriteStream(entryPath));
262
- }
263
- })
264
- .on('close', resolve)
265
- .on('error', reject);
266
- });
267
- console.log('File successfully extracted.');
268
- }
269
- catch (err) {
270
- console.error('Error extracting file:', err);
271
- }
272
- }
273
- async ensureDirectoryExistsViaSSH(remoteDir) {
274
- try {
275
- // Перевірка, чи існує директорія, і створення її, якщо вона не існує
276
- const command = `if [ ! -d "${remoteDir}" ]; then mkdir -p "${remoteDir}"; fi`;
277
- await this.ssh.execCommand(command);
278
- console.log(`Перевірено або створено папку: ${remoteDir}`);
279
- }
280
- catch (err) {
281
- console.error('Помилка під час перевірки або створення папки через SSH:', err);
282
- throw err;
283
- }
284
- finally {
285
- this.ssh.dispose();
286
- }
287
- }
288
- async disconnectSSH() {
289
- this.ssh.dispose();
290
- }
291
- }
292
- exports.ServerUtil = ServerUtil;
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.ServerUtil = exports.PORT = exports.HOST = exports.PASSWORD = exports.IP = void 0;
7
+ const node_ssh_1 = require("node-ssh");
8
+ const child_process_1 = __importDefault(require("child_process"));
9
+ const ssh2_sftp_client_1 = __importDefault(require("ssh2-sftp-client"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const mustache_1 = __importDefault(require("mustache"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const unzipper_1 = __importDefault(require("unzipper"));
14
+ const { promisify } = require("util");
15
+ const execPromise = promisify(child_process_1.default.exec);
16
+ exports.IP = "185.123.53.227";
17
+ exports.PASSWORD = "xUA3oOX06Kfc9m12rZ";
18
+ exports.HOST = "cg-main-server.com";
19
+ exports.PORT = 56777;
20
+ class ServerUtil {
21
+ DOMAIN_HOME = "/etc/nginx/sites-enabled";
22
+ ssh;
23
+ sftpConfig;
24
+ constructor(sftpConfig) {
25
+ this.ssh = new node_ssh_1.NodeSSH();
26
+ this.sftpConfig = sftpConfig;
27
+ }
28
+ async connectSSH() {
29
+ await this?.ssh?.connect({
30
+ host: this?.sftpConfig?.host,
31
+ port: this?.sftpConfig?.port,
32
+ username: this?.sftpConfig?.username,
33
+ password: this?.sftpConfig?.password,
34
+ });
35
+ }
36
+ async ensureConnected() {
37
+ if (!this?.ssh?.isConnected()) {
38
+ await this.connectSSH(); // Підключення, якщо ще не підключено
39
+ }
40
+ }
41
+ // Выконує команду або по SSH або локально, повертаючи текст незалежно від результату (помилка чи успіх)
42
+ async exec(command, options) {
43
+ await this.ensureConnected();
44
+ if (this?.ssh?.isConnected()) {
45
+ return (await this?.ssh?.execCommand(command, options)).stdout;
46
+ }
47
+ else {
48
+ return await new Promise((resolve) => {
49
+ execPromise(command, (err, stdout) => {
50
+ resolve(stdout);
51
+ });
52
+ });
53
+ }
54
+ }
55
+ // SSH
56
+ async generateSSHKey() {
57
+ await this.exec(`ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< n`);
58
+ let sshFingerprint = await this.exec(`cat ~/.ssh/id_rsa.pub`);
59
+ return sshFingerprint;
60
+ }
61
+ // create Directories in /Var
62
+ async createDirectories() {
63
+ await this.exec(`mkdir -p /var/www/ai`);
64
+ }
65
+ // install git
66
+ async installGit() {
67
+ await this.exec(`apt-get update; apt-get install -y git`);
68
+ }
69
+ // add ssh to bitbucket
70
+ async addBitbucketToKnownHosts() {
71
+ await this.exec(`ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts`);
72
+ }
73
+ // clone bitbucket Repository
74
+ async cloneRepository(repoName, targetPath) {
75
+ let gitResponse = await this.exec(`git clone git@bitbucket.org:bprtsk/${repoName}.git`, { cwd: targetPath });
76
+ if (gitResponse.includes(`Please make sure you have the correct access rights`)) {
77
+ throw new Error(`No access to the remote repository!`);
78
+ }
79
+ }
80
+ // не знаю чи треба але додав ?
81
+ // async checkoutBranch(branch: string, repoPath: string): Promise<void> {
82
+ // await this.exec(`git checkout -b ${branch}; git branch --set-upstream-to=origin/${branch} ${branch}; git reset --hard origin/${branch};`, { cwd: repoPath });
83
+ // }
84
+ // не знаю чи треба але додав ?
85
+ // async installJava(): Promise<void> {
86
+ // await this.exec(`apt-get update; apt-get install -y default-jre default-jdk`);
87
+ // }
88
+ // install Nginx
89
+ async installNginx() {
90
+ await this.exec(`apt-get update; apt-get install -y nginx`);
91
+ await this.exec(`systemctl enable nginx`);
92
+ await this.exec(`systemctl start nginx`);
93
+ }
94
+ // Nginx
95
+ async isNginxActive() {
96
+ try {
97
+ let result = await this.exec("systemctl status nginx");
98
+ if (result.includes("Active: active"))
99
+ return true;
100
+ }
101
+ catch (e) {
102
+ console.error(e);
103
+ }
104
+ return false;
105
+ }
106
+ // Mongo
107
+ async isMongoActive() {
108
+ try {
109
+ let result = await this.exec("systemctl status mongod");
110
+ if (result.includes("Active: active"))
111
+ return true;
112
+ }
113
+ catch (e) {
114
+ console.error(e);
115
+ }
116
+ return false;
117
+ }
118
+ mongoInstallCommand = `
119
+ echo "deb http://security.ubuntu.com/ubuntu focal-security main" | tee /etc/apt/sources.list.d/focal-security.list;
120
+ apt-get update;
121
+ apt-get install libssl1.1;
122
+ rm /etc/apt/sources.list.d/focal-security.list;
123
+
124
+ curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -;
125
+ echo "deb http://security.ubuntu.com/ubuntu impish-security main" | tee /etc/apt/sources.list.d/impish-security.list;
126
+ 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;
127
+ apt-get update;
128
+ apt-get install -y mongodb-org;
129
+ systemctl enable mongod.service;
130
+ systemctl start mongod;
131
+ `;
132
+ // checking if nginx configuration exists
133
+ async domainNginxConfigExists(host) {
134
+ try {
135
+ let result = await this.exec(`ls ${this.DOMAIN_HOME}/${host}.nginx.ssl.conf`);
136
+ if (result.includes("No such file or directory"))
137
+ return false;
138
+ }
139
+ catch (e) {
140
+ console.error(e);
141
+ }
142
+ return true;
143
+ }
144
+ // checking if the ssl certificate exists
145
+ async domainNginxCertsExist(host) {
146
+ try {
147
+ let result = await this.exec(`ls /etc/letsencrypt/live/${host}`);
148
+ if (result.includes("No such file or directory"))
149
+ return false;
150
+ }
151
+ catch (e) {
152
+ console.error(e);
153
+ }
154
+ return true;
155
+ }
156
+ // Certbot CRON
157
+ async isCerbotActive() {
158
+ try {
159
+ let result = await this.exec("which certbot");
160
+ if (result.includes("/usr/bin/certbot"))
161
+ return true;
162
+ }
163
+ catch (e) {
164
+ console.error(e);
165
+ }
166
+ return false;
167
+ }
168
+ // install certbot
169
+ async setupCertbot() {
170
+ await this?.ssh?.execCommand(`apt-get install -y certbot python3-certbot-nginx;`);
171
+ return true;
172
+ }
173
+ async setupSSL(email, host) {
174
+ // Прямий виклик this?.ssh?.execCommand
175
+ let certbotResponse = await this?.ssh?.execCommand(`certbot --non-interactive --agree-tos --nginx -m "${email}" -d "${host}"`);
176
+ if (certbotResponse?.stdout.includes(`Some challenges have failed.`)) {
177
+ throw new Error("Certbot encountered an error");
178
+ }
179
+ await this?.ssh?.execCommand(`echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -`);
180
+ }
181
+ // Git
182
+ async refresh() {
183
+ await this.exec(`git stash; rm-rf built; git pull`);
184
+ return true;
185
+ }
186
+ async uploadDirectoryToSftp(localPath, remotePath, sftpConfig) {
187
+ const sftp = new ssh2_sftp_client_1.default();
188
+ try {
189
+ await sftp.connect(sftpConfig);
190
+ const stats = fs_1.default.statSync(localPath);
191
+ if (stats.isDirectory()) {
192
+ // Якщо це директорія
193
+ await sftp.mkdir(remotePath, true).catch(async (err) => {
194
+ if (err.code !== 4) { // Ігноруємо помилку "Directory already exists"
195
+ console.error(`Помилка під час створення папки: ${remotePath}`, err);
196
+ throw err;
197
+ }
198
+ });
199
+ const items = fs_1.default.readdirSync(localPath, { withFileTypes: true });
200
+ for (const item of items) {
201
+ const localItemPath = path_1.default.join(localPath, item.name);
202
+ const remoteItemPath = `${remotePath}/${item.name}`;
203
+ if (item.isDirectory()) {
204
+ await this.uploadDirectoryToSftp(localItemPath, remoteItemPath, sftpConfig);
205
+ }
206
+ else {
207
+ await sftp.put(localItemPath, remoteItemPath);
208
+ console.log(`Передано файл: ${localItemPath} -> ${remoteItemPath}`);
209
+ }
210
+ }
211
+ }
212
+ else if (stats.isFile()) {
213
+ // Якщо це файл
214
+ await sftp.put(localPath, remotePath);
215
+ console.log(`Передано файл: ${localPath} -> ${remotePath}`);
216
+ }
217
+ console.log('Усі файли та папки успішно передані.');
218
+ }
219
+ catch (err) {
220
+ console.error('Помилка під час передавання файлів через SFTP:', err);
221
+ }
222
+ finally {
223
+ await sftp.end();
224
+ }
225
+ }
226
+ ensureDirectoryExistence(dirPath) {
227
+ if (!fs_1.default.existsSync(dirPath)) {
228
+ fs_1.default.mkdirSync(dirPath, { recursive: true });
229
+ }
230
+ }
231
+ async generateNginxConfig(domain, rootPath) {
232
+ const templatePath = path_1.default.join(__dirname, "..", "templates", "nginx-template.conf");
233
+ const template = fs_1.default.readFileSync(templatePath, "utf8");
234
+ let config = mustache_1.default.render(template, { domain, rootPath });
235
+ // Заміна закодованих символів назад на їх оригінальні значення
236
+ config = config.replace(/&#x2F;/g, '/');
237
+ return config;
238
+ }
239
+ async extractUploadedZip(name, file, extractToPath) {
240
+ const zipFilePath = file.path;
241
+ const outputDir = path_1.default.join(extractToPath, name);
242
+ console.log('Looking for ZIP file at:', zipFilePath);
243
+ console.log('Extracting to:', outputDir);
244
+ this.ensureDirectoryExistence(outputDir);
245
+ if (!fs_1.default.existsSync(zipFilePath)) {
246
+ console.error('Error: File not found:', zipFilePath);
247
+ return;
248
+ }
249
+ try {
250
+ await new Promise((resolve, reject) => {
251
+ fs_1.default.createReadStream(zipFilePath)
252
+ .pipe(unzipper_1.default.Parse())
253
+ .on('entry', (entry) => {
254
+ // Видаляємо перший сегмент шляху, щоб уникнути кореневої директорії
255
+ const entryPath = path_1.default.join(outputDir, ...entry.path.split('/').slice(1));
256
+ if (entry.type === 'Directory') {
257
+ this.ensureDirectoryExistence(entryPath);
258
+ }
259
+ else {
260
+ this.ensureDirectoryExistence(path_1.default.dirname(entryPath));
261
+ entry.pipe(fs_1.default.createWriteStream(entryPath));
262
+ }
263
+ })
264
+ .on('close', resolve)
265
+ .on('error', reject);
266
+ });
267
+ console.log('File successfully extracted.');
268
+ }
269
+ catch (err) {
270
+ console.error('Error extracting file:', err);
271
+ }
272
+ }
273
+ async ensureDirectoryExistsViaSSH(remoteDir) {
274
+ try {
275
+ // Перевірка, чи існує директорія, і створення її, якщо вона не існує
276
+ const command = `if [ ! -d "${remoteDir}" ]; then mkdir -p "${remoteDir}"; fi`;
277
+ await this?.ssh?.execCommand(command);
278
+ console.log(`Перевірено або створено папку: ${remoteDir}`);
279
+ }
280
+ catch (err) {
281
+ console.error('Помилка під час перевірки або створення папки через SSH:', err);
282
+ throw err;
283
+ }
284
+ finally {
285
+ this?.ssh?.dispose();
286
+ }
287
+ }
288
+ async disconnectSSH() {
289
+ this?.ssh?.dispose();
290
+ }
291
+ }
292
+ exports.ServerUtil = ServerUtil;