126 lines
2.9 KiB
Go
126 lines
2.9 KiB
Go
package backup
|
|
|
|
import (
|
|
"strings"
|
|
"bufio"
|
|
"os"
|
|
"os/exec"
|
|
"go.uber.org/zap"
|
|
"github.com/go-logr/logr"
|
|
"github.com/go-logr/zapr"
|
|
)
|
|
|
|
var (
|
|
repository string
|
|
passwordFile string
|
|
aws_access_key_id string
|
|
aws_secret_access_key string
|
|
resticExec = "/usr/bin/restic"
|
|
logger logr.Logger
|
|
)
|
|
|
|
func init() {
|
|
zapLog, _ := zap.NewDevelopment()
|
|
logger = zapr.NewLogger(zapLog)
|
|
repository = os.Getenv("RESTIC_REPOSITORY")
|
|
passwordFile = os.Getenv("RESTIC_PASSWORD")
|
|
aws_access_key_id = os.Getenv("AWS_ACCESS_KEY_ID")
|
|
aws_secret_access_key = os.Getenv("AWS_SECRET_ACCESS_KEY")
|
|
}
|
|
|
|
func checkRepo(repo string) error {
|
|
log := logger.WithName("backup-checkrepo")
|
|
cmd := exec.Command(resticExec, "check", "-r", repo)
|
|
stderr, err := cmd.StderrPipe()
|
|
if err != nil {
|
|
log.Error(err, "unable to pipe stderr")
|
|
return err
|
|
}
|
|
if err := cmd.Start(); err != nil {
|
|
log.Error(err, "cannot start repo check")
|
|
return err
|
|
}
|
|
if err := cmd.Wait(); err != nil {
|
|
log.V(0).Info("initializing new repo", "repo", repo)
|
|
cmd = exec.Command(resticExec, "init", "-r", repo)
|
|
if err := cmd.Start(); err != nil {
|
|
log.Error(err, "cannot start repo init")
|
|
return err
|
|
}
|
|
go func(){
|
|
scanner := bufio.NewScanner(stderr)
|
|
for scanner.Scan() {
|
|
log.V(0).Info("and error happened", "stderr", scanner.Text())
|
|
}
|
|
}()
|
|
if err := cmd.Wait(); err != nil {
|
|
log.Error(err, "something went wrong during repo init")
|
|
return err
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func BackupVolume(path string) error {
|
|
return nil
|
|
}
|
|
|
|
func BackupDeployment(prefix string, paths []string, c chan []byte) (error) {
|
|
log := logger.WithName("backup-deployment")
|
|
newrepo := repository
|
|
if prefix != "" {
|
|
newrepo = repository + "/" + prefix
|
|
}
|
|
if err := checkRepo(newrepo); err != nil {
|
|
log.Error(err, "unable to setup newrepo", "newrepo", newrepo)
|
|
return err
|
|
}
|
|
cmd := exec.Command(resticExec, "backup", "--json", "-r", newrepo, strings.Join(paths, " "))
|
|
stderr, err := cmd.StderrPipe()
|
|
if err != nil {
|
|
log.Error(err, "unable to pipe stderr")
|
|
return err
|
|
}
|
|
stdout, err := cmd.StdoutPipe()
|
|
if err != nil {
|
|
log.Error(err, "unable to pipe stdout")
|
|
return err
|
|
}
|
|
if err := cmd.Start(); err != nil {
|
|
log.Error(err, "cannot start backup")
|
|
return err
|
|
}
|
|
go func(){
|
|
scanner := bufio.NewScanner(stderr)
|
|
for scanner.Scan() {
|
|
log.V(0).Info("and error happened", "stderr", scanner.Text())
|
|
}
|
|
}()
|
|
go func(c chan []byte){
|
|
scanner := bufio.NewScanner(stdout)
|
|
for scanner.Scan() {
|
|
c <- scanner.Bytes()
|
|
}
|
|
}(c)
|
|
if err := cmd.Wait(); err != nil {
|
|
log.Error(err, "something went wrong during the backup")
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func DeleteSnapshot(prefix string, snapshotId string) error {
|
|
log := logger.WithValues("delete-snapshot", snapshotId)
|
|
newrepo := repository
|
|
if prefix != "" {
|
|
newrepo = repository + "/" + prefix
|
|
}
|
|
cmd := exec.Command(resticExec, "forget", "-r", newrepo, snapshotId)
|
|
if err := cmd.Run(); err != nil {
|
|
log.Error(err, "unable to delete the snapshot")
|
|
return err
|
|
}
|
|
return nil
|
|
}
|