maidn-cli/internal/utils/helpers.go

124 lines
3 KiB
Go

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
}