diff options
Diffstat (limited to 'utils/config.go')
-rw-r--r-- | utils/config.go | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/utils/config.go b/utils/config.go new file mode 100644 index 000000000..b6688de68 --- /dev/null +++ b/utils/config.go @@ -0,0 +1,240 @@ +// 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 +} |