statping/core/configs.go

209 lines
5.4 KiB
Go
Raw Normal View History

2018-12-04 05:57:11 +00:00
// Statping
2018-08-16 06:22:20 +00:00
// Copyright (C) 2018. Hunter Long and the project contributors
// Written by Hunter Long <info@socialeck.com> and the project contributors
//
2018-12-04 04:17:29 +00:00
// https://github.com/hunterlong/statping
2018-08-16 06:22:20 +00:00
//
// The licenses for most software and other practical works are designed
// to take away your freedom to share and change the works. By contrast,
// the GNU General Public License is intended to guarantee your freedom to
// share and change all versions of a program--to make sure it remains free
// software for all its users.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
2018-06-30 00:57:05 +00:00
package core
import (
"errors"
"fmt"
2018-06-30 00:57:05 +00:00
"github.com/go-yaml/yaml"
2018-12-04 04:17:29 +00:00
"github.com/hunterlong/statping/types"
"github.com/hunterlong/statping/utils"
2018-06-30 00:57:05 +00:00
"io/ioutil"
"os"
2018-06-30 00:57:05 +00:00
)
2018-11-16 16:42:49 +00:00
// ErrorResponse is used for HTTP errors to show to User
2018-09-25 07:03:49 +00:00
type ErrorResponse struct {
Error string
}
2018-10-11 16:53:13 +00:00
// LoadConfigFile will attempt to load the 'config.yml' file in a specific directory
2019-12-30 08:08:51 +00:00
func LoadConfigFile(directory string) (*types.DbConfig, error) {
var configs *types.DbConfig
if os.Getenv("DB_CONN") != "" {
2019-12-30 11:12:14 +00:00
log.Warnln("DB_CONN environment variable was found, waiting for database...")
return LoadUsingEnv()
}
2019-12-30 08:08:51 +00:00
log.Debugln("attempting to read config file at: " + directory + "/config.yml")
file, err := ioutil.ReadFile(directory + "/config.yml")
2018-06-30 00:57:05 +00:00
if err != nil {
2020-01-28 12:15:48 +00:00
CoreApp.Setup = false
return nil, errors.New("config.yml file not found at " + directory + "/config.yml - starting in setup mode")
}
err = yaml.Unmarshal(file, &configs)
2018-07-28 01:50:13 +00:00
if err != nil {
return nil, err
}
2019-12-30 08:08:51 +00:00
log.WithFields(utils.ToFields(configs)).Debugln("read config file: " + directory + "/config.yml")
CoreApp.Config = configs
return configs, err
}
// LoadUsingEnv will attempt to load database configs based on environment variables. If DB_CONN is set if will force this function.
2019-12-30 08:08:51 +00:00
func LoadUsingEnv() (*types.DbConfig, error) {
2019-02-11 21:10:17 +00:00
Configs, err := EnvToConfig()
if err != nil {
return Configs, err
}
CoreApp.Name = os.Getenv("NAME")
2019-02-11 21:10:17 +00:00
if Configs.Domain == "" {
CoreApp.Domain = Configs.LocalIP
} else {
CoreApp.Domain = os.Getenv("DOMAIN")
}
CoreApp.UseCdn = types.NewNullBool(os.Getenv("USE_CDN") == "true")
2019-12-30 08:08:51 +00:00
err = CoreApp.Connect(true, utils.Directory)
if err != nil {
log.Errorln(err)
return nil, err
2018-06-30 00:57:05 +00:00
}
2019-12-30 08:08:51 +00:00
CoreApp.SaveConfig(Configs)
exists := DbSession.HasTable("core")
if !exists {
log.Infoln(fmt.Sprintf("Core database does not exist, creating now!"))
2019-12-30 08:08:51 +00:00
CoreApp.DropDatabase()
CoreApp.CreateDatabase()
CoreApp, err = CoreApp.InsertCore(Configs)
if err != nil {
log.Errorln(err)
}
username := os.Getenv("ADMIN_USER")
if username == "" {
username = "admin"
}
password := os.Getenv("ADMIN_PASSWORD")
if password == "" {
password = "admin"
}
2018-10-11 16:53:13 +00:00
admin := ReturnUser(&types.User{
Username: username,
Password: password,
Email: "info@admin.com",
Admin: types.NewNullBool(true),
2018-10-11 16:53:13 +00:00
})
_, err := admin.Create()
2018-10-11 16:53:13 +00:00
SampleData()
return Configs, err
2018-10-11 16:53:13 +00:00
}
return Configs, nil
}
2020-01-04 02:03:59 +00:00
// defaultPort accepts a database type and returns its default port
func defaultPort(db string) int64 {
2018-10-11 16:53:13 +00:00
switch db {
case "mysql":
return 3306
case "postgres":
return 5432
case "mssql":
return 1433
default:
return 0
}
2018-10-11 16:53:13 +00:00
}
2018-10-11 16:53:13 +00:00
// EnvToConfig converts environment variables to a DbConfig variable
2019-12-30 08:08:51 +00:00
func EnvToConfig() (*types.DbConfig, error) {
2019-02-11 21:10:17 +00:00
var err error
if os.Getenv("DB_CONN") == "" {
2019-12-30 08:08:51 +00:00
return nil, errors.New("Missing DB_CONN environment variable")
2019-02-11 21:10:17 +00:00
}
if os.Getenv("DB_CONN") != "sqlite" {
if os.Getenv("DB_HOST") == "" {
2019-12-30 08:08:51 +00:00
return nil, errors.New("Missing DB_HOST environment variable")
2019-02-11 21:10:17 +00:00
}
if os.Getenv("DB_USER") == "" {
2019-12-30 08:08:51 +00:00
return nil, errors.New("Missing DB_USER environment variable")
2019-02-11 21:10:17 +00:00
}
if os.Getenv("DB_PASS") == "" {
2019-12-30 08:08:51 +00:00
return nil, errors.New("Missing DB_PASS environment variable")
2019-02-11 21:10:17 +00:00
}
if os.Getenv("DB_DATABASE") == "" {
2019-12-30 08:08:51 +00:00
return nil, errors.New("Missing DB_DATABASE environment variable")
2019-02-11 21:10:17 +00:00
}
}
port := utils.ToInt(os.Getenv("DB_PORT"))
if port == 0 {
2020-01-04 02:03:59 +00:00
port = defaultPort(os.Getenv("DB_PORT"))
}
2018-10-11 16:53:13 +00:00
name := os.Getenv("NAME")
if name == "" {
2018-12-04 05:57:11 +00:00
name = "Statping"
2018-10-11 16:53:13 +00:00
}
description := os.Getenv("DESCRIPTION")
if description == "" {
2018-12-04 05:57:11 +00:00
description = "Statping Monitoring Sample Data"
2018-10-11 16:53:13 +00:00
}
adminUser := os.Getenv("ADMIN_USER")
if adminUser == "" {
adminUser = "admin"
}
adminPass := os.Getenv("ADMIN_PASS")
if adminPass == "" {
adminPass = "admin"
}
2019-12-30 08:08:51 +00:00
configs := &types.DbConfig{
2018-10-11 16:53:13 +00:00
DbConn: os.Getenv("DB_CONN"),
DbHost: os.Getenv("DB_HOST"),
DbUser: os.Getenv("DB_USER"),
DbPass: os.Getenv("DB_PASS"),
DbData: os.Getenv("DB_DATABASE"),
DbPort: port,
Project: name,
Description: description,
Domain: os.Getenv("DOMAIN"),
Email: "",
Username: adminUser,
Password: adminPass,
2018-10-11 16:53:13 +00:00
Error: nil,
Location: utils.Directory,
2019-12-30 01:40:21 +00:00
SqlFile: os.Getenv("SQL_FILE"),
2018-10-11 16:53:13 +00:00
}
2019-12-30 08:08:51 +00:00
CoreApp.Config = configs
return configs, err
2018-10-11 16:53:13 +00:00
}
2018-12-04 05:57:11 +00:00
// SampleData runs all the sample data for a new Statping installation
2018-10-11 16:53:13 +00:00
func SampleData() error {
if err := InsertSampleData(); err != nil {
2020-01-04 02:03:59 +00:00
log.Errorln(err)
2018-10-11 16:53:13 +00:00
return err
}
if err := InsertSampleHits(); err != nil {
2020-01-04 02:03:59 +00:00
log.Errorln(err)
2018-10-11 16:53:13 +00:00
return err
}
return nil
2018-06-30 00:57:05 +00:00
}
// DeleteConfig will delete the 'config.yml' file
2018-10-11 16:53:13 +00:00
func DeleteConfig() error {
2019-12-30 08:08:51 +00:00
log.Debugln("deleting config yaml file", utils.Directory+"/config.yml")
err := utils.DeleteFile(utils.Directory + "/config.yml")
if err != nil {
log.Errorln(err)
2018-10-11 16:53:13 +00:00
return err
}
2018-10-11 16:53:13 +00:00
return nil
}