Skip to content

Commit b5f2ec2

Browse files
committed
feat(security): add TriggerScan method for post-update CVE verification
Add ScanResponse model matching the security-exporter /scan endpoint response with severity breakdown and cves_fixed count. Add TriggerScan() to SecurityExporter interface with 6-minute timeout to accommodate full vulnerability scan duration.
1 parent c8e8e57 commit b5f2ec2

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

pkg/security/model.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,17 @@ type TotalNumberOfPackagesWithUpdateResponse struct {
99
TotalNumberOfPackagesWithUpdate int `json:"total_number_of_packages_with_update"`
1010
HasKernelUpdate bool `json:"has_kernel_update"`
1111
}
12+
13+
type ScanResponse struct {
14+
Success bool `json:"success"`
15+
TotalCVEs int `json:"total_cves"`
16+
CriticalCVEs int `json:"critical_cves"`
17+
HighCVEs int `json:"high_cves"`
18+
MediumCVEs int `json:"medium_cves"`
19+
LowCVEs int `json:"low_cves"`
20+
PackagesWithUpdates int `json:"packages_with_updates"`
21+
KernelUpdateAvailable bool `json:"kernel_update_available"`
22+
PreviousTotalCVEs int `json:"previous_total_cves"`
23+
CVEsFixed int `json:"cves_fixed"`
24+
Error string `json:"error,omitempty"`
25+
}

pkg/security/security-exporter.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package security
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"fmt"
67
"log/slog"
78
"net/http"
9+
"time"
810
)
911

1012
type securityExporter struct {
@@ -14,6 +16,8 @@ type securityExporter struct {
1416

1517
const (
1618
totalNumberOfPackageUpdatesPath = "/total_number_of_packages_with_update"
19+
scanPath = "/scan"
20+
scanTimeout = 6 * time.Minute
1721
)
1822

1923
func (s *securityExporter) GetNumberOfPackageUpdates() (*TotalNumberOfPackagesWithUpdateResponse, error) {
@@ -53,6 +57,30 @@ func (s *securityExporter) GetNumberOfPackageUpdates() (*TotalNumberOfPackagesWi
5357
// nolint: revive
5458
type SecurityExporter interface {
5559
GetNumberOfPackageUpdates() (*TotalNumberOfPackagesWithUpdateResponse, error)
60+
TriggerScan() (*ScanResponse, error)
61+
}
62+
63+
func (s *securityExporter) TriggerScan() (*ScanResponse, error) {
64+
client := &http.Client{Timeout: scanTimeout}
65+
66+
resp, err := client.Post(fmt.Sprintf("%s%s", s.hostURL, scanPath), "application/json", bytes.NewReader(nil))
67+
if err != nil {
68+
slog.Error("failed to trigger scan on security exporter", slog.Any("error", err))
69+
return nil, err
70+
}
71+
defer func() {
72+
if err := resp.Body.Close(); err != nil {
73+
slog.Error("failed to close response body", slog.Any("error", err))
74+
}
75+
}()
76+
77+
scanResp := &ScanResponse{}
78+
if err := json.NewDecoder(resp.Body).Decode(scanResp); err != nil {
79+
slog.Error("failed to decode scan response", slog.Any("error", err))
80+
return nil, err
81+
}
82+
83+
return scanResp, nil
5684
}
5785

5886
func NewSecurityExporter(hostURL string) SecurityExporter {

0 commit comments

Comments
 (0)