Files
entropy/efusion/src/packages.py
T
2007-08-03 08:31:16 +00:00

375 lines
12 KiB
Python

#!/usr/bin/python -tt
# -*- coding: iso-8859-1 -*-
# Yum Exteder (yumex) - A GUI for yum
# Copyright (C) 2006 Tim Lauridsen < tim<AT>yum-extender<DOT>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; either version 2 of the License, or
# (at your option) any later version.
#
# 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, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
from yumgui.packages import PackageWrapper
import logging
import time
import yum.misc as misc
import yum.Errors as Errors
from yum.packages import parsePackages
from i18n import _
class YumexPackage( PackageWrapper ):
""" This class contains a yumPackage and some extra features used by
yumex """
def __init__( self, pkg, recentlimit, avail=True ):
PackageWrapper.__init__( self, pkg, avail )
self.selected = False
self.visible = True
self.queued = None
self.action = None
self.obsolete = False
self.obsolete_tup = None
self.color = "black"
self.time = self._get_time()
if self.time > recentlimit:
self.recent = True
else:
self.recent = False
def set_select( self, state ):
self.selected = state
def set_visible( self, state ):
self.visible = state
class YumexPackages:
def __init__(self):
self.logger = logging.getLogger('yumex.Packages')
self.filterCallback = None
self._packages = {}
self.currentCategory = None
self._categoryPackages = {}
self.pkgInGrps = PkgInGroupList()
def clearPackages(self):
self._packages = {}
def populatePackages(self,masks):
for flt in masks:
if self._packages.has_key(flt):
continue
if flt == 'available':
self._packages[flt] = self.getAvailable()
else:
self._packages[flt] = [p for p in self._getPackages(flt)]
def setCategoryPackages(self,pkgdict = {}):
self._categoryPackages = pkgdict
def getPackagesByCategory(self,cat=None):
if not cat:
cat = self.currentCategory
else:
self.currentCategory = cat
if self._categoryPackages.has_key(cat):
return self._categoryPackages[cat]
else:
return False
def getPackages(self,flt):
if flt == 'all':
return self.getAllPackages()
else:
return self.doFiltering(self.getRawPackages(flt))
def getAvailable(self):
if not self._packages.has_key('updates'):
self.populatePackages('updates')
polist = []
updlist = []
for po in self._packages['updates']:
polist.append(po)
updlist.append(po.pkgtup)
avail = [p for p in self._getPackages('available')]
for po in avail:
if not po.pkgtup in updlist:
polist.append(po)
return polist
def getAllPackages(self):
pkgs = []
pkgs.extend(self.getPackages('installed'))
pkgs.extend(self.getPackages('available'))
return pkgs
def setFilter(self,fn = None):
self.filterCallback = fn
def doFiltering(self,pkgs):
if self.filterCallback:
return filter(self.filterCallback,pkgs)
else:
return pkgs
def isInst(self,name): # fast check for if package is installed
mi = self.ts.ts.dbMatch('name', name)
if mi.count() > 0:
return True
return False
def findPackages(self,userlist,typ):
pkgs = self.getRawPackages(typ)
foundlst = []
for arg in userlist:
print "Looking for : %s in %s packages " % (arg,typ)
exactmatch, matched, unmatched = parsePackages(pkgs, [arg],
casematch=1)
foundlst.extend(exactmatch)
foundlst.extend(matched)
return foundlst
def findPackagesByTuples(self,typ,tuplist):
pkgs = self.getRawPackages(typ)
foundlst = []
for pkg in pkgs:
tup = pkg.pkgtup
if tup in tuplist:
foundlst.append(pkg)
return foundlst
def getRawPackages(self,flt):
self.populatePackages([flt])
return self._packages[flt]
def _getPackages(self,mask):
if mask == 'installed':
for po in self.rpmdb:
yp = YumexPackage(po,self.recent,False)
yp.selected = True
yp.action = 'r'
yp.color = 'darkgreen'
yield yp
elif mask == 'available':
# Get the rest of the available packages.
for po in self.pkgSack.returnNewestByNameArch():
if not self.isInst(po.name):
yp = YumexPackage(po,self.recent,True)
yp.action = 'i'
yield yp
elif mask == 'updates':
obsoletes = self.up.getObsoletesTuples( newest=1 )
for ( obsoleting, installed ) in obsoletes:
obsoleting_pkg = self.getPackageObject( obsoleting )
installed_pkg = self.rpmdb.searchPkgTuple( installed )[0]
yp = YumexPackage(obsoleting_pkg,self.recent,True)
yp.action = 'u'
yp.obsolete = True
yp.obsolete_tup = installed_pkg.pkgtup
yp.color = 'blue'
yield yp
updates = self.up.getUpdatesList()
obsoletes = self.up.getObsoletesList()
for ( n, a, e, v, r ) in updates:
if ( n, a, e, v, r ) in obsoletes:
continue
matches = self.pkgSack.searchNevra( name=n, arch=a, epoch=e,
ver=v, rel=r )
if len( matches ) > 0:
yp = YumexPackage(matches[0],self.recent,True)
yp.action = 'u'
yp.color = 'red'
yield yp
def getByProperty( self, type, category ):
list = self.getPackages(type)
dict = {}
for pkg in list:
val = getattr( pkg, category )
# Strip newline in keys
if val:
val = val.strip( '\n' )
if dict.has_key( val ):
dict[val].append( pkg )
else:
dict[val] = [pkg]
return dict, dict.keys()
def getByAttr( self, type, attr ):
list = self.getPackages(type)
dict = {}
for pkg in list:
val = pkg.getAttr( attr )
# Strip newline in keys
if val:
val = val.strip( '\n' )
if dict.has_key( val ):
dict[val].append( pkg )
else:
dict[val] = [pkg]
return dict, dict.keys()
def getBySizes( self, type):
list = self.getPackages(type)
keys = [
'0 KB - 100 KB',
'100 KB - 1 MB',
'1 MB - 10 MB' ,
'10 MB - 50 MB',
'50+ MB']
dict = {}
for pkg in list:
val = self._getSizeKey( pkg.size )
if dict.has_key( val ):
dict[val].append( pkg )
else:
dict[val] = [pkg]
return dict , keys
def _getSizeKey( self, size ):
kb = 1024
mb = 1024*1024
if size < 100*kb:
return '0 KB - 100 KB'
elif size < mb:
return '100 KB - 1 MB'
elif size < 10*mb:
return '1 MB - 10 MB'
elif size < 50*mb:
return '10 MB - 50 MB'
else:
return '50+ MB'
def getByAge( self, typ):
list = self.getPackages(typ)
keys = [
'0 - 7 Days',
'7 - 14 Days',
'14 - 21 Days',
'21 - 30 days',
'30 - 90 days',
'90+ days']
dict = {}
for pkg in list:
val = self._getAgeKey( pkg._get_time() )
if dict.has_key( val ):
dict[val].append( pkg )
else:
dict[val] = [pkg]
return dict , keys
def _getAgeKey( self, date ):
now = time.time()
days = 86400 # Seconds
if date > now-7*days:
return '0 - 7 Days'
elif date > now-14*days:
return '7 - 14 Days'
elif date > now-21*days:
return '14 - 21 Days'
elif date > now-30*days:
return '21 - 30 days'
elif date > now-90*days:
return '30 - 90 days'
else:
return '90+ days'
def getByGroup(self,grp,flt):
list = []
list.extend(self.getRawPackages('installed'))
list.extend(self.getRawPackages('available'))
gpkgs = grp.packages
pkgs = []
for pkg in list:
if pkg.name in gpkgs:
pkginfo = self.pkgInGrps.get(pkg.name)
if pkginfo[0].typ in flt:
pkgs.append(pkg)
return pkgs
def buildGroups(self):
cats = self.comps.categories
catDict = {}
for cat in cats:
grps = map( lambda x: self.comps.return_group( x ),
filter( lambda x: self.comps.has_group( x ), cat.groups ) )
grplist = []
for grp in grps:
grplist.append( grp.name )
self.buildGroupPackages(grp,cat)
catDict[cat.categoryid] = grplist
#self.pkgInGrps.dump()
def buildGroupPackages(self,group,cat):
for pkg in group.mandatory_packages.keys():
self.pkgInGrps.add(pkg,'m',group,cat)
for pkg in group.default_packages.keys():
self.pkgInGrps.add(pkg,'d',group,cat)
for pkg in group.optional_packages.keys():
self.pkgInGrps.add(pkg,'o',group,cat)
for pkg in group.conditional_packages.keys():
self.pkgInGrps.add(pkg,'c',group,cat)
class PkgInGroup:
def __init__(self, pkg, typ, grp, cat):
self.name = pkg
self.typ = typ
self.group = grp
self.category = cat
def __str__(self):
return self.name
class PkgInGroupList:
def __init__(self):
self._pkgDict = {}
def add(self, pkg, typ, grp, cat):
gpkg = PkgInGroup(pkg,typ,grp,cat)
if self._pkgDict.has_key(pkg):
self._pkgDict[pkg].append(gpkg)
else:
self._pkgDict[pkg] = [gpkg]
def get(self,pkg):
if self._pkgDict.has_key(pkg):
return self._pkgDict[pkg]
else:
return None
def getAll(self):
lst = []
for key in self._pkgDict.keys():
lst.extend(self._pkgDict[key])
return lst
def getFullCategory(self,po):
pkg = self.get(po.name)
if pkg:
return "%s/%s" % (pkg[0].category.name,pkg[0].group.name)
else:
return "!No Category/No Group"
def dump(self):
for pkg in self.getAll():
print "%-40s %s -> %s/%s" % (pkg.name,pkg.typ,pkg.category.name,pkg.group.name)