fix: winget-Pfad dynamisch suchen (Service laeuft als SYSTEM ohne WindowsApps im PATH)
This commit is contained in:
parent
a97b17a682
commit
0f496a54e7
@ -19,12 +19,40 @@ type Message struct {
|
|||||||
Data interface{} `json:"data,omitempty"` // Agent -> Backend (Response)
|
Data interface{} `json:"data,omitempty"` // Agent -> Backend (Response)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Handler struct{}
|
type Handler struct {
|
||||||
|
wingetPath string
|
||||||
|
}
|
||||||
|
|
||||||
func NewHandler() *Handler {
|
func NewHandler() *Handler {
|
||||||
return &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 {
|
func (h *Handler) Handle(raw []byte) []byte {
|
||||||
var msg Message
|
var msg Message
|
||||||
if err := json.Unmarshal(raw, &msg); err != nil {
|
if err := json.Unmarshal(raw, &msg); err != nil {
|
||||||
@ -97,11 +125,13 @@ func (h *Handler) handleExec(msg Message) Message {
|
|||||||
// handleWingetList listet installierte Software auf
|
// handleWingetList listet installierte Software auf
|
||||||
func (h *Handler) handleWingetList(msg Message) Message {
|
func (h *Handler) handleWingetList(msg Message) Message {
|
||||||
resp := Message{Type: "response", ID: msg.ID}
|
resp := Message{Type: "response", ID: msg.ID}
|
||||||
out, err := runPS("winget list --accept-source-agreements 2>&1")
|
wp := h.winget()
|
||||||
if err != nil {
|
if wp == "" {
|
||||||
resp.Status = "error"
|
resp.Status = "error"; resp.Error = "winget nicht gefunden"; return resp
|
||||||
resp.Error = err.Error()
|
}
|
||||||
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.Status = "ok"
|
||||||
resp.Data = map[string]interface{}{"output": out}
|
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{}) }
|
if data == nil { data, _ = msg.Data.(map[string]interface{}) }
|
||||||
pkg, _ := data["package"].(string)
|
pkg, _ := data["package"].(string)
|
||||||
if pkg == "" {
|
if pkg == "" {
|
||||||
resp.Status = "error"
|
resp.Status = "error"; resp.Error = "Kein Paket angegeben"; return resp
|
||||||
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)
|
out, err := runWithTimeout(cmd, 300)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
resp.Status = "error"
|
resp.Status = "error"
|
||||||
@ -139,11 +171,13 @@ func (h *Handler) handleWingetUpgrade(msg Message) Message {
|
|||||||
if data == nil { data, _ = msg.Data.(map[string]interface{}) }
|
if data == nil { data, _ = msg.Data.(map[string]interface{}) }
|
||||||
pkg, _ := data["package"].(string)
|
pkg, _ := data["package"].(string)
|
||||||
if pkg == "" {
|
if pkg == "" {
|
||||||
resp.Status = "error"
|
resp.Status = "error"; resp.Error = "Kein Paket angegeben"; return resp
|
||||||
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)
|
out, err := runWithTimeout(cmd, 300)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
resp.Status = "error"
|
resp.Status = "error"
|
||||||
@ -158,7 +192,11 @@ func (h *Handler) handleWingetUpgrade(msg Message) Message {
|
|||||||
// handleWingetUpgradeAll aktualisiert alle Pakete
|
// handleWingetUpgradeAll aktualisiert alle Pakete
|
||||||
func (h *Handler) handleWingetUpgradeAll(msg Message) Message {
|
func (h *Handler) handleWingetUpgradeAll(msg Message) Message {
|
||||||
resp := Message{Type: "response", ID: msg.ID}
|
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 {
|
if err != nil {
|
||||||
resp.Status = "error"
|
resp.Status = "error"
|
||||||
resp.Error = err.Error()
|
resp.Error = err.Error()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user