blob: 2e88dbf46d9f15ae0651440a5d4054fc61588c1c [file] [log] [blame]
// Copyright 2021 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.
// Command worker runs the vuln worker server.
package main
import (
"context"
"flag"
"fmt"
"net/http"
"os"
"cloud.google.com/go/errorreporting"
"golang.org/x/vuln/internal/derrors"
"golang.org/x/vuln/internal/worker"
"golang.org/x/vuln/internal/worker/log"
"golang.org/x/vuln/internal/worker/store"
)
var (
project = flag.String("project", os.Getenv("GOOGLE_CLOUD_PROJECT"), "project ID")
namespace = flag.String("namespace", os.Getenv("VULN_WORKER_NAMESPACE"), "Firestore namespace")
errorReporting = flag.Bool("reporterrors", os.Getenv("VULN_WORKER_REPORT_ERRORS") == "true", "use the error reporting API")
)
const serviceID = "vuln-worker"
func main() {
flag.Parse()
if *project == "" {
die("need -project or GOOGLE_CLOUD_PROJECT")
}
if *namespace == "" {
die("need -namespace or VULN_WORKER_NAMESPACE")
}
if os.Getenv("PORT") == "" && flag.NArg() == 0 {
die("need PORT or command-line args")
}
ctx := log.WithLineLogger(context.Background())
fstore, err := store.NewFireStore(ctx, *project, *namespace)
if err != nil {
die("firestore: %v", err)
}
if *errorReporting {
reportingClient, err := errorreporting.NewClient(ctx, *project, errorreporting.Config{
ServiceName: serviceID,
OnError: func(err error) {
log.Errorf(ctx, "Error reporting failed: %v", err)
},
})
if err != nil {
die("errorreporting: %v", err)
}
derrors.SetReportingClient(reportingClient)
}
_, err = worker.NewServer(ctx, *namespace, fstore)
if err != nil {
die("NewServer: %v", err)
}
addr := ":" + os.Getenv("PORT")
log.Infof(ctx, "Listening on addr %s", addr)
die("listening: %v", http.ListenAndServe(addr, nil))
}
func die(format string, args ...interface{}) {
fmt.Fprintf(os.Stderr, format, args...)
fmt.Fprintln(os.Stderr)
os.Exit(1)
}