# worker

`worker` is a binary that can act as both a CLI and a web server.

With no command-line arguments, it listens for HTTP traffic at the `PORT`
environment variable. There is no reason to run the server locally (except
debugging), so this document describes only the CLI.

The CLI can display Firestore database of CVE records, update the database from
commits of the CVE repo github.com/CVEProject/cvelist, and file issues.

## Setup

You will need a Google Cloud account and a project to run the worker. If you
don't already have default credentials on your machine, set them up with
```
gcloud auth application-default login
```

To run most CLI commands you'll need a `-project` flag, to specify the GCP
project where the Firestore DB resides. Since there is only one Firestore DB per
project and we want multiple, independent DBs, we also require a string called the
"namespace," specified with `-namespace`.

## update COMMIT

The update command takes a commit hash from the github.com/CVEProject/cvelist
repo, and modifies the DB to match the commit, creating and modifying CVE
records as needed. It does not file any issues; it only categorizes CVEs as
needing issues, not requiring action, and so on.

The command

```
worker -project go-vuln -namespace test update HEAD
```

will clone the cvelist repo from github and update the `test` namespace with the
most recent commit of the repo. It will contact pkg.go.dev to determine whether
URLs are modules.

To update at a different commit, or just to avoid the clone, clone the repo
locally and provide a path to it:

```
worker -project go-vuln -namespace test \
    -local-cve-repo ~/repos/github.com/CVEProject/cvelist \
    update cb2d8ae8ac0afed043d0fd99669e1aaac42e8b69
```

To avoid hitting pkg.go.dev, compile a file of known module paths, one per line,
and pass it as well:

```
worker -project go-vuln -namespace test \
    -local-cve-repo ~/repos/github.com/CVEProject/cvelist \
    -known-module-file ~/module-paths.txt \
    update cb2d8ae8ac0afed043d0fd99669e1aaac42e8b69
```

If an update is interrupted or fails to complete, subsequent calls to `worker
update` will fail. If you're sure there is no concurrent update in progress, it
is safe to pass the `-force` flag to force the update.

## list-cves

The command
```
worker -project go-vuln -namespace test list-cves NeedsIssue
```
will list all CVE records that need an issue. You can also use these other
argument values (from internal/worker/store/store.go:TriageState):

- IssueCreated
- UpdatedSinceIssueCreation
- HasVuln
- FalsePositive

It's not recommended to pass the "NoActionNeeded" triage state, because the vast
majority of records have this state and listing them takes a long time.

## create-issues

To create issues from records that need them, use the `create-issues` subcommand
and provide a repo and the path to a file that holds a GitHub access token.
You can also limit the number of issues created.

```
worker -project go-vuln -namespace test \
    -issue-repo myorg/myrepo \
    -ghtokenfile ~/github-token \
    -limit 10 \
    create-issues
```

## list-updates

This subcommand shows the update operations that have run, most to least recent.

## show

Run `show` with a list of CVE IDs to display the corresponding CVE records.
