1
1
from __future__ import with_statement
2
2
from fabric .api import *
3
- from fabric .colors import green
3
+ from fabric .colors import green , red
4
4
from fabric .contrib .console import confirm
5
5
from fabric .contrib .files import exists
6
+ from fabric .operations import reboot
6
7
from package_lists import *
7
8
import os
8
9
@@ -20,6 +21,7 @@ def deploy():
20
21
install_config_files ()
21
22
allow_uwsgi_to_control_supervisor ()
22
23
set_zsh_as_default_shell ()
24
+ reboot ()
23
25
24
26
def set_hostname ():
25
27
prompt ('Enter hostname: ' , 'hostname' , default = 'rascal2' )
@@ -34,13 +36,22 @@ def install_python_modules():
34
36
print (green ('\n Installing Python module: {0}' .format (module )))
35
37
run ('pip install ' + module )
36
38
39
+ def package_installed (package ):
40
+ cmd = 'dpkg-query -l "{0}" | grep -q ^.i' .format (package )
41
+ with settings (warn_only = True ):
42
+ result = run (cmd )
43
+ return result .succeeded
44
+
37
45
def install_debian_packages ():
38
46
print (green ('\n Updating package repository lists' ))
39
47
run ('apt-get update -y' , pty = False )
40
48
41
49
for package in DEBIAN_PACKAGES_TO_INSTALL :
42
- print (green ('\n Installing package: {0}' .format (package )))
43
- run ('apt-get install -y ' + package , pty = False )
50
+ if not package_installed (package ):
51
+ print (green ('\n Installing package: {0}' .format (package )))
52
+ run ('apt-get install -y ' + package , pty = False )
53
+ else :
54
+ print (green ('Package ' + package + ' already installed' ))
44
55
45
56
print (green ('\n Removing unneeded package remnants' ))
46
57
run ('apt-get autoremove -y' , pty = False )
@@ -52,8 +63,11 @@ def disable_bonescript():
52
63
53
64
def remove_unneeded_debian_packages ():
54
65
for package in DEBIAN_PACKAGES_TO_REMOVE :
55
- print (green ('\n Removing package: {0}' .format (package )))
56
- run ('apt-get remove -y ' + package , pty = False )
66
+ if package_installed (package ):
67
+ print (green ('\n Removing package: {0}' .format (package )))
68
+ run ('apt-get remove -y ' + package , pty = False )
69
+ else :
70
+ print (green ('Package ' + package + ' already removed.' ))
57
71
58
72
def install_rascal_software ():
59
73
print (green ('Installing Rascal editor . . .' ))
@@ -87,6 +101,7 @@ def install_config_files():
87
101
put ('uwsgi.service' , '/etc/systemd/system/uwsgi.service' )
88
102
run ('systemctl enable uwsgi.service' )
89
103
put ('vimrc' , '/root/.vimrc' )
104
+ put ('gitconfig' , '/root/.gitconfig' )
90
105
91
106
def allow_uwsgi_to_control_supervisor ():
92
107
run ('echo "chmod=0770 ; socket file mode (default 0700)" >> /etc/supervisor/supervisor.conf' )
@@ -99,3 +114,56 @@ def set_zsh_as_default_shell():
99
114
# Enter the new value, or press ENTER for the default
100
115
# Login Shell [/bin/bash]: /bin/zsh
101
116
# curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
117
+
118
+ ### END DEPLOY SECTION ###
119
+
120
+ ### START TEST SECTION ###
121
+
122
+ @task
123
+ def test ():
124
+ check_debian_packages ()
125
+ check_programs ()
126
+ check_python_modules ()
127
+
128
+ PROGRAMS_TO_TEST = {
129
+ 'nginx' : '/usr/sbin/nginx' ,
130
+ 'uwsgi' : '/usr/local/bin/uwsgi' ,
131
+ 'zsh' : '/usr/bin/zsh' ,
132
+ }
133
+
134
+ PYTHON_MODULES_TO_TEST_IMPORT = [
135
+ 'gevent' ,
136
+ 'geventwebsocket' ,
137
+ 'flask.ext.uwsgi_websocket' ,
138
+ 'redis' ,
139
+ # uwsgi omitted; not a Python module, though installed with pip
140
+ 'pytronics' ,
141
+ 'bitstring' ,
142
+ 'webcolors' ,
143
+ 'flask_login'
144
+ ]
145
+
146
+ def check_debian_packages ():
147
+ for package in sorted (DEBIAN_PACKAGES_TO_INSTALL ):
148
+ if package_installed (package ):
149
+ print (green ('Package {0} found.' .format (package )))
150
+ else :
151
+ print (red ('Package {0} missing!' .format (package )))
152
+
153
+ def check_programs ():
154
+ for program in sorted (PROGRAMS_TO_TEST .keys ()):
155
+ try :
156
+ run ('which ' + program ) == PROGRAMS_TO_TEST [program ]
157
+ except :
158
+ print (red ('Binary for {0} not at {1}.' .format (program , PROGRAMS_TO_TEST [program ])))
159
+ else :
160
+ print (green ('Binary for {0} found at {1}' .format (program , PROGRAMS_TO_TEST [program ])))
161
+
162
+ def check_python_modules ():
163
+ for module in PYTHON_MODULES_TO_TEST_IMPORT :
164
+ try :
165
+ run ('python -c "__import__(\' ' + module + '\' )"' )
166
+ except :
167
+ print (red ('Module {0} not installed.' .format (module )))
168
+ else :
169
+ print (green ('Successfully imported module {0}.' .format (module )))
0 commit comments