package db import ( "context" "fmt" "net/url" "os/exec" "time" "github.com/eiblog/eiblog/cmd/backup/config" "github.com/eiblog/eiblog/pkg/connector/db" ) // MongoStorage 备份恢复器 type MongoStorage struct{} // Backup 备份 func (r MongoStorage) Backup(name string) (string, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*20) defer cancel() // dump u, err := url.Parse(config.Conf.Database.Source) if err != nil { return "", err } arg := fmt.Sprintf("mongodump -h %s -d eiblog -o /tmp", u.Host) cmd := exec.CommandContext(ctx, "sh", "-c", arg) err = cmd.Run() if err != nil { return "", err } // tar arg = fmt.Sprintf("tar czf /tmp/%s -C /tmp eiblog", name) cmd = exec.CommandContext(ctx, "sh", "-c", arg) err = cmd.Run() if err != nil { return "", err } return "/tmp/" + name, nil } // Restore 恢复 func (r MongoStorage) Restore(path string) error { ctx, cancel := context.WithTimeout(context.Background(), time.Second*20) defer cancel() // drop database mdb, err := db.NewMDB(config.Conf.Database) if err != nil { return err } err = mdb.Drop(ctx) if err != nil { return err } // unarchive arg := fmt.Sprintf("tar xzf %s -C /tmp", path) cmd := exec.CommandContext(ctx, "sh", "-c", arg) err = cmd.Run() if err != nil { return err } // restore u, err := url.Parse(config.Conf.Database.Source) if err != nil { return err } arg = fmt.Sprintf("mongorestore -h %s -d eiblog /tmp/eiblog", u.Host) cmd = exec.CommandContext(ctx, "sh", "-c", arg) return cmd.Run() }