MCPcopy Create free account
hub / github.com/PatchMon/PatchMon / runPatch

Function runPatch

agent-source-code/cmd/patchmon-agent/commands/serve.go:2197–2499  ·  view source on GitHub ↗

When dryRun is true, simulates and sends dry_run_completed instead of completed.

(patchRunID, patchType string, packageNames []string, dryRun bool)

Source from the content-addressed store, hash-verified

2195
2196// When dryRun is true, simulates and sends dry_run_completed instead of completed.
2197func runPatch(patchRunID, patchType string, packageNames []string, dryRun bool) error {
2198 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
2199 defer cancel()
2200
2201 // Register cancel fn so the server can request an interrupt via "patch_run_stop".
2202 patchRunCancels.Store(patchRunID, cancel)
2203 defer patchRunCancels.Delete(patchRunID)
2204
2205 httpClient := client.New(cfgManager, logger)
2206 packageMgr := packages.New(logger, packages.CacheRefreshConfig{
2207 Mode: cfgManager.GetPackageCacheRefreshMode(),
2208 MaxAge: cfgManager.GetPackageCacheRefreshMaxAge(),
2209 })
2210 pkgManager := packageMgr.DetectPackageManager()
2211
2212 if pkgManager == "windows" {
2213 return runPatchWindows(ctx, httpClient, patchRunID, patchType, packageNames, dryRun)
2214 }
2215
2216 if pkgManager != "apt" && pkgManager != "dnf" && pkgManager != "yum" && pkgManager != "pkg" && pkgManager != "pacman" {
2217 errMsg := fmt.Sprintf("package manager %q not supported for patching (apt, dnf, yum, pkg, pacman required)", pkgManager)
2218 _ = httpClient.SendPatchOutput(ctx, patchRunID, "failed", "", errMsg)
2219 return fmt.Errorf("%s", errMsg)
2220 }
2221
2222 var env []string
2223 var upgradeBin string
2224 var freeBSDUpdateBin string
2225 freeBSDPkgTargets := packageNames
2226 includeFreeBSDBase := pkgManager == "pkg" && patchType == "patch_all"
2227 switch pkgManager {
2228 case "apt":
2229 if _, err := exec.LookPath("apt-get"); err != nil {
2230 _ = httpClient.SendPatchOutput(ctx, patchRunID, "failed", "", "apt-get not found: not a Debian/Ubuntu system or apt not installed")
2231 return fmt.Errorf("apt-get not found: %w", err)
2232 }
2233 env = append(os.Environ(), "DEBIAN_FRONTEND=noninteractive")
2234 upgradeBin = "apt-get"
2235 case "pkg":
2236 freeBSDPkgTargets, includeFreeBSDBase = splitFreeBSDPatchTargets(packageNames)
2237 upgradeBin = packages.GetPkgBinaryPath()
2238 env = append(os.Environ(), "ASSUME_ALWAYS_YES=YES", "PAGER=cat")
2239 if includeFreeBSDBase {
2240 var err error
2241 freeBSDUpdateBin, err = getFreeBSDUpdateBinaryPath()
2242 if err != nil {
2243 _ = httpClient.SendPatchOutput(ctx, patchRunID, "failed", "", "freebsd-update not found: cannot patch FreeBSD base system")
2244 return fmt.Errorf("freebsd-update not found: %w", err)
2245 }
2246 }
2247 case "pacman":
2248 if _, err := exec.LookPath("pacman"); err != nil {
2249 _ = httpClient.SendPatchOutput(ctx, patchRunID, "failed", "", "pacman not found: Arch Linux package manager not installed")
2250 return fmt.Errorf("pacman not found: %w", err)
2251 }
2252 upgradeBin = "pacman"
2253 default: // dnf, yum
2254 if _, err := exec.LookPath(pkgManager); err != nil {

Callers 1

runServiceLoopFunction · 0.85

Calls 15

runPatchWindowsFunction · 0.85
splitFreeBSDPatchTargetsFunction · 0.85
newStreamSinkFunction · 0.85
formatCmdFunction · 0.85
runStreamingPatchStepFunction · 0.85
isDryRunExit1SuccessFunction · 0.85
patchRunTrailerFunction · 0.85
sendReportFunction · 0.85
DetectPackageManagerMethod · 0.80

Tested by

no test coverage detected