package utils import ( "bufio" "bytes" "encoding/json" "fmt" "os" "os/exec" "runtime" "strings" ) func WriteFile(path, content string) { if err := os.WriteFile(path, []byte(content), 0644); err != nil { fmt.Printf("[ERROR] Failed to write file %s: %v\n", path, err) os.Exit(1) } } func CommandExists(cmd string) bool { _, err := exec.LookPath(cmd) return err == nil } func RunCommand(name string, args ...string) error { cmd := exec.Command(name, args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() } func RunCommandQuiet(name string, args ...string) error { cmd := exec.Command(name, args...) cmd.Stderr = os.Stderr return cmd.Run() } func RunCommandInDir(dir string, name string, args ...string) error { cmd := exec.Command(name, args...) cmd.Dir = dir cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() } func RunCommandOutput(name string, args ...string) ([]byte, error) { cmd := exec.Command(name, args...) var stdout bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return nil, err } return stdout.Bytes(), nil } func RunCommandOutputInDir(dir string, name string, args ...string) ([]byte, error) { cmd := exec.Command(name, args...) cmd.Dir = dir var stdout bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return nil, err } return stdout.Bytes(), nil } func RunCommandJSON(target any, name string, args ...string) error { output, err := RunCommandOutput(name, args...) if err != nil { return err } return json.Unmarshal(output, target) } func HandleKubectlCacheError(err error) bool { if err == nil || !strings.Contains(err.Error(), "no matches for kind") { return false } fmt.Println("\n[DIAGNOSIS] A common kubectl cache issue was detected.") fmt.Println("This happens when kubectl's local cache is out of sync with the cluster, often after installing new CRDs.") fmt.Print("Would you like to attempt to clear the cache now? (y/N): ") reader := bufio.NewReader(os.Stdin) response, _ := reader.ReadString('\n') if strings.TrimSpace(strings.ToLower(response)) != "y" { fmt.Println("[INFO] Operation cancelled by user.") return false } var cmd *exec.Cmd var shell string if runtime.GOOS == "windows" { shell = "PowerShell" cmd = exec.Command("powershell", "-NoProfile", "-NonInteractive", "-Command", "Remove-Item -Path $env:USERPROFILE\\.kube\\cache -Recurse -Force") } else { shell = "shell" homeDir, homeErr := os.UserHomeDir() if homeErr != nil { fmt.Printf("[ERROR] Could not determine home directory to clear cache: %v\n", homeErr) return false } cachePath := fmt.Sprintf("%s/.kube/cache", homeDir) cmd = exec.Command("rm", "-rf", cachePath) } fmt.Printf("[INFO] Attempting to clear kubectl cache using %s...\n", shell) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Printf("[ERROR] Failed to clear kubectl cache: %v\n", err) return false } fmt.Println("[SUCCESS] Kubectl cache cleared successfully.") return true }