123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #!/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" sh -c "(/usr/lib/update-notifier/apt-check 2>&1 | awk '-F;' 'END { print \$1, \$2 }' >\"${mycache}-x\" 2>/dev/null ; mv \"${mycache}-x\" \"$mycache\")" &
- 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 opkg >/dev/null; then
- # If opkg (OpenWrt) exists, use it, also background if flock exists
- if eval $BYOBU_TEST flock >/dev/null; then
- flock -xn "$flock" opkg list-upgradable | wc -l >$mycache 2>/dev/null &
- else
- opkg list-upgradable | wc -l >$mycache &
- fi
- 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 >/dev/null; 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
- d0=$(($(stat -c %Y $mycache 2>/dev/null)-5))
- d1=$(stat -c %Y /var/lib/apt)
- d2=$(stat -c %Y /var/lib/apt/lists)
- d3=$(stat -c %Y /var/log/dpkg.log)
- now=$(date +%s)
- delta=$(($now-$d0))
- if [ $d0 -lt 0 ] || [ $d0 -lt $d1 ] || [ $d0 -lt $d2 ] || [ $d0 -lt $d3 ] || [ 3605 -lt $delta ] ; then
- return 0
- else
- return 1
- fi
- 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 opkg >/dev/null; then
- # OpenWrt
- [ ! -e /var/lock/opkg.lock ] || return 1
- if [ -d /var/opkg-lists ]; then
- [ /var/opkg-lists -nt "$mycache" ]
- return $?
- else
- local u s
- read u s < "$mycache"
- [ "$u" -gt 0 ]
- return $?
- fi
- 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
|