@serve.zone/gitops 2.13.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.
- package/.smartconfig.json +114 -0
- package/binary/gitops.ts +4 -0
- package/changelog.md +185 -0
- package/cli.child.js +4 -0
- package/cli.js +4 -0
- package/cli.ts.js +5 -0
- package/deno.json +10 -0
- package/dist_serve/bundle.js +36362 -0
- package/dist_serve/index.html +33 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/cache/classes.cache.cleaner.d.ts +23 -0
- package/dist_ts/cache/classes.cache.cleaner.js +61 -0
- package/dist_ts/cache/classes.cached.document.d.ts +30 -0
- package/dist_ts/cache/classes.cached.document.js +101 -0
- package/dist_ts/cache/classes.cachedb.d.ts +22 -0
- package/dist_ts/cache/classes.cachedb.js +58 -0
- package/dist_ts/cache/classes.secrets.scan.service.d.ts +51 -0
- package/dist_ts/cache/classes.secrets.scan.service.js +237 -0
- package/dist_ts/cache/documents/classes.cached.project.d.ts +13 -0
- package/dist_ts/cache/documents/classes.cached.project.js +101 -0
- package/dist_ts/cache/documents/classes.cached.secret.d.ts +24 -0
- package/dist_ts/cache/documents/classes.cached.secret.js +158 -0
- package/dist_ts/cache/documents/index.d.ts +2 -0
- package/dist_ts/cache/documents/index.js +3 -0
- package/dist_ts/cache/index.d.ts +7 -0
- package/dist_ts/cache/index.js +6 -0
- package/dist_ts/classes/actionlog.d.ts +19 -0
- package/dist_ts/classes/actionlog.js +44 -0
- package/dist_ts/classes/connectionmanager.d.ts +57 -0
- package/dist_ts/classes/connectionmanager.js +247 -0
- package/dist_ts/classes/gitopsapp.d.ts +30 -0
- package/dist_ts/classes/gitopsapp.js +101 -0
- package/dist_ts/classes/jobmanager.d.ts +47 -0
- package/dist_ts/classes/jobmanager.js +301 -0
- package/dist_ts/classes/jobrunners/autobookstackdocs.runner.d.ts +29 -0
- package/dist_ts/classes/jobrunners/autobookstackdocs.runner.js +361 -0
- package/dist_ts/classes/jobrunners/base.jobrunner.d.ts +14 -0
- package/dist_ts/classes/jobrunners/base.jobrunner.js +3 -0
- package/dist_ts/classes/jobrunners/index.d.ts +5 -0
- package/dist_ts/classes/jobrunners/index.js +14 -0
- package/dist_ts/classes/managedsecrets.manager.d.ts +47 -0
- package/dist_ts/classes/managedsecrets.manager.js +247 -0
- package/dist_ts/classes/syncmanager.d.ts +189 -0
- package/dist_ts/classes/syncmanager.js +1787 -0
- package/dist_ts/index.d.ts +6 -0
- package/dist_ts/index.js +32 -0
- package/dist_ts/logging.d.ts +49 -0
- package/dist_ts/logging.js +134 -0
- package/dist_ts/opsserver/classes.opsserver.d.ts +25 -0
- package/dist_ts/opsserver/classes.opsserver.js +70 -0
- package/dist_ts/opsserver/handlers/actionlog.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/actionlog.handler.js +24 -0
- package/dist_ts/opsserver/handlers/actions.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/actions.handler.js +38 -0
- package/dist_ts/opsserver/handlers/admin.handler.d.ts +19 -0
- package/dist_ts/opsserver/handlers/admin.handler.js +96 -0
- package/dist_ts/opsserver/handlers/connections.handler.d.ts +10 -0
- package/dist_ts/opsserver/handlers/connections.handler.js +109 -0
- package/dist_ts/opsserver/handlers/groups.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/groups.handler.js +24 -0
- package/dist_ts/opsserver/handlers/index.d.ts +13 -0
- package/dist_ts/opsserver/handlers/index.js +14 -0
- package/dist_ts/opsserver/handlers/jobs.handler.d.ts +16 -0
- package/dist_ts/opsserver/handlers/jobs.handler.js +146 -0
- package/dist_ts/opsserver/handlers/logs.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/logs.handler.js +21 -0
- package/dist_ts/opsserver/handlers/managedsecrets.handler.d.ts +11 -0
- package/dist_ts/opsserver/handlers/managedsecrets.handler.js +110 -0
- package/dist_ts/opsserver/handlers/pipelines.handler.d.ts +31 -0
- package/dist_ts/opsserver/handlers/pipelines.handler.js +204 -0
- package/dist_ts/opsserver/handlers/projects.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/projects.handler.js +24 -0
- package/dist_ts/opsserver/handlers/secrets.handler.d.ts +10 -0
- package/dist_ts/opsserver/handlers/secrets.handler.js +171 -0
- package/dist_ts/opsserver/handlers/sync.handler.d.ts +16 -0
- package/dist_ts/opsserver/handlers/sync.handler.js +166 -0
- package/dist_ts/opsserver/handlers/webhook.handler.d.ts +7 -0
- package/dist_ts/opsserver/handlers/webhook.handler.js +55 -0
- package/dist_ts/opsserver/helpers/guards.d.ts +5 -0
- package/dist_ts/opsserver/helpers/guards.js +12 -0
- package/dist_ts/opsserver/index.d.ts +1 -0
- package/dist_ts/opsserver/index.js +2 -0
- package/dist_ts/paths.d.ts +9 -0
- package/dist_ts/paths.js +13 -0
- package/dist_ts/plugins.d.ts +25 -0
- package/dist_ts/plugins.js +32 -0
- package/dist_ts/providers/classes.baseprovider.d.ts +51 -0
- package/dist_ts/providers/classes.baseprovider.js +17 -0
- package/dist_ts/providers/classes.giteaprovider.d.ts +40 -0
- package/dist_ts/providers/classes.giteaprovider.js +224 -0
- package/dist_ts/providers/classes.gitlabprovider.d.ts +39 -0
- package/dist_ts/providers/classes.gitlabprovider.js +207 -0
- package/dist_ts/providers/index.d.ts +3 -0
- package/dist_ts/providers/index.js +4 -0
- package/dist_ts/storage/classes.storagemanager.d.ts +33 -0
- package/dist_ts/storage/classes.storagemanager.js +135 -0
- package/dist_ts/storage/index.d.ts +2 -0
- package/dist_ts/storage/index.js +2 -0
- package/dist_ts/timers.d.ts +4 -0
- package/dist_ts/timers.js +24 -0
- package/dist_ts_bundled/bundle.d.ts +4 -0
- package/dist_ts_bundled/bundle.js +12 -0
- package/dist_ts_interfaces/data/actionlog.d.ts +12 -0
- package/dist_ts_interfaces/data/actionlog.js +2 -0
- package/dist_ts_interfaces/data/branch.d.ts +8 -0
- package/dist_ts_interfaces/data/branch.js +2 -0
- package/dist_ts_interfaces/data/connection.d.ts +12 -0
- package/dist_ts_interfaces/data/connection.js +2 -0
- package/dist_ts_interfaces/data/group.d.ts +10 -0
- package/dist_ts_interfaces/data/group.js +2 -0
- package/dist_ts_interfaces/data/identity.d.ts +7 -0
- package/dist_ts_interfaces/data/identity.js +2 -0
- package/dist_ts_interfaces/data/index.d.ts +11 -0
- package/dist_ts_interfaces/data/index.js +12 -0
- package/dist_ts_interfaces/data/job.d.ts +37 -0
- package/dist_ts_interfaces/data/job.js +2 -0
- package/dist_ts_interfaces/data/managedsecret.d.ts +37 -0
- package/dist_ts_interfaces/data/managedsecret.js +2 -0
- package/dist_ts_interfaces/data/pipeline.d.ts +22 -0
- package/dist_ts_interfaces/data/pipeline.js +2 -0
- package/dist_ts_interfaces/data/project.d.ts +12 -0
- package/dist_ts_interfaces/data/project.js +2 -0
- package/dist_ts_interfaces/data/secret.d.ts +11 -0
- package/dist_ts_interfaces/data/secret.js +2 -0
- package/dist_ts_interfaces/data/sync.d.ts +34 -0
- package/dist_ts_interfaces/data/sync.js +2 -0
- package/dist_ts_interfaces/index.d.ts +5 -0
- package/dist_ts_interfaces/index.js +8 -0
- package/dist_ts_interfaces/plugins.d.ts +2 -0
- package/dist_ts_interfaces/plugins.js +4 -0
- package/dist_ts_interfaces/requests/actionlog.d.ts +15 -0
- package/dist_ts_interfaces/requests/actionlog.js +3 -0
- package/dist_ts_interfaces/requests/actions.d.ts +31 -0
- package/dist_ts_interfaces/requests/actions.js +3 -0
- package/dist_ts_interfaces/requests/admin.d.ts +31 -0
- package/dist_ts_interfaces/requests/admin.js +3 -0
- package/dist_ts_interfaces/requests/connections.d.ts +71 -0
- package/dist_ts_interfaces/requests/connections.js +3 -0
- package/dist_ts_interfaces/requests/groups.d.ts +14 -0
- package/dist_ts_interfaces/requests/groups.js +3 -0
- package/dist_ts_interfaces/requests/index.d.ts +13 -0
- package/dist_ts_interfaces/requests/index.js +14 -0
- package/dist_ts_interfaces/requests/jobs.d.ts +86 -0
- package/dist_ts_interfaces/requests/jobs.js +3 -0
- package/dist_ts_interfaces/requests/logs.d.ts +14 -0
- package/dist_ts_interfaces/requests/logs.js +3 -0
- package/dist_ts_interfaces/requests/managedsecrets.d.ts +84 -0
- package/dist_ts_interfaces/requests/managedsecrets.js +3 -0
- package/dist_ts_interfaces/requests/pipelines.d.ts +55 -0
- package/dist_ts_interfaces/requests/pipelines.js +3 -0
- package/dist_ts_interfaces/requests/projects.d.ts +14 -0
- package/dist_ts_interfaces/requests/projects.js +3 -0
- package/dist_ts_interfaces/requests/secrets.d.ts +72 -0
- package/dist_ts_interfaces/requests/secrets.js +3 -0
- package/dist_ts_interfaces/requests/sync.d.ts +120 -0
- package/dist_ts_interfaces/requests/sync.js +3 -0
- package/dist_ts_interfaces/requests/webhook.d.ts +13 -0
- package/dist_ts_interfaces/requests/webhook.js +3 -0
- package/license +21 -0
- package/package.json +81 -0
- package/readme.md +177 -0
- package/readme.todo.md +3 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/cache/classes.cache.cleaner.ts +69 -0
- package/ts/cache/classes.cached.document.ts +57 -0
- package/ts/cache/classes.cachedb.ts +72 -0
- package/ts/cache/classes.secrets.scan.service.ts +267 -0
- package/ts/cache/documents/classes.cached.project.ts +32 -0
- package/ts/cache/documents/classes.cached.secret.ts +81 -0
- package/ts/cache/documents/index.ts +2 -0
- package/ts/cache/index.ts +7 -0
- package/ts/classes/actionlog.ts +57 -0
- package/ts/classes/connectionmanager.ts +263 -0
- package/ts/classes/gitopsapp.ts +128 -0
- package/ts/classes/jobmanager.ts +337 -0
- package/ts/classes/jobrunners/autobookstackdocs.runner.ts +435 -0
- package/ts/classes/jobrunners/base.jobrunner.ts +16 -0
- package/ts/classes/jobrunners/index.ts +17 -0
- package/ts/classes/managedsecrets.manager.ts +322 -0
- package/ts/classes/syncmanager.ts +2117 -0
- package/ts/index.ts +37 -0
- package/ts/logging.ts +162 -0
- package/ts/opsserver/classes.opsserver.ts +86 -0
- package/ts/opsserver/handlers/actionlog.handler.ts +30 -0
- package/ts/opsserver/handlers/actions.handler.ts +50 -0
- package/ts/opsserver/handlers/admin.handler.ts +122 -0
- package/ts/opsserver/handlers/connections.handler.ts +162 -0
- package/ts/opsserver/handlers/groups.handler.ts +32 -0
- package/ts/opsserver/handlers/index.ts +13 -0
- package/ts/opsserver/handlers/jobs.handler.ts +189 -0
- package/ts/opsserver/handlers/logs.handler.ts +29 -0
- package/ts/opsserver/handlers/managedsecrets.handler.ts +158 -0
- package/ts/opsserver/handlers/pipelines.handler.ts +281 -0
- package/ts/opsserver/handlers/projects.handler.ts +32 -0
- package/ts/opsserver/handlers/secrets.handler.ts +224 -0
- package/ts/opsserver/handlers/sync.handler.ts +224 -0
- package/ts/opsserver/handlers/webhook.handler.ts +62 -0
- package/ts/opsserver/helpers/guards.ts +16 -0
- package/ts/opsserver/index.ts +1 -0
- package/ts/paths.ts +19 -0
- package/ts/plugins.ts +38 -0
- package/ts/providers/classes.baseprovider.ts +99 -0
- package/ts/providers/classes.giteaprovider.ts +279 -0
- package/ts/providers/classes.gitlabprovider.ts +265 -0
- package/ts/providers/index.ts +3 -0
- package/ts/storage/classes.storagemanager.ts +144 -0
- package/ts/storage/index.ts +2 -0
- package/ts/timers.ts +34 -0
- package/ts_interfaces/data/actionlog.ts +13 -0
- package/ts_interfaces/data/branch.ts +9 -0
- package/ts_interfaces/data/connection.ts +13 -0
- package/ts_interfaces/data/group.ts +10 -0
- package/ts_interfaces/data/identity.ts +7 -0
- package/ts_interfaces/data/index.ts +11 -0
- package/ts_interfaces/data/job.ts +42 -0
- package/ts_interfaces/data/managedsecret.ts +41 -0
- package/ts_interfaces/data/pipeline.ts +32 -0
- package/ts_interfaces/data/project.ts +12 -0
- package/ts_interfaces/data/secret.ts +11 -0
- package/ts_interfaces/data/sync.ts +37 -0
- package/ts_interfaces/index.ts +9 -0
- package/ts_interfaces/plugins.ts +6 -0
- package/ts_interfaces/requests/actionlog.ts +19 -0
- package/ts_interfaces/requests/actions.ts +39 -0
- package/ts_interfaces/requests/admin.ts +43 -0
- package/ts_interfaces/requests/connections.ts +95 -0
- package/ts_interfaces/requests/groups.ts +18 -0
- package/ts_interfaces/requests/index.ts +13 -0
- package/ts_interfaces/requests/jobs.ts +118 -0
- package/ts_interfaces/requests/logs.ts +18 -0
- package/ts_interfaces/requests/managedsecrets.ts +112 -0
- package/ts_interfaces/requests/pipelines.ts +71 -0
- package/ts_interfaces/requests/projects.ts +18 -0
- package/ts_interfaces/requests/secrets.ts +92 -0
- package/ts_interfaces/requests/sync.ts +157 -0
- package/ts_interfaces/requests/webhook.ts +18 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/appstate.ts +1251 -0
- package/ts_web/elements/gitops-dashboard.ts +350 -0
- package/ts_web/elements/index.ts +10 -0
- package/ts_web/elements/shared/css.ts +29 -0
- package/ts_web/elements/shared/index.ts +1 -0
- package/ts_web/elements/views/actionlog/index.ts +101 -0
- package/ts_web/elements/views/actions/index.ts +209 -0
- package/ts_web/elements/views/buildlog/index.ts +196 -0
- package/ts_web/elements/views/connections/index.ts +260 -0
- package/ts_web/elements/views/groups/index.ts +134 -0
- package/ts_web/elements/views/jobs/index.ts +424 -0
- package/ts_web/elements/views/managedsecrets/index.ts +502 -0
- package/ts_web/elements/views/overview/index.ts +86 -0
- package/ts_web/elements/views/pipelines/index.ts +561 -0
- package/ts_web/elements/views/projects/index.ts +149 -0
- package/ts_web/elements/views/secrets/index.ts +310 -0
- package/ts_web/elements/views/sync/index.ts +512 -0
- package/ts_web/index.ts +7 -0
- package/ts_web/plugins.ts +15 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { logger } from '../logging.js';
|
|
2
|
+
const ACTIONLOG_PREFIX = '/actionlog/';
|
|
3
|
+
/**
|
|
4
|
+
* Persists and queries action log entries via StorageManager.
|
|
5
|
+
* Entries are stored as individual JSON files keyed by timestamp-id.
|
|
6
|
+
*/
|
|
7
|
+
export class ActionLog {
|
|
8
|
+
storageManager;
|
|
9
|
+
constructor(storageManager) {
|
|
10
|
+
this.storageManager = storageManager;
|
|
11
|
+
}
|
|
12
|
+
async append(entry) {
|
|
13
|
+
const full = {
|
|
14
|
+
id: crypto.randomUUID(),
|
|
15
|
+
timestamp: Date.now(),
|
|
16
|
+
...entry,
|
|
17
|
+
};
|
|
18
|
+
const key = `${ACTIONLOG_PREFIX}${String(full.timestamp).padStart(16, '0')}-${full.id}.json`;
|
|
19
|
+
await this.storageManager.setJSON(key, full);
|
|
20
|
+
logger.debug(`Action logged: ${full.actionType} ${full.entityType} "${full.entityName}"`);
|
|
21
|
+
return full;
|
|
22
|
+
}
|
|
23
|
+
async query(opts = {}) {
|
|
24
|
+
const limit = opts.limit ?? 50;
|
|
25
|
+
const offset = opts.offset ?? 0;
|
|
26
|
+
const keys = await this.storageManager.list(ACTIONLOG_PREFIX);
|
|
27
|
+
// Sort by key descending (newest first — keys are timestamp-prefixed)
|
|
28
|
+
keys.sort((a, b) => b.localeCompare(a));
|
|
29
|
+
// Load all entries (or filter by entityType)
|
|
30
|
+
let entries = [];
|
|
31
|
+
for (const key of keys) {
|
|
32
|
+
const entry = await this.storageManager.getJSON(key);
|
|
33
|
+
if (entry) {
|
|
34
|
+
if (opts.entityType && entry.entityType !== opts.entityType)
|
|
35
|
+
continue;
|
|
36
|
+
entries.push(entry);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const total = entries.length;
|
|
40
|
+
entries = entries.slice(offset, offset + limit);
|
|
41
|
+
return { entries, total };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ubG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY2xhc3Nlcy9hY3Rpb25sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUl2QyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUV2Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNaLGNBQWMsQ0FBaUI7SUFFdkMsWUFBWSxjQUE4QjtRQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFnRTtRQUMzRSxNQUFNLElBQUksR0FBb0M7WUFDNUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsR0FBRyxLQUFLO1NBQ1QsQ0FBQztRQUNGLE1BQU0sR0FBRyxHQUFHLEdBQUcsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUM3RixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDMUYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUlSLEVBQUU7UUFDSixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVoQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDOUQsc0VBQXNFO1FBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEMsNkNBQTZDO1FBQzdDLElBQUksT0FBTyxHQUFzQyxFQUFFLENBQUM7UUFDcEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFrQyxHQUFHLENBQUMsQ0FBQztZQUN0RixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVO29CQUFFLFNBQVM7Z0JBQ3RFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzdCLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFFaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
import { BaseProvider } from '../providers/index.js';
|
|
4
|
+
import type { StorageManager } from '../storage/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Manages provider connections — persists each connection as an
|
|
7
|
+
* individual JSON file via StorageManager. Tokens are stored in
|
|
8
|
+
* the OS keychain (or encrypted file fallback) via SmartSecret.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ConnectionManager {
|
|
11
|
+
private connections;
|
|
12
|
+
private storageManager;
|
|
13
|
+
private smartSecret;
|
|
14
|
+
/** Resolves when background connection health checks complete */
|
|
15
|
+
healthCheckDone: Promise<void>;
|
|
16
|
+
constructor(storageManager: StorageManager, smartSecret: plugins.smartsecret.SmartSecret);
|
|
17
|
+
init(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Tests all loaded connections in the background and updates their status.
|
|
20
|
+
* Fire-and-forget — does not block startup.
|
|
21
|
+
*/
|
|
22
|
+
private testAllConnections;
|
|
23
|
+
/**
|
|
24
|
+
* One-time migration from the legacy .nogit/connections.json file.
|
|
25
|
+
*/
|
|
26
|
+
private migrateLegacyFile;
|
|
27
|
+
private loadConnections;
|
|
28
|
+
/**
|
|
29
|
+
* Migrates a plaintext token to keychain storage.
|
|
30
|
+
*/
|
|
31
|
+
private migrateTokenToKeychain;
|
|
32
|
+
private persistConnection;
|
|
33
|
+
private removeConnection;
|
|
34
|
+
getConnections(): interfaces.data.IProviderConnection[];
|
|
35
|
+
getConnection(id: string): interfaces.data.IProviderConnection | undefined;
|
|
36
|
+
createConnection(name: string, providerType: interfaces.data.TProviderType, baseUrl: string, token: string, groupFilter?: string): Promise<interfaces.data.IProviderConnection>;
|
|
37
|
+
updateConnection(id: string, updates: {
|
|
38
|
+
name?: string;
|
|
39
|
+
baseUrl?: string;
|
|
40
|
+
token?: string;
|
|
41
|
+
groupFilter?: string;
|
|
42
|
+
}): Promise<interfaces.data.IProviderConnection>;
|
|
43
|
+
deleteConnection(id: string): Promise<void>;
|
|
44
|
+
pauseConnection(id: string, paused: boolean): Promise<interfaces.data.IProviderConnection>;
|
|
45
|
+
testConnection(id: string): Promise<{
|
|
46
|
+
ok: boolean;
|
|
47
|
+
error?: string;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Resolves a human-readable groupFilter to the provider-specific group ID.
|
|
51
|
+
*/
|
|
52
|
+
private resolveGroupFilterId;
|
|
53
|
+
/**
|
|
54
|
+
* Factory: returns the correct provider instance for a connection ID
|
|
55
|
+
*/
|
|
56
|
+
getProvider(connectionId: string): BaseProvider;
|
|
57
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { logger } from '../logging.js';
|
|
3
|
+
import { BaseProvider, GiteaProvider, GitLabProvider } from '../providers/index.js';
|
|
4
|
+
const LEGACY_CONNECTIONS_FILE = './.nogit/connections.json';
|
|
5
|
+
const CONNECTIONS_PREFIX = '/connections/';
|
|
6
|
+
const KEYCHAIN_PREFIX = 'keychain:';
|
|
7
|
+
/**
|
|
8
|
+
* Manages provider connections — persists each connection as an
|
|
9
|
+
* individual JSON file via StorageManager. Tokens are stored in
|
|
10
|
+
* the OS keychain (or encrypted file fallback) via SmartSecret.
|
|
11
|
+
*/
|
|
12
|
+
export class ConnectionManager {
|
|
13
|
+
connections = [];
|
|
14
|
+
storageManager;
|
|
15
|
+
smartSecret;
|
|
16
|
+
/** Resolves when background connection health checks complete */
|
|
17
|
+
healthCheckDone = Promise.resolve();
|
|
18
|
+
constructor(storageManager, smartSecret) {
|
|
19
|
+
this.storageManager = storageManager;
|
|
20
|
+
this.smartSecret = smartSecret;
|
|
21
|
+
}
|
|
22
|
+
async init() {
|
|
23
|
+
await this.migrateLegacyFile();
|
|
24
|
+
await this.loadConnections();
|
|
25
|
+
// Auto-test all connections in the background
|
|
26
|
+
this.healthCheckDone = this.testAllConnections();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Tests all loaded connections in the background and updates their status.
|
|
30
|
+
* Fire-and-forget — does not block startup.
|
|
31
|
+
*/
|
|
32
|
+
async testAllConnections() {
|
|
33
|
+
for (const conn of this.connections) {
|
|
34
|
+
if (conn.status === 'paused')
|
|
35
|
+
continue;
|
|
36
|
+
try {
|
|
37
|
+
const provider = this.getProvider(conn.id);
|
|
38
|
+
const result = await provider.testConnection();
|
|
39
|
+
conn.status = result.ok ? 'connected' : 'error';
|
|
40
|
+
await this.persistConnection(conn);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
conn.status = 'error';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* One-time migration from the legacy .nogit/connections.json file.
|
|
49
|
+
*/
|
|
50
|
+
async migrateLegacyFile() {
|
|
51
|
+
try {
|
|
52
|
+
const text = await plugins.fs.readFile(LEGACY_CONNECTIONS_FILE, 'utf8');
|
|
53
|
+
const legacy = JSON.parse(text);
|
|
54
|
+
if (legacy.length > 0) {
|
|
55
|
+
logger.info(`Migrating ${legacy.length} connection(s) from legacy file...`);
|
|
56
|
+
for (const conn of legacy) {
|
|
57
|
+
await this.storageManager.setJSON(`${CONNECTIONS_PREFIX}${conn.id}.json`, conn);
|
|
58
|
+
}
|
|
59
|
+
// Rename legacy file so migration doesn't repeat
|
|
60
|
+
await plugins.fs.rename(LEGACY_CONNECTIONS_FILE, LEGACY_CONNECTIONS_FILE + '.migrated');
|
|
61
|
+
logger.success('Legacy connections migrated successfully');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// No legacy file or already migrated — nothing to do
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async loadConnections() {
|
|
69
|
+
const keys = await this.storageManager.list(CONNECTIONS_PREFIX);
|
|
70
|
+
this.connections = [];
|
|
71
|
+
for (const key of keys) {
|
|
72
|
+
const conn = await this.storageManager.getJSON(key);
|
|
73
|
+
if (conn) {
|
|
74
|
+
// Migrate legacy baseGroup/baseGroupId property names
|
|
75
|
+
if (conn.baseGroup !== undefined && conn.groupFilter === undefined) {
|
|
76
|
+
conn.groupFilter = conn.baseGroup;
|
|
77
|
+
delete conn.baseGroup;
|
|
78
|
+
}
|
|
79
|
+
if (conn.baseGroupId !== undefined && conn.groupFilterId === undefined) {
|
|
80
|
+
conn.groupFilterId = conn.baseGroupId;
|
|
81
|
+
delete conn.baseGroupId;
|
|
82
|
+
}
|
|
83
|
+
if (conn.token.startsWith(KEYCHAIN_PREFIX)) {
|
|
84
|
+
// Token is in keychain — retrieve it
|
|
85
|
+
const realToken = await this.smartSecret.getSecret(conn.id);
|
|
86
|
+
if (realToken) {
|
|
87
|
+
conn.token = realToken;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
logger.warn(`Could not retrieve token for connection ${conn.id} from keychain`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (conn.token && conn.token !== '***') {
|
|
94
|
+
// Plaintext token found — auto-migrate to keychain
|
|
95
|
+
await this.migrateTokenToKeychain(conn);
|
|
96
|
+
}
|
|
97
|
+
this.connections.push(conn);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (this.connections.length > 0) {
|
|
101
|
+
logger.info(`Loaded ${this.connections.length} connection(s)`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
logger.debug('No existing connections found, starting fresh');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Migrates a plaintext token to keychain storage.
|
|
109
|
+
*/
|
|
110
|
+
async migrateTokenToKeychain(conn) {
|
|
111
|
+
try {
|
|
112
|
+
await this.smartSecret.setSecret(conn.id, conn.token);
|
|
113
|
+
// Save sentinel to JSON file
|
|
114
|
+
const jsonConn = { ...conn, token: `${KEYCHAIN_PREFIX}${conn.id}` };
|
|
115
|
+
await this.storageManager.setJSON(`${CONNECTIONS_PREFIX}${conn.id}.json`, jsonConn);
|
|
116
|
+
logger.info(`Migrated token for connection "${conn.name}" to keychain`);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
logger.warn(`Failed to migrate token for ${conn.id} to keychain: ${err}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async persistConnection(conn) {
|
|
123
|
+
// Store real token in keychain
|
|
124
|
+
await this.smartSecret.setSecret(conn.id, conn.token);
|
|
125
|
+
// Save JSON with sentinel value
|
|
126
|
+
const jsonConn = { ...conn, token: `${KEYCHAIN_PREFIX}${conn.id}` };
|
|
127
|
+
await this.storageManager.setJSON(`${CONNECTIONS_PREFIX}${conn.id}.json`, jsonConn);
|
|
128
|
+
}
|
|
129
|
+
async removeConnection(id) {
|
|
130
|
+
await this.smartSecret.deleteSecret(id);
|
|
131
|
+
await this.storageManager.delete(`${CONNECTIONS_PREFIX}${id}.json`);
|
|
132
|
+
}
|
|
133
|
+
getConnections() {
|
|
134
|
+
return this.connections.map((c) => ({ ...c, token: '***' }));
|
|
135
|
+
}
|
|
136
|
+
getConnection(id) {
|
|
137
|
+
return this.connections.find((c) => c.id === id);
|
|
138
|
+
}
|
|
139
|
+
async createConnection(name, providerType, baseUrl, token, groupFilter) {
|
|
140
|
+
const connection = {
|
|
141
|
+
id: crypto.randomUUID(),
|
|
142
|
+
name,
|
|
143
|
+
providerType,
|
|
144
|
+
baseUrl: baseUrl.replace(/\/+$/, ''),
|
|
145
|
+
token,
|
|
146
|
+
createdAt: Date.now(),
|
|
147
|
+
status: 'disconnected',
|
|
148
|
+
groupFilter: groupFilter || undefined,
|
|
149
|
+
};
|
|
150
|
+
this.connections.push(connection);
|
|
151
|
+
await this.persistConnection(connection);
|
|
152
|
+
logger.success(`Connection created: ${name} (${providerType})`);
|
|
153
|
+
return { ...connection, token: '***' };
|
|
154
|
+
}
|
|
155
|
+
async updateConnection(id, updates) {
|
|
156
|
+
const conn = this.connections.find((c) => c.id === id);
|
|
157
|
+
if (!conn)
|
|
158
|
+
throw new Error(`Connection not found: ${id}`);
|
|
159
|
+
if (updates.name)
|
|
160
|
+
conn.name = updates.name;
|
|
161
|
+
if (updates.baseUrl)
|
|
162
|
+
conn.baseUrl = updates.baseUrl.replace(/\/+$/, '');
|
|
163
|
+
if (updates.token)
|
|
164
|
+
conn.token = updates.token;
|
|
165
|
+
if (updates.groupFilter !== undefined) {
|
|
166
|
+
conn.groupFilter = updates.groupFilter || undefined;
|
|
167
|
+
conn.groupFilterId = undefined; // Will be re-resolved on next test
|
|
168
|
+
}
|
|
169
|
+
await this.persistConnection(conn);
|
|
170
|
+
return { ...conn, token: '***' };
|
|
171
|
+
}
|
|
172
|
+
async deleteConnection(id) {
|
|
173
|
+
const idx = this.connections.findIndex((c) => c.id === id);
|
|
174
|
+
if (idx === -1)
|
|
175
|
+
throw new Error(`Connection not found: ${id}`);
|
|
176
|
+
this.connections.splice(idx, 1);
|
|
177
|
+
await this.removeConnection(id);
|
|
178
|
+
logger.info(`Connection deleted: ${id}`);
|
|
179
|
+
}
|
|
180
|
+
async pauseConnection(id, paused) {
|
|
181
|
+
const conn = this.connections.find((c) => c.id === id);
|
|
182
|
+
if (!conn)
|
|
183
|
+
throw new Error(`Connection not found: ${id}`);
|
|
184
|
+
conn.status = paused ? 'paused' : 'disconnected';
|
|
185
|
+
await this.persistConnection(conn);
|
|
186
|
+
logger.info(`Connection ${paused ? 'paused' : 'resumed'}: ${conn.name}`);
|
|
187
|
+
return { ...conn, token: '***' };
|
|
188
|
+
}
|
|
189
|
+
async testConnection(id) {
|
|
190
|
+
const conn = this.connections.find((c) => c.id === id);
|
|
191
|
+
if (conn.status === 'paused') {
|
|
192
|
+
return { ok: false, error: 'Connection is paused' };
|
|
193
|
+
}
|
|
194
|
+
const provider = this.getProvider(id);
|
|
195
|
+
const result = await provider.testConnection();
|
|
196
|
+
conn.status = result.ok ? 'connected' : 'error';
|
|
197
|
+
// Resolve group filter ID if connection has a groupFilter
|
|
198
|
+
if (result.ok && conn.groupFilter) {
|
|
199
|
+
await this.resolveGroupFilterId(conn);
|
|
200
|
+
}
|
|
201
|
+
await this.persistConnection(conn);
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Resolves a human-readable groupFilter to the provider-specific group ID.
|
|
206
|
+
*/
|
|
207
|
+
async resolveGroupFilterId(conn) {
|
|
208
|
+
if (!conn.groupFilter) {
|
|
209
|
+
conn.groupFilterId = undefined;
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
if (conn.providerType === 'gitlab') {
|
|
214
|
+
const gitlabClient = new plugins.gitlabClient.GitLabClient(conn.baseUrl, conn.token);
|
|
215
|
+
const group = await gitlabClient.getGroup(conn.groupFilter);
|
|
216
|
+
conn.groupFilterId = String(group.id);
|
|
217
|
+
logger.info(`Resolved group filter "${conn.groupFilter}" to ID ${conn.groupFilterId}`);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// For Gitea, the org name IS the ID
|
|
221
|
+
conn.groupFilterId = conn.groupFilter;
|
|
222
|
+
logger.info(`Group filter for Gitea connection set to org "${conn.groupFilterId}"`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
logger.warn(`Failed to resolve group filter "${conn.groupFilter}": ${err}`);
|
|
227
|
+
conn.groupFilterId = undefined;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Factory: returns the correct provider instance for a connection ID
|
|
232
|
+
*/
|
|
233
|
+
getProvider(connectionId) {
|
|
234
|
+
const conn = this.connections.find((c) => c.id === connectionId);
|
|
235
|
+
if (!conn)
|
|
236
|
+
throw new Error(`Connection not found: ${connectionId}`);
|
|
237
|
+
switch (conn.providerType) {
|
|
238
|
+
case 'gitea':
|
|
239
|
+
return new GiteaProvider(conn.id, conn.baseUrl, conn.token, conn.groupFilterId);
|
|
240
|
+
case 'gitlab':
|
|
241
|
+
return new GitLabProvider(conn.id, conn.baseUrl, conn.token, conn.groupFilterId);
|
|
242
|
+
default:
|
|
243
|
+
throw new Error(`Unknown provider type: ${conn.providerType}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jbGFzc2VzL2Nvbm5lY3Rpb25tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHcEYsTUFBTSx1QkFBdUIsR0FBRywyQkFBMkIsQ0FBQztBQUM1RCxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQztBQUMzQyxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUM7QUFFcEM7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDcEIsV0FBVyxHQUEwQyxFQUFFLENBQUM7SUFDeEQsY0FBYyxDQUFpQjtJQUMvQixXQUFXLENBQWtDO0lBQ3JELGlFQUFpRTtJQUMxRCxlQUFlLEdBQWtCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUUxRCxZQUFZLGNBQThCLEVBQUUsV0FBNEM7UUFDdEYsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM3Qiw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQjtRQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxJ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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { ConnectionManager } from './connectionmanager.js';
|
|
3
|
+
import { ActionLog } from './actionlog.js';
|
|
4
|
+
import { SyncManager } from './syncmanager.js';
|
|
5
|
+
import { ManagedSecretsManager } from './managedsecrets.manager.js';
|
|
6
|
+
import { JobManager } from './jobmanager.js';
|
|
7
|
+
import { OpsServer } from '../opsserver/index.js';
|
|
8
|
+
import { StorageManager } from '../storage/index.js';
|
|
9
|
+
import { CacheDb, CacheCleaner, SecretsScanService } from '../cache/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Main GitOps application orchestrator
|
|
12
|
+
*/
|
|
13
|
+
export declare class GitopsApp {
|
|
14
|
+
storageManager: StorageManager;
|
|
15
|
+
smartSecret: plugins.smartsecret.SmartSecret;
|
|
16
|
+
connectionManager: ConnectionManager;
|
|
17
|
+
actionLog: ActionLog;
|
|
18
|
+
opsServer: OpsServer;
|
|
19
|
+
cacheDb: CacheDb;
|
|
20
|
+
cacheCleaner: CacheCleaner;
|
|
21
|
+
syncManager: SyncManager;
|
|
22
|
+
managedSecretsManager: ManagedSecretsManager;
|
|
23
|
+
jobManager: JobManager;
|
|
24
|
+
secretsScanService: SecretsScanService;
|
|
25
|
+
private scanIntervalId;
|
|
26
|
+
private paths;
|
|
27
|
+
constructor();
|
|
28
|
+
start(port?: number): Promise<void>;
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { logger } from '../logging.js';
|
|
3
|
+
import { ConnectionManager } from './connectionmanager.js';
|
|
4
|
+
import { ActionLog } from './actionlog.js';
|
|
5
|
+
import { SyncManager } from './syncmanager.js';
|
|
6
|
+
import { ManagedSecretsManager } from './managedsecrets.manager.js';
|
|
7
|
+
import { JobManager } from './jobmanager.js';
|
|
8
|
+
import { OpsServer } from '../opsserver/index.js';
|
|
9
|
+
import { StorageManager } from '../storage/index.js';
|
|
10
|
+
import { CacheDb, CacheCleaner, CachedProject, CachedSecret, SecretsScanService } from '../cache/index.js';
|
|
11
|
+
import { resolvePaths } from '../paths.js';
|
|
12
|
+
import { unrefTimer } from '../timers.js';
|
|
13
|
+
/**
|
|
14
|
+
* Main GitOps application orchestrator
|
|
15
|
+
*/
|
|
16
|
+
export class GitopsApp {
|
|
17
|
+
storageManager;
|
|
18
|
+
smartSecret;
|
|
19
|
+
connectionManager;
|
|
20
|
+
actionLog;
|
|
21
|
+
opsServer;
|
|
22
|
+
cacheDb;
|
|
23
|
+
cacheCleaner;
|
|
24
|
+
syncManager;
|
|
25
|
+
managedSecretsManager;
|
|
26
|
+
jobManager;
|
|
27
|
+
secretsScanService;
|
|
28
|
+
scanIntervalId = null;
|
|
29
|
+
paths;
|
|
30
|
+
constructor() {
|
|
31
|
+
const paths = resolvePaths();
|
|
32
|
+
this.paths = paths;
|
|
33
|
+
this.storageManager = new StorageManager({
|
|
34
|
+
backend: 'filesystem',
|
|
35
|
+
fsPath: paths.defaultStoragePath,
|
|
36
|
+
});
|
|
37
|
+
this.smartSecret = new plugins.smartsecret.SmartSecret({ service: 'gitops' });
|
|
38
|
+
this.connectionManager = new ConnectionManager(this.storageManager, this.smartSecret);
|
|
39
|
+
this.actionLog = new ActionLog(this.storageManager);
|
|
40
|
+
this.cacheDb = CacheDb.getInstance({
|
|
41
|
+
storagePath: paths.defaultTsmDbPath,
|
|
42
|
+
dbName: 'gitops_cache',
|
|
43
|
+
});
|
|
44
|
+
this.cacheCleaner = new CacheCleaner(this.cacheDb);
|
|
45
|
+
this.cacheCleaner.registerClass(CachedProject);
|
|
46
|
+
this.cacheCleaner.registerClass(CachedSecret);
|
|
47
|
+
this.opsServer = new OpsServer(this);
|
|
48
|
+
}
|
|
49
|
+
async start(port = 3000) {
|
|
50
|
+
logger.info('Initializing GitOps...');
|
|
51
|
+
// Start CacheDb
|
|
52
|
+
await this.cacheDb.start();
|
|
53
|
+
// Initialize connection manager (loads saved connections)
|
|
54
|
+
await this.connectionManager.init();
|
|
55
|
+
// Initialize managed secrets manager
|
|
56
|
+
this.managedSecretsManager = new ManagedSecretsManager(this.storageManager, this.smartSecret, this.connectionManager);
|
|
57
|
+
await this.managedSecretsManager.init();
|
|
58
|
+
// Initialize sync manager
|
|
59
|
+
this.syncManager = new SyncManager(this.storageManager, this.connectionManager, this.actionLog);
|
|
60
|
+
await this.syncManager.init();
|
|
61
|
+
// Initialize job manager
|
|
62
|
+
this.jobManager = new JobManager(this.storageManager, this.connectionManager, this.actionLog, this.smartSecret);
|
|
63
|
+
await this.jobManager.init();
|
|
64
|
+
// Initialize secrets scan service with 24h auto-scan
|
|
65
|
+
this.secretsScanService = new SecretsScanService(this.connectionManager);
|
|
66
|
+
const SCAN_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
67
|
+
this.scanIntervalId = setInterval(() => {
|
|
68
|
+
this.secretsScanService.fullScan().catch((err) => {
|
|
69
|
+
logger.error(`Scheduled secrets scan failed: ${err}`);
|
|
70
|
+
});
|
|
71
|
+
}, SCAN_INTERVAL_MS);
|
|
72
|
+
unrefTimer(this.scanIntervalId);
|
|
73
|
+
// Fire-and-forget initial scan (doesn't block startup)
|
|
74
|
+
this.secretsScanService.fullScan().catch((err) => {
|
|
75
|
+
logger.error(`Initial secrets scan failed: ${err}`);
|
|
76
|
+
});
|
|
77
|
+
// Start CacheCleaner
|
|
78
|
+
this.cacheCleaner.start();
|
|
79
|
+
// Start OpsServer
|
|
80
|
+
await this.opsServer.start(port);
|
|
81
|
+
logger.success('GitOps initialized successfully');
|
|
82
|
+
}
|
|
83
|
+
async stop() {
|
|
84
|
+
logger.info('Shutting down GitOps...');
|
|
85
|
+
if (this.scanIntervalId !== null) {
|
|
86
|
+
clearInterval(this.scanIntervalId);
|
|
87
|
+
this.scanIntervalId = null;
|
|
88
|
+
}
|
|
89
|
+
await this.opsServer.stop();
|
|
90
|
+
if (this.jobManager) {
|
|
91
|
+
await this.jobManager.stop();
|
|
92
|
+
}
|
|
93
|
+
if (this.syncManager) {
|
|
94
|
+
await this.syncManager.stop();
|
|
95
|
+
}
|
|
96
|
+
this.cacheCleaner.stop();
|
|
97
|
+
await this.cacheDb.stop();
|
|
98
|
+
logger.success('GitOps shutdown complete');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0b3BzYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY2xhc3Nlcy9naXRvcHNhcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNiLGNBQWMsQ0FBaUI7SUFDL0IsV0FBVyxDQUFrQztJQUM3QyxpQkFBaUIsQ0FBb0I7SUFDckMsU0FBUyxDQUFZO0lBQ3JCLFNBQVMsQ0FBWTtJQUNyQixPQUFPLENBQVU7SUFDakIsWUFBWSxDQUFlO0lBQzNCLFdBQVcsQ0FBZTtJQUMxQixxQkFBcUIsQ0FBeUI7SUFDOUMsVUFBVSxDQUFjO0lBQ3hCLGtCQUFrQixDQUFzQjtJQUN2QyxjQUFjLEdB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
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
import type { ConnectionManager } from './connectionmanager.js';
|
|
4
|
+
import type { ActionLog } from './actionlog.js';
|
|
5
|
+
import type { StorageManager } from '../storage/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Manages job configurations: CRUD, scheduling, and execution dispatch.
|
|
8
|
+
* Job-type-specific logic is delegated to registered runners.
|
|
9
|
+
*/
|
|
10
|
+
export declare class JobManager {
|
|
11
|
+
private storageManager;
|
|
12
|
+
private connectionManager;
|
|
13
|
+
private actionLog;
|
|
14
|
+
private smartSecret;
|
|
15
|
+
private jobs;
|
|
16
|
+
private timers;
|
|
17
|
+
private runningJobs;
|
|
18
|
+
private activeJobExecutions;
|
|
19
|
+
private stopping;
|
|
20
|
+
constructor(storageManager: StorageManager, connectionManager: ConnectionManager, actionLog: ActionLog, smartSecret: plugins.smartsecret.SmartSecret);
|
|
21
|
+
init(): Promise<void>;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
getJobs(): interfaces.data.IJobConfig[];
|
|
24
|
+
getJob(id: string): interfaces.data.IJobConfig | undefined;
|
|
25
|
+
createJob(data: {
|
|
26
|
+
name: string;
|
|
27
|
+
jobType: interfaces.data.TJobType;
|
|
28
|
+
intervalMinutes: number;
|
|
29
|
+
autoBookstackDocsConfig?: interfaces.data.IAutoBookstackDocsConfig;
|
|
30
|
+
}): Promise<interfaces.data.IJobConfig>;
|
|
31
|
+
updateJob(id: string, updates: {
|
|
32
|
+
name?: string;
|
|
33
|
+
intervalMinutes?: number;
|
|
34
|
+
autoBookstackDocsConfig?: interfaces.data.IAutoBookstackDocsConfig;
|
|
35
|
+
}): Promise<interfaces.data.IJobConfig>;
|
|
36
|
+
deleteJob(id: string): Promise<void>;
|
|
37
|
+
pauseJob(id: string, paused: boolean): Promise<interfaces.data.IJobConfig>;
|
|
38
|
+
executeJob(jobId: string, force?: boolean): Promise<void>;
|
|
39
|
+
private executeJobInternal;
|
|
40
|
+
isJobRunning(jobId: string): boolean;
|
|
41
|
+
private loadJobs;
|
|
42
|
+
private persistJob;
|
|
43
|
+
private storeBookstackToken;
|
|
44
|
+
private maskSecrets;
|
|
45
|
+
private startTimer;
|
|
46
|
+
private stopTimer;
|
|
47
|
+
}
|