blob: 9b6ce2adfeafad4b137f80637919a1de3d2d353b [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// TODO(jba): delete when the worker is reliably computing
// request counts.
// Command vulndbreqs inserts and displays vuln DB request counts.
package main
import (
"context"
"errors"
"flag"
"fmt"
"log"
"cloud.google.com/go/civil"
"golang.org/x/pkgsite-metrics/internal"
"golang.org/x/pkgsite-metrics/internal/bigquery"
"golang.org/x/pkgsite-metrics/internal/config"
"golang.org/x/pkgsite-metrics/internal/vulndbreqs"
)
var date = flag.String("date", "", "date for compute")
func main() {
flag.Usage = func() {
out := flag.CommandLine.Output()
fmt.Fprintln(out, "usage:")
fmt.Fprintln(out, "vulndbreqs add [DATE]")
fmt.Fprintln(out, " calculate missing vuln DB counts and add to BigQuery")
fmt.Fprintln(out, "vulndbreqs compute")
fmt.Fprintln(out, " calculate and display vuln DB counts")
fmt.Fprintln(out, "vulndbreqs show")
fmt.Fprintln(out, " display vuln DB counts")
flag.PrintDefaults()
}
flag.Parse()
if err := run(context.Background()); err != nil {
log.Fatal(err)
}
}
func run(ctx context.Context) error {
cfg, err := config.Init(ctx)
if err != nil {
return err
}
if cfg.ProjectID == "" {
return errors.New("missing project ID (GOOGLE_CLOUD_PROJECT environment variable)")
}
client, err := bigquery.NewClientCreate(ctx, cfg.ProjectID, vulndbreqs.DatasetName)
if err != nil {
return err
}
defer client.Close()
keyName := "projects/" + cfg.ProjectID + "/secrets/vulndb-hmac-key"
var hmacKey []byte
if flag.Arg(0) == "add" || flag.Arg(0) == "compute" {
hk, err := internal.GetSecret(ctx, keyName)
if err != nil {
return err
}
hmacKey = []byte(hk)
}
switch flag.Arg(0) {
case "add":
err = doAdd(ctx, cfg.VulnDBBucketProjectID, client, hmacKey, flag.Arg(1))
case "compute":
err = doCompute(ctx, cfg.VulnDBBucketProjectID, hmacKey)
case "show":
err = doShow(ctx, client)
default:
return fmt.Errorf("unknown command %q", flag.Arg(0))
}
return err
}
func doAdd(ctx context.Context, projectID string, client *bigquery.Client, hmacKey []byte, date string) error {
if date == "" {
return vulndbreqs.ComputeAndStore(ctx, projectID, client, hmacKey)
}
d, err := civil.ParseDate(date)
if err != nil {
return err
}
return vulndbreqs.ComputeAndStoreDate(ctx, projectID, client, hmacKey, d)
}
func doCompute(ctx context.Context, projectID string, hmacKey []byte) error {
d, err := civil.ParseDate(*date)
if err != nil {
return err
}
rcs, err := vulndbreqs.Compute(ctx, projectID, d, hmacKey)
if err != nil {
return err
}
for _, rc := range rcs {
fmt.Printf("%s\t%d\t%s\n", rc.Date, rc.Count, rc.IP)
}
return nil
}
func doShow(ctx context.Context, client *bigquery.Client) error {
counts, err := vulndbreqs.ReadRequestCountsFromBigQuery(ctx, client)
if err != nil {
return err
}
for _, c := range counts {
fmt.Printf("%s\t%d\n", c.Date, c.Count)
}
return nil
}