f8c2ebe274febc5d83170ef0b6a6bdf1b10e8f38
[feisty_meow.git] / scripts / site_avenger / revamp_cakelampvm.sh
1 #!/bin/bash
2
3 # fixes the cakelampvm permissions according to the way.
4
5 ##############
6
7 if [[ $EUID != 0 ]]; then
8   echo "This script must be run as root or sudo."
9   exit 1
10 fi
11
12 ##############
13
14 export WORKDIR="$( \cd "$(\dirname "$0")" && \pwd )"  # obtain the script's working directory.
15 export FEISTY_MEOW_APEX="$( \cd "$WORKDIR/../.." && \pwd )"
16
17 export NO_HELLO=right
18 source "$FEISTY_MEOW_APEX/scripts/core/launch_feisty_meow.sh"
19 # load dependencies for our script.
20 source "$FEISTY_MEOW_SCRIPTS/system/common_sysadmin.sh"
21 source "$FEISTY_MEOW_SCRIPTS/security/password_functions.sh"
22
23 ##############
24
25 # new requirement to have the sql root password, since we need to do some sql db configuration.
26
27 echo A
28 load_password /etc/mysql/secret_password mysql_passwd
29 echo B
30 if [ -z "$mysql_passwd" ]; then
31 echo C
32   read_password "Please enter the MySQL root account password:" mysql_passwd
33 echo D
34 echo password was found as: $mysql_passwd
35 #  echo -n "Please enter the MySQL root account password: "
36 #  # turn off echo but remember former setting.
37 #  stty_orig=`stty -g`
38 #  stty -echo
39 #  read mysql_passwd
40 #  # turn echo back on.
41 #  stty $stty_orig
42 fi
43 if [ -z "$mysql_passwd" ]; then
44 echo E
45   echo "This script must have the sql root password to proceed."
46   exit 1
47 else
48 echo F
49   store_password /etc/mysql/secret_password "$mysql_passwd"
50 fi
51
52 ##############
53
54 sep
55
56 echo "Regenerating feisty meow loading dock."
57
58 regenerate
59 test_or_die "regenerating feisty meow configuration"
60 chown -R "$(logname)":"$(logname)" /home/$(logname)/.[a-zA-Z0-9]*
61 test_or_die "fix after reconfigured as sudo"
62
63 ##############
64
65 # set up some crucial users in the mysql db that we seem to have missed previously.
66
67 sep
68
69 echo "Adding users to the mysql database."
70
71 #hmmm: good application for hiding output unless error here.
72 mysql -u root -p"$mysql_passwd" &>/dev/null <<EOF
73   create user if not exists 'root'@'%' IDENTIFIED BY '$mysql_passwd';
74   grant all privileges on *.* TO 'root'@'%' with grant option;
75
76   create user if not exists 'wampcake'@'%' IDENTIFIED BY 'bakecamp';
77   grant all privileges on *.* TO 'wampcake'@'%' with grant option;
78
79   create user if not exists 'lampcake'@'%' IDENTIFIED BY 'bakecamp';
80   grant all privileges on *.* TO 'lampcake'@'%' with grant option;
81 EOF
82 test_or_die "configuring root, wampcake and lampcake users on mysql"
83
84 ##############
85
86 sep
87
88 echo "Making some important permission changes..."
89
90 # fix up the main web storage.
91 chown -R www-data:www-data /var/www 
92 test_or_die "chown www-data"
93 group_perm /var/www 
94 test_or_die "group_perm www-data"
95
96 ##############
97
98 # set up access on some important folders for the developer user.
99 chown -R developer:developer /home/developer /home/developer/.[a-zA-Z0-9]*
100 test_or_die "chown developer home"
101 harsh_perm /home/developer/.ssh
102 test_or_die "harsh_perm setting on developer .ssh"
103 chown -R developer:developer /etc/apache2 /etc/bind 
104 test_or_die "chown apache2 and bind to developer"
105 group_perm /etc/apache2 /etc/bind 
106 test_or_die "group perms on apache2 and bind"
107
108 ##############
109
110 # fix perms for fred user.
111 chown -R fred:fred /home/fred /home/archives/stuffing /home/fred/.[a-zA-Z0-9]*
112 test_or_die "chown fred home"
113 group_perm $HOME/apps
114 test_or_die "group perms on fred's apps"
115 harsh_perm /home/fred/.ssh
116 test_or_die "harsh_perm setting on fred .ssh"
117 chown -R fred:fred /opt/feistymeow.org 
118 test_or_die "chown feisty meow to fred"
119 group_perm /opt/feistymeow.org 
120 test_or_die "group perms on feisty meow"
121 group_perm /home/fred/apps/mapsdemo
122 test_or_die "group perms on mapsdemo app"
123
124 echo "Done with important permission changes."
125
126 ##############
127 #
128 # some slightly tricky bits start here.  we want to massage the vm into the
129 # best possible shape without needing to re-release it.
130 #
131 ##############
132
133 sep
134
135 echo "Updating developer welcome file."
136
137 # only update hello if they've still got the file there.  we don't want to
138 # keep forcing our hellos at people.
139 if [ -f "$HOME/hello.txt" ]; then
140   # copy the most recent hello file into place for the user.
141   \cp -f "$FEISTY_MEOW_APEX/production/sites/cakelampvm.com/hello.txt" "$HOME"
142   test_or_continue "copying hello file for user"
143 fi
144
145 ##############
146
147 # install a better editor app.
148
149 sep
150
151 echo "The script is about to install the bluefish editor and some dependencies.
152 If the app is not already installed, then this process takes about one minute
153 on a slow home DSL internet connection..."
154
155 apt-get install -y bluefish &> "/tmp/install_bluefish-$(logname).log"
156 test_or_continue "installing bluefish editor"
157
158 ##############
159
160 # deploy any site updates here to the VM's cakelampvm.com site.
161 #
162 # we want to upgrade the default apache site to the latest, since the new
163 # version mirrors the one on the internet (but with green checks instead
164 # of red X's) and since we also support https on the new default version.
165 # we can do this again later if needed, by upping the numbers on the apache
166 # site config files.  our original site was 000 and the new version is 001,
167 # which we've done as a prefix on the config for some reason.  makes the
168 # code below easy at least.
169 if [ -L /etc/apache2/sites-enabled/000-default.conf ]; then
170
171   sep
172
173   # the old site is in place still, so let's update that.
174   echo "Updating default web sites to latest version."
175
176   a2enmod ssl
177   test_or_die "enabling SSL for secure websites"
178
179   restart_apache
180   test_or_die "getting SSL loaded in apache"
181
182   a2dissite 000-default
183   test_or_die "disabling old apache site"
184
185   rm -f /etc/apache2/sites-available/000-default.conf 
186   test_or_die "removing old apache site"
187
188   # copy in our new version of the default page.
189 #hmmm: would be nice if this worked without mods for any new version, besides just 001.  see apache env var file below for example implem.
190   \cp -f $FEISTY_MEOW_APEX/production/sites/cakelampvm.com/rolling/default_page.001/* \
191       /etc/apache2/sites-available
192   test_or_die "installing new apache default sites"
193
194   # there should only be ours at this version level and with that prefix.
195   a2ensite 001-*
196   test_or_die "enabling new apache default sites"
197
198   restart_apache
199 fi
200
201 ##############
202
203 # fix up the apache site so that HSTS is disabled.  otherwise we can't view
204 # the https site for cakelampvm.com once the domain name switch has occurred.
205
206 sep
207
208 # we operate only on our own specialized tls conf file.  hopefully no one has messed with it besides revamp.
209 # note the use of the character class :blank: below to match spaces or tabs.
210 search_replace "^[[:blank:]]*Header always set Strict-Transport-Security.*" "# not good for cakelampvm.com -- Header always set Strict-Transport-Security \"max-age=63072000; includeSubdomains;\"" /etc/apache2/conf-library/tls-enabling.conf
211 if [ $? -ne 0 ]; then
212   echo the apache tls-enabling.conf file seems to have already been patched to disable strict transport security. 
213 else
214   restart_apache
215   echo successfully patched the apache tls-enabling.conf file to disable strict transport security. 
216 fi
217
218 ##############
219
220 # fix up bind so that we think of any address with cakelampvm.com on the end
221 # as being on the vm.  this is already true for some specific sites, but we
222 # want the wildcard enabled to ease the use of DNS for windows folks.
223
224 sep
225
226 grep -q "\*[[:blank:]]*IN A[[:blank:]]*10.28.42.20" /etc/bind/cakelampvm.com.conf
227 if [ $? -eq 0 ]; then
228   # already present.
229   echo the bind settings for wildcard domains off of cakelampvm.com seems to already be present. 
230 else
231   echo "
232
233
234 ;;;;;;
235
236 ; our bind magic, a wildcard domain, for all other sites with cakelampvm.com
237 ; in the domain.  this forces any other sites besides the ones above to route
238 ; to the actual vm IP address, which currently is singular and very fixated.
239 *                               IN A            10.28.42.20
240                                 IN HINFO        \"linux vm\" \"ubuntu\"
241
242 ;;;;;;
243
244
245
246 " >> /etc/bind/cakelampvm.com.conf
247   restart_bind
248   echo "successfully added wildcard domains to the cakelampvm.com bind configuration."
249 fi
250
251 ##############
252
253 # fix samba configuration for (ass-headed) default of read-only in user homes.
254 # why cripple a necessary feature by default?
255
256 sep
257
258 pattern="[#;][[:blank:]]*read only = yes"
259 replacement="read only = no"
260
261 # we just always do the replacement now, after realizing the sentinel pattern
262 # was acutally already in the file...  too much subtlety can get one into trouble.
263 sed -i "0,/$pattern/{s/$pattern/$replacement/}" /etc/samba/smb.conf
264 test_or_die "patching samba configuration to enable write acccess on user home dirs"
265 # sweet, looks like that worked...
266 restart_samba
267 echo successfully patched the samba configuration to enable writes on user home directories. 
268
269 ##############
270
271 # add the latest version of the cakelampvm environment variables for apache.
272
273 sep
274
275 # drop existing file, if already configured.  ignore errors.
276 a2disconf env_vars_cakelampvm &>/dev/null
277
278 # plug in the new version, just stomping anything there.
279 # note: we only expect to have one version of the env_vars dir at a time in place in feisty...
280 \cp -f $FEISTY_MEOW_APEX/production/sites/cakelampvm.com/rolling/env_vars.*/env_vars_cakelampvm.conf /etc/apache2/conf-available
281 test_or_die "copying environment variables file into place"
282
283 # enable the new version of the config file.
284 a2enconf env_vars_cakelampvm
285 test_or_die "enabling the new cakelampvm environment config for apache"
286
287 echo Successfully configured the apache2 environment variables needed for cakelampvm.
288
289 ##############
290
291 # add in a swap mount if not already configured.
292
293 sep
294
295 echo "Checking existing swap partition configuration.
296 "
297
298 # check for existing swap.
299 free | grep -q "Swap:[[:blank:]]*[1-9][0-9]"
300 if [ $? -ne 0 ]; then
301   # no swap in current session, so add it.
302   echo "Enabling ramdisk swap partition...
303 "
304   add_swap_mount
305   echo "
306 Enabled ramdisk swap partition for current boot session."
307 fi
308
309 # the above just gives this session a swap partition, but we want to have
310 # the vm boot with one also.
311
312 # check if there is already swap mentioned in the root crontab.  we will get root's
313 # crontab below since this script has to run as sudo.
314 crontab -l | grep -iq add_swap_mount
315 if [ $? -ne 0 ]; then
316   # no existing swap setup in crontab, so add it.
317   echo "
318 Adding a boot-time ramdisk swap partition...
319 "
320   # need to do it carefully, since sed won't add lines to a null file.  we thus
321   # create a temporary file to do our work in and ignore sed as a tool for this.
322   tmpfile="$(mktemp junk.XXXXXX)"
323   crontab -l 2>/dev/null >"$tmpfile"
324   echo "
325 # need to explicitly set any variables we will use.
326 FEISTY_MEOW_APEX=${FEISTY_MEOW_APEX}
327 # add swap space to increase memory available.
328 @reboot bash $FEISTY_MEOW_APEX/scripts/system/add_swap_mount.sh
329 " >>"$tmpfile"
330   # now install our new version of the crontab.
331   crontab "$tmpfile"
332   rm "$tmpfile"
333
334   echo "
335 Added boot-time ramdisk swap partition to crontab for root."
336 fi
337
338 ##############
339
340 sep
341
342 # next bit can go here.
343
344 ##############
345 ##############
346
347 # sequel--tell them they're great and show the hello again also.
348
349 sep
350
351 regenerate
352 test_or_die "regenerating feisty meow scripts"
353 chown -R "$(logname)":"$(logname)" /home/$(logname)/.[a-zA-Z0-9]*
354 test_or_die "fix after regenerate as sudo"
355 echo "
356
357
358 Thanks for revamping your cakelampvm.  :-)
359
360 You may want to update your current shell's feisty meow environment by typing:
361   regenerate
362 "
363
364 ##############
365
366