Skip to content

Commit 27a7d20

Browse files
committed
rename directory
1 parent 45a20aa commit 27a7d20

File tree

3 files changed

+97
-17
lines changed

3 files changed

+97
-17
lines changed

jfrog/client.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ type Client struct {
2222
user string
2323
}
2424

25-
func XRayClient(url, user, token string) (*jfroghttpclient.JfrogHttpClient, error) {
25+
func XRayClient(url, user, token string) (*Client, error) {
2626
details := auth.NewXrayDetails()
2727
details.SetAccessToken(token)
2828
details.SetUser(user)
29-
details.SetUrl("https://cdr.jfrog.io/")
29+
details.SetUrl(url)
3030
conf, err := config.NewConfigBuilder().SetServiceDetails(details).Build()
3131
if err != nil {
3232
return nil, xerrors.Errorf("new config builder: %w", err)
@@ -35,7 +35,12 @@ func XRayClient(url, user, token string) (*jfroghttpclient.JfrogHttpClient, erro
3535
if err != nil {
3636
return nil, xerrors.Errorf("new xray manager: %w", err)
3737
}
38-
return mgr.Client(), nil
38+
return &Client{
39+
client: mgr.Client(),
40+
baseURL: url,
41+
user: user,
42+
token: token,
43+
}, nil
3944
}
4045

4146
type securityResultsPayload struct {

k8s/reporter.go renamed to reporter/reporter.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ import (
99
"github.com/coder/coder/v2/codersdk/agentsdk"
1010
"github.com/coder/xray/jfrog"
1111

12-
"cdr.dev/slog"
1312
corev1 "k8s.io/api/core/v1"
1413
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1514
"k8s.io/client-go/informers"
1615
"k8s.io/client-go/kubernetes"
1716
"k8s.io/client-go/tools/cache"
17+
18+
"cdr.dev/slog"
1819
)
1920

2021
type K8sReporter struct {
@@ -29,6 +30,7 @@ type K8sReporter struct {
2930

3031
ctx context.Context
3132
podInformer cache.SharedIndexInformer
33+
errChan chan error
3234
}
3335

3436
type WorkspaceAgent struct {
@@ -38,6 +40,7 @@ type WorkspaceAgent struct {
3840

3941
func (k *K8sReporter) Init(ctx context.Context) error {
4042
k.ctx = ctx
43+
k.errChan = make(chan error)
4144

4245
podFactory := informers.NewSharedInformerFactoryWithOptions(k.Client, 0, informers.WithNamespace(k.Namespace), informers.WithTweakListOptions(func(lo *v1.ListOptions) {
4346
lo.FieldSelector = k.FieldSelector
@@ -54,6 +57,9 @@ func (k *K8sReporter) Init(ctx context.Context) error {
5457
return
5558
}
5659

60+
log := k.Logger.With(
61+
slog.F("pod_name", pod.Name),
62+
)
5763
var isWorkspace bool
5864
for _, container := range pod.Spec.Containers {
5965
var agentToken string
@@ -69,31 +75,37 @@ func (k *K8sReporter) Init(ctx context.Context) error {
6975
continue
7076
}
7177

78+
log = log.With(
79+
slog.F("container_name", container.Name),
80+
slog.F("container_image", container.Image),
81+
)
82+
7283
image, err := jfrog.ParseImage(container.Image)
7384
if err != nil {
74-
k.Logger.Error(ctx, "parse image",
75-
slog.F("pod_name", pod.Name),
76-
slog.F("container_name", container.Name),
77-
slog.F("container_image", container.Image),
78-
slog.Error(err),
79-
)
85+
log.Error(ctx, "parse image", slog.Error(err))
8086
return
8187
}
8288

8389
scan, err := k.JFrogClient.ScanResults(image)
8490
if err != nil {
85-
k.Logger.Error(ctx, "fetch scan results", slog.Error(err))
91+
log.Error(ctx, "fetch scan results", slog.Error(err))
8692
return
8793
}
8894

8995
agentClient := agentsdk.New(k.CoderURL)
9096
agentClient.SetSessionToken(agentToken)
9197
manifest, err := agentClient.Manifest(ctx)
9298
if err != nil {
93-
k.Logger.Error(ctx, "Get agent manifest", slog.Error(err))
99+
log.Error(ctx, "Get agent manifest", slog.Error(err))
94100
return
95101
}
96102

103+
log = log.With(
104+
slog.F("workspace_id", manifest.WorkspaceID),
105+
slog.F("agent_id", manifest.AgentID),
106+
slog.F("workspace_name", manifest.WorkspaceName),
107+
)
108+
97109
cclient := codersdk.New(k.CoderURL)
98110
cclient.SetSessionToken(k.CoderToken)
99111
err = cclient.PostJFrogXrayScan(ctx, codersdk.JFrogXrayScan{
@@ -103,12 +115,12 @@ func (k *K8sReporter) Init(ctx context.Context) error {
103115
High: scan.SecurityIssues.High,
104116
})
105117
if err != nil {
106-
k.Logger.Error(ctx, "post xray results", slog.Error(err))
118+
log.Error(ctx, "post xray results", slog.Error(err))
107119
return
108120
}
109121
}
110122
if isWorkspace {
111-
k.Logger.Info(ctx, "uploaded workspace results!", slog.F("name", pod.Name), slog.F("namespace", pod.Namespace))
123+
log.Info(ctx, "uploaded workspace results!", slog.F("pod_name", pod.Name), slog.F("namespace", pod.Namespace))
112124
}
113125
},
114126
})
@@ -117,3 +129,7 @@ func (k *K8sReporter) Init(ctx context.Context) error {
117129
}
118130
return nil
119131
}
132+
133+
func (k *K8sReporter) Start(stop chan struct{}) {
134+
k.podInformer.Run(stop)
135+
}

root.go

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,81 @@
11
package main
22

33
import (
4+
"fmt"
5+
"net/url"
46
"os"
57

68
"github.com/spf13/cobra"
9+
"golang.org/x/xerrors"
10+
"k8s.io/client-go/kubernetes"
11+
"k8s.io/client-go/tools/clientcmd"
12+
13+
"github.com/coder/xray/jfrog"
714
)
815

916
func root() *cobra.Command {
1017
var (
1118
coderURL string
19+
artifactoryURL string
20+
artifactoryUser string
21+
artifactoryToken string
1222
fieldSelector string
1323
kubeConfig string
1424
namespace string
1525
labelSelector string
16-
artifactoryToken string
1726
)
18-
cmd := &cobra.Command{}
19-
cmd.Flags().StringVarP(&coderURL, "coder-url", "u", os.Getenv("CODER_URL"), "URL of the Coder instance")
27+
cmd := &cobra.Command{
28+
Use: "scan",
29+
Short: "Scan Coder Kubernetes workspace images for vulnerabilities",
30+
RunE: func(cmd *cobra.Command, args []string) error {
31+
if coderURL == "" {
32+
return xerrors.New("--coder-url is required")
33+
}
34+
35+
coderParsed, err := url.Parse(coderURL)
36+
if err != nil {
37+
return fmt.Errorf("parse coder URL: %w", err)
38+
}
39+
40+
if artifactoryURL == "" {
41+
return xerrors.New("--coder-url is required")
42+
}
43+
44+
_, err = url.Parse(artifactoryURL)
45+
if err != nil {
46+
return fmt.Errorf("parse coder URL: %w", err)
47+
}
48+
49+
if artifactoryUser == "" {
50+
return xerrors.New("--artifactory-user is required")
51+
}
52+
53+
if artifactoryToken == "" {
54+
return xerrors.New("--artifactory-token is required")
55+
}
56+
57+
config, err := clientcmd.BuildConfigFromFlags("", kubeConfig)
58+
if err != nil {
59+
return xerrors.Errorf("build kubeconfig: %w", err)
60+
}
61+
62+
kclient, err := kubernetes.NewForConfig(config)
63+
if err != nil {
64+
return xerrors.Errorf("create kubernetes config: %w", err)
65+
}
66+
67+
jClient, err := jfrog.XRayClient(artifactoryURL, artifactoryUser, artifactoryToken)
68+
if err != nil {
69+
return xerrors.Errorf("create artifactory client: %w", err)
70+
}
71+
72+
return nil
73+
},
74+
}
75+
cmd.Flags().StringVarP(&coderURL, "coder-url", "cu", os.Getenv("CODER_URL"), "URL of the Coder instance")
76+
cmd.Flags().StringVarP(&artifactoryURL, "artifactory-url", "", os.Getenv("ARTIFACTORY_URL"), "URL of the JFrog Artifactory instance")
77+
cmd.Flags().StringVarP(&artifactoryToken, "artifactory-token", "", os.Getenv("ARTIFACTORY_TOKEN"), "Access Token for JFrog Artifactory instance")
78+
cmd.Flags().StringVarP(&artifactoryUser, "artifactory-user", "", os.Getenv("ARTIFACTORY_USER"), "User to interface with JFrog Artifactory instance")
2079
cmd.Flags().StringVarP(&kubeConfig, "kubeconfig", "k", "~/.kube/config", "Path to the kubeconfig file")
2180
cmd.Flags().StringVarP(&namespace, "namespace", "n", os.Getenv("CODER_NAMESPACE"), "Namespace to use when listing pods")
2281
cmd.Flags().StringVarP(&fieldSelector, "field-selector", "f", "", "Field selector to use when listing pods")

0 commit comments

Comments
 (0)