Initial implementation of removepackages tool

This commit is contained in:
Greg Neagle
2024-08-01 10:31:15 -07:00
parent b03bd87632
commit 068d6e901c
3 changed files with 191 additions and 6 deletions
+125 -4
View File
@@ -116,7 +116,6 @@
C07A6FDA2C2CF19600090743 /* cliutils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07A6FD92C2CF19600090743 /* cliutils.swift */; };
C07A6FDB2C2CF19600090743 /* cliutils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07A6FD92C2CF19600090743 /* cliutils.swift */; };
C07A6FDC2C2CF19600090743 /* cliutils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07A6FD92C2CF19600090743 /* cliutils.swift */; };
C0C392D52C53F62700218A02 /* QuinnProcess.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C392D42C53F62700218A02 /* QuinnProcess.swift */; };
C0D00FA12C457E2B0021DA9C /* munkihash.swift in Sources */ = {isa = PBXBuildFile; fileRef = C030A98E2C39C135007F0B34 /* munkihash.swift */; };
C0D00FA22C457E4E0021DA9C /* display.swift in Sources */ = {isa = PBXBuildFile; fileRef = C01364572C3265D6008DB215 /* display.swift */; };
C0D00FA32C457E5F0021DA9C /* fileutils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C030A9B52C3DF6D0007F0B34 /* fileutils.swift */; };
@@ -137,6 +136,21 @@
C0D00FB82C45BCB90021DA9C /* errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D00FB52C45BCB90021DA9C /* errors.swift */; };
C0D00FB92C45BCB90021DA9C /* errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D00FB52C45BCB90021DA9C /* errors.swift */; };
C0D00FBA2C45BCB90021DA9C /* errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D00FB52C45BCB90021DA9C /* errors.swift */; };
C0E993F82C5BEDAB006FDF44 /* removepackages.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0E993F72C5BEDAB006FDF44 /* removepackages.swift */; };
C0E993FC2C5BEDE7006FDF44 /* rmpkgs.swift in Sources */ = {isa = PBXBuildFile; fileRef = C043ED222C483EEE0047C025 /* rmpkgs.swift */; };
C0E993FD2C5BEDFA006FDF44 /* display.swift in Sources */ = {isa = PBXBuildFile; fileRef = C01364572C3265D6008DB215 /* display.swift */; };
C0E993FE2C5BEE0D006FDF44 /* cliutils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07A6FD92C2CF19600090743 /* cliutils.swift */; };
C0E993FF2C5BEE1B006FDF44 /* fileutils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C030A9B52C3DF6D0007F0B34 /* fileutils.swift */; };
C0E994012C5BEE35006FDF44 /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = C0E994002C5BEE35006FDF44 /* ArgumentParser */; };
C0E994022C5BF4BD006FDF44 /* sqlite3.swift in Sources */ = {isa = PBXBuildFile; fileRef = C043ED1E2C4822C70047C025 /* sqlite3.swift */; };
C0E994032C5BF4CF006FDF44 /* munkilog.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07074DB2C33AE5F00B86310 /* munkilog.swift */; };
C0E994042C5BF4DC006FDF44 /* prefs.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07A6FAF2C2B22A400090743 /* prefs.swift */; };
C0E994052C5BF4E5006FDF44 /* reports.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07074DE2C33B9A000B86310 /* reports.swift */; };
C0E994062C5BF4F1006FDF44 /* constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07A6FB12C2B22D300090743 /* constants.swift */; };
C0E994072C5BF52E006FDF44 /* plistutils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C01364422C2DD1BA008DB215 /* plistutils.swift */; };
C0E994082C5BF53D006FDF44 /* errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D00FB52C45BCB90021DA9C /* errors.swift */; };
C0E994092C5BF54E006FDF44 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07A6FD12C2B654300090743 /* utils.swift */; };
C0E9940A2C5BF56C006FDF44 /* version.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D00FAF2C458EAA0021DA9C /* version.swift */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -185,6 +199,15 @@
);
runOnlyForDeploymentPostprocessing = 1;
};
C0E993F32C5BEDAB006FDF44 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
@@ -229,10 +252,11 @@
C07A6FD12C2B654300090743 /* utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = utils.swift; sourceTree = "<group>"; };
C07A6FD52C2B7F2100090743 /* FileRepo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileRepo.swift; sourceTree = "<group>"; };
C07A6FD92C2CF19600090743 /* cliutils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = cliutils.swift; sourceTree = "<group>"; };
C0C392D42C53F62700218A02 /* QuinnProcess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuinnProcess.swift; sourceTree = "<group>"; };
C0D00FA72C45814F0021DA9C /* repoutils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = repoutils.swift; sourceTree = "<group>"; };
C0D00FAF2C458EAA0021DA9C /* version.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = version.swift; sourceTree = "<group>"; };
C0D00FB52C45BCB90021DA9C /* errors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = errors.swift; sourceTree = "<group>"; };
C0E993F52C5BEDAB006FDF44 /* removepackages */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = removepackages; sourceTree = BUILT_PRODUCTS_DIR; };
C0E993F72C5BEDAB006FDF44 /* removepackages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = removepackages.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -277,6 +301,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
C0E993F22C5BEDAB006FDF44 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C0E994012C5BEE35006FDF44 /* ArgumentParser in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@@ -346,6 +378,7 @@
C07A6FC52C2B5C0700090743 /* makecatalogs */,
C030A9962C3A2E18007F0B34 /* makepkginfo */,
C030A9CE2C41F798007F0B34 /* munkiimport */,
C0E993F62C5BEDAB006FDF44 /* removepackages */,
C07A6FA62C2A82B400090743 /* Products */,
C01364502C311DFA008DB215 /* Frameworks */,
);
@@ -359,6 +392,7 @@
C07A6FC42C2B5C0700090743 /* makecatalogs */,
C030A9952C3A2E18007F0B34 /* makepkginfo */,
C030A9CD2C41F798007F0B34 /* munkiimport */,
C0E993F52C5BEDAB006FDF44 /* removepackages */,
);
name = Products;
sourceTree = "<group>";
@@ -414,11 +448,18 @@
C0D00FAF2C458EAA0021DA9C /* version.swift */,
C0D00FB52C45BCB90021DA9C /* errors.swift */,
C043ED1E2C4822C70047C025 /* sqlite3.swift */,
C0C392D42C53F62700218A02 /* QuinnProcess.swift */,
);
path = shared;
sourceTree = "<group>";
};
C0E993F62C5BEDAB006FDF44 /* removepackages */ = {
isa = PBXGroup;
children = (
C0E993F72C5BEDAB006FDF44 /* removepackages.swift */,
);
path = removepackages;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -522,6 +563,26 @@
productReference = C07A6FC42C2B5C0700090743 /* makecatalogs */;
productType = "com.apple.product-type.tool";
};
C0E993F42C5BEDAB006FDF44 /* removepackages */ = {
isa = PBXNativeTarget;
buildConfigurationList = C0E993FB2C5BEDAB006FDF44 /* Build configuration list for PBXNativeTarget "removepackages" */;
buildPhases = (
C0E993F12C5BEDAB006FDF44 /* Sources */,
C0E993F22C5BEDAB006FDF44 /* Frameworks */,
C0E993F32C5BEDAB006FDF44 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = removepackages;
packageProductDependencies = (
C0E994002C5BEE35006FDF44 /* ArgumentParser */,
);
productName = removepackages;
productReference = C0E993F52C5BEDAB006FDF44 /* removepackages */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -549,6 +610,9 @@
C07A6FC32C2B5C0700090743 = {
CreatedOnToolsVersion = 15.4;
};
C0E993F42C5BEDAB006FDF44 = {
CreatedOnToolsVersion = 15.4;
};
};
};
buildConfigurationList = C07A6FA02C2A82B400090743 /* Build configuration list for PBXProject "munki" */;
@@ -572,6 +636,7 @@
C07A6FC32C2B5C0700090743 /* makecatalogs */,
C030A9942C3A2E18007F0B34 /* makepkginfo */,
C030A9CC2C41F798007F0B34 /* munkiimport */,
C0E993F42C5BEDAB006FDF44 /* removepackages */,
);
};
/* End PBXProject section */
@@ -663,7 +728,6 @@
C030A9B62C3DF6D0007F0B34 /* fileutils.swift in Sources */,
C01364582C3265D6008DB215 /* display.swift in Sources */,
C07A6FD22C2B654300090743 /* utils.swift in Sources */,
C0C392D52C53F62700218A02 /* QuinnProcess.swift in Sources */,
C07074EB2C34A6AD00B86310 /* versionutils.swift in Sources */,
C030A9BF2C409738007F0B34 /* iconutils.swift in Sources */,
C043ED232C483EEE0047C025 /* rmpkgs.swift in Sources */,
@@ -736,6 +800,27 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
C0E993F12C5BEDAB006FDF44 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C0E994052C5BF4E5006FDF44 /* reports.swift in Sources */,
C0E994032C5BF4CF006FDF44 /* munkilog.swift in Sources */,
C0E993F82C5BEDAB006FDF44 /* removepackages.swift in Sources */,
C0E994062C5BF4F1006FDF44 /* constants.swift in Sources */,
C0E993FC2C5BEDE7006FDF44 /* rmpkgs.swift in Sources */,
C0E993FF2C5BEE1B006FDF44 /* fileutils.swift in Sources */,
C0E994092C5BF54E006FDF44 /* utils.swift in Sources */,
C0E994022C5BF4BD006FDF44 /* sqlite3.swift in Sources */,
C0E993FE2C5BEE0D006FDF44 /* cliutils.swift in Sources */,
C0E994082C5BF53D006FDF44 /* errors.swift in Sources */,
C0E9940A2C5BF56C006FDF44 /* version.swift in Sources */,
C0E994072C5BF52E006FDF44 /* plistutils.swift in Sources */,
C0E994042C5BF4DC006FDF44 /* prefs.swift in Sources */,
C0E993FD2C5BEDFA006FDF44 /* display.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
@@ -1001,6 +1086,28 @@
};
name = Release;
};
C0E993F92C5BEDAB006FDF44 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 52ZFZKM6BK;
ENABLE_HARDENED_RUNTIME = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
C0E993FA2C5BEDAB006FDF44 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 52ZFZKM6BK;
ENABLE_HARDENED_RUNTIME = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -1058,6 +1165,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C0E993FB2C5BEDAB006FDF44 /* Build configuration list for PBXNativeTarget "removepackages" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C0E993F92C5BEDAB006FDF44 /* Debug */,
C0E993FA2C5BEDAB006FDF44 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
@@ -1097,6 +1213,11 @@
package = C07A6FCD2C2B62A600090743 /* XCRemoteSwiftPackageReference "swift-argument-parser" */;
productName = ArgumentParser;
};
C0E994002C5BEE35006FDF44 /* ArgumentParser */ = {
isa = XCSwiftPackageProductDependency;
package = C07A6FCD2C2B62A600090743 /* XCRemoteSwiftPackageReference "swift-argument-parser" */;
productName = ArgumentParser;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = C07A6F9D2C2A82B400090743 /* Project object */;
@@ -1,5 +1,5 @@
//
// main.swift
// removepackages.swift
// removepackages
//
// Created by Greg Neagle on 8/1/24.
@@ -21,3 +21,66 @@
import ArgumentParser
import Foundation
@main
struct RemovePackages: AsyncParsableCommand {
static let configuration = CommandConfiguration(
commandName: "removepackages",
abstract: "Removes files installed by one or more package identifiers",
usage: "removepackages [options] package_id ..."
)
@Flag(name: [.short, .customLong("forcedeletebundles")],
help: "Delete bundles even if they aren't empty.")
var forceDeleteBundles = false
@Flag(name: [.short, .customLong("listfiles")],
help: "List the filesystem objects to be removed, but do not actually remove them.")
var listFiles = false
@Flag(name: [.customLong("rebuildpkgdb")],
help: "Force a rebuild of the internal package database.")
var rebuildPkgDB = false
@Flag(name: [.customLong("noremovereceipts")],
help: "Do not remove receipts from internal package database or Apple's package database.")
var noRemoveReceipts = false
@Flag(name: [.customLong("noupdateapplepkgdb")],
help: "Do not update Apple's package database. If --noremovereceipts is also given, this is implied")
var noUpdateApplePkgDB = false
@Flag(name: [.short, .customLong("munkistatusoutput")],
help: "Output is formatted for use with MunkiStatus/Managed Software Center.")
var munkiStatusOutput = false
@Flag(name: .shortAndLong,
help: "More verbose output. May be specified multiple times.")
var verbose: Int
@Argument
var pkgids: [String]
mutating func validate() throws {}
mutating func run() async throws {
// make sure we're running as root or via sudo (unless --listfiles is given)
if !listFiles, NSUserName() != "root" {
printStderr("ERROR: This tool must be run as the root user or via sudo!")
throw ExitCode(-1)
}
// TODO: actually implement --munkistatusputput and --verbose
let returnCode = await removePackages(
pkgids,
forceDeleteBundles: forceDeleteBundles,
listFiles: listFiles,
rebuildPkgDB: rebuildPkgDB,
noRemoveReceipts: noRemoveReceipts,
noUpdateApplePkgDB: noUpdateApplePkgDB
)
if returnCode != 0 {
throw ExitCode(Int32(returnCode))
}
}
}
+2 -1
View File
@@ -588,8 +588,9 @@ func removePackages(
displayMinorStatus("Nothing to remove.")
} else if listFiles {
// only print the paths to be removed; don't actually remove them
print("The following filesystem items would be removed:")
for path in pathsToRemove.sorted() {
print("/" + path)
print(" /" + path)
}
} else {
// TODO: munkistatus.disableStopButton()