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
@@ -0,0 +1,548 @@
1
+ /**
2
+ * Cloud-init module for managing the generation and deployment of cloud-init configuration files
3
+ * and associated scripts for baremetal provisioning.
4
+ * @module src/cli/cloud-init.js
5
+ * @namespace UnderpostCloudInit
6
+ */
7
+
8
+ import dotenv from 'dotenv';
9
+ import { shellExec } from '../server/process.js';
10
+ import fs from 'fs-extra';
11
+ import UnderpostBaremetal from './baremetal.js';
12
+ import { loggerFactory } from '../server/logger.js';
13
+ import { getNpmRootPath } from '../server/conf.js';
14
+
15
+ dotenv.config();
16
+
17
+ const logger = loggerFactory(import.meta);
18
+
19
+ /**
20
+ * @class UnderpostCloudInit
21
+ * @description Manages the generation and deployment of cloud-init configuration files
22
+ * and associated scripts for baremetal provisioning. This class provides methods
23
+ * to build various shell scripts and a cloud-init configuration file tailored
24
+ * for MAAS (Metal as a Service) integration.
25
+ * @memberof UnderpostCloudInit
26
+ */
27
+ class UnderpostCloudInit {
28
+ static API = {
29
+ /**
30
+ * @method buildTools
31
+ * @description Builds and writes various shell scripts and configuration files
32
+ * to the NFS host path, which are then used by the target baremetal machine
33
+ * during the cloud-init process.
34
+ * @param {object} params - The parameters for building the tools.
35
+ * @param {string} params.workflowId - The identifier for the specific workflow configuration.
36
+ * @param {string} params.nfsHostPath - The base path on the NFS host where tools will be written.
37
+ * @param {string} params.hostname - The hostname of the target baremetal machine.
38
+ * @param {object} params.callbackMetaData - Metadata about the callback, used for dynamic configuration.
39
+ * @param {boolean} params.dev - Development mode flag.
40
+ * @returns {void}
41
+ * @memberof UnderpostCloudInit
42
+ */
43
+ buildTools({ workflowId, nfsHostPath, hostname, callbackMetaData, dev }) {
44
+ // Destructure workflow configuration for easier access.
45
+ const { systemProvisioning, chronyc, networkInterfaceName, debootstrap } =
46
+ UnderpostBaremetal.API.workflowsConfig[workflowId];
47
+ const { timezone, chronyConfPath } = chronyc;
48
+ // Define the specific directory for underpost tools within the NFS host path.
49
+ const nfsHostToolsPath = `${nfsHostPath}/underpost`;
50
+
51
+ // Determine the root path for npm and underpost based on development mode.
52
+ const npmRoot = getNpmRootPath();
53
+ const underpostRoot = dev === true ? '.' : `${npmRoot}/underpost`;
54
+
55
+ // Use a switch statement to handle different system provisioning types.
56
+ switch (systemProvisioning) {
57
+ case 'ubuntu': {
58
+ // Ensure the target directory for tools is clean and exists.
59
+ if (fs.existsSync(`${nfsHostToolsPath}`)) fs.removeSync(`${nfsHostToolsPath}`);
60
+ fs.mkdirSync(`${nfsHostToolsPath}`, { recursive: true });
61
+
62
+ // Build and write the date configuration script.
63
+ logger.info('Build', `${nfsHostToolsPath}/date.sh`);
64
+ fs.writeFileSync(
65
+ `${nfsHostToolsPath}/date.sh`,
66
+ UnderpostBaremetal.API.stepsRender(
67
+ UnderpostBaremetal.API.systemProvisioningFactory[systemProvisioning].timezone({
68
+ timezone,
69
+ chronyConfPath,
70
+ }),
71
+ false,
72
+ ),
73
+ 'utf8',
74
+ );
75
+
76
+ // Build and write the keyboard configuration script.
77
+ logger.info('Build', `${nfsHostToolsPath}/keyboard.sh`);
78
+ fs.writeFileSync(
79
+ `${nfsHostToolsPath}/keyboard.sh`,
80
+ UnderpostBaremetal.API.stepsRender(
81
+ UnderpostBaremetal.API.systemProvisioningFactory[systemProvisioning].keyboard(),
82
+ false,
83
+ ),
84
+ 'utf8',
85
+ );
86
+
87
+ // Build and write the hosts file configuration script.
88
+ logger.info('Build', `${nfsHostToolsPath}/host.sh`);
89
+ fs.writeFileSync(
90
+ `${nfsHostToolsPath}/host.sh`,
91
+ `echo -e "127.0.0.1 localhost\n127.0.1.1 ${hostname}" | tee -a /etc/hosts`,
92
+ 'utf8',
93
+ );
94
+
95
+ // Build and write the DNS configuration script.
96
+ logger.info('Build', `${nfsHostToolsPath}/dns.sh`);
97
+ fs.writeFileSync(
98
+ `${nfsHostToolsPath}/dns.sh`,
99
+ `rm /etc/resolv.conf
100
+ echo 'nameserver 8.8.8.8' > /run/systemd/resolve/stub-resolv.conf
101
+ ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf`,
102
+ 'utf8',
103
+ );
104
+
105
+ // Build and write the main startup script for cloud-init.
106
+ logger.info('Build', `${nfsHostToolsPath}/start.sh`);
107
+ fs.writeFileSync(
108
+ `${nfsHostToolsPath}/start.sh`,
109
+ `#!/bin/bash
110
+ set -x
111
+ # sudo cloud-init --all-stages
112
+ ${UnderpostBaremetal.API.stepsRender(
113
+ [
114
+ `/underpost/date.sh`,
115
+ `sleep 3`,
116
+ `/underpost/reset.sh`,
117
+ `sleep 3`,
118
+ `cloud-init init --local`,
119
+ `sleep 3`,
120
+ `cloud-init init`,
121
+ `sleep 3`,
122
+ `cloud-init modules --mode=config`,
123
+ `sleep 3`,
124
+ `cloud-init modules --mode=final`,
125
+ `sleep 3`,
126
+ `/underpost/enlistment.sh`,
127
+ ],
128
+ false,
129
+ )}`,
130
+ 'utf8',
131
+ );
132
+
133
+ // Build and write the cloud-init reset script.
134
+ logger.info('Build', `${nfsHostToolsPath}/reset.sh`);
135
+ fs.writeFileSync(
136
+ `${nfsHostToolsPath}/reset.sh`,
137
+ `sudo cloud-init clean --seed --configs all --machine-id # --logs
138
+ sudo rm -rf /var/lib/cloud/*
139
+ echo '' > /var/log/cloud-init.log
140
+ echo '' > /var/log/cloud-init-output.log`,
141
+ 'utf8',
142
+ );
143
+
144
+ // Build and write the cloud-init help script.
145
+ logger.info('Build', `${nfsHostToolsPath}/help.sh`);
146
+ fs.writeFileSync(
147
+ `${nfsHostToolsPath}/help.sh`,
148
+ `echo "=== Cloud init utils ==="
149
+ echo "sudo cloud-init --all-stages"
150
+ echo "sudo cloud-init clean --logs --seed --configs all --machine-id --reboot"
151
+ echo "sudo cloud-init init --local"
152
+ echo "sudo cloud-init init"
153
+ echo "sudo cloud-init modules --mode=config"
154
+ echo "sudo cloud-init modules --mode=final"`,
155
+ 'utf8',
156
+ );
157
+
158
+ // Build and write the test script for verifying configuration.
159
+ logger.info('Build', `${nfsHostToolsPath}/test.sh`);
160
+ fs.writeFileSync(
161
+ `${nfsHostToolsPath}/test.sh`,
162
+ `echo -e "\n=== Current date/time ==="
163
+ date '+%Y-%m-%d %H:%M:%S'
164
+ echo -e "\n=== Keyboard layout ==="
165
+ cat /etc/default/keyboard
166
+ echo -e "\n=== Registered users ==="
167
+ cut -d: -f1 /etc/passwd`,
168
+ 'utf8',
169
+ );
170
+
171
+ // Build and write the shutdown script.
172
+ logger.info('Build', `${nfsHostToolsPath}/shutdown.sh`);
173
+ fs.writeFileSync(`${nfsHostToolsPath}/shutdown.sh`, `sudo shutdown -h now`, 'utf8');
174
+
175
+ // Build and write the MAC address retrieval script.
176
+ logger.info('Build', `${nfsHostToolsPath}/mac.sh`);
177
+ fs.writeFileSync(
178
+ `${nfsHostToolsPath}/mac.sh`,
179
+ `echo "$(cat /sys/class/net/${networkInterfaceName}/address)" > /underpost/mac`,
180
+ 'utf8',
181
+ );
182
+
183
+ // Copy the device scan script from manifests.
184
+ logger.info('Build', `${nfsHostToolsPath}/device_scan.sh`);
185
+ fs.copySync(`${underpostRoot}/scripts/device-scan.sh`, `${nfsHostToolsPath}/device_scan.sh`);
186
+
187
+ // Build and write the config path script.
188
+ logger.info('Build', `${nfsHostToolsPath}/config-path.sh`);
189
+ fs.writeFileSync(`${nfsHostToolsPath}/config-path.sh`, `echo "/etc/cloud/cloud.cfg.d/90_maas.cfg"`, 'utf8');
190
+
191
+ // Build and write the MAAS enlistment script.
192
+ logger.info('Build', `${nfsHostToolsPath}/enlistment.sh`);
193
+ fs.writeFileSync(
194
+ `${nfsHostToolsPath}/enlistment.sh`,
195
+ `#!/bin/bash
196
+ set -x
197
+
198
+ # ------------------------------------------------------------
199
+ # Step: Commission a machine in MAAS using OAuth1 authentication
200
+ # ------------------------------------------------------------
201
+
202
+ MACHINE_ID=$(cat /underpost/system-id)
203
+ CONSUMER_KEY=$(cat /underpost/consumer-key)
204
+ TOKEN_KEY=$(cat /underpost/token-key)
205
+ TOKEN_SECRET=$(cat /underpost/token-secret)
206
+
207
+ echo ">>> Starting MAAS machine commissioning for system_id: $MACHINE_ID …"
208
+
209
+ curl -X POST \\
210
+ --fail --location --verbose --include --raw --trace-ascii /dev/stdout\\
211
+ --header "Authorization:\\
212
+ OAuth oauth_version=1.0,\\
213
+ oauth_signature_method=PLAINTEXT,\\
214
+ oauth_consumer_key=$CONSUMER_KEY,\\
215
+ oauth_token=$TOKEN_KEY,\\
216
+ oauth_signature=&$TOKEN_SECRET,\\
217
+ oauth_nonce=$(uuidgen),\\
218
+ oauth_timestamp=$(date +%s)"\\
219
+ -F "commissioning_scripts=20-maas-01-install-lldpd"\\
220
+ -F "enable_ssh=1"\\
221
+ -F "skip_bmc_config=1"\\
222
+ -F "skip_networking=1"\\
223
+ -F "skip_storage=1"\\
224
+ -F "testing_scripts=none"\\
225
+ http://${callbackMetaData.runnerHost.ip}:5240/MAAS/api/2.0/machines/$MACHINE_ID/op-commission \\
226
+ 2>&1 | tee /underpost/enlistment.log || echo "ERROR: MAAS commissioning returned code $?"`,
227
+ 'utf8',
228
+ );
229
+
230
+ // Import SSH keys for root user.
231
+ logger.info('Import ssh keys');
232
+ shellExec(`sudo rm -rf ${nfsHostPath}/root/.ssh`);
233
+ shellExec(`sudo rm -rf ${nfsHostPath}/home/root/.ssh`); // Ensure home root .ssh is also clean.
234
+ logger.info('Copy', `/root/.ssh -> ${nfsHostPath}/root/.ssh`);
235
+ fs.copySync(`/root/.ssh`, `${nfsHostPath}/root/.ssh`);
236
+
237
+ // Enable execution permissions for all generated scripts and run a test.
238
+ logger.info('Enable tools execution and test');
239
+ UnderpostBaremetal.API.crossArchRunner({
240
+ nfsHostPath,
241
+ debootstrapArch: debootstrap.image.architecture,
242
+ callbackMetaData,
243
+ steps: [
244
+ `chmod +x /underpost/date.sh`,
245
+ `chmod +x /underpost/keyboard.sh`,
246
+ `chmod +x /underpost/dns.sh`,
247
+ `chmod +x /underpost/help.sh`,
248
+ `chmod +x /underpost/config-path.sh`,
249
+ `chmod +x /underpost/host.sh`,
250
+ `chmod +x /underpost/test.sh`,
251
+ `chmod +x /underpost/start.sh`,
252
+ `chmod +x /underpost/reset.sh`,
253
+ `chmod +x /underpost/shutdown.sh`,
254
+ `chmod +x /underpost/device_scan.sh`,
255
+ `chmod +x /underpost/mac.sh`,
256
+ `chmod +x /underpost/enlistment.sh`,
257
+ `sudo chmod 700 ~/.ssh/`, // Set secure permissions for .ssh directory.
258
+ `sudo chmod 600 ~/.ssh/authorized_keys`, // Set secure permissions for authorized_keys.
259
+ `sudo chmod 644 ~/.ssh/known_hosts`, // Set permissions for known_hosts.
260
+ `sudo chmod 600 ~/.ssh/id_rsa`, // Set secure permissions for private key.
261
+ `sudo chmod 600 /etc/ssh/ssh_host_ed25519_key`, // Set secure permissions for host key.
262
+ `chown -R root:root ~/.ssh`, // Ensure root owns the .ssh directory.
263
+ `/underpost/test.sh`, // Run the test script to verify setup.
264
+ ],
265
+ });
266
+
267
+ break;
268
+ }
269
+ default:
270
+ // Throw an error if an unsupported system provisioning type is provided.
271
+ throw new Error('Invalid system provisioning: ' + systemProvisioning);
272
+ }
273
+ },
274
+
275
+ /**
276
+ * @method configFactory
277
+ * @description Generates the cloud-init configuration file (`90_maas.cfg`)
278
+ * for MAAS integration. This configuration includes hostname, network settings,
279
+ * user accounts, SSH keys, timezone, NTP, and various cloud-init modules.
280
+ * @param {object} params - The parameters for generating the configuration.
281
+ * @param {string} params.controlServerIp - The IP address of the MAAS control server.
282
+ * @param {string} params.hostname - The hostname of the target baremetal machine.
283
+ * @param {string} params.commissioningDeviceIp - The IP address to assign to the commissioning device.
284
+ * @param {string} params.gatewayip - The gateway IP address for the network.
285
+ * @param {boolean} params.auth - Flag indicating whether to include MAAS authentication credentials.
286
+ * @param {string} params.mac - The MAC address of the network interface.
287
+ * @param {string} params.timezone - The timezone to set for the machine.
288
+ * @param {string} params.chronyConfPath - The path to the Chrony configuration file.
289
+ * @param {string} params.networkInterfaceName - The name of the primary network interface.
290
+ * @param {object} [authCredentials={}] - Optional MAAS authentication credentials.
291
+ * @param {string} [path='/etc/cloud/cloud.cfg.d/90_maas.cfg'] - The target path for the cloud-init configuration file.
292
+ * @returns {string} The generated cloud-init configuration content.
293
+ * @memberof UnderpostCloudInit
294
+ */
295
+ configFactory(
296
+ {
297
+ controlServerIp,
298
+ hostname,
299
+ commissioningDeviceIp,
300
+ gatewayip,
301
+ auth,
302
+ mac,
303
+ timezone,
304
+ chronyConfPath,
305
+ networkInterfaceName,
306
+ },
307
+ authCredentials = { consumer_key: '', consumer_secret: '', token_key: '', token_secret: '' },
308
+ path = '/etc/cloud/cloud.cfg.d/90_maas.cfg',
309
+ ) {
310
+ const { consumer_key, consumer_secret, token_key, token_secret } = authCredentials;
311
+ // Configure cloud-init for MAAS using a heredoc string.
312
+ return `cat <<EOF_MAAS_CFG > ${path}
313
+ #cloud-config
314
+
315
+ hostname: ${hostname}
316
+ fqdn: ${hostname}.maas
317
+ # prefer_fqdn_over_hostname: true
318
+ # metadata_url: http://${controlServerIp}:5240/MAAS/metadata
319
+ # metadata_url: http://${controlServerIp}:5248/MAAS/metadata
320
+
321
+ # Check:
322
+ # /MAAS/metadata/latest/enlist-preseed/?op=get_enlist_preseed
323
+
324
+ # Debug:
325
+ # https://maas.io/docs/how-to-use-logging
326
+
327
+ datasource_list: [ MAAS ]
328
+ datasource:
329
+ MAAS:
330
+ metadata_url: http://${controlServerIp}:5240/MAAS/metadata/
331
+ ${
332
+ // Conditionally include authentication details if 'auth' flag is true.
333
+ !auth
334
+ ? ''
335
+ : `consumer_key: ${consumer_key}
336
+ consumer_secret: ${consumer_secret}
337
+ token_key: ${token_key}
338
+ token_secret: ${token_secret}`
339
+ }
340
+
341
+
342
+ users:
343
+ - name: ${process.env.MAAS_ADMIN_USERNAME}
344
+ sudo: ["ALL=(ALL) NOPASSWD:ALL"]
345
+ shell: /bin/bash
346
+ lock_passwd: false
347
+ groups: sudo,users,admin,wheel,lxd
348
+ plain_text_passwd: '${process.env.MAAS_ADMIN_USERNAME}'
349
+ ssh_authorized_keys:
350
+ - ${fs.readFileSync(`/home/dd/engine/engine-private/deploy/id_rsa.pub`, 'utf8')}
351
+
352
+ # manage_resolv_conf: true
353
+ # resolv_conf:
354
+ # nameservers: [8.8.8.8]
355
+
356
+ # keyboard:
357
+ # layout: es
358
+
359
+ # check timedatectl on hostname
360
+ # timezone: America/Santiago
361
+ timezone: ${timezone}
362
+
363
+ ntp:
364
+ enabled: true
365
+ servers:
366
+ - ${process.env.MAAS_NTP_SERVER}
367
+ ntp_client: chrony
368
+ config:
369
+ confpath: ${chronyConfPath}
370
+
371
+ # ssh:
372
+ # allow-pw: false
373
+ # install-server: true
374
+
375
+ # ssh_pwauth: false
376
+
377
+ package_update: true
378
+ package_upgrade: true
379
+ packages:
380
+ - git
381
+ - htop
382
+ - snapd
383
+ - chrony
384
+ - lldpd
385
+ - lshw
386
+
387
+ resize_rootfs: false
388
+ growpart:
389
+ mode: "off"
390
+ network:
391
+ version: 2
392
+ ethernets:
393
+ ${networkInterfaceName}:
394
+ match:
395
+ macaddress: "${mac}"
396
+ mtu: 1500
397
+ set-name: ${networkInterfaceName}
398
+ dhcp4: false
399
+ addresses:
400
+ - ${commissioningDeviceIp}/24
401
+ routes:
402
+ - to: default
403
+ via: ${gatewayip}
404
+ # gateway4: ${gatewayip}
405
+ nameservers:
406
+ addresses:
407
+ - ${process.env.MAAS_DNS}
408
+
409
+ final_message: "====== Cloud init finished ======"
410
+
411
+ # power_state:
412
+ # mode: reboot
413
+ # message: Rebooting after initial setup
414
+ # timeout: 30
415
+ # condition: True
416
+
417
+ bootcmd:
418
+ - echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
419
+ - echo "Init bootcmd"
420
+ - echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
421
+ ${UnderpostBaremetal.API.stepsRender(
422
+ [`/underpost/dns.sh`, `/underpost/host.sh`, `/underpost/mac.sh`, `cat /underpost/mac`],
423
+ true,
424
+ )}
425
+ runcmd:
426
+ - echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
427
+ - echo "Init runcmd"
428
+ - echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
429
+
430
+ # If this is set, 'root' will not be able to ssh in and they
431
+ # will get a message to login instead as the default $user
432
+ disable_root: true
433
+
434
+ # This will cause the set+update hostname module to not operate (if true)
435
+ preserve_hostname: false
436
+
437
+ # The modules that run in the 'init' stage
438
+ cloud_init_modules:
439
+ - migrator
440
+ - seed_random
441
+ - bootcmd
442
+ - write-files
443
+ - growpart
444
+ - resizefs
445
+ - set_hostname
446
+ - update_hostname
447
+ - update_etc_hosts
448
+ - ca-certs
449
+ - rsyslog
450
+ - users-groups
451
+ - ssh
452
+
453
+ # The modules that run in the 'config' stage
454
+ cloud_config_modules:
455
+ # Emit the cloud config ready event
456
+ # this can be used by upstart jobs for 'start on cloud-config'.
457
+ - emit_upstart
458
+ - disk_setup
459
+ - mounts
460
+ - ssh-import-id
461
+ - locale
462
+ - set-passwords
463
+ - grub-dpkg
464
+ - apt-pipelining
465
+ - apt-configure
466
+ - package-update-upgrade-install
467
+ - landscape
468
+ - timezone
469
+ - puppet
470
+ - chef
471
+ - salt-minion
472
+ - mcollective
473
+ - disable-ec2-metadata
474
+ - runcmd
475
+ - byobu
476
+ - ssh-import-id
477
+ - ntp
478
+
479
+
480
+ # phone_home:
481
+ # url: "http://${controlServerIp}:5240/MAAS/metadata/v1/?op=phone_home"
482
+ # post: all
483
+ # tries: 3
484
+
485
+ # The modules that run in the 'final' stage
486
+ cloud_final_modules:
487
+ - rightscale_userdata
488
+ - scripts-vendor
489
+ - scripts-per-once
490
+ - scripts-per-boot
491
+ # - scripts-per-instance
492
+ - scripts-user
493
+ - ssh-authkey-fingerprints
494
+ - keys-to-console
495
+ # - phone-home
496
+ - final-message
497
+ - power-state-change
498
+ EOF_MAAS_CFG`;
499
+ },
500
+
501
+ /**
502
+ * @method authCredentialsFactory
503
+ * @description Retrieves MAAS API key credentials from the MAAS CLI.
504
+ * This method parses the output of `maas apikey` to extract the consumer key,
505
+ * consumer secret, token key, and token secret.
506
+ * @returns {object} An object containing the MAAS authentication credentials.
507
+ * @memberof UnderpostCloudInit
508
+ * @throws {Error} If the MAAS API key format is invalid.
509
+ */
510
+ authCredentialsFactory() {
511
+ // Expected formats:
512
+ // <consumer_key>:<consumer_token>:<secret> (older format)
513
+ // <consumer_key>:<consumer_secret>:<token_key>:<token_secret> (newer format)
514
+ // Commands used to generate API keys:
515
+ // maas apikey --with-names --username ${process.env.MAAS_ADMIN_USERNAME}
516
+ // maas ${process.env.MAAS_ADMIN_USERNAME} account create-authorisation-token
517
+ // maas apikey --generate --username ${process.env.MAAS_ADMIN_USERNAME}
518
+ // Reference: https://github.com/CanonicalLtd/maas-docs/issues/647
519
+
520
+ const parts = shellExec(`maas apikey --with-names --username ${process.env.MAAS_ADMIN_USERNAME}`, {
521
+ stdout: true,
522
+ })
523
+ .trim()
524
+ .split(`\n`)[0] // Take only the first line of output.
525
+ .split(':'); // Split by colon to get individual parts.
526
+
527
+ let consumer_key, consumer_secret, token_key, token_secret;
528
+
529
+ // Determine the format of the API key and assign parts accordingly.
530
+ if (parts.length === 4) {
531
+ [consumer_key, consumer_secret, token_key, token_secret] = parts;
532
+ } else if (parts.length === 3) {
533
+ // Handle older 3-part format, setting consumer_secret as empty.
534
+ [consumer_key, token_key, token_secret] = parts;
535
+ consumer_secret = '""';
536
+ token_secret = token_secret.split(' MAAS consumer')[0].trim(); // Clean up token secret.
537
+ } else {
538
+ // Throw an error if the format is not recognized.
539
+ throw new Error('Invalid token format');
540
+ }
541
+
542
+ logger.info('Maas api token generated', { consumer_key, consumer_secret, token_key, token_secret });
543
+ return { consumer_key, consumer_secret, token_key, token_secret };
544
+ },
545
+ };
546
+ }
547
+
548
+ export default UnderpostCloudInit;