111 lines
2.4 KiB
Go
111 lines
2.4 KiB
Go
package cmd
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/url"
|
|
"os/exec"
|
|
"regexp"
|
|
"runtime"
|
|
"text/template"
|
|
|
|
"github.com/containous/flaeg"
|
|
"github.com/mvdan/xurls"
|
|
)
|
|
|
|
var (
|
|
bugtracker = "https://github.com/containous/traefik/issues/new"
|
|
bugTemplate = `### What version of Traefik are you using?
|
|
` + "```" + `
|
|
{{.Version}}
|
|
` + "```" + `
|
|
|
|
### What is your environment & configuration (arguments, toml...)?
|
|
` + "```" + `
|
|
{{.Configuration}}
|
|
` + "```" + `
|
|
|
|
### What did you do?
|
|
|
|
|
|
### What did you expect to see?
|
|
|
|
|
|
### What did you see instead?
|
|
`
|
|
)
|
|
|
|
// NewBugCmd builds a new Bug command
|
|
func NewBugCmd(traefikConfiguration interface{}, traefikPointersConfiguration interface{}) *flaeg.Command {
|
|
|
|
//version Command init
|
|
return &flaeg.Command{
|
|
Name: "bug",
|
|
Description: `Report an issue on Traefik bugtracker`,
|
|
Config: traefikConfiguration,
|
|
DefaultPointersConfig: traefikPointersConfiguration,
|
|
Run: func() error {
|
|
var version bytes.Buffer
|
|
if err := getVersionPrint(&version); err != nil {
|
|
return err
|
|
}
|
|
|
|
tmpl, err := template.New("").Parse(bugTemplate)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
configJSON, err := json.MarshalIndent(traefikConfiguration, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
v := struct {
|
|
Version string
|
|
Configuration string
|
|
}{
|
|
Version: version.String(),
|
|
Configuration: anonymize(string(configJSON)),
|
|
}
|
|
|
|
var bug bytes.Buffer
|
|
if err := tmpl.Execute(&bug, v); err != nil {
|
|
return err
|
|
}
|
|
|
|
body := bug.String()
|
|
url := bugtracker + "?body=" + url.QueryEscape(body)
|
|
if err := openBrowser(url); err != nil {
|
|
fmt.Print("Please file a new issue at " + bugtracker + " using this template:\n\n")
|
|
fmt.Print(body)
|
|
}
|
|
|
|
return nil
|
|
},
|
|
Metadata: map[string]string{
|
|
"parseAllSources": "true",
|
|
},
|
|
}
|
|
}
|
|
|
|
func openBrowser(url string) error {
|
|
var err error
|
|
switch runtime.GOOS {
|
|
case "linux":
|
|
err = exec.Command("xdg-open", url).Start()
|
|
case "windows":
|
|
err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
|
|
case "darwin":
|
|
err = exec.Command("open", url).Start()
|
|
default:
|
|
err = fmt.Errorf("unsupported platform")
|
|
}
|
|
return err
|
|
}
|
|
|
|
func anonymize(input string) string {
|
|
replace := "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
mailExp := regexp.MustCompile(`\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3}"`)
|
|
return xurls.Relaxed.ReplaceAllString(mailExp.ReplaceAllString(input, replace), replace)
|
|
}
|