2026-10-18 15:19:57 -07:00
|
|
|
import Foundation
|
|
|
|
|
import Sparkle
|
|
|
|
|
|
|
|
|
|
private let lastVersionKey = "lastLaunchedVersion"
|
|
|
|
|
|
|
|
|
|
@MainActor
|
|
|
|
|
final class Updater {
|
|
|
|
|
static let shared = Updater()
|
|
|
|
|
private lazy var controller = SPUStandardUpdaterController(startingUpdater: true, updaterDelegate: nil, userDriverDelegate: nil)
|
|
|
|
|
|
|
|
|
|
func start() {
|
|
|
|
|
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String
|
|
|
|
|
let last = UserDefaults.standard.string(forKey: lastVersionKey)
|
|
|
|
|
UserDefaults.standard.set(version, forKey: lastVersionKey)
|
|
|
|
|
if last != nil && last != version {
|
|
|
|
|
restartServer()
|
|
|
|
|
}
|
|
|
|
|
_ = controller
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func check() {
|
|
|
|
|
controller.checkForUpdates(nil)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private func restartServer() {
|
2026-10-18 16:14:03 -07:00
|
|
|
guard let data = try? Data(contentsOf: agentPlist),
|
2026-10-18 15:19:57 -07:00
|
|
|
let plist = try? PropertyListDecoder().decode(LaunchAgent.self, from: data),
|
2026-10-18 16:14:03 -07:00
|
|
|
plist.programArguments.first == serverHelper
|
2026-10-18 15:19:57 -07:00
|
|
|
else {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
let p = Process()
|
|
|
|
|
p.executableURL = URL(filePath: "/bin/launchctl")
|
|
|
|
|
p.arguments = ["kickstart", "-k", "gui/\(getuid())/run.fc.byre"]
|
|
|
|
|
do {
|
|
|
|
|
try p.run()
|
|
|
|
|
p.waitUntilExit()
|
|
|
|
|
log.info("restarted byre server: status \(p.terminationStatus)")
|
|
|
|
|
} catch {
|
|
|
|
|
log.error("restart byre server: \(errorText(error), privacy: .public)")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|