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
|
#!/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.DelCount > 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.GetCache()
except SystemError, e:
sys.stderr.write("E: "+ _("Error: Opening the cache (%s)") % e)
sys.exit(-1)
depcache = apt_pkg.GetDepCache(cache)
# read the pin files
depcache.ReadPinFile()
# read the synaptic pins too
if os.path.exists(SYNAPTIC_PINFILE):
depcache.ReadPinFile(SYNAPTIC_PINFILE)
# init the depcache
depcache.Init()
if depcache.BrokenCount > 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.MarkedInstall(pkg) or depcache.MarkedUpgrade(pkg):
# check if this is really a upgrade or a false positive
# (workaround for ubuntu #7907)
if depcache.GetCandidateVer(pkg) != pkg.CurrentVer:
upgrades = upgrades + 1
ver = depcache.GetCandidateVer(pkg)
for (file, index) in ver.FileList:
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.MarkedInstall(pkg) or depcache.MarkedUpgrade(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)
|