github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/nodeagent/dep/package-manager-addrepo.go (about)

     1  package dep
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"net/http"
     7  	"os"
     8  	"os/exec"
     9  	"strings"
    10  )
    11  
    12  func (p *PackageManager) rembasedAdd(repo *Repository) error {
    13  
    14  	errBuf := new(bytes.Buffer)
    15  	defer errBuf.Reset()
    16  	outBuf := new(bytes.Buffer)
    17  	defer errBuf.Reset()
    18  
    19  	cmd := exec.Command("yum-config-manager", "--add-repo", repo.Repository)
    20  	cmd.Stderr = errBuf
    21  	cmd.Stdout = outBuf
    22  	err := cmd.Run()
    23  
    24  	out := outBuf.String()
    25  	if p.monitor.IsVerbose() {
    26  		fmt.Println(strings.Join(cmd.Args, " "))
    27  		fmt.Println(out)
    28  	}
    29  
    30  	if err != nil && !strings.Contains(out, fmt.Sprintf("Cannot add repo from %s as is a duplicate of an existing repo", repo.Repository)) {
    31  		return fmt.Errorf("adding yum repository %s failed with stderr %s: %w", repo.Repository, out, err)
    32  	}
    33  
    34  	return nil
    35  }
    36  
    37  func (p *PackageManager) debbasedAdd(repo *Repository) error {
    38  
    39  	errBuf := new(bytes.Buffer)
    40  	defer errBuf.Reset()
    41  
    42  	resp, err := http.Get(repo.KeyURL)
    43  	if err != nil {
    44  		return fmt.Errorf("getting key from url %s failed: %w", repo.KeyURL, err)
    45  	}
    46  	defer resp.Body.Close()
    47  	cmd := exec.Command("apt-key", "add", "-")
    48  	cmd.Stdin = resp.Body
    49  	cmd.Stderr = errBuf
    50  
    51  	if p.monitor.IsVerbose() {
    52  		fmt.Println(strings.Join(cmd.Args, " "))
    53  		cmd.Stdout = os.Stdout
    54  	}
    55  
    56  	if err := cmd.Run(); err != nil {
    57  		return fmt.Errorf("adding key failed with stderr %s: %w", errBuf.String(), err)
    58  	}
    59  	errBuf.Reset()
    60  	p.monitor.WithFields(map[string]interface{}{
    61  		"url": repo.KeyURL,
    62  	}).Debug("Added repository key from url")
    63  
    64  	if repo.KeyFingerprint != "" {
    65  		buf := new(bytes.Buffer)
    66  		defer buf.Reset()
    67  
    68  		cmd := exec.Command("apt-key", "fingerprint", repo.KeyFingerprint)
    69  		cmd.Stdout = buf
    70  		cmd.Stderr = errBuf
    71  		if err := cmd.Run(); err != nil {
    72  			return fmt.Errorf("verifying fingerprint %s failed with stderr %s: %w", repo.KeyFingerprint, errBuf.String(), err)
    73  		}
    74  
    75  		if p.monitor.IsVerbose() {
    76  			fmt.Println(strings.Join(cmd.Args, " "))
    77  		}
    78  
    79  		errBuf.Reset()
    80  		p.monitor.WithFields(map[string]interface{}{
    81  			"url":         repo.KeyURL,
    82  			"fingerprint": repo.KeyFingerprint,
    83  		}).Debug("Checked fingerprint")
    84  		found := false
    85  		for {
    86  			line, err := buf.ReadString('\n')
    87  			if p.monitor.IsVerbose() {
    88  				fmt.Println(line)
    89  			}
    90  
    91  			if strings.HasPrefix(line, "uid") {
    92  				p.monitor.WithFields(map[string]interface{}{
    93  					"uid": strings.TrimSpace(strings.TrimPrefix(line, "uid")),
    94  				}).Debug("Added and verified repository key")
    95  				found = true
    96  				break
    97  			}
    98  			if line == "\n" || err != nil {
    99  				break
   100  			}
   101  		}
   102  		if !found {
   103  			return fmt.Errorf("no key with fingerprint %s found", repo.KeyFingerprint)
   104  		}
   105  	}
   106  
   107  	cmd = exec.Command("add-apt-repository", "-y", repo.Repository)
   108  	cmd.Stderr = errBuf
   109  
   110  	if p.monitor.IsVerbose() {
   111  		fmt.Println(strings.Join(cmd.Args, " "))
   112  		cmd.Stdout = os.Stdout
   113  	}
   114  
   115  	if err := cmd.Run(); err != nil {
   116  		return fmt.Errorf("adding repository %s failed with stderr %s: %w", repo.Repository, errBuf.String(), err)
   117  	}
   118  	errBuf.Reset()
   119  	p.monitor.WithFields(map[string]interface{}{
   120  		"repository": repo.Repository,
   121  	}).Debug("Added repository")
   122  
   123  	cmd = exec.Command("apt-get", strings.Fields("--assume-yes --allow-downgrades update")...)
   124  	cmd.Stderr = errBuf
   125  	if p.monitor.IsVerbose() {
   126  		fmt.Println(strings.Join(cmd.Args, " "))
   127  		cmd.Stdout = os.Stdout
   128  	}
   129  	if err := cmd.Run(); err != nil {
   130  		return fmt.Errorf("updating indices failed with stderr %s: %w", errBuf.String(), err)
   131  	}
   132  	errBuf.Reset()
   133  	p.monitor.Debug("Updated index")
   134  	return nil
   135  }