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 |