5 Commits

Author SHA1 Message Date
795a06f4be Implement download from ArchLinux Archive. 2024-05-25 18:24:41 +02:00
e9e2737bd4 Silence ls errors.
It is expected behavior that sometimes the local file will not be found.
2024-05-25 18:17:47 +02:00
d4f0f15341 Add uninstall target for Makefile. 2024-05-25 18:01:37 +02:00
962c54b8e0 Remove perl compiling.
This is giving some weird outputs when I try running it after making the
ArchLinux package (see AUR pacundo).
2024-05-25 17:58:51 +02:00
ebdf36d3c0 Update description to include "rollback" keyword.
This is the keyword that I assume most people use when looking for this
sort of a tool. Should be helpful.

Signed-off-by: Nicolás Ortega Froysa <nicolas@ortegas.org>
2024-05-22 17:14:30 +02:00
4 changed files with 58 additions and 15 deletions

View File

@ -24,20 +24,22 @@ ifeq ($(PREFIX),)
PREFIX := /usr/local PREFIX := /usr/local
endif endif
pacundo: pacundo.pl
pp -o $@ $^
pacundo.1.gz: pacundo.1 pacundo.1.gz: pacundo.1
gzip -c $^ > $@ gzip -c $^ > $@
.PHONY: install clean .PHONY: clean doc install uninstall
clean: clean:
$(RM) pacundo
$(RM) pacundo.1.gz $(RM) pacundo.1.gz
doc: pacundo.1.gz
install: pacundo pacundo.1.gz install: pacundo pacundo.1.gz
install -d $(PREFIX)/bin install -d $(PREFIX)/bin
install -m 755 pacundo $(PREFIX)/bin/ install -m 755 pacundo.pl $(PREFIX)/bin/pacundo
install -d $(PREFIX)/share/man/man1 install -d $(PREFIX)/share/man/man1
install -m 644 pacundo.1.gz $(PREFIX)/share/man/man1/ install -m 644 pacundo.1.gz $(PREFIX)/share/man/man1/
uninstall:
$(RM) $(PREFIX)/bin/pacundo
$(RM) $(PREFIX)/share/man/man1/pacundo.1.gz

View File

@ -11,13 +11,13 @@ to boot from a USB depending on just how broken it is).
- Perl 5 - Perl 5
- `File::ReadBackwards` module - `File::ReadBackwards` module
- PAR Packager (for compiling) - cURL
- GNU Makefile - GNU Makefile
You can install these packages with the following command: You can install these packages with the following command:
```console ```console
# pacman -S perl perl-file-readbackwards perl-par-packer # pacman -S perl perl-file-readbackwards curl
``` ```
### Compiling & Installing ### Compiling & Installing

View File

@ -1,6 +1,6 @@
.TH PACUNDO "1" "April 2024" "pacundo 1.0.1" "User Commands" .TH PACUNDO "1" "April 2024" "pacundo 1.0.1" "User Commands"
.SH "NAME" .SH "NAME"
pacundo - A time machine to return your ArchLinux machine back to a working state. pacundo - A time machine to roll back your ArchLinux machine to a working state.
.SH "SYNOPSIS" .SH "SYNOPSIS"
.B pacundo .B pacundo
[\fI\-i\fR|\fI\-r\fR] [\fI\-t\fR <\fInum\fR>] [\fI\-d\fR] [\fI\-i\fR|\fI\-r\fR] [\fI\-t\fR <\fInum\fR>] [\fI\-d\fR]

View File

