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 }