-
Notifications
You must be signed in to change notification settings - Fork 118
/
updates_available
executable file
·137 lines (131 loc) · 5.03 KB
/
updates_available
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/bin/sh -e
#
# updates_available: calculate and cache the number of updates available
#
# Copyright (C) 2008 Canonical Ltd.
# Copyright (C) 2011-2014 Dustin Kirkland
#
# Authors: Dustin Kirkland <kirkland@byobu.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
___print_updates() {
local u= s=
read u s < "$1"
if [ -n "$u" ]; then
if [ "$u" -gt 0 ]; then
color b r W; printf "%d" "$u"; color -; color r W
if [ -n "$s" ] && [ "$s" -gt 0 ]; then
printf "$ICON_SECURITY"
else
printf "$ICON_UPDATES"
fi
color --
elif [ "$u" = "0" ] && [ -e "$BYOBU_RUN_DIR/status.$BYOBU_BACKEND/updates_available" ]; then
# Clear out byobu's status cache
rm -f "$BYOBU_RUN_DIR/status.$BYOBU_BACKEND/updates_available"*
fi
fi
}
___update_cache() {
local mycache=$1 flock="$1.lock"
# Now we actually have to do hard computational work to calculate updates.
# Let's try to be "nice" about it:
renice 10 $$ >/dev/null 2>&1 || true
ionice -c3 -p $$ >/dev/null 2>&1 || true
# These are very computationally intensive processes.
# Background this work, have it write to the cache files,
# and let the next cache check pick up the results.
# Ensure that no more than one of these run at a given time
if [ -x /usr/lib/update-notifier/apt-check ]; then
# If apt-check binary exists, use it
flock -xn "$flock" /usr/lib/update-notifier/apt-check 2>&1 | awk '-F;' 'END { print $1, $2 }' >"$mycache" 2>/dev/null &
elif eval $BYOBU_TEST apt-get >/dev/null; then
# If apt-get exists, use it
flock -xn "$flock" apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst >$mycache 2>/dev/null &
elif eval $BYOBU_TEST pkcon >/dev/null; then
# use packagekit to show list of packages
LC_ALL=C flock -xn "$flock" pkcon get-updates -p | awk '/^Results:$/ { start=NR }; /^Security/ { security++ }; END { if (!/There are no updates available at this time./) { print NR-start, security }}' > "$mycache" 2>/dev/null &
elif eval $BYOBU_TEST zypper >/dev/null; then
# If zypper exists, use it
flock -xn "$flock" zypper --no-refresh lu --best-effort | grep -c 'v |' >$mycache 2>/dev/null &
elif eval $BYOBU_TEST yum >/dev/null; then
# If yum exists, use it
# TODO: We need a better way of counting updates available from a RH expert
flock -xn "$flock" yum list updates -q | grep -vc "Updated Packages" >$mycache 2>/dev/null &
elif eval $BYOBU_TEST pacman >/dev/null; then
# If pacman (Archlinux) exists, use it
LC_ALL=C flock -xn "$flock" pacman -Sup | grep -vc "^\(::\| \)" >$mycache 2>/dev/null &
elif eval $BYOBU_TEST brew >/dev/null; then
# If homebrew (Mac OSX) exists, use it, also background if flock exists
if eval $BYOBU_TEST flock; then
flock -xn "$flock" brew outdated | wc -l >$mycache 2>/dev/null &
else
brew outdated | wc -l >$mycache &
fi
fi
}
___update_needed() {
# Checks if we need to update the cache.
# TODO: add more distro
local mycache=$1
# The cache doesn't exist: create it
[ ! -e "$mycache" ] && return 0
if eval $BYOBU_TEST apt-get >/dev/null; then
# Debian/ubuntu
[ "/var/lib/apt" -nt "$mycache" ] || [ "/var/lib/apt/lists" -nt "$mycache" ]
return $?
elif [ -e "/var/lib/PackageKit/transactions.db" ]; then
[ "/var/lib/PackageKit/transactions.db" -nt "$mycache" ]
return $?
elif eval $BYOBU_TEST pacman >/dev/null; then
# Archlinux
local db
for db in /var/lib/pacman/sync/*.db; do
[ "$db" -nt "$mycache" ] && return 0
done
return 1
elif eval $BYOBU_TEST brew >/dev/null; then
# Mac OSX
# check if any new versions have been installed since
# we last cached. this may not recognize formulae
# installed with HEAD
for f in $(brew --prefix)/Cellar/*; do
[ "$f" -nt "$mycache" ] && return 0
done
# nothing new has been installed, so check wether the
# formulae database was updated
[ "$(brew --prefix)/Library/Formula" -nt "$mycache" ]
return $?
fi
return 1
}
__updates_available_detail() {
if eval $BYOBU_TEST apt-get >/dev/null; then
local detail=`apt-get -s -o Debug::NoLocking=true upgrade`
if [ "$1" = "--detail" ]; then
printf "$detail"
else
local short=`printf "%s" "$detail" | grep -c ^Inst`
printf "$short"
fi
fi
}
__updates_available() {
local mycache="$BYOBU_RUN_DIR/cache.$BYOBU_BACKEND/updates-available"
# If mycache is present, use it
[ -r $mycache ] && ___print_updates "$mycache"
# If we really need to do so (mycache doesn't exist, or the package database has changed),
# background an update now
___update_needed "$mycache" && ___update_cache "$mycache"
}
# vi: syntax=sh ts=4 noexpandtab