-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdowngrade-ud.sh
More file actions
executable file
·103 lines (91 loc) · 4.11 KB
/
downgrade-ud.sh
File metadata and controls
executable file
·103 lines (91 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/bin/bash
# downgrade-ud 2021-03-23
# Dependencies: sudo pacutils
# Script to undo last update
# shellcheck disable=
#--------------------------------------------------------------------------------------------
help () {
cat << EOF
|============================================================================================|
| Downgrade-ud: Script to undo last update. Intended for use after system update breakage. |
| Running 'downgrade-ud -h' prints this info. |
|--------------------------------------------------------------------------------------------|
| USAGE: downgrade-ud [operation] |
| |
| operations: -rl --readable_list print 'hr' downgrade list (packages-versions) |
| -dl --downgrade_list print 'pacman format' downgrade list |
| -dt --downgrade_test simulated downgrade (non transactional dry run) |
| -dg --downgrade downgrade packages from list |
| -h --help print this help info |
| |
| Downgrade-ud gets the last update package list and the versions (pre-post updated) |
| from /var/log/pacman.log. It downgrades with 'sudo pacman -U "\${DowngradeList[@]}"'. |
| |
| Downgrade-ud script location: $(which "$0") |
|============================================================================================|
EOF
}
#--------------------------------------------------------------------------------------------
# SET VARIABLES:
Today=$(date '+%Y-%m-%d')
Packages=$(paclog --after "${Today}" | paclog --action upgrade - \
| awk '{print $4" " $5}' \
| awk '!seen[$0]++' \
| awk -F'(' '{ gsub (" ", "", $0); print "/var/cache/pacman/pkg/" $1"-"$2}')
# ^ Read pacman.log for last update ^ #
# filter to pkg-ver and prepend cache path #
readarray -t DowngradeList < <(for i in ${Packages}
do
find "${i}"* 2>/dev/null \
| grep -v sig
done)
# ^ Run "${Packages}" through 'find' to check availability in ^ #
# cache, discard unavailable, create DowngradeList array for pacman #
#--------------------------------------------------------------------------------------------
check () {
if ! [[ -v DowngradeList ]]; then
printf '%s\n' "
There have been no updates made today, nothing to do.
Downgradable list: ${DowngradeList[*]}
"
exit
fi
}
#--------------------------------------------------------------------------------------------
readable_list () {
echo " todays date : ${Today}" ; echo
paclog --after "${Today}" | paclog --action upgrade - \
| awk '{print $4" " $5" " $6" " $7}' \
| awk '!seen[$0]++' \
| column -t \
| sort
}
#--------------------------------------------------------------------------------------------
downgrade_list () {
printf '%s\n' "${DowngradeList[@]}"
}
#--------------------------------------------------------------------------------------------
downgrade_test () {
sudo pacman -Up "${DowngradeList[@]}"
}
#--------------------------------------------------------------------------------------------
downgrade_packages () {
sudo pacman -U "${DowngradeList[@]}"
}
#--------------------------------------------------------------------------------------------
if [[ -z $1 ]]; then echo "
A script to undo todays pacman update.
"
fi
while :; do
case "${1}" in
-rl|--readable_list) check ; readable_list ;;
-dl|--downgrade_list) check ; downgrade_list ;;
-dt|--downgrade_test) check ; downgrade_test ;;
-dg|--downgrade) check ; downgrade_packages ;;
-h|--help) help ;;
-?*) echo "user input error" ;;
*) break
esac
shift
done