diff --git a/src/app/_components/ScriptDetailModal.tsx b/src/app/_components/ScriptDetailModal.tsx index b744fd0..1ca655f 100644 --- a/src/app/_components/ScriptDetailModal.tsx +++ b/src/app/_components/ScriptDetailModal.tsx @@ -19,6 +19,21 @@ import { import { Button } from "./ui/button"; import { useRegisterModal } from "./modal/ModalStackProvider"; +function deriveScriptPath(scriptType: string, methodType: string, slug: string): string { + const type = (scriptType || "ct").toLowerCase().trim(); + const method = (methodType || "default").toLowerCase().trim(); + if (method === "alpine" && (type === "ct" || type === "lxc")) return `ct/alpine-${slug}.sh`; + switch (type) { + case "ct": + case "lxc": return `ct/${slug}.sh`; + case "pve": return `tools/pve/${slug}.sh`; + case "addon": return `tools/addon/${slug}.sh`; + case "vm": return `vm/${slug}.sh`; + case "turnkey": return `turnkey/${slug}.sh`; + default: return `ct/${slug}.sh`; + } +} + interface ScriptDetailModalProps { script: Script | null; isOpen: boolean; @@ -190,12 +205,12 @@ export function ScriptDetailModal({ // Find the script path based on selected version type const versionType = selectedVersionType ?? "default"; const scriptMethod = - script.install_methods?.find( - (method) => method.type === versionType && method.script, - ) ?? script.install_methods?.find((method) => method.script); + script.install_methods?.find((method) => method.type === versionType) ?? + script.install_methods?.[0]; - if (scriptMethod?.script) { - const scriptPath = `scripts/${scriptMethod.script}`; + if (scriptMethod) { + const scriptFile = scriptMethod.script ?? deriveScriptPath(script.type, scriptMethod.type, script.slug); + const scriptPath = `scripts/${scriptFile}`; const scriptName = script.name; // Pass execution mode, server info, and envVars to the parent diff --git a/src/server/api/routers/scripts.ts b/src/server/api/routers/scripts.ts index 118f7cb..d8b3d07 100644 --- a/src/server/api/routers/scripts.ts +++ b/src/server/api/routers/scripts.ts @@ -38,6 +38,7 @@ function pbToScript(pb: PBScript): Script { description: pb.description, install_methods: pb.install_methods_json.map((m) => ({ type: m.type, + script: m.script, resources: m.resources, config_path: m.config_path, })), diff --git a/src/server/services/pbScripts.ts b/src/server/services/pbScripts.ts index 3f17fe3..386539a 100644 --- a/src/server/services/pbScripts.ts +++ b/src/server/services/pbScripts.ts @@ -24,6 +24,7 @@ export interface PBScriptType { export interface PBInstallMethod { type: string; // "default", "alpine", etc. + script?: string; // e.g. "ct/adguard.sh" – present in local JSON scripts, absent in PocketBase records resources: { cpu: number; ram: number;