When dryRun is true, simulates and sends dry_run_completed instead of completed.
(patchRunID, patchType string, packageNames []string, dryRun bool)
| 2195 | |
| 2196 | // When dryRun is true, simulates and sends dry_run_completed instead of completed. |
| 2197 | func 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 { |
no test coverage detected