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  }