"use strict"; const path = require("node:path"); const { app } = require("electron"); const { ConfigStore } = require("../src/main/config-store.cjs"); const { GitService } = require("../src/main/git-service.cjs"); const { GiteaService } = require("../src/main/gitea-service.cjs"); const { RepositoryService } = require("../src/main/repository-service.cjs"); const { SshService } = require("../src/main/ssh-service.cjs"); const { UnraidDeploymentService } = require("../src/main/unraid-deployment-service.cjs"); const userDataPath = process.env.FORGEFLOW_USER_DATA ? path.resolve(process.env.FORGEFLOW_USER_DATA) : path.join(app.getPath("appData"), "forgeflow"); app.setPath("userData", userDataPath); app.whenReady().then(async () => { try { const configureAccess = process.argv.includes("--configure-access"); const repositoryFilter = new Set(String(process.argv.find((value) => value.startsWith("--repository=")) || "") .slice("--repository=".length).toLowerCase().split(",").map((value) => value.trim()).filter(Boolean)); const store = new ConfigStore(userDataPath); await store.load(); const git = new GitService(); const gitea = new GiteaService(store); const repositories = await new RepositoryService(store, git, gitea).refresh(); const ssh = new SshService({ store }); const deployments = new UnraidDeploymentService({ store, ssh, git, gitea, sourcePath: path.resolve(__dirname, "..") }); const reports = []; for (const server of store.data.servers || []) { const report = await deployments.scanServerInventory(server.id, repositories); const access = []; const seenProfiles = new Set(); for (const repository of repositories) { for (const profile of repository.deploymentProfiles || store.getDeploymentProfiles(repository.fullName) || []) { if (profile.serverId !== server.id || profile.deploymentMode !== "server-git" || seenProfiles.has(profile.id)) continue; seenProfiles.add(profile.id); try { access.push(await deployments.verifyServerGitProfile({ repository, profileId: profile.id })); } catch (error) { access.push({ repository: repository.fullName, profileId: profile.id, readiness: "Verification incomplete", ready: false, error: error.message }); } } } if (configureAccess) { const refreshedRepositories = await new RepositoryService(store, git, gitea).refresh(); for (const workload of report.workloads.filter((item) => item.runtime?.running && item.link?.profileId && item.link?.repositoryFullName)) { const repository = refreshedRepositories.find((item) => String(item.fullName).toLowerCase() === String(workload.link.repositoryFullName).toLowerCase()); if (!repository) continue; if (repositoryFilter.size && !repositoryFilter.has(String(repository.fullName).toLowerCase())) continue; try { const configured = await deployments.configureServerGitAccess({ repository, profileId: workload.link.profileId }); access.push({ repository: repository.fullName, profileId: workload.link.profileId, action: "configured", ready: true, created: configured.created, remoteSha: configured.remoteSha }); await new Promise((resolve) => setTimeout(resolve, 1500)); } catch (error) { access.push({ repository: repository.fullName, ready: false, error: error.message }); } } } reports.push({ server: server.name, capabilities: report.capabilities, warnings: (report.warnings || []).map((warning) => String(warning).slice(0, 300)), summary: { detected: report.detected, running: report.running, linked: report.linked, needsReview: report.needsReview, }, access, workloads: report.workloads.filter((workload) => workload.link || (workload.runtime?.running && workload.status !== "unmatched")).map((workload) => ({ name: workload.displayName, running: workload.runtime?.running === true, health: workload.runtime?.health || "unknown", repository: workload.link?.repositoryFullName || workload.suggestedRepository?.fullName || null, confidence: workload.matchConfidence || workload.status, folder: workload.remoteFolderCandidate || null, containers: (workload.containers || []).map((container) => container.name), })), }); } console.log(JSON.stringify(reports, null, 2)); } catch (error) { console.error(error?.stack || error?.message || String(error)); process.exitCode = 1; } finally { app.quit(); } });