121 lines
2.4 KiB
Go
121 lines
2.4 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"io/fs"
|
||
|
"log"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func parseEnvironment(key string) string {
|
||
|
value := os.Getenv(key)
|
||
|
if value == "" {
|
||
|
log.Panicf("%s is not set\n", key)
|
||
|
}
|
||
|
if _, err := os.Stat(value); err != nil {
|
||
|
if errors.Is(err, fs.ErrNotExist) {
|
||
|
log.Panicf("%s does not point to a valid path\n", key)
|
||
|
}
|
||
|
log.Panicf("trying to stat %s produced an unkown error\n", value)
|
||
|
}
|
||
|
return value
|
||
|
}
|
||
|
|
||
|
func parsePacmanConf() string {
|
||
|
var path string
|
||
|
|
||
|
file, err := os.Open("/etc/pacman.conf")
|
||
|
if err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
defer func() {
|
||
|
if err := file.Close(); err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
scanner := bufio.NewScanner(file)
|
||
|
for scanner.Scan() {
|
||
|
line := scanner.Text()
|
||
|
if !strings.Contains(line, "DBPath") {
|
||
|
continue
|
||
|
}
|
||
|
path = strings.TrimSpace(strings.Split(line, "=")[1])
|
||
|
break
|
||
|
}
|
||
|
|
||
|
if _, err := os.Stat(path); err != nil {
|
||
|
if errors.Is(err, fs.ErrNotExist) {
|
||
|
log.Panicln("DBPath in /etc/pacman.conf does not point to a valid path")
|
||
|
}
|
||
|
log.Panicf("trying to stat %s produced an unkown error\n", path)
|
||
|
}
|
||
|
|
||
|
return fmt.Sprintf("%s%s", path, "local")
|
||
|
}
|
||
|
|
||
|
func preBackup() {
|
||
|
pacmanDb := parsePacmanConf()
|
||
|
log.Printf("pacmanDb: %s\n", pacmanDb)
|
||
|
tmpPath := "/tmp/update/pre_backup"
|
||
|
|
||
|
output, err := exec.Command("pacman", "--verbose", "--query").Output()
|
||
|
if err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
|
||
|
err = os.MkdirAll(tmpPath, 0755)
|
||
|
|
||
|
err = os.WriteFile(fmt.Sprintf("%s/%s", tmpPath, "pre_pacman.txt"), output, 0644)
|
||
|
if err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
|
||
|
defer func() {
|
||
|
if r := recover(); r != nil {
|
||
|
err := os.RemoveAll(tmpPath)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
err = CopyDir(pacmanDb, fmt.Sprintf("%s/%s", tmpPath, pacmanDb))
|
||
|
if err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
|
||
|
log.Println("recovered successfully")
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
err = CopyDir(pacmanDb, fmt.Sprintf("%s/%s", tmpPath, pacmanDb))
|
||
|
if err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func postBackup() {
|
||
|
/*
|
||
|
* basic logic for post:
|
||
|
* create new pkg list and delete all lines which are the same as pre
|
||
|
*/
|
||
|
panic("unimplemented")
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
// backup_dir := parseEnvironment("UPDATE_BACKUP_DIR")
|
||
|
cmdlineArg := os.Args[1]
|
||
|
log.Printf("cmdlineArg: %s\n", cmdlineArg)
|
||
|
|
||
|
if cmdlineArg == "pre" {
|
||
|
preBackup()
|
||
|
} else if cmdlineArg == "post" {
|
||
|
postBackup()
|
||
|
} else {
|
||
|
log.Panicf("invalid cmdline argument. supplied value was: %s\n", cmdlineArg)
|
||
|
}
|
||
|
}
|