From c5709d02c5bc52e06862c14df8df4fc764f30d09 Mon Sep 17 00:00:00 2001 From: Daniel Narvaez Date: Mon, 26 Nov 2012 10:50:20 +0000 Subject: Start splitting distro specific code to plugins --- (limited to 'devbot') diff --git a/devbot/config.py b/devbot/config.py index 123958a..cade147 100644 --- a/devbot/config.py +++ b/devbot/config.py @@ -1,9 +1,12 @@ +import imp import json import os +import pkgutil import tempfile from devbot import distro from devbot import utils +from devbot import plugins config_dir = None logs_dir = None @@ -174,6 +177,11 @@ def get_pref(name): return prefs.get(name, None) +def load_plugins(): + for loader, name, ispkg in pkgutil.iter_modules(plugins.__path__): + f, filename, desc = imp.find_module(name, plugins.__path__) + imp.load_module(name, f, filename, desc) + def load_packages(): packages = {} diff --git a/devbot/distro.py b/devbot/distro.py index 72d668e..0523936 100644 --- a/devbot/distro.py +++ b/devbot/distro.py @@ -1,167 +1,17 @@ import os import subprocess -from devbot import command - -class FedoraPackageManager: - def __init__(self, test=False, interactive=True): - self._test = test - self._interactive = interactive - - def install_packages(self, packages): - args = ["yum"] - - if not self._interactive: - args.append("-y") - - args.append("install") - args.extend(packages) - - command.run_with_sudo(args, test=self._test) - - def remove_packages(self, packages): - args = ["rpm", "-e"] - args.extend(packages) - - command.run_with_sudo(args, test=self._test) - - def update(self): - args = ["yum"] - - if not self._interactive: - args.append("-y") - - args.append("update") - - command.run_with_sudo(args, test=self._test) - - def find_all(self): - query_format = "--queryformat=[%{NAME} ]" - all = subprocess.check_output(["rpm", "-qa", query_format]).strip() - return all.split(" ") - - def find_with_deps(self, packages): - result = [] - - for package in packages: - if package not in result: - result.append(package) - - self._find_deps(package, result) - - return result - - def _find_deps(self, package, result): - query_format = "--queryformat=[%{REQUIRENAME} ]" - - try: - capabilities = subprocess.check_output(["rpm", "-q", - query_format, - package]).strip() - except subprocess.CalledProcessError: - print "Package %s not installed" % package - return - - filtered = [cap for cap in capabilities.split(" ") - if not cap.startswith("rpmlib")] - - if capabilities and filtered: - args = ["rpm", "-q", - "--queryformat=[%{NAME} ]", - "--whatprovides"] - args.extend(filtered) - - deps_packages = subprocess.check_output(args).strip() - for dep_package in deps_packages.split(" "): - if dep_package not in result: - result.append(dep_package) - self._find_deps(dep_package, result) - -class UbuntuPackageManager: - def __init__(self, test=False, interactive=True): - import apt - - self._test = test - self._interactive = interactive - - self._cache = apt.cache.Cache() - - def install_packages(self, packages): - args = ["apt-get"] - - if not self._interactive: - args.append("-y") - - args.append("install") - args.extend(packages) - - command.run_with_sudo(args, test=self._test) - - def remove_packages(self, packages): - args = ["dpkg", "-P"] - args.extend(packages) - - command.run_with_sudo(args, test=self._test) - - def update(self): - command.run_with_sudo(["apt-get", "update"], test=self._test) - - args = ["apt-get"] - - if not self._interactive: - args.append("-y") - - args.append("upgrade") - - command.run_with_sudo(args, test=self._test) - - def find_all(self): - return [package.name for package in self._cache - if package.installed is not None] - - def _find_deps(self, package, result): - if self._cache.is_virtual_package(package): - for providing in self._cache.get_providing_packages(package): - self._find_deps(providing.name, result) - return - - if package not in self._cache: - print "Package %s not in cache" % package - return - - installed = self._cache[package].installed - if installed is None: - print "Package %s not installed" % package - return - - for dependency in installed.dependencies: - for base_dependency in dependency.or_dependencies: - dependency_name = base_dependency.name - if dependency_name not in result: - result.append(dependency_name) - self._find_deps(dependency_name, result) - - def find_with_deps(self, package_names): - result = [] - - for package in package_names: - if package is not None: - self._find_deps(package, result) - if package not in result: - result.append(package) - - return result +_package_managers = {} def get_use_lib64(): return os.uname()[4] == "x86_64" and get_distro_name() != "ubuntu" +def register_package_manager(name, package_manager): + _package_managers[name] = package_manager + def get_package_manager(test=False, interactive=True): name, version = _get_distro_info() - - if name == "fedora": - return FedoraPackageManager(test=test, interactive=interactive) - elif name == "ubuntu": - return UbuntuPackageManager(test=test, interactive=interactive) + return _package_managers[name](test=test, interactive=interactive) def get_system_version(): name, version = _get_distro_info() diff --git a/devbot/plugins/__init__.py b/devbot/plugins/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/devbot/plugins/__init__.py diff --git a/devbot/plugins/fedora.py b/devbot/plugins/fedora.py new file mode 100644 index 0000000..fe12997 --- /dev/null +++ b/devbot/plugins/fedora.py @@ -0,0 +1,81 @@ +import os +import subprocess + +from devbot import command +from devbot import distro + +class PackageManager: + def __init__(self, test=False, interactive=True): + self._test = test + self._interactive = interactive + + def install_packages(self, packages): + args = ["yum"] + + if not self._interactive: + args.append("-y") + + args.append("install") + args.extend(packages) + + command.run_with_sudo(args, test=self._test) + + def remove_packages(self, packages): + args = ["rpm", "-e"] + args.extend(packages) + + command.run_with_sudo(args, test=self._test) + + def update(self): + args = ["yum"] + + if not self._interactive: + args.append("-y") + + args.append("update") + + command.run_with_sudo(args, test=self._test) + + def find_all(self): + query_format = "--queryformat=[%{NAME} ]" + all = subprocess.check_output(["rpm", "-qa", query_format]).strip() + return all.split(" ") + + def find_with_deps(self, packages): + result = [] + + for package in packages: + if package not in result: + result.append(package) + + self._find_deps(package, result) + + return result + + def _find_deps(self, package, result): + query_format = "--queryformat=[%{REQUIRENAME} ]" + + try: + capabilities = subprocess.check_output(["rpm", "-q", + query_format, + package]).strip() + except subprocess.CalledProcessError: + print "Package %s not installed" % package + return + + filtered = [cap for cap in capabilities.split(" ") + if not cap.startswith("rpmlib")] + + if capabilities and filtered: + args = ["rpm", "-q", + "--queryformat=[%{NAME} ]", + "--whatprovides"] + args.extend(filtered) + + deps_packages = subprocess.check_output(args).strip() + for dep_package in deps_packages.split(" "): + if dep_package not in result: + result.append(dep_package) + self._find_deps(dep_package, result) + +distro.register_package_manager("fedora", PackageManager) diff --git a/devbot/plugins/ubuntu.py b/devbot/plugins/ubuntu.py new file mode 100644 index 0000000..9cc210d --- /dev/null +++ b/devbot/plugins/ubuntu.py @@ -0,0 +1,82 @@ +import os +import subprocess + +from devbot import command +from devbot import distro + +class PackageManager: + def __init__(self, test=False, interactive=True): + import apt + + self._test = test + self._interactive = interactive + + self._cache = apt.cache.Cache() + + def install_packages(self, packages): + args = ["apt-get"] + + if not self._interactive: + args.append("-y") + + args.append("install") + args.extend(packages) + + command.run_with_sudo(args, test=self._test) + + def remove_packages(self, packages): + args = ["dpkg", "-P"] + args.extend(packages) + + command.run_with_sudo(args, test=self._test) + + def update(self): + command.run_with_sudo(["apt-get", "update"], test=self._test) + + args = ["apt-get"] + + if not self._interactive: + args.append("-y") + + args.append("upgrade") + + command.run_with_sudo(args, test=self._test) + + def find_all(self): + return [package.name for package in self._cache + if package.installed is not None] + + def _find_deps(self, package, result): + if self._cache.is_virtual_package(package): + for providing in self._cache.get_providing_packages(package): + self._find_deps(providing.name, result) + return + + if package not in self._cache: + print "Package %s not in cache" % package + return + + installed = self._cache[package].installed + if installed is None: + print "Package %s not installed" % package + return + + for dependency in installed.dependencies: + for base_dependency in dependency.or_dependencies: + dependency_name = base_dependency.name + if dependency_name not in result: + result.append(dependency_name) + self._find_deps(dependency_name, result) + + def find_with_deps(self, package_names): + result = [] + + for package in package_names: + if package is not None: + self._find_deps(package, result) + if package not in result: + result.append(package) + + return result + +distro.register_package_manager("ubuntu", PackageManager) -- cgit v0.9.1