@underpostnet/cyberia 3.3.0 → 3.3.73
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.
- package/.dockerignore +1 -0
- package/.github/workflows/coverall.cyberia.ci.yml +34 -14
- package/.github/workflows/cyberia-client.cd.yml +5 -0
- package/.github/workflows/cyberia-server.cd.yml +5 -0
- package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
- package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
- package/.github/workflows/engine-cyberia.cd.yml +3 -0
- package/.github/workflows/engine-cyberia.ci.yml +4 -5
- package/.github/workflows/ghpkg.ci.yml +35 -20
- package/.github/workflows/hardhat.ci.yml +12 -11
- package/.github/workflows/npmpkg.ci.yml +17 -15
- package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
- package/.github/workflows/release.cd.yml +1 -0
- package/.prettierignore +1 -0
- package/AGENTS.md +47 -0
- package/CHANGELOG.md +565 -2510
- package/CLI-HELP.md +306 -147
- package/Dockerfile +25 -9
- package/Dockerfile.dev +25 -9
- package/Dockerfile.test +4 -4
- package/README.md +21 -1
- package/bin/build.js +66 -41
- package/bin/build.template.js +8 -3
- package/bin/cyberia.js +308 -91
- package/bin/deploy.js +18 -104
- package/bin/index.js +308 -91
- package/conf.js +91 -4
- package/deploy/cyberia-client/deploy.sh +47 -0
- package/deploy/cyberia-client/package.sh +18 -0
- package/deploy/cyberia-client/state.sh +14 -0
- package/deploy/cyberia-server/deploy.sh +47 -0
- package/deploy/cyberia-server/package.sh +18 -0
- package/deploy/cyberia-server/state.sh +14 -0
- package/deploy/dd-cyberia/deploy.sh +6 -26
- package/deploy/dd-cyberia/init.sh +35 -43
- package/deploy/dd-cyberia/package.sh +17 -0
- package/deploy/dd-cyberia/state.sh +14 -0
- package/deploy/dd-cyberia/sync-deploy.sh +92 -170
- package/deploy/lib/github-actions-logging.sh +594 -0
- package/deploy/lib/host.sh +185 -0
- package/deploy/lib/state.sh +62 -0
- package/deploy/pwa-microservices-template/deploy.sh +12 -39
- package/deploy/release/deploy.sh +9 -39
- package/deployment.yaml +7 -2
- package/docker-compose.yml +7 -7
- package/examples/static-page/README.md +19 -19
- package/examples/static-page/ssr-components/CustomPage.js +2 -2
- package/hardhat/hardhat.config.js +1 -6
- package/hardhat/package-lock.json +101 -40
- package/hardhat/package.json +2 -2
- package/manifests/alertmanager/deployment.yaml +81 -0
- package/manifests/blackbox-exporter/deployment.yaml +75 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
- package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/grafana/deployment.yaml +26 -7
- package/manifests/grafana/kustomization.yaml +1 -0
- package/manifests/grafana/service.yaml +6 -1
- package/manifests/mariadb/pv.yaml +1 -0
- package/manifests/mongodb/statefulset.yaml +9 -2
- package/manifests/mysql/pv-pvc.yaml +14 -1
- package/manifests/postgresql/pv.yaml +12 -1
- package/manifests/postgresql/pvc.yaml +1 -0
- package/manifests/prometheus/deployment.yaml +18 -22
- package/package.json +83 -10
- package/scripts/event-monitor.sh +56 -0
- package/scripts/k3s-node-setup.sh +27 -14
- package/scripts/kubeadm-node-setup.sh +31 -11
- package/scripts/maas-setup.sh +8 -8
- package/scripts/selinux-normalize.sh +907 -0
- package/scripts/shutdown-machine.sh +843 -0
- package/scripts/test-monitor.sh +3 -3
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
- package/src/api/core/core.controller.js +1 -1
- package/src/api/core/core.router.js +2 -2
- package/src/api/core/core.service.js +2 -2
- package/src/api/crypto/crypto.controller.js +1 -1
- package/src/api/crypto/crypto.service.js +1 -1
- package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
- package/src/api/cyberia-action/cyberia-action.router.js +1 -1
- package/src/api/cyberia-action/cyberia-action.service.js +2 -2
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
- package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
- package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +8 -0
- package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
- package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -1
- package/src/api/cyberia-instance/cyberia-instance.router.js +2 -2
- package/src/api/cyberia-instance/cyberia-instance.service.js +2 -2
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
- package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
- package/src/api/cyberia-map/cyberia-map.router.js +1 -1
- package/src/api/cyberia-map/cyberia-map.service.js +2 -2
- package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
- package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
- package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
- package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +0 -26
- package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
- package/src/api/default/default.controller.js +1 -1
- package/src/api/default/default.router.js +1 -1
- package/src/api/default/default.service.js +2 -2
- package/src/api/document/document.controller.js +1 -1
- package/src/api/document/document.router.js +1 -1
- package/src/api/document/document.service.js +2 -2
- package/src/api/file/file.controller.js +1 -1
- package/src/api/file/file.router.js +1 -1
- package/src/api/file/file.service.js +2 -2
- package/src/api/instance/instance.controller.js +1 -1
- package/src/api/instance/instance.router.js +1 -1
- package/src/api/instance/instance.service.js +2 -2
- package/src/api/ipfs/ipfs.controller.js +1 -1
- package/src/api/ipfs/ipfs.router.js +2 -2
- package/src/api/ipfs/ipfs.service.js +2 -2
- package/src/api/object-layer/object-layer.controller.js +1 -1
- package/src/api/object-layer/object-layer.router.js +2 -2
- package/src/api/object-layer/object-layer.service.js +3 -3
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
- package/src/api/test/test.controller.js +1 -1
- package/src/api/test/test.service.js +1 -1
- package/src/api/user/guest.service.js +3 -3
- package/src/api/user/user.controller.js +1 -1
- package/src/api/user/user.router.js +2 -2
- package/src/api/user/user.service.js +4 -4
- package/src/api.js +5 -9
- package/src/cli/app.js +391 -0
- package/src/cli/baremetal.js +30 -35
- package/src/cli/client.js +306 -0
- package/src/cli/cloud-init.js +3 -3
- package/src/cli/cluster.js +184 -82
- package/src/cli/db.js +120 -68
- package/src/cli/deploy.js +153 -71
- package/src/cli/docker-compose.js +5 -5
- package/src/cli/domains.js +184 -0
- package/src/cli/dotenv-store.js +143 -0
- package/src/cli/event.js +2281 -0
- package/src/cli/fs.js +3 -3
- package/src/cli/host.js +672 -0
- package/src/cli/image.js +4 -6
- package/src/cli/index.js +322 -142
- package/src/cli/ipfs.js +34 -30
- package/src/cli/kickstart.js +1 -1
- package/src/cli/kubectl.js +218 -41
- package/src/cli/lxd.js +3 -3
- package/src/cli/monitor.js +1359 -26
- package/src/cli/package.js +90 -0
- package/src/cli/release.js +16 -12
- package/src/cli/repository.js +558 -363
- package/src/cli/run.js +331 -650
- package/src/cli/secrets.js +2158 -964
- package/src/cli/ssh.js +478 -279
- package/src/cli/state.js +394 -0
- package/src/cli/static.js +2 -2
- package/src/cli/system.js +1 -1
- package/src/cli/test.js +199 -125
- package/src/cli/vultr.js +61 -21
- package/src/cli/wireguard.js +1111 -306
- package/src/client/components/core/CalendarCore.js +53 -96
- package/src/client/components/core/Docs.js +258 -211
- package/src/client/components/core/FileExplorer.js +0 -21
- package/src/client/components/core/PanelForm.js +4 -4
- package/src/client/components/core/Repository.js +56 -0
- package/src/client/components/core/Translate.js +7 -0
- package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
- package/src/client/components/core/Wallet.js +0 -11
- package/src/client/components/core/Worker.js +7 -1
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -1
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
- package/src/client/components/default/AppShellDefault.js +1 -1
- package/src/client/components/default/SettingsDefault.js +2 -2
- package/src/client/components/itemledger/SettingsItemledger.js +2 -2
- package/src/client/components/underpost/AppShellUnderpost.js +3 -2
- package/src/client/components/underpost/SettingsUnderpost.js +2 -2
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
- package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
- package/src/client/public/default/android-chrome-144x144.png +0 -0
- package/src/client/public/default/android-chrome-192x192.png +0 -0
- package/src/client/public/default/android-chrome-256x256.png +0 -0
- package/src/client/public/default/android-chrome-36x36.png +0 -0
- package/src/client/public/default/android-chrome-384x384.png +0 -0
- package/src/client/public/default/android-chrome-48x48.png +0 -0
- package/src/client/public/default/android-chrome-512x512.png +0 -0
- package/src/client/public/default/android-chrome-72x72.png +0 -0
- package/src/client/public/default/android-chrome-96x96.png +0 -0
- package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
- package/src/client/public/default/assets/background/white.jpg +0 -0
- package/src/client/public/default/browserconfig.xml +1 -1
- package/src/client/public/default/favicon-16x16.png +0 -0
- package/src/client/public/default/favicon-32x32.png +0 -0
- package/src/client/public/default/favicon-48x48.png +0 -0
- package/src/client/public/default/favicon.ico +0 -0
- package/src/client/public/default/manifest.webmanifest +5 -5
- package/src/client/public/default/mstile-144x144.png +0 -0
- package/src/client/public/default/mstile-150x150.png +0 -0
- package/src/client/public/default/mstile-310x150.png +0 -0
- package/src/client/public/default/mstile-310x310.png +0 -0
- package/src/client/public/default/mstile-70x70.png +0 -0
- package/src/client/public/default/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +1 -1
- package/src/client/ssr/RootDocument.js +1 -1
- package/src/client/ssr/body/404.js +1 -1
- package/src/client/ssr/body/500.js +1 -1
- package/src/client/ssr/body/CacheControl.js +1 -1
- package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
- package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
- package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
- package/src/client/ssr/head/CryptokoynScripts.js +1 -1
- package/src/client/ssr/head/Css.js +1 -1
- package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
- package/src/client/ssr/head/DefaultScripts.js +1 -1
- package/src/client/ssr/head/ItemledgerScripts.js +1 -1
- package/src/client/ssr/head/Microdata.js +1 -1
- package/src/client/ssr/head/Production.js +1 -1
- package/src/client/ssr/head/Pwa.js +1 -1
- package/src/client/ssr/head/PwaItemledger.js +1 -1
- package/src/client/ssr/head/Seo.js +1 -1
- package/src/client/ssr/head/UnderpostScripts.js +1 -1
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
- package/src/client/ssr/views/Cyberia404.js +7 -5
- package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
- package/src/client/ssr/views/Maintenance.js +1 -1
- package/src/client/ssr/views/NoNetworkConnection.js +1 -1
- package/src/client/ssr/views/Test.js +1 -1
- package/src/client/sw/core.sw.js +20 -14
- package/src/client-builder/client-build-docs.js +61 -46
- package/src/client-builder/client-build-live.js +2 -2
- package/src/client-builder/client-build.js +38 -30
- package/src/client-builder/client-dev-server.js +3 -3
- package/src/client-builder/client-icons.js +2 -2
- package/src/client-builder/ssr.js +3 -3
- package/src/client.build.js +3 -6
- package/src/client.dev.js +3 -6
- package/src/db/DataBaseProvider.js +186 -3
- package/src/db/mariadb/MariaDB.js +3 -2
- package/src/db/mongo/MongoBootstrap.js +273 -101
- package/src/db/mongo/MongooseDB.js +7 -8
- package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
- package/src/grpc/cyberia/grpc-server.js +1 -1
- package/src/index.js +79 -23
- package/src/mailer/EmailRender.js +2 -2
- package/src/mailer/MailerInterceptor.js +87 -0
- package/src/mailer/MailerProvider.js +50 -6
- package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
- package/src/projects/cyberia/besu-genesis-generator.js +3 -3
- package/src/projects/cyberia/catalog-cyberia.js +53 -10
- package/src/projects/cyberia/gemini-client.js +1 -1
- package/src/projects/cyberia/generate-saga.js +1 -1
- package/src/projects/cyberia/hot-reload-trigger.js +1 -1
- package/src/projects/cyberia/instance-data.js +1 -1
- package/src/projects/cyberia/ipfs-client.js +4 -4
- package/src/projects/cyberia/map-preview-generator.js +1 -1
- package/src/projects/cyberia/object-layer.js +1 -1
- package/src/projects/cyberia/semantic-layer-generator.js +1 -1
- package/src/projects/underpost/catalog-underpost.js +9 -1
- package/src/proxy.js +4 -7
- package/src/runtime/cyberia-client/Dockerfile +9 -4
- package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
- package/src/runtime/cyberia-server/Dockerfile +9 -4
- package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
- package/src/runtime/engine-cyberia/Dockerfile +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
- package/src/runtime/engine-cyberia/docker-compose.yml +7 -7
- package/src/runtime/express/Express.js +32 -27
- package/src/runtime/lampp/Lampp.js +22 -70
- package/src/runtime/nginx/Nginx.js +1 -1
- package/src/runtime/wp/Wp.js +16 -48
- package/src/server/{catalog.js → build/catalog.js} +15 -5
- package/src/server/build/coverage.js +117 -0
- package/src/server/build/execution.js +402 -0
- package/src/server/build/package.js +465 -0
- package/src/server/build/testing.js +528 -0
- package/src/server/{dns.js → network/dns.js} +144 -11
- package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
- package/src/server/{middlewares.js → network/middlewares.js} +3 -3
- package/src/server/network/node-capability.js +98 -0
- package/src/server/{peer.js → network/peer.js} +3 -3
- package/src/server/{proxy.js → network/proxy.js} +7 -13
- package/src/server/network/router.js +356 -0
- package/src/server/{tls.js → network/tls.js} +2 -2
- package/src/server/{underpost-compression.js → network/underpost-compression.js} +1 -1
- package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
- package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
- package/src/server/{cri.js → ops/cri.js} +2 -2
- package/src/server/{cron.js → ops/cron.js} +349 -74
- package/src/server/ops/event-notification.js +284 -0
- package/src/server/{logger.js → ops/logger.js} +108 -23
- package/src/server/ops/monitoring.js +1724 -0
- package/src/server/{systemd.js → ops/systemd.js} +55 -1
- package/src/server/{conf.js → runtime/conf.js} +513 -422
- package/src/server/runtime/config-scope.js +215 -0
- package/src/server/runtime/environment.js +149 -0
- package/src/server/{process.js → runtime/process.js} +153 -12
- package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
- package/src/server/{runtime.js → runtime/runtime.js} +12 -8
- package/src/server/{start.js → runtime/start.js} +128 -39
- package/src/server/{auth.js → security/auth.js} +7 -8
- package/src/server/security/container-storage.js +382 -0
- package/src/server/{crypto.js → security/crypto.js} +1 -1
- package/src/server/{selinux.js → security/selinux.js} +1 -1
- package/src/server/{backup.js → storage/backup.js} +17 -8
- package/src/server/{data-query.js → storage/data-query.js} +1 -1
- package/src/server/{downloader.js → storage/downloader.js} +2 -2
- package/src/server/storage/repository.js +68 -0
- package/src/server.js +4 -7
- package/src/ws/IoInterface.js +1 -1
- package/src/ws/IoServer.js +1 -1
- package/src/ws/core/core.ws.connection.js +1 -1
- package/src/ws/core/core.ws.emit.js +1 -1
- package/src/ws/core/core.ws.server.js +1 -1
- package/src/ws/default/default.ws.connection.js +1 -1
- package/src/ws/default/default.ws.emit.js +1 -1
- package/src/ws/default/default.ws.server.js +1 -1
- package/test/e2e/event-e2e-public-ingress-down.js +45 -0
- package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
- package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
- package/test/{api.test.js → integration/app/api.test.js} +33 -14
- package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
- package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +1 -1
- package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
- package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
- package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
- package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
- package/test/integration/infra/1-security/config-scope.test.js +305 -0
- package/test/integration/infra/1-security/container-storage.test.js +356 -0
- package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
- package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
- package/test/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
- package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
- package/test/integration/infra/1-security/systemd-service.test.js +70 -0
- package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
- package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
- package/test/integration/infra/2-network/node-capability.test.js +182 -0
- package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
- package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +609 -55
- package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
- package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
- package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
- package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
- package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
- package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
- package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +6 -6
- package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -4
- package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
- package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
- package/test/integration/infra/5-observability/event-notification.test.js +197 -0
- package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
- package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
- package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
- package/test/support/shell-harness.js +73 -0
- package/test/unit/build-template.test.js +97 -0
- package/test/unit/build-workflow-offline.test.js +132 -0
- package/test/unit/catalog.test.js +71 -0
- package/test/unit/client-build-docs.test.js +334 -0
- package/test/unit/conf-loading.test.js +303 -0
- package/test/unit/conf-resolution.test.js +979 -0
- package/test/unit/coverage-artifact.test.js +130 -0
- package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
- package/test/unit/deploy-env-resolution.test.js +38 -0
- package/test/unit/deploy-log-table.test.js +447 -0
- package/test/unit/execution-profiles.test.js +219 -0
- package/test/unit/fleet-sync-source.test.js +149 -0
- package/test/unit/logger-redaction.test.js +112 -0
- package/test/unit/package.test.js +403 -0
- package/test/unit/prepare-host.test.js +299 -0
- package/test/unit/process-environment.test.js +18 -0
- package/test/unit/propagation-message.test.js +78 -0
- package/test/unit/redeploy-plan.test.js +24 -0
- package/test/unit/release-bump.test.js +474 -0
- package/test/unit/ssh-output-redaction.test.js +28 -0
- package/test/unit/start-options.test.js +46 -0
- package/test/unit/test-tiers.test.js +193 -0
- package/vitest.config.js +58 -0
- package/.nycrc +0 -9
- package/deploy/lib/logging.sh +0 -96
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
- package/manifests/mongodb/pv-pvc.yaml +0 -59
- package/scripts/coverall-test-cyberia.sh +0 -24
- package/scripts/coverall-test.sh +0 -24
- package/scripts/link-local-underpost-cli.sh +0 -6
- package/src/api/user/user.build.js +0 -16
- package/src/cli/env.js +0 -177
- package/src/client/components/core/Blockchain.js +0 -41
- package/src/client/components/core/Blog.js +0 -9
- package/src/client/components/core/KeyboardAvoidance.js +0 -145
- package/src/client/public/default/assets/background/dark.jpg +0 -0
- package/src/client/public/default/assets/background/white0-min.jpg +0 -0
- package/src/client/public/default/assets/background/white0.jpg +0 -0
- package/src/client/public/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +0 -148
- package/src/server/environment.js +0 -98
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { expect } from 'chai';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import {
|
|
6
|
+
TEST_TIERS,
|
|
7
|
+
UNDERPOST_TESTING,
|
|
8
|
+
coverageIncludeFactory,
|
|
9
|
+
coverageThresholdFactory,
|
|
10
|
+
resolveTestSelection,
|
|
11
|
+
testProjectsFactory,
|
|
12
|
+
testSuiteNames,
|
|
13
|
+
} from '../../src/server/build/testing.js';
|
|
14
|
+
|
|
15
|
+
// The table declares every tier the platform ships. A product build slices the
|
|
16
|
+
// tree, so whether a tier's directory is present here is a catalog question,
|
|
17
|
+
// asserted in catalog.test.js — these are about the table itself.
|
|
18
|
+
describe('test tiers', () => {
|
|
19
|
+
it('names every tier uniquely', () => {
|
|
20
|
+
const names = TEST_TIERS.map(({ name }) => name);
|
|
21
|
+
expect(new Set(names).size).to.equal(names.length);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('never leaves a tier on group order 0', () => {
|
|
25
|
+
// Vitest routes a single-worker project on the default 0 into a bucket it
|
|
26
|
+
// appends after every ordered group, which would run that tier last.
|
|
27
|
+
for (const { name, groupOrder } of TEST_TIERS) expect(groupOrder, name).to.be.greaterThan(0);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('declares tiers in the order they run', () => {
|
|
31
|
+
const orders = TEST_TIERS.map(({ groupOrder }) => groupOrder);
|
|
32
|
+
expect(orders).to.deep.equal([...orders].sort((a, b) => a - b));
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('keeps delegated tiers in the last group', () => {
|
|
36
|
+
// They run after the Vitest pass, so an earlier group order would describe
|
|
37
|
+
// an execution order that does not happen.
|
|
38
|
+
const lastGroup = Math.max(...TEST_TIERS.map(({ groupOrder }) => groupOrder));
|
|
39
|
+
for (const { name, groupOrder, delegate } of TEST_TIERS) if (delegate) expect(groupOrder, name).to.equal(lastGroup);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('exposes only non-delegated tiers as Vitest projects', () => {
|
|
43
|
+
const projects = testProjectsFactory().map(({ test }) => test.name);
|
|
44
|
+
expect(projects).to.deep.equal(TEST_TIERS.filter(({ delegate }) => !delegate).map(({ name }) => name));
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('test tier selection', () => {
|
|
49
|
+
it('runs every tier when nothing is selected', () => {
|
|
50
|
+
for (const selector of ['', 'all']) {
|
|
51
|
+
const { projects, runVitest, delegated } = resolveTestSelection(selector);
|
|
52
|
+
// No explicit project list: Vitest runs them all, and a product build
|
|
53
|
+
// that strips one must not fail on a name it no longer ships.
|
|
54
|
+
expect(projects, selector).to.be.empty;
|
|
55
|
+
expect(runVitest, selector).to.equal(true);
|
|
56
|
+
expect(
|
|
57
|
+
delegated.map(({ name }) => name),
|
|
58
|
+
selector,
|
|
59
|
+
).to.deep.equal(TEST_TIERS.filter(({ delegate }) => delegate).map(({ name }) => name));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('expands a suite into its tiers', () => {
|
|
64
|
+
expect(resolveTestSelection('infra').projects).to.deep.equal(
|
|
65
|
+
TEST_TIERS.filter(({ name }) => name.startsWith('infra:')).map(({ name }) => name),
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('skips the Vitest pass when only delegated tiers are selected', () => {
|
|
70
|
+
const { runVitest, delegated } = resolveTestSelection('contracts');
|
|
71
|
+
expect(runVitest).to.equal(false);
|
|
72
|
+
expect(delegated.map(({ name }) => name)).to.deep.equal(['contracts']);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('rejects an unknown selector instead of reporting an empty green run', () => {
|
|
76
|
+
expect(() => resolveTestSelection('not-a-suite')).to.throw(/unknown suite/);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('offers every suite prefix as a selector', () => {
|
|
80
|
+
for (const suite of testSuiteNames()) expect(() => resolveTestSelection(suite), suite).to.not.throw();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('delegated tier commands', () => {
|
|
85
|
+
const delegated = TEST_TIERS.filter(({ delegate }) => delegate);
|
|
86
|
+
|
|
87
|
+
it('ships at least one delegated tier to assert against', () => {
|
|
88
|
+
expect(delegated).to.not.be.empty;
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('writes results only when a destination is given', () => {
|
|
92
|
+
for (const { name, delegate } of delegated) {
|
|
93
|
+
expect(delegate({}), name).to.not.include('--test-reporter-destination=/');
|
|
94
|
+
expect(delegate({ resultsPath: '/results/TEST-x.xml' }), name).to.include('/results/TEST-x.xml');
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('passes a name filter through to its runner', () => {
|
|
99
|
+
for (const { name, delegate } of delegated) expect(delegate({ grep: 'Burning' }), name).to.include('Burning');
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Under an outer `npm`, npx resolves the root project as the local prefix and
|
|
103
|
+
// pulls its own copy of a nested tool from the registry, which Hardhat then
|
|
104
|
+
// refuses to run as a non-local installation.
|
|
105
|
+
it('runs nested tooling from the nested install rather than through npx', () => {
|
|
106
|
+
for (const { name, delegate } of delegated) {
|
|
107
|
+
expect(delegate({}), name).to.not.match(/\bnpx\b/);
|
|
108
|
+
expect(delegate({}), name).to.include('./node_modules/.bin/');
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// A directory left behind by an interrupted install passes a `-d` probe while
|
|
113
|
+
// holding none of the binaries the tier runs.
|
|
114
|
+
it('probes the installed binary before skipping the install', () => {
|
|
115
|
+
for (const { name, delegate } of delegated)
|
|
116
|
+
expect(delegate({}), name).to.match(/\[ -x node_modules\/\.bin\/[\w.-]+ \] \|\| npm ci/);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe('coverage threshold', () => {
|
|
121
|
+
it('reports without gating until a run opts in', () => {
|
|
122
|
+
// A tier selection measures a slice of the tree, so the whole-suite number is
|
|
123
|
+
// not the bar it should be held to.
|
|
124
|
+
expect(coverageThresholdFactory({})).to.equal(null);
|
|
125
|
+
expect(coverageThresholdFactory({ COVERAGE_ENFORCE: '0' })).to.equal(null);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('gates an opted-in run on the shipped threshold', () => {
|
|
129
|
+
for (const COVERAGE_ENFORCE of ['1', 'true'])
|
|
130
|
+
expect(coverageThresholdFactory({ COVERAGE_ENFORCE }), COVERAGE_ENFORCE).to.equal(
|
|
131
|
+
UNDERPOST_TESTING.coverageThreshold,
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('lets a repository ratchet its own bar', () => {
|
|
136
|
+
expect(coverageThresholdFactory({ COVERAGE_MIN: '25' })).to.equal(25);
|
|
137
|
+
// An unset repository variable arrives as an empty string, not as absent.
|
|
138
|
+
expect(coverageThresholdFactory({ COVERAGE_ENFORCE: '1', COVERAGE_MIN: '' })).to.equal(
|
|
139
|
+
UNDERPOST_TESTING.coverageThreshold,
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('refuses a bar that is not a percentage', () => {
|
|
144
|
+
for (const COVERAGE_MIN of ['eighty', '-1', '101'])
|
|
145
|
+
expect(() => coverageThresholdFactory({ COVERAGE_MIN }), COVERAGE_MIN).to.throw('COVERAGE_MIN');
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
describe('coverage scope', () => {
|
|
150
|
+
const vitestTiers = TEST_TIERS.filter(({ delegate }) => !delegate);
|
|
151
|
+
|
|
152
|
+
it('makes every Vitest tier accountable for the sources it drives', () => {
|
|
153
|
+
for (const { name, sources } of vitestTiers) expect(sources, name).to.not.be.empty;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('leaves a delegated tier out of the Vitest report', () => {
|
|
157
|
+
// Its runner measures its own coverage, and this table only feeds Vitest.
|
|
158
|
+
for (const { name, sources, delegate } of TEST_TIERS) if (delegate) expect(sources, name).to.equal(undefined);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('points every glob at something this tree ships', () => {
|
|
162
|
+
// A source that moved leaves the tier silently measuring nothing, which
|
|
163
|
+
// reads as coverage rather than as the missing measurement it is. A product
|
|
164
|
+
// build slices the tree, so only tiers it kept are asserted.
|
|
165
|
+
for (const { name, directory, sources } of vitestTiers) {
|
|
166
|
+
if (!fs.existsSync(directory)) continue;
|
|
167
|
+
for (const glob of sources) expect(fs.globSync(glob), `${name}: ${glob}`).to.not.be.empty;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('measures every tier when the run selects none', () => {
|
|
172
|
+
const everySource = new Set(vitestTiers.flatMap(({ sources }) => sources));
|
|
173
|
+
expect(coverageIncludeFactory([])).to.have.members([...everySource]);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('measures only the selected tiers', () => {
|
|
177
|
+
const unit = TEST_TIERS.find(({ name }) => name === 'unit').sources;
|
|
178
|
+
for (const argv of [['--project', 'unit'], ['--project=unit']])
|
|
179
|
+
expect(coverageIncludeFactory(['npx', 'vitest', 'run', ...argv, '--coverage']), argv.join(' ')).to.deep.equal(
|
|
180
|
+
unit,
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('counts a source two tiers drive once', () => {
|
|
185
|
+
const include = coverageIncludeFactory(['--project', 'infra:3-cluster', '--project', 'infra:4-ingress']);
|
|
186
|
+
expect(new Set(include).size).to.equal(include.length);
|
|
187
|
+
expect(include).to.include('src/server/runtime/conf.js');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('rejects a selection that matches no tier', () => {
|
|
191
|
+
expect(() => coverageIncludeFactory(['--project', 'not-a-tier'])).to.throw(/unknown suite/);
|
|
192
|
+
});
|
|
193
|
+
});
|
package/vitest.config.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
import {
|
|
3
|
+
UNDERPOST_TESTING,
|
|
4
|
+
coverageIncludeFactory,
|
|
5
|
+
coverageThresholdFactory,
|
|
6
|
+
testProjectsFactory,
|
|
7
|
+
} from './src/server/build/testing.js';
|
|
8
|
+
|
|
9
|
+
const allureResultsDirectory = process.env[UNDERPOST_TESTING.allureResultsEnvKey];
|
|
10
|
+
const coverageThreshold = coverageThresholdFactory(process.env);
|
|
11
|
+
const coverageInclude = coverageIncludeFactory(process.argv);
|
|
12
|
+
|
|
13
|
+
// Spread into every tier: a Vitest project inherits nothing from the root
|
|
14
|
+
// `test` block, and only `coverage` and `reporters` are read from it.
|
|
15
|
+
const projectDefaults = {
|
|
16
|
+
// Mocha's `describe`/`it` and the hooks stay global, so the suites read the
|
|
17
|
+
// same either side of the migration and carry no runner import.
|
|
18
|
+
globals: true,
|
|
19
|
+
environment: 'node',
|
|
20
|
+
// A tier is only meaningful if its failures are attributable to it, and a
|
|
21
|
+
// suite that reads `dd.routes` or binds a fixed port cannot share a worker
|
|
22
|
+
// with another doing the same.
|
|
23
|
+
fileParallelism: false,
|
|
24
|
+
...(allureResultsDirectory ? { setupFiles: ['allure-vitest/setup'] } : {}),
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default defineConfig({
|
|
28
|
+
test: {
|
|
29
|
+
reporters: [
|
|
30
|
+
'default',
|
|
31
|
+
...(allureResultsDirectory ? [['allure-vitest/reporter', { resultsDir: allureResultsDirectory }]] : []),
|
|
32
|
+
],
|
|
33
|
+
coverage: {
|
|
34
|
+
provider: 'v8',
|
|
35
|
+
reportsDirectory: UNDERPOST_TESTING.coverageDirectory,
|
|
36
|
+
// `lcov` is what Coveralls ingests, `json` is what a merged multi-job
|
|
37
|
+
// report is assembled from, `text` is what a local run reads.
|
|
38
|
+
reporter: ['text', 'lcov', 'json'],
|
|
39
|
+
// Written even when the run fails: the coverage workflows upload the report
|
|
40
|
+
// from a job the threshold step is meant to fail, and without it the badge
|
|
41
|
+
// freezes at the last passing build instead of moving with the tree.
|
|
42
|
+
reportOnFailure: true,
|
|
43
|
+
// The tiers in the selection decide what is measured, so a partial run
|
|
44
|
+
// reports the slice it drives and the whole run reports the whole of it —
|
|
45
|
+
// rather than every module the CLI barrel drags into a worker on import.
|
|
46
|
+
include: coverageInclude,
|
|
47
|
+
// Only the suites themselves: an `include` whitelist already keeps
|
|
48
|
+
// dependencies, bundles and generated assets out, and a directory pattern
|
|
49
|
+
// here is not anchored to the root — `test/**` also excluded the API
|
|
50
|
+
// surfaces named `test`, so the tier covering them reported nothing.
|
|
51
|
+
exclude: ['**/*.{test,spec}.js'],
|
|
52
|
+
// Absent unless the run opted in, so a single-tier run reports its slice
|
|
53
|
+
// instead of failing against a number it never measured.
|
|
54
|
+
...(coverageThreshold === null ? {} : { thresholds: { lines: coverageThreshold } }),
|
|
55
|
+
},
|
|
56
|
+
projects: testProjectsFactory(projectDefaults),
|
|
57
|
+
},
|
|
58
|
+
});
|
package/.nycrc
DELETED
package/deploy/lib/logging.sh
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# Shared logging helpers for deploy/<deploy-id>/*.sh. Sourced, never executed directly.
|
|
2
|
-
#
|
|
3
|
-
# Deploy script contract:
|
|
4
|
-
# - one run_quiet call per remote command, with its own label
|
|
5
|
-
# - the body lives in main(), invoked on the last line: the first remote command
|
|
6
|
-
# pulls this repository, rewriting the running script while bash reads it
|
|
7
|
-
#
|
|
8
|
-
# run_quiet hides normal output, prints only `patterns` matches plus the next
|
|
9
|
-
# `lines_after` lines, and returns the command's exit status so `set -e` stops
|
|
10
|
-
# the deployment. On failure it keeps two temp files and prints their paths in
|
|
11
|
-
# red instead of their contents: the command's own stderr (native error message
|
|
12
|
-
# and stack trace) and the full unfiltered log up to the error.
|
|
13
|
-
|
|
14
|
-
RUN_QUIET_RED=$'\033[0;31m'
|
|
15
|
-
RUN_QUIET_RESET=$'\033[0m'
|
|
16
|
-
|
|
17
|
-
RUN_QUIET_NODE_NAME=$(hostname 2>/dev/null | tr '[:upper:]' '[:lower:]')
|
|
18
|
-
RUN_QUIET_NODE_TAG=${RUN_QUIET_NODE_NAME:+ [$RUN_QUIET_NODE_NAME]}
|
|
19
|
-
|
|
20
|
-
run_quiet() {
|
|
21
|
-
local label="$1"
|
|
22
|
-
local patterns="$2"
|
|
23
|
-
local lines_after="$3"
|
|
24
|
-
shift 3
|
|
25
|
-
|
|
26
|
-
local debug_log
|
|
27
|
-
local error_log
|
|
28
|
-
local fifo_dir
|
|
29
|
-
local filter_pid
|
|
30
|
-
local stderr_pid
|
|
31
|
-
local status=0
|
|
32
|
-
|
|
33
|
-
echo "$(date -Is) $RUN_QUIET_NODE_TAG ▶ $label"
|
|
34
|
-
|
|
35
|
-
debug_log=$(mktemp --suffix=.debug.log)
|
|
36
|
-
error_log=$(mktemp --suffix=.error.log)
|
|
37
|
-
fifo_dir=$(mktemp -d)
|
|
38
|
-
mkfifo "$fifo_dir/merged" "$fifo_dir/stderr"
|
|
39
|
-
|
|
40
|
-
# The filter reads the live stream rather than the finished log: a deployment
|
|
41
|
-
# monitor prints its matches for minutes before exiting, so a pass over the
|
|
42
|
-
# completed file would show nothing until then. fflush defeats awk's block
|
|
43
|
-
# buffering, which otherwise withholds matches whenever stdout is a pipe.
|
|
44
|
-
# awk writes the debug log itself rather than piping through tee, so the
|
|
45
|
-
# reader stays a single process that a kill can always release.
|
|
46
|
-
awk \
|
|
47
|
-
-v pattern="$patterns" \
|
|
48
|
-
-v lines_after="$lines_after" \
|
|
49
|
-
-v debug_log="$debug_log" '
|
|
50
|
-
{
|
|
51
|
-
print > debug_log
|
|
52
|
-
}
|
|
53
|
-
$0 ~ pattern {
|
|
54
|
-
remaining = lines_after + 1
|
|
55
|
-
}
|
|
56
|
-
remaining > 0 {
|
|
57
|
-
print
|
|
58
|
-
fflush()
|
|
59
|
-
remaining--
|
|
60
|
-
}
|
|
61
|
-
' <"$fifo_dir/merged" &
|
|
62
|
-
filter_pid=$!
|
|
63
|
-
|
|
64
|
-
# stderr is duplicated: on its own for the native error and stack trace, and
|
|
65
|
-
# into the merged stream so both the debug log and the filter see it in
|
|
66
|
-
# chronological order with stdout.
|
|
67
|
-
tee -a "$error_log" <"$fifo_dir/stderr" >"$fifo_dir/merged" &
|
|
68
|
-
stderr_pid=$!
|
|
69
|
-
|
|
70
|
-
"$@" >"$fifo_dir/merged" 2>"$fifo_dir/stderr" || status=$?
|
|
71
|
-
|
|
72
|
-
# Drain both readers before the paths are printed, or the trace can still be
|
|
73
|
-
# in flight. Bounded: a command that leaks a child holding a stream open must
|
|
74
|
-
# not hang the deployment, and by then everything read has been written.
|
|
75
|
-
run_quiet_drain "$stderr_pid"
|
|
76
|
-
run_quiet_drain "$filter_pid"
|
|
77
|
-
rm -rf "$fifo_dir"
|
|
78
|
-
|
|
79
|
-
if [ "$status" -ne 0 ]; then
|
|
80
|
-
printf '%s✖ %s failed (exit %s)\n error trace: %s\n debug log: %s%s\n' \
|
|
81
|
-
"$RUN_QUIET_RED" "$label" "$status" "$error_log" "$debug_log" "$RUN_QUIET_RESET" >&2
|
|
82
|
-
return "$status"
|
|
83
|
-
fi
|
|
84
|
-
|
|
85
|
-
rm -f "$debug_log" "$error_log"
|
|
86
|
-
|
|
87
|
-
return "$status"
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
run_quiet_drain() {
|
|
91
|
-
local pid="$1"
|
|
92
|
-
|
|
93
|
-
timeout 10 tail --pid="$pid" -f /dev/null 2>/dev/null || true
|
|
94
|
-
kill "$pid" 2>/dev/null || true
|
|
95
|
-
wait "$pid" 2>/dev/null || true
|
|
96
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
apiVersion: batch/v1
|
|
2
|
-
kind: CronJob
|
|
3
|
-
metadata:
|
|
4
|
-
name: dd-cron-dns
|
|
5
|
-
namespace: default
|
|
6
|
-
labels:
|
|
7
|
-
app: dd-cron-dns
|
|
8
|
-
managed-by: underpost
|
|
9
|
-
spec:
|
|
10
|
-
schedule: "* * * * *"
|
|
11
|
-
concurrencyPolicy: Forbid
|
|
12
|
-
startingDeadlineSeconds: 200
|
|
13
|
-
successfulJobsHistoryLimit: 3
|
|
14
|
-
failedJobsHistoryLimit: 1
|
|
15
|
-
suspend: false
|
|
16
|
-
jobTemplate:
|
|
17
|
-
spec:
|
|
18
|
-
template:
|
|
19
|
-
metadata:
|
|
20
|
-
labels:
|
|
21
|
-
app: dd-cron-dns
|
|
22
|
-
managed-by: underpost
|
|
23
|
-
spec:
|
|
24
|
-
containers:
|
|
25
|
-
- name: dd-cron-dns
|
|
26
|
-
image: underpost/underpost-engine:v3.3.0
|
|
27
|
-
command:
|
|
28
|
-
- /bin/sh
|
|
29
|
-
- -c
|
|
30
|
-
- >
|
|
31
|
-
cd /home/dd/engine &&
|
|
32
|
-
node bin env dd-cron production &&
|
|
33
|
-
node bin cron dd-cron dns --git --kubeadm
|
|
34
|
-
volumeMounts:
|
|
35
|
-
- mountPath: /home/dd/engine
|
|
36
|
-
name: underpost-cron-container-volume
|
|
37
|
-
- mountPath: /usr/lib/node_modules/underpost
|
|
38
|
-
name: underpost-share-env
|
|
39
|
-
volumes:
|
|
40
|
-
- hostPath:
|
|
41
|
-
path: /home/dd/engine
|
|
42
|
-
type: Directory
|
|
43
|
-
name: underpost-cron-container-volume
|
|
44
|
-
- hostPath:
|
|
45
|
-
path: /root/.nvm/versions/node/v24.15.0/lib/node_modules/underpost
|
|
46
|
-
type: DirectoryOrCreate
|
|
47
|
-
name: underpost-share-env
|
|
48
|
-
restartPolicy: OnFailure
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
apiVersion: v1
|
|
2
|
-
kind: PersistentVolume
|
|
3
|
-
metadata:
|
|
4
|
-
name: mongodb-pv-0
|
|
5
|
-
labels:
|
|
6
|
-
app: mongodb
|
|
7
|
-
spec:
|
|
8
|
-
capacity:
|
|
9
|
-
storage: 5Gi
|
|
10
|
-
accessModes:
|
|
11
|
-
- ReadWriteOnce
|
|
12
|
-
persistentVolumeReclaimPolicy: Retain
|
|
13
|
-
storageClassName: mongodb-storage-class
|
|
14
|
-
claimRef:
|
|
15
|
-
namespace: default
|
|
16
|
-
name: mongodb-storage-mongodb-0
|
|
17
|
-
hostPath:
|
|
18
|
-
path: /data/mongodb/v0
|
|
19
|
-
type: DirectoryOrCreate
|
|
20
|
-
---
|
|
21
|
-
apiVersion: v1
|
|
22
|
-
kind: PersistentVolume
|
|
23
|
-
metadata:
|
|
24
|
-
name: mongodb-pv-1
|
|
25
|
-
labels:
|
|
26
|
-
app: mongodb
|
|
27
|
-
spec:
|
|
28
|
-
capacity:
|
|
29
|
-
storage: 5Gi
|
|
30
|
-
accessModes:
|
|
31
|
-
- ReadWriteOnce
|
|
32
|
-
persistentVolumeReclaimPolicy: Retain
|
|
33
|
-
storageClassName: mongodb-storage-class
|
|
34
|
-
claimRef:
|
|
35
|
-
namespace: default
|
|
36
|
-
name: mongodb-storage-mongodb-1
|
|
37
|
-
hostPath:
|
|
38
|
-
path: /data/mongodb/v1
|
|
39
|
-
type: DirectoryOrCreate
|
|
40
|
-
---
|
|
41
|
-
apiVersion: v1
|
|
42
|
-
kind: PersistentVolume
|
|
43
|
-
metadata:
|
|
44
|
-
name: mongodb-pv-2
|
|
45
|
-
labels:
|
|
46
|
-
app: mongodb
|
|
47
|
-
spec:
|
|
48
|
-
capacity:
|
|
49
|
-
storage: 5Gi
|
|
50
|
-
accessModes:
|
|
51
|
-
- ReadWriteOnce
|
|
52
|
-
persistentVolumeReclaimPolicy: Retain
|
|
53
|
-
storageClassName: mongodb-storage-class
|
|
54
|
-
claimRef:
|
|
55
|
-
namespace: default
|
|
56
|
-
name: mongodb-storage-mongodb-2
|
|
57
|
-
hostPath:
|
|
58
|
-
path: /data/mongodb/v2
|
|
59
|
-
type: DirectoryOrCreate
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -u -o pipefail
|
|
3
|
-
|
|
4
|
-
EXCLUDES=(
|
|
5
|
-
--exclude="test/cluster-instances.test.js"
|
|
6
|
-
--exclude="test/deploy-monitor.test.js"
|
|
7
|
-
--exclude="test/deploy-node-placement.test.js"
|
|
8
|
-
--exclude="test/instance-traffic-plan.test.js"
|
|
9
|
-
--exclude="test/sops-secret-store.test.js"
|
|
10
|
-
--exclude="test/underpost-gateway.test.js"
|
|
11
|
-
--exclude="test/underpost-ingress.test.js"
|
|
12
|
-
--exclude="test/wireguard-edge.test.js"
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
TESTS=(
|
|
16
|
-
test/cyberia-instance-conf-defaults.test.js
|
|
17
|
-
test/cyberia-load.test.js
|
|
18
|
-
test/object-layer-item-id.test.js
|
|
19
|
-
test/api.test.js
|
|
20
|
-
test/crypto.test.js
|
|
21
|
-
test/shape-generator.test.js
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
c8 "${EXCLUDES[@]}" mocha "${TESTS[@]}"
|
package/scripts/coverall-test.sh
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -u -o pipefail
|
|
3
|
-
|
|
4
|
-
EXCLUDES=(
|
|
5
|
-
--exclude="test/cyberia-instance-conf-defaults.test.js"
|
|
6
|
-
--exclude="test/cyberia-load.test.js"
|
|
7
|
-
--exclude="test/object-layer-item-id.test.js"
|
|
8
|
-
--exclude="test/api.test.js"
|
|
9
|
-
--exclude="test/crypto.test.js"
|
|
10
|
-
--exclude="test/shape-generator.test.js"
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
TESTS=(
|
|
14
|
-
test/cluster-instances.test.js
|
|
15
|
-
test/deploy-monitor.test.js
|
|
16
|
-
test/deploy-node-placement.test.js
|
|
17
|
-
test/instance-traffic-plan.test.js
|
|
18
|
-
test/sops-secret-store.test.js
|
|
19
|
-
test/underpost-gateway.test.js
|
|
20
|
-
test/underpost-ingress.test.js
|
|
21
|
-
test/wireguard-edge.test.js
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
c8 "${EXCLUDES[@]}" mocha "${TESTS[@]}"
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra';
|
|
2
|
-
import { faBase64Png, getBufferPngText } from '../../server/client-icons.js';
|
|
3
|
-
|
|
4
|
-
process.exit(0);
|
|
5
|
-
|
|
6
|
-
fs.writeFileSync(
|
|
7
|
-
'./tmp/api-user-invalid-token.png',
|
|
8
|
-
await getBufferPngText({ text: 'Invalid token', textColor: '#ff0000' }),
|
|
9
|
-
'utf8',
|
|
10
|
-
);
|
|
11
|
-
fs.writeFileSync(
|
|
12
|
-
'./tmp/api-user-recover.png',
|
|
13
|
-
Buffer.from(faBase64Png('rotate-left', 50, 50, '#ffffff'), 'base64'),
|
|
14
|
-
'utf8',
|
|
15
|
-
);
|
|
16
|
-
fs.writeFileSync('./tmp/api-user-check.png', Buffer.from(faBase64Png('check', 50, 50), 'base64'), 'utf8');
|