@zincapp/zn-vault-agent 1.3.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.
Files changed (88) hide show
  1. package/README.md +701 -0
  2. package/deploy/logrotate.d/zn-vault-agent +14 -0
  3. package/deploy/systemd/zn-vault-agent.service +75 -0
  4. package/dist/commands/certs.d.ts +3 -0
  5. package/dist/commands/certs.d.ts.map +1 -0
  6. package/dist/commands/certs.js +369 -0
  7. package/dist/commands/certs.js.map +1 -0
  8. package/dist/commands/exec.d.ts +3 -0
  9. package/dist/commands/exec.d.ts.map +1 -0
  10. package/dist/commands/exec.js +193 -0
  11. package/dist/commands/exec.js.map +1 -0
  12. package/dist/commands/login.d.ts +3 -0
  13. package/dist/commands/login.d.ts.map +1 -0
  14. package/dist/commands/login.js +234 -0
  15. package/dist/commands/login.js.map +1 -0
  16. package/dist/commands/secrets.d.ts +3 -0
  17. package/dist/commands/secrets.d.ts.map +1 -0
  18. package/dist/commands/secrets.js +445 -0
  19. package/dist/commands/secrets.js.map +1 -0
  20. package/dist/commands/setup.d.ts +9 -0
  21. package/dist/commands/setup.d.ts.map +1 -0
  22. package/dist/commands/setup.js +346 -0
  23. package/dist/commands/setup.js.map +1 -0
  24. package/dist/commands/start.d.ts +3 -0
  25. package/dist/commands/start.d.ts.map +1 -0
  26. package/dist/commands/start.js +113 -0
  27. package/dist/commands/start.js.map +1 -0
  28. package/dist/commands/status.d.ts +3 -0
  29. package/dist/commands/status.d.ts.map +1 -0
  30. package/dist/commands/status.js +85 -0
  31. package/dist/commands/status.js.map +1 -0
  32. package/dist/commands/sync.d.ts +3 -0
  33. package/dist/commands/sync.d.ts.map +1 -0
  34. package/dist/commands/sync.js +126 -0
  35. package/dist/commands/sync.js.map +1 -0
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +28 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/lib/api.d.ts +104 -0
  41. package/dist/lib/api.d.ts.map +1 -0
  42. package/dist/lib/api.js +338 -0
  43. package/dist/lib/api.js.map +1 -0
  44. package/dist/lib/config.d.ts +164 -0
  45. package/dist/lib/config.d.ts.map +1 -0
  46. package/dist/lib/config.js +299 -0
  47. package/dist/lib/config.js.map +1 -0
  48. package/dist/lib/deployer.d.ts +22 -0
  49. package/dist/lib/deployer.d.ts.map +1 -0
  50. package/dist/lib/deployer.js +407 -0
  51. package/dist/lib/deployer.js.map +1 -0
  52. package/dist/lib/health.d.ts +68 -0
  53. package/dist/lib/health.d.ts.map +1 -0
  54. package/dist/lib/health.js +216 -0
  55. package/dist/lib/health.js.map +1 -0
  56. package/dist/lib/logger.d.ts +38 -0
  57. package/dist/lib/logger.d.ts.map +1 -0
  58. package/dist/lib/logger.js +161 -0
  59. package/dist/lib/logger.js.map +1 -0
  60. package/dist/lib/metrics.d.ts +50 -0
  61. package/dist/lib/metrics.d.ts.map +1 -0
  62. package/dist/lib/metrics.js +273 -0
  63. package/dist/lib/metrics.js.map +1 -0
  64. package/dist/lib/secret-deployer.d.ts +22 -0
  65. package/dist/lib/secret-deployer.d.ts.map +1 -0
  66. package/dist/lib/secret-deployer.js +201 -0
  67. package/dist/lib/secret-deployer.js.map +1 -0
  68. package/dist/lib/validation.d.ts +25 -0
  69. package/dist/lib/validation.d.ts.map +1 -0
  70. package/dist/lib/validation.js +257 -0
  71. package/dist/lib/validation.js.map +1 -0
  72. package/dist/lib/websocket.d.ts +74 -0
  73. package/dist/lib/websocket.d.ts.map +1 -0
  74. package/dist/lib/websocket.js +441 -0
  75. package/dist/lib/websocket.js.map +1 -0
  76. package/dist/services/api-key-renewal.d.ts +13 -0
  77. package/dist/services/api-key-renewal.d.ts.map +1 -0
  78. package/dist/services/api-key-renewal.js +204 -0
  79. package/dist/services/api-key-renewal.js.map +1 -0
  80. package/dist/services/npm-auto-update.d.ts +60 -0
  81. package/dist/services/npm-auto-update.d.ts.map +1 -0
  82. package/dist/services/npm-auto-update.js +245 -0
  83. package/dist/services/npm-auto-update.js.map +1 -0
  84. package/dist/types/update.d.ts +19 -0
  85. package/dist/types/update.d.ts.map +1 -0
  86. package/dist/types/update.js +7 -0
  87. package/dist/types/update.js.map +1 -0
  88. package/package.json +74 -0
