cmd/genhtml: delete

The HTML pages for the vulnerability database will live at
pkg.go.dev/vuln, so this command is no longer necessary.

Change-Id: Ib5612b8958a46a81a561da2ddfe035af094009b9
Reviewed-on: https://go-review.googlesource.com/c/vulndb/+/355196
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Roland Shoemaker <roland@golang.org>
diff --git a/README.md b/README.md
index 0912eff..161fc5e 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,6 @@
 * `cmd/dbdiff` provides a tool for comparing two different versions of the
   vulnerability database
 * `cmd/gendb` provides a tool for converting YAML reports into JSON database
-* `cmd/genhtml` provides a tool for converting YAML reports into a HTML website
 * `cmd/linter` provides a tool for linting individual reports
 * `cmd/report2cve` provides a tool for converting YAML reports into JSON CVEs
 
diff --git a/cmd/genhtml/main.go b/cmd/genhtml/main.go
deleted file mode 100644
index aa00048..0000000
--- a/cmd/genhtml/main.go
+++ /dev/null
@@ -1,215 +0,0 @@
-// 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.
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"html/template"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"sort"
-	"strings"
-
-	"golang.org/x/vulndb/internal/report"
-	"gopkg.in/yaml.v2"
-)
-
-var indexTemplate = template.Must(template.New("index").Parse(`<html>
-<body>
-	<h1>Go Vulnerability Database</h1>
-	<ul>
-		{{range .Vulns}}<li><a href="{{.}}.html">{{.}}</a></li>{{end}}
-	</ul>
-	<h2>Packages</h2>
-	<ul>
-		{{range .Packages}}<li><a href="{{.}}.html">{{.}}</a></li>{{end}}
-	</ul>
-</body>
-</html>`))
-var packageIndexTemplate = template.Must(template.New("package-index").Parse(`<html>
-<body>
-	<h1>{{.Name}} Vulnerabilities</h1>
-	<ul>
-		{{range .Vulns}}<li><a href="{{.}}.html">{{.}}</a></li>{{end}}
-	</ul>
-</body>
-</html>`))
-var vulnTemplate = template.Must(template.New("vuln").Parse(`<html>
-<body>
-    <h1>{{.Name}}</h1>
-    {{if .Vuln.Severity}}<p><b>Severity: </b>{{.Vuln.Severity}}</p>{{end}}
-    {{if .Vuln.OS}}<p><b>Affected Operating Systems: </b>{{.Vuln.OS}}</p>{{end}}
-    {{if .Vuln.Arch}}<p><b>Affected Architectures: </b>{{.Vuln.Arch}}</p>{{end}}
-	<p>{{.Vuln.Description}}</p>
-	{{if .Vuln.Credit}}<p><b>Credit: </b>{{.Vuln.Credit}}</p>{{end}}
-	{{if .Vuln.CVE}}<p><b>CVE: </b>{{.Vuln.CVE}}</p>{{end}}
-
-    <h2>Affected Packages</h2>
-    <table>
-        <tr>
-            <th>Package</th>
-            <th>Introduced</th>
-            <th>Fixed</th>
-            <th>Symbols</th>
-        </tr>
-        <tr>
-            <td><code>{{.Vuln.Package}}</code></td>
-            {{if not .Vuln.Versions}}<td colspan="2" style="text-align: center">All available versions are vulnerable</td>{{else}}
-            {{range .Vuln.Versions}}
-            <td style="text-align: center">{{.Introduced}}</td>
-            <td style="text-align: center">{{.Fixed}}</td>
-            {{end}}
-            {{end}}
-            <td>
-                <ul>
-                    {{range .Vuln.Symbols}}<li><code>{{.}}</code></li>{{end}}
-                </ul>
-            </td>
-        </tr>
-        {{range .Vuln.AdditionalPackages}}
-        <tr>
-            <td><code>{{.Package}}</code></td>
-            {{if not .Versions}}<td colspan="2" style="text-align: center">All available versions are vulnerable</td>{{else}}
-            {{range .Versions}}
-            <td style="text-align: center">{{.Introduced}}</td>
-            <td style="text-align: center">{{.Fixed}}</td>
-            {{end}}
-            {{end}}
-            <td>
-                <ul>
-                    {{range .Symbols}}<li><code>{{.}}</code></li>{{end}}
-                </ul>
-            </td>
-        </tr>
-        {{end}}
-    </table>
-
-	<h2>Context</h2>
-	{{if .Vuln.Links.Commit}}<p><b>Commit: </b><a href="{{.Vuln.Links.Commit}}">{{.Vuln.Links.Commit}}</a></p>{{end}}
-	{{if .Vuln.Links.PR}}<p><b>PR: </b><a href="{{.Vuln.Links.PR}}">{{.Vuln.Links.PR}}</a></p>{{end}}
-	{{if .Vuln.Links.Context}}<p><b>Additional links:</b><ul>{{range .Vuln.Links.Context}}<li><a href="{{.}}">{{.}}</a></li>{{end}}</ul></p>{{end}}
-</body>
-</html>`))
-
-func generateWebsite(vulns map[string]report.Report, htmlDir string) error {
-	index := map[string][]string{}
-	var vulnNames []string
-	for name, vuln := range vulns {
-		index[vuln.Package] = append(index[vuln.Package], name)
-		for _, additional := range vuln.AdditionalPackages {
-			index[additional.Package] = append(index[additional.Package], name)
-		}
-		vulnNames = append(vulnNames, name)
-
-		filename := filepath.Join(htmlDir, name+".html")
-		file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755)
-		if err != nil {
-			return err
-		}
-		defer file.Close()
-		err = vulnTemplate.Execute(file, struct {
-			Name string
-			Vuln report.Report
-		}{
-			Name: name,
-			Vuln: vuln,
-		})
-		if err != nil {
-			return err
-		}
-	}
-
-	for p, vulns := range index {
-		filename := filepath.Join(htmlDir, p+".html")
-		if err := os.MkdirAll(strings.TrimSuffix(filename, filepath.Base(filename)), 0755); err != nil {
-			return err
-		}
-		file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755)
-		if err != nil {
-			return err
-		}
-		defer file.Close()
-		err = packageIndexTemplate.Execute(file, struct {
-			Name  string
-			Vulns []string
-		}{
-			Name:  p,
-			Vulns: vulns,
-		})
-		if err != nil {
-			return err
-		}
-	}
-
-	var packageNames []string
-	for name := range index {
-		packageNames = append(packageNames, name)
-	}
-
-	sort.Strings(packageNames)
-	sort.Strings(vulnNames)
-	file, err := os.OpenFile(filepath.Join(htmlDir, "index.html"), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755)
-	if err != nil {
-		return err
-	}
-	defer file.Close()
-	err = indexTemplate.Execute(file, struct {
-		Vulns    []string
-		Packages []string
-	}{
-		Vulns:    vulnNames,
-		Packages: packageNames,
-	})
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func fail(why string) {
-	fmt.Fprintln(os.Stderr, why)
-	os.Exit(1)
-}
-
-func main() {
-	yamlDir := flag.String("reports", "Directory containing yaml reports", "")
-	htmlDir := flag.String("out", "Directory to write website to", "")
-	flag.Parse()
-
-	htmlVulns := map[string]report.Report{}
-	yamlFiles, err := ioutil.ReadDir(*yamlDir)
-	if err != nil {
-		fail(fmt.Sprintf("can't read %q: %s", *yamlDir, err))
-	}
-	for _, f := range yamlFiles {
-		if !strings.HasSuffix(f.Name(), ".yaml") {
-			continue
-		}
-		content, err := ioutil.ReadFile(f.Name())
-		if err != nil {
-			fail(fmt.Sprintf("can't read %q: %s", f.Name(), err))
-		}
-		var vuln report.Report
-		err = yaml.UnmarshalStrict(content, &vuln)
-		if err != nil {
-			fail(fmt.Sprintf("unable to unmarshal %q: %s", f.Name(), err))
-		}
-		if lints := vuln.Lint(); len(lints) > 0 {
-			fmt.Fprintf(os.Stderr, "invalid vulnerability file %q:\n", os.Args[1])
-			for _, lint := range lints {
-				fmt.Fprintf(os.Stderr, "\t%s\n", lint)
-			}
-			os.Exit(1)
-		}
-		name := strings.TrimSuffix(filepath.Base(f.Name()), filepath.Ext(f.Name()))
-		htmlVulns[name] = vuln
-	}
-	err = generateWebsite(htmlVulns, *htmlDir)
-	if err != nil {
-		fail(fmt.Sprintf("failed to generate website: %s", err))
-	}
-}