Compare commits
	
		
			2 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8024e86962 | |||
| 88742c2ea5 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1,2 @@ | ||||
| backup | ||||
| # Build artifacts | ||||
| update | ||||
|   | ||||
							
								
								
									
										189
									
								
								backup.go
									
									
									
									
									
								
							
							
						
						
									
										189
									
								
								backup.go
									
									
									
									
									
								
							| @@ -1,189 +0,0 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"archive/zip" | ||||
| 	"bufio" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/otiai10/copy" | ||||
| 	"github.com/pelletier/go-toml" | ||||
| ) | ||||
|  | ||||
| var backup_locations []string | ||||
|  | ||||
| func parsePacmanConf() (string, error) { | ||||
| 	var err error | ||||
| 	var path string | ||||
|  | ||||
| 	file, err := os.Open("/etc/pacman.conf") | ||||
| 	if err != nil { | ||||
| 		return "", 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 | ||||
| 	} | ||||
|  | ||||
| 	err = file.Close() | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	return fmt.Sprint(path, "local"), nil | ||||
| } | ||||
|  | ||||
| func zipIt(pathToZip string, pathToFiles string) error { | ||||
| 	var err error | ||||
|  | ||||
| 	zipFile, err := os.Create(pathToZip) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	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 | ||||
| 	} | ||||
|  | ||||
| 	err = zipWriter.Close() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	err = zipFile.Close() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func backup(when string) error { | ||||
| 	var err error | ||||
| 	tmpPath := fmt.Sprint("/tmp/update/", when, "_backup") | ||||
| 	log.Printf("tmpPath is: %s\n", tmpPath) | ||||
| 	pacmanDb, err := parsePacmanConf() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	log.Printf("pacmanDB is at: %s\n", pacmanDb) | ||||
|  | ||||
| 	err = os.MkdirAll(tmpPath, 0755) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer func() { | ||||
| 		os.RemoveAll("/tmp/update") | ||||
| 	}() | ||||
|  | ||||
| 	output, err := exec.Command("pacman",  "--verbose", "--query").Output() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	err = os.WriteFile(fmt.Sprint(tmpPath, "/",  when, "_pacman.txt"), output, 0666) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if strings.Compare(when, "post") != 0 { | ||||
| 		err = copy.Copy(pacmanDb, fmt.Sprint(tmpPath, "/", pacmanDb)) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	current_time := time.Now().Format(time.RFC3339) | ||||
| 	pathToZip := fmt.Sprint(tmpPath, "_", current_time, ".zip") | ||||
| 	log.Printf("pathToZip is: %s\n", pathToZip) | ||||
| 	err = zipIt(pathToZip, tmpPath) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	for _, backup_location := range backup_locations { | ||||
| 		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) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	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]) | ||||
|  | ||||
| 	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) | ||||
| 	log.Printf("backup_locations are: %s\n", backup_locations) | ||||
|  | ||||
| 	err = backup(os.Args[1]) | ||||
| 	if err != nil { | ||||
| 		fmt.Println("backup failed for the following reason: ", err) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										14
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								go.mod
									
									
									
									
									
								
							| @@ -1,14 +0,0 @@ | ||||
| module backup | ||||
|  | ||||
| go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/otiai10/copy v1.14.1 | ||||
| 	github.com/pelletier/go-toml v1.9.5 | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| 	github.com/otiai10/mint v1.6.3 // indirect | ||||
| 	golang.org/x/sync v0.12.0 // indirect | ||||
| 	golang.org/x/sys v0.31.0 // indirect | ||||
| ) | ||||
							
								
								
									
										10
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								go.sum
									
									
									
									
									
								
							| @@ -1,10 +0,0 @@ | ||||
