cyberia 2.8.885

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 (525) hide show
  1. package/.dockerignore +15 -0
  2. package/.env.development +45 -0
  3. package/.env.production +50 -0
  4. package/.env.test +45 -0
  5. package/.github/workflows/engine-cyberia.cd.yml +31 -0
  6. package/.github/workflows/engine-cyberia.ci.yml +60 -0
  7. package/.github/workflows/ghpkg.ci.yml +87 -0
  8. package/.github/workflows/npmpkg.ci.yml +72 -0
  9. package/.github/workflows/publish.ci.yml +84 -0
  10. package/.github/workflows/publish.cyberia.ci.yml +84 -0
  11. package/.github/workflows/pwa-microservices-template-page.cd.yml +72 -0
  12. package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
  13. package/.github/workflows/release.cd.yml +37 -0
  14. package/.nycrc +9 -0
  15. package/.prettierignore +13 -0
  16. package/.prettierrc +9 -0
  17. package/.vscode/extensions.json +51 -0
  18. package/.vscode/settings.json +87 -0
  19. package/AUTHORS.md +21 -0
  20. package/CHANGELOG.md +205 -0
  21. package/Dockerfile +28 -0
  22. package/LICENSE +21 -0
  23. package/README.md +85 -0
  24. package/bin/build.js +209 -0
  25. package/bin/cron.js +47 -0
  26. package/bin/cyberia.js +145 -0
  27. package/bin/db.js +199 -0
  28. package/bin/deploy.js +1293 -0
  29. package/bin/file.js +197 -0
  30. package/bin/hwt.js +49 -0
  31. package/bin/index.js +145 -0
  32. package/bin/ssl.js +63 -0
  33. package/bin/util.js +80 -0
  34. package/bin/vs.js +74 -0
  35. package/cli.md +714 -0
  36. package/conf.js +204 -0
  37. package/deployment.yaml +138 -0
  38. package/jsconfig.json +7 -0
  39. package/jsdoc.json +32 -0
  40. package/manifests/deployment/adminer/deployment.yaml +32 -0
  41. package/manifests/deployment/adminer/kustomization.yaml +7 -0
  42. package/manifests/deployment/adminer/service.yaml +13 -0
  43. package/manifests/deployment/dd-default-development/deployment.yaml +167 -0
  44. package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
  45. package/manifests/deployment/dd-test-development/deployment.yaml +174 -0
  46. package/manifests/deployment/dd-test-development/proxy.yaml +51 -0
  47. package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
  48. package/manifests/deployment/fastapi/backend-service.yml +19 -0
  49. package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
  50. package/manifests/deployment/fastapi/frontend-service.yml +15 -0
  51. package/manifests/deployment/fastapi/initial_data.sh +56 -0
  52. package/manifests/deployment/kafka/deployment.yaml +69 -0
  53. package/manifests/deployment/mongo-express/deployment.yaml +60 -0
  54. package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
  55. package/manifests/deployment/spark/spark-pi-py.yaml +21 -0
  56. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
  57. package/manifests/envoy-service-nodeport.yaml +23 -0
  58. package/manifests/grafana/deployment.yaml +57 -0
  59. package/manifests/grafana/kustomization.yaml +7 -0
  60. package/manifests/grafana/pvc.yaml +12 -0
  61. package/manifests/grafana/service.yaml +14 -0
  62. package/manifests/kind-config-dev.yaml +12 -0
  63. package/manifests/kind-config.yaml +12 -0
  64. package/manifests/kubeadm-calico-config.yaml +119 -0
  65. package/manifests/kubelet-config.yaml +65 -0
  66. package/manifests/letsencrypt-prod.yaml +15 -0
  67. package/manifests/lxd/lxd-admin-profile.yaml +17 -0
  68. package/manifests/lxd/lxd-preseed.yaml +30 -0
  69. package/manifests/lxd/underpost-setup.sh +163 -0
  70. package/manifests/mariadb/config.yaml +10 -0
  71. package/manifests/mariadb/kustomization.yaml +9 -0
  72. package/manifests/mariadb/pv.yaml +12 -0
  73. package/manifests/mariadb/pvc.yaml +10 -0
  74. package/manifests/mariadb/secret.yaml +8 -0
  75. package/manifests/mariadb/service.yaml +10 -0
  76. package/manifests/mariadb/statefulset.yaml +56 -0
  77. package/manifests/mariadb/storage-class.yaml +10 -0
  78. package/manifests/mongodb/backup-access.yaml +16 -0
  79. package/manifests/mongodb/backup-cronjob.yaml +42 -0
  80. package/manifests/mongodb/backup-pv-pvc.yaml +22 -0
  81. package/manifests/mongodb/configmap.yaml +26 -0
  82. package/manifests/mongodb/headless-service.yaml +10 -0
  83. package/manifests/mongodb/kustomization.yaml +11 -0
  84. package/manifests/mongodb/pv-pvc.yaml +23 -0
  85. package/manifests/mongodb/statefulset.yaml +126 -0
  86. package/manifests/mongodb/storage-class.yaml +9 -0
  87. package/manifests/mongodb-4.4/kustomization.yaml +7 -0
  88. package/manifests/mongodb-4.4/pv-pvc.yaml +23 -0
  89. package/manifests/mongodb-4.4/service-deployment.yaml +63 -0
  90. package/manifests/mysql/kustomization.yaml +7 -0
  91. package/manifests/mysql/pv-pvc.yaml +27 -0
  92. package/manifests/mysql/statefulset.yaml +55 -0
  93. package/manifests/postgresql/configmap.yaml +9 -0
  94. package/manifests/postgresql/kustomization.yaml +10 -0
  95. package/manifests/postgresql/pv.yaml +15 -0
  96. package/manifests/postgresql/pvc.yaml +13 -0
  97. package/manifests/postgresql/service.yaml +10 -0
  98. package/manifests/postgresql/statefulset.yaml +37 -0
  99. package/manifests/prometheus/deployment.yaml +82 -0
  100. package/manifests/valkey/kustomization.yaml +7 -0
  101. package/manifests/valkey/service.yaml +11 -0
  102. package/manifests/valkey/statefulset.yaml +38 -0
  103. package/nodemon.json +6 -0
  104. package/package.json +118 -0
  105. package/proxy.yaml +35 -0
  106. package/scripts/device-scan.sh +43 -0
  107. package/scripts/gpu-diag.sh +19 -0
  108. package/scripts/maas-setup.sh +120 -0
  109. package/scripts/nat-iptables.sh +26 -0
  110. package/scripts/nvim.sh +91 -0
  111. package/scripts/snap-clean.sh +26 -0
  112. package/scripts/ssh-cluster-info.sh +14 -0
  113. package/scripts/ssl.sh +164 -0
  114. package/src/api/blockchain/blockchain.controller.js +51 -0
  115. package/src/api/blockchain/blockchain.model.js +90 -0
  116. package/src/api/blockchain/blockchain.router.js +21 -0
  117. package/src/api/blockchain/blockchain.service.js +24 -0
  118. package/src/api/core/core.controller.js +69 -0
  119. package/src/api/core/core.model.js +11 -0
  120. package/src/api/core/core.router.js +24 -0
  121. package/src/api/core/core.service.js +35 -0
  122. package/src/api/crypto/crypto.controller.js +51 -0
  123. package/src/api/crypto/crypto.model.js +23 -0
  124. package/src/api/crypto/crypto.router.js +20 -0
  125. package/src/api/crypto/crypto.service.js +64 -0
  126. package/src/api/default/default.controller.js +74 -0
  127. package/src/api/default/default.model.js +20 -0
  128. package/src/api/default/default.router.js +27 -0
  129. package/src/api/default/default.service.js +40 -0
  130. package/src/api/document/document.controller.js +66 -0
  131. package/src/api/document/document.model.js +51 -0
  132. package/src/api/document/document.router.js +24 -0
  133. package/src/api/document/document.service.js +133 -0
  134. package/src/api/file/file.controller.js +67 -0
  135. package/src/api/file/file.model.js +19 -0
  136. package/src/api/file/file.router.js +22 -0
  137. package/src/api/file/file.service.js +100 -0
  138. package/src/api/instance/instance.controller.js +69 -0
  139. package/src/api/instance/instance.model.js +40 -0
  140. package/src/api/instance/instance.router.js +34 -0
  141. package/src/api/instance/instance.service.js +70 -0
  142. package/src/api/ipfs/ipfs.controller.js +51 -0
  143. package/src/api/ipfs/ipfs.model.js +17 -0
  144. package/src/api/ipfs/ipfs.router.js +20 -0
  145. package/src/api/ipfs/ipfs.service.js +25 -0
  146. package/src/api/object-layer/README.md +85 -0
  147. package/src/api/object-layer/object-layer.controller.js +69 -0
  148. package/src/api/object-layer/object-layer.model.js +181 -0
  149. package/src/api/object-layer/object-layer.router.js +29 -0
  150. package/src/api/object-layer/object-layer.service.js +49 -0
  151. package/src/api/test/test.controller.js +59 -0
  152. package/src/api/test/test.model.js +14 -0
  153. package/src/api/test/test.router.js +21 -0
  154. package/src/api/test/test.service.js +35 -0
  155. package/src/api/user/postman_collection.json +216 -0
  156. package/src/api/user/user.build.js +16 -0
  157. package/src/api/user/user.controller.js +35 -0
  158. package/src/api/user/user.model.js +100 -0
  159. package/src/api/user/user.router.js +400 -0
  160. package/src/api/user/user.service.js +500 -0
  161. package/src/api.js +23 -0
  162. package/src/cli/baremetal.js +1310 -0
  163. package/src/cli/cloud-init.js +548 -0
  164. package/src/cli/cluster.js +834 -0
  165. package/src/cli/cron.js +95 -0
  166. package/src/cli/db.js +414 -0
  167. package/src/cli/deploy.js +661 -0
  168. package/src/cli/env.js +101 -0
  169. package/src/cli/fs.js +256 -0
  170. package/src/cli/image.js +156 -0
  171. package/src/cli/index.js +436 -0
  172. package/src/cli/lxd.js +402 -0
  173. package/src/cli/monitor.js +260 -0
  174. package/src/cli/repository.js +274 -0
  175. package/src/cli/run.js +728 -0
  176. package/src/cli/script.js +85 -0
  177. package/src/cli/secrets.js +71 -0
  178. package/src/cli/ssh.js +46 -0
  179. package/src/cli/test.js +159 -0
  180. package/src/client/Cyberia.index.js +50 -0
  181. package/src/client/CyberiaAdmin.index.js +34 -0
  182. package/src/client/CyberiaPortal.index.js +36 -0
  183. package/src/client/Default.index.js +84 -0
  184. package/src/client/components/core/404.js +20 -0
  185. package/src/client/components/core/500.js +20 -0
  186. package/src/client/components/core/Account.js +326 -0
  187. package/src/client/components/core/AgGrid.js +191 -0
  188. package/src/client/components/core/Alert.js +77 -0
  189. package/src/client/components/core/Auth.js +342 -0
  190. package/src/client/components/core/Badge.js +32 -0
  191. package/src/client/components/core/Blockchain.js +41 -0
  192. package/src/client/components/core/Blog.js +9 -0
  193. package/src/client/components/core/BtnIcon.js +111 -0
  194. package/src/client/components/core/CalendarCore.js +464 -0
  195. package/src/client/components/core/Chat.js +64 -0
  196. package/src/client/components/core/ColorPalette.js +5267 -0
  197. package/src/client/components/core/CommonJs.js +1010 -0
  198. package/src/client/components/core/Content.js +196 -0
  199. package/src/client/components/core/Css.js +1099 -0
  200. package/src/client/components/core/CssCore.js +882 -0
  201. package/src/client/components/core/D3Chart.js +44 -0
  202. package/src/client/components/core/Docs.js +376 -0
  203. package/src/client/components/core/DropDown.js +223 -0
  204. package/src/client/components/core/EventsUI.js +133 -0
  205. package/src/client/components/core/FileExplorer.js +707 -0
  206. package/src/client/components/core/FullScreen.js +36 -0
  207. package/src/client/components/core/Input.js +383 -0
  208. package/src/client/components/core/JoyStick.js +80 -0
  209. package/src/client/components/core/Keyboard.js +73 -0
  210. package/src/client/components/core/LoadingAnimation.js +159 -0
  211. package/src/client/components/core/LogIn.js +190 -0
  212. package/src/client/components/core/LogOut.js +63 -0
  213. package/src/client/components/core/Logger.js +29 -0
  214. package/src/client/components/core/Modal.js +2494 -0
  215. package/src/client/components/core/NotificationManager.js +84 -0
  216. package/src/client/components/core/ObjectLayerEngine.js +1229 -0
  217. package/src/client/components/core/ObjectLayerEngineModal.js +443 -0
  218. package/src/client/components/core/Pagination.js +207 -0
  219. package/src/client/components/core/Panel.js +772 -0
  220. package/src/client/components/core/PanelForm.js +627 -0
  221. package/src/client/components/core/Polyhedron.js +162 -0
  222. package/src/client/components/core/Recover.js +207 -0
  223. package/src/client/components/core/Responsive.js +82 -0
  224. package/src/client/components/core/RichText.js +43 -0
  225. package/src/client/components/core/Router.js +317 -0
  226. package/src/client/components/core/Scroll.js +76 -0
  227. package/src/client/components/core/SignUp.js +125 -0
  228. package/src/client/components/core/SocketIo.js +74 -0
  229. package/src/client/components/core/Stream.js +113 -0
  230. package/src/client/components/core/ToggleSwitch.js +101 -0
  231. package/src/client/components/core/ToolTip.js +90 -0
  232. package/src/client/components/core/Translate.js +522 -0
  233. package/src/client/components/core/Validator.js +115 -0
  234. package/src/client/components/core/VanillaJs.js +423 -0
  235. package/src/client/components/core/Wallet.js +106 -0
  236. package/src/client/components/core/WebComponent.js +44 -0
  237. package/src/client/components/core/Webhook.js +25 -0
  238. package/src/client/components/core/Worker.js +371 -0
  239. package/src/client/components/core/windowGetDimensions.js +269 -0
  240. package/src/client/components/cyberia/BagCyberia.js +1253 -0
  241. package/src/client/components/cyberia/BiomeCyberia.js +130 -0
  242. package/src/client/components/cyberia/CharacterCyberia.js +321 -0
  243. package/src/client/components/cyberia/CommonCyberia.js +1834 -0
  244. package/src/client/components/cyberia/CssCyberia.js +816 -0
  245. package/src/client/components/cyberia/ElementPreviewCyberia.js +183 -0
  246. package/src/client/components/cyberia/ElementsCyberia.js +146 -0
  247. package/src/client/components/cyberia/InteractionPanelCyberia.js +1043 -0
  248. package/src/client/components/cyberia/JoyStickCyberia.js +53 -0
  249. package/src/client/components/cyberia/LogInCyberia.js +68 -0
  250. package/src/client/components/cyberia/LogOutCyberia.js +24 -0
  251. package/src/client/components/cyberia/MainUserCyberia.js +424 -0
  252. package/src/client/components/cyberia/MapCyberia.js +160 -0
  253. package/src/client/components/cyberia/MatrixCyberia.js +147 -0
  254. package/src/client/components/cyberia/MenuCyberia.js +575 -0
  255. package/src/client/components/cyberia/PixiCyberia.js +1639 -0
  256. package/src/client/components/cyberia/PointAndClickMovementCyberia.js +146 -0
  257. package/src/client/components/cyberia/QuestCyberia.js +1420 -0
  258. package/src/client/components/cyberia/RoutesCyberia.js +47 -0
  259. package/src/client/components/cyberia/SettingsCyberia.js +16 -0
  260. package/src/client/components/cyberia/SignUpCyberia.js +14 -0
  261. package/src/client/components/cyberia/SkillCyberia.js +124 -0
  262. package/src/client/components/cyberia/SocketIoCyberia.js +211 -0
  263. package/src/client/components/cyberia/TileCyberia.js +685 -0
  264. package/src/client/components/cyberia/TranslateCyberia.js +96 -0
  265. package/src/client/components/cyberia/UniverseCyberia.js +14 -0
  266. package/src/client/components/cyberia/WebhookCyberia.js +13 -0
  267. package/src/client/components/cyberia/WikiCyberia.js +144 -0
  268. package/src/client/components/cyberia/WorldCyberia.js +680 -0
  269. package/src/client/components/cyberia-admin/BiomeCyberiaAdmin.js +978 -0
  270. package/src/client/components/cyberia-admin/CommonCyberiaAdmin.js +29 -0
  271. package/src/client/components/cyberia-admin/CssCyberiaAdmin.js +15 -0
  272. package/src/client/components/cyberia-admin/ElementsCyberiaAdmin.js +38 -0
  273. package/src/client/components/cyberia-admin/InstanceEngineCyberiaAdmin.js +180 -0
  274. package/src/client/components/cyberia-admin/LogInCyberiaAdmin.js +34 -0
  275. package/src/client/components/cyberia-admin/LogOutCyberiaAdmin.js +24 -0
  276. package/src/client/components/cyberia-admin/MenuCyberiaAdmin.js +660 -0
  277. package/src/client/components/cyberia-admin/RoutesCyberiaAdmin.js +57 -0
  278. package/src/client/components/cyberia-admin/ServerCyberiaAdmin.js +129 -0
  279. package/src/client/components/cyberia-admin/SettingsCyberiaAdmin.js +16 -0
  280. package/src/client/components/cyberia-admin/SignUpCyberiaAdmin.js +11 -0
  281. package/src/client/components/cyberia-admin/SocketIoCyberiaAdmin.js +53 -0
  282. package/src/client/components/cyberia-admin/TranslateCyberiaAdmin.js +7 -0
  283. package/src/client/components/cyberia-biome/CityCyberiaBiome.js +209 -0
  284. package/src/client/components/cyberia-biome/CityInteriorCyberiaBiome.js +253 -0
  285. package/src/client/components/cyberia-biome/ColorChaosCyberiaBiome.js +26 -0
  286. package/src/client/components/cyberia-biome/ForestCyberiaBiome.js +191 -0
  287. package/src/client/components/cyberia-biome/GridBaseCyberiaBiome.js +364 -0
  288. package/src/client/components/cyberia-biome/SeedCityCyberiaBiome.js +347 -0
  289. package/src/client/components/cyberia-biome/ShopCyberiaBiome.js +12 -0
  290. package/src/client/components/cyberia-biome/SpaceCyberiaBiome.js +58 -0
  291. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +29 -0
  292. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +132 -0
  293. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +38 -0
  294. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +18 -0
  295. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +12 -0
  296. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +487 -0
  297. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +45 -0
  298. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +136 -0
  299. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
  300. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +11 -0
  301. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +52 -0
  302. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +12 -0
  303. package/src/client/components/default/CommonDefault.js +29 -0
  304. package/src/client/components/default/CssDefault.js +27 -0
  305. package/src/client/components/default/ElementsDefault.js +38 -0
  306. package/src/client/components/default/LogInDefault.js +14 -0
  307. package/src/client/components/default/LogOutDefault.js +10 -0
  308. package/src/client/components/default/MenuDefault.js +743 -0
  309. package/src/client/components/default/RoutesDefault.js +48 -0
  310. package/src/client/components/default/SettingsDefault.js +16 -0
  311. package/src/client/components/default/SignUpDefault.js +9 -0
  312. package/src/client/components/default/SocketIoDefault.js +54 -0
  313. package/src/client/components/default/TranslateDefault.js +7 -0
  314. package/src/client/public/default/android-chrome-144x144.png +0 -0
  315. package/src/client/public/default/android-chrome-192x192.png +0 -0
  316. package/src/client/public/default/android-chrome-256x256.png +0 -0
  317. package/src/client/public/default/android-chrome-36x36.png +0 -0
  318. package/src/client/public/default/android-chrome-384x384.png +0 -0
  319. package/src/client/public/default/android-chrome-48x48.png +0 -0
  320. package/src/client/public/default/android-chrome-512x512.png +0 -0
  321. package/src/client/public/default/android-chrome-72x72.png +0 -0
  322. package/src/client/public/default/android-chrome-96x96.png +0 -0
  323. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  324. package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
  325. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  326. package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
  327. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  328. package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
  329. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  330. package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
  331. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  332. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  333. package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
  334. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  335. package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
  336. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  337. package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
  338. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  339. package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
  340. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  341. package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
  342. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  343. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  344. package/src/client/public/default/apple-touch-icon.png +0 -0
  345. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  346. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  347. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  348. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  349. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  350. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  351. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  352. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  353. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  354. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  355. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  356. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  357. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  358. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  359. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  360. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  361. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  362. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  363. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  364. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  365. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  366. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  367. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  368. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  369. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  370. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  371. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  372. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  373. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  374. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  375. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  376. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  377. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  378. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  379. package/src/client/public/default/assets/background/dark.jpg +0 -0
  380. package/src/client/public/default/assets/background/dark.svg +557 -0
  381. package/src/client/public/default/assets/background/white.jpg +0 -0
  382. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  383. package/src/client/public/default/assets/background/white0.jpg +0 -0
  384. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  385. package/src/client/public/default/assets/logo/underpost.gif +0 -0
  386. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  387. package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
  388. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  389. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  390. package/src/client/public/default/browserconfig.xml +12 -0
  391. package/src/client/public/default/favicon-16x16.png +0 -0
  392. package/src/client/public/default/favicon-32x32.png +0 -0
  393. package/src/client/public/default/favicon-48x48.png +0 -0
  394. package/src/client/public/default/favicon.ico +0 -0
  395. package/src/client/public/default/manifest.webmanifest +69 -0
  396. package/src/client/public/default/mstile-144x144.png +0 -0
  397. package/src/client/public/default/mstile-150x150.png +0 -0
  398. package/src/client/public/default/mstile-310x150.png +0 -0
  399. package/src/client/public/default/mstile-310x310.png +0 -0
  400. package/src/client/public/default/mstile-70x70.png +0 -0
  401. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  402. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  403. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  404. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  405. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  406. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  407. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  408. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  409. package/src/client/public/default/safari-pinned-tab.svg +24 -0
  410. package/src/client/public/default/site.webmanifest +69 -0
  411. package/src/client/public/default/sitemap +148 -0
  412. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  413. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  414. package/src/client/public/doc/favicon.ico +0 -0
  415. package/src/client/public/doc/sitemap +148 -0
  416. package/src/client/public/test/favicon.ico +0 -0
  417. package/src/client/public/test/sitemap +148 -0
  418. package/src/client/services/blockchain/blockchain.service.js +73 -0
  419. package/src/client/services/core/core.service.js +165 -0
  420. package/src/client/services/crypto/crypto.service.js +73 -0
  421. package/src/client/services/default/default.management.js +450 -0
  422. package/src/client/services/default/default.service.js +98 -0
  423. package/src/client/services/document/document.service.js +97 -0
  424. package/src/client/services/file/file.service.js +72 -0
  425. package/src/client/services/instance/instance.management.js +78 -0
  426. package/src/client/services/instance/instance.service.js +97 -0
  427. package/src/client/services/ipfs/ipfs.service.js +73 -0
  428. package/src/client/services/object-layer/object-layer.service.js +93 -0
  429. package/src/client/services/test/test.service.js +73 -0
  430. package/src/client/services/user/user.management.js +56 -0
  431. package/src/client/services/user/user.service.js +108 -0
  432. package/src/client/ssr/Render.js +237 -0
  433. package/src/client/ssr/body/404.js +73 -0
  434. package/src/client/ssr/body/500.js +72 -0
  435. package/src/client/ssr/body/CacheControl.js +114 -0
  436. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +90 -0
  437. package/src/client/ssr/body/CyberiaSplashScreenLore.js +424 -0
  438. package/src/client/ssr/body/DefaultSplashScreen.js +90 -0
  439. package/src/client/ssr/email/DefaultRecoverEmail.js +21 -0
  440. package/src/client/ssr/email/DefaultVerifyEmail.js +17 -0
  441. package/src/client/ssr/head/Css.js +241 -0
  442. package/src/client/ssr/head/CyberiaAdminScripts.js +6 -0
  443. package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
  444. package/src/client/ssr/head/CyberiaScripts.js +6 -0
  445. package/src/client/ssr/head/DefaultScripts.js +6 -0
  446. package/src/client/ssr/head/Microdata.js +11 -0
  447. package/src/client/ssr/head/Production.js +1 -0
  448. package/src/client/ssr/head/Pwa.js +146 -0
  449. package/src/client/ssr/head/Seo.js +15 -0
  450. package/src/client/ssr/mailer/DefaultRecoverEmail.js +21 -0
  451. package/src/client/ssr/mailer/DefaultVerifyEmail.js +17 -0
  452. package/src/client/ssr/offline/Maintenance.js +63 -0
  453. package/src/client/ssr/offline/NoNetworkConnection.js +67 -0
  454. package/src/client/ssr/pages/404.js +12 -0
  455. package/src/client/ssr/pages/500.js +12 -0
  456. package/src/client/ssr/pages/Test.js +198 -0
  457. package/src/client/ssr/pages/maintenance.js +14 -0
  458. package/src/client/ssr/pages/offline.js +21 -0
  459. package/src/client/sw/default.sw.js +108 -0
  460. package/src/client/sw/template.sw.js +84 -0
  461. package/src/client.build.js +22 -0
  462. package/src/client.dev.js +24 -0
  463. package/src/db/DataBaseProvider.js +98 -0
  464. package/src/db/mariadb/MariaDB.js +66 -0
  465. package/src/db/mongo/MongooseDB.js +70 -0
  466. package/src/index.js +198 -0
  467. package/src/mailer/EmailRender.js +116 -0
  468. package/src/mailer/MailerProvider.js +213 -0
  469. package/src/monitor.js +24 -0
  470. package/src/proxy.js +22 -0
  471. package/src/runtime/express/Express.js +256 -0
  472. package/src/runtime/lampp/Dockerfile +50 -0
  473. package/src/runtime/lampp/Lampp.js +343 -0
  474. package/src/server/auth.js +689 -0
  475. package/src/server/backup.js +96 -0
  476. package/src/server/client-build-docs.js +205 -0
  477. package/src/server/client-build-live.js +109 -0
  478. package/src/server/client-build.js +690 -0
  479. package/src/server/client-dev-server.js +87 -0
  480. package/src/server/client-formatted.js +87 -0
  481. package/src/server/client-icons.js +108 -0
  482. package/src/server/conf.js +1071 -0
  483. package/src/server/crypto.js +210 -0
  484. package/src/server/dns.js +276 -0
  485. package/src/server/downloader.js +74 -0
  486. package/src/server/json-schema.js +77 -0
  487. package/src/server/logger.js +197 -0
  488. package/src/server/network.js +72 -0
  489. package/src/server/object-layer.js +294 -0
  490. package/src/server/peer.js +69 -0
  491. package/src/server/process.js +171 -0
  492. package/src/server/proxy.js +110 -0
  493. package/src/server/runtime.js +170 -0
  494. package/src/server/ssr.js +127 -0
  495. package/src/server/start.js +161 -0
  496. package/src/server/tls.js +251 -0
  497. package/src/server/valkey.js +293 -0
  498. package/src/server.js +25 -0
  499. package/src/ws/IoInterface.js +139 -0
  500. package/src/ws/IoServer.js +88 -0
  501. package/src/ws/core/channels/core.ws.chat.js +23 -0
  502. package/src/ws/core/channels/core.ws.mailer.js +35 -0
  503. package/src/ws/core/channels/core.ws.stream.js +31 -0
  504. package/src/ws/core/core.ws.connection.js +62 -0
  505. package/src/ws/core/core.ws.emit.js +53 -0
  506. package/src/ws/core/core.ws.server.js +76 -0
  507. package/src/ws/core/management/core.ws.chat.js +8 -0
  508. package/src/ws/core/management/core.ws.mailer.js +16 -0
  509. package/src/ws/core/management/core.ws.stream.js +8 -0
  510. package/src/ws/cyberia/channels/cyberia.ws.bot.js +56 -0
  511. package/src/ws/cyberia/channels/cyberia.ws.skill.js +51 -0
  512. package/src/ws/cyberia/channels/cyberia.ws.user.js +437 -0
  513. package/src/ws/cyberia/cyberia.ws.connection.js +36 -0
  514. package/src/ws/cyberia/cyberia.ws.emit.js +14 -0
  515. package/src/ws/cyberia/cyberia.ws.server.js +67 -0
  516. package/src/ws/cyberia/management/cyberia.ws.bot.js +669 -0
  517. package/src/ws/cyberia/management/cyberia.ws.skill.js +441 -0
  518. package/src/ws/cyberia/management/cyberia.ws.user.js +188 -0
  519. package/src/ws/default/channels/default.ws.main.js +16 -0
  520. package/src/ws/default/default.ws.connection.js +22 -0
  521. package/src/ws/default/default.ws.emit.js +14 -0
  522. package/src/ws/default/default.ws.server.js +20 -0
  523. package/src/ws/default/management/default.ws.main.js +8 -0
  524. package/test/api.test.js +53 -0
  525. package/test/crypto.test.js +117 -0
