package main import ( "crypto/tls" "flag" "fmt" "log" "net" "os" "golang.org/x/term" "layeh.com/barnard/uiterm" "layeh.com/gumble/gumble" _ "layeh.com/gumble/opus" ) const defaultPort = "64738" func main() { // Command line flags server := flag.String("server", "localhost", "the server to connect to (host or host:port)") username := flag.String("username", "", "the username of the client") password := flag.String("password", "", "the password of the server (use MUMBLE_PASSWORD env var instead)") passwordPrompt := flag.Bool("password-prompt", false, "prompt for server password on stdin") insecure := flag.Bool("insecure", false, "skip server certificate verification") certificate := flag.String("certificate", "", "PEM encoded certificate and private key") debug := flag.Bool("debug", false, "enable debug logging to stderr") treeWidth := flag.Int("tree-width", 20, "width of the channel tree pane") logFile := flag.String("log", "", "write chat messages to file") flag.Parse() // Resolve password: env var > flag > prompt pass := os.Getenv("MUMBLE_PASSWORD") if pass == "" { pass = *password } if pass == "" && *passwordPrompt { fmt.Fprint(os.Stderr, "Password: ") raw, err := term.ReadPassword(int(os.Stdin.Fd())) fmt.Fprintln(os.Stderr) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } pass = string(raw) } // Default to standard Mumble port if not specified addr := *server if _, _, err := net.SplitHostPort(addr); err != nil { addr = net.JoinHostPort(addr, defaultPort) } // Initialize b := Barnard{ Config: gumble.NewConfig(), Address: addr, } b.Config.Username = *username b.Config.Password = pass b.TreeWidth = *treeWidth b.Debug = *debug if b.Debug { b.Logger = log.New(os.Stderr, "barnard: ", log.Ltime) b.debugf("connecting to %s as %q", addr, *username) } if *logFile != "" { f, err := os.OpenFile(*logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } defer f.Close() b.LogFile = f } if *insecure { b.TLSConfig.InsecureSkipVerify = true } if *certificate != "" { cert, err := tls.LoadX509KeyPair(*certificate, *certificate) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } b.TLSConfig.Certificates = append(b.TLSConfig.Certificates, cert) } b.Ui = uiterm.New(&b) b.Ui.Run() }