import os import subprocess from xml.dom import minidom scripts_dir = os.path.dirname(__file__) base_dir = os.path.dirname(scripts_dir) def get_distribution(): if 'SJH_DISTRIBUTION' in os.environ: return os.environ['SJH_DISTRIBUTION'].split('-') # Fedora if os.path.exists('/etc/fedora-release'): name = 'fedora' f = open('/etc/fedora-release') full_name = f.read() f.close() if 'Rawhide' in full_name: version = 'rawhide' else: version = full_name.split(' ')[2] return name, version # Debian and Ubuntu try: out, err = subprocess.Popen(['lsb_release', '-is'], stdout=subprocess.PIPE).communicate() name = out.strip().lower() out, err = subprocess.Popen(['lsb_release', '-rs'], stdout=subprocess.PIPE).communicate() version = out.strip() if name == 'debian' and version == 'testing': version = 'unstable' return name, version except OSError: pass return None, None def check_package(package): name, version = get_distribution() if name in ['fedora', 'mandrivalinux']: ret = subprocess.call(['rpm', '--quiet', '-q', package]) return ret == 0 elif name in ['ubuntu', 'debian']: cmd = ["dpkg-query", "-f='${status}'", "-W", package] out, err = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate() return out.find('install ok installed') != -1 return None def parse_dependencies(): name, version = get_distribution() if name is None or version is None: return None filename = os.path.join(base_dir, 'config', 'sysdeps', '%s-%s.xml' % (name, version)) if not os.path.exists(filename): return None return minidom.parse(filename) def get_packages(): document = parse_dependencies() if document is None: return [] packages = [] root = document.childNodes[0] for node in root.childNodes: if node.nodeType == node.ELEMENT_NODE: if node.nodeName == 'package': name = node.getAttribute('name') if node.hasAttribute('source'): source = node.getAttribute('source') else: source = None packages.append((name, source)) return packages