import Foundation // Thin wrapper to call etc/init-port-fowards.sh for status/restart. enum PFScriptBridge { private static var scriptURL: URL { // Resolve script path: // 1) PROLE_HOME env var if set // 2) default to ~/dev/prole (matches existing scripts) let env = ProcessInfo.processInfo.environment let fm = FileManager.default if let home = env["PROLE_HOME"], !home.isEmpty { return URL(fileURLWithPath: home).appendingPathComponent("etc/init-port-fowards.sh") } let defaultHome = fm.homeDirectoryForCurrentUser.appendingPathComponent("dev/prole") return defaultHome.appendingPathComponent("etc/init-port-fowards.sh") } @discardableResult static func restart() -> (code: Int32, out: String, err: String) { return runScript(arg: "restart") } static func status() -> (code: Int32, out: String, err: String) { return runScript(arg: "status") } private static func runScript(arg: String) -> (code: Int32, out: String, err: String) { let p = Process() p.executableURL = scriptURL p.arguments = [arg] let outPipe = Pipe(); let errPipe = Pipe() p.standardOutput = outPipe p.standardError = errPipe do { try p.run() } catch { return (-1, "", String(describing: error)) } p.waitUntilExit() let out = String(data: outPipe.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) ?? "" let err = String(data: errPipe.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) ?? "" return (p.terminationStatus, out, err) } }