Semaphore/util/config.go
2016-04-11 11:30:31 +01:00

159 lines
3.4 KiB
Go

package util
import (
"encoding/json"
"flag"
"fmt"
"os"
"golang.org/x/crypto/bcrypt"
"github.com/bugsnag/bugsnag-go"
"github.com/gin-gonic/gin"
"github.com/mattbaird/gochimp"
)
var mandrillAPI *gochimp.MandrillAPI
var Migration bool
type mySQLConfig struct {
Hostname string `json:"host"`
Username string `json:"user"`
Password string `json:"pass"`
DbName string `json:"name"`
}
type mandrillConfig struct {
Username string `json:"username"`
Password string `json:"password"`
}
type configType struct {
MySQL mySQLConfig `json:"mysql"`
// Format as is with net.Dial
SessionDb string `json:"session_db"`
Mandrill mandrillConfig `json:"mandrill"`
// Format `:port_num` eg, :3000
Port string `json:"port"`
BugsnagKey string `json:"bugsnag_key"`
// semaphore stores projects here
TmpPath string `json:"tmp_path"`
}
var Config configType
func init() {
flag.BoolVar(&Migration, "migrate", false, "execute migrations")
path := flag.String("config", "", "config path")
var pwd string
flag.StringVar(&pwd, "hash", "", "generate hash of given password")
var printConfig bool
flag.BoolVar(&printConfig, "printConfig", false, "print example configuration")
flag.Parse()
if printConfig {
b, _ := json.MarshalIndent(&configType{
MySQL: mySQLConfig{
Hostname: "127.0.0.1:3306",
Username: "root",
DbName: "semaphore",
},
SessionDb: "127.0.0.1:6379",
Port: ":3000",
TmpPath: "/tmp/semaphore",
}, "", "\t")
fmt.Println(string(b))
os.Exit(0)
}
if len(pwd) > 0 {
password, _ := bcrypt.GenerateFromPassword([]byte(pwd), 11)
fmt.Println("Generated password: ", string(password))
os.Exit(0)
}
if path != nil && len(*path) > 0 {
// load
file, err := os.Open(*path)
if err != nil {
panic(err)
}
if err := json.NewDecoder(file).Decode(&Config); err != nil {
fmt.Println("Could not decode configuration!")
panic(err)
}
} else {
configFile, err := Asset("config.json")
if err != nil {
fmt.Println("Cannot Find configuration.")
os.Exit(1)
}
if err := json.Unmarshal(configFile, &Config); err != nil {
fmt.Println("Could not decode configuration!")
panic(err)
}
}
if len(os.Getenv("PORT")) > 0 {
Config.Port = ":" + os.Getenv("PORT")
}
if len(Config.Port) == 0 {
Config.Port = ":3000"
}
if len(Config.Mandrill.Password) > 0 {
api, _ := gochimp.NewMandrill(Config.Mandrill.Password)
mandrillAPI = api
}
if len(Config.TmpPath) == 0 {
Config.TmpPath = "/tmp/semaphore"
}
stage := ""
if gin.Mode() == "release" {
stage = "production"
} else {
stage = "development"
}
bugsnag.Configure(bugsnag.Configuration{
APIKey: Config.BugsnagKey,
ReleaseStage: stage,
NotifyReleaseStages: []string{"production"},
AppVersion: Version,
ProjectPackages: []string{"github.com/ansible-semaphore/semaphore/**"},
})
}
// encapsulate mandrill providing some defaults
func MandrillMessage(important bool) gochimp.Message {
return gochimp.Message{
AutoText: true,
InlineCss: true,
Important: important,
FromName: "Semaphore Daemon",
FromEmail: "noreply@semaphore.local",
}
}
func MandrillRecipient(name string, email string) gochimp.Recipient {
return gochimp.Recipient{
Email: email,
Name: name,
Type: "to",
}
}
func MandrillSend(message gochimp.Message) ([]gochimp.SendResponse, error) {
return mandrillAPI.MessageSend(message, false)
}