diff --git a/config.go b/config.go new file mode 100644 index 0000000..b147518 --- /dev/null +++ b/config.go @@ -0,0 +1,51 @@ +package main + +import ( + "log" + "os" + "strings" + "time" +) + +// Backup folder +// Backup interval +// Max backups to keep + +type conf struct { + Folder string // Backup folder _with_ trailing slash + fullCurrentBackupPath string + Interval time.Duration + MaxBackups int64 +} + +var ( + config *conf + dumpTime time.Time +) + +func init() { + config = &conf{ + Folder: "/backups/", + Interval: time.Hour * 6, + MaxBackups: 12, + } + + folder, has := os.LookupEnv("BACKUP_FOLDER") + if has { + if !strings.HasSuffix(folder, "/") { + folder = folder + "/" + } + + config.Folder = folder + } + updateFullBackupPath() +} + +func updateFullBackupPath() { + dumpTime = time.Now() + config.fullCurrentBackupPath = config.Folder + dumpTime.Format("02-01-2006_15-04-05") + "/" + err := os.MkdirAll(config.fullCurrentBackupPath, 0644) + if err != nil { + log.Fatalf("Could not create backup folder: %s\n", err) + } +} diff --git a/dump.go b/dump.go index eaf464b..4b0512c 100644 --- a/dump.go +++ b/dump.go @@ -1,6 +1,9 @@ package main -import "github.com/docker/docker/api/types" +import ( + "github.com/docker/docker/api/types" + "strings" +) type Dumper interface { Dump() error @@ -18,3 +21,25 @@ func NewDumperFromContainer(container *types.ContainerJSON) Dumper { return nil } + +func dumpAllDatabases() error { + lock.Lock() + defer lock.Unlock() + + for _, dumper := range store { + err := dumper.Dump() + if err != nil { + return err + } + } + + return nil +} + +func getDumpFilename(containerName string) string { + if strings.HasPrefix(containerName, "/") { + containerName = strings.TrimPrefix(containerName, "/") + } + + return config.fullCurrentBackupPath + containerName + ".sql" +} diff --git a/helper.go b/helper.go new file mode 100644 index 0000000..173e550 --- /dev/null +++ b/helper.go @@ -0,0 +1,14 @@ +package main + +import "strings" + +func parseEnv(envs []string) map[string]string { + env := make(map[string]string, len(envs)) + + for _, s := range envs { + parts := strings.SplitN(s, "=", 2) + env[parts[0]] = parts[1] + } + + return env +} diff --git a/save.go b/save.go new file mode 100644 index 0000000..0946e1b --- /dev/null +++ b/save.go @@ -0,0 +1,37 @@ +package main + +import ( + "fmt" + "io" + "os" + "os/exec" +) + +func runAndSaveCommand(filename, command string, args ...string) error { + c := exec.Command(command, args...) + + fmt.Printf("Running %s\n\n", c.String()) + + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + stdout, err := c.StdoutPipe() + if err != nil { + return err + } + + err = c.Start() + if err != nil { + return err + } + + _, err = io.Copy(f, stdout) + if err != nil { + return err + } + + return c.Wait() +}