// Send sends a crash report to bugsnag via an http call. func (r *BugsnagCrashReporter) Send(err CrashError) error { if r.noReportFileExist() || r.apiKey == noreportAPIKey { log.Debug("Opting out of crash reporting.") return nil } if r.apiKey == "" { return errors.New("Not sending report since no api key has been set.") } bugsnag.Configure(bugsnag.Configuration{ APIKey: r.apiKey, // XXX we need to abuse bugsnag metrics to get the OS/ARCH information as a usable filter // Can do that with either "stage" or "hostname" ReleaseStage: fmt.Sprintf("%s (%s)", runtime.GOOS, runtime.GOARCH), ProjectPackages: []string{"github.com/docker/machine/[^v]*"}, AppVersion: version.FullVersion(), Synchronous: true, PanicHandler: func() {}, Logger: new(logger), }) metaData := bugsnag.MetaData{} metaData.Add("app", "compiler", fmt.Sprintf("%s (%s)", runtime.Compiler, runtime.Version())) metaData.Add("device", "os", runtime.GOOS) metaData.Add("device", "arch", runtime.GOARCH) detectRunningShell(&metaData) detectUname(&metaData) detectOSVersion(&metaData) addFile(err.LogFilePath, &metaData) var buffer bytes.Buffer for _, message := range log.History() { buffer.WriteString(message + "\n") } metaData.Add("history", "trace", buffer.String()) return bugsnag.Notify(err.Cause, metaData, bugsnag.SeverityError, bugsnag.Context{String: err.Context}, bugsnag.ErrorClass{Name: fmt.Sprintf("%s/%s", err.DriverName, err.Command)}) }
func main() { if os.Getenv(localbinary.PluginEnvKey) == localbinary.PluginEnvVal { driverName := os.Getenv(localbinary.PluginEnvDriverName) runDriver(driverName) return } localbinary.CurrentBinaryIsDockerMachine = true setDebugOutputLevel() cli.AppHelpTemplate = AppHelpTemplate cli.CommandHelpTemplate = CommandHelpTemplate app := cli.NewApp() app.Name = filepath.Base(os.Args[0]) app.Author = "Docker Machine Contributors" app.Email = "https://github.com/docker/machine" app.Commands = commands.Commands app.CommandNotFound = cmdNotFound app.Usage = "Create and manage machines running Docker." app.Version = version.FullVersion() log.Debug("Docker Machine Version: ", app.Version) app.Flags = []cli.Flag{ cli.BoolFlag{ Name: "debug, D", Usage: "Enable debug mode", }, cli.StringFlag{ EnvVar: "MACHINE_STORAGE_PATH", Name: "s, storage-path", Value: mcndirs.GetBaseDir(), Usage: "Configures storage path", }, cli.StringFlag{ EnvVar: "MACHINE_TLS_CA_CERT", Name: "tls-ca-cert", Usage: "CA to verify remotes against", Value: "", }, cli.StringFlag{ EnvVar: "MACHINE_TLS_CA_KEY", Name: "tls-ca-key", Usage: "Private key to generate certificates", Value: "", }, cli.StringFlag{ EnvVar: "MACHINE_TLS_CLIENT_CERT", Name: "tls-client-cert", Usage: "Client cert to use for TLS", Value: "", }, cli.StringFlag{ EnvVar: "MACHINE_TLS_CLIENT_KEY", Name: "tls-client-key", Usage: "Private key used in client TLS auth", Value: "", }, cli.StringFlag{ EnvVar: "MACHINE_GITHUB_API_TOKEN", Name: "github-api-token", Usage: "Token to use for requests to the Github API", Value: "", }, cli.BoolFlag{ EnvVar: "MACHINE_NATIVE_SSH", Name: "native-ssh", Usage: "Use the native (Go-based) SSH implementation.", }, cli.StringFlag{ EnvVar: "MACHINE_BUGSNAG_API_TOKEN", Name: "bugsnag-api-token", Usage: "BugSnag API token for crash reporting", Value: "", }, } if err := app.Run(os.Args); err != nil { log.Error(err) } }
func main() { setDebugOutputLevel() cli.AppHelpTemplate = AppHelpTemplate cli.CommandHelpTemplate = CommandHelpTemplate app := cli.NewApp() app.Name = path.Base(os.Args[0]) app.Author = "Docker Machine Contributors" app.Email = "https://github.com/docker/machine" app.Before = func(c *cli.Context) error { // TODO: Need better handling of config, everything is too // complected together right now. if c.GlobalBool("native-ssh") { ssh.SetDefaultClient(ssh.Native) } mcnutils.GithubAPIToken = c.GlobalString("github-api-token") mcndirs.BaseDir = c.GlobalString("storage-path") return nil } app.Commands = commands.Commands app.CommandNotFound = cmdNotFound app.Usage = "Create and manage machines running Docker." app.Version = version.FullVersion() log.Debug("Docker Machine Version: ", app.Version) app.Flags = []cli.Flag{ cli.BoolFlag{ Name: "debug, D", Usage: "Enable debug mode", }, cli.StringFlag{ EnvVar: "MACHINE_STORAGE_PATH", Name: "s, storage-path", Value: mcndirs.GetBaseDir(), Usage: "Configures storage path", }, cli.StringFlag{ EnvVar: "MACHINE_TLS_CA_CERT", Name: "tls-ca-cert", Usage: "CA to verify remotes against", Value: "", }, cli.StringFlag{ EnvVar: "MACHINE_TLS_CA_KEY", Name: "tls-ca-key", Usage: "Private key to generate certificates", Value: "", }, cli.StringFlag{ EnvVar: "MACHINE_TLS_CLIENT_CERT", Name: "tls-client-cert", Usage: "Client cert to use for TLS", Value: "", }, cli.StringFlag{ EnvVar: "MACHINE_TLS_CLIENT_KEY", Name: "tls-client-key", Usage: "Private key used in client TLS auth", Value: "", }, cli.StringFlag{ EnvVar: "MACHINE_GITHUB_API_TOKEN", Name: "github-api-token", Usage: "Token to use for requests to the Github API", Value: "", }, cli.BoolFlag{ EnvVar: "MACHINE_NATIVE_SSH", Name: "native-ssh", Usage: "Use the native (Go-based) SSH implementation.", }, } // TODO: Close plugin servers in case of client panic. if err := app.Run(os.Args); err != nil { log.Error(err) } }