@cicore/cli 1.0.0
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/bin/ci.js +13 -0
- package/dist/commands/addon/api-actions.d.ts +45 -0
- package/dist/commands/addon/api-actions.d.ts.map +1 -0
- package/dist/commands/addon/api-actions.js +281 -0
- package/dist/commands/addon/api-actions.js.map +1 -0
- package/dist/commands/addon/build.d.ts +11 -0
- package/dist/commands/addon/build.d.ts.map +1 -0
- package/dist/commands/addon/build.js +182 -0
- package/dist/commands/addon/build.js.map +1 -0
- package/dist/commands/addon/create.d.ts +11 -0
- package/dist/commands/addon/create.d.ts.map +1 -0
- package/dist/commands/addon/create.js +1186 -0
- package/dist/commands/addon/create.js.map +1 -0
- package/dist/commands/addon/delete.d.ts +13 -0
- package/dist/commands/addon/delete.d.ts.map +1 -0
- package/dist/commands/addon/delete.js +83 -0
- package/dist/commands/addon/delete.js.map +1 -0
- package/dist/commands/addon/deploy.d.ts +27 -0
- package/dist/commands/addon/deploy.d.ts.map +1 -0
- package/dist/commands/addon/deploy.js +459 -0
- package/dist/commands/addon/deploy.js.map +1 -0
- package/dist/commands/addon/dev-deploy.d.ts +31 -0
- package/dist/commands/addon/dev-deploy.d.ts.map +1 -0
- package/dist/commands/addon/dev-deploy.js +128 -0
- package/dist/commands/addon/dev-deploy.js.map +1 -0
- package/dist/commands/addon/dev.d.ts +36 -0
- package/dist/commands/addon/dev.d.ts.map +1 -0
- package/dist/commands/addon/dev.js +323 -0
- package/dist/commands/addon/dev.js.map +1 -0
- package/dist/commands/addon/extract-classes.d.ts +23 -0
- package/dist/commands/addon/extract-classes.d.ts.map +1 -0
- package/dist/commands/addon/extract-classes.js +281 -0
- package/dist/commands/addon/extract-classes.js.map +1 -0
- package/dist/commands/addon/generate-safelist.d.ts +24 -0
- package/dist/commands/addon/generate-safelist.d.ts.map +1 -0
- package/dist/commands/addon/generate-safelist.js +276 -0
- package/dist/commands/addon/generate-safelist.js.map +1 -0
- package/dist/commands/addon/index.d.ts +19 -0
- package/dist/commands/addon/index.d.ts.map +1 -0
- package/dist/commands/addon/index.js +296 -0
- package/dist/commands/addon/index.js.map +1 -0
- package/dist/commands/addon/init-repo.d.ts +25 -0
- package/dist/commands/addon/init-repo.d.ts.map +1 -0
- package/dist/commands/addon/init-repo.js +171 -0
- package/dist/commands/addon/init-repo.js.map +1 -0
- package/dist/commands/addon/install.d.ts +23 -0
- package/dist/commands/addon/install.d.ts.map +1 -0
- package/dist/commands/addon/install.js +84 -0
- package/dist/commands/addon/install.js.map +1 -0
- package/dist/commands/addon/list.d.ts +10 -0
- package/dist/commands/addon/list.d.ts.map +1 -0
- package/dist/commands/addon/list.js +102 -0
- package/dist/commands/addon/list.js.map +1 -0
- package/dist/commands/addon/manifest-refresh.d.ts +17 -0
- package/dist/commands/addon/manifest-refresh.d.ts.map +1 -0
- package/dist/commands/addon/manifest-refresh.js +48 -0
- package/dist/commands/addon/manifest-refresh.js.map +1 -0
- package/dist/commands/addon/migrate.d.ts +40 -0
- package/dist/commands/addon/migrate.d.ts.map +1 -0
- package/dist/commands/addon/migrate.js +236 -0
- package/dist/commands/addon/migrate.js.map +1 -0
- package/dist/commands/addon/publish.d.ts +33 -0
- package/dist/commands/addon/publish.d.ts.map +1 -0
- package/dist/commands/addon/publish.js +236 -0
- package/dist/commands/addon/publish.js.map +1 -0
- package/dist/commands/addon/scaffold-quality.d.ts +21 -0
- package/dist/commands/addon/scaffold-quality.d.ts.map +1 -0
- package/dist/commands/addon/scaffold-quality.js +90 -0
- package/dist/commands/addon/scaffold-quality.js.map +1 -0
- package/dist/commands/addon/sign.d.ts +9 -0
- package/dist/commands/addon/sign.d.ts.map +1 -0
- package/dist/commands/addon/sign.js +83 -0
- package/dist/commands/addon/sign.js.map +1 -0
- package/dist/commands/addon/toggle.d.ts +6 -0
- package/dist/commands/addon/toggle.d.ts.map +1 -0
- package/dist/commands/addon/toggle.js +46 -0
- package/dist/commands/addon/toggle.js.map +1 -0
- package/dist/commands/agent/index.d.ts +34 -0
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/index.js +564 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/brand/index.d.ts +54 -0
- package/dist/commands/brand/index.d.ts.map +1 -0
- package/dist/commands/brand/index.js +367 -0
- package/dist/commands/brand/index.js.map +1 -0
- package/dist/commands/build/index.d.ts +53 -0
- package/dist/commands/build/index.d.ts.map +1 -0
- package/dist/commands/build/index.js +726 -0
- package/dist/commands/build/index.js.map +1 -0
- package/dist/commands/cache/flush-local.d.ts +31 -0
- package/dist/commands/cache/flush-local.d.ts.map +1 -0
- package/dist/commands/cache/flush-local.js +161 -0
- package/dist/commands/cache/flush-local.js.map +1 -0
- package/dist/commands/cache/index.d.ts +14 -0
- package/dist/commands/cache/index.d.ts.map +1 -0
- package/dist/commands/cache/index.js +453 -0
- package/dist/commands/cache/index.js.map +1 -0
- package/dist/commands/check/index.d.ts +8 -0
- package/dist/commands/check/index.d.ts.map +1 -0
- package/dist/commands/check/index.js +1316 -0
- package/dist/commands/check/index.js.map +1 -0
- package/dist/commands/cloudflare/index.d.ts +8 -0
- package/dist/commands/cloudflare/index.d.ts.map +1 -0
- package/dist/commands/cloudflare/index.js +453 -0
- package/dist/commands/cloudflare/index.js.map +1 -0
- package/dist/commands/core/create.d.ts +12 -0
- package/dist/commands/core/create.d.ts.map +1 -0
- package/dist/commands/core/create.js +206 -0
- package/dist/commands/core/create.js.map +1 -0
- package/dist/commands/core/delete.d.ts +11 -0
- package/dist/commands/core/delete.d.ts.map +1 -0
- package/dist/commands/core/delete.js +64 -0
- package/dist/commands/core/delete.js.map +1 -0
- package/dist/commands/core/env.d.ts +12 -0
- package/dist/commands/core/env.d.ts.map +1 -0
- package/dist/commands/core/env.js +95 -0
- package/dist/commands/core/env.js.map +1 -0
- package/dist/commands/core/health.d.ts +6 -0
- package/dist/commands/core/health.d.ts.map +1 -0
- package/dist/commands/core/health.js +215 -0
- package/dist/commands/core/health.js.map +1 -0
- package/dist/commands/core/index.d.ts +15 -0
- package/dist/commands/core/index.d.ts.map +1 -0
- package/dist/commands/core/index.js +86 -0
- package/dist/commands/core/index.js.map +1 -0
- package/dist/commands/core/list.d.ts +11 -0
- package/dist/commands/core/list.d.ts.map +1 -0
- package/dist/commands/core/list.js +58 -0
- package/dist/commands/core/list.js.map +1 -0
- package/dist/commands/core/rebuild.d.ts +13 -0
- package/dist/commands/core/rebuild.d.ts.map +1 -0
- package/dist/commands/core/rebuild.js +119 -0
- package/dist/commands/core/rebuild.js.map +1 -0
- package/dist/commands/db/index.d.ts +23 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +355 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/db/promote-silo.d.ts +320 -0
- package/dist/commands/db/promote-silo.d.ts.map +1 -0
- package/dist/commands/db/promote-silo.js +930 -0
- package/dist/commands/db/promote-silo.js.map +1 -0
- package/dist/commands/db/relocate.d.ts +41 -0
- package/dist/commands/db/relocate.d.ts.map +1 -0
- package/dist/commands/db/relocate.js +482 -0
- package/dist/commands/db/relocate.js.map +1 -0
- package/dist/commands/db/rollback-silo.d.ts +44 -0
- package/dist/commands/db/rollback-silo.d.ts.map +1 -0
- package/dist/commands/db/rollback-silo.js +402 -0
- package/dist/commands/db/rollback-silo.js.map +1 -0
- package/dist/commands/deploy/index.d.ts +26 -0
- package/dist/commands/deploy/index.d.ts.map +1 -0
- package/dist/commands/deploy/index.js +107 -0
- package/dist/commands/deploy/index.js.map +1 -0
- package/dist/commands/devops/index.d.ts +6 -0
- package/dist/commands/devops/index.d.ts.map +1 -0
- package/dist/commands/devops/index.js +220 -0
- package/dist/commands/devops/index.js.map +1 -0
- package/dist/commands/domain/index.d.ts +8 -0
- package/dist/commands/domain/index.d.ts.map +1 -0
- package/dist/commands/domain/index.js +386 -0
- package/dist/commands/domain/index.js.map +1 -0
- package/dist/commands/image/index.d.ts +8 -0
- package/dist/commands/image/index.d.ts.map +1 -0
- package/dist/commands/image/index.js +308 -0
- package/dist/commands/image/index.js.map +1 -0
- package/dist/commands/install/factory-reset.d.ts +21 -0
- package/dist/commands/install/factory-reset.d.ts.map +1 -0
- package/dist/commands/install/factory-reset.js +83 -0
- package/dist/commands/install/factory-reset.js.map +1 -0
- package/dist/commands/install/index.d.ts +17 -0
- package/dist/commands/install/index.d.ts.map +1 -0
- package/dist/commands/install/index.js +44 -0
- package/dist/commands/install/index.js.map +1 -0
- package/dist/commands/install/install.d.ts +35 -0
- package/dist/commands/install/install.d.ts.map +1 -0
- package/dist/commands/install/install.js +171 -0
- package/dist/commands/install/install.js.map +1 -0
- package/dist/commands/login/index.d.ts +15 -0
- package/dist/commands/login/index.d.ts.map +1 -0
- package/dist/commands/login/index.js +58 -0
- package/dist/commands/login/index.js.map +1 -0
- package/dist/commands/nginx/index.d.ts +11 -0
- package/dist/commands/nginx/index.d.ts.map +1 -0
- package/dist/commands/nginx/index.js +580 -0
- package/dist/commands/nginx/index.js.map +1 -0
- package/dist/commands/server/bootstrap.d.ts +25 -0
- package/dist/commands/server/bootstrap.d.ts.map +1 -0
- package/dist/commands/server/bootstrap.js +260 -0
- package/dist/commands/server/bootstrap.js.map +1 -0
- package/dist/commands/server/index.d.ts +8 -0
- package/dist/commands/server/index.d.ts.map +1 -0
- package/dist/commands/server/index.js +2524 -0
- package/dist/commands/server/index.js.map +1 -0
- package/dist/commands/setup/index.d.ts +34 -0
- package/dist/commands/setup/index.d.ts.map +1 -0
- package/dist/commands/setup/index.js +423 -0
- package/dist/commands/setup/index.js.map +1 -0
- package/dist/commands/ssl/index.d.ts +8 -0
- package/dist/commands/ssl/index.d.ts.map +1 -0
- package/dist/commands/ssl/index.js +275 -0
- package/dist/commands/ssl/index.js.map +1 -0
- package/dist/commands/superadmin/index.d.ts +16 -0
- package/dist/commands/superadmin/index.d.ts.map +1 -0
- package/dist/commands/superadmin/index.js +81 -0
- package/dist/commands/superadmin/index.js.map +1 -0
- package/dist/commands/tenant/index.d.ts +6 -0
- package/dist/commands/tenant/index.d.ts.map +1 -0
- package/dist/commands/tenant/index.js +192 -0
- package/dist/commands/tenant/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/addon-sign.d.ts +23 -0
- package/dist/lib/addon-sign.d.ts.map +1 -0
- package/dist/lib/addon-sign.js +39 -0
- package/dist/lib/addon-sign.js.map +1 -0
- package/dist/lib/addon-sign.test.d.ts +2 -0
- package/dist/lib/addon-sign.test.d.ts.map +1 -0
- package/dist/lib/addon-sign.test.js +27 -0
- package/dist/lib/addon-sign.test.js.map +1 -0
- package/dist/lib/cdn.d.ts +25 -0
- package/dist/lib/cdn.d.ts.map +1 -0
- package/dist/lib/cdn.js +131 -0
- package/dist/lib/cdn.js.map +1 -0
- package/dist/lib/cloudflare.d.ts +133 -0
- package/dist/lib/cloudflare.d.ts.map +1 -0
- package/dist/lib/cloudflare.js +435 -0
- package/dist/lib/cloudflare.js.map +1 -0
- package/dist/lib/config.d.ts +96 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +132 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/env.d.ts +8 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +64 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/hosts.d.ts +194 -0
- package/dist/lib/hosts.d.ts.map +1 -0
- package/dist/lib/hosts.js +183 -0
- package/dist/lib/hosts.js.map +1 -0
- package/dist/lib/logger.d.ts +68 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +130 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/nginx-config.d.ts +78 -0
- package/dist/lib/nginx-config.d.ts.map +1 -0
- package/dist/lib/nginx-config.js +736 -0
- package/dist/lib/nginx-config.js.map +1 -0
- package/dist/lib/ops/addon-dev.d.ts +93 -0
- package/dist/lib/ops/addon-dev.d.ts.map +1 -0
- package/dist/lib/ops/addon-dev.js +237 -0
- package/dist/lib/ops/addon-dev.js.map +1 -0
- package/dist/lib/ops/addon-quality.d.ts +38 -0
- package/dist/lib/ops/addon-quality.d.ts.map +1 -0
- package/dist/lib/ops/addon-quality.js +338 -0
- package/dist/lib/ops/addon-quality.js.map +1 -0
- package/dist/lib/ops/addon-routes.d.ts +49 -0
- package/dist/lib/ops/addon-routes.d.ts.map +1 -0
- package/dist/lib/ops/addon-routes.js +189 -0
- package/dist/lib/ops/addon-routes.js.map +1 -0
- package/dist/lib/ops/addon.d.ts +120 -0
- package/dist/lib/ops/addon.d.ts.map +1 -0
- package/dist/lib/ops/addon.js +260 -0
- package/dist/lib/ops/addon.js.map +1 -0
- package/dist/lib/ops/cdn.d.ts +87 -0
- package/dist/lib/ops/cdn.d.ts.map +1 -0
- package/dist/lib/ops/cdn.js +170 -0
- package/dist/lib/ops/cdn.js.map +1 -0
- package/dist/lib/ops/cf.d.ts +36 -0
- package/dist/lib/ops/cf.d.ts.map +1 -0
- package/dist/lib/ops/cf.js +114 -0
- package/dist/lib/ops/cf.js.map +1 -0
- package/dist/lib/ops/compose.d.ts +95 -0
- package/dist/lib/ops/compose.d.ts.map +1 -0
- package/dist/lib/ops/compose.js +165 -0
- package/dist/lib/ops/compose.js.map +1 -0
- package/dist/lib/ops/core.d.ts +117 -0
- package/dist/lib/ops/core.d.ts.map +1 -0
- package/dist/lib/ops/core.js +322 -0
- package/dist/lib/ops/core.js.map +1 -0
- package/dist/lib/ops/db.d.ts +116 -0
- package/dist/lib/ops/db.d.ts.map +1 -0
- package/dist/lib/ops/db.js +351 -0
- package/dist/lib/ops/db.js.map +1 -0
- package/dist/lib/ops/dns.d.ts +111 -0
- package/dist/lib/ops/dns.d.ts.map +1 -0
- package/dist/lib/ops/dns.js +306 -0
- package/dist/lib/ops/dns.js.map +1 -0
- package/dist/lib/ops/image.d.ts +94 -0
- package/dist/lib/ops/image.d.ts.map +1 -0
- package/dist/lib/ops/image.js +159 -0
- package/dist/lib/ops/image.js.map +1 -0
- package/dist/lib/ops/nginx.d.ts +114 -0
- package/dist/lib/ops/nginx.d.ts.map +1 -0
- package/dist/lib/ops/nginx.js +388 -0
- package/dist/lib/ops/nginx.js.map +1 -0
- package/dist/lib/ops/redis.d.ts +7 -0
- package/dist/lib/ops/redis.d.ts.map +1 -0
- package/dist/lib/ops/redis.js +35 -0
- package/dist/lib/ops/redis.js.map +1 -0
- package/dist/lib/ops/ssh.d.ts +127 -0
- package/dist/lib/ops/ssh.d.ts.map +1 -0
- package/dist/lib/ops/ssh.js +269 -0
- package/dist/lib/ops/ssh.js.map +1 -0
- package/dist/lib/prompts.d.ts +46 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +113 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/sast.d.ts +43 -0
- package/dist/lib/sast.d.ts.map +1 -0
- package/dist/lib/sast.js +79 -0
- package/dist/lib/sast.js.map +1 -0
- package/dist/lib/sast.test.d.ts +2 -0
- package/dist/lib/sast.test.d.ts.map +1 -0
- package/dist/lib/sast.test.js +33 -0
- package/dist/lib/sast.test.js.map +1 -0
- package/dist/lib/shell.d.ts +61 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +183 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/ssh-config.d.ts +37 -0
- package/dist/lib/ssh-config.d.ts.map +1 -0
- package/dist/lib/ssh-config.js +122 -0
- package/dist/lib/ssh-config.js.map +1 -0
- package/dist/lib/tenant-scope.d.ts +38 -0
- package/dist/lib/tenant-scope.d.ts.map +1 -0
- package/dist/lib/tenant-scope.js +129 -0
- package/dist/lib/tenant-scope.js.map +1 -0
- package/dist/lib/tenant-scope.test.d.ts +2 -0
- package/dist/lib/tenant-scope.test.d.ts.map +1 -0
- package/dist/lib/tenant-scope.test.js +223 -0
- package/dist/lib/tenant-scope.test.js.map +1 -0
- package/package.json +58 -0
- package/templates/bootstrap/.env.template +54 -0
- package/templates/bootstrap/docker-compose.yml +145 -0
- package/templates/vhost.conf.tmpl +446 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ssl/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoD1D"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI - SSL Management Commands
|
|
3
|
+
*
|
|
4
|
+
* Cloudflare Origin Certificate automation
|
|
5
|
+
*/
|
|
6
|
+
import { log, spinner, formatTable } from '../../lib/logger.js';
|
|
7
|
+
import { exec } from '../../lib/shell.js';
|
|
8
|
+
import { confirm } from '../../lib/prompts.js';
|
|
9
|
+
import { getSSHHost, buildSSHCommand } from '../../lib/ssh-config.js';
|
|
10
|
+
import { getCloudflareToken, createOriginCertificate, getZoneByDomain, setSSLMode, upsertDNSRecord } from '../../lib/cloudflare.js';
|
|
11
|
+
export function registerSSLCommands(program) {
|
|
12
|
+
const ssl = program
|
|
13
|
+
.command('ssl')
|
|
14
|
+
.description('SSL certificate management');
|
|
15
|
+
// vu ssl:create
|
|
16
|
+
ssl
|
|
17
|
+
.command('create <domain>')
|
|
18
|
+
.description('Create and install SSL certificate for domain')
|
|
19
|
+
.option('-h, --host <host>', 'SSH host name', 'cicore')
|
|
20
|
+
.option('--skip-dns', 'Skip DNS record creation')
|
|
21
|
+
.action(async (domain, options) => {
|
|
22
|
+
await createSSL(domain, options);
|
|
23
|
+
});
|
|
24
|
+
// vu ssl:renew
|
|
25
|
+
ssl
|
|
26
|
+
.command('renew <domain>')
|
|
27
|
+
.description('Renew SSL certificate')
|
|
28
|
+
.option('-h, --host <host>', 'SSH host name', 'cicore')
|
|
29
|
+
.action(async (domain, options) => {
|
|
30
|
+
await renewSSL(domain, options);
|
|
31
|
+
});
|
|
32
|
+
// vu ssl:list
|
|
33
|
+
ssl
|
|
34
|
+
.command('list')
|
|
35
|
+
.alias('ls')
|
|
36
|
+
.description('List all SSL certificates')
|
|
37
|
+
.option('-h, --host <host>', 'SSH host name', 'cicore')
|
|
38
|
+
.action(async (options) => {
|
|
39
|
+
await listSSL(options);
|
|
40
|
+
});
|
|
41
|
+
// vu ssl:check
|
|
42
|
+
ssl
|
|
43
|
+
.command('check <domain>')
|
|
44
|
+
.description('Check SSL certificate status')
|
|
45
|
+
.option('-h, --host <host>', 'SSH host name', 'cicore')
|
|
46
|
+
.action(async (domain, options) => {
|
|
47
|
+
await checkSSL(domain, options);
|
|
48
|
+
});
|
|
49
|
+
// vu ssl:delete
|
|
50
|
+
ssl
|
|
51
|
+
.command('delete <domain>')
|
|
52
|
+
.description('Delete SSL certificate')
|
|
53
|
+
.option('-h, --host <host>', 'SSH host name', 'cicore')
|
|
54
|
+
.option('-f, --force', 'Skip confirmation')
|
|
55
|
+
.action(async (domain, options) => {
|
|
56
|
+
await deleteSSL(domain, options);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// ============================================
|
|
60
|
+
// CREATE SSL
|
|
61
|
+
// ============================================
|
|
62
|
+
async function createSSL(domain, options) {
|
|
63
|
+
log.title('🔐 Create SSL Certificate');
|
|
64
|
+
log.blank();
|
|
65
|
+
const host = await getSSHHost(options.host);
|
|
66
|
+
if (!host) {
|
|
67
|
+
log.error(`SSH host "${options.host}" not found`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const token = await getCloudflareToken();
|
|
71
|
+
if (!token) {
|
|
72
|
+
log.error('Cloudflare token not configured. Run: vu cloudflare auth --token YOUR_TOKEN');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
log.kv('Domain', domain);
|
|
76
|
+
log.kv('Server', `${host.name} (${host.hostname})`);
|
|
77
|
+
log.blank();
|
|
78
|
+
const startTime = Date.now();
|
|
79
|
+
// Step 1: Get zone
|
|
80
|
+
const zoneSpinner = spinner('Getting Cloudflare zone...').start();
|
|
81
|
+
const zone = await getZoneByDomain(domain);
|
|
82
|
+
if (!zone) {
|
|
83
|
+
zoneSpinner.fail(`Zone not found for domain: ${domain}`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
zoneSpinner.succeed(`Zone: ${zone.name} (${zone.id})`);
|
|
87
|
+
// Step 2: Create DNS records (if not skipped)
|
|
88
|
+
if (!options.skipDns) {
|
|
89
|
+
const dnsSpinner = spinner('Creating DNS records...').start();
|
|
90
|
+
try {
|
|
91
|
+
// Create A records
|
|
92
|
+
await upsertDNSRecord(zone.id, 'A', '@', host.hostname, true);
|
|
93
|
+
await upsertDNSRecord(zone.id, 'A', 'www', host.hostname, true);
|
|
94
|
+
await upsertDNSRecord(zone.id, 'A', 'api', host.hostname, true);
|
|
95
|
+
await upsertDNSRecord(zone.id, 'A', '*', host.hostname, true);
|
|
96
|
+
dnsSpinner.succeed('DNS records created');
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
dnsSpinner.warn(`DNS: ${error.message}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Step 3: Set SSL mode
|
|
103
|
+
const sslModeSpinner = spinner('Setting SSL mode to Full (Strict)...').start();
|
|
104
|
+
try {
|
|
105
|
+
await setSSLMode(zone.id, 'strict');
|
|
106
|
+
sslModeSpinner.succeed('SSL mode: Full (Strict)');
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
sslModeSpinner.warn(`SSL mode: ${error.message}`);
|
|
110
|
+
}
|
|
111
|
+
// Step 4: Create Origin Certificate
|
|
112
|
+
const certSpinner = spinner('Creating Origin Certificate (15 years)...').start();
|
|
113
|
+
const hostnames = [domain, `*.${domain}`];
|
|
114
|
+
const cert = await createOriginCertificate(hostnames);
|
|
115
|
+
if (!cert) {
|
|
116
|
+
certSpinner.fail('Certificate creation failed');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
certSpinner.succeed('Origin Certificate created');
|
|
120
|
+
// Step 5: Upload to server
|
|
121
|
+
const uploadSpinner = spinner('Uploading certificate to server...').start();
|
|
122
|
+
const sslDir = `/home/services/nginx/ssl`;
|
|
123
|
+
const certPath = `${sslDir}/${domain}.crt`;
|
|
124
|
+
const keyPath = `${sslDir}/${domain}.key`;
|
|
125
|
+
// Create directory
|
|
126
|
+
const mkdirArgs = buildSSHCommand(host, `mkdir -p ${sslDir}`);
|
|
127
|
+
await exec('ssh', mkdirArgs, { silent: true });
|
|
128
|
+
// Write certificate
|
|
129
|
+
const certCmd = `cat > ${certPath} << 'CERTEOF'
|
|
130
|
+
${cert.certificate}
|
|
131
|
+
CERTEOF`;
|
|
132
|
+
const certArgs = buildSSHCommand(host, certCmd);
|
|
133
|
+
await exec('ssh', certArgs, { silent: true });
|
|
134
|
+
// Write private key
|
|
135
|
+
const keyCmd = `cat > ${keyPath} << 'KEYEOF'
|
|
136
|
+
${cert.private_key}
|
|
137
|
+
KEYEOF`;
|
|
138
|
+
const keyArgs = buildSSHCommand(host, keyCmd);
|
|
139
|
+
await exec('ssh', keyArgs, { silent: true });
|
|
140
|
+
// Set permissions
|
|
141
|
+
const chmodArgs = buildSSHCommand(host, `chmod 600 ${certPath} ${keyPath}`);
|
|
142
|
+
await exec('ssh', chmodArgs, { silent: true });
|
|
143
|
+
uploadSpinner.succeed('Certificate uploaded to server');
|
|
144
|
+
// Step 6: Reload Nginx
|
|
145
|
+
const nginxSpinner = spinner('Reloading Nginx...').start();
|
|
146
|
+
const reloadArgs = buildSSHCommand(host, 'docker exec cicore_global_nginx nginx -s reload 2>/dev/null || true');
|
|
147
|
+
await exec('ssh', reloadArgs, { silent: true });
|
|
148
|
+
nginxSpinner.succeed('Nginx reloaded');
|
|
149
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
150
|
+
log.blank();
|
|
151
|
+
log.box('✅ SSL Certificate Created', [
|
|
152
|
+
`Domain: ${domain}`,
|
|
153
|
+
`Certificate: ${certPath}`,
|
|
154
|
+
`Private Key: ${keyPath}`,
|
|
155
|
+
`Expires: 15 years`,
|
|
156
|
+
`Duration: ${elapsed}s`,
|
|
157
|
+
]);
|
|
158
|
+
}
|
|
159
|
+
// ============================================
|
|
160
|
+
// RENEW SSL
|
|
161
|
+
// ============================================
|
|
162
|
+
async function renewSSL(domain, options) {
|
|
163
|
+
log.title('🔄 Renew SSL Certificate');
|
|
164
|
+
log.blank();
|
|
165
|
+
// Renew is same as create (Cloudflare Origin Certs are 15 years)
|
|
166
|
+
await createSSL(domain, { ...options, skipDns: true });
|
|
167
|
+
}
|
|
168
|
+
// ============================================
|
|
169
|
+
// LIST SSL
|
|
170
|
+
// ============================================
|
|
171
|
+
async function listSSL(options) {
|
|
172
|
+
log.title('📋 SSL Certificates');
|
|
173
|
+
log.blank();
|
|
174
|
+
const host = await getSSHHost(options.host);
|
|
175
|
+
if (!host) {
|
|
176
|
+
log.error(`SSH host "${options.host}" not found`);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const listSpinner = spinner('Listing certificates...').start();
|
|
180
|
+
const cmd = `
|
|
181
|
+
for cert in /home/services/nginx/ssl/*.crt 2>/dev/null; do
|
|
182
|
+
if [ -f "$cert" ]; then
|
|
183
|
+
domain=$(basename "$cert" .crt)
|
|
184
|
+
expiry=$(openssl x509 -enddate -noout -in "$cert" 2>/dev/null | cut -d= -f2)
|
|
185
|
+
echo "$domain|$expiry"
|
|
186
|
+
fi
|
|
187
|
+
done
|
|
188
|
+
`;
|
|
189
|
+
const args = buildSSHCommand(host, cmd);
|
|
190
|
+
const result = await exec('ssh', args, { silent: true });
|
|
191
|
+
listSpinner.stop();
|
|
192
|
+
if (!result.stdout.trim()) {
|
|
193
|
+
log.info('No SSL certificates found');
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const certs = result.stdout.trim().split('\n').map(line => {
|
|
197
|
+
const [domain, expiry] = line.split('|');
|
|
198
|
+
const expiryDate = new Date(expiry);
|
|
199
|
+
const now = new Date();
|
|
200
|
+
const daysLeft = Math.ceil((expiryDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
|
|
201
|
+
const status = daysLeft > 30 ? '✅ ACTIVE' : daysLeft > 0 ? '⚠️ EXPIRING' : '❌ EXPIRED';
|
|
202
|
+
return [domain, expiry || 'Unknown', status];
|
|
203
|
+
});
|
|
204
|
+
formatTable(['Domain', 'Expires', 'Status'], certs);
|
|
205
|
+
}
|
|
206
|
+
// ============================================
|
|
207
|
+
// CHECK SSL
|
|
208
|
+
// ============================================
|
|
209
|
+
async function checkSSL(domain, options) {
|
|
210
|
+
log.title('🔍 SSL Certificate Check');
|
|
211
|
+
log.blank();
|
|
212
|
+
const host = await getSSHHost(options.host);
|
|
213
|
+
if (!host) {
|
|
214
|
+
log.error(`SSH host "${options.host}" not found`);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
log.kv('Domain', domain);
|
|
218
|
+
log.blank();
|
|
219
|
+
// Check local certificate
|
|
220
|
+
const localSpinner = spinner('Checking local certificate...').start();
|
|
221
|
+
const certPath = `/home/services/nginx/ssl/${domain}.crt`;
|
|
222
|
+
const localCmd = `
|
|
223
|
+
if [ -f "${certPath}" ]; then
|
|
224
|
+
openssl x509 -in "${certPath}" -noout -subject -issuer -dates 2>/dev/null
|
|
225
|
+
else
|
|
226
|
+
echo "NOT_FOUND"
|
|
227
|
+
fi
|
|
228
|
+
`;
|
|
229
|
+
const localArgs = buildSSHCommand(host, localCmd);
|
|
230
|
+
const localResult = await exec('ssh', localArgs, { silent: true });
|
|
231
|
+
if (localResult.stdout.includes('NOT_FOUND')) {
|
|
232
|
+
localSpinner.fail('Local certificate not found');
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
localSpinner.succeed('Local certificate found');
|
|
236
|
+
console.log(localResult.stdout);
|
|
237
|
+
}
|
|
238
|
+
// Check remote SSL
|
|
239
|
+
const remoteSpinner = spinner('Checking remote SSL connection...').start();
|
|
240
|
+
const remoteCmd = `echo | openssl s_client -connect ${domain}:443 -servername ${domain} 2>/dev/null | openssl x509 -noout -dates 2>/dev/null || echo "CONNECTION_FAILED"`;
|
|
241
|
+
const remoteArgs = buildSSHCommand(host, remoteCmd);
|
|
242
|
+
const remoteResult = await exec('ssh', remoteArgs, { silent: true });
|
|
243
|
+
if (remoteResult.stdout.includes('CONNECTION_FAILED')) {
|
|
244
|
+
remoteSpinner.warn('Remote SSL connection failed');
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
remoteSpinner.succeed('Remote SSL connection OK');
|
|
248
|
+
console.log(remoteResult.stdout);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// ============================================
|
|
252
|
+
// DELETE SSL
|
|
253
|
+
// ============================================
|
|
254
|
+
async function deleteSSL(domain, options) {
|
|
255
|
+
log.title('🗑️ Delete SSL Certificate');
|
|
256
|
+
log.blank();
|
|
257
|
+
const host = await getSSHHost(options.host);
|
|
258
|
+
if (!host) {
|
|
259
|
+
log.error(`SSH host "${options.host}" not found`);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (!options.force) {
|
|
263
|
+
const confirmed = await confirm(`Delete SSL certificate for ${domain}?`, false);
|
|
264
|
+
if (!confirmed) {
|
|
265
|
+
log.info('Cancelled');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const deleteSpinner = spinner('Deleting certificate...').start();
|
|
270
|
+
const cmd = `rm -f /home/services/nginx/ssl/${domain}.crt /home/services/nginx/ssl/${domain}.key`;
|
|
271
|
+
const args = buildSSHCommand(host, cmd);
|
|
272
|
+
await exec('ssh', args, { silent: true });
|
|
273
|
+
deleteSpinner.succeed('Certificate deleted');
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ssl/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI — `ci super-admin` (control-plane platform super-admins)
|
|
3
|
+
*
|
|
4
|
+
* Manages `cp_super_admins` in the control-plane DB (vucore_control) — the
|
|
5
|
+
* registry of platform-level super-admins (K5). Control-plane operations
|
|
6
|
+
* (brand/domain CRUD, etc.) are gated on membership here, by email: being a
|
|
7
|
+
* data-plane super-admin on *your own* core does NOT grant authority over the
|
|
8
|
+
* whole platform's brands. The merkez (cicore.com.tr) platform admin is seeded
|
|
9
|
+
* here; a whitelabel brand's own super-admin is deliberately absent → denied.
|
|
10
|
+
*
|
|
11
|
+
* Deploy-free: writes straight to the control-plane DB over SSH/psql, so the
|
|
12
|
+
* registry can be seeded + inspected before the PHP gate that reads it ships.
|
|
13
|
+
*/
|
|
14
|
+
import { Command } from 'commander';
|
|
15
|
+
export declare function registerSuperAdminCommands(program: Command): void;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAenC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkEjE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI — `ci super-admin` (control-plane platform super-admins)
|
|
3
|
+
*
|
|
4
|
+
* Manages `cp_super_admins` in the control-plane DB (vucore_control) — the
|
|
5
|
+
* registry of platform-level super-admins (K5). Control-plane operations
|
|
6
|
+
* (brand/domain CRUD, etc.) are gated on membership here, by email: being a
|
|
7
|
+
* data-plane super-admin on *your own* core does NOT grant authority over the
|
|
8
|
+
* whole platform's brands. The merkez (cicore.com.tr) platform admin is seeded
|
|
9
|
+
* here; a whitelabel brand's own super-admin is deliberately absent → denied.
|
|
10
|
+
*
|
|
11
|
+
* Deploy-free: writes straight to the control-plane DB over SSH/psql, so the
|
|
12
|
+
* registry can be seeded + inspected before the PHP gate that reads it ships.
|
|
13
|
+
*/
|
|
14
|
+
import { log, formatTable } from '../../lib/logger.js';
|
|
15
|
+
import { getHostConfig } from '../../lib/hosts.js';
|
|
16
|
+
import { dbSelectJson, dbExec } from '../../lib/ops/db.js';
|
|
17
|
+
const CONTROL_DB = 'vucore_control';
|
|
18
|
+
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
19
|
+
export function registerSuperAdminCommands(program) {
|
|
20
|
+
const sa = program.command('super-admin').description('Control-plane platform super-admins (cp_super_admins)');
|
|
21
|
+
sa.command('list')
|
|
22
|
+
.description('List platform super-admins')
|
|
23
|
+
.option('-h, --host <host>', 'Host alias (cicore | mkt)')
|
|
24
|
+
.action(async (options) => {
|
|
25
|
+
const cfg = resolveHost(options.host);
|
|
26
|
+
const rows = await dbSelectJson(cfg, CONTROL_DB, `SELECT email, name, is_active, created_at FROM cp_super_admins ORDER BY created_at`);
|
|
27
|
+
if (rows.length === 0) {
|
|
28
|
+
log.warn('No platform super-admins registered. Add one with `ci super-admin add <email>`.');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
formatTable(['Email', 'Name', 'Active'], rows.map(r => [r.email, r.name, r.is_active ? 'yes' : 'no']));
|
|
32
|
+
});
|
|
33
|
+
sa.command('add <email>')
|
|
34
|
+
.description('Register (or re-activate) a platform super-admin')
|
|
35
|
+
.option('-h, --host <host>', 'Host alias (cicore | mkt)')
|
|
36
|
+
.option('--name <name>', 'Display name', 'Super Admin')
|
|
37
|
+
.action(async (email, options) => {
|
|
38
|
+
const cfg = resolveHost(options.host);
|
|
39
|
+
const e = email.trim().toLowerCase();
|
|
40
|
+
if (!EMAIL_RE.test(e)) {
|
|
41
|
+
log.error(`Invalid email: ${email}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const name = (options.name ?? 'Super Admin').replace(/'/g, "''");
|
|
45
|
+
// Idempotent upsert: re-adding re-activates + updates the name.
|
|
46
|
+
const res = await dbExec(cfg, CONTROL_DB, `INSERT INTO cp_super_admins (email, name, is_active) VALUES ('${e}', '${name}', true)
|
|
47
|
+
ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name, is_active = true, updated_at = now();`);
|
|
48
|
+
if (!res.success) {
|
|
49
|
+
log.error(`Failed to add super-admin: ${res.stderr.trim()}`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
log.success(`Platform super-admin: ${e} (active)`);
|
|
53
|
+
});
|
|
54
|
+
sa.command('remove <email>')
|
|
55
|
+
.description('Deactivate a platform super-admin (soft — keeps the row)')
|
|
56
|
+
.option('-h, --host <host>', 'Host alias (cicore | mkt)')
|
|
57
|
+
.action(async (email, options) => {
|
|
58
|
+
const cfg = resolveHost(options.host);
|
|
59
|
+
const e = email.trim().toLowerCase();
|
|
60
|
+
const res = await dbExec(cfg, CONTROL_DB, `UPDATE cp_super_admins SET is_active = false, updated_at = now() WHERE email = '${e.replace(/'/g, "''")}';`);
|
|
61
|
+
if (!res.success) {
|
|
62
|
+
log.error(`Failed to remove super-admin: ${res.stderr.trim()}`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
log.success(`Platform super-admin deactivated: ${e}`);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function resolveHost(alias) {
|
|
69
|
+
if (alias === undefined) {
|
|
70
|
+
log.error('--host is required (cicore | mkt). Pass --host <alias>.');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
return getHostConfig(alias);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/tenant/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD7D"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI - Tenant Management Commands
|
|
3
|
+
*/
|
|
4
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
5
|
+
import { dockerExec } from '../../lib/shell.js';
|
|
6
|
+
import { containers } from '../../lib/config.js';
|
|
7
|
+
import { confirm } from '../../lib/prompts.js';
|
|
8
|
+
export function registerTenantCommands(program) {
|
|
9
|
+
const tenant = program
|
|
10
|
+
.command('tenant')
|
|
11
|
+
.description('Tenant management commands');
|
|
12
|
+
// vu tenant:create <name> <core>
|
|
13
|
+
tenant
|
|
14
|
+
.command('create <name> <core>')
|
|
15
|
+
.description('Create a new tenant')
|
|
16
|
+
.option('-d, --domain <domain>', 'Tenant subdomain')
|
|
17
|
+
.action(async (name, core, options) => {
|
|
18
|
+
await createTenant(name, core, options);
|
|
19
|
+
});
|
|
20
|
+
// vu tenant:list <core>
|
|
21
|
+
tenant
|
|
22
|
+
.command('list <core>')
|
|
23
|
+
.alias('ls')
|
|
24
|
+
.description('List tenants in a core')
|
|
25
|
+
.option('-j, --json', 'Output as JSON')
|
|
26
|
+
.action(async (core, options) => {
|
|
27
|
+
await listTenants(core, options);
|
|
28
|
+
});
|
|
29
|
+
// vu tenant:delete <name> <core>
|
|
30
|
+
tenant
|
|
31
|
+
.command('delete <name> <core>')
|
|
32
|
+
.alias('rm')
|
|
33
|
+
.description('Delete a tenant')
|
|
34
|
+
.option('-f, --force', 'Skip confirmation')
|
|
35
|
+
.action(async (name, core, options) => {
|
|
36
|
+
await deleteTenant(name, core, options);
|
|
37
|
+
});
|
|
38
|
+
// vu tenant:enable-addon <tenant> <addon>
|
|
39
|
+
tenant
|
|
40
|
+
.command('enable-addon <tenant> <addon>')
|
|
41
|
+
.description('Enable addon for tenant')
|
|
42
|
+
.option('-c, --core <core>', 'Core name', 'core1')
|
|
43
|
+
.action(async (tenantName, addonName, options) => {
|
|
44
|
+
await toggleTenantAddon(tenantName, addonName, options.core, true);
|
|
45
|
+
});
|
|
46
|
+
// vu tenant:disable-addon <tenant> <addon>
|
|
47
|
+
tenant
|
|
48
|
+
.command('disable-addon <tenant> <addon>')
|
|
49
|
+
.description('Disable addon for tenant')
|
|
50
|
+
.option('-c, --core <core>', 'Core name', 'core1')
|
|
51
|
+
.action(async (tenantName, addonName, options) => {
|
|
52
|
+
await toggleTenantAddon(tenantName, addonName, options.core, false);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async function createTenant(name, core, options) {
|
|
56
|
+
log.title(`Create Tenant: ${name} in ${core}`);
|
|
57
|
+
const subdomain = options.domain || name.toLowerCase();
|
|
58
|
+
log.kv('Tenant Name', name);
|
|
59
|
+
log.kv('Subdomain', subdomain);
|
|
60
|
+
log.kv('Core', core);
|
|
61
|
+
log.blank();
|
|
62
|
+
const shouldCreate = await confirm('Create tenant with these settings?', true);
|
|
63
|
+
if (!shouldCreate) {
|
|
64
|
+
log.warn('Cancelled');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const createSpinner = spinner('Creating tenant...').start();
|
|
68
|
+
// Create tenant via PHP
|
|
69
|
+
const phpCmd = `php -r "
|
|
70
|
+
require '/var/www/vendor/autoload.php';
|
|
71
|
+
|
|
72
|
+
\\\$corePath = '/var/www/cores/${core}';
|
|
73
|
+
\\\$dotenv = Dotenv\\\\Dotenv::createImmutable(\\\$corePath);
|
|
74
|
+
\\\$dotenv->load();
|
|
75
|
+
|
|
76
|
+
\\\$tenantService = new VuCore\\\\Core\\\\Services\\\\TenantService();
|
|
77
|
+
\\\$result = \\\$tenantService->create([
|
|
78
|
+
'name' => '${name}',
|
|
79
|
+
'subdomain' => '${subdomain}',
|
|
80
|
+
'status' => 'active'
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
echo json_encode(\\\$result);
|
|
84
|
+
"`;
|
|
85
|
+
const result = await dockerExec(containers.php, phpCmd, { silent: true });
|
|
86
|
+
if (!result.success) {
|
|
87
|
+
createSpinner.fail('Failed to create tenant');
|
|
88
|
+
log.error(result.stderr);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
createSpinner.succeed('Tenant created');
|
|
92
|
+
log.blank();
|
|
93
|
+
log.success(`Tenant "${name}" created in ${core}`);
|
|
94
|
+
log.info(`Access: https://${subdomain}.{domain}`);
|
|
95
|
+
}
|
|
96
|
+
async function listTenants(core, options) {
|
|
97
|
+
log.title(`Tenants in ${core}`);
|
|
98
|
+
const phpCmd = `php -r "
|
|
99
|
+
require '/var/www/vendor/autoload.php';
|
|
100
|
+
|
|
101
|
+
\\\$corePath = '/var/www/cores/${core}';
|
|
102
|
+
\\\$dotenv = Dotenv\\\\Dotenv::createImmutable(\\\$corePath);
|
|
103
|
+
\\\$dotenv->load();
|
|
104
|
+
|
|
105
|
+
\\\$tenantService = new VuCore\\\\Core\\\\Services\\\\TenantService();
|
|
106
|
+
\\\$tenants = \\\$tenantService->getAll();
|
|
107
|
+
|
|
108
|
+
echo json_encode(\\\$tenants);
|
|
109
|
+
"`;
|
|
110
|
+
const result = await dockerExec(containers.php, phpCmd, { silent: true });
|
|
111
|
+
if (!result.success) {
|
|
112
|
+
log.error('Failed to list tenants');
|
|
113
|
+
log.error(result.stderr);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const tenants = JSON.parse(result.stdout);
|
|
118
|
+
if (options.json) {
|
|
119
|
+
console.log(JSON.stringify(tenants, null, 2));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (!tenants.length) {
|
|
123
|
+
log.info('No tenants found');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
tenants.forEach((t) => {
|
|
127
|
+
log.item(`${t.name} (${t.subdomain}) - ${t.status}`);
|
|
128
|
+
});
|
|
129
|
+
log.blank();
|
|
130
|
+
log.info(`Total: ${tenants.length} tenant(s)`);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
log.error('Failed to parse tenant list');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function deleteTenant(name, core, options) {
|
|
137
|
+
log.title(`Delete Tenant: ${name} from ${core}`);
|
|
138
|
+
if (!options.force) {
|
|
139
|
+
const confirmed = await confirm(`Delete tenant "${name}"? This cannot be undone.`, false);
|
|
140
|
+
if (!confirmed) {
|
|
141
|
+
log.warn('Cancelled');
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const deleteSpinner = spinner('Deleting tenant...').start();
|
|
146
|
+
const phpCmd = `php -r "
|
|
147
|
+
require '/var/www/vendor/autoload.php';
|
|
148
|
+
|
|
149
|
+
\\\$corePath = '/var/www/cores/${core}';
|
|
150
|
+
\\\$dotenv = Dotenv\\\\Dotenv::createImmutable(\\\$corePath);
|
|
151
|
+
\\\$dotenv->load();
|
|
152
|
+
|
|
153
|
+
\\\$tenantService = new VuCore\\\\Core\\\\Services\\\\TenantService();
|
|
154
|
+
\\\$result = \\\$tenantService->deleteByName('${name}');
|
|
155
|
+
|
|
156
|
+
echo json_encode(\\\$result);
|
|
157
|
+
"`;
|
|
158
|
+
const result = await dockerExec(containers.php, phpCmd, { silent: true });
|
|
159
|
+
if (!result.success) {
|
|
160
|
+
deleteSpinner.fail('Failed to delete tenant');
|
|
161
|
+
log.error(result.stderr);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
deleteSpinner.succeed('Tenant deleted');
|
|
165
|
+
log.success(`Tenant "${name}" deleted from ${core}`);
|
|
166
|
+
}
|
|
167
|
+
async function toggleTenantAddon(tenantName, addonName, core, enable) {
|
|
168
|
+
const action = enable ? 'Enable' : 'Disable';
|
|
169
|
+
log.title(`${action} Addon: ${addonName} for ${tenantName}`);
|
|
170
|
+
const toggleSpinner = spinner(`${action}ing addon...`).start();
|
|
171
|
+
const phpCmd = `php -r "
|
|
172
|
+
require '/var/www/vendor/autoload.php';
|
|
173
|
+
|
|
174
|
+
\\\$corePath = '/var/www/cores/${core}';
|
|
175
|
+
\\\$dotenv = Dotenv\\\\Dotenv::createImmutable(\\\$corePath);
|
|
176
|
+
\\\$dotenv->load();
|
|
177
|
+
|
|
178
|
+
\\\$tenantService = new VuCore\\\\Core\\\\Services\\\\TenantService();
|
|
179
|
+
\\\$result = \\\$tenantService->toggleAddon('${tenantName}', '${addonName}', ${enable});
|
|
180
|
+
|
|
181
|
+
echo json_encode(\\\$result);
|
|
182
|
+
"`;
|
|
183
|
+
const result = await dockerExec(containers.php, phpCmd, { silent: true });
|
|
184
|
+
if (!result.success) {
|
|
185
|
+
toggleSpinner.fail(`Failed to ${action.toLowerCase()} addon`);
|
|
186
|
+
log.error(result.stderr);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
toggleSpinner.succeed(`Addon ${enable ? 'enabled' : 'disabled'}`);
|
|
190
|
+
log.success(`${addonName} is now ${enable ? 'enabled' : 'disabled'} for ${tenantName}`);
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/tenant/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|