Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--commands/common.py2
-rw-r--r--devbot/config.py8
-rw-r--r--devbot/distro.py160
-rw-r--r--devbot/plugins/__init__.py0
-rw-r--r--devbot/plugins/fedora.py81
-rw-r--r--devbot/plugins/ubuntu.py82
6 files changed, 178 insertions, 155 deletions
diff --git a/commands/common.py b/commands/common.py
index a61139e..e8fab6c 100644
--- a/commands/common.py
+++ b/commands/common.py
@@ -11,6 +11,8 @@ from devbot import config
from devbot import distro
def setup():
+ config.load_plugins()
+
config.set_config_dir(os.path.join(base_dir, "config"))
config.set_install_dir(os.path.join(base_dir, "install"),
relocatable="SUGAR_BUILDBOT" in os.environ)
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)