| github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= | ||||
| github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= | ||||
| github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= | ||||
| github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= | ||||
| github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= | ||||
| github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= | ||||
| golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= | ||||
| golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | ||||
| golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= | ||||
| golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||
| @@ -1,28 +0,0 @@ | ||||
| # Update | ||||
|  | ||||
| Update script written in Bash for Arch Linux only. Keeps all your official, aur packages and your flatpaks up to date with one simple script. It also backups a list of all your installed packages and flatpaks. | ||||
|  | ||||
| ## Installation  | ||||
|  | ||||
| ```bash | ||||
| git clone https://gitea.hopeless-cloud.xyz/AustrianToast/update.git && cd update | ||||
| ``` | ||||
|  | ||||
| Before installing, please edit the config and configure it to your liking.   | ||||
| Then install using | ||||
| ```bash | ||||
| make | ||||
| ``` | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| ``` | ||||
| Usage: update [OPTION] | ||||
| options: | ||||
| --help         displays this message | ||||
| --preview      shows a preview of which pkg's will be updates | ||||
| --version      prints out the version number | ||||
| ``` | ||||
|  | ||||
| ## Contributing   | ||||
| Contributions are always welcome! | ||||
| @@ -1,10 +0,0 @@ | ||||
| install: | ||||
| 	@echo "==> Installing update into /usr/local/bin" | ||||
| 	@sudo install -Dm755 update /usr/local/bin/update | ||||
| 	@[[ -f ${HOME}/.config/update.conf ]] || cp update.conf ${HOME}/.config/ | ||||
| 	@echo "==> Finished." | ||||
|  | ||||
| uninstall: | ||||
| 	@echo "==> Uninstalling update from /usr/local/bin" | ||||
| 	@sudo rm /usr/local/bin/update ${HOME}/.config/update.conf | ||||
| 	@echo "==> Finished." | ||||
							
								
								
									
										153
									
								
								legacy/update
									
									
									
									
									
								
							
							
						
						
									
										153
									
								
								legacy/update
									
									
									
									
									
								
							| @@ -1,153 +0,0 @@ | ||||
