From 2daa38ac35df36be73de174d26152ac511bf10d0 Mon Sep 17 00:00:00 2001 From: osy <50960678+osy@users.noreply.github.com> Date: Fri, 16 Dec 2022 13:56:56 -0800 Subject: [PATCH] scripting: add support for disposible mode --- Scripting/UTM.sdef | 5 ++++- Scripting/UTMScripting.swift | 2 +- Scripting/UTMScriptingVirtualMachineImpl.swift | 11 ++++++++++- utmctl/UTMCtl.swift | 5 ++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Scripting/UTM.sdef b/Scripting/UTM.sdef index 1fc018c2..393ea21b 100644 --- a/Scripting/UTM.sdef +++ b/Scripting/UTM.sdef @@ -141,11 +141,14 @@ + + + - + diff --git a/Scripting/UTMScripting.swift b/Scripting/UTMScripting.swift index 900344f1..07524c62 100644 --- a/Scripting/UTMScripting.swift +++ b/Scripting/UTMScripting.swift @@ -125,7 +125,7 @@ extension SBObject: UTMScriptingWindow {} @objc optional var memory: String { get } // RAM size. @objc optional var backend: UTMScriptingBackend { get } // Emulation/virtualization engine used. @objc optional var status: UTMScriptingStatus { get } // Current running status. - @objc optional func start() + @objc optional func startSaving(_ saving: Bool) @objc optional func suspendSaving(_ saving: Bool) @objc optional func stopBy(_ by: UTMScriptingStopMethod) } diff --git a/Scripting/UTMScriptingVirtualMachineImpl.swift b/Scripting/UTMScriptingVirtualMachineImpl.swift index 1502ba48..97116dc2 100644 --- a/Scripting/UTMScriptingVirtualMachineImpl.swift +++ b/Scripting/UTMScriptingVirtualMachineImpl.swift @@ -121,7 +121,14 @@ class UTMScriptingVirtualMachineImpl: NSObject { } @objc func start(_ command: NSScriptCommand) { + let shouldSaveState = command.evaluatedArguments?["saveFlag"] as? Bool ?? true withScriptCommand(command) { [self] in + if !shouldSaveState { + guard let vm = vm as? UTMQemuVirtualMachine else { + throw ScriptingError.operationNotSupported + } + vm.isRunningAsSnapshot = true + } data.run(vm: vm, startImmediately: false) if vm.state == .vmStopped { try await vm.vmStart() @@ -134,7 +141,7 @@ class UTMScriptingVirtualMachineImpl: NSObject { } @objc func suspend(_ command: NSScriptCommand) { - let shouldSaveState = command.evaluatedArguments?["doneFlag"] as? Bool ?? false + let shouldSaveState = command.evaluatedArguments?["saveFlag"] as? Bool ?? false withScriptCommand(command) { [self] in try await vm.vmPause(save: shouldSaveState) } @@ -158,10 +165,12 @@ class UTMScriptingVirtualMachineImpl: NSObject { extension UTMScriptingVirtualMachineImpl { enum ScriptingError: Error, LocalizedError { case operationNotAvailable + case operationNotSupported var localizedDescription: String { switch self { case .operationNotAvailable: return NSLocalizedString("Operation not available.", comment: "UTMScriptingVirtualMachineImpl") + case .operationNotSupported: return NSLocalizedString("Operation not supported by the backend.", comment: "UTMScriptingVirtualMachineImpl") } } } diff --git a/utmctl/UTMCtl.swift b/utmctl/UTMCtl.swift index 8eed494a..2bb8be6f 100644 --- a/utmctl/UTMCtl.swift +++ b/utmctl/UTMCtl.swift @@ -203,9 +203,12 @@ extension UTMCtl { @Flag(name: .shortAndLong, help: "Attach to the first serial port after start.") var attach: Bool = false + @Flag(help: "Run VM as a snapshot and do not save changes to disk.") + var disposible: Bool = false + func run(with application: UTMScriptingApplication) throws { let vm = try virtualMachine(forIdentifier: identifer, in: application) - vm.start!() + vm.startSaving!(!disposible) if attach { var attachCommand = Attach() attachCommand.environment = environment