@@ -0,0 +1,346 @@
1
+ // Path: zn-vault-agent/src/commands/setup.ts
2
+ import chalk from 'chalk';
3
+ import { execSync } from 'child_process';
4
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync, copyFileSync } from 'fs';
5
+ import { dirname, join } from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ const SYSTEM_USER = 'zn-vault-agent';
8
+ const SERVICE_NAME = 'zn-vault-agent';
9
+ const CONFIG_DIR = '/etc/zn-vault-agent';
10
+ const DATA_DIR = '/var/lib/zn-vault-agent';
11
+ const LOG_DIR = '/var/log/zn-vault-agent';
12
+ const CERT_DIR = '/etc/ssl/znvault';
13
+ const SERVICE_FILE = `/etc/systemd/system/${SERVICE_NAME}.service`;
14
+ export function registerSetupCommand(program) {
15
+ program
16
+ .command('setup')
17
+ .description('Install systemd service and create directories')
18
+ .option('--uninstall', 'Remove systemd service and optionally config')
19
+ .option('--purge', 'Also remove configuration (only with --uninstall)')
20
+ .option('--skip-user', 'Skip creating system user')
21
+ .option('-y, --yes', 'Skip confirmation prompts')
22
+ .addHelpText('after', `
23
+ Examples:
24
+ # Install systemd service (requires root)
25
+ sudo zn-vault-agent setup
26
+
27
+ # Remove systemd service but keep config
28
+ sudo zn-vault-agent setup --uninstall
29
+
30
+ # Remove everything including config
31
+ sudo zn-vault-agent setup --uninstall --purge
32
+ `)
33
+ .action(async (options) => {
34
+ // Check for root
35
+ if (process.getuid && process.getuid() !== 0) {
36
+ console.error(chalk.red('This command requires root. Run with sudo.'));
37
+ process.exit(1);
38
+ }
39
+ if (options.uninstall) {
40
+ await handleUninstall(options);
41
+ }
42
+ else {
43
+ await handleInstall(options);
44
+ }
45
+ });
46
+ }
47
+ async function handleInstall(options) {
48
+ console.log();
49
+ console.log(chalk.bold('ZN-Vault Agent Setup'));
50
+ console.log();
51
+ // Confirm installation
52
+ if (!options.yes) {
53
+ console.log('This will:');
54
+ console.log(` - Create system user: ${SYSTEM_USER}`);
55
+ console.log(` - Create directories:`);
56
+ console.log(` ${CONFIG_DIR}/`);
57
+ console.log(` ${DATA_DIR}/`);
58
+ console.log(` ${LOG_DIR}/`);
59
+ console.log(` ${CERT_DIR}/`);
60
+ console.log(` - Install systemd service: ${SERVICE_NAME}`);
61
+ console.log();
62
+ const inquirer = await import('inquirer');
63
+ const { confirm } = await inquirer.default.prompt([
64
+ {
65
+ type: 'confirm',
66
+ name: 'confirm',
67
+ message: 'Proceed with installation?',
68
+ default: true,
69
+ },
70
+ ]);
71
+ if (!confirm) {
72
+ console.log('Installation cancelled.');
73
+ return;
74
+ }
75
+ }
76
+ console.log();
77
+ // Step 1: Create system user
78
+ if (!options.skipUser) {
79
+ try {
80
+ // Check if user exists
81
+ execSync(`id ${SYSTEM_USER}`, { stdio: 'pipe' });
82
+ console.log(chalk.gray(`User ${SYSTEM_USER} already exists`));
83
+ }
84
+ catch {
85
+ console.log(`Creating user ${SYSTEM_USER}...`);
86
+ try {
87
+ execSync(`useradd --system --no-create-home --shell /sbin/nologin ${SYSTEM_USER}`, { stdio: 'inherit' });
88
+ console.log(chalk.green(` Created user ${SYSTEM_USER}`));
89
+ }
90
+ catch {
91
+ console.log(chalk.yellow(` Could not create user (might already exist)`));
92
+ }
93
+ }
94
+ }
95
+ // Step 2: Create directories
96
+ const directories = [
97
+ { path: CONFIG_DIR, mode: 0o755 },
98
+ { path: DATA_DIR, mode: 0o750 },
99
+ { path: LOG_DIR, mode: 0o750 },
100
+ { path: CERT_DIR, mode: 0o750 },
101
+ ];
102
+ for (const dir of directories) {
103
+ if (!existsSync(dir.path)) {
104
+ console.log(`Creating ${dir.path}/...`);
105
+ mkdirSync(dir.path, { recursive: true, mode: dir.mode });
106
+ execSync(`chown ${SYSTEM_USER}:${SYSTEM_USER} ${dir.path}`);
107
+ console.log(chalk.green(` Created ${dir.path}/`));
108
+ }
109
+ else {
110
+ console.log(chalk.gray(`${dir.path}/ already exists`));
111
+ }
112
+ }
113
+ // Step 3: Create config template if not exists
114
+ const envFile = join(CONFIG_DIR, 'agent.env');
115
+ if (!existsSync(envFile)) {
116
+ console.log(`Creating ${envFile}...`);
117
+ writeFileSync(envFile, `# ZN-Vault Agent Configuration
118
+ # See: zn-vault-agent --help
119
+
120
+ # Logging
121
+ LOG_LEVEL=info
122
+
123
+ # Auto-update settings (optional)
124
+ # AUTO_UPDATE=true
125
+ # AUTO_UPDATE_INTERVAL=300
126
+ # AUTO_UPDATE_CHANNEL=latest
127
+ `, { mode: 0o640 });
128
+ execSync(`chown ${SYSTEM_USER}:${SYSTEM_USER} ${envFile}`);
129
+ console.log(chalk.green(` Created ${envFile}`));
130
+ }
131
+ else {
132
+ console.log(chalk.gray(`${envFile} already exists`));
133
+ }
134
+ // Step 4: Copy systemd service file
135
+ console.log(`Installing systemd service...`);
136
+ const __filename = fileURLToPath(import.meta.url);
137
+ const __dirname = dirname(__filename);
138
+ // Try to find the service file in the package
139
+ const possiblePaths = [
140
+ join(__dirname, '..', '..', 'deploy', 'systemd', 'zn-vault-agent.service'),
141
+ join(__dirname, '..', 'deploy', 'systemd', 'zn-vault-agent.service'),
142
+ '/usr/local/lib/node_modules/@zincapp/zn-vault-agent/deploy/systemd/zn-vault-agent.service',
143
+ ];
144
+ let sourceServiceFile = null;
145
+ for (const p of possiblePaths) {
146
+ if (existsSync(p)) {
147
+ sourceServiceFile = p;
148
+ break;
149
+ }
150
+ }
151
+ if (sourceServiceFile) {
152
+ copyFileSync(sourceServiceFile, SERVICE_FILE);
153
+ console.log(chalk.green(` Installed ${SERVICE_FILE}`));
154
+ }
155
+ else {
156
+ // Generate service file inline
157
+ const serviceContent = generateServiceFile();
158
+ writeFileSync(SERVICE_FILE, serviceContent, { mode: 0o644 });
159
+ console.log(chalk.green(` Generated ${SERVICE_FILE}`));
160
+ }
161
+ // Step 5: Reload systemd
162
+ console.log('Reloading systemd...');
163
+ execSync('systemctl daemon-reload', { stdio: 'inherit' });
164
+ console.log(chalk.green(' systemd reloaded'));
165
+ // Enable service (but don't start)
166
+ console.log('Enabling service...');
167
+ execSync(`systemctl enable ${SERVICE_NAME}`, { stdio: 'inherit' });
168
+ console.log(chalk.green(` ${SERVICE_NAME} enabled`));
169
+ console.log();
170
+ console.log(chalk.green.bold('Setup complete!'));
171
+ console.log();
172
+ console.log('Next steps:');
173
+ console.log(` 1. Configure the agent: ${chalk.cyan('zn-vault-agent login')}`);
174
+ console.log(` 2. Add certificates: ${chalk.cyan('zn-vault-agent certs add')}`);
175
+ console.log(` 3. Start the service: ${chalk.cyan(`sudo systemctl start ${SERVICE_NAME}`)}`);
176
+ console.log(` 4. Check status: ${chalk.cyan(`sudo systemctl status ${SERVICE_NAME}`)}`);
177
+ console.log();
178
+ }
179
+ async function handleUninstall(options) {
180
+ console.log();
181
+ console.log(chalk.bold('ZN-Vault Agent Uninstall'));
182
+ console.log();
183
+ // Confirm uninstall
184
+ if (!options.yes) {
185
+ console.log('This will:');
186
+ console.log(` - Stop and disable systemd service: ${SERVICE_NAME}`);
187
+ console.log(` - Remove service file: ${SERVICE_FILE}`);
188
+ if (options.purge) {
189
+ console.log(chalk.yellow(` - Remove configuration: ${CONFIG_DIR}/`));
190
+ console.log(chalk.yellow(` - Remove data: ${DATA_DIR}/`));
191
+ console.log(chalk.yellow(` - Remove logs: ${LOG_DIR}/`));
192
+ }
193
+ console.log();
194
+ const inquirer = await import('inquirer');
195
+ const { confirm } = await inquirer.default.prompt([
196
+ {
197
+ type: 'confirm',
198
+ name: 'confirm',
199
+ message: options.purge
200
+ ? 'Are you sure? This will remove all configuration and data!'
201
+ : 'Proceed with uninstall?',
202
+ default: false,
203
+ },
204
+ ]);
205
+ if (!confirm) {
206
+ console.log('Uninstall cancelled.');
207
+ return;
208
+ }
209
+ }
210
+ console.log();
211
+ // Stop service
212
+ try {
213
+ console.log('Stopping service...');
214
+ execSync(`systemctl stop ${SERVICE_NAME}`, { stdio: 'pipe' });
215
+ console.log(chalk.green(` ${SERVICE_NAME} stopped`));
216
+ }
217
+ catch {
218
+ console.log(chalk.gray(' Service not running'));
219
+ }
220
+ // Disable service
221
+ try {
222
+ console.log('Disabling service...');
223
+ execSync(`systemctl disable ${SERVICE_NAME}`, { stdio: 'pipe' });
224
+ console.log(chalk.green(` ${SERVICE_NAME} disabled`));
225
+ }
226
+ catch {
227
+ console.log(chalk.gray(' Service not enabled'));
228
+ }
229
+ // Remove service file
230
+ if (existsSync(SERVICE_FILE)) {
231
+ console.log(`Removing ${SERVICE_FILE}...`);
232
+ unlinkSync(SERVICE_FILE);
233
+ console.log(chalk.green(` Removed ${SERVICE_FILE}`));
234
+ }
235
+ // Reload systemd
236
+ console.log('Reloading systemd...');
237
+ execSync('systemctl daemon-reload', { stdio: 'inherit' });
238
+ // Purge if requested
239
+ if (options.purge) {
240
+ const dirsToRemove = [CONFIG_DIR, DATA_DIR, LOG_DIR];
241
+ for (const dir of dirsToRemove) {
242
+ if (existsSync(dir)) {
243
+ console.log(`Removing ${dir}/...`);
244
+ execSync(`rm -rf ${dir}`, { stdio: 'inherit' });
245
+ console.log(chalk.green(` Removed ${dir}/`));
246
+ }
247
+ }
248
+ }
249
+ console.log();
250
+ console.log(chalk.green.bold('Uninstall complete!'));
251
+ if (!options.purge) {
252
+ console.log();
253
+ console.log(chalk.gray(`Configuration preserved in ${CONFIG_DIR}/`));
254
+ console.log(chalk.gray(`Data preserved in ${DATA_DIR}/`));
255
+ console.log(chalk.gray('Use --purge to remove all data.'));
256
+ }
257
+ console.log();
258
+ }
259
+ function generateServiceFile() {
260
+ // Find the binary path
261
+ let binPath = '/usr/local/bin/zn-vault-agent';
262
+ try {
263
+ const result = execSync('which zn-vault-agent', { encoding: 'utf-8', stdio: 'pipe' });
264
+ binPath = result.trim();
265
+ }
266
+ catch {
267
+ // Use default
268
+ }
269
+ return `[Unit]
270
+ Description=ZN-Vault Certificate Agent
271
+ Documentation=https://github.com/zincapp/zn-vault
272
+ After=network-online.target
273
+ Wants=network-online.target
274
+
275
+ [Service]
276
+ Type=simple
277
+ User=${SYSTEM_USER}
278
+ Group=${SYSTEM_USER}
279
+
280
+ # Working directory
281
+ WorkingDirectory=${DATA_DIR}
282
+
283
+ # Main executable
284
+ ExecStart=${binPath} start --health-port 9100
285
+
286
+ # Restart policy
287
+ Restart=always
288
+ RestartSec=5
289
+ StartLimitInterval=60
290
+ StartLimitBurst=5
291
+
292
+ # Environment
293
+ EnvironmentFile=${CONFIG_DIR}/agent.env
294
+ EnvironmentFile=-${CONFIG_DIR}/secrets.env
295
+
296
+ # Logging
297
+ StandardOutput=journal
298
+ StandardError=journal
299
+ SyslogIdentifier=${SERVICE_NAME}
300
+
301
+ # Shutdown
302
+ TimeoutStopSec=30
303
+ KillMode=mixed
304
+ KillSignal=SIGTERM
305
+
306
+ # Security hardening
307
+ NoNewPrivileges=true
308
+ ProtectSystem=strict
309
+ ProtectHome=true
310
+ PrivateTmp=true
311
+ PrivateDevices=true
312
+ ProtectKernelTunables=true
313
+ ProtectKernelModules=true
314
+ ProtectControlGroups=true
315
+ RestrictNamespaces=true
316
+ RestrictRealtime=true
317
+ RestrictSUIDSGID=true
318
+ LockPersonality=true
319
+
320
+ # Allow writing certificates and logs
321
+ ReadWritePaths=${CERT_DIR}
322
+ ReadWritePaths=${DATA_DIR}
323
+ ReadWritePaths=${LOG_DIR}
324
+
325
+ # Network access
326
+ RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
327
+
328
+ # System call filter
329
+ SystemCallFilter=@system-service
330
+ SystemCallFilter=~@privileged @resources
331
+ SystemCallArchitectures=native
332
+
333
+ # Capabilities
334
+ CapabilityBoundingSet=
335
+ AmbientCapabilities=
336
+
337
+ # Resource limits
338
+ MemoryHigh=256M
339
+ MemoryMax=512M
340
+ LimitNOFILE=4096
341
+
342
+ [Install]
343
+ WantedBy=multi-user.target
344
+ `;
345
+ }
346
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStartCommand(program: Command): void;
3
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiH3D"}
@@ -0,0 +1,113 @@
1
+ // Path: src/commands/start.ts
2
+ // Start command - runs the agent daemon
3
+ import chalk from 'chalk';
4
+ import { isConfigured, loadConfig, getTargets } from '../lib/config.js';
5
+ import { validateConfig, formatValidationResult } from '../lib/validation.js';
6
+ import { startDaemon } from '../lib/websocket.js';
7
+ import { logger } from '../lib/logger.js';
8
+ import { NpmAutoUpdateService, loadUpdateConfig } from '../services/npm-auto-update.js';
9
+ export function registerStartCommand(program) {
10
+ program
11
+ .command('start')
12
+ .description('Start the certificate sync daemon')
13
+ .option('-v, --verbose', 'Enable verbose logging')
14
+ .option('--health-port <port>', 'Health/metrics HTTP server port (default: disabled)', parseInt)
15
+ .option('--validate', 'Validate configuration before starting')
16
+ .option('--foreground', 'Run in foreground (default)')
17
+ .option('--auto-update', 'Enable automatic updates (uses saved config)')
18
+ .option('--no-auto-update', 'Disable automatic updates')
19
+ .addHelpText('after', `
20
+ Examples:
21
+ # Start in foreground (default)
22
+ zn-vault-agent start
23
+
24
+ # Enable health/metrics endpoint for monitoring
25
+ zn-vault-agent start --health-port 9100
26
+
27
+ # Verbose logging for debugging
28
+ zn-vault-agent start --verbose
29
+
30
+ # Validate configuration before starting
31
+ zn-vault-agent start --validate
32
+
33
+ # With auto-updates enabled
34
+ zn-vault-agent start --health-port 9100 --auto-update
35
+
36
+ # Production setup (systemd)
37
+ # See docs/GUIDE.md for systemd service file
38
+ `)
39
+ .action(async (options) => {
40
+ // Check configuration
41
+ if (!isConfigured()) {
42
+ console.error(chalk.red('Not configured. Run: zn-vault-agent login'));
43
+ process.exit(1);
44
+ }
45
+ const config = loadConfig();
46
+ const targets = getTargets();
47
+ // Validate configuration if requested
48
+ if (options.validate) {
49
+ const result = validateConfig(config);
50
+ console.log(formatValidationResult(result));
51
+ console.log();
52
+ if (!result.valid) {
53
+ console.error(chalk.red('Configuration validation failed. Fix errors before starting.'));
54
+ process.exit(1);
55
+ }
56
+ }
57
+ // Warn if no targets
58
+ if (targets.length === 0) {
59
+ console.log(chalk.yellow('Warning: No certificate targets configured.'));
60
+ console.log('Run ' + chalk.cyan('zn-vault-agent add') + ' to add certificates to sync.');
61
+ console.log();
62
+ }
63
+ // Set log level based on verbose flag
64
+ if (options.verbose) {
65
+ process.env.LOG_LEVEL = 'debug';
66
+ }
67
+ // Print startup banner
68
+ console.log();
69
+ console.log(chalk.bold('ZN-Vault Certificate Agent'));
70
+ console.log();
71
+ console.log(` Vault: ${config.vaultUrl}`);
72
+ console.log(` Tenant: ${config.tenantId}`);
73
+ console.log(` Targets: ${targets.length} certificate(s)`);
74
+ console.log(` Poll: every ${config.pollInterval || 3600}s`);
75
+ if (options.healthPort) {
76
+ console.log(` Health: http://0.0.0.0:${options.healthPort}/health`);
77
+ console.log(` Metrics: http://0.0.0.0:${options.healthPort}/metrics`);
78
+ }
79
+ // Auto-update status
80
+ const updateConfig = loadUpdateConfig();
81
+ const autoUpdateEnabled = options.autoUpdate !== false && updateConfig.enabled;
82
+ console.log(` Auto-update: ${autoUpdateEnabled ? chalk.green('enabled') : 'disabled'}`);
83
+ console.log();
84
+ if (targets.length > 0) {
85
+ console.log(chalk.gray('Subscribed certificates:'));
86
+ for (const target of targets) {
87
+ console.log(` - ${target.name} (${target.certId.substring(0, 8)}...)`);
88
+ }
89
+ console.log();
90
+ }
91
+ console.log(chalk.gray('Starting daemon...'));
92
+ console.log();
93
+ // Start auto-update service if enabled
94
+ let autoUpdateService = null;
95
+ if (autoUpdateEnabled) {
96
+ logger.info('Starting npm-based auto-update service');
97
+ autoUpdateService = new NpmAutoUpdateService(updateConfig);
98
+ autoUpdateService.start();
99
+ }
100
+ try {
101
+ await startDaemon({
102
+ verbose: options.verbose,
103
+ healthPort: options.healthPort,
104
+ });
105
+ }
106
+ catch (err) {
107
+ logger.error({ err }, 'Daemon error');
108
+ console.error(chalk.red('Daemon error:'), err instanceof Error ? err.message : String(err));
109
+ process.exit(1);
110
+ }
111
+ });
112
+ }
113
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,wCAAwC;AAGxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAExF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;SACjD,MAAM,CAAC,sBAAsB,EAAE,qDAAqD,EAAE,QAAQ,CAAC;SAC/F,MAAM,CAAC,YAAY,EAAE,wCAAwC,CAAC;SAC9D,MAAM,CAAC,cAAc,EAAE,6BAA6B,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC;SACvE,MAAM,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;SACvD,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;CAmBzB,CAAC;SACG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,sBAAsB;QACtB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAE7B,sCAAsC;QACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;gBACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,+BAA+B,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,sCAAsC;QACtC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;QAClC,CAAC;QAED,uBAAuB;QACvB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,YAAY,IAAI,IAAI,GAAG,CAAC,CAAC;QACpE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,iCAAiC,OAAO,CAAC,UAAU,SAAS,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,iCAAiC,OAAO,CAAC,UAAU,UAAU,CAAC,CAAC;QAC7E,CAAC;QAED,qBAAqB;QACrB,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;QACxC,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,KAAK,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,kBAAkB,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,uCAAuC;QACvC,IAAI,iBAAiB,GAAgC,IAAI,CAAC;QAC1D,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACtD,iBAAiB,GAAG,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAC3D,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,CAAC;gBAChB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuF5D"}
@@ -0,0 +1,85 @@
1
+ import chalk from 'chalk';
2
+ import { isConfigured, loadConfig, getTargets, getConfigPath } from '../lib/config.js';
3
+ export function registerStatusCommand(program) {
4
+ program
5
+ .command('status')
6
+ .description('Show agent configuration and status')
7
+ .option('--json', 'Output as JSON')
8
+ .addHelpText('after', `
9
+ Examples:
10
+ zn-vault-agent status # Human-readable status
11
+ zn-vault-agent status --json # JSON output for scripting
12
+ `)
13
+ .action(async (options) => {
14
+ const config = loadConfig();
15
+ const targets = getTargets();
16
+ if (options.json) {
17
+ console.log(JSON.stringify({
18
+ configured: isConfigured(),
19
+ configPath: getConfigPath(),
20
+ vaultUrl: config.vaultUrl,
21
+ tenantId: config.tenantId,
22
+ authMethod: config.auth.apiKey ? 'apiKey' : (config.auth.username ? 'password' : 'none'),
23
+ insecure: config.insecure,
24
+ pollInterval: config.pollInterval || 3600,
25
+ targets: targets.map(t => ({
26
+ name: t.name,
27
+ certId: t.certId,
28
+ outputs: t.outputs,
29
+ lastSync: t.lastSync,
30
+ lastFingerprint: t.lastFingerprint,
31
+ })),
32
+ }, null, 2));
33
+ return;
34
+ }
35
+ console.log();
36
+ console.log(chalk.bold('ZN-Vault Agent Status'));
37
+ console.log();
38
+ if (!isConfigured()) {
39
+ console.log(chalk.yellow(' Status: Not configured'));
40
+ console.log();
41
+ console.log('Run ' + chalk.cyan('zn-vault-agent login') + ' to configure.');
42
+ return;
43
+ }
44
+ console.log(chalk.green(' Status: Configured'));
45
+ console.log();
46
+ console.log(chalk.bold('Connection'));
47
+ console.log(` Vault URL: ${config.vaultUrl}`);
48
+ console.log(` Tenant ID: ${config.tenantId}`);
49
+ console.log(` Auth Method: ${config.auth.apiKey ? 'API Key' : 'Username/Password'}`);
50
+ console.log(` TLS Verify: ${config.insecure ? chalk.yellow('disabled') : chalk.green('enabled')}`);
51
+ console.log(` Poll Interval: ${config.pollInterval || 3600}s`);
52
+ console.log();
53
+ console.log(chalk.bold('Certificate Targets'));
54
+ if (targets.length === 0) {
55
+ console.log(' No targets configured');
56
+ console.log(' Run ' + chalk.cyan('zn-vault-agent add') + ' to add one.');
57
+ }
58
+ else {
59
+ for (const target of targets) {
60
+ const syncStatus = target.lastSync
61
+ ? chalk.green(`synced ${new Date(target.lastSync).toLocaleString()}`)
62
+ : chalk.yellow('not synced');
63
+ console.log();
64
+ console.log(` ${chalk.cyan(target.name)}`);
65
+ console.log(` Certificate: ${target.certId.substring(0, 8)}...`);
66
+ console.log(` Status: ${syncStatus}`);
67
+ console.log(` Outputs:`);
68
+ for (const [type, path] of Object.entries(target.outputs)) {
69
+ if (path)
70
+ console.log(` ${type}: ${path}`);
71
+ }
72
+ if (target.reloadCmd) {
73
+ console.log(` Reload: ${target.reloadCmd}`);
74
+ }
75
+ if (target.healthCheckCmd) {
76
+ console.log(` Health: ${target.healthCheckCmd}`);
77
+ }
78
+ }
79
+ }
80
+ console.log();
81
+ console.log(chalk.gray(`Config: ${getConfigPath()}`));
82
+ console.log();
83
+ });
84
+ }
85
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSyncCommand(program: Command): void;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+H1D"}