update/backup.go

190 lines
3.5 KiB
Go
Raw Permalink Normal View History

2024-09-03 03:38:43 +02:00
package main
import (
2024-09-08 00:23:20 +02:00
"archive/zip"
2024-09-03 03:38:43 +02:00
"bufio"
"fmt"
2024-09-08 00:23:20 +02:00
"io"
2024-09-12 22:02:20 +02:00
"log"
2024-09-03 03:38:43 +02:00
"os"
"os/exec"
2024-09-08 00:23:20 +02:00
"path/filepath"
2024-09-03 03:38:43 +02:00
"strings"
2024-09-08 00:23:20 +02:00
"time"
2024-09-12 22:02:20 +02:00
"github.com/otiai10/copy"
2024-09-08 00:23:20 +02:00
"github.com/pelletier/go-toml"
2024-09-03 03:38:43 +02:00
)
2024-09-08 00:23:20 +02:00
var backup_locations []string
2024-09-03 03:38:43 +02:00
2024-09-08 00:23:20 +02:00
func parsePacmanConf() (string, error) {
var err error
2024-09-03 03:38:43 +02:00
var path string
file, err := os.Open("/etc/pacman.conf")
if err != nil {
2024-09-08 00:23:20 +02:00
return "", err
2024-09-03 03:38:43 +02:00
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if !strings.Contains(line, "DBPath") {
continue
}
path = strings.TrimSpace(strings.Split(line, "=")[1])
break
}
2024-09-08 00:23:20 +02:00
err = file.Close()
if err != nil {
return "", err
2024-09-03 03:38:43 +02:00
}
2024-09-08 00:23:20 +02:00
return fmt.Sprint(path, "local"), nil
2024-09-03 03:38:43 +02:00
}
2024-09-08 00:23:20 +02:00
func zipIt(pathToZip string, pathToFiles string) error {
var err error
2024-09-03 03:38:43 +02:00
2024-09-08 00:23:20 +02:00
zipFile, err := os.Create(pathToZip)
2024-09-03 03:38:43 +02:00
if err != nil {
2024-09-08 00:23:20 +02:00
return err
2024-09-03 03:38:43 +02:00
}
2024-09-08 00:23:20 +02:00
zipWriter := zip.NewWriter(zipFile)
walker := func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
f, err := zipWriter.Create(path[len(pathToFiles):])
if err != nil {
return err
}
_, err = io.Copy(f, file)
if err != nil {
return err
}
return nil
}
err = filepath.Walk(pathToFiles, walker)
if err != nil {
return err
}
2024-09-03 03:38:43 +02:00
2024-09-08 00:23:20 +02:00
err = zipWriter.Close()
2024-09-03 03:38:43 +02:00
if err != nil {
2024-09-08 00:23:20 +02:00
return err
2024-09-03 03:38:43 +02:00
}
2024-09-08 00:23:20 +02:00
err = zipFile.Close()
if err != nil {
return err
}
return nil
}
2024-09-03 03:38:43 +02:00
2024-09-08 00:23:20 +02:00
func backup(when string) error {
var err error
tmpPath := fmt.Sprint("/tmp/update/", when, "_backup")
2024-09-12 22:02:20 +02:00
log.Printf("tmpPath is: %s\n", tmpPath)
2024-09-08 00:23:20 +02:00
pacmanDb, err := parsePacmanConf()
if err != nil {
return err
}
2024-09-12 22:02:20 +02:00
log.Printf("pacmanDB is at: %s\n", pacmanDb)
2024-09-08 00:23:20 +02:00
err = os.MkdirAll(tmpPath, 0755)
if err != nil {
return err
}
2024-09-03 03:38:43 +02:00
defer func() {
2024-09-08 00:23:20 +02:00
os.RemoveAll("/tmp/update")
2024-09-03 03:38:43 +02:00
}()
2024-09-08 00:23:20 +02:00
output, err := exec.Command("pacman", "--verbose", "--query").Output()
2024-09-03 03:38:43 +02:00
if err != nil {
2024-09-08 00:23:20 +02:00
return err
2024-09-03 03:38:43 +02:00
}
2024-09-12 19:01:16 +02:00
err = os.WriteFile(fmt.Sprint(tmpPath, "/", when, "_pacman.txt"), output, 0666)
2024-09-08 00:23:20 +02:00
if err != nil {
return err
}
2024-09-12 19:01:16 +02:00
if strings.Compare(when, "post") != 0 {
2024-09-12 22:02:20 +02:00
err = copy.Copy(pacmanDb, fmt.Sprint(tmpPath, "/", pacmanDb))
2024-09-08 00:23:20 +02:00
if err != nil {
return err
}
}
current_time := time.Now().Format(time.RFC3339)
pathToZip := fmt.Sprint(tmpPath, "_", current_time, ".zip")
2024-09-12 22:02:20 +02:00
log.Printf("pathToZip is: %s\n", pathToZip)
2024-09-08 00:23:20 +02:00
err = zipIt(pathToZip, tmpPath)
if err != nil {
return err
}
for _, backup_location := range backup_locations {
2024-09-12 22:02:20 +02:00
backup_path := fmt.Sprintf("%s/%s/%s_backup_%s.zip", backup_location, when, when, current_time)
log.Printf("backup_path is: %s\n", backup_path)
err = copy.Copy(pathToZip, backup_path)
2024-09-08 00:23:20 +02:00
if err != nil {
return err
}
}
return nil
2024-09-03 03:38:43 +02:00
}
func main() {
2024-09-12 22:02:20 +02:00
if strings.Compare(os.Args[1], "debug") != 0 {
log.SetOutput(io.Discard)
} else {
logFile, err := os.OpenFile("/tmp/update.txt", os.O_CREATE | os.O_APPEND | os.O_RDWR, 0666)
if err != nil {
panic(err)
}
defer logFile.Close()
mw := io.MultiWriter(os.Stdout, logFile)
log.SetOutput(mw)
fmt.Println("Logfile is /tmp/update.txt")
}
log.Printf("Cmdline argument is: %s\n", os.Args[1])
2024-09-08 00:23:20 +02:00
os.RemoveAll("/tmp/update")
tree, err := toml.LoadFile("/etc/update.toml")
if err != nil {
fmt.Println("backup failed for the following reason: ", err)
os.Exit(1)
}
backup_locations = tree.GetArray("backup.locations").([]string)
2024-09-12 22:02:20 +02:00
log.Printf("backup_locations are: %s\n", backup_locations)
2024-09-08 00:23:20 +02:00
err = backup(os.Args[1])
if err != nil {
fmt.Println("backup failed for the following reason: ", err)
os.Exit(1)
2024-09-03 03:38:43 +02:00
}
}