mas/Sources/MasKit/Commands/Reset.swift

92 lines
2.6 KiB
Swift
Raw Normal View History

//
// Reset.swift
// mas-cli
//
// Created by Andrew Naylor on 14/09/2016.
// Copyright © 2016 Andrew Naylor. All rights reserved.
//
2018-07-04 14:56:10 -06:00
import Commandant
2018-10-14 13:41:19 -06:00
import CommerceKit
2018-07-04 14:56:10 -06:00
2019-01-11 18:28:03 -07:00
/// Kills several macOS processes as a means to reset the app store.
public struct ResetCommand: CommandProtocol {
public typealias Options = ResetOptions
public let verb = "reset"
public let function = "Resets the Mac App Store"
public init() {}
2018-12-27 14:02:14 -07:00
2019-01-11 18:28:03 -07:00
/// Runs the command.
2021-03-21 22:46:17 -07:00
public func run(_ options: Options) -> Result<Void, MASError> {
2021-03-28 17:30:55 -07:00
// The "Reset Application" command in the Mac App Store debug menu performs
// the following steps
//
// - killall Dock
// - killall storeagent (storeagent no longer exists)
// - rm com.apple.appstore download directory
// - clear cookies (appears to be a no-op)
//
// As storeagent no longer exists we will implement a slight variant and kill all
// App Store-associated processes
// - storeaccountd
// - storeassetd
// - storedownloadd
// - storeinstalld
// - storelegacy
2018-12-27 14:02:14 -07:00
// Kill processes
let killProcs = [
"Dock",
"storeaccountd",
"storeassetd",
"storedownloadd",
"storeinstalld",
2021-03-21 22:25:18 -07:00
"storelegacy",
]
2018-12-27 14:02:14 -07:00
2016-09-17 13:58:38 +01:00
let kill = Process()
let stdout = Pipe()
let stderr = Pipe()
2018-12-27 14:02:14 -07:00
kill.launchPath = "/usr/bin/killall"
kill.arguments = killProcs
kill.standardOutput = stdout
kill.standardError = stderr
2018-12-27 14:02:14 -07:00
kill.launch()
kill.waitUntilExit()
2018-12-27 14:02:14 -07:00
2019-01-29 23:15:24 -07:00
if kill.terminationStatus != 0, options.debug {
let output = stderr.fileHandleForReading.readDataToEndOfFile()
printInfo("killall failed:\r\n\(String(data: output, encoding: String.Encoding.utf8)!)")
}
2018-12-27 14:02:14 -07:00
// Wipe Download Directory
if let directory = CKDownloadDirectory(nil) {
do {
try FileManager.default.removeItem(atPath: directory)
} catch {
if options.debug {
printError("removeItemAtPath:\"\(directory)\" failed, \(error)")
}
}
}
2016-09-17 13:58:38 +01:00
return .success(())
}
}
public struct ResetOptions: OptionsProtocol {
let debug: Bool
public static func create(debug: Bool) -> ResetOptions {
2021-03-21 22:46:17 -07:00
ResetOptions(debug: debug)
2016-09-17 13:58:38 +01:00
}
2019-01-11 18:06:02 -07:00
public static func evaluate(_ mode: CommandMode) -> Result<ResetOptions, CommandantError<MASError>> {
2021-03-21 22:46:17 -07:00
create
2019-01-11 18:06:02 -07:00
<*> mode <| Switch(flag: nil, key: "debug", usage: "Enable debug mode")
}
}