mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-05-02 02:22:06 -04:00
system updater: complete overhaul
Move system update flow to GO, with a CLI (convenient AIO tool) and server integration. All lifecycle, scheduling, execution occurs on backend side. Run some backends via pkexec, some via terminal like paru/yay. Incorporate flatpak as an option to update. Add terminal override setting in GUI, in addition to $TERMINAL env variable. fixes #2307 fixes #822 fixes #1102 fixes #1812 fixes #1087 fixes #1743
This commit is contained in:
78
core/internal/server/sysupdate/backend_zypper.go
Normal file
78
core/internal/server/sysupdate/backend_zypper.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package sysupdate
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
func init() {
|
||||
RegisterSystemBackend(func() Backend { return &zypperBackend{} })
|
||||
}
|
||||
|
||||
type zypperBackend struct{}
|
||||
|
||||
func (zypperBackend) ID() string { return "zypper" }
|
||||
func (zypperBackend) DisplayName() string { return "Zypper" }
|
||||
func (zypperBackend) Repo() RepoKind { return RepoSystem }
|
||||
func (zypperBackend) NeedsAuth() bool { return true }
|
||||
func (zypperBackend) RunsInTerminal() bool { return false }
|
||||
func (zypperBackend) IsAvailable(_ context.Context) bool { return commandExists("zypper") }
|
||||
|
||||
type zypperUpdateList struct {
|
||||
XMLName xml.Name `xml:"stream"`
|
||||
Updates []zypperUpdate `xml:"update-list>update"`
|
||||
}
|
||||
|
||||
type zypperUpdate struct {
|
||||
Name string `xml:"name,attr"`
|
||||
Edition string `xml:"edition,attr"`
|
||||
EditionOld string `xml:"edition-old,attr"`
|
||||
Kind string `xml:"kind,attr"`
|
||||
}
|
||||
|
||||
func (zypperBackend) CheckUpdates(ctx context.Context) ([]Package, error) {
|
||||
cmd := exec.CommandContext(ctx, "zypper", "--non-interactive", "--xmlout", "list-updates")
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
if exitErr, ok := errors.AsType[*exec.ExitError](err); ok {
|
||||
switch exitErr.ExitCode() {
|
||||
case 100, 101, 102, 103:
|
||||
err = nil
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return parseZypperXML(out)
|
||||
}
|
||||
|
||||
func parseZypperXML(out []byte) ([]Package, error) {
|
||||
var list zypperUpdateList
|
||||
if err := xml.Unmarshal(out, &list); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pkgs := make([]Package, 0, len(list.Updates))
|
||||
for _, u := range list.Updates {
|
||||
if u.Kind != "" && u.Kind != "package" {
|
||||
continue
|
||||
}
|
||||
pkgs = append(pkgs, Package{
|
||||
Name: u.Name,
|
||||
Repo: RepoSystem,
|
||||
Backend: "zypper",
|
||||
FromVersion: u.EditionOld,
|
||||
ToVersion: u.Edition,
|
||||
})
|
||||
}
|
||||
return pkgs, nil
|
||||
}
|
||||
|
||||
func (zypperBackend) Upgrade(ctx context.Context, opts UpgradeOptions, onLine func(string)) error {
|
||||
if opts.DryRun {
|
||||
return Run(ctx, []string{"zypper", "--non-interactive", "--dry-run", "update"}, RunOptions{OnLine: onLine})
|
||||
}
|
||||
return Run(ctx, []string{"pkexec", "zypper", "--non-interactive", "update"}, RunOptions{OnLine: onLine})
|
||||
}
|
||||
Reference in New Issue
Block a user