| #!/usr/bin/bash | ||||
|  | ||||
| VERSION="3.2" | ||||
| IGREEN="\033[0;92m"     # Intense Green | ||||
| IYELLOW="\033[0;93m"    # Intense Yellow | ||||
| IRED='\033[0;91m'       # Red | ||||
| NO_COLOR="\033[0m"      # Text Reset | ||||
| TMP="/tmp/update" | ||||
| DATE="$(date +"%Y-%m-%dT%H:%M:%S%:z")"  # RFC 3339 date-time https://datatracker.ietf.org/doc/html/rfc3339#section-5.6 | ||||
|  | ||||
| trap interrupt_function INT | ||||
|  | ||||
| interrupt_function() { | ||||
|     echo -e "${IRED}\nInterrupt has been detected${NO_COLOR}" | ||||
|     if [ -f /var/lib/pacman/db.lck ]; then | ||||
|         echo -e "${IRED}Trying to unlock the pacman db. Please enter your password.${NO_COLOR}" | ||||
|         su --command="rm --force /var/lib/pacman/db.lck" | ||||
|     fi | ||||
|     [[ -d $TMP ]] && rm --recursive --force "$TMP" | ||||
|     [[ -f "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new ]] && rm --force "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new | ||||
|     [[ -f "$BACKUP_LOCATION"/after-backup_"$DATE".tar.zst.new ]] && rm --force "$BACKUP_LOCATION"/after-backup_"$DATE".tar.zst.new | ||||
|     exit 1 | ||||
| } | ||||
|  | ||||
| help() { | ||||
|     echo "Usage: update [OPTION]" | ||||
|     echo "options:" | ||||
|     echo "--help         displays this message" | ||||
|     echo "--preview      shows a preview of pkg's and flatpaks which can be updated" | ||||
|     echo "--version      prints out the version number" | ||||
| } | ||||
|  | ||||
| source "$HOME"/.config/update.conf || echo -e "${IRED}No config found${NO_COLOR}" || exit 1 | ||||
|  | ||||
| if [[ ${1:0:2} == \-\- ]]; then | ||||
|     case "${1:2}" in | ||||
|         help) | ||||
|             help ;; | ||||
|         preview) | ||||
|             "$PACMAN_WRAPPER" -Syy | ||||
|             "$PACMAN_WRAPPER" --query --upgrades | ||||
|             [[ -x /usr/bin/flatpak ]] && flatpak remote-ls --updates ;; | ||||
|         version) | ||||
|             echo "$VERSION" ;; | ||||
|         ?) | ||||
|             help; exit 1;; | ||||
|     esac | ||||
|     exit 0 | ||||
| fi | ||||
|  | ||||
| check_for_valid_backup_location() { | ||||
|     if [ ! -d "$1" ]; then | ||||
|         echo -e "${IYELLOW}$1 doesn't exist${NO_COLOR}" | ||||
|         read -p "Do you want to create the path and continue? [y/N]" input | ||||
|         case $input in | ||||
|             [Yy]) mkdir --parents "$1" ;; | ||||
|             [Nn]) exit 0;; | ||||
|             * ) exit 0 ;; | ||||
|         esac | ||||
|     fi | ||||
| } | ||||
|  | ||||
| check_nfs_mount() { | ||||
|     if ! findmnt -rno SOURCE,TARGET,FSTYPE "$1" | grep -q nfs; then | ||||
|         echo -e "${IYELLOW}$1 is not an active NFS mount.${NO_COLOR}" | ||||
|         read -p "Do you want to continue without an active NFS mount? [y/N] " input | ||||
|         case $input in | ||||
|             [Yy]) return 0 ;; | ||||
|             [Nn]|*) exit 1 ;; | ||||
|         esac | ||||
|     fi | ||||
| } | ||||
|  | ||||
| if [ "$BACKUP_LOCATION" ]; then | ||||
|     check_for_valid_backup_location "$BACKUP_LOCATION" | ||||
|     check_nfs_mount "$BACKUP_LOCATION" | ||||
| else | ||||
|     echo -e "${IRED}No BACKUP_LOCATION in $HOME/.config/update.conf specified${NO_COLOR}" | ||||
|     exit 1 | ||||
| fi | ||||
| [[ $SECONDARY_BACKUP_LOCATION ]] && check_for_valid_backup_location "$SECONDARY_BACKUP_LOCATION" | ||||
|  | ||||
| lock_pacman_db() { | ||||
|     if [ -f /var/lib/pacman/db.lck ]; then | ||||
|         echo -e "${IYELLOW}->${NO_COLOR} /var/lib/pacman/db.lck exists" | ||||
|         echo -e "${IYELLOW}->${NO_COLOR} there might be another instance of pacman running. exiting..." | ||||
|         exit 1 | ||||
|     fi | ||||
|  | ||||
|     echo -e "${IYELLOW}Trying to lock the pacman db. Please enter your password.${NO_COLOR}" | ||||
|     su --command="touch /var/lib/pacman/db.lck" | ||||
| } | ||||
|  | ||||
| unlock_pacman_db() { | ||||
|     echo -e "${IYELLOW}Trying to unlock the pacman db. Please enter your password.${NO_COLOR}" | ||||
|     su --command="rm --force /var/lib/pacman/db.lck" | ||||
| } | ||||
|  | ||||
| delete_oldest_backup() { | ||||
|     if [[ $(find $BACKUP_LOCATION -name '*$1*' -exec printf %c {} + | wc -c) -ge $BACKUP_AMOUNT ]]; then | ||||
|         rm --force $(find "$BACKUP_LOCATION" -name '*$1*' | sort -rn | head -1) | ||||
|     fi | ||||
| } | ||||
|  | ||||
| before_backup() { | ||||
|     lock_pacman_db | ||||
|  | ||||
|     [[ -d $TMP ]] && rm --recursive --force "$TMP" | ||||
|     mkdir --parents "$TMP"/before-backup_"$DATE" "$TMP"/after-backup_"$DATE" | ||||
|  | ||||
|     pacman --verbose --query > "$TMP"/before-backup_"$DATE"/pacman-before.txt | ||||
|     [[ -x /usr/bin/flatpak ]] && flatpak list --all --show-details > "$TMP"/before-backup_"$DATE"/flatpak-before.txt | ||||
|  | ||||
|     tar --create --zstd --file "$TMP"/before-backup_"$DATE".tar.zst.new "$TMP"/before-backup_"$DATE" /var/lib/pacman/local | ||||
|     cp "$TMP"/before-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION" | ||||
|     [[ $SECONDARY_BACKUP_LOCATION ]] && cp "$TMP"/before-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION" | ||||
|  | ||||
|     unlock_pacman_db | ||||
| } | ||||
|  | ||||
| after_backup() { | ||||
|     lock_pacman_db | ||||
|  | ||||
|     pacman --verbose --query > "$TMP"/after-backup_"$DATE"/pacman-after.txt | ||||
|     [[ -x /usr/bin/flatpak ]] && flatpak list --all --show-details > "$TMP"/after-backup_"$DATE"/flatpak-after.txt | ||||
|     tar --create --zstd --file "$TMP"/after-backup_"$DATE".tar.zst.new "$TMP"/after-backup_"$DATE" | ||||
|  | ||||
|     cp "$TMP"/after-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION" | ||||
|     [[ $SECONDARY_BACKUP_LOCATION ]] && cp "$TMP"/after-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION" | ||||
|  | ||||
|     delete_oldest_backup after-backup | ||||
|     mv "$BACKUP_LOCATION"/after-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION"/after-backup_"$DATE".tar.zst | ||||
|     [[ $SECONDARY_BACKUP_LOCATION ]] && mv "$SECONDARY_BACKUP_LOCATION"/after-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION"/after-backup_"$DATE".tar.zst | ||||
|  | ||||
|     delete_oldest_backup before-backup | ||||
|     mv "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst | ||||
|     [[ $SECONDARY_BACKUP_LOCATION ]] && mv "$SECONDARY_BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION"/before-backup_"$DATE".tar.zst | ||||
|  | ||||
|     unlock_pacman_db | ||||
|     rm --recursive --force "$TMP" | ||||
| } | ||||
|  | ||||
| update() { | ||||
|     "$PACMAN_WRAPPER" | ||||
|     if [[ -x /usr/bin/flatpak ]]; then | ||||
|         flatpak update --assumeyes | ||||
|         flatpak list --all --show-details > "$TMP"/after-backup_"$DATE"/flatpak-after.txt | ||||
|     fi | ||||
| } | ||||
|  | ||||
| before_backup && echo -e "${IGREEN}before-backup complete${NO_COLOR}" | ||||
| update | ||||
| after_backup && echo -e "${IGREEN}after-backup complete${NO_COLOR}" | ||||
| @@ -1,11 +0,0 @@ | ||||
| # backup to this folder | ||||
| #BACKUP_LOCATION=~ | ||||
|  | ||||
| # optional secondary backup loaction | ||||
| #SECONDARY_BACKUP_LOCATION=~ | ||||
|  | ||||
| # use this pacman-wrapper | ||||
| PACMAN_WRAPPER=yay | ||||
|  | ||||
| # how many different backups to keep | ||||
| BACKUP_AMOUNT=10 | ||||
							
								
								
									
										32
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								makefile
									
									
									
									
									
								
							| @@ -1,32 +0,0 @@ | ||||
