fix: winget-Pfad dynamisch suchen (Service laeuft als SYSTEM ohne WindowsApps im PATH)

This commit is contained in:
cynfo3000 2026-03-10 02:22:06 +01:00
parent a97b17a682
commit 0f496a54e7

View File

@ -19,12 +19,40 @@ type Message struct {
Data interface{} `json:"data,omitempty"` // Agent -> Backend (Response)
}
type Handler struct{}
type Handler struct {
wingetPath string
}
func NewHandler() *Handler {
return &Handler{}
}
// winget gibt den Pfad zu winget.exe zurueck (cached)
func (h *Handler) winget() string {
if h.wingetPath != "" {
return h.wingetPath
}
// Direkt im PATH?
if path, err := exec.LookPath("winget"); err == nil {
h.wingetPath = path
return path
}
// WindowsApps durchsuchen
script := `Get-ChildItem "C:\Program Files\WindowsApps" -Filter winget.exe -Recurse -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName`
cmd := exec.Command("powershell", "-NoProfile", "-NonInteractive", "-Command", script)
out, err := cmd.Output()
if err == nil {
path := strings.TrimSpace(string(out))
if path != "" {
h.wingetPath = path
log.Printf("winget gefunden: %s", path)
return path
}
}
log.Printf("winget nicht gefunden")
return ""
}
func (h *Handler) Handle(raw []byte) []byte {
var msg Message
if err := json.Unmarshal(raw, &msg); err != nil {
@ -97,11 +125,13 @@ func (h *Handler) handleExec(msg Message) Message {
// handleWingetList listet installierte Software auf
func (h *Handler) handleWingetList(msg Message) Message {
resp := Message{Type: "response", ID: msg.ID}
out, err := runPS("winget list --accept-source-agreements 2>&1")
if err != nil {
resp.Status = "error"
resp.Error = err.Error()
return resp
wp := h.winget()
if wp == "" {
resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp
}
out, err := runWithTimeout(fmt.Sprintf(`& "%s" list --accept-source-agreements 2>&1`, wp), 60)
if err != nil && out == "" {
resp.Status = "error"; resp.Error = err.Error(); return resp
}
resp.Status = "ok"
resp.Data = map[string]interface{}{"output": out}
@ -115,11 +145,13 @@ func (h *Handler) handleWingetInstall(msg Message) Message {
if data == nil { data, _ = msg.Data.(map[string]interface{}) }
pkg, _ := data["package"].(string)
if pkg == "" {
resp.Status = "error"
resp.Error = "Kein Paket angegeben"
return resp
resp.Status = "error"; resp.Error = "Kein Paket angegeben"; return resp
}
cmd := fmt.Sprintf("winget install --id %s --silent --accept-package-agreements --accept-source-agreements 2>&1", sanitize(pkg))
wp := h.winget()
if wp == "" {
resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp
}
cmd := fmt.Sprintf(`& "%s" install --id %s --silent --accept-package-agreements --accept-source-agreements 2>&1`, wp, sanitize(pkg))
out, err := runWithTimeout(cmd, 300)
if err != nil {
resp.Status = "error"
@ -139,11 +171,13 @@ func (h *Handler) handleWingetUpgrade(msg Message) Message {
if data == nil { data, _ = msg.Data.(map[string]interface{}) }
pkg, _ := data["package"].(string)
if pkg == "" {
resp.Status = "error"
resp.Error = "Kein Paket angegeben"
return resp
resp.Status = "error"; resp.Error = "Kein Paket angegeben"; return resp
}
cmd := fmt.Sprintf("winget upgrade --id %s --silent --accept-package-agreements --accept-source-agreements 2>&1", sanitize(pkg))
wp := h.winget()
if wp == "" {
resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp
}
cmd := fmt.Sprintf(`& "%s" upgrade --id %s --silent --accept-package-agreements --accept-source-agreements 2>&1`, wp, sanitize(pkg))
out, err := runWithTimeout(cmd, 300)
if err != nil {
resp.Status = "error"
@ -158,7 +192,11 @@ func (h *Handler) handleWingetUpgrade(msg Message) Message {
// handleWingetUpgradeAll aktualisiert alle Pakete
func (h *Handler) handleWingetUpgradeAll(msg Message) Message {
resp := Message{Type: "response", ID: msg.ID}
out, err := runWithTimeout("winget upgrade --all --silent --accept-package-agreements --accept-source-agreements 2>&1", 600)
wp := h.winget()
if wp == "" {
resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp
}
out, err := runWithTimeout(fmt.Sprintf(`& "%s" upgrade --all --silent --accept-package-agreements --accept-source-agreements 2>&1`, wp), 600)
if err != nil {
resp.Status = "error"
resp.Error = err.Error()