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