in configs/main.go [123:240]
func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
configbucket := os.Getenv("ECR_SCAN_CONFIG_BUCKET")
fmt.Printf("DEBUG:: config continuous scan start\n")
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
return serverError(err)
}
svc := s3.NewFromConfig(cfg)
switch request.HTTPMethod {
case "POST":
fmt.Printf("DEBUG:: adding scan config\n")
ss := ScanSpec{}
// Unmarshal the JSON payload in the POST:
err := json.Unmarshal([]byte(request.Body), &ss)
if err != nil {
return serverError(err)
}
specID := uuid.NewV4()
// if err != nil {
// return serverError(err)
// }
ss.ID = specID.String()
ss.CreationTime = fmt.Sprintf("%v", time.Now().Unix())
err = storeScanSpec(configbucket, ss)
if err != nil {
return serverError(err)
}
msg := fmt.Sprintf("Added scan config. ID=%v ", ss.ID)
return events.APIGatewayProxyResponse{
StatusCode: http.StatusOK,
Headers: map[string]string{
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
Body: msg,
}, nil
case "DELETE":
fmt.Printf("DEBUG:: removing scan config\n")
// validate ID in URL path:
if _, ok := request.PathParameters["id"]; !ok {
return serverError(fmt.Errorf("Unknown configuration"))
}
resp, err := svc.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
Bucket: &configbucket,
},
)
// resp, err := req.Send(context.TODO())
if err != nil {
return serverError(err)
}
for _, obj := range resp.Contents {
fn := *obj.Key
scanID := strings.TrimSuffix(fn, ".json")
if scanID == request.PathParameters["id"] {
rmClusterSpec(configbucket, scanID)
msg := fmt.Sprintf("Deleted scan config %v ", request.PathParameters["id"])
return events.APIGatewayProxyResponse{
StatusCode: http.StatusOK,
Headers: map[string]string{
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
Body: msg,
}, nil
}
}
return events.APIGatewayProxyResponse{
StatusCode: http.StatusNotFound,
Headers: map[string]string{
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
Body: "This scan config does not exist, no operation performed",
}, nil
case "GET":
fmt.Printf("DEBUG:: listing scan config\n")
resp, err := svc.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
Bucket: &configbucket,
},
)
// resp, err := req.Send(context.TODO())
if err != nil {
return serverError(err)
}
scanspecs := []ScanSpec{}
for _, obj := range resp.Contents {
fn := *obj.Key
scanID := strings.TrimSuffix(fn, ".json")
scanspec, err := fetchScanSpec(configbucket, scanID)
if err != nil {
return serverError(err)
}
scanspecs = append(scanspecs, scanspec)
}
scanspecsjson, err := json.Marshal(scanspecs)
if err != nil {
return serverError(err)
}
return events.APIGatewayProxyResponse{
StatusCode: http.StatusOK,
Headers: map[string]string{
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
Body: string(scanspecsjson),
}, nil
}
fmt.Printf("DEBUG:: register continuous scan done\n")
return events.APIGatewayProxyResponse{
StatusCode: http.StatusMethodNotAllowed,
Headers: map[string]string{
"Access-Control-Allow-Origin": "*",
},
}, nil
}