github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/nodeagent/dep/package-manager.go (about) 1 package dep 2 3 import ( 4 "fmt" 5 6 "github.com/caos/orbos/mntr" 7 ) 8 9 type Software struct { 10 Package string 11 Version string 12 } 13 14 func (s *Software) String() string { 15 return fmt.Sprintf("%s=%s", s.Package, s.Version) 16 } 17 18 type Repository struct { 19 Repository string 20 KeyURL string 21 KeyFingerprint string 22 } 23 24 type PackageManager struct { 25 monitor mntr.Monitor 26 os OperatingSystem 27 installed map[string][]string 28 systemd *SystemD 29 } 30 31 func (p *PackageManager) RefreshInstalled(filter []string) error { 32 var err error 33 switch p.os.Packages { 34 case DebianBased: 35 err = p.debbasedInstalled() 36 case REMBased: 37 err = p.rembasedInstalled(filter) 38 } 39 40 if err != nil { 41 return fmt.Errorf("refreshing installed packages failed: %w", err) 42 } 43 p.monitor.WithFields(map[string]interface{}{ 44 "packages": len(p.installed), 45 }).Debug("Refreshed installed packages") 46 return nil 47 } 48 49 func (p *PackageManager) Init() error { 50 51 p.monitor.Debug("Initializing package manager") 52 var err error 53 switch p.os.Packages { 54 case DebianBased: 55 err = p.debSpecificInit() 56 case REMBased: 57 err = p.remSpecificInit() 58 } 59 60 if err != nil { 61 return fmt.Errorf("initializing packages %s failed: %w", p.os.Packages, err) 62 } 63 64 p.monitor.Debug("Package manager initialized") 65 return nil 66 } 67 68 func (p *PackageManager) Update() error { 69 p.monitor.Debug("Updating packages") 70 var err error 71 switch p.os.Packages { 72 case DebianBased: 73 err = p.debSpecificUpdatePackages() 74 case REMBased: 75 err = p.remSpecificUpdatePackages() 76 } 77 78 if err != nil { 79 return fmt.Errorf("updating packages %s failed: %w", p.os.Packages, err) 80 } 81 82 p.monitor.Info("Packages updated") 83 return nil 84 } 85 86 func NewPackageManager(monitor mntr.Monitor, os OperatingSystem, systemd *SystemD) *PackageManager { 87 return &PackageManager{monitor, os, nil, systemd} 88 } 89 90 func (p *PackageManager) CurrentVersions(possiblePackages ...string) []*Software { 91 92 software := make([]*Software, 0) 93 for i := range possiblePackages { 94 pkg := possiblePackages[i] 95 if versions, ok := p.installed[pkg]; ok { 96 for j := range versions { 97 foundSw := &Software{ 98 Package: pkg, 99 Version: versions[j], 100 } 101 software = append(software, foundSw) 102 p.monitor.WithFields(map[string]interface{}{ 103 "package": foundSw.Package, 104 "version": foundSw.Version, 105 }).Debug("Found filtered installed package") 106 } 107 } 108 } 109 110 return software 111 } 112 113 func (p *PackageManager) Install(installVersion ...*Software) error { 114 switch p.os.Packages { 115 case DebianBased: 116 return p.debbasedInstall(installVersion...) 117 case REMBased: 118 return p.rembasedInstall(installVersion...) 119 } 120 return fmt.Errorf("package manager %s is not implemented", p.os.Packages) 121 } 122 123 func (p *PackageManager) Add(repo *Repository) error { 124 switch p.os.Packages { 125 case DebianBased: 126 return p.debbasedAdd(repo) 127 case REMBased: 128 return p.rembasedAdd(repo) 129 default: 130 return fmt.Errorf("package manager %s is not implemented", p.os.Packages) 131 } 132 } 133 134 func (p *PackageManager) Remove(remove ...*Software) error { 135 switch p.os.Packages { 136 case DebianBased: 137 panic("removing software on debian bases systems is not yet implemented") 138 case REMBased: 139 return p.rembasedRemove(remove...) 140 default: 141 return fmt.Errorf("package manager %s is not implemented", p.os.Packages) 142 } 143 }