@calltelemetry/cli 0.5.18 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/lib/certs.d.ts +16 -2
  2. package/dist/lib/certs.d.ts.map +1 -1
  3. package/dist/lib/certs.js +80 -8
  4. package/dist/lib/certs.js.map +1 -1
  5. package/dist/lib/identity.d.ts +38 -0
  6. package/dist/lib/identity.d.ts.map +1 -0
  7. package/dist/lib/identity.js +85 -0
  8. package/dist/lib/identity.js.map +1 -0
  9. package/dist/lib/prefs.d.ts +4 -0
  10. package/dist/lib/prefs.d.ts.map +1 -1
  11. package/dist/lib/prefs.js.map +1 -1
  12. package/dist/lib/secrets.d.ts +2 -1
  13. package/dist/lib/secrets.d.ts.map +1 -1
  14. package/dist/lib/secrets.js +9 -9
  15. package/dist/lib/secrets.js.map +1 -1
  16. package/dist/lib/time.d.ts +57 -0
  17. package/dist/lib/time.d.ts.map +1 -0
  18. package/dist/lib/time.js +200 -0
  19. package/dist/lib/time.js.map +1 -0
  20. package/dist/lib/users.d.ts.map +1 -1
  21. package/dist/lib/users.js +13 -5
  22. package/dist/lib/users.js.map +1 -1
  23. package/dist/lib/version.d.ts +1 -1
  24. package/dist/lib/version.d.ts.map +1 -1
  25. package/dist/lib/version.js +1 -1
  26. package/dist/lib/version.js.map +1 -1
  27. package/dist/shell/commands/config.d.ts +3 -0
  28. package/dist/shell/commands/config.d.ts.map +1 -1
  29. package/dist/shell/commands/config.js +76 -3
  30. package/dist/shell/commands/config.js.map +1 -1
  31. package/dist/shell/commands/diag.d.ts.map +1 -1
  32. package/dist/shell/commands/diag.js +73 -0
  33. package/dist/shell/commands/diag.js.map +1 -1
  34. package/dist/shell/commands/registry.d.ts.map +1 -1
  35. package/dist/shell/commands/registry.js +16 -2
  36. package/dist/shell/commands/registry.js.map +1 -1
  37. package/dist/shell/commands/secrets.js +2 -2
  38. package/dist/shell/commands/secrets.js.map +1 -1
  39. package/dist/shell/commands/show.js +2 -2
  40. package/dist/shell/commands/show.js.map +1 -1
  41. package/dist/shell/network-onboarding.d.ts +40 -10
  42. package/dist/shell/network-onboarding.d.ts.map +1 -1
  43. package/dist/shell/network-onboarding.js +638 -177
  44. package/dist/shell/network-onboarding.js.map +1 -1
  45. package/dist/ui/views/SecretsSetupView.js +2 -2
  46. package/dist/ui/views/SecretsSetupView.js.map +1 -1
  47. package/dist/ui/views/SecretsStatusView.js +1 -1
  48. package/dist/ui/views/SecretsStatusView.js.map +1 -1
  49. package/dist/ui/views/SetupWizardView.js +1 -1
  50. package/dist/ui/views/SetupWizardView.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Timezone and NTP system helpers using timedatectl and systemd-timesyncd.
