Compare commits

..

22 Commits

Author SHA1 Message Date
8024e86962 getting started 2025-05-27 19:03:10 +02:00
88742c2ea5 remove useless stuff 2025-05-27 16:36:03 +02:00
d101e186c4 go get -u && go mod tidy 2025-03-23 20:13:23 +01:00
2d881a0d34 Add nfs check (#28)
For users that use a nfs share for their backup, this will check if it is mounted.

Co-authored-by: AustrianToast <austriantoast@hopeless-cloud.xyz>
Reviewed-on: #28
Co-authored-by: ProfessionalUwU <andre.fuhry@hopeless-cloud.xyz>
Co-committed-by: ProfessionalUwU <andre.fuhry@hopeless-cloud.xyz>
2025-01-29 18:13:39 +01:00
cb735a01a1 switch to different copy 2024-09-27 16:36:44 +02:00
e3c9924fbc progress 2024-09-27 16:36:43 +02:00
3645f7f30c critical fixes 2024-09-12 19:01:16 +02:00
66ca74441d change ZSH_CUSTOM default path 2024-09-08 23:06:20 +02:00
7bca34cc89 add newline 2024-09-08 23:05:16 +02:00
e4ab48fb22 fix typo 2024-09-08 23:04:11 +02:00
67c7f48cd7 update README.md 2024-09-08 23:02:34 +02:00
e2d4253050 re-add functionality
This file is needed to restore preview and flatpak update functionality
2024-09-08 22:48:27 +02:00
81b07991aa move stuff around 2024-09-08 16:36:19 +02:00
452b0e92e2 remove justfile 2024-09-08 00:24:39 +02:00
f89e7112a4 remove executable 2024-09-08 00:24:03 +02:00
b28009f83b done with new version 2024-09-08 00:23:20 +02:00
0cf266dd87 starting from scratch 2024-09-03 03:38:43 +02:00
6fce70ba3c fixed some stuff 2024-07-23 19:57:36 +02:00
b13189e7de move stuff around 2024-07-13 01:23:58 +02:00
92777bbbf8 update README.md
Requirements section no longer needed
2024-07-13 01:14:42 +02:00
91eb6be7c6 also lock pacman db in after_backup 2024-07-13 01:11:15 +02:00
c28fbf309e switch from sudo to su
and moved some stuff around
2024-07-13 01:04:31 +02:00
8 changed files with 104 additions and 171 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# Build artifacts
update

2
Makefile Normal file
View File

@ -0,0 +1,2 @@
update:
gcc -ansi -o update update.c

View File

@ -1,36 +1,33 @@
# 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.
## Requirements
It requires sudo, but if you use something else, then just create a softlink for this script to work.
Doing that would look like this.
```bash
ln -s /usr/bin/your_program /usr/bin/sudo
```
Alpm hooks for the pacman package manager.<br>
This project consists of two hooks, one for pre-transaction and the other for
post-transaction.
## Installation
```bash
git clone https://gitea.hopeless-cloud.xyz/AustrianToast/update.git && cd update
git clone https://gitea.hopeless-cloud.xyz/AustrianToast/update.git
cd update
```
Before installing, please edit the config and configure it to your liking.
Before installing, please edit the config and configure it to your liking.
Then install using
```bash
make
make install
```
## Usage
If your require the previous functionality of being able to update flatpak and
having the ability to preview the updateable packages and flatpaks.<br>
This functionality has been re-packaged into `update.zsh`.<br>
If you use oh-my-zsh, then you just throw this file into your `$ZSH_CUSTOM`.<br>
This path is by default `~/.oh-my-zsh/custom`. If you use only plain zsh or any other
shell, then you can just take the contained functions and put them inside the
according shell config file. For example your `.bashrc`.
```
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
```
The function `flatpak-update` contains a variable called `BACKUP_LOCATION`.<br>
Please change this path to your desired backup location.
## Contributing
Contributions are always welcome!

View File

@ -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."

View File

@ -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."

120
update
View File

@ -1,120 +0,0 @@
#!/usr/bin/bash
VERSION="3.0.0"
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
source "$HOME"/.config/update.conf || echo -e "${IRED}No config found${NO_COLOR}" || exit 1
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
}
[[ $BACKUP_LOCATION ]] && check_for_valid_backup_location "$BACKUP_LOCATION" || echo -e "${IRED}No BACKUP_LOCATION specified${NO_COLOR}" || exit 1
[[ $SECONDARY_BACKUP_LOCATION ]] && check_for_valid_backup_location "$SECONDARY_BACKUP_LOCATION"
trap interrupt_function INT
interrupt_function() {
echo "Interrupt has been detected"
[[ -f /var/lib/pacman/db.lck ]] && sudo rm --force /var/lib/pacman/db.lck > /dev/null 2>&1
rm --recursive --force "$TMP" > /dev/null 2>&1
rm --force "$BACKUP_LOCATION"/before-backup_"$DATE".tar.zst.new "$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"
}
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
sudo touch /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 > /dev/null 2>&1 # for some reason it needs the output suppresion
mv "$TMP"/before-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION"
[[ $SECONDARY_BACKUP_LOCATION ]] && mv "$TMP"/before-backup_"$DATE".tar.zst.new "$SECONDARY_BACKUP_LOCATION"
sudo rm --force /var/lib/pacman/db.lck
}
after_backup() {
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" > /dev/null 2>&1
mv "$TMP"/after-backup_"$DATE".tar.zst.new "$BACKUP_LOCATION"
[[ $SECONDARY_BACKUP_LOCATION ]] && mv "$TMP"/before-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
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
}
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
before_backup && echo -e "${IGREEN}pre-backup complete${NO_COLOR}"
update
after_backup && echo -e "${IGREEN}after-backup complete${NO_COLOR}"

83
update.c Normal file
View 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;
}

View File

@ -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