package/src/cli/lxd.js ADDED
@@ -0,0 +1,402 @@
1
+ /**
2
+ * LXD module for managing LXD virtual machines and networks.
3
+ * @module src/cli/lxd.js
4
+ * @namespace UnderpostLxd
5
+ */
6
+
7
+ import { getNpmRootPath } from '../server/conf.js';
8
+ import { getLocalIPv4Address } from '../server/dns.js';
9
+ import { pbcopy, shellExec } from '../server/process.js';
10
+ import fs from 'fs-extra';
11
+
12
+ /**
13
+ * @class UnderpostLxd
14
+ * @description Provides a set of static methods to interact with LXD,
15
+ * encapsulating common LXD operations for VM management and network testing.
16
+ */
17
+ class UnderpostLxd {
18
+ static API = {
19
+ /**
20
+ * @method callback
21
+ * @description Main entry point for LXD operations based on provided options.
22
+ * @param {object} options - Configuration options for LXD operations.
23
+ * @param {boolean} [options.init=false] - Initialize LXD.
24
+ * @param {boolean} [options.reset=false] - Reset LXD installation.
25
+ * @param {boolean} [options.dev=false] - Run in development mode (adjusts paths).
26
+ * @param {boolean} [options.install=false] - Install LXD snap.
27
+ * @param {boolean} [options.createVirtualNetwork=false] - Create default LXD bridge network (lxdbr0).
28
+ * @param {boolean} [options.createAdminProfile=false] - Create admin-profile for VMs.
29
+ * @param {boolean} [options.control=false] - Flag for control plane VM initialization.
30
+ * @param {boolean} [options.worker=false] - Flag for worker node VM initialization.
31
+ * @param {boolean} [options.k3s=false] - Flag to indicate K3s cluster type for VM initialization.
32
+ * @param {string} [options.initVm=''] - Initialize a specific VM.
33
+ * @param {string} [options.createVm=''] - Create a new VM with the given name.
34
+ * @param {string} [options.infoVm=''] - Display information about a specific VM.
35
+ * @param {string} [options.rootSize=''] - Root disk size for new VMs (e.g., '32GiB').
36
+ * @param {string} [options.joinNode=''] - Join a worker node to a control plane (format: 'workerName,controlName').
37
+ * @param {string} [options.expose=''] - Expose ports from a VM to the host (format: 'vmName:port1,port2').
38
+ * @param {string} [options.deleteExpose=''] - Delete exposed ports from a VM (format: 'vmName:port1,port2').
39
+ * @param {string} [options.test=''] - Test health, status and network connectivity for a VM.
40
+ * @param {string} [options.autoExposeK8sPorts=''] - Automatically expose common Kubernetes ports for the VM.
41
+ * @memberof UnderpostLxd
42
+ */
43
+ async callback(
44
+ options = {
45
+ init: false,
46
+ reset: false,
47
+ dev: false,
48
+ install: false,
49
+ createVirtualNetwork: false,
50
+ createAdminProfile: false,
51
+ control: false,
52
+ worker: false,
53
+ k3s: false,
54
+ initVm: '',
55
+ createVm: '',
56
+ infoVm: '',
57
+ rootSize: '',
58
+ joinNode: '',
59
+ expose: '',
60
+ deleteExpose: '',
61
+ test: '',
62
+ autoExposeK8sPorts: '',
63
+ },
64
+ ) {
65
+ const npmRoot = getNpmRootPath();
66
+ const underpostRoot = options?.dev === true ? '.' : `${npmRoot}/underpost`;
67
+ if (options.reset === true) {
68
+ shellExec(`sudo systemctl stop snap.lxd.daemon || true`);
69
+ shellExec(`sudo snap remove lxd --purge || true`);
70
+ }
71
+ if (options.install === true) shellExec(`sudo snap install lxd`);
72
+ if (options.init === true) {
73
+ shellExec(`sudo systemctl start snap.lxd.daemon`);
74
+ shellExec(`sudo systemctl status snap.lxd.daemon`);
75
+ const lxdPressedContent = fs
76
+ .readFileSync(`${underpostRoot}/manifests/lxd/lxd-preseed.yaml`, 'utf8')
77
+ .replaceAll(`127.0.0.1`, getLocalIPv4Address());
78
+ shellExec(`echo "${lxdPressedContent}" | lxd init --preseed`);
79
+ shellExec(`lxc cluster list`);
80
+ }
81
+ if (options.createVirtualNetwork === true) {
82
+ shellExec(`lxc network create lxdbr0 \
83
+ ipv4.address=10.250.250.1/24 \
84
+ ipv4.nat=true \
85
+ ipv4.dhcp=true \
86
+ ipv6.address=none`);
87
+ }
88
+ if (options.createAdminProfile === true) {
89
+ pbcopy(`lxc profile create admin-profile`);
90
+ shellExec(`cat ${underpostRoot}/manifests/lxd/lxd-admin-profile.yaml | lxc profile edit admin-profile`);
91
+ shellExec(`lxc profile show admin-profile`);
92
+ }
93
+ if (options.createVm && typeof options.createVm === 'string') {
94
+ pbcopy(
95
+ `lxc launch images:rockylinux/9 ${
96
+ options.createVm
97
+ } --vm --target lxd-node1 -c limits.cpu=2 -c limits.memory=4GB --profile admin-profile -d root,size=${
98
+ options.rootSize && typeof options.rootSize === 'string' ? options.rootSize + 'GiB' : '32GiB'
99
+ }`,
100
+ );
101
+ }
102
+ if (options.initVm && typeof options.initVm === 'string') {
103
+ let flag = '';
104
+ if (options.control === true) {
105
+ if (options.k3s === true) {
106
+ flag = ' -s -- --k3s';
107
+ } else {
108
+ // Default to kubeadm if not K3s
109
+ flag = ' -s -- --kubeadm';
110
+ }
111
+ shellExec(`lxc exec ${options.initVm} -- bash -c 'mkdir -p /home/dd/engine'`);
112
+ shellExec(`lxc file push /home/dd/engine/engine-private ${options.initVm}/home/dd/engine --recursive`);
113
+ shellExec(`lxc file push /home/dd/engine/manifests ${options.initVm}/home/dd/engine --recursive`);
114
+ } else if (options.worker == true) {
115
+ if (options.k3s === true) {
116
+ flag = ' -s -- --worker --k3s';
117
+ } else {
118
+ // Default to kubeadm worker
119
+ flag = ' -s -- --worker';
120
+ }
121
+ }
122
+ console.log(`Executing underpost-setup.sh on VM: ${options.initVm}`);
123
+ shellExec(`cat ${underpostRoot}/manifests/lxd/underpost-setup.sh | lxc exec ${options.initVm} -- bash${flag}`);
124
+ console.log(`underpost-setup.sh execution completed on VM: ${options.initVm}`);
125
+ }
126
+ // --- Automatic Kubernetes Port Exposure ---
127
+ if (options.autoExposeK8sPorts && typeof options.autoExposeK8sPorts === 'string') {
128
+ console.log(`Automatically exposing Kubernetes ports for VM: ${options.autoExposeK8sPorts}`);
129
+ const vmName = options.autoExposeK8sPorts;
130
+ const hostIp = getLocalIPv4Address();
131
+ let vmIp = '';
132
+ let retries = 0;
133
+ const maxRetries = 10;
134
+ const delayMs = 5000; // 5 seconds
135
+
136
+ // Wait for VM to get an IP address
137
+ while (!vmIp && retries < maxRetries) {
138
+ try {
139
+ console.log(`Attempting to get IPv4 address for ${vmName} (Attempt ${retries + 1}/${maxRetries})...`);
140
+ vmIp = shellExec(
141
+ `lxc list ${vmName} --format json | jq -r '.[0].state.network.enp5s0.addresses[] | select(.family=="inet") | .address'`,
142
+ { stdout: true },
143
+ ).trim();
144
+ if (vmIp) {
145
+ console.log(`IPv4 address found for ${vmName}: ${vmIp}`);
146
+ } else {
147
+ console.log(`IPv4 address not yet available for ${vmName}. Retrying in ${delayMs / 1000} seconds...`);
148
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
149
+ }
150
+ } catch (error) {
151
+ console.error(`Error getting IPv4 address for exposure: ${error.message}`);
152
+ console.log(`Retrying in ${delayMs / 1000} seconds...`);
153
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
154
+ }
155
+ retries++;
156
+ }
157
+
158
+ if (!vmIp) {
159
+ console.error(`Failed to get VM IP for ${vmName} after ${maxRetries} attempts. Cannot expose ports.`);
160
+ return;
161
+ }
162
+
163
+ let portsToExpose = [];
164
+ if (options.control === true) {
165
+ // Kubernetes API Server (Kubeadm and K3s both use 6443 by default)
166
+ portsToExpose.push('6443');
167
+ // Standard HTTP/HTTPS for Ingress if deployed
168
+ portsToExpose.push('80');
169
+ portsToExpose.push('443');
170
+ }
171
+ // Add common NodePorts if needed, or rely on explicit 'expose'
172
+ portsToExpose.push('30000'); // Example NodePort
173
+ portsToExpose.push('30001'); // Example NodePort
174
+ portsToExpose.push('30002'); // Example NodePort
175
+
176
+ const protocols = ['tcp']; // Most K8s services are TCP, UDP for some like DNS
177
+
178
+ for (const port of portsToExpose) {
179
+ for (const protocol of protocols) {
180
+ const deviceName = `${vmName}-${protocol}-port-${port}`;
181
+ try {
182
+ // Remove existing device first to avoid conflicts if re-running
183
+ shellExec(`lxc config device remove ${vmName} ${deviceName} || true`);
184
+ shellExec(
185
+ `lxc config device add ${vmName} ${deviceName} proxy listen=${protocol}:${hostIp}:${port} connect=${protocol}:${vmIp}:${port} nat=true`,
186
+ );
187
+ console.log(`Exposed ${protocol}:${hostIp}:${port} -> ${vmIp}:${port} for ${vmName}`);
188
+ } catch (error) {
189
+ console.error(`Failed to expose port ${port} for ${vmName}: ${error.message}`);
190
+ }
191
+ }
192
+ }
193
+ }
194
+ if (options.joinNode && typeof options.joinNode === 'string') {
195
+ const [workerNode, controlNode] = options.joinNode.split(',');
196
+ // Determine if it's a Kubeadm or K3s join
197
+ const isK3sJoin = options.k3s === true;
198
+
199
+ if (isK3sJoin) {
200
+ console.log(`Attempting to join K3s worker node ${workerNode} to control plane ${controlNode}`);
201
+ // Get K3s token from control plane
202
+ const k3sToken = shellExec(
203
+ `lxc exec ${controlNode} -- bash -c 'sudo cat /var/lib/rancher/k3s/server/node-token'`,
204
+ { stdout: true },
205
+ ).trim();
206
+ // Get control plane IP
207
+ const controlPlaneIp = shellExec(
208
+ `lxc list ${controlNode} --format json | jq -r '.[0].state.network.enp5s0.addresses[] | select(.family=="inet") | .address'`,
209
+ { stdout: true },
210
+ ).trim();
211
+
212
+ if (!k3sToken || !controlPlaneIp) {
213
+ console.error(`Failed to get K3s token or control plane IP. Cannot join worker.`);
214
+ return;
215
+ }
216
+ const k3sJoinCommand = `K3S_URL=https://${controlPlaneIp}:6443 K3S_TOKEN=${k3sToken} curl -sfL https://get.k3s.io | sh -`;
217
+ shellExec(`lxc exec ${workerNode} -- bash -c '${k3sJoinCommand}'`);
218
+ console.log(`K3s worker node ${workerNode} join command executed.`);
219
+ } else {
220
+ // Kubeadm join
221
+ console.log(`Attempting to join Kubeadm worker node ${workerNode} to control plane ${controlNode}`);
222
+ const token = shellExec(
223
+ `echo "$(lxc exec ${controlNode} -- bash -c 'sudo kubeadm token create --print-join-command')"`,
224
+ { stdout: true },
225
+ );
226
+ shellExec(`lxc exec ${workerNode} -- bash -c '${token}'`);
227
+ console.log(`Kubeadm worker node ${workerNode} join command executed.`);
228
+ }
229
+ }
230
+ if (options.infoVm && typeof options.infoVm === 'string') {
231
+ shellExec(`lxc config show ${options.infoVm}`);
232
+ shellExec(`lxc info --show-log ${options.infoVm}`);
233
+ shellExec(`lxc info ${options.infoVm}`);
234
+ shellExec(`lxc list ${options.infoVm}`);
235
+ }
236
+ if (options.expose && typeof options.expose === 'string') {
237
+ const [vmName, ports] = options.expose.split(':');
238
+ console.log({ vmName, ports });
239
+ const protocols = ['tcp']; // udp
240
+ const hostIp = getLocalIPv4Address();
241
+ const vmIp = shellExec(
242
+ `lxc list ${vmName} --format json | jq -r '.[0].state.network.enp5s0.addresses[] | select(.family=="inet") | .address'`,
243
+ { stdout: true },
244
+ ).trim();
245
+ if (!vmIp) {
246
+ console.error(`Could not get VM IP for ${vmName}. Cannot expose ports.`);
247
+ return;
248
+ }
249
+ for (const port of ports.split(',')) {
250
+ for (const protocol of protocols) {
251
+ const deviceName = `${vmName}-${protocol}-port-${port}`;
252
+ shellExec(`lxc config device remove ${vmName} ${deviceName} || true`); // Use || true to prevent error if device doesn't exist
253
+ shellExec(
254
+ `lxc config device add ${vmName} ${deviceName} proxy listen=${protocol}:${hostIp}:${port} connect=${protocol}:${vmIp}:${port} nat=true`,
255
+ );
256
+ console.log(`Manually exposed ${protocol}:${hostIp}:${port} -> ${vmIp}:${port} for ${vmName}`);
257
+ }
258
+ }
259
+ }
260
+ if (options.deleteExpose && typeof options.deleteExpose === 'string') {
261
+ const [controlNode, ports] = options.deleteExpose.split(':');
262
+ console.log({ controlNode, ports });
263
+ const protocols = ['tcp']; // udp
264
+ for (const port of ports.split(',')) {
265
+ for (const protocol of protocols) {
266
+ shellExec(`lxc config device remove ${controlNode} ${controlNode}-${protocol}-port-${port}`);
267
+ }
268
+ }
269
+ }
270
+
271
+ if (options.test && typeof options.test === 'string') {
272
+ const vmName = options.test;
273
+ console.log(`Starting comprehensive test for VM: ${vmName}`);
274
+
275
+ // 1. Monitor for IPv4 address
276
+ let vmIp = '';
277
+ let retries = 0;
278
+ const maxRetries = 10;
279
+ const delayMs = 5000; // 5 seconds
280
+
281
+ while (!vmIp && retries < maxRetries) {
282
+ try {
283
+ console.log(`Attempting to get IPv4 address for ${vmName} (Attempt ${retries + 1}/${maxRetries})...`);
284
+ vmIp = shellExec(
285
+ `lxc list ${vmName} --format json | jq -r '.[0].state.network.enp5s0.addresses[] | select(.family=="inet") | .address'`,
286
+ { stdout: true },
287
+ ).trim();
288
+ if (vmIp) {
289
+ console.log(`IPv4 address found for ${vmName}: ${vmIp}`);
290
+ } else {
291
+ console.log(`IPv4 address not yet available for ${vmName}. Retrying in ${delayMs / 1000} seconds...`);
292
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
293
+ }
294
+ } catch (error) {
295
+ console.error(`Error getting IPv4 address: ${error.message}`);
296
+ console.log(`Retrying in ${delayMs / 1000} seconds...`);
297
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
298
+ }
299
+ retries++;
300
+ }
301
+
302
+ if (!vmIp) {
303
+ console.error(`Failed to get IPv4 address for ${vmName} after ${maxRetries} attempts. Aborting tests.`);
304
+ return;
305
+ }
306
+
307
+ // 2. Iteratively check connection to google.com
308
+ let connectedToGoogle = false;
309
+ retries = 0;
310
+ while (!connectedToGoogle && retries < maxRetries) {
311
+ try {
312
+ console.log(`Checking connectivity to google.com from ${vmName} (Attempt ${retries + 1}/${maxRetries})...`);
313
+ const curlOutput = shellExec(
314
+ `lxc exec ${vmName} -- bash -c 'curl -s -o /dev/null -w "%{http_code}" http://google.com'`,
315
+ { stdout: true },
316
+ );
317
+ if (curlOutput.startsWith('2') || curlOutput.startsWith('3')) {
318
+ console.log(`Successfully connected to google.com from ${vmName}.`);
319
+ connectedToGoogle = true;
320
+ } else {
321
+ console.log(`Connectivity to google.com not yet verified. Retrying in ${delayMs / 1000} seconds...`);
322
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
323
+ }
324
+ } catch (error) {
325
+ console.error(`Error checking connectivity to google.com: ${error.message}`);
326
+ console.log(`Retrying in ${delayMs / 1000} seconds...`);
327
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
328
+ }
329
+ retries++;
330
+ }
331
+
332
+ if (!connectedToGoogle) {
333
+ console.error(
334
+ `Failed to connect to google.com from ${vmName} after ${maxRetries} attempts. Aborting further tests.`,
335
+ );
336
+ return;
337
+ }
338
+
339
+ // 3. Check other connectivity, network, and VM health parameters
340
+ console.log(`\n--- Comprehensive Health Report for ${vmName} ---`);
341
+
342
+ // VM Status
343
+ console.log('\n--- VM Status ---');
344
+ try {
345
+ const vmStatus = shellExec(`lxc list ${vmName} --format json`, { stdout: true, silent: true });
346
+ console.log(JSON.stringify(JSON.parse(vmStatus), null, 2));
347
+ } catch (error) {
348
+ console.error(`Error getting VM status: ${error.message}`);
349
+ }
350
+
351
+ // CPU Usage
352
+ console.log('\n--- CPU Usage ---');
353
+ try {
354
+ const cpuUsage = shellExec(`lxc exec ${vmName} -- bash -c 'top -bn1 | grep "Cpu(s)"'`, { stdout: true });
355
+ console.log(cpuUsage.trim());
356
+ } catch (error) {
357
+ console.error(`Error getting CPU usage: ${error.message}`);
358
+ }
359
+
360
+ // Memory Usage
361
+ console.log('\n--- Memory Usage ---');
362
+ try {
363
+ const memoryUsage = shellExec(`lxc exec ${vmName} -- bash -c 'free -m'`, { stdout: true });
364
+ console.log(memoryUsage.trim());
365
+ } catch (error) {
366
+ console.error(`Error getting memory usage: ${error.message}`);
367
+ }
368
+
369
+ // Disk Usage
370
+ console.log('\n--- Disk Usage (Root Partition) ---');
371
+ try {
372
+ const diskUsage = shellExec(`lxc exec ${vmName} -- bash -c 'df -h /'`, { stdout: true });
373
+ console.log(diskUsage.trim());
374
+ } catch (error) {
375
+ console.error(`Error getting disk usage: ${error.message}`);
376
+ }
377
+
378
+ // Network Interface Status
379
+ console.log('\n--- Network Interface Status (ip a) ---');
380
+ try {
381
+ const ipA = shellExec(`lxc exec ${vmName} -- bash -c 'ip a'`, { stdout: true });
382
+ console.log(ipA.trim());
383
+ } catch (error) {
384
+ console.error(`Error getting network interface status: ${error.message}`);
385
+ }
386
+
387
+ // DNS Resolution (resolv.conf)
388
+ console.log('\n--- DNS Configuration (/etc/resolv.conf) ---');
389
+ try {
390
+ const resolvConf = shellExec(`lxc exec ${vmName} -- bash -c 'cat /etc/resolv.conf'`, { stdout: true });
391
+ console.log(resolvConf.trim());
392
+ } catch (error) {
393
+ console.error(`Error getting DNS configuration: ${error.message}`);
394
+ }
395
+
396
+ console.log(`\nComprehensive test for VM: ${vmName} completed.`);
397
+ }
398
+ },
399
+ };
400
+ }
401
+
402
+ export default UnderpostLxd;
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Monitor module for managing the monitoring of deployments and services.
3
+ * @module src/cli/monitor.js
4
+ * @namespace UnderpostMonitor
5
+ */
6
+
7
+ import { loadReplicas, pathPortAssignmentFactory } from '../server/conf.js';
8
+ import { loggerFactory } from '../server/logger.js';
9
+ import UnderpostDeploy from './deploy.js';
10
+ import axios from 'axios';
11
+ import UnderpostRootEnv from './env.js';
12
+ import fs from 'fs-extra';
13
+ import { shellExec } from '../server/process.js';
14
+ import { isInternetConnection } from '../server/dns.js';
15
+
16
+ const logger = loggerFactory(import.meta);
17
+
18
+ /**
19
+ * @class UnderpostMonitor
20
+ * @description Manages deployment monitoring and health checks.
21
+ * This class provides a set of static methods to monitor and manage
22
+ * deployment health, including checking server status, handling traffic
23
+ * switching, and orchestrating monitoring workflows.
24
+ * @memberof UnderpostMonitor
25
+ */
26
+ class UnderpostMonitor {
27
+ static API = {
28
+ /**
29
+ * @method callback
30
+ * @description Initiates a deployment monitoring workflow based on the provided options.
31
+ * This method orchestrates the monitoring process for a specific deployment, handling
32
+ * traffic switching, error accumulation, and optional Git integration for version control.
33
+ * @param {string} deployId - The identifier for the deployment to monitor.
34
+ * @param {string} [env='development'] - The environment for the deployment (e.g., 'development', 'production').
35
+ * @param {object} [options] - An object containing boolean flags for various operations.
36
+ * @param {boolean} [options.now=false] - Perform a single health check immediately.
37
+ * @param {boolean} [options.single=false] - Perform a single health check and exit.
38
+ * @param {string} [options.msInterval=''] - Interval in milliseconds for periodic health checks.
39
+ * @param {string} [options.type=''] - Type of deployment (e.g., 'blue-green', 'remote').
40
+ * @param {string} [options.replicas=''] - Number of replicas for the deployment.
41
+ * @param {boolean} [options.sync=false] - Synchronize traffic switching with the deployment.
42
+ * @param {object} [commanderOptions] - Options passed from the command line interface.
43
+ * @param {object} [auxRouter] - Optional router configuration for the deployment.
44
+ * @memberof UnderpostMonitor
45
+ */
46
+ async callback(
47
+ deployId,
48
+ env = 'development',
49
+ options = { now: false, single: false, msInterval: '', type: '', replicas: '', sync: false },
50
+ commanderOptions,
51
+ auxRouter,
52
+ ) {
53
+ if (deployId === 'dd' && fs.existsSync(`./engine-private/deploy/dd.router`)) {
54
+ for (const _deployId of fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(','))
55
+ UnderpostMonitor.API.callback(
56
+ _deployId.trim(),
57
+ env,
58
+ options,
59
+ commanderOptions,
60
+ await UnderpostDeploy.API.routerFactory(_deployId, env),
61
+ );
62
+ return;
63
+ }
64
+
65
+ const router = auxRouter ?? (await UnderpostDeploy.API.routerFactory(deployId, env));
66
+
67
+ const confServer = loadReplicas(
68
+ JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')),
69
+ );
70
+
71
+ const pathPortAssignmentData = pathPortAssignmentFactory(router, confServer);
72
+
73
+ let errorPayloads = [];
74
+ if (options.sync === true) {
75
+ const currentTraffic = UnderpostDeploy.API.getCurrentTraffic(deployId);
76
+ if (currentTraffic) UnderpostRootEnv.API.set(`${deployId}-${env}-traffic`, currentTraffic);
77
+ }
78
+ let traffic = UnderpostRootEnv.API.get(`${deployId}-${env}-traffic`) ?? 'blue';
79
+ const maxAttempts = parseInt(
80
+ Object.keys(pathPortAssignmentData)
81
+ .map((host) => pathPortAssignmentData[host].length)
82
+ .reduce((accumulator, value) => accumulator + value, 0) * 2.5,
83
+ );
84
+
85
+ logger.info(`Init deploy monitor`, {
86
+ pathPortAssignmentData,
87
+ maxAttempts,
88
+ deployId,
89
+ env,
90
+ traffic,
91
+ });
92
+
93
+ const switchTraffic = () => {
94
+ if (traffic === 'blue') traffic = 'green';
95
+ else traffic = 'blue';
96
+ UnderpostRootEnv.API.set(`${deployId}-${env}-traffic`, traffic);
97
+ shellExec(
98
+ `node bin deploy --info-router --build-manifest --traffic ${traffic} --replicas ${
99
+ options.replicas ? options.replicas : 1
100
+ } ${deployId} ${env}`,
101
+ );
102
+ shellExec(`sudo kubectl apply -f ./engine-private/conf/${deployId}/build/${env}/proxy.yaml`);
103
+ };
104
+
105
+ const monitor = async (reject) => {
106
+ if (UnderpostRootEnv.API.get(`monitor-init-callback-script`))
107
+ shellExec(UnderpostRootEnv.API.get(`monitor-init-callback-script`));
108
+ const currentTimestamp = new Date().getTime();
109
+ errorPayloads = errorPayloads.filter((e) => currentTimestamp - e.timestamp < 60 * 1000 * 5);
110
+ logger.info(`[${deployId}-${env}] Check server health`);
111
+ for (const host of Object.keys(pathPortAssignmentData)) {
112
+ for (const instance of pathPortAssignmentData[host]) {
113
+ const { port, path } = instance;
114
+ if (path.match('peer') || path.match('socket')) continue;
115
+ let urlTest = `http://localhost:${port}${path}`;
116
+ switch (options.type) {
117
+ case 'remote':
118
+ case 'blue-green':
119
+ urlTest = `https://${host}${path}`;
120
+ break;
121
+
122
+ default:
123
+ break;
124
+ }
125
+ // logger.info('Test instance', urlTest);
126
+ await axios.get(urlTest, { timeout: 10000 }).catch((error) => {
127
+ // console.log(error);
128
+ const errorPayload = {
129
+ urlTest,
130
+ host,
131
+ port,
132
+ path,
133
+ name: error.name,
134
+ status: error.status,
135
+ code: error.code,
136
+ errors: error.errors,
137
+ timestamp: new Date().getTime(),
138
+ };
139
+ if (errorPayload.status !== 404) {
140
+ errorPayloads.push(errorPayload);
141
+ if (errorPayloads.length >= maxAttempts) {
142
+ const message = JSON.stringify(errorPayloads, null, 4);
143
+ logger.error(
144
+ `Deployment ${deployId} ${env} has been reached max attempts error payloads`,
145
+ errorPayloads,
146
+ );
147
+ switch (options.type) {
148
+ case 'blue-green':
149
+ {
150
+ const confServer = JSON.parse(
151
+ fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8'),
152
+ );
153
+
154
+ UnderpostDeploy.API.configMap(env);
155
+
156
+ for (const host of Object.keys(confServer)) {
157
+ shellExec(`sudo kubectl delete HTTPProxy ${host}`);
158
+ }
159
+ shellExec(`sudo kubectl rollout restart deployment/${deployId}-${env}-${traffic}`);
160
+
161
+ switchTraffic();
162
+ }
163
+
164
+ break;
165
+
166
+ case 'remote':
167
+ break;
168
+
169
+ default:
170
+ if (reject) reject(message);
171
+ else throw new Error(message);
172
+ }
173
+ errorPayloads = [];
174
+ }
175
+ logger.error(`Error accumulator ${deployId}-${env}-${traffic}`, errorPayloads.length);
176
+ }
177
+ });
178
+ }
179
+ }
180
+ };
181
+ if (options.now === true) await monitor();
182
+ if (options.single === true) return;
183
+ let optionsMsTimeout = parseInt(options.msInterval);
184
+ if (isNaN(optionsMsTimeout)) optionsMsTimeout = 60250; // 60.25 seconds
185
+ let monitorTrafficName;
186
+ let monitorPodName;
187
+ const monitorCallBack = (resolve, reject) => {
188
+ const envMsTimeout = UnderpostRootEnv.API.get(`${deployId}-${env}-monitor-ms`);
189
+ setTimeout(
190
+ async () => {
191
+ const isOnline = await isInternetConnection();
192
+ if (!isOnline) {
193
+ logger.warn('No internet connection');
194
+ monitorCallBack(resolve, reject);
195
+ return;
196
+ }
197
+ switch (options.type) {
198
+ case 'blue-green':
199
+ {
200
+ if (monitorTrafficName !== traffic) {
201
+ monitorTrafficName = undefined;
202
+ monitorPodName = undefined;
203
+ }
204
+ const checkDeploymentReadyStatus = () => {
205
+ const { ready, notReadyPods, readyPods } = UnderpostDeploy.API.checkDeploymentReadyStatus(
206
+ deployId,
207
+ env,
208
+ traffic,
209
+ );
210
+ if (ready) {
211
+ monitorPodName = readyPods[0].NAME;
212
+ monitorTrafficName = `${traffic}`;
213
+ }
214
+ };
215
+ if (!monitorPodName) {
216
+ checkDeploymentReadyStatus();
217
+ monitorCallBack(resolve, reject);
218
+ return;
219
+ }
220
+ }
221
+
222
+ break;
223
+
224
+ default:
225
+ break;
226
+ }
227
+ for (const monitorStatus of [
228
+ { key: `monitor-input`, value: UnderpostRootEnv.API.get(`monitor-input`) },
229
+ {
230
+ key: `${deployId}-${env}-monitor-input`,
231
+ value: UnderpostRootEnv.API.get(`${deployId}-${env}-monitor-input`),
232
+ },
233
+ ])
234
+ switch (monitorStatus.value) {
235
+ case 'pause':
236
+ monitorCallBack(resolve, reject);
237
+ return;
238
+ case 'restart':
239
+ UnderpostRootEnv.API.delete(monitorStatus.key);
240
+ return reject();
241
+ case 'stop':
242
+ UnderpostRootEnv.API.delete(monitorStatus.key);
243
+ return resolve();
244
+ case 'blue-green-switch':
245
+ UnderpostRootEnv.API.delete(monitorStatus.key);
246
+ switchTraffic();
247
+ }
248
+ await monitor(reject);
249
+ monitorCallBack(resolve, reject);
250
+ return;
251
+ },
252
+ !isNaN(envMsTimeout) ? envMsTimeout : optionsMsTimeout,
253
+ );
254
+ };
255
+ return new Promise((...args) => monitorCallBack(...args));
256
+ },
257
+ };
258
+ }
259
+
260
+ export default UnderpostMonitor;