Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 30 additions & 18 deletions base/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"fmt"
"os"
"os/exec"
"strings"

"github.com/go-sql-driver/mysql"
"github.com/keybase/go-keybase-chat-bot/kbchat"
Expand All @@ -32,9 +31,9 @@ type Options struct {
Announcement string
// Conversation name or ID to report bot errors to
ErrReportConv string
// Database Source Name
DSN string
MultiDSN string
// Parsed database configs
DSN *mysql.Config
MultiDSN *mysql.Config
// Allow the bot to read it's own messages (default: false)
ReadSelf bool
AWSOpts *AWSOptions
Expand All @@ -50,15 +49,15 @@ func NewOptions() *Options {
}

func (o *Options) Parse(fs *flag.FlagSet, argv []string) error {
var mysqlTLSCA string
var dsnStr, multiDSNStr, mysqlTLSCA string
fs.StringVar(&o.KeybaseLocation, "keybase", "keybase", "keybase command")
fs.StringVar(&o.Home, "home", "", "Home directory")
fs.StringVar(&o.Announcement, "announcement", os.Getenv("BOT_ANNOUNCEMENT"),
"Conversation name or ID to announce we are running")
fs.StringVar(&o.ErrReportConv, "err-report-conv", os.Getenv("BOT_ERR_REPORT_CONV"),
"Conversation name or ID to report errors to")
fs.StringVar(&o.DSN, "dsn", os.Getenv("BOT_DSN"), "Bot database DSN")
fs.StringVar(&o.MultiDSN, "multi-dsn", os.Getenv("BOT_MULTI_DSN"), "Bot multi coordination database DSN")
fs.StringVar(&dsnStr, "dsn", os.Getenv("BOT_DSN"), "Bot database DSN")
fs.StringVar(&multiDSNStr, "multi-dsn", os.Getenv("BOT_MULTI_DSN"), "Bot multi coordination database DSN")
fs.StringVar(&mysqlTLSCA, "mysql-tls-ca", os.Getenv("BOT_MYSQL_TLS_CA"), "Bot MySQL TLS CA")
fs.BoolVar(&o.ReadSelf, "read-self", false, "Allow the bot to read it's own messages")
fs.StringVar(&o.DebugTag, "debug-tag", os.Getenv("BOT_DEBUG_TAG"), "Bot debug tag")
Expand All @@ -74,20 +73,31 @@ func (o *Options) Parse(fs *flag.FlagSet, argv []string) error {
return err
}

// configure TLS CAs if specified
var err error
if dsnStr != "" {
if o.DSN, err = mysql.ParseDSN(dsnStr); err != nil {
return fmt.Errorf("error parsing DSN: %s", err)
}
}
if multiDSNStr != "" {
if o.MultiDSN, err = mysql.ParseDSN(multiDSNStr); err != nil {
return fmt.Errorf("error parsing MultiDSN: %s", err)
}
}

if mysqlTLSCA != "" {
if err := o.configureMySQLTLS(mysqlTLSCA); err != nil {
return err
}
}
return nil
}

func (o *Options) addTLSToDSN(dsn string, tlsConfigName string) string {
if strings.Contains(dsn, "?") {
return dsn + "&tls=" + tlsConfigName
if o.DSN != nil {
o.DSN.RejectReadOnly = true
}
return dsn + "?tls=" + tlsConfigName
if o.MultiDSN != nil {
o.MultiDSN.RejectReadOnly = true
}
return nil
}

func (o *Options) configureMySQLTLS(mysqlTLSCA string) error {
Expand All @@ -103,10 +113,12 @@ func (o *Options) configureMySQLTLS(mysqlTLSCA string) error {
if err := mysql.RegisterTLSConfig(configName, tlsConfig); err != nil {
return fmt.Errorf("error registering MySQL TLS config: %s", err)
}

o.DSN = o.addTLSToDSN(o.DSN, configName)
o.MultiDSN = o.addTLSToDSN(o.MultiDSN, configName)

if o.DSN != nil {
o.DSN.TLSConfig = configName
}
if o.MultiDSN != nil {
o.MultiDSN.TLSConfig = configName
}
return nil
}

Expand Down
9 changes: 5 additions & 4 deletions base/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"syscall"
"time"

"github.com/go-sql-driver/mysql"
"github.com/keybase/go-keybase-chat-bot/kbchat"
"github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1"
"golang.org/x/sync/errgroup"
Expand All @@ -39,15 +40,15 @@ type Server struct {
awsOpts *AWSOptions
kbc *kbchat.API
botAdmins []string
multiDBDSN string
multiDBDSN *mysql.Config
multi *multi
readSelf bool

runOptions kbchat.RunOptions
}

func NewServer(
name, announcement string, awsOpts *AWSOptions, multiDBDSN string, readSelf bool,
name, announcement string, awsOpts *AWSOptions, multiDBDSN *mysql.Config, readSelf bool,
runOptions kbchat.RunOptions,
) *Server {
return &Server{
Expand Down Expand Up @@ -124,8 +125,8 @@ func (s *Server) Start(errReportConv string) (kbc *kbchat.API, err error) {
}
debugConfig := NewChatDebugOutputConfig(s.kbc, errReportConv)
s.DebugOutput = NewDebugOutput("Server", debugConfig)
if s.multiDBDSN != "" {
db, err := sql.Open("mysql", s.multiDBDSN)
if s.multiDBDSN != nil {
db, err := sql.Open("mysql", s.multiDBDSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to Multi MySQL: %s", err)
return nil, err
Expand Down
4 changes: 2 additions & 2 deletions elastiwatch/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ func (s *BotServer) Go() (err error) {
if s.kbc, err = s.Start(s.opts.ErrReportConv); err != nil {
return err
}
sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -187,7 +187,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions gcalbot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ func (s *BotServer) Go() (err error) {
return err
}

sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -254,7 +254,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions githubbot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ func (s *BotServer) Go() (err error) {
return err
}

sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -285,7 +285,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions gitlabbot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ func (s *BotServer) Go() (err error) {
return err
}

sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -184,7 +184,7 @@ func mainInner() int {
if err := opts.Parse(fs, os.Args); err != nil {
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions macrobot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func (s *BotServer) Go() (err error) {
if s.kbc, err = s.Start(s.opts.ErrReportConv); err != nil {
return err
}
sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -134,7 +134,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions meetbot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ func (s *BotServer) Go() (err error) {
return fmt.Errorf("failed to get config %v", err)
}

sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -145,7 +145,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions pollbot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ func (s *BotServer) Go() (err error) {
if s.kbc, err = s.Start(s.opts.ErrReportConv); err != nil {
return err
}
sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -151,7 +151,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions triviabot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func (s *BotServer) Go() (err error) {
if s.kbc, err = s.Start(s.opts.ErrReportConv); err != nil {
return err
}
sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -111,7 +111,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions webhookbot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ func (s *BotServer) Go() (err error) {
if s.kbc, err = s.Start(s.opts.ErrReportConv); err != nil {
return err
}
sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -149,7 +149,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
4 changes: 2 additions & 2 deletions zoombot/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ func (s *BotServer) Go() (err error) {
// https://devforum.zoom.us/t/invalid-scope-errors/52654/14
}

sdb, err := sql.Open("mysql", s.opts.DSN)
sdb, err := sql.Open("mysql", s.opts.DSN.FormatDSN())
if err != nil {
s.Errorf("failed to connect to MySQL: %s", err)
return err
Expand Down Expand Up @@ -180,7 +180,7 @@ func mainInner() int {
fmt.Printf("Unable to parse options: %v\n", err)
return 3
}
if len(opts.DSN) == 0 {
if opts.DSN == nil {
fmt.Printf("must specify a database DSN\n")
return 3
}
Expand Down
Loading