179 lines
4.8 KiB
Python
Executable File
179 lines
4.8 KiB
Python
Executable File
#!/usr/bin/python
|
|
#coding:utf-8
|
|
import os, sys
|
|
import yum, pickle
|
|
import tempfile
|
|
usages = \
|
|
"""
|
|
Usage: sunyums [OPTION]... [FILE]...
|
|
Output and match all dependent installation packages
|
|
|
|
Example:
|
|
sunyums packname1 packname2
|
|
sunyums packname1 packname2 --config=file --comps=comps.xml
|
|
sunyums packname1 packname2 --mandatory=1 --default=1 --options=0
|
|
|
|
Options:
|
|
--config=file.conf supply an yum config file, default: optional
|
|
--comps=comps.xml supply an parsed comps.xml default: optional
|
|
--mandatory=True include mandatory packages default: True
|
|
--default=True include mandatory packages default: True
|
|
--options=False include mandatory packages default: False
|
|
"""
|
|
class Application(object):
|
|
|
|
def __init__(self, args):
|
|
self.args = args[1:]
|
|
self.yums = yum.YumBase()
|
|
self.comps = None
|
|
self.config = None
|
|
self.groups = []
|
|
self.mandatory = True
|
|
self.default = True
|
|
self.options = False
|
|
|
|
self.basePacks = []
|
|
self.origPacks = []
|
|
self.packages = []
|
|
|
|
def str2bool(self, s):
|
|
"""Converts an on/off, yes/no, true/false string to 1/0."""
|
|
if s and s.upper() in [ 'ON', 'YES', 'Y', 'TRUE', '1', 'ENABLED', 'ENABLE']:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def usages(self):
|
|
print usages
|
|
sys.exit(0)
|
|
|
|
def parseArgs(self):
|
|
|
|
if not self.args:
|
|
self.usages()
|
|
|
|
for arg in self.args:
|
|
if arg in [ '-h', '--help']:
|
|
self.usages()
|
|
|
|
elif arg.startswith('--comps='):
|
|
self.comps = arg.split('=')[1]
|
|
|
|
elif arg.startswith('--config='):
|
|
self.config = arg.split('=')[1]
|
|
|
|
elif arg.startswith('--mandatory='):
|
|
self.mandatory = self.str2bool(arg.split('=')[1])
|
|
|
|
elif arg.startswith('--default='):
|
|
self.default = self.str2bool(arg.split('=')[1])
|
|
|
|
elif arg.startswith('--options='):
|
|
self.options = self.str2bool(arg.split('=')[1])
|
|
|
|
else:
|
|
self.groups.append(arg)
|
|
|
|
def depends(self):
|
|
pkgs = []
|
|
avail = self.yums.pkgSack.returnNewestByNameArch()
|
|
for p in avail:
|
|
if p.name in self.basePacks:
|
|
pkgs.append(p)
|
|
|
|
done = 0
|
|
while not done:
|
|
done = 1
|
|
results = self.yums.findDeps(pkgs)
|
|
for pkg in results.keys():
|
|
for req in results[pkg].keys():
|
|
reqlist = results[pkg][req]
|
|
for r in reqlist:
|
|
if r.name not in self.basePacks:
|
|
self.basePacks.append(r.name)
|
|
pkgs.append(r)
|
|
done = 0
|
|
|
|
def allgroups(self):
|
|
for grp in self.yums.comps.groups:
|
|
self.packages.extend(grp.packages)
|
|
|
|
def handerPackages(self, name):
|
|
if not self.packages:
|
|
self.allgroups()
|
|
|
|
if name in self.packages and \
|
|
name not in self.basePacks:
|
|
self.basePacks.append(name)
|
|
|
|
if name not in self.origPacks:
|
|
self.origPacks.append(name)
|
|
|
|
def handerGroups(self, name):
|
|
groups = []
|
|
if not self.yums.comps.has_group(name):
|
|
return
|
|
|
|
valid_groups = self.yums.comps.return_group(name.encode('utf-8'))
|
|
if self.mandatory:
|
|
groups.extend(valid_groups.mandatory_packages.keys())
|
|
if self.default:
|
|
groups.extend(valid_groups.default_packages.keys())
|
|
if self.options:
|
|
groups.extend(valid_groups.options_packages.keys())
|
|
|
|
for package in groups:
|
|
self.handerPackages(package)
|
|
|
|
def handerEnviron(self, name):
|
|
groups = []
|
|
if not self.yums.comps.has_environment(name):
|
|
return
|
|
|
|
valid_environ = self.yums.comps.return_environment(name)
|
|
for grp in valid_environ.groups:
|
|
self.handerGroups(grp)
|
|
|
|
def run(self):
|
|
|
|
if self.comps and os.path.exists(self.comps):
|
|
self.yums.comps.add(self.comps)
|
|
|
|
if self.config and os.path.exists(self.config):
|
|
self.yums.doConfigSetup(fn=self.config, init_plugins=False)
|
|
|
|
self.yums.conf.cache = 0
|
|
for rpm in self.groups:
|
|
if rpm[0] == '@':
|
|
self.handerGroups(rpm[1:])
|
|
|
|
elif rpm[0] == '^':
|
|
self.handerEnviron(rpm[1:])
|
|
|
|
else:
|
|
self.handerPackages(rpm)
|
|
|
|
self.depends()
|
|
|
|
for o in self.origPacks:
|
|
if o not in self.basePacks:
|
|
print '#%s' % o
|
|
|
|
for p in self.basePacks:
|
|
print p
|
|
|
|
if __name__ == "__main__":
|
|
app = Application(sys.argv)
|
|
app.parseArgs()
|
|
app.allgroups()
|
|
app.run()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|