
From: Stephan Conrad <stephan.conrad@gmail.com> Signed-off-by: Stephan Conrad <stephan.conrad@gmail.com> --- src/kimchi/model/host.py | 2 +- src/kimchi/swupdate.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/src/kimchi/model/host.py b/src/kimchi/model/host.py index b2fa379..477e126 100644 --- a/src/kimchi/model/host.py +++ b/src/kimchi/model/host.py @@ -91,7 +91,7 @@ class HostModel(object): res['memory'] = 0L # Include IBM PowerKVM name to supported distro names - _sup_distros = platform._supported_dists + ('ibm_powerkvm',) + _sup_distros = platform._supported_dists + ('ibm_powerkvm','arch',) # 'fedora' '17' 'Beefy Miracle' distro, version, codename = platform.linux_distribution( supported_dists=_sup_distros) diff --git a/src/kimchi/swupdate.py b/src/kimchi/swupdate.py index 70db2ef..752c480 100644 --- a/src/kimchi/swupdate.py +++ b/src/kimchi/swupdate.py @@ -26,6 +26,9 @@ from kimchi.exception import NotFoundError, OperationFailed from kimchi.utils import kimchi_log, run_command from kimchi.yumparser import get_yum_packages_list_update +import re +import os + class SoftwareUpdate(object): __metaclass__ = Singleton @@ -63,8 +66,14 @@ class SoftwareUpdate(object): kimchi_log.info("Loading ZypperUpdate features.") self._pkg_mnger = ZypperUpdate() else: - raise Exception("There is no compatible package manager " - "for this system.") + pacman_help = ["pacman", "--help"] + (stdout, stderr, returncode) = run_command(pacman_help) + if returncode == 0: + kimchi_log.info("Loading PacmanUpdate features.") + self._pkg_mnger = PacmanUpdate() + else: + raise Exception("There is no compatible package manager " + "for this system.") def _scanUpdates(self): """ @@ -260,3 +269,66 @@ class ZypperUpdate(object): self._refreshUpdateList() kimchiLock.release() return self._pkgs + +class PacmanUpdate(object): + """ + Class to represent and operate with Pacman software update system. + It's loaded only on those systems listed at PACMAN_DISTROS and loads + necessary modules in runtime. + """ + + def __init__(self): + self._pkgs = {} + self.update_cmd = ["pacman", "-Su", "--noconfirm", "--noprogressbar"] + + def _refreshUpdateList(self): + """ + Update the list of packages to be updated in the system. + """ + self._pkgs = [] + cmd_update = ["pacman", "-Sy"] + cmd_list = ["pacman", "-Qu"] + (stdout, stderr, rc) = run_command(cmd_update) + if rc > 0: + raise OperationFailed('KCHPKGUPD0003E', {'err': stderr}) + + (stdout, stderr, rc) = run_command(cmd_list) + if rc > 0: + if not (rc == 1 and len(stdout)==0): + raise OperationFailed('KCHPKGUPD0003E', {'err': stderr}) + + os.environ['LANG'] = 'C' + + for line in stdout.split('\n'): + if line.find('->') >= 0: + info = line.split(" ") + (sout, serr, ret) = run_command(["pacman", "-Si", info[0]]) + if len(sout) > 0: + for l in sout.split('\n'): + i = re.split('\s+', l.strip()) + if len(i) >= 2: + if i[0] == "Repository": + repo = i[2] + elif i[0] == "Architecture": + arch = i[2] + if arch == "any": + arch = "noarch" + package = { + 'package_name': info[0], + 'version': info[3], + 'arch': arch, + 'repository': repo + } + self._pkgs.append(package) + + def getPackagesList(self): + """ + Return a list of package's dictionaries. Each dictionary contains the + information about a package, in the format + package = {'package_name': <string>, 'version': <string>, + 'arch': <string>, 'repository': <string>} + """ + self._refreshUpdateList() + return self._pkgs + + -- 2.4.3