update http
This commit is contained in:
131
config.go
131
config.go
@@ -1,10 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"regexp"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -26,6 +28,14 @@ type Config struct {
|
||||
timezone *time.Location `json:"-"`
|
||||
}
|
||||
|
||||
var (
|
||||
cfgMx sync.Mutex
|
||||
cfgRun bool
|
||||
)
|
||||
|
||||
//go:embed assets/backup.sample.json
|
||||
var sampleCfg []byte
|
||||
|
||||
type BoxConfig struct {
|
||||
Addr string `json:"addr"`
|
||||
User string `json:"user"`
|
||||
@@ -43,49 +53,66 @@ type AppConfig struct {
|
||||
}
|
||||
|
||||
// Load config from file
|
||||
func (c *Config) LoadFile(path string) error {
|
||||
func LoadConfigFile(path string) (*Config, error) {
|
||||
log.WithFields(log.Fields{"path": path}).Debugf("starting")
|
||||
defer log.WithFields(log.Fields{"path": path}).Debugf("done")
|
||||
|
||||
b, err := ioutil.ReadFile(path)
|
||||
b, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{"path": path, "error": err, "call": "ioutil.ReadFile"}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"path": path, "error": err, "call": "os.ReadFile"}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
b, err = hujson.Standardize(b)
|
||||
return LoadConfigByte(b)
|
||||
|
||||
}
|
||||
|
||||
// Load config from string
|
||||
func LoadConfigByte(conf []byte) (*Config, error) {
|
||||
log.WithFields(log.Fields{}).Debugf("starting")
|
||||
defer log.WithFields(log.Fields{}).Debugf("done")
|
||||
|
||||
c := &Config{}
|
||||
if err := json.Unmarshal(sampleCfg, c); err != nil {
|
||||
log.WithFields(log.Fields{"error": err, "call": "json.Unmarshal", "attr": "sampleCfg"}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
b, err := hujson.Standardize(conf)
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{"path": path, "error": err, "call": "hujson.Standardize"}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"error": err, "call": "hujson.Standardize"}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(b, &c); err != nil {
|
||||
log.WithFields(log.Fields{"path": path, "error": err, "call": "json.Unmarshal"}).Errorf("")
|
||||
return err
|
||||
if err := json.Unmarshal(b, c); err != nil {
|
||||
log.WithFields(log.Fields{"error": err, "call": "json.Unmarshal"}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c.timezone, err = time.LoadLocation(cfg.Timezone)
|
||||
c.timezone, err = time.LoadLocation(c.Timezone)
|
||||
if err != nil {
|
||||
log.WithFields(log.Fields{"path": path, "error": err, "call": "time.LoadLocation", "attr": cfg.Timezone}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"error": err, "call": "time.LoadLocation", "attr": cfg.Timezone}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(cfg.Email.SmtpHost) == 0 {
|
||||
err := fmt.Errorf("no smtp")
|
||||
log.WithFields(log.Fields{"path": path, "error": err}).Errorf("")
|
||||
return err
|
||||
}
|
||||
if c.Email.Active {
|
||||
if len(c.Email.SmtpHost) == 0 {
|
||||
err := fmt.Errorf("no smtp")
|
||||
log.WithFields(log.Fields{"error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(cfg.Email.FromEmail) == 0 {
|
||||
err := fmt.Errorf("no email from")
|
||||
log.WithFields(log.Fields{"path": path, "error": err}).Errorf("")
|
||||
return err
|
||||
}
|
||||
if len(c.Email.FromEmail) == 0 {
|
||||
err := fmt.Errorf("no email from")
|
||||
log.WithFields(log.Fields{"error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(cfg.Email.ToEmail) == 0 {
|
||||
err := fmt.Errorf("no email to")
|
||||
log.WithFields(log.Fields{"path": path, "error": err}).Errorf("")
|
||||
return err
|
||||
if len(c.Email.ToEmail) == 0 {
|
||||
err := fmt.Errorf("no email to")
|
||||
log.WithFields(log.Fields{"error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
for k, v := range c.ScheduleDuration {
|
||||
@@ -96,26 +123,26 @@ func (c *Config) LoadFile(path string) error {
|
||||
case "monthly":
|
||||
case "yearly":
|
||||
if _, err := Expiration(time.Now(), v); err != nil {
|
||||
log.WithFields(log.Fields{"path": path, "schedule": k, "deadline": v, "error": err}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"schedule": k, "deadline": v, "error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
default:
|
||||
err := errors.New("invalid schedule")
|
||||
log.WithFields(log.Fields{"path": path, "schedule": k, "deadline": v, "error": err}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"schedule": k, "deadline": v, "error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
c.box = make(map[string]*Box)
|
||||
for k, v := range c.Box {
|
||||
if b, err := c.NewBox(k, v.Addr, v.User, v.Key); err != nil {
|
||||
log.WithFields(log.Fields{"path": path, "call": "NewBox", "attr": k, "error": err}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"call": "NewBox", "attr": k, "error": err}).Errorf("")
|
||||
return nil, err
|
||||
} else {
|
||||
if _, ok := c.box[k]; ok {
|
||||
err := errors.New("already exists")
|
||||
log.WithFields(log.Fields{"path": path, "attr": k, "error": err}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"attr": k, "error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
c.box[k] = b
|
||||
}
|
||||
@@ -124,33 +151,33 @@ func (c *Config) LoadFile(path string) error {
|
||||
c.apps = make(map[string]*App)
|
||||
for _, v := range c.Apps {
|
||||
if a, err := c.NewApp(v.Name, v.Sources, v.Destinations, v.Schedule, v.Before, v.After); err != nil {
|
||||
log.WithFields(log.Fields{"path": path, "call": "NewApp", "attr": v.Name, "error": err}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"call": "NewApp", "attr": v.Name, "error": err}).Errorf("")
|
||||
return nil, err
|
||||
} else {
|
||||
if _, ok := c.apps[v.Name]; ok {
|
||||
err := errors.New("app already exists")
|
||||
log.WithFields(log.Fields{"path": path, "app": v.Name, "error": err}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"app": v.Name, "error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
c.apps[v.Name] = a
|
||||
for k, _ := range a.schedule {
|
||||
for k := range a.schedule {
|
||||
if dur, ok := c.ScheduleDuration[k]; ok {
|
||||
re := regexp.MustCompile(`^forever|([0-9]+(h|d|m|y))+$`)
|
||||
if !re.MatchString(dur) {
|
||||
err := errors.New("incorrect schedule duration")
|
||||
log.WithFields(log.Fields{"path": path, "app": v.Name, "schedule": k, "error": err}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"app": v.Name, "schedule": k, "error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
err := errors.New("undefined schedule duration")
|
||||
log.WithFields(log.Fields{"path": path, "app": v.Name, "schedule": k, "error": err}).Errorf("")
|
||||
return err
|
||||
log.WithFields(log.Fields{"app": v.Name, "schedule": k, "error": err}).Errorf("")
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
return c, nil
|
||||
}
|
||||
|
||||
// Run config
|
||||
@@ -158,6 +185,16 @@ func (c *Config) Run() {
|
||||
log.WithFields(log.Fields{}).Debugf("starting")
|
||||
defer log.WithFields(log.Fields{}).Debugf("done")
|
||||
|
||||
if cfgRun {
|
||||
return
|
||||
}
|
||||
|
||||
cfgMx.Lock()
|
||||
defer cfgMx.Unlock()
|
||||
|
||||
cfgRun = true
|
||||
defer func() { cfgRun = false }()
|
||||
|
||||
e := NewEmail(time.Now())
|
||||
|
||||
var wg sync.WaitGroup
|
||||
@@ -240,7 +277,7 @@ func (c *Config) Run() {
|
||||
}
|
||||
|
||||
if len(e.items) > 0 {
|
||||
if err := e.Send(); err != nil {
|
||||
if err := e.Send(cfg.Email.SmtpHost, cfg.Email.FromEmail, cfg.Email.ToEmail); err != nil {
|
||||
log.WithFields(log.Fields{"call": "email.Send", "error": err}).Errorf("")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user