From 478ac6a1c92d077ffe2a3e492aa3562b385b0d71 Mon Sep 17 00:00:00 2001 From: Zain Memon Date: Thu, 28 Jun 2012 14:13:31 -0700 Subject: [PATCH 1/5] Add a requires_packages decorator. --- patchwork/packages/__init__.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/patchwork/packages/__init__.py b/patchwork/packages/__init__.py index 13dce4e..a4d37ad 100644 --- a/patchwork/packages/__init__.py +++ b/patchwork/packages/__init__.py @@ -1,3 +1,5 @@ +from functools import wraps + from fabric.api import sudo from patchwork.info import distro_family @@ -23,3 +25,21 @@ def rubygem(gem): Install a Rubygem """ return sudo("gem install -b --no-rdoc --no-ri %s" % gem) + + +class requires_packages(object): + """ + A decorator that ensures the listed packages are installed. Example: + + @task + @requires_packages('python-dev', 'redis-server', 'nginx') + def my_task(): ... + """ + def __init__(self, *args): + self.packages = args + + def __call__(self, fn, *args, **kwargs): + def wrapper(): + package(*self.packages) + fn(*args, **kwargs) + return wraps(fn)(wrapper) From 9bf538df4e2e752e4d7b7fa570450f9da43180e4 Mon Sep 17 00:00:00 2001 From: Zain Memon Date: Thu, 28 Jun 2012 14:14:44 -0700 Subject: [PATCH 2/5] Run package installs in a single command, to speed it up. --- patchwork/packages/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patchwork/packages/__init__.py b/patchwork/packages/__init__.py index a4d37ad..9cbba89 100644 --- a/patchwork/packages/__init__.py +++ b/patchwork/packages/__init__.py @@ -16,8 +16,8 @@ def package(*packages): # Run from cache vs updating package lists every time; assume 'yes'. yum = "yum install -y %s" manager = apt if distro_family() == "debian" else yum - for package in packages: - sudo(manager % package) + + sudo(manager % " ".join(packages)) def rubygem(gem): From c5749f3d2bc7bf21960b343559c2bc026209735a Mon Sep 17 00:00:00 2001 From: Zain Memon Date: Thu, 28 Jun 2012 14:33:41 -0700 Subject: [PATCH 3/5] Add additional distro detection using lsb_release --- patchwork/info.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/patchwork/info.py b/patchwork/info.py index 5394f74..d4dd122 100644 --- a/patchwork/info.py +++ b/patchwork/info.py @@ -1,7 +1,8 @@ +from fabric.api import run, settings, hide from fabric.contrib.files import exists -def distro_name(): +def distro_name(runner=run): """ Return simple Linux distribution name identifier, e.g. ``"fedora"``. @@ -23,6 +24,12 @@ def distro_name(): for sentinel in sentinels: if exists('/etc/%s' % sentinel): return name + + with settings(hide('everything'), warn_only=True): + distro = runner('lsb_release --short --id') + if distro.succeeded: + return distro.lower() + return "other" From 11285dc6d5e1599301fde9b787f6680334fbb36c Mon Sep 17 00:00:00 2001 From: Zain Memon Date: Fri, 29 Jun 2012 09:02:07 -0700 Subject: [PATCH 4/5] Add a method to ensure a supervisor service is enabled --- patchwork/supervisor.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 patchwork/supervisor.py diff --git a/patchwork/supervisor.py b/patchwork/supervisor.py new file mode 100644 index 0000000..509c17b --- /dev/null +++ b/patchwork/supervisor.py @@ -0,0 +1,19 @@ +import time + +from fabric.api import sudo +from fabric.contrib.files import upload_template + + +def supervise(conf, destination='/etc/supervisor/conf.d', **kwargs): + """ + Installs a service into supervisor. ``kwargs`` are passed onto the upload_template call. + """ + if 'use_sudo' not in kwargs: + kwargs['use_sudo'] = True + + upload_template(conf, destination, **kwargs) + + sudo("service supervisor stop") + time.sleep(2) + sudo("service supervisor start") + sudo("supervisorctl status") From 3a379100aa824cf347c90985c1bce9e97be41f89 Mon Sep 17 00:00:00 2001 From: Zain Memon Date: Fri, 29 Jun 2012 14:46:08 -0700 Subject: [PATCH 5/5] Add a git module with a clone function --- patchwork/git.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 patchwork/git.py diff --git a/patchwork/git.py b/patchwork/git.py new file mode 100644 index 0000000..90ec545 --- /dev/null +++ b/patchwork/git.py @@ -0,0 +1,10 @@ +from fabric.api import cd, run +from fabric.contrib.files import exists + + +def clone(repo, path, pull_cmd="git pull"): + if not exists(path): + run("git clone %s %s" % (repo, path)) + else: + with cd(path): + run(pull_cmd)