/
module.go
95 lines (80 loc) · 1.62 KB
/
module.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package backup
import (
"bytes"
"io/ioutil"
"os"
"path"
"time"
"github.com/golang/protobuf/jsonpb"
"github.com/octavore/naga/service"
"github.com/octavore/nagax/logger"
"github.com/octavore/nagax/util/errors"
"github.com/ketchuphq/ketchup/db"
"github.com/ketchuphq/ketchup/server/config"
)
type BackupConfig struct {
Backup struct {
Enabled bool `json:"enabled"`
} `json:"backup"`
}
type Module struct {
DB *db.Module
Logger *logger.Module
Config *config.Module
config BackupConfig
}
func (m *Module) Init(c *service.Config) {
c.AddCommand(&service.Command{
Keyword: "backup:create",
ShortUsage: "create a backup",
Usage: "create a backup in {dataDir}/backup",
Run: func(ctx *service.CommandContext) {
err := m.WriteBackup()
if err != nil {
panic(err)
}
},
})
c.Setup = func() error {
return m.Config.ReadConfig(&m.config)
}
c.Start = func() {
if m.config.Backup.Enabled {
go func() {
err := m.WriteBackup()
if err != nil {
m.Logger.Error(errors.Wrap(err))
}
}()
}
}
}
var jpb = &jsonpb.Marshaler{
EnumsAsInts: false,
EmitDefaults: false,
Indent: " ",
OrigName: false,
}
func (m *Module) WriteBackup() error {
p := m.Config.DataPath("backups", "")
err := os.MkdirAll(p, 0700)
if err != nil {
return err
}
exp, err := m.DB.Export()
if err != nil {
return nil
}
date := time.Now().Format("20060102-030405")
backup := path.Join(p, date+".bak")
buf := &bytes.Buffer{}
err = jpb.Marshal(buf, exp)
if err != nil {
return err
}
err = ioutil.WriteFile(backup, buf.Bytes(), 0700)
if err != nil {
return err
}
return nil
}