Skip to content

Commit 4a7eb00

Browse files
author
Massimiliano Giovagnoli
committed
refactor(amazonlinux): share next gen pkg search logics
Signed-off-by: Massimiliano Giovagnoli <me@maxgio.it>
1 parent c4b1b80 commit 4a7eb00

File tree

12 files changed

+152
-234
lines changed

12 files changed

+152
-234
lines changed

docs/reference/cli.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Available distributions:
2626
- amazonlinux
2727
- amazonlinux2
2828
- amazonlinux2022
29+
- amazonlinux2023
2930
- centos
3031
- debian
3132
- ubuntu

docs/reference/config.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ As of now, the supported Linux distributions are:
3333
- *amazonlinux1*
3434
- *amazonlinux2*
3535
- *amazonlinux2022*
36+
- *amazonlinux2023*
3637
- *centos*
3738
- *debian*
3839
- *ubuntu*

internal/utils/config.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ func GetDistroConfigAndVarsFromViper(viper *v.Viper) (d.Config, error) {
5757
allsettings = amazonLinuxV2022.AllSettings()
5858
}
5959

60+
if amazonLinuxV2023 := distros.Sub(d.AmazonLinuxV2023Type); amazonLinuxV2023 != nil {
61+
if err := amazonLinuxV2023.Unmarshal(&config); err != nil {
62+
return d.Config{}, err
63+
}
64+
65+
allsettings = amazonLinuxV2023.AllSettings()
66+
}
67+
6068
if debian := distros.Sub(d.DebianType); debian != nil {
6169
if err := debian.Unmarshal(&config); err != nil {
6270
return d.Config{}, err

pkg/distro/amazonlinux/amazonlinux.go

Lines changed: 115 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package amazonlinux
22

33
import (
4+
"context"
5+
"io"
6+
"net/http"
47
"net/url"
8+
"strings"
59

610
"github.com/maxgio92/krawler/pkg/distro"
711
"github.com/maxgio92/krawler/pkg/output"
812
p "github.com/maxgio92/krawler/pkg/packages"
13+
"github.com/maxgio92/krawler/pkg/packages/rpm"
914
"github.com/maxgio92/krawler/pkg/scrape"
1015
)
1116

@@ -24,7 +29,7 @@ func (a *AmazonLinux) ConfigureCommon(def distro.Config, config distro.Config) e
2429
return nil
2530
}
2631

27-
// Returns the list of version-specific mirror URLs.
32+
// BuildMirrorURLs returns the list of version-specific mirror URLs.
2833
func (a *AmazonLinux) BuildMirrorURLs(mirrors []p.Mirror, versions []distro.Version) ([]*url.URL, error) {
2934
versions, err := a.buildVersions(mirrors, versions)
3035
if err != nil {
@@ -51,8 +56,8 @@ func (a *AmazonLinux) BuildMirrorURLs(mirrors []p.Mirror, versions []distro.Vers
5156
return nil, distro.ErrNoDistroVersionSpecified
5257
}
5358

54-
// Returns the list of repositories URLs.
55-
func BuildRepositoriesURLs(roots []*url.URL, repositories []p.Repository) ([]*url.URL, error) {
59+
// BuildRepositoryURLs returns the list of repositories URLs.
60+
func BuildRepositoryURLs(roots []*url.URL, repositories []p.Repository) ([]*url.URL, error) {
5661
var urls []*url.URL
5762

5863
for _, root := range roots {
@@ -74,7 +79,7 @@ func BuildRepositoriesURLs(roots []*url.URL, repositories []p.Repository) ([]*ur
7479
return urls, nil
7580
}
7681

77-
// Returns a list of distro versions, considering the user-provided configuration,
82+
// buildVersions returns a list of distro versions, considering the user-provided configuration,
7883
// and if not, the ones available on configured mirrors.
7984
func (a *AmazonLinux) buildVersions(mirrors []p.Mirror, staticVersions []distro.Version) ([]distro.Version, error) {
8085
if staticVersions != nil {
@@ -91,7 +96,7 @@ func (a *AmazonLinux) buildVersions(mirrors []p.Mirror, staticVersions []distro.
9196
return dynamicVersions, nil
9297
}
9398

94-
// Returns the list of the current available distro versions, by scraping
99+
// crawlVersions returns the list of the current available distro versions, by scraping
95100
// the specified mirrors, dynamically.
96101
func (a *AmazonLinux) crawlVersions(mirrors []p.Mirror) ([]distro.Version, error) {
97102
versions := []distro.Version{}
@@ -123,3 +128,108 @@ func (a *AmazonLinux) crawlVersions(mirrors []p.Mirror) ([]distro.Version, error
123128

124129
return versions, nil
125130
}
131+
132+
// SearchPackages scrapes each mirror, for each distro version, for each repository,
133+
// for each architecture, and returns slice of Package and optionally an error.
134+
func (a *AmazonLinux) SearchPackages(options p.SearchOptions) ([]p.Package, error) {
135+
a.Config.Output.Logger = options.Log()
136+
137+
// Build distribution version-specific mirror root URLs.
138+
perVersionMirrorURLs, err := a.BuildMirrorURLs(a.Config.Mirrors, a.Config.Versions)
139+
if err != nil {
140+
return nil, err
141+
}
142+
143+
// Build available repository URLs based on provided configuration,
144+
// for each distribution version.
145+
repositoriesURLrefs, err := BuildRepositoryURLs(perVersionMirrorURLs, a.Config.Repositories)
146+
if err != nil {
147+
return nil, err
148+
}
149+
150+
// Dereference repository URLs.
151+
repositoryURLs, err := a.dereferenceRepositoryURLs(repositoriesURLrefs, a.Config.Archs)
152+
if err != nil {
153+
return nil, err
154+
}
155+
156+
// Get RPM packages from each repository.
157+
rss := []string{}
158+
for _, ru := range repositoryURLs {
159+
rss = append(rss, ru.String())
160+
}
161+
162+
searchOptions := rpm.NewSearchOptions(&options, a.Config.Archs, rss)
163+
rpmPackages, err := rpm.SearchPackages(searchOptions)
164+
if err != nil {
165+
return nil, err
166+
}
167+
168+
return rpmPackages, nil
169+
}
170+
171+
func (a *AmazonLinux) dereferenceRepositoryURLs(repoURLs []*url.URL, archs []p.Architecture) ([]*url.URL, error) {
172+
var urls []*url.URL
173+
174+
for _, ar := range archs {
175+
for _, v := range repoURLs {
176+
r, err := a.dereferenceRepositoryURL(v, ar)
177+
if err != nil {
178+
return nil, err
179+
}
180+
181+
if r != nil {
182+
urls = append(urls, r)
183+
}
184+
}
185+
}
186+
187+
return urls, nil
188+
}
189+
190+
func (a *AmazonLinux) dereferenceRepositoryURL(src *url.URL, arch p.Architecture) (*url.URL, error) {
191+
var dest *url.URL
192+
193+
mirrorListURL, err := url.JoinPath(src.String(), string(arch), "mirror.list")
194+
if err != nil {
195+
return nil, err
196+
}
197+
198+
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, mirrorListURL, nil)
199+
if err != nil {
200+
return nil, err
201+
}
202+
203+
resp, err := http.DefaultClient.Do(req)
204+
if err != nil {
205+
return nil, err
206+
}
207+
defer resp.Body.Close()
208+
209+
if resp.StatusCode != http.StatusOK {
210+
a.Config.Output.Logger.Error("Amazon Linux v2023 repository URL not valid to be dereferenced")
211+
//nolint:nilnil
212+
return nil, nil
213+
}
214+
215+
if resp.Body == nil {
216+
a.Config.Output.Logger.Error("empty response from Amazon Linux v2023 repository reference URL")
217+
//nolint:nilnil
218+
return nil, nil
219+
}
220+
221+
b, err := io.ReadAll(resp.Body)
222+
if err != nil {
223+
return nil, err
224+
}
225+
226+
// Get first repository URL available, no matter what the geolocation.
227+
s := strings.Split(string(b), "\n")[0]
228+
229+
dest, err = url.Parse(s)
230+
if err != nil {
231+
return nil, err
232+
}
233+
234+
return dest, nil
235+
}

pkg/distro/amazonlinux/v1/amazonlinux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func (a *AmazonLinux) SearchPackages(options packages.SearchOptions) ([]packages
3434

3535
// Build available repository URLs based on provided configuration,
3636
// for each distribution version.
37-
repositoriesURLrefs, err := common.BuildRepositoriesURLs(perVersionMirrorURLs, a.Config.Repositories)
37+
repositoriesURLrefs, err := common.BuildRepositoryURLs(perVersionMirrorURLs, a.Config.Repositories)
3838
if err != nil {
3939
return nil, err
4040
}

pkg/distro/amazonlinux/v2/amazonlinux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func (a *AmazonLinux) SearchPackages(options packages.SearchOptions) ([]packages
3434

3535
// Build available repository URLs based on provided configuration,
3636
// for each distribution version.
37-
repositoriesURLrefs, err := common.BuildRepositoriesURLs(perVersionMirrorURLs, a.Config.Repositories)
37+
repositoriesURLrefs, err := common.BuildRepositoryURLs(perVersionMirrorURLs, a.Config.Repositories)
3838
if err != nil {
3939
return nil, err
4040
}
Lines changed: 0 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
11
package v2022
22

33
import (
4-
"context"
5-
"io"
6-
"net/http"
7-
"net/url"
8-
"strings"
9-
104
"github.com/maxgio92/krawler/pkg/distro"
115
common "github.com/maxgio92/krawler/pkg/distro/amazonlinux"
12-
packages "github.com/maxgio92/krawler/pkg/packages"
13-
"github.com/maxgio92/krawler/pkg/packages/rpm"
146
)
157

168
type AmazonLinux struct {
@@ -20,108 +12,3 @@ type AmazonLinux struct {
2012
func (a *AmazonLinux) Configure(config distro.Config) error {
2113
return a.ConfigureCommon(DefaultConfig, config)
2214
}
23-
24-
// GetPackages scrapes each mirror, for each distro version, for each repository,
25-
// for each architecture, and returns slice of Package and optionally an error.
26-
func (a *AmazonLinux) SearchPackages(options packages.SearchOptions) ([]packages.Package, error) {
27-
a.Config.Output.Logger = options.Log()
28-
29-
// Build distribution version-specific mirror root URLs.
30-
perVersionMirrorURLs, err := a.BuildMirrorURLs(a.Config.Mirrors, a.Config.Versions)
31-
if err != nil {
32-
return nil, err
33-
}
34-
35-
// Build available repository URLs based on provided configuration,
36-
// for each distribution version.
37-
repositoriesURLrefs, err := common.BuildRepositoriesURLs(perVersionMirrorURLs, a.Config.Repositories)
38-
if err != nil {
39-
return nil, err
40-
}
41-
42-
// Dereference repository URLs.
43-
repositoryURLs, err := a.dereferenceRepositoryURLs(repositoriesURLrefs, a.Config.Archs)
44-
if err != nil {
45-
return nil, err
46-
}
47-
48-
// Get RPM packages from each repository.
49-
rss := []string{}
50-
for _, ru := range repositoryURLs {
51-
rss = append(rss, ru.String())
52-
}
53-
54-
searchOptions := rpm.NewSearchOptions(&options, a.Config.Archs, rss)
55-
rpmPackages, err := rpm.SearchPackages(searchOptions)
56-
if err != nil {
57-
return nil, err
58-
}
59-
60-
return rpmPackages, nil
61-
}
62-
63-
func (a *AmazonLinux) dereferenceRepositoryURLs(repoURLs []*url.URL, archs []packages.Architecture) ([]*url.URL, error) {
64-
var urls []*url.URL
65-
66-
for _, ar := range archs {
67-
for _, v := range repoURLs {
68-
r, err := a.dereferenceRepositoryURL(v, ar)
69-
if err != nil {
70-
return nil, err
71-
}
72-
73-
if r != nil {
74-
urls = append(urls, r)
75-
}
76-
}
77-
}
78-
79-
return urls, nil
80-
}
81-
82-
func (a *AmazonLinux) dereferenceRepositoryURL(src *url.URL, arch packages.Architecture) (*url.URL, error) {
83-
var dest *url.URL
84-
85-
mirrorListURL, err := url.JoinPath(src.String(), string(arch), "mirror.list")
86-
if err != nil {
87-
return nil, err
88-
}
89-
90-
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, mirrorListURL, nil)
91-
if err != nil {
92-
return nil, err
93-
}
94-
95-
resp, err := http.DefaultClient.Do(req)
96-
if err != nil {
97-
return nil, err
98-
}
99-
defer resp.Body.Close()
100-
101-
if resp.StatusCode != http.StatusOK {
102-
a.Config.Output.Logger.Error("Amazon Linux v2022 repository URL not valid to be dereferenced")
103-
//nolint:nilnil
104-
return nil, nil
105-
}
106-
107-
if resp.Body == nil {
108-
a.Config.Output.Logger.Error("empty response from Amazon Linux v2022 repository reference URL")
109-
//nolint:nilnil
110-
return nil, nil
111-
}
112-
113-
b, err := io.ReadAll(resp.Body)
114-
if err != nil {
115-
return nil, err
116-
}
117-
118-
// Get first repository URL available, no matter what the geolocation.
119-
s := strings.Split(string(b), "\n")[0]
120-
121-
dest, err = url.Parse(s)
122-
if err != nil {
123-
return nil, err
124-
}
125-
126-
return dest, nil
127-
}

0 commit comments

Comments
 (0)