@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.
- package/README.md +701 -0
- package/deploy/logrotate.d/zn-vault-agent +14 -0
- package/deploy/systemd/zn-vault-agent.service +75 -0
- package/dist/commands/certs.d.ts +3 -0
- package/dist/commands/certs.d.ts.map +1 -0
- package/dist/commands/certs.js +369 -0
- package/dist/commands/certs.js.map +1 -0
- package/dist/commands/exec.d.ts +3 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +193 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +234 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +445 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +346 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +113 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +85 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +126 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +104 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +338 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +164 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +299 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/deployer.d.ts +22 -0
- package/dist/lib/deployer.d.ts.map +1 -0
- package/dist/lib/deployer.js +407 -0
- package/dist/lib/deployer.js.map +1 -0
- package/dist/lib/health.d.ts +68 -0
- package/dist/lib/health.d.ts.map +1 -0
- package/dist/lib/health.js +216 -0
- package/dist/lib/health.js.map +1 -0
- package/dist/lib/logger.d.ts +38 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +161 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/metrics.d.ts +50 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +273 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/secret-deployer.d.ts +22 -0
- package/dist/lib/secret-deployer.d.ts.map +1 -0
- package/dist/lib/secret-deployer.js +201 -0
- package/dist/lib/secret-deployer.js.map +1 -0
- package/dist/lib/validation.d.ts +25 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +257 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/websocket.d.ts +74 -0
- package/dist/lib/websocket.d.ts.map +1 -0
- package/dist/lib/websocket.js +441 -0
- package/dist/lib/websocket.js.map +1 -0
- package/dist/services/api-key-renewal.d.ts +13 -0
- package/dist/services/api-key-renewal.d.ts.map +1 -0
- package/dist/services/api-key-renewal.js +204 -0
- package/dist/services/api-key-renewal.js.map +1 -0
- package/dist/services/npm-auto-update.d.ts +60 -0
- package/dist/services/npm-auto-update.d.ts.map +1 -0
- package/dist/services/npm-auto-update.js +245 -0
- package/dist/services/npm-auto-update.js.map +1 -0
- package/dist/types/update.d.ts +19 -0
- package/dist/types/update.d.ts.map +1 -0
- package/dist/types/update.js +7 -0
- package/dist/types/update.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
// Path: src/lib/deployer.ts
|
|
2
|
+
// Certificate deployment with atomic writes and verification
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import crypto from 'node:crypto';
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import { decryptCertificate, getCertificate, ackDelivery } from './api.js';
|
|
9
|
+
import { updateTargetFingerprint, loadConfig } from './config.js';
|
|
10
|
+
import { deployLogger as log } from './logger.js';
|
|
11
|
+
import { metrics } from './metrics.js';
|
|
12
|
+
import { updateCertStatus } from './health.js';
|
|
13
|
+
/**
|
|
14
|
+
* Parse PEM certificate bundle into components
|
|
15
|
+
*/
|
|
16
|
+
function parsePemBundle(pemData) {
|
|
17
|
+
const certRegex = /-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g;
|
|
18
|
+
// Support all private key formats: RSA, EC, PKCS8, and encrypted
|
|
19
|
+
const keyRegex = /-----BEGIN (?:RSA |EC |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |ENCRYPTED )?PRIVATE KEY-----/;
|
|
20
|
+
const certs = pemData.match(certRegex) || [];
|
|
21
|
+
const keyMatch = pemData.match(keyRegex);
|
|
22
|
+
log.debug({
|
|
23
|
+
certsFound: certs.length,
|
|
24
|
+
hasPrivateKey: !!keyMatch,
|
|
25
|
+
pemLength: pemData.length,
|
|
26
|
+
}, 'Parsed PEM bundle');
|
|
27
|
+
return {
|
|
28
|
+
certificate: certs[0] || '',
|
|
29
|
+
privateKey: keyMatch ? keyMatch[0] : '',
|
|
30
|
+
chain: certs.slice(1),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calculate SHA-256 hash of content
|
|
35
|
+
*/
|
|
36
|
+
function hashContent(content) {
|
|
37
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Write file atomically using temp file + rename
|
|
41
|
+
* This ensures the file is either fully written or not at all
|
|
42
|
+
*/
|
|
43
|
+
function writeFileAtomic(filePath, content, mode) {
|
|
44
|
+
const dir = path.dirname(filePath);
|
|
45
|
+
const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.tmp`);
|
|
46
|
+
// Create directory if needed
|
|
47
|
+
if (!fs.existsSync(dir)) {
|
|
48
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
// Write to temp file
|
|
52
|
+
fs.writeFileSync(tempPath, content, { mode });
|
|
53
|
+
// Atomic rename
|
|
54
|
+
fs.renameSync(tempPath, filePath);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
// Clean up temp file on error
|
|
58
|
+
try {
|
|
59
|
+
if (fs.existsSync(tempPath)) {
|
|
60
|
+
fs.unlinkSync(tempPath);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Ignore cleanup errors
|
|
65
|
+
}
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Verify file was written correctly by re-reading and comparing hash
|
|
71
|
+
*/
|
|
72
|
+
function verifyFile(filePath, expectedHash) {
|
|
73
|
+
try {
|
|
74
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
75
|
+
const actualHash = hashContent(content);
|
|
76
|
+
return actualHash === expectedHash;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Write file with proper ownership and permissions, using atomic write
|
|
84
|
+
*/
|
|
85
|
+
function writeSecureFile(filePath, content, owner, mode) {
|
|
86
|
+
const fileMode = mode ? parseInt(mode, 8) : 0o600;
|
|
87
|
+
// Atomic write
|
|
88
|
+
writeFileAtomic(filePath, content, fileMode);
|
|
89
|
+
// Set ownership if specified and running as root
|
|
90
|
+
if (owner && process.getuid?.() === 0) {
|
|
91
|
+
const [user, group] = owner.split(':');
|
|
92
|
+
try {
|
|
93
|
+
execSync(`chown ${user}:${group || user} "${filePath}"`, { stdio: 'pipe' });
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
log.warn({ filePath, owner, err }, 'Failed to set file ownership');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Set permissions (may be different from atomic write due to umask)
|
|
100
|
+
if (mode) {
|
|
101
|
+
try {
|
|
102
|
+
fs.chmodSync(filePath, fileMode);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
log.warn({ filePath, mode, err }, 'Failed to set file permissions');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { hash: hashContent(content) };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Backup existing files before deployment
|
|
112
|
+
*/
|
|
113
|
+
function backupFiles(outputs) {
|
|
114
|
+
const backups = new Map();
|
|
115
|
+
for (const filePath of Object.values(outputs)) {
|
|
116
|
+
if (filePath && fs.existsSync(filePath)) {
|
|
117
|
+
const backupPath = `${filePath}.bak`;
|
|
118
|
+
try {
|
|
119
|
+
fs.copyFileSync(filePath, backupPath);
|
|
120
|
+
backups.set(filePath, backupPath);
|
|
121
|
+
log.debug({ original: filePath, backup: backupPath }, 'Created backup');
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
log.warn({ filePath, err }, 'Failed to create backup');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return backups;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Restore files from backup
|
|
132
|
+
*/
|
|
133
|
+
function restoreBackups(backups) {
|
|
134
|
+
for (const [original, backup] of backups) {
|
|
135
|
+
if (fs.existsSync(backup)) {
|
|
136
|
+
try {
|
|
137
|
+
fs.copyFileSync(backup, original);
|
|
138
|
+
log.info({ original, backup }, 'Restored from backup');
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
log.error({ original, backup, err }, 'Failed to restore backup');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Clean up backup files after successful deployment
|
|
148
|
+
*/
|
|
149
|
+
function cleanupBackups(backups) {
|
|
150
|
+
for (const backup of backups.values()) {
|
|
151
|
+
try {
|
|
152
|
+
if (fs.existsSync(backup)) {
|
|
153
|
+
fs.unlinkSync(backup);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Ignore cleanup errors
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Execute reload command
|
|
163
|
+
*/
|
|
164
|
+
function executeReload(cmd) {
|
|
165
|
+
log.debug({ cmd }, 'Executing reload command');
|
|
166
|
+
try {
|
|
167
|
+
const output = execSync(cmd, { encoding: 'utf-8', timeout: 30000 });
|
|
168
|
+
log.info({ cmd }, 'Reload command succeeded');
|
|
169
|
+
return { success: true, output };
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
const error = err;
|
|
173
|
+
const output = error.stderr || error.message || 'Unknown error';
|
|
174
|
+
log.error({ cmd, error: output }, 'Reload command failed');
|
|
175
|
+
return { success: false, output };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Execute health check command
|
|
180
|
+
*/
|
|
181
|
+
function executeHealthCheck(cmd) {
|
|
182
|
+
log.debug({ cmd }, 'Executing health check');
|
|
183
|
+
try {
|
|
184
|
+
execSync(cmd, { encoding: 'utf-8', timeout: 10000, stdio: 'pipe' });
|
|
185
|
+
log.debug({ cmd }, 'Health check passed');
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
log.warn({ cmd, err }, 'Health check failed');
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Deploy a certificate to its target locations
|
|
195
|
+
*/
|
|
196
|
+
export async function deployCertificate(target, force = false) {
|
|
197
|
+
const { certId, name, outputs, owner, mode, reloadCmd, healthCheckCmd } = target;
|
|
198
|
+
const config = loadConfig();
|
|
199
|
+
const startTime = Date.now();
|
|
200
|
+
log.info({ certId, name, force }, 'Starting certificate deployment');
|
|
201
|
+
try {
|
|
202
|
+
// Get certificate metadata to check fingerprint
|
|
203
|
+
const metadata = await getCertificate(certId);
|
|
204
|
+
// Update expiry metric
|
|
205
|
+
metrics.setCertExpiry(certId, name, metadata.daysUntilExpiry);
|
|
206
|
+
// Check if certificate has changed (unless forced)
|
|
207
|
+
if (!force && target.lastFingerprint === metadata.fingerprintSha256) {
|
|
208
|
+
const duration = Date.now() - startTime;
|
|
209
|
+
log.debug({ certId, name, duration }, 'Certificate unchanged, skipping');
|
|
210
|
+
return {
|
|
211
|
+
success: true,
|
|
212
|
+
certId,
|
|
213
|
+
name,
|
|
214
|
+
message: 'Certificate unchanged',
|
|
215
|
+
fingerprint: metadata.fingerprintSha256,
|
|
216
|
+
durationMs: duration,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Check expiry
|
|
220
|
+
if (metadata.daysUntilExpiry < 0) {
|
|
221
|
+
const duration = Date.now() - startTime;
|
|
222
|
+
const message = `Certificate is EXPIRED (${Math.abs(metadata.daysUntilExpiry)} days ago)`;
|
|
223
|
+
log.error({ certId, name, daysExpired: Math.abs(metadata.daysUntilExpiry) }, message);
|
|
224
|
+
metrics.syncFailure(name, 'expired');
|
|
225
|
+
return {
|
|
226
|
+
success: false,
|
|
227
|
+
certId,
|
|
228
|
+
name,
|
|
229
|
+
message,
|
|
230
|
+
durationMs: duration,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// Decrypt certificate
|
|
234
|
+
const decrypted = await decryptCertificate(certId, `Agent sync to ${os.hostname()}`);
|
|
235
|
+
// Decode from base64
|
|
236
|
+
const pemData = Buffer.from(decrypted.certificateData, 'base64').toString('utf-8');
|
|
237
|
+
// Parse PEM bundle
|
|
238
|
+
const { certificate, privateKey, chain } = parsePemBundle(pemData);
|
|
239
|
+
if (!certificate) {
|
|
240
|
+
throw new Error('No certificate found in PEM data');
|
|
241
|
+
}
|
|
242
|
+
// Backup existing files
|
|
243
|
+
const backups = backupFiles(outputs);
|
|
244
|
+
const filesWritten = [];
|
|
245
|
+
const fileHashes = new Map();
|
|
246
|
+
try {
|
|
247
|
+
// Write files based on output configuration
|
|
248
|
+
if (outputs.combined) {
|
|
249
|
+
const combined = [certificate, privateKey, ...chain].filter(Boolean).join('\n');
|
|
250
|
+
const { hash } = writeSecureFile(outputs.combined, combined, owner, mode);
|
|
251
|
+
fileHashes.set(outputs.combined, hash);
|
|
252
|
+
filesWritten.push(outputs.combined);
|
|
253
|
+
}
|
|
254
|
+
if (outputs.cert) {
|
|
255
|
+
const { hash } = writeSecureFile(outputs.cert, certificate, owner, mode);
|
|
256
|
+
fileHashes.set(outputs.cert, hash);
|
|
257
|
+
filesWritten.push(outputs.cert);
|
|
258
|
+
}
|
|
259
|
+
if (outputs.key) {
|
|
260
|
+
if (privateKey) {
|
|
261
|
+
const { hash } = writeSecureFile(outputs.key, privateKey, owner, mode || '0600');
|
|
262
|
+
fileHashes.set(outputs.key, hash);
|
|
263
|
+
filesWritten.push(outputs.key);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
log.warn({
|
|
267
|
+
certId,
|
|
268
|
+
name,
|
|
269
|
+
keyPath: outputs.key,
|
|
270
|
+
}, 'Private key output configured but certificate has no private key - was the key included when storing?');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (outputs.chain && chain.length > 0) {
|
|
274
|
+
const chainContent = chain.join('\n');
|
|
275
|
+
const { hash } = writeSecureFile(outputs.chain, chainContent, owner, mode);
|
|
276
|
+
fileHashes.set(outputs.chain, hash);
|
|
277
|
+
filesWritten.push(outputs.chain);
|
|
278
|
+
}
|
|
279
|
+
if (outputs.fullchain) {
|
|
280
|
+
const fullchain = [certificate, ...chain].filter(Boolean).join('\n');
|
|
281
|
+
const { hash } = writeSecureFile(outputs.fullchain, fullchain, owner, mode);
|
|
282
|
+
fileHashes.set(outputs.fullchain, hash);
|
|
283
|
+
filesWritten.push(outputs.fullchain);
|
|
284
|
+
}
|
|
285
|
+
// Verify all written files
|
|
286
|
+
for (const [filePath, expectedHash] of fileHashes) {
|
|
287
|
+
if (!verifyFile(filePath, expectedHash)) {
|
|
288
|
+
throw new Error(`File verification failed for ${filePath}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
log.debug({ files: filesWritten.length }, 'All files written and verified');
|
|
292
|
+
// Execute reload command
|
|
293
|
+
const reloadCommand = reloadCmd || config.globalReloadCmd;
|
|
294
|
+
let reloadOutput;
|
|
295
|
+
if (reloadCommand) {
|
|
296
|
+
const result = executeReload(reloadCommand);
|
|
297
|
+
reloadOutput = result.output;
|
|
298
|
+
if (!result.success) {
|
|
299
|
+
// Reload failed, rollback
|
|
300
|
+
log.warn({ certId, name }, 'Reload failed, rolling back');
|
|
301
|
+
restoreBackups(backups);
|
|
302
|
+
if (reloadCommand) {
|
|
303
|
+
executeReload(reloadCommand); // Try to reload with old certs
|
|
304
|
+
}
|
|
305
|
+
metrics.syncFailure(name, 'reload_failed');
|
|
306
|
+
return {
|
|
307
|
+
success: false,
|
|
308
|
+
certId,
|
|
309
|
+
name,
|
|
310
|
+
message: `Reload failed: ${result.output}`,
|
|
311
|
+
rolledBack: true,
|
|
312
|
+
durationMs: Date.now() - startTime,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Execute health check
|
|
317
|
+
let healthCheckPassed;
|
|
318
|
+
if (healthCheckCmd) {
|
|
319
|
+
healthCheckPassed = executeHealthCheck(healthCheckCmd);
|
|
320
|
+
if (!healthCheckPassed) {
|
|
321
|
+
// Health check failed, rollback
|
|
322
|
+
log.warn({ certId, name }, 'Health check failed, rolling back');
|
|
323
|
+
restoreBackups(backups);
|
|
324
|
+
if (reloadCommand) {
|
|
325
|
+
executeReload(reloadCommand); // Reload with old certs
|
|
326
|
+
}
|
|
327
|
+
metrics.syncFailure(name, 'health_check_failed');
|
|
328
|
+
return {
|
|
329
|
+
success: false,
|
|
330
|
+
certId,
|
|
331
|
+
name,
|
|
332
|
+
message: 'Health check failed after deployment',
|
|
333
|
+
rolledBack: true,
|
|
334
|
+
durationMs: Date.now() - startTime,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// Update fingerprint in config
|
|
339
|
+
updateTargetFingerprint(certId, metadata.fingerprintSha256);
|
|
340
|
+
// Acknowledge delivery to server
|
|
341
|
+
await ackDelivery(certId, os.hostname(), metadata.version);
|
|
342
|
+
// Clean up backups after successful deployment
|
|
343
|
+
cleanupBackups(backups);
|
|
344
|
+
const duration = Date.now() - startTime;
|
|
345
|
+
const message = `Deployed v${metadata.version} (expires in ${metadata.daysUntilExpiry}d)`;
|
|
346
|
+
log.info({ certId, name, version: metadata.version, expiresIn: metadata.daysUntilExpiry, duration }, message);
|
|
347
|
+
metrics.syncSuccess(name);
|
|
348
|
+
metrics.syncDuration(name, duration);
|
|
349
|
+
return {
|
|
350
|
+
success: true,
|
|
351
|
+
certId,
|
|
352
|
+
name,
|
|
353
|
+
message,
|
|
354
|
+
fingerprint: metadata.fingerprintSha256,
|
|
355
|
+
filesWritten,
|
|
356
|
+
reloadOutput,
|
|
357
|
+
healthCheckPassed,
|
|
358
|
+
durationMs: duration,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
catch (deployErr) {
|
|
362
|
+
// Deployment failed, try to rollback
|
|
363
|
+
log.error({ certId, name, err: deployErr }, 'Deployment failed, rolling back');
|
|
364
|
+
restoreBackups(backups);
|
|
365
|
+
throw deployErr;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
const duration = Date.now() - startTime;
|
|
370
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
371
|
+
log.error({ certId, name, err, duration }, 'Certificate deployment failed');
|
|
372
|
+
metrics.syncFailure(name, 'error');
|
|
373
|
+
return {
|
|
374
|
+
success: false,
|
|
375
|
+
certId,
|
|
376
|
+
name,
|
|
377
|
+
message,
|
|
378
|
+
durationMs: duration,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Deploy all configured certificate targets
|
|
384
|
+
*/
|
|
385
|
+
export async function deployAllCertificates(force = false) {
|
|
386
|
+
const config = loadConfig();
|
|
387
|
+
const results = [];
|
|
388
|
+
let successCount = 0;
|
|
389
|
+
let errorCount = 0;
|
|
390
|
+
log.info({ count: config.targets.length, force }, 'Deploying all certificates');
|
|
391
|
+
for (const target of config.targets) {
|
|
392
|
+
const result = await deployCertificate(target, force);
|
|
393
|
+
results.push(result);
|
|
394
|
+
if (result.success) {
|
|
395
|
+
successCount++;
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
errorCount++;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Update health status
|
|
402
|
+
updateCertStatus(successCount, errorCount);
|
|
403
|
+
metrics.setCertsTracked(config.targets.length);
|
|
404
|
+
log.info({ total: config.targets.length, success: successCount, errors: errorCount }, 'Deployment complete');
|
|
405
|
+
return results;
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=deployer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../src/lib/deployer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
export interface HealthStatus {
|
|
3
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
4
|
+
timestamp: string;
|
|
5
|
+
uptime: number;
|
|
6
|
+
version: string;
|
|
7
|
+
websocket: {
|
|
8
|
+
certificates: {
|
|
9
|
+
connected: boolean;
|
|
10
|
+
lastEvent?: string;
|
|
11
|
+
};
|
|
12
|
+
secrets: {
|
|
13
|
+
connected: boolean;
|
|
14
|
+
lastEvent?: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
vault: {
|
|
18
|
+
url: string;
|
|
19
|
+
reachable: boolean;
|
|
20
|
+
};
|
|
21
|
+
certificates: {
|
|
22
|
+
total: number;
|
|
23
|
+
synced: number;
|
|
24
|
+
errors: number;
|
|
25
|
+
};
|
|
26
|
+
secrets: {
|
|
27
|
+
total: number;
|
|
28
|
+
synced: number;
|
|
29
|
+
errors: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Update WebSocket connection status for certificates
|
|
34
|
+
*/
|
|
35
|
+
export declare function setWebSocketStatus(connected: boolean, eventTime?: Date): void;
|
|
36
|
+
/**
|
|
37
|
+
* Update WebSocket connection status for secrets
|
|
38
|
+
*/
|
|
39
|
+
export declare function setSecretWebSocketStatus(connected: boolean, eventTime?: Date): void;
|
|
40
|
+
/**
|
|
41
|
+
* Update vault reachability status
|
|
42
|
+
*/
|
|
43
|
+
export declare function setVaultReachable(reachable: boolean): void;
|
|
44
|
+
/**
|
|
45
|
+
* Update certificate sync status
|
|
46
|
+
*/
|
|
47
|
+
export declare function updateCertStatus(synced: number, errors: number): void;
|
|
48
|
+
/**
|
|
49
|
+
* Update secret sync status
|
|
50
|
+
*/
|
|
51
|
+
export declare function updateSecretStatus(synced: number, errors: number): void;
|
|
52
|
+
/**
|
|
53
|
+
* Get current health status
|
|
54
|
+
*/
|
|
55
|
+
export declare function getHealthStatus(): HealthStatus;
|
|
56
|
+
/**
|
|
57
|
+
* Start the health HTTP server
|
|
58
|
+
*/
|
|
59
|
+
export declare function startHealthServer(port?: number): Promise<http.Server>;
|
|
60
|
+
/**
|
|
61
|
+
* Stop the health HTTP server
|
|
62
|
+
*/
|
|
63
|
+
export declare function stopHealthServer(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Check if health server is running
|
|
66
|
+
*/
|
|
67
|
+
export declare function isHealthServerRunning(): boolean;
|
|
68
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/lib/health.ts"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,YAAY,EAAE;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzD,OAAO,EAAE;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACrD,CAAC;IACF,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAcD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAK7E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAKnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGvE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAoD9C;AAmED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAwB3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBhD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C"}
|