Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / snfdeploy / utils.py @ 68d6d24b

History | View | Annotate | Download (2.7 kB)

1 68d6d24b Dimitris Aragiorgis
from __future__ import with_statement
2 68d6d24b Dimitris Aragiorgis
from fabric.api import hide, env, settings, local, roles
3 68d6d24b Dimitris Aragiorgis
from fabric.operations import run, put, get
4 68d6d24b Dimitris Aragiorgis
import fabric
5 68d6d24b Dimitris Aragiorgis
import re
6 68d6d24b Dimitris Aragiorgis
import os
7 68d6d24b Dimitris Aragiorgis
import shutil
8 68d6d24b Dimitris Aragiorgis
import tempfile
9 68d6d24b Dimitris Aragiorgis
import ast
10 68d6d24b Dimitris Aragiorgis
from snfdeploy.lib import debug, Conf, Env, disable_color
11 68d6d24b Dimitris Aragiorgis
from snfdeploy import massedit
12 68d6d24b Dimitris Aragiorgis
13 68d6d24b Dimitris Aragiorgis
14 68d6d24b Dimitris Aragiorgis
def abort(action):
15 68d6d24b Dimitris Aragiorgis
    def inner(*args, **kwargs):
16 68d6d24b Dimitris Aragiorgis
        try:
17 68d6d24b Dimitris Aragiorgis
            return action(*args, **kwargs)
18 68d6d24b Dimitris Aragiorgis
        except BaseException as e:
19 68d6d24b Dimitris Aragiorgis
            abort = kwargs.get("abort", True)
20 68d6d24b Dimitris Aragiorgis
            if not abort:
21 68d6d24b Dimitris Aragiorgis
                 debug(env.host, "WARNING: command failed. Continuing anyway...")
22 68d6d24b Dimitris Aragiorgis
            else:
23 68d6d24b Dimitris Aragiorgis
                 fabric.utils.abort(e)
24 68d6d24b Dimitris Aragiorgis
    return inner
25 68d6d24b Dimitris Aragiorgis
26 68d6d24b Dimitris Aragiorgis
27 68d6d24b Dimitris Aragiorgis
@abort
28 68d6d24b Dimitris Aragiorgis
def try_get(remote_path, local_path=None, **kwargs):
29 68d6d24b Dimitris Aragiorgis
    get(remote_path, local_path=local_path, **kwargs)
30 68d6d24b Dimitris Aragiorgis
31 68d6d24b Dimitris Aragiorgis
32 68d6d24b Dimitris Aragiorgis
@abort
33 68d6d24b Dimitris Aragiorgis
def try_put(local_path=None, remote_path=None, **kwargs):
34 68d6d24b Dimitris Aragiorgis
    put(local_path=local_path, remote_path=remote_path, **kwargs)
35 68d6d24b Dimitris Aragiorgis
36 68d6d24b Dimitris Aragiorgis
37 68d6d24b Dimitris Aragiorgis
38 68d6d24b Dimitris Aragiorgis
@abort
39 68d6d24b Dimitris Aragiorgis
def try_run(cmd, **kwargs):
40 68d6d24b Dimitris Aragiorgis
    if env.local:
41 68d6d24b Dimitris Aragiorgis
        return local(cmd, capture=True)
42 68d6d24b Dimitris Aragiorgis
    else:
43 68d6d24b Dimitris Aragiorgis
        return run(cmd)
44 68d6d24b Dimitris Aragiorgis
45 68d6d24b Dimitris Aragiorgis
46 68d6d24b Dimitris Aragiorgis
def install_package(package):
47 68d6d24b Dimitris Aragiorgis
    debug(env.host, " * Installing package %s..." % package)
48 68d6d24b Dimitris Aragiorgis
    apt_get = "export DEBIAN_FRONTEND=noninteractive ;" + \
49 68d6d24b Dimitris Aragiorgis
              "apt-get install -y --force-yes "
50 68d6d24b Dimitris Aragiorgis
51 68d6d24b Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
52 68d6d24b Dimitris Aragiorgis
    env.env.update_packages(host_info.os)
53 68d6d24b Dimitris Aragiorgis
    if ast.literal_eval(env.env.use_local_packages):
54 68d6d24b Dimitris Aragiorgis
        with settings(warn_only=True):
55 68d6d24b Dimitris Aragiorgis
            deb = local("ls %s/%s*%s_*.deb"
56 68d6d24b Dimitris Aragiorgis
                        % (env.env.packages, package, host_info.os),
57 68d6d24b Dimitris Aragiorgis
                        capture=True)
58 68d6d24b Dimitris Aragiorgis
            if deb:
59 68d6d24b Dimitris Aragiorgis
                debug(env.host,
60 68d6d24b Dimitris Aragiorgis
                      " * Package %s found in %s..."
61 68d6d24b Dimitris Aragiorgis
                      % (package, env.env.packages))
62 68d6d24b Dimitris Aragiorgis
                try_put(deb, "/tmp/")
63 68d6d24b Dimitris Aragiorgis
                try_run("dpkg -i /tmp/%s || "
64 68d6d24b Dimitris Aragiorgis
                        % os.path.basename(deb) + apt_get + "-f")
65 68d6d24b Dimitris Aragiorgis
                try_run("rm /tmp/%s" % os.path.basename(deb))
66 68d6d24b Dimitris Aragiorgis
                return
67 68d6d24b Dimitris Aragiorgis
68 68d6d24b Dimitris Aragiorgis
    info = getattr(env.env, package)
69 68d6d24b Dimitris Aragiorgis
    if info in \
70 68d6d24b Dimitris Aragiorgis
            ["squeeze-backports", "squeeze", "stable",
71 68d6d24b Dimitris Aragiorgis
             "testing", "unstable", "wheezy"]:
72 68d6d24b Dimitris Aragiorgis
        apt_get += " -t %s %s " % (info, package)
73 68d6d24b Dimitris Aragiorgis
    elif info:
74 68d6d24b Dimitris Aragiorgis
        apt_get += " %s=%s " % (package, info)
75 68d6d24b Dimitris Aragiorgis
    else:
76 68d6d24b Dimitris Aragiorgis
        apt_get += package
77 68d6d24b Dimitris Aragiorgis
78 68d6d24b Dimitris Aragiorgis
    try_run(apt_get)
79 68d6d24b Dimitris Aragiorgis
80 68d6d24b Dimitris Aragiorgis
    return
81 68d6d24b Dimitris Aragiorgis
82 68d6d24b Dimitris Aragiorgis
83 68d6d24b Dimitris Aragiorgis
def customize_settings_from_tmpl(tmpl, replace):
84 68d6d24b Dimitris Aragiorgis
    debug(env.host, " * Customizing template %s..." % tmpl)
85 68d6d24b Dimitris Aragiorgis
    local = env.env.templates + tmpl
86 68d6d24b Dimitris Aragiorgis
    _, custom = tempfile.mkstemp()
87 68d6d24b Dimitris Aragiorgis
    shutil.copyfile(local, custom)
88 68d6d24b Dimitris Aragiorgis
    for k, v in replace.iteritems():
89 68d6d24b Dimitris Aragiorgis
        regex = "re.sub('%{0}%', '{1}', line)".format(k.upper(), v)
90 68d6d24b Dimitris Aragiorgis
        massedit.edit_files([custom], [regex], dry_run=False)
91 68d6d24b Dimitris Aragiorgis
92 68d6d24b Dimitris Aragiorgis
    return custom
93 68d6d24b Dimitris Aragiorgis