diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 3f77044..7b02111 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v6 with: - go-version: 1.24 + go-version: 1.25 - name: Test run: go test -v ./... diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 708e6ed..bae4b40 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -15,4 +15,4 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v9 with: - version: v2.1.6 + version: v2.11.2 diff --git a/go.mod b/go.mod index aa7ecf6..7560a21 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/NETWAYS/support-collector -go 1.24.0 - -toolchain go1.24.9 +go 1.25.0 require ( github.com/Showmax/go-fqdn v1.0.0 @@ -16,7 +14,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/sys v0.39.0 // indirect + golang.org/x/sys v0.43.0 // indirect ) diff --git a/go.sum b/go.sum index a915450..a907722 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -19,6 +21,8 @@ github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/internal/collection/file.go b/internal/collection/file.go index 3a6c393..c1c6a2f 100644 --- a/internal/collection/file.go +++ b/internal/collection/file.go @@ -12,12 +12,12 @@ import ( ) type File struct { + io.Writer + Name string Source string Modified time.Time Data []byte - - io.Writer } var reIgnoreFiles = regexp.MustCompile(`(^\.|~$|\.key$|\.csr$|\.crt$|\.pem$)`) diff --git a/internal/collection/git.go b/internal/collection/git.go index 8e26644..eaf8e72 100644 --- a/internal/collection/git.go +++ b/internal/collection/git.go @@ -64,8 +64,15 @@ func LoadGitRepoInfo(path string) (*GitRepoInfo, error) { } func ExecGitCommand(dir string, command ...string) ([]byte, error) { - arguments := []string{"--git-dir", filepath.Join(dir, ".git"), "--work-tree", dir} - arguments = append(arguments, command...) + arguments := make([]string, 4+len(command)) + arguments[0] = "--git-dir" + arguments[1] = filepath.Join(dir, ".git") + arguments[2] = "--work-tree" + arguments[3] = dir + + for i := range command { + arguments[i+4] = command[i] + } return LoadCommandOutput("git", arguments...) } diff --git a/internal/collection/packages.go b/internal/collection/packages.go index 82ae8d8..5a351fe 100644 --- a/internal/collection/packages.go +++ b/internal/collection/packages.go @@ -28,7 +28,8 @@ func DetectPackageManager() string { priority := []string{PackageManagerDebian, PackageManagerRPM} for _, name := range priority { - if _, err := exec.LookPath(name); err == nil { + _, err := exec.LookPath(name) + if err == nil { FoundPackageManager = name return name } @@ -40,13 +41,25 @@ func DetectPackageManager() string { func ListInstalledPackagesRaw(pattern ...string) ([]byte, error) { switch DetectPackageManager() { case PackageManagerRPM: - arguments := []string{"-qa", "--queryformat", rpmQueryFormat} - arguments = append(arguments, pattern...) + arguments := make([]string, 3+len(pattern)) + arguments[0] = "-qa" + arguments[1] = "--queryformat" + arguments[2] = rpmQueryFormat + + for i := range pattern { + arguments[i+3] = pattern[i] + } return LoadCommandOutput("rpm", arguments...) case PackageManagerDebian: - arguments := []string{"-W", "-f", dpkgQueryFormat} - arguments = append(arguments, pattern...) + arguments := make([]string, 3+len(pattern)) + arguments[0] = "-W" + arguments[1] = "-f" + arguments[2] = dpkgQueryFormat + + for i := range pattern { + arguments[i+3] = pattern[i] + } return LoadCommandOutput("dpkg-query", arguments...) default: diff --git a/internal/collection/services.go b/internal/collection/services.go index 36bfc8b..58d6cda 100644 --- a/internal/collection/services.go +++ b/internal/collection/services.go @@ -42,7 +42,8 @@ func DetectServiceManager() string { } for command, manager := range priority { - if _, err := exec.LookPath(command); err == nil { + _, err := exec.LookPath(command) + if err == nil { FoundServiceManager = manager return manager } @@ -84,7 +85,8 @@ func FindServicesSystemd(pattern string) (map[string]string, error) { for _, file := range files { // Skip the file if it is a symlink - if stat, err := os.Lstat(file); err != nil || IsSymlink(stat) { + stat, err := os.Lstat(file) + if err != nil || IsSymlink(stat) { continue } diff --git a/internal/config/wizard.go b/internal/config/wizard.go index f082e1b..7598467 100644 --- a/internal/config/wizard.go +++ b/internal/config/wizard.go @@ -225,7 +225,8 @@ func (w *Wizard) newStringPrompt(callback *string, usage string, required bool) return } } else { - if err := w.Scanner.Err(); err != nil { + err := w.Scanner.Err() + if err != nil { _, _ = fmt.Fprintln(os.Stderr, "reading standard input:", err) return } @@ -252,7 +253,8 @@ func (w *Wizard) newStringPromptWithDefault(callback *string, defaultValue, usag return } } else { - if err := w.Scanner.Err(); err != nil { + err := w.Scanner.Err() + if err != nil { _, _ = fmt.Fprintln(os.Stderr, "reading standard input:", err) return } @@ -283,7 +285,8 @@ func (w *Wizard) newIntPromptWithDefault(callback *int, defaultValue int, usage return } } else { - if err := w.Scanner.Err(); err != nil { + err := w.Scanner.Err() + if err != nil { _, _ = fmt.Fprintln(os.Stderr, "reading standard input:", err) return } diff --git a/internal/obfuscate/obfuscate.go b/internal/obfuscate/obfuscate.go index c54ac5b..c90f79d 100644 --- a/internal/obfuscate/obfuscate.go +++ b/internal/obfuscate/obfuscate.go @@ -35,6 +35,7 @@ const ( // Replacement will be iterated, so all matches or matched groups will be replaced. type Obfuscator struct { Kind + ShouldAffect []*regexp.Regexp ReplacePattern *regexp.Regexp ObfuscatedFiles []string diff --git a/main.go b/main.go index 0489fdc..ed69141 100644 --- a/main.go +++ b/main.go @@ -98,14 +98,16 @@ func main() { conf := config.GetControlDefaultObject() // Add and parse flags - if err := parseFlags(); err != nil { + err := parseFlags() + if err != nil { logrus.Fatal(err) } // Read input from answer-file if provided // Needs to done after parsing flags to have the value for answerFile if answerFile != "" { - if err := config.ReadAnswerFile(answerFile, &conf); err != nil { + err := config.ReadAnswerFile(answerFile, &conf) + if err != nil { logrus.Fatal(err) } @@ -139,6 +141,7 @@ func main() { // Initialize new metrics and defer function to save it to json c.Metric = metrics.New(getVersion()) + defer func() { // Save metrics to file body, err := json.Marshal(c.Metric) diff --git a/modules/base/collector.go b/modules/base/collector.go index 880af73..65eea5b 100644 --- a/modules/base/collector.go +++ b/modules/base/collector.go @@ -42,13 +42,15 @@ func Collect(c *collection.Collection) { CollectKernelInfo(c) // Check if apparmor is installed and get status - if _, err := exec.LookPath("apparmor_status"); err == nil { + _, err := exec.LookPath("apparmor_status") + if err == nil { c.AddCommandOutput(filepath.Join(ModuleName, "apparmor-status.txt"), "apparmor_status") } // Check if we can detect SELinux enforcing for _, cmd := range []string{"sestatus", "getenforce"} { - if _, err := exec.LookPath(cmd); err == nil { + _, err := exec.LookPath(cmd) + if err == nil { c.AddCommandOutput(filepath.Join(ModuleName, "selinux-status.txt"), cmd) break } diff --git a/modules/base/kernel.go b/modules/base/kernel.go index 86644df..c114ec5 100644 --- a/modules/base/kernel.go +++ b/modules/base/kernel.go @@ -54,7 +54,7 @@ func CharsToString(chars []int8) string { break } - s[i] = byte(chars[i]) + s[i] = byte(chars[i]) //nolint: gosec } return string(s[0:i]) diff --git a/modules/graphite/collector.go b/modules/graphite/collector.go index ecbf559..5a2e2a5 100644 --- a/modules/graphite/collector.go +++ b/modules/graphite/collector.go @@ -109,7 +109,8 @@ func Collect(c *collection.Collection) { } for name, element := range journalctlLogs { - if service, err := collection.FindServices(element.Service); err == nil && len(service) > 0 { + service, err := collection.FindServices(element.Service) + if err == nil && len(service) > 0 { c.AddJournalLog(filepath.Join(ModuleName, name), element.Service) } } diff --git a/modules/icinga2/collector.go b/modules/icinga2/collector.go index bcfa322..6da593e 100644 --- a/modules/icinga2/collector.go +++ b/modules/icinga2/collector.go @@ -111,7 +111,8 @@ func Collect(c *collection.Collection) { c.AddFilesIfFound(ModuleName, pluginFiles...) for _, file := range optionalFiles { - if _, err := os.Stat(file); err != nil { + _, err := os.Stat(file) + if err != nil { continue } @@ -162,7 +163,8 @@ func Collect(c *collection.Collection) { c.Log.Debugf("New API endpoint found: '%s'. Trying...", e.Address) // Check if endpoint is reachable - if err := e.IsReachable(5 * time.Second); err != nil { //nolint:mnd + err := e.IsReachable(5 * time.Second) + if err != nil { //nolint:mnd c.Log.Warn(err) continue } diff --git a/modules/icinga2/icingaapi/api.go b/modules/icinga2/icingaapi/api.go index e33e98e..588a783 100644 --- a/modules/icinga2/icingaapi/api.go +++ b/modules/icinga2/icingaapi/api.go @@ -31,7 +31,12 @@ func newClient() *http.Client { // IsReachable checks if the endpoint is reachable within 5 sec func (endpoint *Endpoint) IsReachable(timeout time.Duration) error { // try to dial tcp connection within 5 seconds - conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", endpoint.Address, endpoint.Port), timeout) + context, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + var dialer net.Dialer + + conn, err := dialer.DialContext(context, "tcp", fmt.Sprintf("%s:%d", endpoint.Address, endpoint.Port)) if err != nil { return fmt.Errorf("cant connect to endpoint '%s' within 5 seconds: %w", endpoint.Address, err) } diff --git a/modules/icingadb/collector.go b/modules/icingadb/collector.go index 3bc32df..abab543 100644 --- a/modules/icingadb/collector.go +++ b/modules/icingadb/collector.go @@ -70,7 +70,8 @@ func Collect(c *collection.Collection) { } for _, file := range optionalFiles { - if _, err := os.Stat(file); err != nil { + _, err := os.Stat(file) + if err != nil { continue } @@ -87,7 +88,8 @@ func Collect(c *collection.Collection) { } for name, element := range journalctlLogs { - if service, err := collection.FindServices(element.Service); err == nil && len(service) > 0 { + service, err := collection.FindServices(element.Service) + if err == nil && len(service) > 0 { c.AddJournalLog(filepath.Join(ModuleName, name), element.Service) } } diff --git a/modules/icingadirector/collector.go b/modules/icingadirector/collector.go index 7cc5db8..95e4b74 100644 --- a/modules/icingadirector/collector.go +++ b/modules/icingadirector/collector.go @@ -64,7 +64,8 @@ func Collect(c *collection.Collection) { if c.Detailed { for name, element := range journalctlLogs { - if service, err := collection.FindServices(element.Service); err == nil && len(service) > 0 { + service, err := collection.FindServices(element.Service) + if err == nil && len(service) > 0 { c.AddJournalLog(filepath.Join(ModuleName, name), element.Service) } } diff --git a/modules/icingaweb2/collector.go b/modules/icingaweb2/collector.go index 72c35a8..2c91592 100644 --- a/modules/icingaweb2/collector.go +++ b/modules/icingaweb2/collector.go @@ -100,7 +100,8 @@ func Collect(c *collection.Collection) { // Detect PHP related packages and services c.AddInstalledPackagesRaw(filepath.Join(ModuleName, "packages-php.txt"), "*php*") - if services, err := collection.FindServices("*php*-fpm"); err == nil && len(services) > 0 { + services, err := collection.FindServices("*php*-fpm") + if err == nil && len(services) > 0 { for _, name := range services { c.AddServiceStatusRaw(filepath.Join(ModuleName, "service-"+name+".txt"), name) } @@ -112,7 +113,8 @@ func Collect(c *collection.Collection) { } for name, element := range journalctlLogs { - if service, err := collection.FindServices(element.Service); err == nil && len(service) > 0 { + service, err := collection.FindServices(element.Service) + if err == nil && len(service) > 0 { c.AddJournalLog(filepath.Join(ModuleName, name), element.Service) } } diff --git a/modules/mysql/collector.go b/modules/mysql/collector.go index 6a1170c..f58021e 100644 --- a/modules/mysql/collector.go +++ b/modules/mysql/collector.go @@ -76,7 +76,8 @@ func Collect(c *collection.Collection) { } for _, file := range optionalFiles { - if _, err := os.Stat(file); err != nil { + _, err := os.Stat(file) + if err != nil { continue } diff --git a/modules/webservers/collector.go b/modules/webservers/collector.go index b238643..04c57ad 100644 --- a/modules/webservers/collector.go +++ b/modules/webservers/collector.go @@ -59,7 +59,8 @@ func Collect(c *collection.Collection) { ) for _, file := range optionalFiles { - if _, err := os.Stat(file); err != nil { + _, err := os.Stat(file) + if err != nil { continue } @@ -71,7 +72,8 @@ func Collect(c *collection.Collection) { } for _, file := range possibleDaemons { - if _, err := os.Stat(file); err != nil { + _, err := os.Stat(file) + if err != nil { continue }