#!/bin/sh -e # # updates_available: calculate and cache the number of updates available # # Copyright (C) 2008 Canonical Ltd. # Copyright (C) 2011 Dustin Kirkland # # Authors: Dustin Kirkland # # 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 . ___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; printf "!" if [ -n "$s" ]; then if [ "$s" -gt 0 ]; then printf "!" fi fi color -- fi fi } ___update_cache() { local mycache=$1 # 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. if [ -x /usr/lib/update-notifier/apt-check ]; then # If apt-check binary exists, use it /usr/lib/update-notifier/apt-check 2>&1 | awk '-F;' 'END { print $1, $2 }' > "$mycache" & elif command -v apt-get >/dev/null; then # If apt-get exists, use it apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst > $mycache & elif command -v pkcon >/dev/null; then # use packagekit to show list of packages pkcon get-updates -p | grep -c '^Package' > "$mycache" & elif command -v zypper >/dev/null; then # If zypper exists, use it zypper --no-refresh lu --best-effort | grep -c 'v |' > $mycache & elif command -v yum >/dev/null; then # If yum exists, use it # TODO: We need a better way of counting updates available from a RH expert yum list updates -q | grep -vc "Updated Packages" > $mycache & elif command -v pacman >/dev/null; then # If pacman (Archlinux) exists, use it LC_ALL=C pacman -Sup | grep -vc "^\(::\| \)" > $mycache & 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 command -v 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 command -v pacman >/dev/null; then # Archlinux local db for db in /var/lib/pacman/sync/*.db; do [ "$db" -nt "$mycache" ] && return 0 done return 1 fi return 1 } __updates_available_detail() { if command -v 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