@ -39,7 +39,7 @@ sub print_version() {
sub print_help() { sub print_help() {
&print_version(); &print_version();
print("A time machine to return your ArchLinux machine back to a working state. print("A time machine to roll back your ArchLinux machine to a working state.
USAGE: USAGE:
$PROG_NAME [-i|-r] [-t <num>] [-d] $PROG_NAME [-i|-r] [-t <num>] [-d]
@ -183,6 +183,7 @@ sub find_local_pkg($pkgmgr, $pkg_name, $pkg_ver='') {
my $pkg_file = ''; my $pkg_file = '';
my $pkg_pat; my $pkg_pat;
my $repo = `$pkgmgr->{info} $pkg_name | awk '{ if (\$1 == "Repository") print \$3; }'`;; my $repo = `$pkgmgr->{info} $pkg_name | awk '{ if (\$1 == "Repository") print \$3; }'`;;
chomp($repo);
if ($pkg_ver ne '') { if ($pkg_ver ne '') {
$pkg_pat = "$pkg_name-$pkg_ver-*.pkg.tar.zst"; $pkg_pat = "$pkg_name-$pkg_ver-*.pkg.tar.zst";
@ -199,9 +200,9 @@ sub find_local_pkg($pkgmgr, $pkg_name, $pkg_ver='') {
return ''; return '';
} }
$pkg_file = `ls $aur_dir/$pkg_pat | tail -n1`; $pkg_file = `ls $aur_dir/$pkg_pat 2> /dev/null | tail -n1`;
} else { } else {
$pkg_file = `ls /var/cache/pacman/pkg/$pkg_pat | tail -n1`; $pkg_file = `ls /var/cache/pacman/pkg/$pkg_pat 2> /dev/null | tail -n1`;
} }
chomp($pkg_file); chomp($pkg_file);
@ -209,6 +210,44 @@ sub find_local_pkg($pkgmgr, $pkg_name, $pkg_ver='') {
return $pkg_file; return $pkg_file;
} }
sub find_remote_archive($pkgmgr, $pkg_name, $pkg_ver) {
my $repo = `$pkgmgr->{info} $pkg_name | awk '{ if (\$1 == "Repository") print \$3; }'`;;
chomp($repo);
# TODO: look through git history for version.
if ($repo eq 'aur') {
return '';
}
# TODO: Probably a better way of managing architectures. There should be a
# way of getting the architecture of the package.
my @archs = (`uname -m`, 'any');
my $ala_url = "https://archive.archlinux.org/packages/" .
substr($pkg_name,0,1) . "/" . $pkg_name;
my $pkg_file = '';
foreach my $arch (@archs) {
chomp($arch);
my $filename = "$pkg_name-$pkg_ver-$arch.pkg.tar.zst";
my $pkg_url = "$ala_url/$filename";
my $output_file = "/tmp/$filename";
my $resp = `curl -Lo $output_file -s -w '%{http_code}\n' $pkg_url`;
chomp($resp);
if ($resp eq '200') {
system("curl -Lo $output_file.sig -s $pkg_url.sig");
$pkg_file = $output_file;
last;
} else {
unlink $output_file;
}
}
if ($pkg_file ne '') {
print("Downloaded from archive: $pkg_file\n");
}
return $pkg_file;
}
getopts("irt:dvh", \my %opts); getopts("irt:dvh", \my %opts);
if ($opts{'v'}) { if ($opts{'v'}) {
@ -252,10 +291,12 @@ foreach my $tx (@undo_txs) {
} }
} else { } else {
my $pkg_file = &find_local_pkg($pkgmgr, $tx->{pkg_name}, $tx->{oldver}); my $pkg_file = &find_local_pkg($pkgmgr, $tx->{pkg_name}, $tx->{oldver});
if ($pkg_file eq '') { $pkg_file = &find_remote_archive($pkgmgr, $tx->{pkg_name}, $tx->{oldver}) if ($pkg_file eq '');
$remote_install_pkgs .= "$tx->{pkg_name} ";
} else { if ($pkg_file ne '') {
$local_install_pkgs .= "$pkg_file "; $local_install_pkgs .= "$pkg_file ";
} else {
print(STDERR "Unable to find $tx->{pkg_name} $tx->{pkg_ver}");
} }
} }
} }