cyberia 3.2.12 → 3.2.70
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/.env.example +127 -68
- package/.github/workflows/cyberia-client.cd.yml +40 -0
- package/.github/workflows/cyberia-server.cd.yml +40 -0
- package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
- package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
- package/.github/workflows/engine-cyberia.cd.yml +34 -24
- package/.github/workflows/engine-cyberia.ci.yml +27 -5
- package/.github/workflows/ghpkg.ci.yml +89 -1
- package/.github/workflows/gitlab.ci.yml +1 -1
- package/.github/workflows/hardhat.ci.yml +1 -1
- package/.github/workflows/npmpkg.ci.yml +19 -12
- package/.github/workflows/publish.ci.yml +2 -2
- package/.github/workflows/publish.cyberia.ci.yml +5 -16
- package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/CHANGELOG.md +451 -1
- package/CLI-HELP.md +1040 -1130
- package/Dockerfile +141 -43
- package/Dockerfile.dev +143 -0
- package/Dockerfile.test +165 -0
- package/README.md +1 -1
- package/baremetal/commission-workflows.json +1 -0
- package/bin/build.js +128 -136
- package/bin/build.template.js +25 -179
- package/bin/cyberia.js +1089 -188
- package/bin/deploy.js +6 -3
- package/bin/index.js +1089 -188
- package/bump.config.js +1 -0
- package/compose.env +131 -0
- package/conf.js +19 -1
- package/deployment.yaml +74 -2
- package/docker-compose.yml +316 -0
- package/hardhat/hardhat.config.js +2 -2
- package/hardhat/package-lock.json +620 -2041
- package/hardhat/package.json +7 -5
- package/hardhat/scripts/deployObjectLayerToken.js +18 -18
- package/hardhat/test/ObjectLayerToken.js +378 -274
- package/ipfs/configure-ipfs.sh +13 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +74 -2
- package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
- package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/mongodb/entrypoint.sh +76 -0
- package/nginx.conf +87 -0
- package/package.json +34 -22
- package/pv-pvc.yaml +32 -0
- package/scripts/disk-clean.sh +85 -60
- package/scripts/kubeadm-node-setup.sh +317 -0
- package/scripts/link-local-underpost-cli.sh +6 -0
- package/scripts/rocky-kickstart.sh +877 -185
- package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
- package/scripts/test-monitor.sh +248 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
- package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
- package/src/api/cyberia-action/cyberia-action.model.js +21 -29
- package/src/api/cyberia-action/cyberia-action.router.js +42 -7
- package/src/api/cyberia-action/cyberia-action.service.js +20 -4
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
- package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
- package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
- package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
- package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
- package/src/api/cyberia-map/cyberia-map.router.js +21 -6
- package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
- package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
- package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
- package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
- package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
- package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -122
- package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
- package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
- package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
- package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
- package/src/api/ipfs/ipfs.service.js +28 -15
- package/src/api/object-layer/object-layer.router.js +25 -15
- package/src/api/object-layer/object-layer.service.js +15 -20
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
- package/src/cli/baremetal.js +717 -16
- package/src/cli/cluster.js +80 -5
- package/src/cli/deploy.js +326 -292
- package/src/cli/docker-compose.js +648 -0
- package/src/cli/env.js +12 -6
- package/src/cli/fs.js +75 -30
- package/src/cli/image.js +187 -55
- package/src/cli/index.js +157 -6
- package/src/cli/kickstart.js +142 -20
- package/src/cli/monitor.js +387 -6
- package/src/cli/release.js +72 -15
- package/src/cli/repository.js +339 -40
- package/src/cli/run.js +678 -186
- package/src/cli/secrets.js +82 -48
- package/src/cli/ssh.js +234 -0
- package/src/cli/static.js +2 -2
- package/src/client/components/core/PanelForm.js +44 -44
- package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
- package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
- package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
- package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +92 -20
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +272 -50
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
- package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
- package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +28 -12
- package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +27 -5
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
- package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
- package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
- package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
- package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
- package/src/client/services/object-layer/object-layer.management.js +6 -6
- package/src/{server → client-builder}/client-build-docs.js +15 -5
- package/src/{server → client-builder}/client-build-live.js +3 -3
- package/src/{server → client-builder}/client-build.js +25 -22
- package/src/{server → client-builder}/client-dev-server.js +3 -3
- package/src/{server → client-builder}/client-icons.js +2 -2
- package/src/{server → client-builder}/ssr.js +5 -5
- package/src/client.build.js +1 -3
- package/src/client.dev.js +1 -1
- package/src/db/mongo/MongoBootstrap.js +12 -12
- package/src/db/mongo/MongooseDB.js +2 -1
- package/src/grpc/cyberia/grpc-server.js +255 -70
- package/src/index.js +12 -1
- package/src/mailer/EmailRender.js +1 -1
- package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
- package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
- package/src/projects/cyberia/catalog-cyberia.js +81 -0
- package/src/projects/cyberia/gemini-client.js +175 -0
- package/src/projects/cyberia/generate-saga.js +2107 -0
- package/src/{server → projects/cyberia}/ipfs-client.js +6 -4
- package/src/{server → projects/cyberia}/object-layer.js +12 -108
- package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
- package/src/{server → projects/cyberia}/shape-generator.js +2 -2
- package/src/projects/underpost/catalog-underpost.js +60 -0
- package/src/runtime/cyberia-client/Dockerfile +31 -83
- package/src/runtime/cyberia-client/Dockerfile.dev +23 -30
- package/src/runtime/cyberia-server/Dockerfile +23 -42
- package/src/runtime/cyberia-server/Dockerfile.dev +20 -35
- package/src/runtime/engine-cyberia/Dockerfile +143 -0
- package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
- package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
- package/src/runtime/engine-cyberia/compose.env +131 -0
- package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
- package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
- package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
- package/src/runtime/engine-cyberia/nginx.conf +87 -0
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/nginx/Nginx.js +250 -0
- package/src/runtime/wp/Dockerfile +3 -3
- package/src/server/catalog.js +72 -0
- package/src/server/conf.js +415 -60
- package/src/server/runtime-status.js +252 -0
- package/src/server/start.js +42 -11
- package/src/server.js +6 -2
- package/test/cyberia-instance-conf-defaults.test.js +140 -0
- package/test/deploy-monitor.test.js +267 -0
- package/test/shape-generator.test.js +7 -1
- package/typedoc.dd-cyberia.json +3 -1
- package/typedoc.json +3 -1
- package/manifests/deployment/dd-test-development/deployment.yaml +0 -256
- package/manifests/deployment/dd-test-development/proxy.yaml +0 -102
- /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
- /package/src/{server → client-builder}/client-formatted.js +0 -0
package/src/cli/index.js
CHANGED
|
@@ -70,6 +70,10 @@ program
|
|
|
70
70
|
'--pull-bundle',
|
|
71
71
|
'Downloads the pre-built client bundle from Cloudinary via pull-bundle before starting. Use together with --skip-full-build to skip the local build entirely.',
|
|
72
72
|
)
|
|
73
|
+
.option(
|
|
74
|
+
'--private-test-repo',
|
|
75
|
+
'During --build, clone the private test source repo (engine-test-<id>) instead of the production engine-<id> repo.',
|
|
76
|
+
)
|
|
73
77
|
.action(Underpost.start.callback)
|
|
74
78
|
.description('Initiates application servers, build pipelines, or other defined services based on the deployment ID.');
|
|
75
79
|
|
|
@@ -106,16 +110,18 @@ program
|
|
|
106
110
|
.option('--cached', 'Commit staged changes only or context.')
|
|
107
111
|
.option('--hashes <hashes>', 'Comma-separated list of specific file hashes of commits.')
|
|
108
112
|
.option('--extension <extension>', 'specific file extensions of commits.')
|
|
109
|
-
.option(
|
|
110
|
-
'--changelog [latest-n]',
|
|
111
|
-
'Print plain the changelog of the specified number of latest n commits, if no number is provided it will get the changelog to latest ci integration',
|
|
112
|
-
)
|
|
113
|
+
.option('--changelog', 'Print the plain changelog of the last N commits (see --from-n-commit, default 1).')
|
|
113
114
|
.option('--changelog-build', 'Builds a CHANGELOG.md file based on the commit history')
|
|
114
115
|
.option('--changelog-min-version <version>', 'Sets the minimum version limit for --changelog-build (default: 2.85.0)')
|
|
115
116
|
.option(
|
|
116
117
|
'--changelog-no-hash',
|
|
117
118
|
'Excludes commit hashes from the generated changelog entries (used with --changelog-build).',
|
|
118
119
|
)
|
|
120
|
+
.option(
|
|
121
|
+
'--changelog-msg',
|
|
122
|
+
'Print the sanitized, commit-ready changelog message of the last N commits (see --from-n-commit, default 1). Empty when there are no tagged entries.',
|
|
123
|
+
)
|
|
124
|
+
.option('--from-n-commit <n>', 'Number of latest commits to include in --changelog/--changelog-msg (default: 1).')
|
|
119
125
|
.option('--unpush', 'With --log, automatically sets range to unpushed commits ahead of remote.')
|
|
120
126
|
.option('-b', 'Shows the current Git branch name.')
|
|
121
127
|
.option('-p [branch]', 'Shows the reflog for the specified branch.')
|
|
@@ -124,6 +130,16 @@ program
|
|
|
124
130
|
'--is-remote-repo <url-repo>',
|
|
125
131
|
'Checks whether a remote Git repository URL is reachable. Prints true or false.',
|
|
126
132
|
)
|
|
133
|
+
.option(
|
|
134
|
+
'--has-changes',
|
|
135
|
+
'Prints "1" if there are staged or unstaged git changes in the repository, empty string otherwise.',
|
|
136
|
+
)
|
|
137
|
+
.option('--remote-url', 'Prints the current git remote URL (origin) in plain text.')
|
|
138
|
+
.option(
|
|
139
|
+
'--switch-repo <url>',
|
|
140
|
+
'Switches the git remote (origin) to <url> and force-pulls the target branch, overwriting the current working tree (discards local commits and tracked changes). Accepts a full URL or "owner/repo".',
|
|
141
|
+
)
|
|
142
|
+
.option('--target-branch <branch>', 'Target branch for --switch-repo (default: master).')
|
|
127
143
|
.description('Manages commits to a GitHub repository, supporting various commit types and options.')
|
|
128
144
|
.action(Underpost.repo.commit);
|
|
129
145
|
|
|
@@ -315,7 +331,17 @@ program
|
|
|
315
331
|
.option('--expose', 'Exposes services matching the provided deployment ID list.')
|
|
316
332
|
.option('--cert', 'Resets TLS/SSL certificate secrets for deployments.')
|
|
317
333
|
.option('--cert-hosts <hosts>', 'Resets TLS/SSL certificate secrets for specified hosts.')
|
|
334
|
+
.option(
|
|
335
|
+
'--self-signed',
|
|
336
|
+
'Use a pre-created self-signed TLS secret (kubernetes.io/tls) instead of cert-manager. ' +
|
|
337
|
+
'The secret must already exist in the namespace with the same name as the host. ' +
|
|
338
|
+
'Enables TLS in the Contour HTTPProxy virtualhost without requiring a production ClusterIssuer.',
|
|
339
|
+
)
|
|
318
340
|
.option('--node <node>', 'Sets optional node for deployment operations.')
|
|
341
|
+
.option(
|
|
342
|
+
'--ssh-key-path <path>',
|
|
343
|
+
'Private key path for node SSH operations. Currently used when shipping a hostPath volume to a remote target node over SSH. Defaults to engine-private/deploy/id_rsa.',
|
|
344
|
+
)
|
|
319
345
|
.option(
|
|
320
346
|
'--build-manifest',
|
|
321
347
|
'Builds Kubernetes YAML manifests, including deployments, services, proxies, and secrets.',
|
|
@@ -332,6 +358,8 @@ program
|
|
|
332
358
|
.option('--retry-count <count>', 'Sets HTTPProxy per-route retry count (e.g., 3).')
|
|
333
359
|
.option('--retry-per-try-timeout <duration>', 'Sets HTTPProxy retry per-try timeout (e.g., "150ms").')
|
|
334
360
|
.option('--disable-update-deployment', 'Disables updates to deployments.')
|
|
361
|
+
.option('--disable-runtime-probes', 'Omits the internal-status HTTP probes from generated deployment manifests.')
|
|
362
|
+
.option('--tcp-probes', 'Generates legacy TCP socket probes instead of HTTP internal-status probes (migration).')
|
|
335
363
|
.option('--disable-update-proxy', 'Disables updates to proxies.')
|
|
336
364
|
.option('--disable-deployment-proxy', 'Disables proxies of deployments.')
|
|
337
365
|
.option('--disable-update-volume', 'Disables updates to volume mounts during deployment.')
|
|
@@ -351,6 +379,14 @@ program
|
|
|
351
379
|
'--expose-port <port>',
|
|
352
380
|
'Sets the local:remote port to expose when --expose is active (overrides auto-detected service port).',
|
|
353
381
|
)
|
|
382
|
+
.option(
|
|
383
|
+
'--expose-local-port <port>',
|
|
384
|
+
'Sets a different local port for --expose (e.g. 80) while keeping the remote service port. Useful for /etc/hosts local access without specifying a port in the browser.',
|
|
385
|
+
)
|
|
386
|
+
.option(
|
|
387
|
+
'--local-proxy',
|
|
388
|
+
'Forward all service TCP ports locally and start the Node.js path-routing proxy. Enables full path-based routing (e.g. /wp alongside /) without needing --expose-local-port. Requires --expose.',
|
|
389
|
+
)
|
|
354
390
|
.option('--cmd <cmd>', 'Custom initialization command for deployment (comma-separated commands).')
|
|
355
391
|
.option(
|
|
356
392
|
'--skip-full-build',
|
|
@@ -364,6 +400,12 @@ program
|
|
|
364
400
|
'--image-pull-policy <policy>',
|
|
365
401
|
'Override container imagePullPolicy in the generated deployment manifest (Always, IfNotPresent, Never). Defaults to Never for localhost/ images and IfNotPresent otherwise.',
|
|
366
402
|
)
|
|
403
|
+
.option(
|
|
404
|
+
'--tls',
|
|
405
|
+
'Enables TLS for the local proxy started by --expose --local-proxy. ' +
|
|
406
|
+
'The proxy will serve HTTPS on port 443 using self-signed certificates resolved from the local SSL store. ' +
|
|
407
|
+
'Use together with --expose and --local-proxy.',
|
|
408
|
+
)
|
|
367
409
|
.description('Manages application deployments, defaulting to deploying development pods.')
|
|
368
410
|
.action(Underpost.deploy.callback);
|
|
369
411
|
|
|
@@ -394,25 +436,31 @@ program
|
|
|
394
436
|
.option('--rm <image-id>', 'Removes specified Underpost Dockerfile images.')
|
|
395
437
|
.option('--path [path]', 'The path to the Dockerfile directory.')
|
|
396
438
|
.option('--image-name [image-name]', 'Sets a custom name for the Docker image.')
|
|
397
|
-
.option('--image-path [image-path]', 'Sets the output path for the tar image archive.')
|
|
439
|
+
.option('--image-out-path [image-out-path]', 'Sets the output path for the tar image archive.')
|
|
398
440
|
.option('--dockerfile-name [dockerfile-name]', 'Sets a custom name for the Dockerfile.')
|
|
399
441
|
.option('--podman-save', 'Exports the built image as a tar file using Podman.')
|
|
400
|
-
.option('--pull-base', 'Pulls base
|
|
442
|
+
.option('--pull-base', 'Pulls the base image prerequisites (rockylinux:9) on the host; combine with --build.')
|
|
401
443
|
.option('--spec', 'Get current cached list of container images used by all pods')
|
|
402
444
|
.option('--namespace <namespace>', 'Kubernetes namespace for image operations (defaults to "default").')
|
|
403
445
|
.option('--kind', 'Set kind cluster env image context management.')
|
|
404
446
|
.option('--kubeadm', 'Set kubeadm cluster env image context management.')
|
|
405
447
|
.option('--k3s', 'Set k3s cluster env image context management.')
|
|
448
|
+
.option('--docker-compose', 'Load the built image tar into the local Docker store for Docker Compose availability.')
|
|
406
449
|
.option('--node-name', 'Set node name for kubeadm or k3s cluster env image context management.')
|
|
407
450
|
.option('--reset', 'Performs a build without using the cache.')
|
|
408
451
|
.option('--dev', 'Use development mode.')
|
|
409
452
|
.option('--pull-dockerhub <dockerhub-image>', 'Sets a custom Docker Hub image for base image pulls.')
|
|
453
|
+
.option(
|
|
454
|
+
'--import-tar <tar-path>',
|
|
455
|
+
'Load a pre-built image tar archive (e.g. ./image-v1.0.0.tar) into the enabled target(s) without building. Combine with --kind, --kubeadm, --k3s and/or --docker-compose; the archive is loaded into each enabled one.',
|
|
456
|
+
)
|
|
410
457
|
.description('Manages Docker images, including building, saving, and loading into Kubernetes clusters.')
|
|
411
458
|
.action(async (options) => {
|
|
412
459
|
if (options.rm) Underpost.image.rm({ ...options, imageName: options.rm });
|
|
413
460
|
if (options.ls) Underpost.image.list({ ...options, log: true });
|
|
414
461
|
if (options.pullBase) Underpost.image.pullBaseImages(options);
|
|
415
462
|
if (options.build) Underpost.image.build(options);
|
|
463
|
+
if (options.importTar) Underpost.image.importTar(options);
|
|
416
464
|
if (options.pullDockerhub)
|
|
417
465
|
Underpost.image.pullDockerHubImage({ ...options, dockerhubImage: options.pullDockerhub });
|
|
418
466
|
});
|
|
@@ -600,6 +648,10 @@ program
|
|
|
600
648
|
.option('--replicas <replicas>', 'Sets a custom number of replicas for deployment.')
|
|
601
649
|
.option('--pod-name <pod-name>', 'Optional: Specifies the pod name for execution.')
|
|
602
650
|
.option('--node-name <node-name>', 'Optional: Specifies the node name for execution.')
|
|
651
|
+
.option(
|
|
652
|
+
'--ssh-key-path <path>',
|
|
653
|
+
'Optional: Private key path for node SSH operations, forwarded to volume shipping over SSH. Defaults to engine-private/deploy/id_rsa.',
|
|
654
|
+
)
|
|
603
655
|
.option('--port <port>', 'Optional: Specifies the port for execution.')
|
|
604
656
|
.option('--etc-hosts', 'Enables etc-hosts context for the runner execution.')
|
|
605
657
|
.option('--volume-host-path <volume-host-path>', 'Optional: Specifies the volume host path for test execution.')
|
|
@@ -648,6 +700,7 @@ program
|
|
|
648
700
|
.option('--kubeadm', 'Sets the kubeadm cluster context for the runner execution.')
|
|
649
701
|
.option('--k3s', 'Sets the k3s cluster context for the runner execution.')
|
|
650
702
|
.option('--kind', 'Sets the kind cluster context for the runner execution.')
|
|
703
|
+
.option('--traffic <traffic>', 'Blue/green traffic colour to bake into generated manifests (default: blue).')
|
|
651
704
|
.option('--git-clean', 'Runs git clean on volume mount paths before copying.')
|
|
652
705
|
.option('--deploy-id <deploy-id>', 'Sets deploy id context for the runner execution.')
|
|
653
706
|
.option('--user <user>', 'Sets user context for the runner execution.')
|
|
@@ -701,9 +754,50 @@ program
|
|
|
701
754
|
'Explicitly download the pre-built client bundle from Cloudinary inside the container (supported by: sync, template-deploy). Use together with --skip-full-build.',
|
|
702
755
|
)
|
|
703
756
|
.option('--remove', 'Remove/teardown resources')
|
|
757
|
+
.option(
|
|
758
|
+
'--test',
|
|
759
|
+
'Enables test/generic-purpose mode for the runner (e.g. use self-signed TLS instead of cert-manager).',
|
|
760
|
+
)
|
|
704
761
|
.description('Runs specified scripts using various runners.')
|
|
705
762
|
.action(Underpost.run.callback);
|
|
706
763
|
|
|
764
|
+
program
|
|
765
|
+
.command('docker-compose')
|
|
766
|
+
.argument('[target]', 'Optional service name for --logs, --shell, --restart, or --build.')
|
|
767
|
+
.option('--install', 'Install Docker Engine and the Compose v2 plugin on RHEL/Rocky hosts.')
|
|
768
|
+
.option(
|
|
769
|
+
'--reset',
|
|
770
|
+
'Comprehensive teardown (equivalent to cluster --reset): removes all stack containers, the network, named volumes (destroys data), orphans, and generated artifacts.',
|
|
771
|
+
)
|
|
772
|
+
.option('--force', 'Force reinstall (--install), remove volumes (--down), or also drop the env-file (--reset).')
|
|
773
|
+
.option(
|
|
774
|
+
'--deploy-id <deploy-id>',
|
|
775
|
+
"Deployment to run as the app container (default: dd-default). 'dd-default' self-bootstraps a fresh engine; any other id runs the standard 'underpost start' command (mirrors src/cli/deploy.js).",
|
|
776
|
+
)
|
|
777
|
+
.option(
|
|
778
|
+
'--docker-compose-id <docker-compose-id>',
|
|
779
|
+
'Selects a canonical custom-workflow stack at engine-private/conf/<deploy-id>/docker-compose/<docker-compose-id>/ ' +
|
|
780
|
+
'(docker-compose.yml + compose.env + nginx.conf, used as-is; nginx/env generation is skipped). ' +
|
|
781
|
+
'e.g. --deploy-id dd-cyberia --docker-compose-id cyberia for the Cyberia MMO ecosystem.',
|
|
782
|
+
)
|
|
783
|
+
.option('--env <env>', 'Deployment environment for non-default deploy ids (default: development).')
|
|
784
|
+
.option('--generate', 'Render dynamic supporting files (nginx router config, env-file, app-command override).')
|
|
785
|
+
.option('--up', 'Start the full stack detached (regenerates config first).')
|
|
786
|
+
.option('--down', 'Stop and remove containers (and orphans).')
|
|
787
|
+
.option('--volumes', 'With --down, also remove named volumes (destroys persisted data).')
|
|
788
|
+
.option('--restart', 'Restart services (optionally a single [target]).')
|
|
789
|
+
.option('--build', 'With --up rebuild images; alone, rebuilds images with --no-cache.')
|
|
790
|
+
.option('--pull', 'Pull upstream images for all services.')
|
|
791
|
+
.option('--logs', 'Follow logs for all services (optionally a single [target]).')
|
|
792
|
+
.option('--status', 'Show a formatted status table of services.')
|
|
793
|
+
.option('--shell', 'Open an interactive shell in [target] (default: app).')
|
|
794
|
+
.option('--exec <subcommand>', 'General-purpose passthrough docker compose subcommand.')
|
|
795
|
+
.option('--compose-file <path>', 'Path to the compose file (default: docker-compose.yml).')
|
|
796
|
+
.option('--env-file <path>', 'Path to the compose env-file (default: docker/compose.env).')
|
|
797
|
+
.option('--nginx-conf <path>', 'Path to the generated nginx config (default: docker/nginx/default.conf).')
|
|
798
|
+
.description('General-purpose Docker Compose development pipeline (mirrors the Kubernetes dev stack).')
|
|
799
|
+
.action(Underpost.dockerCompose.callback);
|
|
800
|
+
|
|
707
801
|
program
|
|
708
802
|
.command('lxd')
|
|
709
803
|
.argument(
|
|
@@ -822,6 +916,42 @@ program
|
|
|
822
916
|
.option('--remove-machines <system-ids>', 'Removes baremetal machines by comma-separated system IDs, or use "all"')
|
|
823
917
|
.option('--clear-discovered', 'Clears all discovered baremetal machines from the database.')
|
|
824
918
|
.option('--commission', 'Init workflow for commissioning a physical machine.')
|
|
919
|
+
.option(
|
|
920
|
+
'--install-disk [device]',
|
|
921
|
+
'Explicit target install disk for Rocky deployment (e.g. /dev/nvme0n1). Omit or leave empty to auto-detect the internal disk.',
|
|
922
|
+
)
|
|
923
|
+
.option(
|
|
924
|
+
'--no-auto-install',
|
|
925
|
+
'Disables the ephemeral runtime AUTO_INSTALL fallback (controller must trigger install).',
|
|
926
|
+
)
|
|
927
|
+
.option('--no-remote-install', 'Skips the controller-side remote install orchestration over SSH.')
|
|
928
|
+
.option(
|
|
929
|
+
'--worker',
|
|
930
|
+
'Post-install infra role: join the deployed node as a Kubernetes worker (requires --control <ip>). Without this flag the node is set up as a control-plane.',
|
|
931
|
+
)
|
|
932
|
+
.option('--control <ip>', 'Control-plane IP the worker node joins (used with --worker for kubeadm infra setup).')
|
|
933
|
+
.option(
|
|
934
|
+
'--ssh-key-dir <dir>',
|
|
935
|
+
'Directory holding the SSH key pair used for commissioning/orchestration (expects <dir>/id_rsa and <dir>/id_rsa.pub). Overrides the workflow "sshKeyDir"; defaults to engine-private/deploy. Supports a leading ~.',
|
|
936
|
+
)
|
|
937
|
+
.option(
|
|
938
|
+
'--deploy-id <deploy-id>',
|
|
939
|
+
'Deployment ID whose user key pair is used for SSH (key from engine-private/conf/<deploy-id>/users/<user>/id_rsa). Same user↔deployId↔key convention as the ssh command.',
|
|
940
|
+
)
|
|
941
|
+
.option(
|
|
942
|
+
'--user <user>',
|
|
943
|
+
'SSH user paired with --deploy-id for key resolution and the login user on an existing control-plane (defaults to root). Mirrors the ssh command --user.',
|
|
944
|
+
)
|
|
945
|
+
.option(
|
|
946
|
+
'--engine-repo <url>',
|
|
947
|
+
'Custom engine repo cloned + normalized to /home/dd/engine on the node (default: <GITHUB_USERNAME>/engine).',
|
|
948
|
+
)
|
|
949
|
+
.option('--engine-branch <branch>', 'Branch of the engine repo to clone on the node.')
|
|
950
|
+
.option(
|
|
951
|
+
'--engine-private-repo <url>',
|
|
952
|
+
'Custom private repo cloned + normalized to /home/dd/engine/engine-private on the node (default: <GITHUB_USERNAME>/engine-<id>-private).',
|
|
953
|
+
)
|
|
954
|
+
.option('--engine-private-branch <branch>', 'Branch of the engine-private repo to clone on the node.')
|
|
825
955
|
.option(
|
|
826
956
|
'--bootstrap-http-server-run',
|
|
827
957
|
'Runs a temporary bootstrap HTTP server for generic purposes such as serving iPXE scripts or ISO images during commissioning.',
|
|
@@ -862,6 +992,14 @@ program
|
|
|
862
992
|
)
|
|
863
993
|
.option('--dev', 'Sets the development context environment for baremetal operations.')
|
|
864
994
|
.option('--ls', 'Lists available boot resources and machines.')
|
|
995
|
+
.option(
|
|
996
|
+
'--resume-infra-setup',
|
|
997
|
+
'Skip commissioning, OS install, and all bootstrapping; resume only the SSH-based infra setup (kubeadm join/init) on a node that already has the OS installed and is reachable via SSH.',
|
|
998
|
+
)
|
|
999
|
+
.option(
|
|
1000
|
+
'--resume-join',
|
|
1001
|
+
'Skip everything except the kubeadm join command. Assumes engine, Node.js, CRI-O, kubelet, and kubeadm are already installed. Only retrieves a fresh join token from the control-plane and runs kubeadm join.',
|
|
1002
|
+
)
|
|
865
1003
|
.description(
|
|
866
1004
|
'Manages baremetal server operations, including installation, database setup, commissioning, and user management.',
|
|
867
1005
|
)
|
|
@@ -889,6 +1027,19 @@ program
|
|
|
889
1027
|
'--dry-run',
|
|
890
1028
|
'For --build: previews version-bump changes (per-file substitution counts) without writing files or running downstream commands.',
|
|
891
1029
|
)
|
|
1030
|
+
.option(
|
|
1031
|
+
'--mongo-host <host>',
|
|
1032
|
+
'For --build: override DB_HOST in the template .env.example for the smoke test (e.g., "192.168.1.82:27017").',
|
|
1033
|
+
)
|
|
1034
|
+
.option('--mongo-user <user>', 'For --build: override DB_USER in the template .env.example for the smoke test.')
|
|
1035
|
+
.option(
|
|
1036
|
+
'--mongo-password <password>',
|
|
1037
|
+
'For --build: override DB_PASSWORD in the template .env.example for the smoke test.',
|
|
1038
|
+
)
|
|
1039
|
+
.option(
|
|
1040
|
+
'--valkey-host <host>',
|
|
1041
|
+
'For --build: override VALKEY_HOST in the template .env.example for the smoke test (e.g., "192.168.1.82").',
|
|
1042
|
+
)
|
|
892
1043
|
.description('Release orchestrator for building new versions and deploying releases of the Underpost CLI.')
|
|
893
1044
|
.action(async (version, options) => {
|
|
894
1045
|
if (options.build) return Underpost.release.build(version, options);
|
package/src/cli/kickstart.js
CHANGED
|
@@ -43,46 +43,168 @@ class UnderpostKickStart {
|
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* @method kickstartPreVariables
|
|
46
|
-
* @description Generates the variable
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
46
|
+
* @description Generates the shell variable-assignment block injected at the top of the
|
|
47
|
+
* kickstart `%pre` script. These variables drive both the ephemeral commissioning runtime
|
|
48
|
+
* and the unattended disk installer in `scripts/rocky-kickstart.sh`. Passwords are emitted
|
|
49
|
+
* base64-encoded (`*_B64`) and decoded by an in-script `ks_b64d` helper; all other values
|
|
50
|
+
* are single-quote escaped so arbitrary content survives the shell/heredoc layers.
|
|
51
|
+
* @param {object} options - Variable values to bake into the `%pre` block.
|
|
52
|
+
* @param {string} [options.rootPassword=''] - root console password (base64-encoded).
|
|
53
|
+
* @param {string} [options.authorizedKeys=''] - SSH public key(s) installed as authorized_keys.
|
|
54
|
+
* @param {string} [options.adminUsername=''] - Primary (MAAS) admin user (defaults to MAAS_ADMIN_USERNAME).
|
|
55
|
+
* @param {string} [options.adminPassword=''] - Primary admin console password (defaults to rootPassword).
|
|
56
|
+
* @param {string} [options.deployUsername=''] - Optional second (deploy) admin user (e.g. admin).
|
|
57
|
+
* @param {string} [options.deployPassword=''] - Deploy user console password (defaults to rootPassword).
|
|
58
|
+
* @param {string} [options.netIp=''] - Static IPv4 for the deployed OS; empty = DHCP.
|
|
59
|
+
* @param {number} [options.netPrefix=24] - IPv4 prefix length for the static address.
|
|
60
|
+
* @param {string} [options.netGateway=''] - Default gateway for the deployed OS.
|
|
61
|
+
* @param {string} [options.netDns=''] - DNS server for the deployed OS.
|
|
62
|
+
* @param {string} [options.timezone=''] - IANA timezone configured in the deployed OS (e.g. America/Santiago).
|
|
63
|
+
* @param {string} [options.keyboardLayout=''] - Console/X11 keyboard layout for the deployed OS (e.g. es).
|
|
64
|
+
* @param {string} [options.chronyConfPath='/etc/chrony.conf'] - chrony config path written in the deployed OS.
|
|
65
|
+
* @param {string} [options.bootstrapUrl=''] - Base URL of the bootstrap HTTP server for this host (status POSTs).
|
|
66
|
+
* @param {string} [options.workflowId=''] - Workflow identifier reported in status metadata.
|
|
67
|
+
* @param {string} [options.systemId=''] - MAAS system id reported in status metadata (if known).
|
|
68
|
+
* @param {string} [options.targetHostname=''] - Hostname reported in status metadata and set on the deployed OS.
|
|
69
|
+
* @param {number} [options.sshPort=22] - SSH port the ephemeral runtime listens on.
|
|
70
|
+
* @param {string} [options.installDiskHint=''] - Optional explicit target disk (e.g. /dev/nvme0n1); empty = auto-detect.
|
|
71
|
+
* @param {boolean} [options.autoInstall=true] - When true, the ephemeral runtime self-installs after a fallback timeout if no remote trigger arrives.
|
|
51
72
|
* @memberof UnderpostKickStart
|
|
52
|
-
* @returns {string}
|
|
73
|
+
* @returns {string} Newline-joined bash variable assignments.
|
|
53
74
|
*/
|
|
54
|
-
kickstartPreVariables: ({
|
|
75
|
+
kickstartPreVariables: ({
|
|
76
|
+
rootPassword = '',
|
|
77
|
+
authorizedKeys = '',
|
|
78
|
+
adminUsername = '',
|
|
79
|
+
adminPassword = '',
|
|
80
|
+
deployUsername = '',
|
|
81
|
+
deployPassword = '',
|
|
82
|
+
netIp = '',
|
|
83
|
+
netPrefix = 24,
|
|
84
|
+
netGateway = '',
|
|
85
|
+
netDns = '',
|
|
86
|
+
timezone = '',
|
|
87
|
+
keyboardLayout = '',
|
|
88
|
+
chronyConfPath = '/etc/chrony.conf',
|
|
89
|
+
bootstrapUrl = '',
|
|
90
|
+
workflowId = '',
|
|
91
|
+
systemId = '',
|
|
92
|
+
targetHostname = '',
|
|
93
|
+
sshPort = 22,
|
|
94
|
+
installDiskHint = '',
|
|
95
|
+
autoInstall = true,
|
|
96
|
+
}) => {
|
|
55
97
|
const sanitizedKeys = (authorizedKeys || '').trim();
|
|
98
|
+
// Passwords are passed base64-encoded so arbitrary characters (quotes,
|
|
99
|
+
// spaces, $, etc.) survive every shell/heredoc layer intact. base64 output
|
|
100
|
+
// never contains single quotes. Decoding tries `base64` then falls back to
|
|
101
|
+
// python3 so a minimal Anaconda environment can never yield empty passwords.
|
|
102
|
+
const b64 = (v) => Buffer.from(String(v || ''), 'utf8').toString('base64');
|
|
103
|
+
const sq = (v) => `'${String(v || '').replace(/'/g, "'\\''")}'`;
|
|
56
104
|
return [
|
|
57
|
-
`
|
|
58
|
-
`
|
|
59
|
-
`
|
|
105
|
+
`ks_b64d() { printf %s "$1" | base64 -d 2>/dev/null || printf %s "$1" | python3 -c 'import sys,base64;sys.stdout.buffer.write(base64.b64decode(sys.stdin.read().strip()))' 2>/dev/null; }`,
|
|
106
|
+
`ROOT_PASS_B64='${b64(rootPassword)}'`,
|
|
107
|
+
`ADMIN_PASS_B64='${b64(adminPassword || rootPassword)}'`,
|
|
108
|
+
`DEPLOY_PASS_B64='${b64(deployPassword)}'`,
|
|
109
|
+
`ROOT_PASS="$(ks_b64d "$ROOT_PASS_B64")"`,
|
|
110
|
+
`ADMIN_PASS="$(ks_b64d "$ADMIN_PASS_B64")"`,
|
|
111
|
+
`DEPLOY_PASS="$(ks_b64d "$DEPLOY_PASS_B64")"`,
|
|
112
|
+
`AUTHORIZED_KEYS=${sq(sanitizedKeys)}`,
|
|
113
|
+
`ADMIN_USER=${sq(adminUsername || process.env.MAAS_ADMIN_USERNAME || 'maas')}`,
|
|
114
|
+
`DEPLOY_USER=${sq(deployUsername)}`,
|
|
115
|
+
`NET_IP=${sq(netIp)}`,
|
|
116
|
+
`NET_PREFIX='${parseInt(netPrefix, 10) || 24}'`,
|
|
117
|
+
`NET_GATEWAY=${sq(netGateway)}`,
|
|
118
|
+
`NET_DNS=${sq(netDns)}`,
|
|
119
|
+
`TIMEZONE=${sq(timezone)}`,
|
|
120
|
+
`KEYBOARD_LAYOUT=${sq(keyboardLayout)}`,
|
|
121
|
+
`CHRONY_CONF_PATH=${sq(chronyConfPath || '/etc/chrony.conf')}`,
|
|
122
|
+
`BOOTSTRAP_URL=${sq(bootstrapUrl)}`,
|
|
123
|
+
`WORKFLOW_ID=${sq(workflowId)}`,
|
|
124
|
+
`SYSTEM_ID=${sq(systemId)}`,
|
|
125
|
+
`TARGET_HOSTNAME=${sq(targetHostname)}`,
|
|
126
|
+
`SSH_PORT='${sshPort || 22}'`,
|
|
127
|
+
`INSTALL_DISK_HINT=${sq(installDiskHint)}`,
|
|
128
|
+
`AUTO_INSTALL='${autoInstall ? '1' : '0'}'`,
|
|
60
129
|
].join('\n');
|
|
61
130
|
},
|
|
62
131
|
|
|
63
132
|
/**
|
|
64
133
|
* @method kickstartFactory
|
|
65
134
|
* @description Generates a complete kickstart configuration by combining the header,
|
|
66
|
-
* variable
|
|
67
|
-
* @param {object} options
|
|
68
|
-
* @param {string} [options.lang='en_US.UTF-8']
|
|
69
|
-
* @param {string} [options.keyboard='us']
|
|
70
|
-
* @param {string} [options.timezone='America/New_York']
|
|
71
|
-
* @param {string} [options.
|
|
72
|
-
* @param {string} [options.
|
|
135
|
+
* the `%pre` variable-assignment block, and the `scripts/rocky-kickstart.sh` body.
|
|
136
|
+
* @param {object} options - Kickstart generation options.
|
|
137
|
+
* @param {string} [options.lang='en_US.UTF-8'] - System language for the ephemeral runtime.
|
|
138
|
+
* @param {string} [options.keyboard='us'] - Keyboard layout for the ephemeral runtime AND the deployed OS.
|
|
139
|
+
* @param {string} [options.timezone='America/New_York'] - Timezone for the ephemeral runtime AND the deployed OS.
|
|
140
|
+
* @param {string} [options.chronyConfPath='/etc/chrony.conf'] - chrony config path written in the deployed OS.
|
|
141
|
+
* @param {string} [options.rootPassword=process.env.MAAS_ADMIN_PASS] - root console password.
|
|
142
|
+
* @param {string} [options.adminUsername=''] - Primary (MAAS) admin user created in the deployed OS.
|
|
143
|
+
* @param {string} [options.adminPassword=''] - Primary admin console password (defaults to rootPassword).
|
|
144
|
+
* @param {string} [options.deployUsername=''] - Optional second (deploy) admin user (e.g. admin).
|
|
145
|
+
* @param {string} [options.deployPassword=''] - Deploy user console password (defaults to rootPassword).
|
|
146
|
+
* @param {string} [options.netIp=''] - Static IPv4 for the deployed OS; empty = DHCP.
|
|
147
|
+
* @param {number} [options.netPrefix=24] - IPv4 prefix length for the static address.
|
|
148
|
+
* @param {string} [options.netGateway=''] - Default gateway for the deployed OS.
|
|
149
|
+
* @param {string} [options.netDns=''] - DNS server for the deployed OS.
|
|
150
|
+
* @param {string} [options.authorizedKeys=''] - SSH public key(s) installed as authorized_keys.
|
|
151
|
+
* @param {string} [options.bootstrapUrl=''] - Base URL of the bootstrap HTTP server (status POSTs).
|
|
152
|
+
* @param {string} [options.workflowId=''] - Workflow identifier reported in status metadata.
|
|
153
|
+
* @param {string} [options.systemId=''] - MAAS system id reported in status metadata (if known).
|
|
154
|
+
* @param {string} [options.targetHostname=''] - Hostname reported in status metadata and set on the deployed OS.
|
|
155
|
+
* @param {number} [options.sshPort=22] - SSH port the ephemeral runtime listens on.
|
|
156
|
+
* @param {string} [options.installDiskHint=''] - Optional explicit target disk; empty = auto-detect.
|
|
157
|
+
* @param {boolean} [options.autoInstall=true] - When true, the runtime self-installs after a fallback timeout.
|
|
73
158
|
* @memberof UnderpostKickStart
|
|
74
|
-
* @returns {string}
|
|
159
|
+
* @returns {string} The full kickstart (ks.cfg) source.
|
|
75
160
|
*/
|
|
76
161
|
kickstartFactory: ({
|
|
77
162
|
lang = 'en_US.UTF-8',
|
|
78
163
|
keyboard = 'us',
|
|
79
164
|
timezone = 'America/New_York',
|
|
165
|
+
chronyConfPath = '/etc/chrony.conf',
|
|
80
166
|
rootPassword = process.env.MAAS_ADMIN_PASS,
|
|
167
|
+
adminUsername = '',
|
|
168
|
+
adminPassword = '',
|
|
169
|
+
deployUsername = '',
|
|
170
|
+
deployPassword = '',
|
|
171
|
+
netIp = '',
|
|
172
|
+
netPrefix = 24,
|
|
173
|
+
netGateway = '',
|
|
174
|
+
netDns = '',
|
|
81
175
|
authorizedKeys = '',
|
|
176
|
+
bootstrapUrl = '',
|
|
177
|
+
workflowId = '',
|
|
178
|
+
systemId = '',
|
|
179
|
+
targetHostname = '',
|
|
180
|
+
sshPort = 22,
|
|
181
|
+
installDiskHint = '',
|
|
182
|
+
autoInstall = true,
|
|
82
183
|
}) => {
|
|
83
|
-
const
|
|
184
|
+
const resolvedAdminUsername = adminUsername || process.env.MAAS_ADMIN_USERNAME || 'maas';
|
|
84
185
|
const header = UnderpostKickStart.API.kickstartHeader({ lang, keyboard, timezone, rootPassword });
|
|
85
|
-
const variables = UnderpostKickStart.API.kickstartPreVariables({
|
|
186
|
+
const variables = UnderpostKickStart.API.kickstartPreVariables({
|
|
187
|
+
rootPassword,
|
|
188
|
+
authorizedKeys,
|
|
189
|
+
adminUsername: resolvedAdminUsername,
|
|
190
|
+
adminPassword,
|
|
191
|
+
deployUsername,
|
|
192
|
+
deployPassword,
|
|
193
|
+
netIp,
|
|
194
|
+
netPrefix,
|
|
195
|
+
netGateway,
|
|
196
|
+
netDns,
|
|
197
|
+
timezone,
|
|
198
|
+
keyboardLayout: keyboard,
|
|
199
|
+
chronyConfPath,
|
|
200
|
+
bootstrapUrl,
|
|
201
|
+
workflowId,
|
|
202
|
+
systemId,
|
|
203
|
+
targetHostname,
|
|
204
|
+
sshPort,
|
|
205
|
+
installDiskHint,
|
|
206
|
+
autoInstall,
|
|
207
|
+
});
|
|
86
208
|
|
|
87
209
|
const scriptPath = path.resolve(__dirname, '../../scripts/rocky-kickstart.sh');
|
|
88
210
|
const scriptBody = fs.readFileSync(scriptPath, 'utf8');
|