After updating apt-check to use the python-apt 0.7.93 API
I hadn't renamed the new version to the production version
('/usr/lib/update-notifier/apt-check'), but as soon as I did,
the orange ball popped up in the notification area a few seconds
later!
I am attaching a patch to apt-check that updates
apt-check to use the new API.
#!/usr/bin/python
#nice apt-get -s -o Debug::NoLocking=true upgrade | grep ^Inst
import apt_pkg
import os
import sys
from optparse import OptionParser
from gettext import gettext as _
import gettext
SYNAPTIC_PINFILE = "/var/lib/synaptic/preferences"
def clean(cache,depcache):
# mvo: looping is too inefficient with the new auto-mark code
#for pkg in cache.Packages:
# depcache.MarkKeep(pkg)
depcache.init()
def saveDistUpgrade(cache,depcache):
""" this functions mimics a upgrade but will never remove anything """
depcache.upgrade(True)
if depcache.del_count > 0:
clean(cache,depcache)
depcache.upgrade()
def _handleException(type, value, tb):
sys.stderr.write("E: "+ "Unkown Error: '%s' (%s)" % (type,value))
sys.exit(-1)
# -------------------- main ---------------------
# be nice
os.nice(19)
# setup a exception handler to make sure that uncaught stuff goes
# to the notifier
sys.excepthook = _handleException
# gettext
APP="update-notifier"
DIR="/usr/share/locale"
gettext.bindtextdomain(APP, DIR)
gettext.textdomain(APP)
# check arguments
parser = OptionParser()
parser.add_option("-p",
"--package-names",
action="store_true",
dest="show_package_names",
help="show the packages that are going to be installed/upgraded")
(options, args) = parser.parse_args()
#print options.security_only
# init
apt_pkg.init()
# get caches
try:
cache = apt_pkg.Cache()
except SystemError, e:
sys.stderr.write("E: "+ _("Error: Opening the cache (%s)") % e)
sys.exit(-1)
depcache = apt_pkg.DepCache(cache)
# read the pin files
depcache.read_pinfile()
# read the synaptic pins too
if os.path.exists(SYNAPTIC_PINFILE):
depcache.read_pinfile(SYNAPTIC_PINFILE)
# init the depcache
depcache.init()
if depcache.broken_count > 0:
sys.stderr.write("E: "+ _("Error: BrokenCount > 0"))
sys.exit(-1)
# do the upgrade (not dist-upgrade!)
try:
saveDistUpgrade(cache,depcache)
except SystemError, e:
sys.stderr.write("E: "+ _("Error: Marking the upgrade (%s)") % e)
sys.exit(-1)
# check for upgrade packages, we need to do it this way
# because of ubuntu #7907
upgrades = 0
security_updates = 0
for pkg in cache.packages:
if depcache.marked_install(pkg) or depcache.marked_upgrade(pkg):
# check if this is really a upgrade or a false positive
# (workaround for ubuntu #7907)
if depcache.get_candidate_ver(pkg) != pkg.current_ver:
upgrades = upgrades + 1
ver = depcache.get_candidate_ver(pkg)
for (file, index) in ver.file_list:
if (file.archive.endswith("-security") and
file.Origin == "Ubuntu"):
security_updates += 1
# print the number of upgrades
if options.show_package_names:
pkgs = filter(lambda pkg: depcache.marked_install(pkg) or depcache.marked_upgrade(pkg), cache.packages)
sys.stderr.write("\n".join(map(lambda p: p.Name, pkgs)))
else:
# print the number of regular upgrades and the number of
# security upgrades
sys.stderr.write("%s;%s" % (upgrades,security_updates))
sys.exit(0)