// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. // See License.txt for license information. package utils import ( l4g "code.google.com/p/log4go" "encoding/json" "os" "path/filepath" ) const ( MODE_DEV = "dev" MODE_BETA = "beta" MODE_PROD = "prod" ) type ServiceSettings struct { SiteName string Domain string Mode string AllowTesting bool UseSSL bool Port string Version string Shards map[string]string InviteSalt string PublicLinkSalt string ResetSalt string AnalyticsUrl string } type SqlSettings struct { DriverName string DataSource string DataSourceReplicas []string MaxIdleConns int MaxOpenConns int Trace bool AtRestEncryptKey string } type RedisSettings struct { DataSource string MaxOpenConns int } type LogSettings struct { ConsoleEnable bool ConsoleLevel string FileEnable bool FileLevel string FileFormat string FileLocation string } type AWSSettings struct { S3AccessKeyId string S3SecretAccessKey string S3Bucket string S3Region string Route53AccessKeyId string Route53SecretAccessKey string Route53ZoneId string Route53Region string } type ImageSettings struct { ThumbnailWidth uint ThumbnailHeight uint PreviewWidth uint PreviewHeight uint ProfileWidth uint ProfileHeight uint } type EmailSettings struct { SMTPUsername string SMTPPassword string SMTPServer string FeedbackEmail string FeedbackName string ApplePushServer string ApplePushCertPublic string ApplePushCertPrivate string } type PrivacySettings struct { ShowEmailAddress bool ShowPhoneNumber bool ShowSkypeId bool ShowFullName bool } type TeamSettings struct { MaxUsersPerTeam int AllowPublicLink bool TermsLink string PrivacyLink string AboutLink string HelpLink string ReportProblemLink string TourLink string DefaultThemeColor string } type Config struct { LogSettings LogSettings ServiceSettings ServiceSettings SqlSettings SqlSettings RedisSettings RedisSettings AWSSettings AWSSettings ImageSettings ImageSettings EmailSettings EmailSettings PrivacySettings PrivacySettings TeamSettings TeamSettings } func (o *Config) ToJson() string { b, err := json.Marshal(o) if err != nil { return "" } else { return string(b) } } var Cfg *Config = &Config{} var SanitizeOptions map[string]bool = map[string]bool{} func findConfigFile(fileName string) string { if _, err := os.Stat("/tmp/" + fileName); err == nil { fileName, _ = filepath.Abs("/tmp/" + fileName) } else if _, err := os.Stat("./config/" + fileName); err == nil { fileName, _ = filepath.Abs("./config/" + fileName) } else if _, err := os.Stat("../config/" + fileName); err == nil { fileName, _ = filepath.Abs("../config/" + fileName) } else if _, err := os.Stat(fileName); err == nil { fileName, _ = filepath.Abs(fileName) } return fileName } func FindDir(dir string) string { fileName := "." if _, err := os.Stat("./" + dir + "/"); err == nil { fileName, _ = filepath.Abs("./" + dir + "/") } else if _, err := os.Stat("../" + dir + "/"); err == nil { fileName, _ = filepath.Abs("../" + dir + "/") } else if _, err := os.Stat("/tmp/" + dir); err == nil { fileName, _ = filepath.Abs("/tmp/" + dir) } return fileName + "/" } func configureLog(s LogSettings) { l4g.Close() if s.ConsoleEnable { level := l4g.DEBUG if s.ConsoleLevel == "INFO" { level = l4g.INFO } else if s.ConsoleLevel == "ERROR" { level = l4g.ERROR } l4g.AddFilter("stdout", level, l4g.NewConsoleLogWriter()) } if s.FileEnable { if s.FileFormat == "" { s.FileFormat = "[%D %T] [%L] %M" } if s.FileLocation == "" { s.FileLocation = FindDir("logs") + "mattermost.log" } level := l4g.DEBUG if s.FileLevel == "INFO" { level = l4g.INFO } else if s.FileLevel == "ERROR" { level = l4g.ERROR } flw := l4g.NewFileLogWriter(s.FileLocation, false) flw.SetFormat(s.FileFormat) flw.SetRotate(true) flw.SetRotateLines(100000) l4g.AddFilter("file", level, flw) } } // LoadConfig will try to search around for the corresponding config file. // It will search /tmp/fileName then attempt ./config/fileName, // then ../config/fileName and last it will look at fileName func LoadConfig(fileName string) { fileName = findConfigFile(fileName) l4g.Info("Loading config file at " + fileName) file, err := os.Open(fileName) if err != nil { panic("Error opening config file=" + fileName + ", err=" + err.Error()) } decoder := json.NewDecoder(file) config := Config{} err = decoder.Decode(&config) if err != nil { panic("Error decoding configuration " + err.Error()) } configureLog(config.LogSettings) Cfg = &config SanitizeOptions = getSanitizeOptions() } func getSanitizeOptions() map[string]bool { options := map[string]bool{} options["fullname"] = Cfg.PrivacySettings.ShowFullName options["email"] = Cfg.PrivacySettings.ShowEmailAddress options["skypeid"] = Cfg.PrivacySettings.ShowSkypeId options["phonenumber"] = Cfg.PrivacySettings.ShowPhoneNumber return options } func IsS3Configured() bool { if Cfg.AWSSettings.S3AccessKeyId == "" || Cfg.AWSSettings.S3SecretAccessKey == "" || Cfg.AWSSettings.S3Region == "" || Cfg.AWSSettings.S3Bucket == "" { return false } return true }