3
+ */
4
+ import { execSync, spawnSync } from 'node:child_process';
5
+ export const TIMEZONE_REGIONS = [
6
+ {
7
+ name: 'Americas',
8
+ zones: [
9
+ { value: 'America/New_York', label: 'Eastern', offset: 'UTC-5' },
10
+ { value: 'America/Chicago', label: 'Central', offset: 'UTC-6' },
11
+ { value: 'America/Denver', label: 'Mountain', offset: 'UTC-7' },
12
+ { value: 'America/Los_Angeles', label: 'Pacific', offset: 'UTC-8' },
13
+ { value: 'America/Anchorage', label: 'Alaska', offset: 'UTC-9' },
14
+ { value: 'Pacific/Honolulu', label: 'Hawaii', offset: 'UTC-10', note: 'no DST' },
15
+ { value: 'America/Phoenix', label: 'Arizona', offset: 'UTC-7', note: 'no DST' },
16
+ { value: 'America/Toronto', label: 'Eastern CA', offset: 'UTC-5' },
17
+ { value: 'America/Winnipeg', label: 'Central CA', offset: 'UTC-6' },
18
+ { value: 'America/Vancouver', label: 'Pacific CA', offset: 'UTC-8' },
19
+ { value: 'America/Sao_Paulo', label: 'Brazil', offset: 'UTC-3' },
20
+ { value: 'America/Mexico_City', label: 'Mexico', offset: 'UTC-6' },
21
+ ],
22
+ },
23
+ {
24
+ name: 'Europe',
25
+ zones: [
26
+ { value: 'Europe/London', label: 'GMT', offset: 'UTC+0' },
27
+ { value: 'Europe/Berlin', label: 'CET', offset: 'UTC+1' },
28
+ { value: 'Europe/Paris', label: 'CET', offset: 'UTC+1' },
29
+ { value: 'Europe/Madrid', label: 'CET', offset: 'UTC+1' },
30
+ { value: 'Europe/Moscow', label: 'MSK', offset: 'UTC+3' },
31
+ { value: 'Europe/Istanbul', label: 'TRT', offset: 'UTC+3' },
32
+ { value: 'Europe/Warsaw', label: 'CET', offset: 'UTC+1' },
33
+ { value: 'Europe/Athens', label: 'EET', offset: 'UTC+2' },
34
+ ],
35
+ },
36
+ {
37
+ name: 'Asia / Pacific',
38
+ zones: [
39
+ { value: 'Asia/Tokyo', label: 'JST', offset: 'UTC+9' },
40
+ { value: 'Asia/Shanghai', label: 'CST', offset: 'UTC+8' },
41
+ { value: 'Asia/Kolkata', label: 'IST', offset: 'UTC+5:30' },
42
+ { value: 'Asia/Dubai', label: 'GST', offset: 'UTC+4' },
43
+ { value: 'Asia/Singapore', label: 'SGT', offset: 'UTC+8' },
44
+ { value: 'Australia/Sydney', label: 'AEST', offset: 'UTC+10' },
45
+ { value: 'Pacific/Auckland', label: 'NZST', offset: 'UTC+12' },
46
+ { value: 'Asia/Seoul', label: 'KST', offset: 'UTC+9' },
47
+ ],
48
+ },
49
+ ];
50
+ export const DEFAULT_NTP = ['0.pool.ntp.org', '1.pool.ntp.org'];
51
+ /** All known timezone entries flattened for quick lookup. */
52
+ const ALL_ZONES = TIMEZONE_REGIONS.flatMap(r => r.zones);
53
+ /**
54
+ * Get the current system timezone via timedatectl.
55
+ * Falls back to 'UTC' on error.
56
+ */
57
+ export function getSystemTimezone() {
58
+ try {
59
+ return execSync('timedatectl show --property=Timezone --value', {
60
+ encoding: 'utf-8',
61
+ }).trim();
62
+ }
63
+ catch {
64
+ return 'UTC';
65
+ }
66
+ }
67
+ /**
68
+ * Search available timezones by query string.
69
+ * Returns up to 10 matches with label/offset metadata when available.
70
+ */
71
+ export function searchTimezones(query) {
72
+ try {
73
+ const output = execSync('timedatectl list-timezones', { encoding: 'utf-8' });
74
+ const allTimezones = output.trim().split('\n');
75
+ const lowerQuery = query.toLowerCase();
76
+ const matches = allTimezones.filter(tz => tz.toLowerCase().includes(lowerQuery));
77
+ return matches.slice(0, 10).map(tz => {
78
+ const known = ALL_ZONES.find(z => z.value === tz);
79
+ if (known)
80
+ return known;
81
+ return {
82
+ value: tz,
83
+ label: tz.split('/').pop() ?? tz,
84
+ offset: getUtcOffset(tz),
85
+ };
86
+ });
87
+ }
88
+ catch {
89
+ return [];
90
+ }
91
+ }
92
+ /**
93
+ * Check if a timezone string is valid according to the system.
94
+ */
95
+ export function isValidTimezone(tz) {
96
+ try {
97
+ const output = execSync('timedatectl list-timezones', { encoding: 'utf-8' });
98
+ const allTimezones = output.trim().split('\n');
99
+ return allTimezones.includes(tz);
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ /**
106
+ * Apply a timezone to the system via timedatectl.
107
+ * Returns true if the command succeeds.
108
+ */
109
+ export function applyTimezone(tz) {
110
+ try {
111
+ const result = spawnSync('sudo', ['timedatectl', 'set-timezone', tz], {
112
+ stdio: 'pipe',
113
+ });
114
+ return result.status === 0;
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ /**
121
+ * Compute the current UTC offset for a given IANA timezone.
122
+ * Returns a string like 'UTC-6' or 'UTC+9'.
123
+ */
124
+ export function getUtcOffset(tz) {
125
+ try {
126
+ const formatter = new Intl.DateTimeFormat('en-US', {
127
+ timeZone: tz,
128
+ timeZoneName: 'shortOffset',
129
+ });
130
+ const parts = formatter.formatToParts(new Date());
131
+ const tzPart = parts.find(p => p.type === 'timeZoneName');
132
+ if (tzPart) {
133
+ // Intl returns e.g. 'GMT-6' or 'GMT+5:30' — normalize to UTC prefix
134
+ return tzPart.value.replace('GMT', 'UTC');
135
+ }
136
+ return 'UTC';
137
+ }
138
+ catch {
139
+ return 'UTC';
140
+ }
141
+ }
142
+ /**
143
+ * Get NTP synchronization status from timedatectl.
144
+ */
145
+ export function getNtpSyncStatus() {
146
+ try {
147
+ const output = execSync('timedatectl show', { encoding: 'utf-8' });
148
+ const lines = output.trim().split('\n');
149
+ let synced = false;
150
+ let server;
151
+ for (const line of lines) {
152
+ if (line.startsWith('NTPSynchronized=')) {
153
+ synced = line.split('=')[1]?.trim().toLowerCase() === 'yes';
154
+ }
155
+ }
156
+ return server ? { synced, server } : { synced };
157
+ }
158
+ catch {
159
+ return { synced: false };
160
+ }
161
+ }
162
+ /**
163
+ * Apply custom NTP servers by writing a timesyncd drop-in config
164
+ * and restarting the service.
165
+ * Returns true if both the write and restart succeed.
166
+ */
167
+ export function applyNtpServers(server1, server2) {
168
+ try {
169
+ const ntpLine = server2 ? `${server1} ${server2}` : server1;
170
+ const conf = `[Time]\nNTP=${ntpLine}\n`;
171
+ // Ensure the drop-in directory exists
172
+ const mkdirResult = spawnSync('sudo', ['mkdir', '-p', '/etc/systemd/timesyncd.conf.d'], {
173
+ stdio: 'pipe',
174
+ });
175
+ if (mkdirResult.status !== 0)
176
+ return false;
177
+ // Write the config via sudo tee
178
+ const teeResult = spawnSync('sudo', ['tee', '/etc/systemd/timesyncd.conf.d/ct-ntp.conf'], {
179
+ input: conf,
180
+ stdio: 'pipe',
181
+ });
182
+ if (teeResult.status !== 0)
183
+ return false;
184
+ // Restart timesyncd
185
+ const restartResult = spawnSync('sudo', ['systemctl', 'restart', 'systemd-timesyncd'], {
186
+ stdio: 'pipe',
187
+ });
188
+ return restartResult.status === 0;
189
+ }
190
+ catch {
191
+ return false;
192
+ }
193
+ }
194
+ /**
195
+ * Check if NTP is currently synchronized.
196
+ */
197
+ export function checkNtpSync() {
198
+ return getNtpSyncStatus().synced;
199
+ }
200
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/lib/time.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAczD,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;YAChE,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;YAC/D,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;YAC/D,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;YACnE,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;YAChE,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChF,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/E,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE;YAClE,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE;YACnE,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE;YACpE,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;YAChE,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;SACnE;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACzD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACzD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACxD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACzD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACzD,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YAC3D,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACzD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;SAC1D;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACtD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACzD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE;YAC3D,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YACtD,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YAC1D,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;YAC9D,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;YAC9D,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;SACvD;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AAEhE,6DAA6D;AAC7D,MAAM,SAAS,GAAoB,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAE1E;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,8CAA8C,EAAE;YAC9D,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7E,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjF,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACnC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAClD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,OAAO;gBACL,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;gBAChC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;aACzB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7E,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE;YACpE,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACjD,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,aAAa;SAC5B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QAC1D,IAAI,MAAM,EAAE,CAAC;YACX,oEAAoE;YACpE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,MAA0B,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACxC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAgB;IAC/D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,MAAM,IAAI,GAAG,eAAe,OAAO,IAAI,CAAC;QAExC,sCAAsC;QACtC,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,+BAA+B,CAAC,EAAE;YACtF,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,gCAAgC;QAChC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,2CAA2C,CAAC,EAAE;YACxF,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEzC,oBAAoB;QACpB,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE;YACrF,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,gBAAgB,EAAE,CAAC,MAAM,CAAC;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/lib/users.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAYnD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,SAAK,GAAG,MAAM,CAExD"}
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/lib/users.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAYnD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqBrE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,SAAK,GAAG,MAAM,CAExD"}
package/dist/lib/users.js CHANGED
@@ -34,11 +34,19 @@ export async function listOrgs() {
34
34
  */
35
35
  export async function listOrgUsers(orgId) {
36
36
  const code = `
37
- org = Cdrcisco.Identity.get_org(${orgId})
38
- org.users
39
- |> Enum.map(fn u -> %{id: u.id, email: u.email, role: u.role, roles: u.roles || []} end)
40
- |> Jason.encode!()
41
- |> IO.puts()
37
+ try do
38
+ org = Cdrcisco.Identity.get_org(${orgId})
39
+ if org do
40
+ (org.users || [])
41
+ |> Enum.map(fn u -> %{id: u.id, email: u.email, role: u.role, roles: u.roles || []} end)
42
+ |> Jason.encode!()
43
+ |> IO.puts()
44
+ else
45
+ IO.puts("[]")
46
+ end
47
+ rescue
48
+ _ -> IO.puts("[]")
49
+ end
42
50
  `.trim();
43
51
  const stdout = await rpc(code);
44
52
  const trimmed = stdout.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/lib/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAc/B;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,OAAO,CAAC;SACL,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAQ,mBAAmB;SAC7C,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAG,SAAS;SAClC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAM,SAAS;SACnC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAG,oCAAoC;SAC9D,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAK,eAAe;SACzC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAI,uBAAuB;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC,IAAI,EAAE,CAAC;IAET,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,MAAM,IAAI,GAAG;sCACuB,KAAK;;;;;GAKxC,CAAC,IAAI,EAAE,CAAC;IAET,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,QAAgB;IACtE,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,0CAA0C,MAAM,MAAM,OAAO,oBAAoB,CAAC;IAE/F,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,uBAAuB,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAM,GAAG,EAAE;IAC9C,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/lib/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAc/B;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,OAAO,CAAC;SACL,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAQ,mBAAmB;SAC7C,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAG,SAAS;SAClC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAM,SAAS;SACnC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAG,oCAAoC;SAC9D,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAK,eAAe;SACzC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAI,uBAAuB;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,IAAI,GAAG;;;;;GAKZ,CAAC,IAAI,EAAE,CAAC;IAET,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,MAAM,IAAI,GAAG;;wCAEyB,KAAK;;;;;;;;;;;;GAY1C,CAAC,IAAI,EAAE,CAAC;IAET,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,QAAgB;IACtE,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,0CAA0C,MAAM,MAAM,OAAO,oBAAoB,CAAC;IAE/F,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,uBAAuB,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAM,GAAG,EAAE;IAC9C,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC"}
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version. */
2
- export declare const VERSION = "0.5.18";
2
+ export declare const VERSION = "0.6.1";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,eAAO,MAAM,OAAO,WAAW,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -1,3 +1,3 @@
1
1
  /** Single source of truth for the CLI version. */
2
- export const VERSION = '0.5.18';
2
+ export const VERSION = '0.6.1';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
@@ -5,6 +5,9 @@ export declare function handleIpv6(args: string[], _opts: Record<string, string>
5
5
  export declare function handleOtel(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
6
6
  export declare function handlePostgres(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
7
7
  export declare function handleCertsReset(_args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
8
+ export declare function handleCertsStatus(_args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
9
+ export declare function handleCertsImport(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
10
+ export declare function handleCertsCsr(_args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
8
11
  export declare function handleAuditRun(_args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
9
12
  export declare function handleAuditReport(args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
10
13
  export declare function wireConfigHandlers(configNode: CommandNode): void;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/config.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BpH;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjH;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjH;AAID,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBrH;AAID,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAaxH;AAID,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtH;AAID,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxH;AAID,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAoChE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/config.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BpH;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjH;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjH;AAID,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBrH;AAID,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAexH;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAYzH;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBxH;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtH;AAID,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtH;AAID,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxH;AAID,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAgDhE"}
@@ -103,9 +103,11 @@ export async function handlePostgres(args, _opts, _ctx) {
103
103
  // ── config certs reset ──────────────────────────────────────────────────────
104
104
  export async function handleCertsReset(_args, _opts, _ctx) {
105
105
  try {
106
+ const { getHostname } = await import('../../lib/identity.js');
107
+ const hostname = getHostname();
106
108
  console.log(banner('Certificate Reset'));
107
- console.log(stepProgress('Regenerating self-signed certificates', 'running'));
108
- await resetCerts();
109
+ console.log(stepProgress(`Regenerating self-signed cert for ${hostname}`, 'running'));
110
+ await resetCerts(hostname);
109
111
  console.log(stepProgress('Regenerating self-signed certificates', 'done'));
110
112
  console.log(statusLine('Certificates reset', 'ok', 'restart services to apply'));
111
113
  }
@@ -114,6 +116,56 @@ export async function handleCertsReset(_args, _opts, _ctx) {
114
116
  console.log(stepProgress('Certificate reset', 'fail', msg));
115
117
  }
116
118
  }
119
+ export async function handleCertsStatus(_args, _opts, _ctx) {
120
+ const { getCertInfo } = await import('../../lib/certs.js');
121
+ const info = getCertInfo();
122
+ if (!info) {
123
+ console.log(statusLine('No certificate found', 'warn', 'run: config certs reset'));
124
+ return;
125
+ }
126
+ console.log(banner('TLS Certificate'));
127
+ console.log(statusLine(`CN: ${info.cn}`, 'info'));
128
+ if (info.san.length > 0)
129
+ console.log(statusLine(`SAN: ${info.san.join(', ')}`, 'info'));
130
+ console.log(statusLine(`Expires: ${info.expiry}`, 'info'));
131
+ console.log(statusLine(`Issuer: ${info.issuer}`, 'info'));
132
+ }
133
+ export async function handleCertsImport(args, _opts, _ctx) {
134
+ const [certPath, keyPath] = args;
135
+ if (!certPath || !keyPath) {
136
+ console.log('% Usage: config certs import <cert.pem> <key.pem>');
137
+ return;
138
+ }
139
+ console.log(banner('Import Certificate'));
140
+ console.log(stepProgress('Validating certificate and key', 'running'));
141
+ const { importCert } = await import('../../lib/certs.js');
142
+ const result = await importCert(certPath, keyPath);
143
+ if (result.ok) {
144
+ console.log(stepProgress('Certificate imported', 'done'));
145
+ console.log(statusLine('Certificate installed', 'ok', 'restart services to apply'));
146
+ }
147
+ else {
148
+ console.log(stepProgress('Import failed', 'fail', result.error));
149
+ }
150
+ }
151
+ export async function handleCertsCsr(_args, _opts, _ctx) {
152
+ const { getHostname } = await import('../../lib/identity.js');
153
+ const hostname = getHostname();
154
+ console.log(banner('Generate CSR'));
155
+ console.log(stepProgress(`Generating CSR for ${hostname}`, 'running'));
156
+ try {
157
+ const { generateCsr } = await import('../../lib/certs.js');
158
+ const csr = await generateCsr(hostname);
159
+ console.log(stepProgress('CSR generated', 'done'));
160
+ console.log('\n' + csr);
161
+ console.log(statusLine('Submit this CSR to your Certificate Authority', 'info'));
162
+ console.log(statusLine('Then import the signed cert: config certs import <cert.pem> <key.pem>', 'info'));
163
+ }
164
+ catch (err) {
165
+ const msg = err instanceof Error ? err.message : String(err);
166
+ console.log(stepProgress('CSR generation failed', 'fail', msg));
167
+ }
168
+ }
117
169
  // ── config audit run ────────────────────────────────────────────────────────
118
170
  export async function handleAuditRun(_args, _opts, _ctx) {
119
171
  try {
@@ -171,7 +223,28 @@ export function wireConfigHandlers(configNode) {
171
223
  child.handler = handlePostgres;
172
224
  break;
173
225
  case 'certs':
174
- child.handler = handleCertsReset;
226
+ if (child.children) {
227
+ for (const cc of child.children) {
228
+ switch (cc.name) {
229
+ case 'status':
230
+ cc.handler = handleCertsStatus;
231
+ break;
232
+ case 'reset':
233
+ cc.handler = handleCertsReset;
234
+ break;
235
+ case 'import':
236
+ cc.handler = handleCertsImport;
237
+ break;
238
+ case 'csr':
239
+ cc.handler = handleCertsCsr;
240
+ break;
241
+ }
242
+ }
243
+ }
244
+ else {
245
+ // Backward compat: if no children, treat as reset
246
+ child.handler = handleCertsReset;
247
+ }
175
248
  break;
176
249
  case 'audit':
177
250
  if (child.children) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/shell/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/shell/commands/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAInE,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,KAA6B,EAAE,IAAkB;IACnG,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,0BAA0B,KAAK,GAAG,EAAE,MAAM,EAAE,UAAU,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,iBAAiB,KAAK,EAAE,CAAC,CAAC;QAC/E,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,wBAAwB,KAAK,EAAE,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,gCAAgC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,KAA6B,EAAE,IAAkB;IAChG,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,UAAU,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,MAAM,YAAY,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,KAA6B,EAAE,IAAkB;IAChG,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,UAAU,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,uBAAuB,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,wBAAwB,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,MAAM,YAAY,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc,EAAE,KAA6B,EAAE,IAAkB;IACpG,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,EAAE,yBAAyB,EAAE,GAAG,QAAQ,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,yBAAyB,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,6BAA6B,OAAO,EAAE,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAClG,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,qCAAqC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe,EAAE,KAA6B,EAAE,IAAkB;IACvG,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,qCAAqC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QAEtF,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE3B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,uCAAuC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,oBAAoB,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAe,EAAE,KAA6B,EAAE,IAAkB;IACxG,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,sBAAsB,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAc,EAAE,KAA6B,EAAE,IAAkB;IACvG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC,CAAC;IACvE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,uBAAuB,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAe,EAAE,KAA6B,EAAE,IAAkB;IACrG,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,sBAAsB,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,+CAA+C,EAAE,MAAM,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,uEAAuE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3G,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,uBAAuB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAe,EAAE,KAA6B,EAAE,IAAkB;IACrG,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,kEAAkE,CACnE,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAc,EAAE,KAA6B,EAAE,IAAkB;IACvG,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC,CAAC;QAE9D,MAAM,IAAI,GAAG,EAAE;YACb,CAAC,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,yCAAyC;YAC1F,CAAC,CAAC,0EAA0E,CAAC;QAE/E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;QAE/B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,kBAAkB,CAAC,UAAuB;IACxD,IAAI,CAAC,UAAU,CAAC,QAAQ;QAAE,OAAO;IAEjC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS;gBACZ,KAAK,CAAC,OAAO,GAAG,aAAa,CAAC;gBAC9B,MAAM;YACR,KAAK,MAAM;gBACT,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC;gBAC3B,MAAM;YACR,KAAK,MAAM;gBACT,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC;gBAC3B,MAAM;YACR,KAAK,UAAU;gBACb,KAAK,CAAC,OAAO,GAAG,cAAc,CAAC;gBAC/B,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACnB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;4BAChB,KAAK,QAAQ;gCAAE,EAAE,CAAC,OAAO,GAAG,iBAAiB,CAAC;gCAAC,MAAM;4BACrD,KAAK,OAAO;gCAAE,EAAE,CAAC,OAAO,GAAG,gBAAgB,CAAC;gCAAC,MAAM;4BACnD,KAAK,QAAQ;gCAAE,EAAE,CAAC,OAAO,GAAG,iBAAiB,CAAC;gCAAC,MAAM;4BACrD,KAAK,KAAK;gCAAE,EAAE,CAAC,OAAO,GAAG,cAAc,CAAC;gCAAC,MAAM;wBACjD,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,kDAAkD;oBAClD,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC;gBACnC,CAAC;gBACD,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACnB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;4BAChB,KAAK,KAAK;gCACR,EAAE,CAAC,OAAO,GAAG,cAAc,CAAC;gCAC5B,MAAM;4BACR,KAAK,QAAQ;gCACX,EAAE,CAAC,OAAO,GAAG,iBAAiB,CAAC;gCAC/B,MAAM;wBACV,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"diag.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/diag.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA+mBhD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAShE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAelE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAe1D;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAU9D;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI,CASpE"}
1
+ {"version":3,"file":"diag.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/diag.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA+qBhD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAShE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAoBlE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAe1D;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAU9D;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI,CASpE"}
@@ -7,6 +7,7 @@
7
7
  * jtapi enable|disable|status|troubleshoot
8
8
  * loadtest run|probe|summary
9
9
  */
10
+ import chalk from 'chalk';
10
11
  import { exec } from '../../lib/exec.js';
11
12
  import { compose } from '../../lib/compose.js';
12
13
  import { getNetworkInterfaceList, getDefaultGateway, getEthernetInterfaces, pingTarget, pingTargetV6, tracerouteTarget, tracerouteTargetV6, } from '../../lib/network.js';
@@ -580,6 +581,63 @@ async function loadtestSummary(_args, _opts, _ctx) {
580
581
  console.log('% No previous load test results found.');
581
582
  console.log('% Run "loadtest run [count]" to execute a load test.');
582
583
  }
584
+ // ── network timezone / ntp / hostname / time-status / wizard ─────────────
585
+ async function networkTimezone(args, _opts, _ctx) {
586
+ const { getSystemTimezone, applyTimezone, isValidTimezone } = await import('../../lib/time.js');
587
+ const [tz] = args;
588
+ if (!tz) {
589
+ const current = getSystemTimezone();
590
+ console.log(statusLine(`Timezone: ${current}`, 'info'));
591
+ return;
592
+ }
593
+ if (!isValidTimezone(tz)) {
594
+ console.log(statusLine(`Invalid timezone: ${tz}`, 'fail', 'use IANA format, e.g. America/Chicago'));
595
+ return;
596
+ }
597
+ const ok = applyTimezone(tz);
598
+ console.log(ok ? statusLine(`Timezone set: ${tz}`, 'ok') : statusLine('Failed to set timezone', 'fail'));
599
+ }
600
+ async function networkNtp(args, _opts, _ctx) {
601
+ const { getNtpSyncStatus, applyNtpServers } = await import('../../lib/time.js');
602
+ if (args.length === 0) {
603
+ const status = getNtpSyncStatus();
604
+ console.log(statusLine(`NTP synchronized: ${status.synced ? 'yes' : 'no'}`, status.synced ? 'ok' : 'warn'));
605
+ return;
606
+ }
607
+ const ok = applyNtpServers(args[0], args[1]);
608
+ console.log(ok ? statusLine(`NTP servers configured: ${args.join(', ')}`, 'ok') : statusLine('Failed to set NTP servers', 'fail'));
609
+ }
610
+ async function networkHostname(args, _opts, _ctx) {
611
+ const { getHostname, isValidHostname, applyHostname } = await import('../../lib/identity.js');
612
+ const [name] = args;
613
+ if (!name) {
614
+ const current = getHostname();
615
+ console.log(statusLine(`Hostname: ${current}`, 'info'));
616
+ return;
617
+ }
618
+ if (!isValidHostname(name)) {
619
+ console.log(statusLine(`Invalid hostname: ${name}`, 'fail', 'alphanumeric + hyphens, 1-63 chars'));
620
+ return;
621
+ }
622
+ const ok = applyHostname(name);
623
+ console.log(ok ? statusLine(`Hostname set: ${name}`, 'ok') : statusLine('Failed to set hostname', 'fail'));
624
+ }
625
+ async function networkTimeStatus(_args, _opts, _ctx) {
626
+ const { getSystemTimezone, getNtpSyncStatus, getUtcOffset } = await import('../../lib/time.js');
627
+ const tz = getSystemTimezone();
628
+ const offset = getUtcOffset(tz);
629
+ const ntp = getNtpSyncStatus();
630
+ console.log(banner('Time Status'));
631
+ console.log(statusLine(`Timezone: ${tz} (${offset})`, 'info'));
632
+ console.log(statusLine(`NTP synchronized: ${ntp.synced ? 'yes' : 'no'}`, ntp.synced ? 'ok' : 'warn'));
633
+ console.log(statusLine(`System time: ${new Date().toISOString()}`, 'info'));
634
+ }
635
+ async function networkWizard(_args, _opts, ctx) {
636
+ console.log(chalk.dim('Launching network setup wizard...\n'));
637
+ ctx.rl.close();
638
+ const { runNetworkOnboarding } = await import('../network-onboarding.js');
639
+ await runNetworkOnboarding();
640
+ }
583
641
  // ── Wire handlers ──
584
642
  export function wireDockerHandlers(dockerNode) {
585
643
  if (!dockerNode.children)
@@ -630,6 +688,21 @@ export function wireNetworkHandlers(networkNode) {
630
688
  case 'traceroute6':
631
689
  child.handler = networkTracerouteV6;
632
690
  break;
691
+ case 'hostname':
692
+ child.handler = networkHostname;
693
+ break;
694
+ case 'timezone':
695
+ child.handler = networkTimezone;
696
+ break;
697
+ case 'ntp':
698
+ child.handler = networkNtp;
699
+ break;
700
+ case 'time-status':
701
+ child.handler = networkTimeStatus;
702
+ break;
703
+ case 'wizard':
704
+ child.handler = networkWizard;
705
+ break;
633
706
  }
634
707
  }
635
708
  }