Skip to content

Commit e1055a7

Browse files
authored
feat: add parameterize support to generic package (#333)
Co-authored-by: rick <[email protected]>
1 parent 171d64a commit e1055a7

File tree

4 files changed

+129
-7
lines changed

4 files changed

+129
-7
lines changed

pkg/os/fake/fake.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package fake
22

33
import (
44
"fmt"
5+
56
"github.com/linuxsuren/http-downloader/pkg/os/core"
67
)
78

89
// Installer only for test purpose
910
type Installer struct {
1011
hasError bool
1112
support bool
13+
data map[string]string
1214
}
1315

1416
// NewFakeInstaller returns a Installer
@@ -64,3 +66,8 @@ func (d *Installer) Stop() (err error) {
6466
}
6567
return
6668
}
69+
70+
// SetURLReplace is a fake method
71+
func (d *Installer) SetURLReplace(data map[string]string) {
72+
d.data = data
73+
}

pkg/os/fake/fake_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package fake
22

33
import (
4+
"testing"
5+
46
"github.com/linuxsuren/http-downloader/pkg/os/core"
57
"github.com/stretchr/testify/assert"
6-
"testing"
78
)
89

910
func TestNewFakeInstaller(t *testing.T) {
@@ -18,4 +19,14 @@ func TestNewFakeInstaller(t *testing.T) {
1819
ok, err := installer.WaitForStart()
1920
assert.True(t, ok)
2021
assert.NotNil(t, err)
22+
23+
proxyAbleInstaller := &Installer{}
24+
proxyAbleInstaller.SetURLReplace(map[string]string{
25+
"key": "value",
26+
})
27+
assert.Equal(t, map[string]string{
28+
"key": "value",
29+
}, proxyAbleInstaller.data)
30+
31+
var _ core.ProxyAble = &Installer{}
2132
}

pkg/os/generic_installer.go

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package os
22

33
import (
4+
"bytes"
45
"fmt"
5-
"github.com/linuxsuren/http-downloader/pkg"
66
"os"
77
"strings"
8+
"text/template"
9+
10+
"github.com/linuxsuren/http-downloader/pkg"
811

912
"github.com/linuxsuren/http-downloader/pkg/os/apk"
1013
"github.com/linuxsuren/http-downloader/pkg/os/dnf"
@@ -47,6 +50,7 @@ type genericPackage struct {
4750

4851
// inner fields
4952
proxyMap map[string]string
53+
env map[string]string
5054
execer exec.Execer
5155
}
5256

@@ -71,15 +75,16 @@ func parseGenericPackages(configFile string, genericPackages *genericPackages) (
7175

7276
// GenericInstallerRegistry registries a generic installer
7377
func GenericInstallerRegistry(configFile string, registry core.InstallerRegistry) (err error) {
78+
defaultExecer := exec.DefaultExecer{}
7479
genericPackages := &genericPackages{}
7580
if err = parseGenericPackages(configFile, genericPackages); err != nil {
7681
return
7782
}
78-
defaultExecer := exec.DefaultExecer{}
7983

8084
// registry all the packages
8185
for i := range genericPackages.Packages {
8286
genericPackage := genericPackages.Packages[i]
87+
genericPackage.execer = defaultExecer
8388

8489
switch genericPackage.PackageManager {
8590
case "apt-get":
@@ -148,6 +153,7 @@ func (i *genericPackage) Available() (ok bool) {
148153
return
149154
}
150155
func (i *genericPackage) Install() (err error) {
156+
i.loadEnv()
151157
for index := range i.PreInstall {
152158
preInstall := i.PreInstall[index]
153159

@@ -167,6 +173,7 @@ func (i *genericPackage) Install() (err error) {
167173

168174
if needInstall {
169175
preInstall.Cmd.Args = i.sliceReplace(preInstall.Cmd.Args)
176+
fmt.Println(preInstall.Cmd.Args)
170177

171178
if err = i.execer.RunCommand(preInstall.Cmd.Cmd, preInstall.Cmd.Args...); err != nil {
172179
return
@@ -212,16 +219,19 @@ func (i *genericPackage) SetURLReplace(data map[string]string) {
212219
func (i *genericPackage) sliceReplace(args []string) []string {
213220
for index, arg := range args {
214221
if result := i.urlReplace(arg); result != arg {
215-
args[index] = result
222+
args[index] = strings.TrimSpace(result)
216223
}
217224
}
218225
return args
219226
}
220227
func (i *genericPackage) urlReplace(old string) string {
221-
if i.proxyMap == nil {
222-
return old
223-
}
228+
if tpl, err := template.New("env").Parse(old); err == nil {
229+
buf := bytes.NewBuffer([]byte{})
224230

231+
if err = tpl.Execute(buf, i.env); err == nil {
232+
old = buf.String()
233+
}
234+
}
225235
for k, v := range i.proxyMap {
226236
if !strings.Contains(old, k) {
227237
continue
@@ -230,3 +240,17 @@ func (i *genericPackage) urlReplace(old string) string {
230240
}
231241
return old
232242
}
243+
func (i *genericPackage) loadEnv() {
244+
if i.env == nil {
245+
i.env = map[string]string{}
246+
}
247+
if i.execer.OS() == exec.OSLinux {
248+
if data, readErr := os.ReadFile("/etc/os-release"); readErr == nil {
249+
for _, line := range strings.Split(string(data), "\n") {
250+
if pair := strings.Split(line, "="); len(pair) == 2 {
251+
i.env[fmt.Sprintf("OS_%s", pair[0])] = strings.TrimPrefix(strings.TrimSuffix(pair[1], `"`), `"`)
252+
}
253+
}
254+
}
255+
}
256+
}

pkg/os/generic_installer_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package os
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/linuxsuren/http-downloader/pkg/exec"
8+
"github.com/linuxsuren/http-downloader/pkg/os/fake"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestURLReplace(t *testing.T) {
13+
genericPkg := &genericPackage{
14+
env: map[string]string{
15+
"key": "value",
16+
},
17+
execer: exec.FakeExecer{ExpectOS: exec.OSLinux},
18+
}
19+
genericPkg.SetURLReplace(map[string]string{
20+
"github": "ghproxy",
21+
})
22+
genericPkg.loadEnv()
23+
assert.Equal(t, "ghproxy-value", genericPkg.urlReplace("github-{{.key}}"))
24+
assert.Equal(t, "value", genericPkg.urlReplace("{{.key}}"))
25+
assert.Equal(t, []string{"value"}, genericPkg.sliceReplace([]string{"{{.key}}"}))
26+
27+
emptyGenericPkg := &genericPackage{
28+
execer: exec.FakeExecer{ExpectOS: exec.OSLinux},
29+
}
30+
emptyGenericPkg.loadEnv()
31+
assert.NotNil(t, emptyGenericPkg.env)
32+
assert.Nil(t, emptyGenericPkg.Start())
33+
assert.Nil(t, emptyGenericPkg.Stop())
34+
assert.False(t, emptyGenericPkg.IsService())
35+
assert.False(t, emptyGenericPkg.Available())
36+
assert.NotNil(t, emptyGenericPkg.Install())
37+
assert.NotNil(t, emptyGenericPkg.Uninstall())
38+
ok, err := emptyGenericPkg.WaitForStart()
39+
assert.True(t, ok)
40+
assert.Nil(t, err)
41+
42+
withPreInstall := &genericPackage{
43+
execer: exec.FakeExecer{
44+
ExpectOS: exec.OSLinux,
45+
},
46+
PreInstall: []preInstall{{
47+
Cmd: CmdWithArgs{
48+
Cmd: "ls",
49+
},
50+
}, {
51+
IssuePrefix: "good",
52+
Cmd: CmdWithArgs{
53+
Cmd: "ls",
54+
},
55+
}, {
56+
IssuePrefix: "Ubuntu",
57+
Cmd: CmdWithArgs{
58+
Cmd: "ls",
59+
},
60+
}},
61+
CommonInstaller: fake.NewFakeInstaller(true, false),
62+
}
63+
assert.Nil(t, withPreInstall.Install())
64+
65+
withErrorPreInstall := &genericPackage{
66+
execer: exec.FakeExecer{
67+
ExpectOS: exec.OSLinux,
68+
ExpectError: errors.New("error"),
69+
},
70+
PreInstall: []preInstall{{
71+
Cmd: CmdWithArgs{
72+
Cmd: "ls",
73+
},
74+
}},
75+
CommonInstaller: fake.NewFakeInstaller(true, true),
76+
}
77+
assert.NotNil(t, withErrorPreInstall.Install())
78+
assert.NotNil(t, withErrorPreInstall.Uninstall())
79+
assert.True(t, withErrorPreInstall.Available())
80+
}

0 commit comments

Comments
 (0)