| IGREEN := \033[0;92m | ||||
| NO_COLOR := \033[0m | ||||
|  | ||||
| help: | ||||
| 	@echo "Usage: make [OPTION]" | ||||
| 	@echo "Available options are:" | ||||
| 	@echo "help" | ||||
| 	@echo "compile" | ||||
| 	@echo "install     This will also compile" | ||||
| 	@echo "uninstall" | ||||
|  | ||||
| compile: | ||||
| 	@echo -e "$(IGREEN)==> Compiling backup$(NO_COLOR)" | ||||
| 	go build . | ||||
|  | ||||
| install: compile | ||||
| 	@echo -e "$(IGREEN)==> Copying the hooks into /etc/pacman.d/hooks$(NO_COLOR)" | ||||
| 	[[ -d /etc/pacman.d/hooks ]] || sudo mkdir /etc/pacman.d/hooks | ||||
| 	sudo cp pre_backup.hook post_backup.hook /etc/pacman.d/hooks | ||||
| 	@echo -e "$(IGREEN)==> Copying backup into /usr/local/bin$(NO_COLOR)" | ||||
| 	sudo install -Dm755 backup /usr/local/bin/backup | ||||
| 	@echo -e "$(IGREEN)==> Copying the config into /etc$(NO_COLOR)" | ||||
| 	[[ -f /etc/update.toml ]] || sudo cp update.toml /etc | ||||
| 	@echo -e "$(IGREEN)==> Finished.$(NO_COLOR)" | ||||
|  | ||||
| uninstall: | ||||
| 	@echo -e "$(IGREEN)==> Removing the hooks from /etc/pacman.d/hooks$(NO_COLOR)" | ||||
| 	sudo rm /etc/pacman.d/hooks/pre_backup.hook /etc/pacman.d/hooks/post_backup.hook | ||||
| 	@echo -e "$(IGREEN)==> Removing backup into /usr/local/bin$(NO_COLOR)" | ||||
| 	sudo rm /usr/local/bin/backup | ||||
| 	@echo -e "$(IGREEN)==> /etc/update.toml will remain$(NO_COLOR)" | ||||
| 	@echo -e "$(IGREEN)==> Finished.$(NO_COLOR)" | ||||
| @@ -1,11 +0,0 @@ | ||||
| [Trigger] | ||||
| Operation = Install | ||||
| Operation = Upgrade | ||||
| Operation = Remove | ||||
| Type = Package | ||||
| Target = * | ||||
|  | ||||
| [Action] | ||||
| Description = Backing up a list of all packages... | ||||
| When = PostTransaction | ||||
| Exec = /usr/local/bin/backup post | ||||
| @@ -1,12 +0,0 @@ | ||||
| [Trigger] | ||||
| Operation = Install | ||||
| Operation = Upgrade | ||||
| Operation = Remove | ||||
| Type = Package | ||||
| Target = * | ||||
|  | ||||
| [Action] | ||||
| Description = Backing up the pacman db... | ||||
| When = PreTransaction | ||||
| Exec = /usr/local/bin/backup pre | ||||
| AbortOnFail | ||||
							
								
								
									
										83
									
								
								update.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								update.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| int command_builder(char *command, char **args) { | ||||
|     char *tmp_command = malloc(strlen(command)); | ||||
|     memcpy(tmp_command, command, strlen(command)); | ||||
|     char *tmp_token; | ||||
|     size_t index = 0; | ||||
|  | ||||
|     if (tmp_command == NULL) { return 1; } | ||||
|  | ||||
|     tmp_token = strtok(tmp_command, " "); | ||||
|     while(tmp_token != NULL) { | ||||
|         args[index] = malloc(strlen(tmp_token)); | ||||
|         memcpy(args[index], tmp_token, strlen(tmp_token)); | ||||
|         tmp_token = strtok(NULL, " "); | ||||
|         index++; | ||||
|     } | ||||
|     free(tmp_command); | ||||
|     args[index++] = NULL; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int run_cmd_and_wait(char *command) { | ||||
|     char **args = malloc(strlen(command)); | ||||
|     int ret = command_builder(command, args); | ||||
|     if (ret != 0) { | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     signed int pid = fork(); | ||||
|     int status; | ||||
|  | ||||
|     if (pid == -1) { | ||||
|         fprintf(stderr, "Couldn't fork. Error = %s\n", strerror(errno)); | ||||
|         return 1; | ||||
|     } else if (pid > 0) { | ||||
|         waitpid(pid, &status, 0); | ||||
|     } else { | ||||
|         execvp(args[0], args); | ||||
|     } | ||||
|     free(args); | ||||
|  | ||||
|     return status; | ||||
| } | ||||
|  | ||||
| int main() { | ||||
|     FILE *os_release = fopen("/etc/os-release", "r"); | ||||
|     if (!os_release) { | ||||
|         fprintf(stderr, "Couldn't open os-release. Error = %s\n", strerror(errno)); | ||||
|     } | ||||
|     char buffer[1024]; | ||||
|     while (fgets(buffer, sizeof buffer, os_release)) { | ||||
|         if (strncmp(buffer, "NAME=", 5) == 0) { | ||||
|             memmove(buffer, buffer + 6, (sizeof buffer) - 6); | ||||
|             buffer[strcspn(buffer, "\"")] = '\0'; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|     int ret; | ||||
|     char *args[100]; | ||||
|     if (strcmp(buffer, "EndeavourOS") == 0) { | ||||
|         ret = run_cmd_and_wait("yay"); | ||||
|     } else if (strcmp(buffer, "Debian") == 0) { | ||||
|         ret = run_cmd_and_wait("apt update"); | ||||
|         if (ret != 0) { | ||||
|             return ret; | ||||
|         } | ||||
|         ret = run_cmd_and_wait("apt upgrade"); | ||||
|     } else if (strcmp(buffer, "FreeBSD") == 0) { | ||||
|         ret = run_cmd_and_wait("pkg update"); | ||||
|         if (ret != 0) { | ||||
|             return ret; | ||||
|         } | ||||
|         ret = run_cmd_and_wait("pkg upgrade"); | ||||
|     } else { | ||||
|         fprintf(stderr, "OS %s not suported\n", buffer); | ||||
|         return 1; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
| @@ -1,6 +0,0 @@ | ||||
| # Config for update | ||||
|  | ||||
| [backup] | ||||
| # All locations need to be an absolute path | ||||
| # Don't specify a path multiple times, else the zip will likely be broken | ||||
| locations = ['/opt'] | ||||
							
								
								
									
										30
									
								
								update.zsh
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								update.zsh
									
									
									
									
									
								
							| @@ -1,30 +0,0 @@ | ||||
| preview() { | ||||
|     yay -Syy && yay -Qu | ||||
|     [[ -x /usr/bin/flatpak ]] && flatpak remote-ls --updates | ||||
| } | ||||
|  | ||||
| flatpak-update() { | ||||
|     TMP="/tmp/update" | ||||
|     DATE="$(date +"%Y-%m-%dT%H:%M:%S%:z")" | ||||
|     BACKUP_LOCATION="/opt" | ||||
|  | ||||
|     [[ -d $TMP ]] && rm --recursive --force "$TMP" | ||||
|     mkdir --parents "$TMP"/before-backup_"$DATE" "$TMP"/after-backup_"$DATE" | ||||
|  | ||||
|     flatpak list --all --show-details > "$TMP"/before-backup_"$DATE"/flatpak-before.txt | ||||
|     tar --create --zstd --file "$TMP"/before-backup_"$DATE".tar.zst "$TMP"/before-backup_"$DATE" | ||||
|  | ||||
|     flatpak update --assumeyes | ||||
|  | ||||
|     flatpak list --all --show-details > "$TMP"/after-backup_"$DATE"/flatpak-after.txt | ||||
|     tar --create --zstd --file "$TMP"/after-backup_"$DATE".tar.zst "$TMP"/after-backup_"$DATE" | ||||
|  | ||||
|     rsync -a "$TMP"/before-backup_"$DATE".tar.zst "$TMP"/after-backup_"$DATE".tar.zst "$BACKUP_LOCATION" | ||||
|  | ||||
|     rm --recursive --force "$TMP" | ||||
| } | ||||
|  | ||||
| update () { | ||||
|     yay | ||||
|     flatpak-update | ||||
| } | ||||
		Reference in New Issue
	
	Block a user