-
Notifications
You must be signed in to change notification settings - Fork 6
/
utils.py
91 lines (68 loc) · 2.13 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import os
import random
import re
import string
import sys
import unicodedata
from fabric.api import env, run, sudo, task
from fabric.colors import red, green, blue
from fabric.utils import abort
from fabric.contrib.files import upload_template, exists
def fyi(msg):
"""Debug info"""
print >>sys.stderr, msg
def btw(msg):
"""Standard info"""
print >>sys.stderr, blue(msg)
def yay(msg):
"""Success"""
print >>sys.stderr, green(msg)
def err(msg):
"""Error"""
print >>sys.stderr, red(msg, bold=True)
def die(msg):
"""Serious error"""
abort(red(msg, bold=True))
def slugify(value):
"""
Normalizes string, converts to lowercase, removes non-alpha characters,
and removes spaces.
"""
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
return re.sub('[-\s]+', '-', value)
def mkdir(directory, use_sudo=False):
"""
Creates a directory if it doesn't exist.
"""
cmd = sudo if use_sudo else run
cmd('mkdir -p ' + directory)
def template(source, destination, use_sudo=False):
"""
Uploads a Jinja template with env as context, and returns True
if the file has changed.
"""
here = os.path.abspath(os.path.dirname(__file__))
template_dir = os.path.join(here, 'templates')
new_file = not exists(destination, use_sudo=use_sudo)
if not new_file:
chars = [random.choice(string.ascii_letters) for i in range(5)]
final_destination = destination
destination = '/tmp/%s' % "".join(chars)
upload_template(source, destination, context=env, backup=False,
use_jinja=True, template_dir=template_dir,
use_sudo=use_sudo)
if new_file:
return True
cmd = sudo if use_sudo else run
out = cmd('diff -u %s %s || true' % (final_destination, destination))
if out:
cmd('mv %s %s' % (destination, final_destination))
return True
assert destination.startswith('/tmp')
cmd('rm %s' % destination)
return False
@task()
def ssh():
"""Opens an SSH session"""
run('bash')