Browse Source

Stockholm initial

Bob Mottram 8 years ago
parent
commit
0df3a86365
55 changed files with 12591 additions and 10997 deletions
  1. 24
    10758
      src/freedombone
  2. 54
    0
      src/freedombone-app-babel
  3. 66
    0
      src/freedombone-app-batman
  4. 343
    0
      src/freedombone-app-blog
  5. 447
    0
      src/freedombone-app-cjdns
  6. 125
    0
      src/freedombone-app-dlna
  7. 113
    0
      src/freedombone-app-editor
  8. 1501
    0
      src/freedombone-app-email
  9. 660
    0
      src/freedombone-app-gnusocial
  10. 410
    0
      src/freedombone-app-gogs
  11. 388
    0
      src/freedombone-app-hubzilla
  12. 88
    0
      src/freedombone-app-intrusion
  13. 167
    0
      src/freedombone-app-ipfs
  14. 239
    0
      src/freedombone-app-irc
  15. 370
    0
      src/freedombone-app-mediagoblin
  16. 159
    0
      src/freedombone-app-mumble
  17. 422
    0
      src/freedombone-app-rss
  18. 248
    0
      src/freedombone-app-search
  19. 318
    0
      src/freedombone-app-sip
  20. 85
    0
      src/freedombone-app-syncthing
  21. 172
    0
      src/freedombone-app-tox
  22. 47
    0
      src/freedombone-app-vpn
  23. 184
    0
      src/freedombone-app-webmail
  24. 413
    0
      src/freedombone-app-wiki
  25. 346
    0
      src/freedombone-app-xmpp
  26. 384
    0
      src/freedombone-app-zeronet
  27. 85
    0
      src/freedombone-utils-avahi
  28. 99
    0
      src/freedombone-utils-backup
  29. 606
    0
      src/freedombone-utils-config
  30. 76
    0
      src/freedombone-utils-cron
  31. 247
    221
      src/freedombone-utils-database
  32. 39
    0
      src/freedombone-utils-depends
  33. 241
    0
      src/freedombone-utils-dns
  34. 80
    0
      src/freedombone-utils-final
  35. 521
    0
      src/freedombone-utils-firewall
  36. 1
    18
      src/freedombone-utils-git
  37. 148
    0
      src/freedombone-utils-go
  38. 81
    0
      src/freedombone-utils-help
  39. 109
    0
      src/freedombone-utils-interactive
  40. 54
    0
      src/freedombone-utils-international
  41. 86
    0
      src/freedombone-utils-login
  42. 66
    0
      src/freedombone-utils-monkeysphere
  43. 90
    0
      src/freedombone-utils-network
  44. 349
    0
      src/freedombone-utils-onion
  45. 54
    0
      src/freedombone-utils-passwords
  46. 149
    0
      src/freedombone-utils-repos
  47. 167
    0
      src/freedombone-utils-rng
  48. 368
    0
      src/freedombone-utils-setup
  49. 142
    0
      src/freedombone-utils-ssh
  50. 129
    0
      src/freedombone-utils-time
  51. 50
    0
      src/freedombone-utils-upgrade
  52. 51
    0
      src/freedombone-utils-watchdog
  53. 551
    0
      src/freedombone-utils-web
  54. 133
    0
      src/freedombone-utils-wifi
  55. 46
    0
      src/freedombone-utils-zram

+ 24
- 10758
src/freedombone
File diff suppressed because it is too large
View File


+ 54
- 0
src/freedombone-app-babel View File

@@ -0,0 +1,54 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Babel mesh functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# Babel mesh
32
+ENABLE_BABEL="no"
33
+BABEL_PORT=6696
34
+
35
+function mesh_babel {
36
+	if grep -Fxq "mesh_babel" $COMPLETION_FILE; then
37
+		return
38
+	fi
39
+	if [[ $ENABLE_BABEL != "yes" ]]; then
40
+		return
41
+	fi
42
+
43
+	${PROJECT_NAME}-mesh-install -f babel
44
+	if [ ! "$?" = "0" ]; then
45
+		echo $'Failed to install babel'
46
+		exit 67242
47
+	fi
48
+
49
+	function_check configure_firewall_for_babel
50
+	configure_firewall_for_babel
51
+	echo 'mesh_babel' >> $COMPLETION_FILE
52
+}
53
+
54
+# NOTE: deliberately there is no "exit 0"

+ 66
- 0
src/freedombone-app-batman View File

@@ -0,0 +1,66 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# batman adv mesh functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# B.A.T.M.A.N settings
32
+ENABLE_BATMAN="no"
33
+BATMAN_CELLID='any'
34
+
35
+function mesh_batman {
36
+	if grep -Fxq "mesh_batman" $COMPLETION_FILE; then
37
+		return
38
+	fi
39
+	if [[ $ENABLE_BATMAN != "yes" ]]; then
40
+		return
41
+	fi
42
+
43
+	${PROJECT_NAME}-mesh-install -f batman
44
+	if [ ! "$?" = "0" ]; then
45
+		echo $'Failed to install batman'
46
+		exit 72524
47
+	fi
48
+
49
+	if ! grep -q "Mesh Networking (B.A.T.M.A.N)" /home/$MY_USERNAME/README; then
50
+		echo '' >> /home/$MY_USERNAME/README
51
+		echo '' >> /home/$MY_USERNAME/README
52
+		echo 'Mesh Networking (B.A.T.M.A.N)' >> /home/$MY_USERNAME/README
53
+		echo '=============================' >> /home/$MY_USERNAME/README
54
+		echo "Mesh ESSID: $WIFI_SSID" >> /home/$MY_USERNAME/README
55
+		echo "Mesh cell ID: $BATMAN_CELLID" >> /home/$MY_USERNAME/README
56
+		echo "Mesh wifi channel: $WIFI_CHANNEL" >> /home/$MY_USERNAME/README
57
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
58
+		chmod 600 /home/$MY_USERNAME/README
59
+	fi
60
+
61
+	function_check configure_firewall_for_batman
62
+	configure_firewall_for_batman
63
+	echo 'mesh_batman' >> $COMPLETION_FILE
64
+}
65
+
66
+# NOTE: deliberately no exit 0

+ 343
- 0
src/freedombone-app-blog View File

@@ -0,0 +1,343 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Blog functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+FULLBLOG_DOMAIN_NAME=
32
+FULLBLOG_CODE=
33
+FULLBLOG_ONION_PORT=8086
34
+FULLBLOG_REPO="https://github.com/danpros/htmly"
35
+FULLBLOG_COMMIT='bf5fe9486160be4da86d8987d3e5c977e1dc6d32'
36
+MY_BLOG_TITLE="My Blog"
37
+MY_BLOG_SUBTITLE="Another ${PROJECT_NAME} Blog"
38
+
39
+function mark_blog_domain {
40
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
41
+		return
42
+	fi
43
+	if ! grep -q "Blog domain:" $COMPLETION_FILE; then
44
+		echo "Blog domain:$FULLBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
45
+	fi
46
+}
47
+
48
+function get_blog_admin_password {
49
+	if [ -f /home/$MY_USERNAME/README ]; then
50
+		if grep -q "Your blog password is" /home/$MY_USERNAME/README; then
51
+			FULLBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Your blog password is" | awk -F ':' '{print $2}' | sed 's/^ *//')
52
+		fi
53
+	fi
54
+}
55
+
56
+function install_blog {
57
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
58
+		return
59
+	fi
60
+	if [ ! $FULLBLOG_DOMAIN_NAME ]; then
61
+		echo $'The blog domain name was not specified'
62
+		exit 5062
63
+	fi
64
+
65
+	# update to the next commit
66
+	function_check set_repo_commit
67
+	set_repo_commit /var/www/$FULLBLOG_DOMAIN_NAME/htdocs "Blog commit" "$FULLBLOG_COMMIT" $FULLBLOG_REPO
68
+
69
+	if grep -Fxq "install_blog" $COMPLETION_FILE; then
70
+		return
71
+	fi
72
+
73
+	# for the avatar changing command
74
+	apt-get -y install imagemagick
75
+
76
+	if [ ! -d /var/www/$FULLBLOG_DOMAIN_NAME ]; then
77
+		mkdir /var/www/$FULLBLOG_DOMAIN_NAME
78
+	fi
79
+
80
+	cd /var/www/$FULLBLOG_DOMAIN_NAME
81
+	git_clone $FULLBLOG_REPO htdocs
82
+	cd htdocs
83
+	git checkout $FULLBLOG_COMMIT -b $FULLBLOG_COMMIT
84
+	if ! grep -q "Blog commit" $COMPLETION_FILE; then
85
+		echo "Blog commit:$FULLBLOG_COMMIT" >> $COMPLETION_FILE
86
+	else
87
+		sed -i "s/Blog commit.*/Blog commit:$FULLBLOG_COMMIT/g" $COMPLETION_FILE
88
+	fi
89
+	cd /var/www/$FULLBLOG_DOMAIN_NAME
90
+
91
+	chown -R www-data:www-data /var/www/$FULLBLOG_DOMAIN_NAME/htdocs
92
+
93
+	if [[ $ONION_ONLY == "no" ]]; then
94
+	    function_check nginx_http_redirect
95
+		nginx_http_redirect $FULLBLOG_DOMAIN_NAME
96
+		echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
97
+		echo '    listen 443 ssl;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
98
+		echo "    root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
99
+		echo "    server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
100
+		echo '    access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
101
+		echo "    error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
102
+		echo '    index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
103
+		echo '    charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
104
+		echo '    proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
105
+		function_check nginx_limits
106
+		nginx_limits $FULLBLOG_DOMAIN_NAME
107
+		function_check nginx_ssl
108
+		nginx_ssl $FULLBLOG_DOMAIN_NAME
109
+		function_check nginx_disable_sniffing
110
+		nginx_disable_sniffing $FULLBLOG_DOMAIN_NAME
111
+		echo '    add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
112
+		echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
113
+		echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
114
+		echo '    location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
115
+		echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
116
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
117
+		echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
118
+		echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
119
+		echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
120
+		echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
121
+		echo '        allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
122
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
123
+		echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
124
+		echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
125
+		echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
126
+		echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
127
+		echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
128
+		echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
129
+		echo '        expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
130
+		echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
131
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
132
+		echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
133
+		echo '    # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
134
+		echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
135
+		echo '        deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
136
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
137
+		echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
138
+		echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
139
+		echo '    # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
140
+		echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
141
+		echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
142
+		echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
143
+		echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
144
+		echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
145
+		echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
146
+		echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
147
+		echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
148
+		echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
149
+		echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
150
+		echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
151
+		echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
152
+		echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
153
+		echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
154
+		echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
155
+		echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
156
+		echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
157
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
158
+		echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
159
+		echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
160
+		echo '    location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
161
+		echo '        deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
162
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
163
+		echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
164
+		echo '    #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
165
+		echo '    location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
166
+		echo '        deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
167
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
168
+		echo '    location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
169
+		echo '      deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
170
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
171
+		echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
172
+		echo '      deny  all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
173
+		echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
174
+		echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
175
+		echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
176
+	else
177
+		echo -n '' > /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
178
+	fi
179
+	echo 'server {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
180
+	echo "    listen 127.0.0.1:${FULLBLOG_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
181
+	echo "    root /var/www/$FULLBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
182
+	echo "    server_name $FULLBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
183
+	echo '    access_log off;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
184
+	echo "    error_log /var/log/nginx/${FULLBLOG_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
185
+	echo '    index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
186
+	echo '    charset utf-8;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
187
+	echo '    proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
188
+	function_check nginx_limits
189
+	nginx_limits $FULLBLOG_DOMAIN_NAME
190
+	function_check nginx_disable_sniffing
191
+	nginx_disable_sniffing $FULLBLOG_DOMAIN_NAME
192
+	echo '    add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
193
+	echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
194
+	echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
195
+	echo '    location / {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
196
+	echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
197
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
198
+	echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
199
+	echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
200
+	echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
201
+	echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
202
+	echo '        allow all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
203
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
204
+	echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
205
+	echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
206
+	echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
207
+	echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
208
+	echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
209
+	echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
210
+	echo '        expires 30d;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
211
+	echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
212
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
213
+	echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
214
+	echo '    # block these file types' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
215
+	echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
216
+	echo '        deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
217
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
218
+	echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
219
+	echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
220
+	echo '    # or a unix socket' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
221
+	echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
222
+	echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
223
+	echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
224
+	echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
225
+	echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
226
+	echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
227
+	echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
228
+	echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
229
+	echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
230
+	echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
231
+	echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
232
+	echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
233
+	echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
234
+	echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
235
+	echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
236
+	echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
237
+	echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
238
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
239
+	echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
240
+	echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
241
+	echo '    location ~ /\. {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
242
+	echo '        deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
243
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
244
+	echo '' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
245
+	echo '    #deny access to store' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
246
+	echo '    location ~ /store {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
247
+	echo '        deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
248
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
249
+	echo '    location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
250
+	echo '      deny all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
251
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
252
+	echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
253
+	echo '      deny  all;' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
254
+	echo '    }' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
255
+	echo '}' >> /etc/nginx/sites-available/$FULLBLOG_DOMAIN_NAME
256
+
257
+    function_check create_site_certificate
258
+	create_site_certificate $FULLBLOG_DOMAIN_NAME 'yes'
259
+
260
+    function_check configure_php
261
+	configure_php
262
+
263
+	# blog settings
264
+	cp /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini.example /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
265
+	sed -i "s|site.url.*|site.url = '/'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
266
+	sed -i "s|blog.title.*|blog.title = '$MY_BLOG_TITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
267
+	sed -i "s|blog.tagline.*|blog.tagline = '$MY_BLOG_SUBTITLE'|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
268
+	sed -i 's|timezone.*|timezone = "Europe/London"|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
269
+	sed -i "s|Your name|$MY_NAME|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
270
+
271
+	# set social networks
272
+	if grep -q "social.hubzilla" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini; then
273
+		sed -i "s|;social.hubzilla|social.hubzilla|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
274
+		sed -i "s|social.hubzilla.*|social.hubzilla = \"$HUBZILLA_DOMAIN_NAME\"|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
275
+	fi
276
+	if grep -q "social.gnusocial" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini; then
277
+		sed -i "s|;social.gnusocial|social.gnusocial|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
278
+		sed -i "s|social.gnusocial.*|social.gnusocial = \"$MICROBLOG_DOMAIN_NAME\"|g" /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
279
+	fi
280
+
281
+	# clear proprietary social network strings
282
+	sed -i 's|social.facebook.*|social.facebook = ""|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
283
+	sed -i 's|social.twitter.*|social.twitter = ""|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
284
+	sed -i 's|social.google.*|social.google = ""|g' /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/config.ini
285
+
286
+	# create a user password
287
+	function_check get_blog_admin_password
288
+	get_blog_admin_password
289
+	if [ ! $FULLBLOG_ADMIN_PASSWORD ]; then
290
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
291
+			FULLBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
292
+		else
293
+			FULLBLOG_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
294
+		fi
295
+		echo '' >> /home/$MY_USERNAME/README
296
+		echo '' >> /home/$MY_USERNAME/README
297
+		echo $'HTMLy Blog' >> /home/$MY_USERNAME/README
298
+		echo '==========' >> /home/$MY_USERNAME/README
299
+		echo $"Your blog username: $MY_USERNAME" >> /home/$MY_USERNAME/README
300
+		echo $"Your blog password is: $FULLBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
301
+		if [[ $ONION_ONLY == 'no' ]]; then
302
+			echo $"Log into your blog at https://$FULLBLOG_DOMAIN_NAME/login" >> /home/$MY_USERNAME/README
303
+		fi
304
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
305
+		chmod 600 /home/$MY_USERNAME/README
306
+	fi
307
+
308
+	# create a user
309
+	FULLBLOG_ADMIN_PASSWORD_HASH=$(freedombone-sec --bloghash "$FULLBLOG_ADMIN_PASSWORD")
310
+	if [ ${#FULLBLOG_ADMIN_PASSWORD_HASH} -lt 8 ]; then
311
+		echo $'Blog admin password could not be hashed'
312
+		exit 625728
313
+	fi
314
+	echo ';Password' > /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
315
+	echo "password = $FULLBLOG_ADMIN_PASSWORD_HASH" >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
316
+	echo 'encryption = password_hash' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
317
+	echo ';Role' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
318
+	echo 'role = admin' >> /var/www/$FULLBLOG_DOMAIN_NAME/htdocs/config/users/$MY_USERNAME.ini
319
+
320
+    function_check nginx_ensite
321
+	nginx_ensite $FULLBLOG_DOMAIN_NAME
322
+
323
+	FULLBLOG_ONION_HOSTNAME=$(add_onion_service blog 80 ${FULLBLOG_ONION_PORT})
324
+
325
+	systemctl restart php5-fpm
326
+	systemctl restart nginx
327
+
328
+	if ! grep -q "Blog onion domain" /home/$MY_USERNAME/README; then
329
+		echo $"Blog onion domain: ${FULLBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
330
+		echo $"Log into your blog at https://${FULLBLOG_ONION_HOSTNAME}/login" >> /home/$MY_USERNAME/README
331
+		echo '' >> /home/$MY_USERNAME/README
332
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
333
+		chmod 600 /home/$MY_USERNAME/README
334
+	fi
335
+	echo "Blog onion domain:${FULLBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
336
+
337
+    function_check add_ddns_domain
338
+	add_ddns_domain $FULLBLOG_DOMAIN_NAME
339
+
340
+	echo 'install_blog' >> $COMPLETION_FILE
341
+}
342
+
343
+# NOTE: deliberately no exit 0

+ 447
- 0
src/freedombone-app-cjdns View File

@@ -0,0 +1,447 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# cjdns functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# cjdns settings
32
+ENABLE_CJDNS="no"
33
+CJDNS_PRIVATE_KEY=
34
+CJDNS_PUBLIC_KEY=
35
+CJDNS_IPV6=
36
+CJDNS_PASSWORD=
37
+CJDNS_PORT=
38
+CJDNS_REPO="https://github.com/cjdelisle/cjdns.git"
39
+CJDNS_COMMIT='13189fde111d0500427a7a0ce06a970753527bca'
40
+CJDCMD_REPO="https://github.com/inhies/cjdcmd"
41
+CJDCMD_COMMIT='973cca6ed0eecf9041c3403a40193c0b1291b808'
42
+
43
+function get_cjdns_public_key {
44
+	if [ -f /home/$MY_USERNAME/README ]; then
45
+		if grep -q "cjdns public key" /home/$MY_USERNAME/README; then
46
+			if [ ! $CJDNS_PUBLIC_KEY ]; then
47
+				CJDNS_PUBLIC_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns public key" | awk -F ':' '{print $2}' | sed 's/^ *//')
48
+			fi
49
+		fi
50
+	fi
51
+}
52
+
53
+function get_cjdns_private_key {
54
+	if [ -f /home/$MY_USERNAME/README ]; then
55
+		if grep -q "cjdns private key" /home/$MY_USERNAME/README; then
56
+			if [ ! $CJDNS_PRIVATE_KEY ]; then
57
+				CJDNS_PRIVATE_KEY=$(cat /home/$MY_USERNAME/README | grep "cjdns private key" | awk -F ':' '{print $2}' | sed 's/^ *//')
58
+			fi
59
+		fi
60
+	fi
61
+}
62
+
63
+function get_cjdns_ipv6_address {
64
+	if [ -f /home/$MY_USERNAME/README ]; then
65
+		if grep -q "cjdns IPv6 address" /home/$MY_USERNAME/README; then
66
+			if [ ! $CJDNS_IPV6 ]; then
67
+				CJDNS_IPV6=$(cat /home/$MY_USERNAME/README | grep "cjdns IPv6 address" | awk -F ':' '{print $2}' | sed 's/^ *//')
68
+			fi
69
+		fi
70
+	fi
71
+}
72
+
73
+function get_cjdns_port {
74
+	if [ -f /home/$MY_USERNAME/README ]; then
75
+		if grep -q "cjdns port" /home/$MY_USERNAME/README; then
76
+			if [ ! $CJDNS_PORT ]; then
77
+				CJDNS_PORT=$(cat /home/$MY_USERNAME/README | grep "cjdns port" | awk -F ':' '{print $2}' | sed 's/^ *//')
78
+			fi
79
+		fi
80
+	fi
81
+}
82
+
83
+function get_cjdns_password {
84
+	if [ -f /home/$MY_USERNAME/README ]; then
85
+		if grep -q "cjdns password" /home/$MY_USERNAME/README; then
86
+			if [ ! $CJDNS_PASSWORD ]; then
87
+				CJDNS_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "cjdns password" | awk -F ':' '{print $2}' | sed 's/^ *//')
88
+			fi
89
+		fi
90
+	fi
91
+}
92
+
93
+function mesh_cjdns {
94
+	if [[ $ENABLE_CJDNS != "yes" ]]; then
95
+		return
96
+	fi
97
+
98
+	# update to the next commit
99
+	function_check set_repo_commit
100
+	set_repo_commit /etc/cjdns "cjdns commit" "$CJDNS_COMMIT" $CJDNS_REPO
101
+
102
+	if grep -Fxq "mesh_cjdns" $COMPLETION_FILE; then
103
+		return
104
+	fi
105
+
106
+	apt-get -y install nodejs git build-essential nmap
107
+
108
+	# if a README exists then obtain the cjdns parameters
109
+	function_check get_cjdns_ipv6_address
110
+	get_cjdns_ipv6_address
111
+
112
+	function_check get_cjdns_public_key
113
+	get_cjdns_public_key
114
+
115
+	function_check get_cjdns_private_key
116
+	get_cjdns_private_key
117
+
118
+	function_check get_cjdns_port
119
+	get_cjdns_port
120
+
121
+	function_check get_cjdns_password
122
+	get_cjdns_password
123
+
124
+	# special compile settings for running ./do on the Beaglebone Black
125
+	if [[ $INSTALLING_ON_BBB == "yes" ]]; then
126
+		CFLAGS="-O2 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -ftree-vectorize -ffast-math -mfloat-abi=hard -marm -Wno-error=maybe-uninitialized"
127
+		export LDFLAGS="$CFLAGS"
128
+	fi
129
+
130
+	if [ ! -d /etc/cjdns ]; then
131
+		function_check git_pull
132
+		git_clone $CJDNS_REPO /etc/cjdns
133
+		cd /etc/cjdns
134
+
135
+		git checkout $CJDNS_COMMIT -b $CJDNS_COMMIT
136
+		if ! grep -q "cjdns commit" $COMPLETION_FILE; then
137
+			echo "cjdns commit:$CJDNS_COMMIT" >> $COMPLETION_FILE
138
+		else
139
+			sed -i "s/cjdns commit.*/cjdns commit:$CJDNS_COMMIT/g" $COMPLETION_FILE
140
+		fi
141
+
142
+		./do
143
+		if [ ! "$?" = "0" ]; then
144
+			exit 7439
145
+		fi
146
+		# create a configuration
147
+		if [ ! -f /etc/cjdns/cjdroute.conf ]; then
148
+			./cjdroute --genconf > /etc/cjdns/cjdroute.conf
149
+			if [ ! "$?" = "0" ]; then
150
+				exit 5922
151
+			fi
152
+		fi
153
+		# create a user to run as
154
+		useradd cjdns
155
+	else
156
+		cd /etc/cjdns
157
+		function_check git_pull
158
+		git_pull $CJDNS_REPO
159
+		./do
160
+		if [ ! "$?" = "0" ]; then
161
+			exit 9926
162
+		fi
163
+	fi
164
+
165
+	# set permissions
166
+	chown -R cjdns:cjdns /etc/cjdns
167
+	chmod 600 /etc/cjdns/cjdroute.conf
168
+
169
+	/sbin/ip tuntap add mode tun user cjdns dev cjdroute0
170
+
171
+	# insert values into the configuration file
172
+	if [ $CJDNS_PRIVATE_KEY ]; then
173
+		sed -i "s/\"privateKey\":.*/\"privateKey\": \"$CJDNS_PRIVATE_KEY\",/g" /etc/cjdns/cjdroute.conf
174
+	else
175
+		CJDNS_PRIVATE_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"privateKey"' | awk -F '"' '{print $4}' | sed -n 1p)
176
+	fi
177
+	if [ $CJDNS_PUBLIC_KEY ]; then
178
+		sed -i "s/\"publicKey\":.*/\"publicKey\": \"$CJDNS_PUBLIC_KEY\",/g" /etc/cjdns/cjdroute.conf
179
+	else
180
+		CJDNS_PUBLIC_KEY=$(cat /etc/cjdns/cjdroute.conf | grep '"publicKey"' | awk -F '"' '{print $4}' | sed -n 1p)
181
+	fi
182
+	if [ $CJDNS_IPV6 ]; then
183
+		sed -i "s/\"ipv6\":.*/\"ipv6\": \"$CJDNS_IPV6\",/g" /etc/cjdns/cjdroute.conf
184
+	else
185
+		CJDNS_IPV6=$(cat /etc/cjdns/cjdroute.conf | grep '"ipv6"' | awk -F '"' '{print $4}' | sed -n 1p)
186
+	fi
187
+	if [ $CJDNS_PASSWORD ]; then
188
+		sed -i "0,/{\"password\":.*/s//{\"password\": \"$CJDNS_PASSWORD\"}/g" /etc/cjdns/cjdroute.conf
189
+	else
190
+		CJDNS_PASSWORD=$(cat /etc/cjdns/cjdroute.conf | grep '"password"' | awk -F '"' '{print $4}' | sed -n 1p)
191
+	fi
192
+	if [ $CJDNS_PORT ]; then
193
+		sed -i "s/\"bind\": \"0.0.0.0:.*/\"bind\": \"0.0.0.0:$CJDNS_PORT\",/g" /etc/cjdns/cjdroute.conf
194
+	else
195
+		CJDNS_PORT=$(cat /etc/cjdns/cjdroute.conf | grep '"bind": "0.0.0.0:' | awk -F '"' '{print $4}' | awk -F ':' '{print $2}' | sed -n 1p)
196
+	fi
197
+
198
+	function_check enable_ipv6
199
+	enable_ipv6
200
+
201
+	echo '#!/bin/sh -e' > /etc/init.d/cjdns
202
+	echo '### BEGIN INIT INFO' >> /etc/init.d/cjdns
203
+	echo '# hyperboria.sh - An init script (/etc/init.d/) for cjdns' >> /etc/init.d/cjdns
204
+	echo '# Provides:          cjdroute' >> /etc/init.d/cjdns
205
+	echo '# Required-Start:    $remote_fs $network' >> /etc/init.d/cjdns
206
+	echo '# Required-Stop:     $remote_fs $network' >> /etc/init.d/cjdns
207
+	echo '# Default-Start:     2 3 4 5' >> /etc/init.d/cjdns
208
+	echo '# Default-Stop:      0 1 6' >> /etc/init.d/cjdns
209
+	echo '# Short-Description: Cjdns router' >> /etc/init.d/cjdns
210
+	echo '# Description:       A routing engine designed for security, scalability, speed and ease of use.' >> /etc/init.d/cjdns
211
+	echo '# cjdns git repo:    https://github.com/cjdelisle/cjdns/' >> /etc/init.d/cjdns
212
+	echo '### END INIT INFO' >> /etc/init.d/cjdns
213
+	echo '' >> /etc/init.d/cjdns
214
+	echo 'PROG="cjdroute"' >> /etc/init.d/cjdns
215
+	echo 'GIT_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
216
+	echo 'PROG_PATH="/etc/cjdns"' >> /etc/init.d/cjdns
217
+	echo 'CJDNS_CONFIG="cjdroute.conf"' >> /etc/init.d/cjdns
218
+	echo 'CJDNS_USER="cjdns"' >> /etc/init.d/cjdns
219
+	echo "CJDNS_IP='$CJDNS_IPV6'" >> /etc/init.d/cjdns
220
+	echo '' >> /etc/init.d/cjdns
221
+	echo 'start() {' >> /etc/init.d/cjdns
222
+	echo '     # Start it up with the user cjdns' >> /etc/init.d/cjdns
223
+	echo '     if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
224
+	echo '     then' >> /etc/init.d/cjdns
225
+	echo '         echo "cjdroute is already running. Doing nothing..."' >> /etc/init.d/cjdns
226
+	echo '     else' >> /etc/init.d/cjdns
227
+	echo '         echo " * Starting cjdroute"' >> /etc/init.d/cjdns
228
+	echo '         su -c "$PROG_PATH/$PROG < $PROG_PATH/$CJDNS_CONFIG" - $CJDNS_USER' >> /etc/init.d/cjdns
229
+	echo '         /sbin/ip addr add $CJDNS_IP/8 dev tun0' >> /etc/init.d/cjdns
230
+	echo '         /sbin/ip link set mtu 1312 dev tun0' >> /etc/init.d/cjdns
231
+	echo '         /sbin/ip link set tun0 up' >> /etc/init.d/cjdns
232
+	echo '         /sbin/ip tuntap add mode tun user cjdns dev tun0' >> /etc/init.d/cjdns
233
+	echo '     fi' >> /etc/init.d/cjdns
234
+	echo '}' >> /etc/init.d/cjdns
235
+	echo '' >> /etc/init.d/cjdns
236
+	echo 'stop() {' >> /etc/init.d/cjdns
237
+	echo '' >> /etc/init.d/cjdns
238
+	echo '     if [ $(pgrep cjdroute | wc -l) != 2 ];' >> /etc/init.d/cjdns
239
+	echo '     then' >> /etc/init.d/cjdns
240
+	echo '         echo "cjdns isnt running."' >> /etc/init.d/cjdns
241
+	echo '     else' >> /etc/init.d/cjdns
242
+	echo '         echo "Killing cjdroute"' >> /etc/init.d/cjdns
243
+	echo '         killall cjdroute' >> /etc/init.d/cjdns
244
+	echo '     fi' >> /etc/init.d/cjdns
245
+	echo '}' >> /etc/init.d/cjdns
246
+	echo '' >> /etc/init.d/cjdns
247
+	echo 'status() {' >> /etc/init.d/cjdns
248
+	echo '     if [ $(pgrep cjdroute | wc -l) != 0 ];' >> /etc/init.d/cjdns
249
+	echo '     then' >> /etc/init.d/cjdns
250
+	echo '         echo "Cjdns is running"' >> /etc/init.d/cjdns
251
+	echo '     else' >> /etc/init.d/cjdns
252
+	echo '         echo "Cjdns is not running"' >> /etc/init.d/cjdns
253
+	echo '     fi' >> /etc/init.d/cjdns
254
+	echo '}' >> /etc/init.d/cjdns
255
+	echo '' >> /etc/init.d/cjdns
256
+	echo ' update() {' >> /etc/init.d/cjdns
257
+	echo '     cd $GIT_PATH' >> /etc/init.d/cjdns
258
+	echo '     echo "Updating..."' >> /etc/init.d/cjdns
259
+	echo '     git pull' >> /etc/init.d/cjdns
260
+	echo '     ./do' >> /etc/init.d/cjdns
261
+	echo '}' >> /etc/init.d/cjdns
262
+	echo '' >> /etc/init.d/cjdns
263
+	echo '## Check to see if we are running as root first.' >> /etc/init.d/cjdns
264
+	echo 'if [ "$(id -u)" != "0" ]; then' >> /etc/init.d/cjdns
265
+	echo '    echo "This script must be run as root" 1>&2' >> /etc/init.d/cjdns
266
+	echo '    exit 1' >> /etc/init.d/cjdns
267
+	echo 'fi' >> /etc/init.d/cjdns
268
+	echo '' >> /etc/init.d/cjdns
269
+	echo 'case $1 in' >> /etc/init.d/cjdns
270
+	echo '     start)' >> /etc/init.d/cjdns
271
+	echo '         start' >> /etc/init.d/cjdns
272
+	echo '         exit 0' >> /etc/init.d/cjdns
273
+	echo '     ;;' >> /etc/init.d/cjdns
274
+	echo '     stop)' >> /etc/init.d/cjdns
275
+	echo '         stop' >> /etc/init.d/cjdns
276
+	echo '         exit 0' >> /etc/init.d/cjdns
277
+	echo '     ;;' >> /etc/init.d/cjdns
278
+	echo '     reload|restart|force-reload)' >> /etc/init.d/cjdns
279
+	echo '         stop' >> /etc/init.d/cjdns
280
+	echo '         sleep 1' >> /etc/init.d/cjdns
281
+	echo '         start' >> /etc/init.d/cjdns
282
+	echo '         exit 0' >> /etc/init.d/cjdns
283
+	echo '     ;;' >> /etc/init.d/cjdns
284
+	echo '     status)' >> /etc/init.d/cjdns
285
+	echo '         status' >> /etc/init.d/cjdns
286
+	echo '         exit 0' >> /etc/init.d/cjdns
287
+	echo '     ;;' >> /etc/init.d/cjdns
288
+	echo '     update|upgrade)' >> /etc/init.d/cjdns
289
+	echo '         update' >> /etc/init.d/cjdns
290
+	echo '         stop' >> /etc/init.d/cjdns
291
+	echo '         sleep 2' >> /etc/init.d/cjdns
292
+	echo '         start' >> /etc/init.d/cjdns
293
+	echo '         exit 0' >> /etc/init.d/cjdns
294
+	echo '     ;;' >> /etc/init.d/cjdns
295
+	echo '     **)' >> /etc/init.d/cjdns
296
+	echo '         echo "Usage: $0 (start|stop|restart|status|update)" 1>&2' >> /etc/init.d/cjdns
297
+	echo '         exit 1' >> /etc/init.d/cjdns
298
+	echo '     ;;' >> /etc/init.d/cjdns
299
+	echo 'esac' >> /etc/init.d/cjdns
300
+	chmod +x /etc/init.d/cjdns
301
+	update-rc.d cjdns defaults
302
+	service cjdns start
303
+	if [ ! "$?" = "0" ]; then
304
+		systemctl status cjdns.service
305
+		exit 8260
306
+	fi
307
+
308
+	apt-get -y install radvd
309
+	echo 'interface eth0' > /etc/radvd.conf
310
+	echo '{' >> /etc/radvd.conf
311
+	echo '    AdvSendAdvert on;' >> /etc/radvd.conf
312
+	echo '    prefix fdfc::1/64' >> /etc/radvd.conf
313
+	echo '    {' >> /etc/radvd.conf
314
+	echo '        AdvRouterAddr on;' >> /etc/radvd.conf
315
+	echo '    };' >> /etc/radvd.conf
316
+	echo '};' >> /etc/radvd.conf
317
+	systemctl restart radvd
318
+	if [ ! "$?" = "0" ]; then
319
+		systemctl status radvd.service
320
+		exit 4395
321
+	fi
322
+
323
+	if ! grep -q "# Mesh Networking (cjdns)" /etc/network/interfaces; then
324
+		echo '' >> /etc/network/interfaces
325
+		echo '# Mesh Networking (cjdns)' >> /etc/network/interfaces
326
+		echo 'iface eth0 inet6 static' >> /etc/network/interfaces
327
+		echo '    pre-up modprobe ipv6' >> /etc/network/interfaces
328
+		echo '    address fdfc:0000:0000:0000:0000:0000:0000:0001' >> /etc/network/interfaces
329
+		echo '    netmask 64' >> /etc/network/interfaces
330
+		service network-manager restart
331
+		if [ ! "$?" = "0" ]; then
332
+			systemctl status networking.service
333
+			exit 6949
334
+		fi
335
+	fi
336
+
337
+	ip6tables -A INPUT -p udp --dport $CJDNS_PORT -j ACCEPT
338
+	ip6tables -A INPUT -p tcp --dport $CJDNS_PORT -j ACCEPT
339
+
340
+	function_ckeck save_firewall_settings
341
+	save_firewall_settings
342
+
343
+	if ! grep -q $"Mesh Networking (cjdns)" /home/$MY_USERNAME/README; then
344
+		CURRENT_IP_ADDRESS=$(ip addr show | grep "inet " | sed -n 2p | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}')
345
+
346
+		echo '' >> /home/$MY_USERNAME/README
347
+		echo '' >> /home/$MY_USERNAME/README
348
+		echo $'Mesh Networking (cjdns)' >> /home/$MY_USERNAME/README
349
+		echo '=======================' >> /home/$MY_USERNAME/README
350
+		echo $"cjdns IPv6 address: $CJDNS_IPV6" >> /home/$MY_USERNAME/README
351
+		echo $"cjdns public key: $CJDNS_PUBLIC_KEY" >> /home/$MY_USERNAME/README
352
+		echo $"cjdns private key: $CJDNS_PRIVATE_KEY" >> /home/$MY_USERNAME/README
353
+		echo $"cjdns password: $CJDNS_PASSWORD" >> /home/$MY_USERNAME/README
354
+		echo $"cjdns port: $CJDNS_PORT" >> /home/$MY_USERNAME/README
355
+		echo '' >> /home/$MY_USERNAME/README
356
+		echo $"Forward port $CJDNS_PORT from your internet router to the ${PROJECT_NAME}" >> /home/$MY_USERNAME/README
357
+		echo '' >> /home/$MY_USERNAME/README
358
+		echo $'Below is an example of your connection credentials' >> /home/$MY_USERNAME/README
359
+		echo $'that you can give to other people so they can connect' >> /home/$MY_USERNAME/README
360
+		echo $'to you using your default password' >> /home/$MY_USERNAME/README
361
+		echo $'Adding a unique password for each user is advisable' >> /home/$MY_USERNAME/README
362
+		echo $'so that leaks can be isolated.' >> /home/$MY_USERNAME/README
363
+		echo '' >> /home/$MY_USERNAME/README
364
+		echo "\"$CURRENT_IP_ADDRESS:$CJDNS_PORT\":{\"password\":\"$CJDNS_PASSWORD\",\"publicKey\":\"$CJDNS_PUBLIC_KEY\"}" >> /home/$MY_USERNAME/README
365
+		echo '' >> /home/$MY_USERNAME/README
366
+		echo $'More is not better. 3-5 cjdns peers is good. 30 peers is bad.' >> /home/$MY_USERNAME/README
367
+		echo '' >> /home/$MY_USERNAME/README
368
+		echo $'NEVER USE A PUBLIC PEER. These degrade the network and make it centralized.' >> /home/$MY_USERNAME/README
369
+		echo $'Each node can handle many peers, but no node can handle the entire internet.' >> /home/$MY_USERNAME/README
370
+		echo $'As this network grows any public peer will simply become saturated and' >> /home/$MY_USERNAME/README
371
+		echo $'useless causing issues for the entire network.' >> /home/$MY_USERNAME/README
372
+		echo $'Please report anyone offering you a public peer as they are promoting shared' >> /home/$MY_USERNAME/README
373
+		echo $'passwords which could lead to people pretending to be you. A peering pass' >> /home/$MY_USERNAME/README
374
+		echo $'should not contain someone elses nickname or info but should contain yours' >> /home/$MY_USERNAME/README
375
+		echo $'to ensure it is not shared. It also helps when editing the conf to know who' >> /home/$MY_USERNAME/README
376
+		echo $'each password is for.' >> /home/$MY_USERNAME/README
377
+		echo '' >> /home/$MY_USERNAME/README
378
+		echo $'Possible cjdns destinations of interest:' >> /home/$MY_USERNAME/README
379
+		echo '    http://transitiontech.ca/faq' >> /home/$MY_USERNAME/README
380
+		echo '    http://cjdns.ca/hypeirc.txt' >> /home/$MY_USERNAME/README
381
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
382
+		chmod 600 /home/$MY_USERNAME/README
383
+	fi
384
+
385
+	echo 'mesh_cjdns' >> $COMPLETION_FILE
386
+}
387
+
388
+function mesh_cjdns_tools {
389
+	if grep -Fxq "mesh_cjdns_tools" $COMPLETION_FILE; then
390
+		return
391
+	fi
392
+	if [[ $ENABLE_CJDNS != "yes" ]]; then
393
+		return
394
+	fi
395
+	if [ ! -d /etc/cjdns ]; then
396
+		mesh_cjdns
397
+	fi
398
+
399
+	function_check select_go_version
400
+	select_go_version
401
+
402
+	apt-get -y install golang mercurial
403
+	if [ ! -f ~/.bashrc ]; then
404
+		touch ~/.bashrc
405
+	fi
406
+
407
+	if [ ! -d /home/git ]; then
408
+		# add a gogs user account
409
+		adduser --disabled-login --gecos 'Gogs' git
410
+
411
+		# install Go
412
+		if ! grep -q "export GOPATH=" ~/.bashrc; then
413
+			echo "export GOPATH=$GOPATH" >> ~/.bashrc
414
+		fi
415
+		systemctl set-environment GOPATH=$GOPATH
416
+		if ! grep -q "systemctl set-environment GOPATH=" ~/.bashrc; then
417
+			echo "systemctl set-environment GOPATH=$GOPATH" >> ~/.bashrc
418
+		fi
419
+		if [ ! -d $GOPATH ]; then
420
+			mkdir -p $GOPATH
421
+		fi
422
+	fi
423
+
424
+	if ! grep -q "export GOPATH=" ~/.bashrc; then
425
+		echo "export GOPATH=$GOPATH" >> ~/.bashrc
426
+	fi
427
+	expected_go_path='export PATH=$PATH:'${GOPATH}'/bin'
428
+	export PATH=$PATH:${GOPATH}/bin
429
+	if ! grep -q "$expected_go_path" ~/.bashrc; then
430
+		echo "$expected_go_path" >> ~/.bashrc
431
+	fi
432
+	export PATH=$PATH:$GOPATH/bin
433
+	CJDCMD_REPO2=$(echo "$CJDCMD_REPO" | sed 's|https://||g')
434
+	go get $CJDCMD_REPO2
435
+	if [ ! -f $GOPATH/bin/cjdcmd ]; then
436
+		echo $'cjdcmd was not compiled. Check your golang installation'
437
+		exit 7439
438
+	fi
439
+	cp $GOPATH/bin/cjdcmd /usr/bin
440
+
441
+	# initialise from the cjdns config
442
+	/usr/bin/cjdcmd cjdnsadmin -file /etc/cjdns/cjdroute.conf
443
+
444
+	echo 'mesh_cjdns_tools' >> $COMPLETION_FILE
445
+}
446
+
447
+# NOTE: deliberately no exit 0

+ 125
- 0
src/freedombone-app-dlna View File

@@ -0,0 +1,125 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# DLNA application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function install_dlna_server {
32
+	if grep -Fxq "install_dlna_server" $COMPLETION_FILE; then
33
+		return
34
+	fi
35
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
36
+		return
37
+	fi
38
+	apt-get -y install minidlna
39
+
40
+	if [ ! -f /etc/minidlna.conf ]; then
41
+		echo $"ERROR: minidlna does not appear to have installed. $CHECK_MESSAGE"
42
+		exit 55
43
+	fi
44
+
45
+	sed -i "s|media_dir=/var/lib/minidlna|media_dir=A,/home/$MY_USERNAME/Music|g" /etc/minidlna.conf
46
+	if ! grep -q "/home/$MY_USERNAME/Pictures" /etc/minidlna.conf; then
47
+		echo "media_dir=P,/home/$MY_USERNAME/Pictures" >> /etc/minidlna.conf
48
+	fi
49
+	if ! grep -q "/home/$MY_USERNAME/Videos" /etc/minidlna.conf; then
50
+		echo "media_dir=V,/home/$MY_USERNAME/Videos" >> /etc/minidlna.conf
51
+	fi
52
+	if ! grep -q "$USB_MOUNT/Music" /etc/minidlna.conf; then
53
+		echo "media_dir=A,$USB_MOUNT/Music" >> /etc/minidlna.conf
54
+	fi
55
+	if ! grep -q "$USB_MOUNT/Pictures" /etc/minidlna.conf; then
56
+		echo "media_dir=P,$USB_MOUNT/Pictures" >> /etc/minidlna.conf
57
+	fi
58
+	if ! grep -q "$USB_MOUNT/Videos" /etc/minidlna.conf; then
59
+		echo "media_dir=V,$USB_MOUNT/Videos" >> /etc/minidlna.conf
60
+	fi
61
+	sed -i 's/#root_container=./root_container=B/g' /etc/minidlna.conf
62
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
63
+		sed -i 's/#network_interface=/network_interface=eth0/g' /etc/minidlna.conf
64
+	else
65
+		sed -i 's/#network_interface=/network_interface=$WIFI_INTERFACE/g' /etc/minidlna.conf
66
+	fi
67
+	sed -i "s/#friendly_name=/friendly_name=\"${PROJECT_NAME} Media\"/g" /etc/minidlna.conf
68
+	sed -i 's|#db_dir=/var/cache/minidlna|db_dir=/var/cache/minidlna|g' /etc/minidlna.conf
69
+	sed -i 's/#inotify=yes/inotify=yes/g' /etc/minidlna.conf
70
+	sed -i 's/#notify_interval=895/notify_interval=300/g' /etc/minidlna.conf
71
+	sed -i "s|#presentation_url=/|presentation_url=http://localhost:8200|g" /etc/minidlna.conf
72
+	service minidlna force-reload
73
+	service minidlna reload
74
+
75
+	sed -i 's/fs.inotify.max_user_watches*/fs.inotify.max_user_watches=65536/g' /etc/sysctl.conf
76
+	if ! grep -q "max_user_watches" $COMPLETION_FILE; then
77
+		echo 'fs.inotify.max_user_watches=65536' >> /etc/sysctl.conf
78
+	fi
79
+	/sbin/sysctl -p
80
+
81
+	function_check configure_firewall_for_dlna
82
+	configure_firewall_for_dlna
83
+	echo 'install_dlna_server' >> $COMPLETION_FILE
84
+}
85
+
86
+function script_for_attaching_usb_drive {
87
+	if grep -Fxq "script_for_attaching_usb_drive" $COMPLETION_FILE; then
88
+		return
89
+	fi
90
+	echo '#!/bin/bash' > /usr/bin/attach-music
91
+	echo 'remove-music' >> /usr/bin/attach-music
92
+	echo "if [ ! -d $USB_MOUNT ]; then" >> /usr/bin/attach-music
93
+	echo "  mkdir $USB_MOUNT" >> /usr/bin/attach-music
94
+	echo 'fi' >> /usr/bin/attach-music
95
+	echo "mount /dev/sda1 $USB_MOUNT" >> /usr/bin/attach-music
96
+	echo "chown root:root $USB_MOUNT" >> /usr/bin/attach-music
97
+	echo "chown -R minidlna:minidlna $USB_MOUNT/*" >> /usr/bin/attach-music
98
+	echo 'service minidlna restart' >> /usr/bin/attach-music
99
+	echo 'minidlnad -R' >> /usr/bin/attach-music
100
+	chmod +x /usr/bin/attach-music
101
+	ln -s /usr/bin/attach-music /usr/bin/attach-usb
102
+	ln -s /usr/bin/attach-music /usr/bin/attach-videos
103
+	ln -s /usr/bin/attach-music /usr/bin/attach-pictures
104
+	ln -s /usr/bin/attach-music /usr/bin/attach-media
105
+
106
+	echo '#!/bin/bash' > /usr/bin/remove-music
107
+	echo "if [ -d $USB_MOUNT ]; then" >> /usr/bin/remove-music
108
+	echo "  umount $USB_MOUNT" >> /usr/bin/remove-music
109
+	echo "  rm -rf $USB_MOUNT" >> /usr/bin/remove-music
110
+	echo 'fi' >> /usr/bin/remove-music
111
+	chmod +x /usr/bin/remove-music
112
+	ln -s /usr/bin/remove-music /usr/bin/detach-music
113
+	ln -s /usr/bin/remove-music /usr/bin/detach-usb
114
+	ln -s /usr/bin/remove-music /usr/bin/remove-usb
115
+	ln -s /usr/bin/remove-music /usr/bin/detach-media
116
+	ln -s /usr/bin/remove-music /usr/bin/remove-media
117
+	ln -s /usr/bin/remove-music /usr/bin/detach-videos
118
+	ln -s /usr/bin/remove-music /usr/bin/remove-videos
119
+	ln -s /usr/bin/remove-music /usr/bin/detach-pictures
120
+	ln -s /usr/bin/remove-music /usr/bin/remove-pictures
121
+
122
+	echo 'script_for_attaching_usb_drive' >> $COMPLETION_FILE
123
+}
124
+
125
+# NOTE: deliberately no exit 0

+ 113
- 0
src/freedombone-app-editor View File

@@ -0,0 +1,113 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Editor applications
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function install_editor {
32
+	if grep -Fxq "install_editor" $COMPLETION_FILE; then
33
+		return
34
+	fi
35
+	update-alternatives --set editor /usr/bin/emacs24
36
+
37
+	# A minimal emacs configuration
38
+	#echo -n "(add-to-list 'load-path " > /home/$MY_USERNAME/.emacs
39
+	#echo '"~/.emacs.d/")' >> /home/$MY_USERNAME/.emacs
40
+	#echo '' >> /home/$MY_USERNAME/.emacs
41
+	echo $';; ===== Remove trailing whitepace ======================================' >> /home/$MY_USERNAME/.emacs
42
+	echo '' >> /home/$MY_USERNAME/.emacs
43
+	echo ";;(add-hook 'before-save-hook 'delete-trailing-whitespace)" >> /home/$MY_USERNAME/.emacs
44
+	echo '' >> /home/$MY_USERNAME/.emacs
45
+	echo ';; Goto a line number with CTRL-l' >> /home/$MY_USERNAME/.emacs
46
+	echo -n '(global-set-key "\C-l" ' >> /home/$MY_USERNAME/.emacs
47
+	echo "'goto-line)" >> /home/$MY_USERNAME/.emacs
48
+	echo '' >> /home/$MY_USERNAME/.emacs
49
+	echo $';; ===== Show line numbers ==============================================' >> /home/$MY_USERNAME/.emacs
50
+	echo '' >> /home/$MY_USERNAME/.emacs
51
+	echo "(add-hook 'find-file-hook (lambda () (linum-mode 1)))" >> /home/$MY_USERNAME/.emacs
52
+	echo '' >> /home/$MY_USERNAME/.emacs
53
+	echo $';; ===== Enable line wrapping in org-mode ===============================' >> /home/$MY_USERNAME/.emacs
54
+	echo '' >> /home/$MY_USERNAME/.emacs
55
+	echo " (add-hook 'org-mode-hook" >> /home/$MY_USERNAME/.emacs
56
+	echo "           '(lambda ()" >> /home/$MY_USERNAME/.emacs
57
+	echo "              (visual-line-mode 1)))" >> /home/$MY_USERNAME/.emacs
58
+	echo '' >> /home/$MY_USERNAME/.emacs
59
+	echo $';; ===== Enable shift select in org mode ================================' >> /home/$MY_USERNAME/.emacs
60
+	echo '' >> /home/$MY_USERNAME/.emacs
61
+	echo '(setq org-support-shift-select t)' >> /home/$MY_USERNAME/.emacs
62
+	echo '' >> /home/$MY_USERNAME/.emacs
63
+	echo $';; ===== Set standard indent to 4 rather that 4 =========================' >> /home/$MY_USERNAME/.emacs
64
+	echo '' >> /home/$MY_USERNAME/.emacs
65
+	echo '(setq standard-indent 4)' >> /home/$MY_USERNAME/.emacs
66
+	echo '(setq-default tab-width 4)' >> /home/$MY_USERNAME/.emacs
67
+	echo '(setq c-basic-offset 4)' >> /home/$MY_USERNAME/.emacs
68
+	echo '' >> /home/$MY_USERNAME/.emacs
69
+	echo $';; ===== Support Wheel Mouse Scrolling ==================================' >> /home/$MY_USERNAME/.emacs
70
+	echo '' >> /home/$MY_USERNAME/.emacs
71
+	echo '(mouse-wheel-mode t)' >> /home/$MY_USERNAME/.emacs
72
+	echo '' >> /home/$MY_USERNAME/.emacs
73
+	echo $';; ===== Place Backup Files in Specific Directory =======================' >> /home/$MY_USERNAME/.emacs
74
+	echo '' >> /home/$MY_USERNAME/.emacs
75
+	echo '(setq make-backup-files t)' >> /home/$MY_USERNAME/.emacs
76
+	echo '(setq version-control t)' >> /home/$MY_USERNAME/.emacs
77
+	echo '(setq backup-directory-alist (quote ((".*" . "~/.emacs_backups/"))))' >> /home/$MY_USERNAME/.emacs
78
+	echo '' >> /home/$MY_USERNAME/.emacs
79
+	echo $';; ===== Make Text mode the default mode for new buffers ================' >> /home/$MY_USERNAME/.emacs
80
+	echo '' >> /home/$MY_USERNAME/.emacs
81
+	echo "(setq default-major-mode 'text-mode)" >> /home/$MY_USERNAME/.emacs
82
+	echo '' >> /home/$MY_USERNAME/.emacs
83
+	echo $';; ===== Line length ====================================================' >> /home/$MY_USERNAME/.emacs
84
+	echo '' >> /home/$MY_USERNAME/.emacs
85
+	echo '(setq-default fill-column 72)' >> /home/$MY_USERNAME/.emacs
86
+	echo '' >> /home/$MY_USERNAME/.emacs
87
+	echo $';; ===== Enable Line and Column Numbering ===============================' >> /home/$MY_USERNAME/.emacs
88
+	echo '' >> /home/$MY_USERNAME/.emacs
89
+	echo '(line-number-mode 1)' >> /home/$MY_USERNAME/.emacs
90
+	echo '(column-number-mode 1)' >> /home/$MY_USERNAME/.emacs
91
+	echo '' >> /home/$MY_USERNAME/.emacs
92
+	echo $';; ===== Turn on Auto Fill mode automatically in all modes ==============' >> /home/$MY_USERNAME/.emacs
93
+	echo '' >> /home/$MY_USERNAME/.emacs
94
+	echo ';; Auto-fill-mode the the automatic wrapping of lines and insertion of' >> /home/$MY_USERNAME/.emacs
95
+	echo ';; newlines when the cursor goes over the column limit.' >> /home/$MY_USERNAME/.emacs
96
+	echo '' >> /home/$MY_USERNAME/.emacs
97
+	echo ';; This should actually turn on auto-fill-mode by default in all major' >> /home/$MY_USERNAME/.emacs
98
+	echo ';; modes. The other way to do this is to turn on the fill for specific modes' >> /home/$MY_USERNAME/.emacs
99
+	echo ';; via hooks.' >> /home/$MY_USERNAME/.emacs
100
+	echo '' >> /home/$MY_USERNAME/.emacs
101
+	echo '(setq auto-fill-mode 1)' >> /home/$MY_USERNAME/.emacs
102
+	echo '' >> /home/$MY_USERNAME/.emacs
103
+	echo $';; ===== Enable GPG encryption =========================================' >> /home/$MY_USERNAME/.emacs
104
+	echo '' >> /home/$MY_USERNAME/.emacs
105
+	echo "(require 'epa)" >> /home/$MY_USERNAME/.emacs
106
+	echo '(epa-file-enable)' >> /home/$MY_USERNAME/.emacs
107
+	cp /home/$MY_USERNAME/.emacs /root/.emacs
108
+	chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
109
+
110
+	echo 'install_editor' >> $COMPLETION_FILE
111
+}
112
+
113
+# NOTE: deliberately no exit 0

+ 1501
- 0
src/freedombone-app-email
File diff suppressed because it is too large
View File


+ 660
- 0
src/freedombone-app-gnusocial View File

@@ -0,0 +1,660 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# GNU Social application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+MICROBLOG_DOMAIN_NAME=
32
+MICROBLOG_CODE=
33
+MICROBLOG_ONION_PORT=8087
34
+MICROBLOG_REPO="https://git.gnu.io/gnu/gnu-social.git"
35
+MICROBLOG_COMMIT='c67b89e56bf0f90730a9e22beca7e1bd41fc26c3'
36
+MICROBLOG_ADMIN_PASSWORD=
37
+MICROBLOG_THEME_REPO="https://git.gnu.io/h2p/Qvitter.git"
38
+MICROBLOG_THEME_COMMIT='34510bcf37c727f91afad789fb0a531a45171ccf'
39
+MICROBLOG_WELCOME_MESSAGE=$'<h1>Welcome to GNU Social – a federated microblog</h1><p>Another Freedombone site</p>'
40
+MICROBLOG_BACKGROUND_IMAGE_URL=
41
+MICROBLOG_MARKDOWN_REPO="https://git.gnu.io/chimo/markdown.git"
42
+MICROBLOG_MARKDOWN_COMMIT='03c53942f94b3376f0946e6e1fe566cc21ccf232'
43
+
44
+# Sharings plugin for the microblog
45
+SHARINGS_REPO="http://git.lasindias.club/bashrc/Sharings"
46
+SHARINGS_COMMIT='d5c6c7f855d9afff9086c09ea706f38c859bc0d4'
47
+SHARINGS_THEME_REPO="http://git.lasindias.club/manuel/SharingsTheme"
48
+SHARINGS_THEME_COMMIT='7106c7ef03'
49
+
50
+function install_gnu_social {
51
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
52
+		return
53
+	fi
54
+	if [ ! $MICROBLOG_DOMAIN_NAME ]; then
55
+		echo $'No domain name was given for the microblog'
56
+		exit 7359
57
+	fi
58
+
59
+	# update to the next commit
60
+	function_check set_repo_commit
61
+	set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs "GNU Social commit" "$MICROBLOG_COMMIT" $MICROBLOG_REPO
62
+
63
+	# add a script to check that the daemon is running
64
+	echo '#!/bin/bash' > /etc/cron.hourly/gnusocial-daemons
65
+	echo 'daemon_lines=$(ps aux | grep "scripts/queuedaemon.php" | grep "/var/www")' >> /etc/cron.hourly/gnusocial-daemons
66
+	echo 'if [[ $daemon_lines != *"/var/www/"* ]]; then' >> /etc/cron.hourly/gnusocial-daemons
67
+
68
+	echo "    ADMIN_USER=\$(cat $COMPLETION_FILE | grep 'Admin user' | awk -F ':' '{print \$2}')" >> /etc/cron.hourly/gnusocial-daemons
69
+	echo '    MY_EMAIL_ADDRESS=$ADMIN_USER@$HOSTNAME' >> /etc/cron.hourly/gnusocial-daemons
70
+	echo '    echo "Restarting GNU Social daemons" | mail -s "GNU Social daemons not found" $MY_EMAIL_ADDRESS' >> /etc/cron.hourly/gnusocial-daemons
71
+	echo "    cd /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs" >> /etc/cron.hourly/gnusocial-daemons
72
+	echo '    scripts/startdaemons.sh' >> /etc/cron.hourly/gnusocial-daemons
73
+	echo 'fi' >> /etc/cron.hourly/gnusocial-daemons
74
+	chmod +x /etc/cron.hourly/gnusocial-daemons
75
+
76
+	if grep -Fxq "install_gnu_social" $COMPLETION_FILE; then
77
+		return
78
+	fi
79
+
80
+	function_check install_mariadb
81
+	install_mariadb
82
+
83
+	function_check get_mariadb_password
84
+	get_mariadb_password
85
+
86
+	function_check repair_databases_script
87
+	repair_databases_script
88
+
89
+	apt-get -y install php-gettext php5-curl php5-gd php5-mysql git curl php-xml-parser
90
+	apt-get -y install php5-memcached
91
+
92
+	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME ]; then
93
+		mkdir /var/www/$MICROBLOG_DOMAIN_NAME
94
+	fi
95
+	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
96
+		function_check git_clone
97
+		git_clone $MICROBLOG_REPO /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
98
+		if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
99
+			echo $'Unable to clone gnusocial repo'
100
+			exit 87525
101
+		fi
102
+	fi
103
+
104
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
105
+	git checkout $MICROBLOG_COMMIT -b $MICROBLOG_COMMIT
106
+	if ! grep -q "GNU Social commit" $COMPLETION_FILE; then
107
+		echo "GNU Social commit:$MICROBLOG_COMMIT" >> $COMPLETION_FILE
108
+	else
109
+		sed -i "s/GNU Social commit.*/GNU Social commit:$MICROBLOG_COMMIT/g" $COMPLETION_FILE
110
+	fi
111
+
112
+	chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
113
+	chown www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
114
+	chmod +x /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php
115
+
116
+	function_check get_mariadb_gnusocial_admin_password
117
+	get_mariadb_gnusocial_admin_password
118
+	if [ ! $MICROBLOG_ADMIN_PASSWORD ]; then
119
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
120
+			MICROBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
121
+		else
122
+			MICROBLOG_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
123
+		fi
124
+	fi
125
+
126
+	function_check create_database
127
+	create_database gnusocial "$MICROBLOG_ADMIN_PASSWORD" $MY_USERNAME
128
+
129
+	if [ ! -f "/etc/aliases" ]; then
130
+		touch /etc/aliases
131
+	fi
132
+	if ! grep -q "www-data: root" /etc/aliases; then
133
+		echo 'www-data: root' >> /etc/aliases
134
+	fi
135
+	if ! grep -q "/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" /etc/aliases; then
136
+		echo "*: /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" >> /etc/aliases
137
+	fi
138
+
139
+	function_check add_ddns_domain
140
+	add_ddns_domain $MICROBLOG_DOMAIN_NAME
141
+
142
+	microblog_nginx_site=/etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
143
+	if [[ $ONION_ONLY == "no" ]]; then
144
+		function_check nginx_http_redirect
145
+		nginx_http_redirect $MICROBLOG_DOMAIN_NAME
146
+		echo 'server {' >> $microblog_nginx_site
147
+		echo '  listen 443 ssl;' >> $microblog_nginx_site
148
+		echo "  server_name $MICROBLOG_DOMAIN_NAME;" >> $microblog_nginx_site
149
+		echo '' >> $microblog_nginx_site
150
+		echo '  # Security' >> $microblog_nginx_site
151
+		function_check nginx_ssl
152
+		nginx_ssl $MICROBLOG_DOMAIN_NAME
153
+
154
+		function_check nginx_disable_sniffing
155
+		nginx_disable_sniffing $MICROBLOG_DOMAIN_NAME
156
+
157
+		function_check nginx_limits
158
+		nginx_limits $MICROBLOG_DOMAIN_NAME '15m'
159
+		echo '  add_header Strict-Transport-Security max-age=15768000;' >> $microblog_nginx_site
160
+		echo '' >> $microblog_nginx_site
161
+		echo '  # Logs' >> $microblog_nginx_site
162
+		echo '  access_log off;' >> $microblog_nginx_site
163
+		echo '  error_log off;' >> $microblog_nginx_site
164
+		echo '' >> $microblog_nginx_site
165
+		echo '  # Root' >> $microblog_nginx_site
166
+		echo "  root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> $microblog_nginx_site
167
+		echo '' >> $microblog_nginx_site
168
+		echo '  # Index' >> $microblog_nginx_site
169
+		echo '  index index.php;' >> $microblog_nginx_site
170
+		echo '' >> $microblog_nginx_site
171
+		echo '  # PHP' >> $microblog_nginx_site
172
+		echo '  location ~ \.php {' >> $microblog_nginx_site
173
+		echo '    include snippets/fastcgi-php.conf;' >> $microblog_nginx_site
174
+		echo '    fastcgi_pass unix:/var/run/php5-fpm.sock;' >> $microblog_nginx_site
175
+		echo '  }' >> $microblog_nginx_site
176
+		echo '' >> $microblog_nginx_site
177
+		echo '  # Location' >> $microblog_nginx_site
178
+		echo '  location / {' >> $microblog_nginx_site
179
+		echo '    try_files $uri $uri/ @gnusocial;' >> $microblog_nginx_site
180
+		echo '  }' >> $microblog_nginx_site
181
+		echo '' >> $microblog_nginx_site
182
+		echo '  # Fancy URLs' >> $microblog_nginx_site
183
+		echo '  location @gnusocial {' >> $microblog_nginx_site
184
+		echo '    rewrite ^(.*)$ /index.php?p=$1 last;' >> $microblog_nginx_site
185
+		echo '  }' >> $microblog_nginx_site
186
+		echo '' >> $microblog_nginx_site
187
+		echo '  # Restrict access that is unnecessary anyway' >> $microblog_nginx_site
188
+		echo '  location ~ /\.(ht|git) {' >> $microblog_nginx_site
189
+		echo '    deny all;' >> $microblog_nginx_site
190
+		echo '  }' >> $microblog_nginx_site
191
+		echo '}' >> $microblog_nginx_site
192
+	else
193
+		echo -n '' > $microblog_nginx_site
194
+	fi
195
+	echo 'server {' >> $microblog_nginx_site
196
+	echo "    listen 127.0.0.1:$MICROBLOG_ONION_PORT default_server;" >> $microblog_nginx_site
197
+	echo "    server_name $MICROBLOG_DOMAIN_NAME;" >> $microblog_nginx_site
198
+	echo '' >> $microblog_nginx_site
199
+	function_check nginx_disable_sniffing
200
+	nginx_disable_sniffing $MICROBLOG_DOMAIN_NAME
201
+	function_check nginx_limits
202
+	nginx_limits $MICROBLOG_DOMAIN_NAME '15m'
203
+	echo '' >> $microblog_nginx_site
204
+	echo '  # Logs' >> $microblog_nginx_site
205
+	echo '  access_log off;' >> $microblog_nginx_site
206
+	echo '  error_log off;' >> $microblog_nginx_site
207
+	echo '' >> $microblog_nginx_site
208
+	echo '  # Root' >> $microblog_nginx_site
209
+	echo "  root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> $microblog_nginx_site
210
+	echo '' >> $microblog_nginx_site
211
+	echo '  # Index' >> $microblog_nginx_site
212
+	echo '  index index.php;' >> $microblog_nginx_site
213
+	echo '' >> $microblog_nginx_site
214
+	echo '  # PHP' >> $microblog_nginx_site
215
+	echo '  location ~ \.php {' >> $microblog_nginx_site
216
+	echo '    include snippets/fastcgi-php.conf;' >> $microblog_nginx_site
217
+	echo '    fastcgi_pass unix:/var/run/php5-fpm.sock;' >> $microblog_nginx_site
218
+	echo '  }' >> $microblog_nginx_site
219
+	echo '' >> $microblog_nginx_site
220
+	echo '  # Location' >> $microblog_nginx_site
221
+	echo '  location / {' >> $microblog_nginx_site
222
+	echo '    try_files $uri $uri/ @gnusocial;' >> $microblog_nginx_site
223
+	echo '  }' >> $microblog_nginx_site
224
+	echo '' >> $microblog_nginx_site
225
+	echo '  # Fancy URLs' >> $microblog_nginx_site
226
+	echo '  location @gnusocial {' >> $microblog_nginx_site
227
+	echo '    rewrite ^(.*)$ /index.php?p=$1 last;' >> $microblog_nginx_site
228
+	echo '  }' >> $microblog_nginx_site
229
+	echo '' >> $microblog_nginx_site
230
+	echo '  # Restrict access that is unnecessary anyway' >> $microblog_nginx_site
231
+	echo '  location ~ /\.(ht|git) {' >> $microblog_nginx_site
232
+	echo '    deny all;' >> $microblog_nginx_site
233
+	echo '  }' >> $microblog_nginx_site
234
+	echo '}' >> $microblog_nginx_site
235
+
236
+	function_check configure_php
237
+	configure_php
238
+
239
+	function_check create_site_certificate
240
+	create_site_certificate $MICROBLOG_DOMAIN_NAME 'yes'
241
+
242
+	# Ensure that the database gets backed up locally, if remote
243
+	# backups are not being used
244
+	function_check backup_databases_script_header
245
+	backup_databases_script_header
246
+
247
+	function_check backup_database_local
248
+	backup_database_local gnusocial
249
+
250
+	function_check nginx_ensite
251
+	nginx_ensite $MICROBLOG_DOMAIN_NAME
252
+
253
+	# NOTE: For the typical case always enable SSL and only
254
+	# disable it if in onion only mode. This is due to complexities
255
+	# with the way URLs are generated by GNU Social
256
+	gnu_social_ssl='always'
257
+	if [[ $ONION_ONLY != 'no' ]]; then
258
+		gnu_social_ssl='never'
259
+	fi
260
+
261
+	MICROBLOG_ONION_HOSTNAME=$(add_onion_service microblog 80 ${MICROBLOG_ONION_PORT})
262
+
263
+	MICROBLOG_SERVER=${MICROBLOG_DOMAIN_NAME}
264
+	if [[ $ONION_ONLY != 'no' ]]; then
265
+		MICROBLOG_SERVER=${MICROBLOG_ONION_HOSTNAME}
266
+	fi
267
+
268
+	# Create the configuration
269
+	gnu_social_installer=/var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/scripts/install_cli.php
270
+	if [ ! -f $gnu_social_installer ]; then
271
+		echo $'No GNU Social commandline installer found'
272
+		exit 53026
273
+	fi
274
+	${gnu_social_installer} --server "${MICROBLOG_SERVER}" \
275
+							--host="localhost" --database="gnusocial" \
276
+							--dbtype=mysql --username="root" -v \
277
+							--password="$MARIADB_PASSWORD" \
278
+							--sitename=$"GNU Social" --fancy='yes' \
279
+							--admin-nick="$MY_USERNAME" \
280
+							--admin-pass="$MICROBLOG_ADMIN_PASSWORD" \
281
+							--site-profile="community" \
282
+							--ssl=${gnu_social_ssl}
283
+	# There can be a lot of warnings here so the return value check is disabled
284
+	#if [ ! "$?" = "0" ]; then
285
+	#    # failed to install
286
+	#    echo $'Could not install GNU Social'
287
+	#    exit 72357
288
+	#fi
289
+
290
+	# check microblog has a config file
291
+	microblog_config_file=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
292
+	if [ ! -f $microblog_config_file ]; then
293
+		echo $'Microblog config.php not found'
294
+		exit 87586
295
+	fi
296
+
297
+	# Some useful settings
298
+	if ! grep -q "Recommended GNU social settings" $microblog_config_file; then
299
+		echo "" >> $microblog_config_file
300
+		echo "// Recommended GNU social settings" >> $microblog_config_file
301
+		echo "\$config['thumbnail']['maxsize'] = 3000;" >> $microblog_config_file
302
+		echo "\$config['profile']['delete'] = true;" >> $microblog_config_file
303
+		echo "\$config['profile']['changenick'] = true;" >> $microblog_config_file
304
+		echo "\$config['public']['localonly'] = false;" >> $microblog_config_file
305
+		echo "addPlugin('StoreRemoteMedia');" >> $microblog_config_file
306
+		echo "\$config['queue']['enabled'] = true;" >> $microblog_config_file
307
+		echo "\$config['queue']['daemon'] = true;" >> $microblog_config_file
308
+	fi
309
+
310
+	# This improves performance
311
+	sed -i "s|//\$config\['db'\]\['schemacheck'\].*|\$config\['db'\]\['schemacheck'\] = 'script';|g" $microblog_config_file
312
+
313
+	systemctl restart php5-fpm
314
+	systemctl restart nginx
315
+
316
+	freedombone-addemail -u $MY_USERNAME -e "noreply@$MICROBLOG_DOMAIN_NAME" -g gnusocial --public no
317
+
318
+	# some post-install instructions for the user
319
+	if ! grep -q $"Microblog administrator" /home/$MY_USERNAME/README; then
320
+		echo '' >> /home/$MY_USERNAME/README
321
+		echo '' >> /home/$MY_USERNAME/README
322
+		echo $'Microblog' >> /home/$MY_USERNAME/README
323
+		echo '=========' >> /home/$MY_USERNAME/README
324
+		echo $"Microblog administrator nickname: $MY_USERNAME" >> /home/$MY_USERNAME/README
325
+		echo $"Microblog administrator password: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
326
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
327
+		chmod 600 /home/$MY_USERNAME/README
328
+	fi
329
+
330
+	if ! grep -q "Microblog onion domain" /home/$MY_USERNAME/README; then
331
+		echo $"Microblog onion domain: ${MICROBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
332
+		echo '' >> /home/$MY_USERNAME/README
333
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
334
+		chmod 600 /home/$MY_USERNAME/README
335
+	fi
336
+	echo "GNU Social onion domain:${MICROBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE
337
+
338
+	echo "GNU Social domain:$MICROBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
339
+	echo 'install_gnu_social' >> $COMPLETION_FILE
340
+}
341
+
342
+function install_gnu_social_plugin_sharings {
343
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
344
+		return
345
+	fi
346
+
347
+	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins ]; then
348
+		echo $'No local/plugins directory found for the microblog'
349
+		exit 72945
350
+	fi
351
+
352
+	# update to the next commit
353
+	function_check set_repo_commit
354
+	set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins "GNU Social sharings plugin commit" "$SHARINGS_COMMIT" $SHARINGS_REPO
355
+
356
+	if grep -Fxq "install_gnu_social_plugin_sharings" $COMPLETION_FILE; then
357
+		return
358
+	fi
359
+
360
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
361
+	function_check git_clone
362
+	git_clone $SHARINGS_REPO Sharings
363
+	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings ]; then
364
+		echo $'Unable to clone microblog sharings plugin'
365
+		exit 36738
366
+	fi
367
+
368
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings
369
+	git stash
370
+	git checkout master
371
+	git branch -D $SHARINGS_COMMIT
372
+	git checkout $SHARINGS_COMMIT -b $SHARINGS_COMMIT
373
+
374
+	# enable the plugin
375
+	if ! grep -q "addPlugin('Sharings');" /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php; then
376
+		echo "addPlugin('Sharings');" >> /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
377
+	fi
378
+
379
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
380
+	php scripts/checkschema.php
381
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings
382
+	php scripts/seedsharings.php
383
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
384
+	php scripts/checkschema.php
385
+
386
+	# Languages
387
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings/locale/en/LC_MESSAGES
388
+	msgfmt -o Sharings.mo Sharings.po
389
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings/locale/en_GB/LC_MESSAGES
390
+	msgfmt -o Sharings.mo Sharings.po
391
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings/locale/en_US/LC_MESSAGES
392
+	msgfmt -o Sharings.mo Sharings.po
393
+
394
+	chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
395
+
396
+	if ! grep -q "GNU Social sharings plugin commit" $COMPLETION_FILE; then
397
+		echo "GNU Social sharings plugin commit:$SHARINGS_COMMIT" >> $COMPLETION_FILE
398
+	else
399
+		sed -i "s|GNU Social sharings plugin commit.*|GNU Social sharings plugin commit:$SHARINGS_COMMIT|g" $COMPLETION_FILE
400
+	fi
401
+	echo 'install_gnu_social_plugin_sharings' >> $COMPLETION_FILE
402
+}
403
+
404
+function install_gnu_social_plugin_sharings_theme {
405
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
406
+		return
407
+	fi
408
+
409
+	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins ]; then
410
+		echo $'No local/plugins directory found for the microblog'
411
+		exit 74458
412
+	fi
413
+
414
+	# update to the next commit
415
+	function_check set_repo_commit
416
+	set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins "GNU Social sharings theme plugin commit" "$SHARINGS_THEME_COMMIT" $SHARINGS_THEME_REPO
417
+
418
+	if grep -Fxq "install_gnu_social_plugin_sharings_theme" $COMPLETION_FILE; then
419
+		return
420
+	fi
421
+
422
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
423
+	function_check git_clone
424
+	git_clone $SHARINGS_THEME_REPO SharingsTheme
425
+	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/SharingsTheme ]; then
426
+		echo $'Unable to clone microblog sharings plugin theme'
427
+		exit 639253
428
+	fi
429
+
430
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/SharingsTheme
431
+	git stash
432
+	git checkout master
433
+	git branch -D $SHARINGS_THEME_COMMIT
434
+	git checkout $SHARINGS_THEME_COMMIT -b $SHARINGS_THEME_COMMIT
435
+
436
+	# enable the plugin
437
+	if ! grep -q "addPlugin('SharingsTheme');" /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php; then
438
+		echo "addPlugin('SharingsTheme');" >> /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
439
+	fi
440
+
441
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
442
+	php scripts/checkschema.php
443
+
444
+	chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
445
+
446
+	if ! grep -q "GNU Social sharings plugin theme commit" $COMPLETION_FILE; then
447
+		echo "GNU Social sharings plugin theme commit:$SHARINGS_THEME_COMMIT" >> $COMPLETION_FILE
448
+	else
449
+		sed -i "s|GNU Social sharings plugin theme commit.*|GNU Social sharings plugin theme commit:$SHARINGS_THEME_COMMIT|g" $COMPLETION_FILE
450
+	fi
451
+	echo 'install_gnu_social_plugin_sharings_theme' >> $COMPLETION_FILE
452
+}
453
+
454
+function expire_gnu_social_posts {
455
+	# To prevent the database size from growing endlessly this script expires posts
456
+	# after a number of months
457
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
458
+		return
459
+	fi
460
+	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
461
+		return
462
+	fi
463
+
464
+	gnusocial_expire_script=/usr/bin/gnusocial-expire
465
+
466
+	echo '<?php' > $gnusocial_expire_script
467
+	echo '' >> $gnusocial_expire_script
468
+	echo '// GNU Social post expiry script, based on StatExpire by Tony Baldwin' >> $gnusocial_expire_script
469
+	echo '// https://github.com/tonybaldwin/statexpire' >> $gnusocial_expire_script
470
+	echo '' >> $gnusocial_expire_script
471
+	echo '$oldate=date(("Y-m-d"), strtotime("-3 months"));' >> $gnusocial_expire_script
472
+	echo '$username="root";' >> $gnusocial_expire_script
473
+	echo "\$password=trim(file_get_contents(\"$DATABASE_PASSWORD_FILE\"));" >> $gnusocial_expire_script
474
+	echo '$database="gnusocial";' >> $gnusocial_expire_script
475
+	echo '' >> $gnusocial_expire_script
476
+	echo 'if (!$link = mysql_connect("localhost", $username, $password)) {' >> $gnusocial_expire_script
477
+	echo '    echo "Could not connect to mariadb";' >> $gnusocial_expire_script
478
+	echo '    exit;' >> $gnusocial_expire_script
479
+	echo '}' >> $gnusocial_expire_script
480
+	echo '' >> $gnusocial_expire_script
481
+	echo 'if (!mysql_select_db($database, $link)) {' >> $gnusocial_expire_script
482
+	echo '    echo "Could not select gnusocial database";' >> $gnusocial_expire_script
483
+	echo '    exit;' >> $gnusocial_expire_script
484
+	echo '}' >> $gnusocial_expire_script
485
+	echo '' >> $gnusocial_expire_script
486
+	echo "\$notice_query=\"DELETE FROM notice WHERE created <= '\$oldate 01:01:01'\";" >> $gnusocial_expire_script
487
+	echo "\$conversation_query=\"DELETE FROM conversation WHERE created <= '$oldate 01:01:01'\";" >> $gnusocial_expire_script
488
+	echo "\$reply_query=\"DELETE FROM reply WHERE modified <= '\$oldate 01:01:01'\";" >> $gnusocial_expire_script
489
+	echo '' >> $gnusocial_expire_script
490
+	echo 'mysql_query($notice_query);' >> $gnusocial_expire_script
491
+	echo '$rowaff1=mysql_affected_rows();' >> $gnusocial_expire_script
492
+	echo 'mysql_query($conversation_query);' >> $gnusocial_expire_script
493
+	echo '$rowaff2=mysql_affected_rows();' >> $gnusocial_expire_script
494
+	echo 'mysql_query($reply_query);' >> $gnusocial_expire_script
495
+	echo '$rowaff3=mysql_affected_rows();' >> $gnusocial_expire_script
496
+	echo 'mysql_close();' >> $gnusocial_expire_script
497
+	echo '' >> $gnusocial_expire_script
498
+	echo 'echo "Expire GNU Social posts: $rowaff1 notices, $rowaff2 conversations, and $rowaff3 replies deleted from database.\n";' >> $gnusocial_expire_script
499
+	chmod +x $gnusocial_expire_script
500
+
501
+	# Add a cron job
502
+	if ! grep -q "$gnusocial_expire_script" /etc/crontab; then
503
+		echo "10 3 5   *   *   root /usr/bin/timeout 500 /usr/bin/php $gnusocial_expire_script" >> /etc/crontab
504
+	fi
505
+
506
+	# remove old expire script
507
+	if [ -f /etc/cron.weekly/clear-microblog-database ]; then
508
+		rm /etc/cron.weekly/clear-microblog-database
509
+	fi
510
+}
511
+
512
+function install_gnu_social_theme {
513
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
514
+		return
515
+	fi
516
+
517
+	# update to the next commit
518
+	function_check set_repo_commit
519
+	set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter "GNU Social theme commit" "$MICROBLOG_THEME_COMMIT" $MICROBLOG_THEME_REPO
520
+
521
+	# customise with project logo
522
+	if [ -f /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter/img/sprite.png ]; then
523
+		if [ -f ~/freedombone/img/gnusocial_sprite.png ]; then
524
+			cp ~/freedombone/img/gnusocial_sprite.png /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter/img/sprite.png
525
+		fi
526
+	fi
527
+
528
+	if grep -Fxq "install_gnu_social_theme" $COMPLETION_FILE; then
529
+		return
530
+	fi
531
+
532
+	apt-get -y install wget
533
+
534
+	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins ]; then
535
+		mkdir -p /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
536
+	fi
537
+
538
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
539
+	function_check git_clone
540
+	git_clone $MICROBLOG_THEME_REPO Qvitter
541
+	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter
542
+	git checkout $MICROBLOG_THEME_COMMIT -b $MICROBLOG_THEME_COMMIT
543
+
544
+	# download a custom background image
545
+	MICROBLOG_BACKGROUND_IMAGE_URL_EXT=
546
+	if [ $MICROBLOG_BACKGROUND_IMAGE_URL ]; then
547
+		if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".jpeg" || $$MICROBLOG_BACKGROUND_IMAGE_URL == *".jpg" ]]; then
548
+			MICROBLOG_BACKGROUND_IMAGE_URL_EXT="jpg"
549
+		fi
550
+		if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".png" ]]; then
551
+			MICROBLOG_BACKGROUND_IMAGE_URL_EXT="png"
552
+		fi
553
+		if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".gif" ]]; then
554
+			MICROBLOG_BACKGROUND_IMAGE_URL_EXT="gif"
555
+		fi
556
+		if [ $MICROBLOG_BACKGROUND_IMAGE_URL_EXT ]; then
557
+			wget $MICROBLOG_BACKGROUND_IMAGE_URL -O img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}
558
+			if [ ! -f img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT} ]; then
559
+				echo "$MICROBLOG_BACKGROUND_IMAGE_URL"
560
+				echo $'Custom background image for microblog could not be downloaded'
561
+				exit 87524
562
+			fi
563
+		fi
564
+	fi
565
+
566
+	microblog_config_file=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
567
+	if ! grep -q "addPlugin('Qvitter')" $microblog_config_file; then
568
+		MICROBLOG_WELCOME_MESSAGE=$(echo $MICROBLOG_WELCOME_MESSAGE | sed "s|\$MICROBLOG_DOMAIN_NAME|$MICROBLOG_DOMAIN_NAME|g")
569
+		echo "" >> $microblog_config_file
570
+		echo "// Qvitter settings" >> $microblog_config_file
571
+		echo "addPlugin('Qvitter');" >> $microblog_config_file
572
+		echo "\$config['site']['qvitter']['enabledbydefault'] = true;" >> $microblog_config_file
573
+		echo "\$config['site']['qvitter']['defaultbackgroundcolor'] = '#f4f4f4';" >> $microblog_config_file
574
+		echo "\$config['site']['qvitter']['defaultlinkcolor'] = '#0084B4';" >> $microblog_config_file
575
+		echo "\$config['site']['qvitter']['timebetweenpolling'] = 30000; // 30 secs" >> $microblog_config_file
576
+		echo "\$config['site']['qvitter']['urlshortenerapiurl'] = 'http://qttr.at/shortener.php';" >> $microblog_config_file
577
+		echo "\$config['site']['qvitter']['urlshortenersignature'] = 'b6afeec983';" >> $microblog_config_file
578
+		if [ $MICROBLOG_BACKGROUND_IMAGE_URL ]; then
579
+			echo "\$config['site']['qvitter']['sitebackground'] = 'img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}';" >> $microblog_config_file
580
+		else
581
+			echo "\$config['site']['qvitter']['sitebackground'] = 'img/vagnsmossen.jpg';" >> $microblog_config_file
582
+		fi
583
+		echo "\$config['site']['qvitter']['favicon'] = 'img/favicon.ico?v=4';" >> $microblog_config_file
584
+		echo "\$config['site']['qvitter']['sprite'] = Plugin::staticPath('Qvitter', '').'img/sprite.png?v=40';" >> $microblog_config_file
585
+		echo "\$config['site']['qvitter']['enablewelcometext'] = true;" >> $microblog_config_file
586
+		echo "\$config['site']['qvitter']['customwelcometext']['en'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
587
+		echo "\$config['site']['qvitter']['customwelcometext']['de'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
588
+		echo "\$config['site']['qvitter']['customwelcometext']['fr'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
589
+		echo "\$config['site']['qvitter']['customwelcometext']['es'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
590
+		echo "\$config['site']['qvitter']['blocked_ips'] = array();" >> $microblog_config_file
591
+	else
592
+		if [ $MICROBLOG_BACKGROUND_IMAGE_URL_EXT ]; then
593
+			if [ -f img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT} ]; then
594
+				sed -i "s|\$config['site']['qvitter']['sitebackground'].*|\$config['site']['qvitter']['sitebackground'] = 'img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}';|g" $microblog_config_file
595
+			fi
596
+		fi
597
+	fi
598
+
599
+	# customise with project logo
600
+	if [ -f /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter/img/sprite.png ]; then
601
+		if [ -f ~/freedombone/img/gnusocial_sprite.png ]; then
602
+			cp ~/freedombone/img/gnusocial_sprite.png /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter/img/sprite.png
603
+		fi
604
+	fi
605
+
606
+	if ! grep -q "GNU Social theme commit" $COMPLETION_FILE; then
607
+		echo "GNU Social theme commit:$MICROBLOG_THEME_COMMIT" >> $COMPLETION_FILE
608
+	fi
609
+
610
+	chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
611
+
612
+	echo 'install_gnu_social_theme' >> $COMPLETION_FILE
613
+}
614
+
615
+function install_gnu_social_markdown {
616
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
617
+		return
618
+	fi
619
+
620
+	MICROBLOG_PATH=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs
621
+
622
+	# update to the next commit
623
+	function_check set_repo_commit
624
+	set_repo_commit $MICROBLOG_PATH/local/plugins/Markdown "GNU Social Markdown commit" "$MICROBLOG_MARKDOWN_COMMIT" $MICROBLOG_MARKDOWN_REPO
625
+
626
+	if grep -Fxq "install_gnu_social_markdown" $COMPLETION_FILE; then
627
+		return
628
+	fi
629
+
630
+	if [ -d $MICROBLOG_PATH/local/plugins/Markdown ]; then
631
+		rm -rf $MICROBLOG_PATH/local/plugins/Markdown
632
+	fi
633
+
634
+	if [ ! -d $MICROBLOG_PATH/local/plugins ]; then
635
+		mkdir -p $MICROBLOG_PATH/local/plugins
636
+	fi
637
+
638
+	cd $MICROBLOG_PATH/local/plugins
639
+	function_check git_clone
640
+	git_clone $MICROBLOG_MARKDOWN_REPO Markdown
641
+	cd $MICROBLOG_PATH/local/plugins/Markdown
642
+	git checkout $MICROBLOG_MARKDOWN_COMMIT -b $MICROBLOG_MARKDOWN_COMMIT
643
+
644
+	microblog_config_file=$MICROBLOG_PATH/config.php
645
+	if ! grep -q "addPlugin('Markdown'" $microblog_config_file; then
646
+		echo "" >> $microblog_config_file
647
+		echo "// Markdown settings" >> $microblog_config_file
648
+		echo "addPlugin('Markdown');" >> $microblog_config_file
649
+	fi
650
+
651
+	if ! grep -q "GNU Social Markdown commit" $COMPLETION_FILE; then
652
+		echo "GNU Social Markdown commit:$MICROBLOG_MARKDOWN_COMMIT" >> $COMPLETION_FILE
653
+	fi
654
+
655
+	chown -R www-data:www-data $MICROBLOG_PATH
656
+
657
+	echo 'install_gnu_social_markdown' >> $COMPLETION_FILE
658
+}
659
+
660
+# NOTE: deliberately there is no "exit 0"

+ 410
- 0
src/freedombone-app-gogs View File

@@ -0,0 +1,410 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Gogs functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+GIT_DOMAIN_NAME=
32
+GIT_CODE=
33
+GIT_ONION_PORT=8090
34
+GIT_DOMAIN_REPO="https://github.com/gogits/gogs"
35
+GIT_ADMIN_PASSWORD=
36
+GOGS_COMMIT='3fb4f7f4980b4339fd9ef6a3ba5b0acab83d264d'
37
+
38
+function install_gogs {
39
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
40
+		return
41
+	fi
42
+	if [ ! $GIT_DOMAIN_NAME ]; then
43
+		return
44
+	fi
45
+
46
+	function_check select_go_version
47
+	select_go_version
48
+
49
+	# update to the next commit
50
+	function_check
51
+	set_repo_commit $GOPATH/src/github.com/gogits/gogs "Gogs commit" "$GOGS_COMMIT" $GIT_DOMAIN_REPO
52
+
53
+	if grep -Fxq "install_gogs" $COMPLETION_FILE; then
54
+		return
55
+	fi
56
+
57
+	if [ -d $GOPATH/src/github.com/gogits ]; then
58
+		rm -rf $GOPATH/src/github.com/gogits
59
+	fi
60
+
61
+	if [ -d /home/git/gvm/pkgsets/go${GO_VERSION}/global/src/github.com/gogits ]; then
62
+		rm -rf /home/git/gvm/pkgsets/go${GO_VERSION}/global/src/github.com/gogits
63
+	fi
64
+
65
+	if [ -d /home/git/gogs-repositories ]; then
66
+		rm -rf /home/git/gogs-repositories
67
+	fi
68
+
69
+	if [ ! -d /home/git ]; then
70
+		# add a gogs user account
71
+		adduser --disabled-login --gecos 'Gogs' git
72
+	fi
73
+	if [ -d /home/git/Maildir ]; then
74
+		rm -rf /home/git/Maildir
75
+	fi
76
+
77
+	if [ -d $GOPATH/src/github.com/gogits ]; then
78
+		rm -rf $GOPATH/src/github.com/gogits
79
+	fi
80
+
81
+	# install Go
82
+	apt-get -y install golang libpam0g-dev
83
+	if ! grep -q "export GOPATH=" ~/.bashrc; then
84
+		echo "export GOPATH=$GOPATH" >> ~/.bashrc
85
+	else
86
+		sed -i "s|export GOPATH=.*|export GOPATH=$GOPATH|g" ~/.bashrc
87
+	fi
88
+	systemctl set-environment GOPATH=$GOPATH
89
+	if ! grep -q "systemctl set-environment GOPATH=" ~/.bashrc; then
90
+		echo "systemctl set-environment GOPATH=$GOPATH" >> ~/.bashrc
91
+	else
92
+		sed -i "s|systemctl set-environment GOPATH=.*|systemctl set-environment GOPATH=$GOPATH|g" ~/.bashrc
93
+	fi
94
+	if [ ! -d $GOPATH ]; then
95
+		mkdir -p $GOPATH
96
+	fi
97
+	GO_PACKAGE_MANAGER_REPO2=$(echo "$GO_PACKAGE_MANAGER_REPO" | sed 's|https://||g')
98
+	go get -u $GO_PACKAGE_MANAGER_REPO2
99
+	if [ ! "$?" = "0" ]; then
100
+		echo $'install_gogs: go get failed'
101
+		exit 479832
102
+	fi
103
+
104
+	# clone the repo
105
+	if [ ! -d $GOPATH/src/github.com/gogits ]; then
106
+		mkdir -p $GOPATH/src/github.com/gogits
107
+	fi
108
+	function_check git_clone
109
+	git_clone $GIT_DOMAIN_REPO $GOPATH/src/github.com/gogits/gogs
110
+	if [ ! -d $GOPATH/src/github.com/gogits/gogs ]; then
111
+		echo $"Unable to clone repo $GOPATH/src/github.com/gogits/gogs"
112
+		exit 85482
113
+	fi
114
+	cd $GOPATH/src/github.com/gogits/gogs
115
+
116
+	# install
117
+	go get -u ./...
118
+
119
+	git checkout $GOGS_COMMIT -b $GOGS_COMMIT
120
+	if ! grep -q "Gogs commit" $COMPLETION_FILE; then
121
+		echo "Gogs commit:$GOGS_COMMIT" >> $COMPLETION_FILE
122
+	else
123
+		sed -i "s/Gogs commit.*/Gogs commit:$GOGS_COMMIT/g" $COMPLETION_FILE
124
+	fi
125
+
126
+	go build
127
+	if [ ! "$?" = "0" ]; then
128
+		echo $'install_gogs: go build failed'
129
+		exit 546750
130
+	fi
131
+
132
+	function_check install_mariadb
133
+	install_mariadb
134
+
135
+	function_check get_mariadb_password
136
+	get_mariadb_password
137
+
138
+	function_check get_mariadb_git_admin_password
139
+	get_mariadb_git_admin_password
140
+	if [ ! $GIT_ADMIN_PASSWORD ]; then
141
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
142
+			GIT_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
143
+		else
144
+			GIT_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
145
+		fi
146
+	fi
147
+
148
+	if ! grep -q $"Gogs admin user password" /home/$MY_USERNAME/README; then
149
+		echo '' >> /home/$MY_USERNAME/README
150
+		echo '' >> /home/$MY_USERNAME/README
151
+		echo 'Gogs' >> /home/$MY_USERNAME/README
152
+		echo '====' >> /home/$MY_USERNAME/README
153
+		echo $'Install Steps For First-time Run:' >> /home/$MY_USERNAME/README
154
+		echo $'Leave email service settings empty' >> /home/$MY_USERNAME/README
155
+		echo $'Check "Enable Register Confirmation"' >> /home/$MY_USERNAME/README
156
+		echo $'Check "Enable Mail Notification"' >> /home/$MY_USERNAME/README
157
+		echo '' >> /home/$MY_USERNAME/README
158
+		echo $'If you want to disable new account registrations then append the following:' >> /home/$MY_USERNAME/README
159
+		echo '  [service]' >> /home/$MY_USERNAME/README
160
+		echo '  DISABLE_REGISTRATION = true' >> /home/$MY_USERNAME/README
161
+		echo $'Then restart with:' >> /home/$MY_USERNAME/README
162
+		echo '  systemctl restart gogs' >> /home/$MY_USERNAME/README
163
+		echo '' >> /home/$MY_USERNAME/README
164
+		echo $"Note that there's a usability/security trade-off made here." >> /home/$MY_USERNAME/README
165
+		echo $"In order to allow git clone via http we don't redirect everything" >> /home/$MY_USERNAME/README
166
+		echo $'over https. Instead only critical things such as user login,' >> /home/$MY_USERNAME/README
167
+		echo $'settings and admin are encrypted.' >> /home/$MY_USERNAME/README
168
+		echo $'There are also potential security issues with cloning/pulling/pushing' >> /home/$MY_USERNAME/README
169
+		echo $'code over http, since a determined adversary could inject malware' >> /home/$MY_USERNAME/README
170
+		echo $'into the stream as it passes, so beware.' >> /home/$MY_USERNAME/README
171
+		echo $'If you have a bought domain and a non-self signed cert then you' >> /home/$MY_USERNAME/README
172
+		echo $"should change /etc/nginx/sites-available/$GIT_DOMAIN_NAME to redirect everything over https." >> /home/$MY_USERNAME/README
173
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
174
+		chmod 600 /home/$MY_USERNAME/README
175
+	fi
176
+
177
+	function_check create_database
178
+	create_database gogs "$GOGS_ADMIN_PASSWORD"
179
+	if [ ! -f $GOPATH/src/github.com/gogits/gogs/scripts/mysql.sql ]; then
180
+		echo $'MySql template for Gogs was not found'
181
+		exit 72528
182
+	fi
183
+	function_check initialise_database
184
+	initialise_database gogs $GOPATH/src/github.com/gogits/gogs/scripts/mysql.sql
185
+
186
+	chmod 600 $GOPATH/src/github.com/gogits/gogs/custom/conf/app.ini
187
+
188
+	chown -R git:git /home/git
189
+	echo '[Unit]' > /etc/systemd/system/gogs.service
190
+	echo 'Description=Gogs (Go Git Service)' >> /etc/systemd/system/gogs.service
191
+	echo 'After=syslog.target' >> /etc/systemd/system/gogs.service
192
+	echo 'After=network.target' >> /etc/systemd/system/gogs.service
193
+	echo 'After=mysqld.service' >> /etc/systemd/system/gogs.service
194
+	echo '' >> /etc/systemd/system/gogs.service
195
+	echo '[Service]' >> /etc/systemd/system/gogs.service
196
+	echo '#LimitMEMLOCK=infinity' >> /etc/systemd/system/gogs.service
197
+	echo '#LimitNOFILE=65535' >> /etc/systemd/system/gogs.service
198
+	echo 'Type=simple' >> /etc/systemd/system/gogs.service
199
+	echo 'User=git' >> /etc/systemd/system/gogs.service
200
+	echo 'Group=git' >> /etc/systemd/system/gogs.service
201
+	echo "WorkingDirectory=$GOPATH/src/github.com/gogits/gogs" >> /etc/systemd/system/gogs.service
202
+	echo "ExecStart=$GOPATH/src/github.com/gogits/gogs/gogs web" >> /etc/systemd/system/gogs.service
203
+	echo 'Restart=always' >> /etc/systemd/system/gogs.service
204
+	echo 'RestartSec=10' >> /etc/systemd/system/gogs.service
205
+	echo 'TimeoutStartSec=120' >> /etc/systemd/system/gogs.service
206
+	echo "Environment=\"USER=git\" \"HOME=/home/git\" \"GOPATH=$GOPATH\" \"GVM_ROOT=$GVM_HOME\"" >> /etc/systemd/system/gogs.service
207
+	echo '' >> /etc/systemd/system/gogs.service
208
+	echo '[Install]' >> /etc/systemd/system/gogs.service
209
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/gogs.service
210
+
211
+	systemctl enable gogs
212
+	systemctl daemon-reload
213
+	systemctl restart gogs
214
+
215
+	if [ ! -d /var/www/$GIT_DOMAIN_NAME ]; then
216
+		mkdir /var/www/$GIT_DOMAIN_NAME
217
+	fi
218
+	if [ -d /var/www/$GIT_DOMAIN_NAME/htdocs ]; then
219
+		rm -rf /var/www/$GIT_DOMAIN_NAME/htdocs
220
+	fi
221
+
222
+	if [[ $ONION_ONLY == "no" ]]; then
223
+		function_check nginx_http_redirect
224
+		nginx_http_redirect $GIT_DOMAIN_NAME
225
+		echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
226
+		echo '    listen 443 ssl;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
227
+		echo "    root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
228
+		echo "    server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
229
+		echo '    access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
230
+		echo "    error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
231
+		echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
232
+		function_check nginx_limits
233
+		nginx_limits $GIT_DOMAIN_NAME '10G'
234
+		function_check nginx_ssl
235
+		nginx_ssl $GIT_DOMAIN_NAME
236
+		function_check nginx_disable_sniffing
237
+		nginx_disable_sniffing $GIT_DOMAIN_NAME
238
+		echo '    add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
239
+		echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
240
+		echo '    location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
241
+		echo '        proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
242
+		echo '    }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
243
+		echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
244
+		echo '    fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
245
+		echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
246
+		echo '    error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
247
+		echo '    error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
248
+		echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
249
+		echo '    location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
250
+		echo '        allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
251
+		echo '        log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
252
+		echo '        access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
253
+		echo '    }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
254
+		echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
255
+		echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
256
+	else
257
+		echo -n '' > /etc/nginx/sites-available/$GIT_DOMAIN_NAME
258
+	fi
259
+	echo 'server {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
260
+	echo "    listen 127.0.0.1:${GIT_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
261
+	echo "    root /var/www/$GIT_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
262
+	echo "    server_name $GIT_DOMAIN_NAME;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
263
+	echo '    access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
264
+	echo "    error_log /var/log/nginx/${GIT_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
265
+	echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
266
+	function_check nginx_limits
267
+	nginx_limits $GIT_DOMAIN_NAME '10G'
268
+	function_check nginx_disable_sniffing
269
+	nginx_disable_sniffing $GIT_DOMAIN_NAME
270
+	echo '    add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
271
+	echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
272
+	echo '    location / {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
273
+	echo '        proxy_pass http://localhost:3000;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
274
+	echo '    }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
275
+	echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
276
+	echo '    fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
277
+	echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
278
+	echo '    error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
279
+	echo '    error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
280
+	echo '' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
281
+	echo '    location = /robots.txt {' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
282
+	echo '        allow all;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
283
+	echo '        log_not_found off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
284
+	echo '        access_log off;' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
285
+	echo '    }' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
286
+	echo '}' >> /etc/nginx/sites-available/$GIT_DOMAIN_NAME
287
+
288
+	function_check configure_php
289
+	configure_php
290
+
291
+	function_check create_site_certificate
292
+	create_site_certificate $GIT_DOMAIN_NAME 'yes'
293
+
294
+	nginx_ensite $GIT_DOMAIN_NAME
295
+
296
+	if [ ! -d /var/lib/tor ]; then
297
+		echo $'No Tor installation found. Gogs onion site cannot be configured.'
298
+		exit 877367
299
+	fi
300
+	if ! grep -q "hidden_service_gogs" /etc/tor/torrc; then
301
+		echo 'HiddenServiceDir /var/lib/tor/hidden_service_gogs/' >> /etc/tor/torrc
302
+		echo "HiddenServicePort 80 127.0.0.1:${GIT_ONION_PORT}" >> /etc/tor/torrc
303
+		echo "HiddenServicePort 9418 127.0.0.1:9418" >> /etc/tor/torrc
304
+		echo $'Added onion site for Gogs'
305
+	fi
306
+
307
+	systemctl restart tor
308
+
309
+	function_check wait_for_onion_service
310
+	wait_for_onion_service 'gogs'
311
+
312
+	GIT_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_gogs/hostname)
313
+
314
+	systemctl restart php5-fpm
315
+	systemctl restart nginx
316
+
317
+	if ! grep -q "Gogs onion domain" /home/$MY_USERNAME/README; then
318
+		echo "Gogs onion domain: ${GIT_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
319
+		echo '' >> /home/$MY_USERNAME/README
320
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
321
+		chmod 600 /home/$MY_USERNAME/README
322
+	fi
323
+	if ! grep -q "Gogs onion domain" $COMPLETION_FILE; then
324
+		echo "Gogs onion domain:${GIT_ONION_HOSTNAME}" >> $COMPLETION_FILE
325
+	fi
326
+
327
+	function_check add_ddns_domain
328
+	add_ddns_domain $GIT_DOMAIN_NAME
329
+
330
+	# obtain the secret key
331
+	GOGS_SECRET_KEY=
332
+	if grep -q "Gogs secret key:" /home/$MY_USERNAME/README; then
333
+		GOGS_SECRET_KEY=$(cat /home/$MY_USERNAME/README | grep "Gogs secret key:" | awk -F ':' '{print $2}' | sed 's/^ *//')
334
+	else
335
+		GOGS_SECRET_KEY="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
336
+		echo "Gogs secret key:$GOGS_SECRET_KEY" >> /home/$MY_USERNAME/README
337
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
338
+	fi
339
+
340
+	# create the configuration
341
+	GOGS_CONFIG_PATH=/home/git/gvm/pkgsets/go${GO_VERSION}/global/src/github.com/gogits/gogs/custom/conf
342
+	if [ ! -d $GOGS_CONFIG_PATH ]; then
343
+		mkdir -p $GOGS_CONFIG_PATH
344
+	fi
345
+	GOGS_CONFIG_FILE=$GOGS_CONFIG_PATH/app.ini
346
+	echo 'RUN_USER = git' > $GOGS_CONFIG_FILE
347
+	echo 'RUN_MODE = prod' >> $GOGS_CONFIG_FILE
348
+	echo '' >> $GOGS_CONFIG_FILE
349
+	echo '[database]' >> $GOGS_CONFIG_FILE
350
+	echo 'DB_TYPE = mysql' >> $GOGS_CONFIG_FILE
351
+	echo 'HOST = 127.0.0.1:3306' >> $GOGS_CONFIG_FILE
352
+	echo 'NAME = gogs' >> $GOGS_CONFIG_FILE
353
+	echo 'USER = root' >> $GOGS_CONFIG_FILE
354
+	echo "PASSWD = $MARIADB_PASSWORD" >> $GOGS_CONFIG_FILE
355
+	echo 'SSL_MODE = disable' >> $GOGS_CONFIG_FILE
356
+	echo 'PATH = data/gogs.db' >> $GOGS_CONFIG_FILE
357
+	echo '' >> $GOGS_CONFIG_FILE
358
+	echo '[repository]' >> $GOGS_CONFIG_FILE
359
+	echo 'ROOT = /home/git/gogs-repositories' >> $GOGS_CONFIG_FILE
360
+	echo '' >> $GOGS_CONFIG_FILE
361
+	echo '[server]' >> $GOGS_CONFIG_FILE
362
+	if [[ $ONION_ONLY == 'no' ]]; then
363
+		echo "DOMAIN = ${GIT_DOMAIN_NAME}" >> $GOGS_CONFIG_FILE
364
+	else
365
+		echo "DOMAIN = ${GIT_ONION_HOSTNAME}" >> $GOGS_CONFIG_FILE
366
+	fi
367
+	echo 'HTTP_PORT = 3000' >> $GOGS_CONFIG_FILE
368
+	echo "ROOT_URL = http://$GIT_DOMAIN_NAME/" >> $GOGS_CONFIG_FILE
369
+	echo "SSH_PORT = $SSH_PORT" >> $GOGS_CONFIG_FILE
370
+	echo 'SSH_DOMAIN = %(DOMAIN)s' >> $GOGS_CONFIG_FILE
371
+	echo "CERT_FILE = /etc/ssl/certs/${GIT_DOMAIN_NAME}.crt" >> $GOGS_CONFIG_FILE
372
+	echo "KEY_FILE = /etc/ssl/private/${GIT_DOMAIN_NAME}.key" >> $GOGS_CONFIG_FILE
373
+	echo 'DISABLE_ROUTER_LOG = true' >> $GOGS_CONFIG_FILE
374
+	echo '' >> $GOGS_CONFIG_FILE
375
+	echo '[session]' >> $GOGS_CONFIG_FILE
376
+	echo 'PROVIDER = file' >> $GOGS_CONFIG_FILE
377
+	echo '' >> $GOGS_CONFIG_FILE
378
+	echo '[log]' >> $GOGS_CONFIG_FILE
379
+	echo 'MODE = file' >> $GOGS_CONFIG_FILE
380
+	echo 'LEVEL = Info' >> $GOGS_CONFIG_FILE
381
+	echo '' >> $GOGS_CONFIG_FILE
382
+	echo '[security]' >> $GOGS_CONFIG_FILE
383
+	echo 'INSTALL_LOCK = true' >> $GOGS_CONFIG_FILE
384
+	echo "SECRET_KEY = $GOGS_SECRET_KEY" >> $GOGS_CONFIG_FILE
385
+	echo '' >> $GOGS_CONFIG_FILE
386
+	echo '[service]' >> $GOGS_CONFIG_FILE
387
+	echo 'DISABLE_REGISTRATION = false' >> $GOGS_CONFIG_FILE
388
+	echo 'SHOW_REGISTRATION_BUTTON = true' >> $GOGS_CONFIG_FILE
389
+	echo 'REQUIRE_SIGNIN_VIEW = false' >> $GOGS_CONFIG_FILE
390
+	echo 'ENABLE_CAPTCHA = false' >> $GOGS_CONFIG_FILE
391
+	echo '' >> $GOGS_CONFIG_FILE
392
+	echo '[other]' >> $GOGS_CONFIG_FILE
393
+	echo 'SHOW_FOOTER_BRANDING = false' >> $GOGS_CONFIG_FILE
394
+	echo 'SHOW_FOOTER_VERSION = false' >> $GOGS_CONFIG_FILE
395
+
396
+	chmod 750 $GOGS_CONFIG_FILE
397
+	chown -R git:git /home/git
398
+
399
+	systemctl restart gogs
400
+
401
+	if ! grep -q "Gogs domain:" $COMPLETION_FILE; then
402
+		echo "Gogs domain:$GIT_DOMAIN_NAME" >> $COMPLETION_FILE
403
+	fi
404
+
405
+	function_check configure_firewall_for_git
406
+	configure_firewall_for_git
407
+	echo 'install_gogs' >> $COMPLETION_FILE
408
+}
409
+
410
+# NOTE: deliberately no exit 0

+ 388
- 0
src/freedombone-app-hubzilla View File

@@ -0,0 +1,388 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Hubzilla application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+HUBZILLA_DOMAIN_NAME=
32
+HUBZILLA_CODE=
33
+HUBZILLA_ONION_PORT=8085
34
+HUBZILLA_REPO="https://github.com/redmatrix/hubzilla.git"
35
+HUBZILLA_THEMES_REPO="https://github.com/DeadSuperHero/redmatrix-themes"
36
+HUBZILLA_ADDONS_REPO="https://github.com/redmatrix/hubzilla-addons.git"
37
+HUBZILLA_ADMIN_PASSWORD=
38
+HUBZILLA_COMMIT='2d79e75788aa71664a379c4cea0b6bfe3ab87ad0'
39
+HUBZILLA_ADDONS_COMMIT='67b40c7a40f328a93ee030eb15e9e1261f3cba64'
40
+
41
+function install_hubzilla {
42
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
43
+		return
44
+	fi
45
+	if [ ! $HUBZILLA_DOMAIN_NAME ]; then
46
+		return
47
+	fi
48
+
49
+	HUBZILLA_PATH=/var/www/$HUBZILLA_DOMAIN_NAME/htdocs
50
+
51
+	# update to a new commit if needed
52
+	function_check set_repo_commit
53
+	set_repo_commit $HUBZILLA_PATH "Hubzilla commit" "$HUBZILLA_COMMIT" $HUBZILLA_REPO
54
+	set_repo_commit $HUBZILLA_PATH/addon "Hubzilla addons commit" "$HUBZILLA_ADDONS_COMMIT" $HUBZILLA_ADDONS_REPO
55
+	if [ -d $HUBZILLA_PATH/redmatrix-themes1 ]; then
56
+		cd $HUBZILLA_PATH/redmatrix-themes1
57
+		git stash
58
+		git pull
59
+		cp -r $HUBZILLA_PATH/redmatrix-themes1/* $HUBZILLA_PATH/view/theme/
60
+		chown -R www-data:www-data $HUBZILLA_PATH
61
+	fi
62
+
63
+	if grep -Fxq "install_hubzilla" $COMPLETION_FILE; then
64
+		return
65
+	fi
66
+
67
+    function_check install_mariadb
68
+	install_mariadb
69
+
70
+    function_check get_mariadb_password
71
+    get_mariadb_password
72
+
73
+    function_check repair_databases_script
74
+    repair_databases_script
75
+
76
+	apt-get -y install php5-common php5-cli php5-curl php5-gd php5-mysql php5-mcrypt git
77
+	apt-get -y install php5-dev imagemagick php5-imagick
78
+	apt-get -y install php5-memcached
79
+
80
+	if [ ! -d /var/www/$HUBZILLA_DOMAIN_NAME ]; then
81
+		mkdir /var/www/$HUBZILLA_DOMAIN_NAME
82
+	fi
83
+	if [ ! -d $HUBZILLA_PATH ]; then
84
+		mkdir $HUBZILLA_PATH
85
+	fi
86
+
87
+	if [ ! -f $HUBZILLA_PATH/index.php ]; then
88
+		cd $INSTALL_DIR
89
+		function_check git_clone
90
+		git_clone $HUBZILLA_REPO hubzilla
91
+		git checkout $HUBZILLA_COMMIT -b $HUBZILLA_COMMIT
92
+		if ! grep -q "Hubzilla commit" $COMPLETION_FILE; then
93
+			echo "Hubzilla commit:$HUBZILLA_COMMIT" >> $COMPLETION_FILE
94
+		else
95
+			sed -i "s/Hubzilla commit.*/Hubzilla commit:$HUBZILLA_COMMIT/g" $COMPLETION_FILE
96
+		fi
97
+
98
+		rm -rf $HUBZILLA_PATH
99
+		mv hubzilla $HUBZILLA_PATH
100
+
101
+		git_clone $HUBZILLA_ADDONS_REPO $HUBZILLA_PATH/addon
102
+		cd $HUBZILLA_PATH/addon
103
+		git checkout $HUBZILLA_ADDONS_COMMIT -b $HUBZILLA_ADDONS_COMMIT
104
+		if ! grep -q "Hubzilla addons commit" $COMPLETION_FILE; then
105
+			echo "Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT" >> $COMPLETION_FILE
106
+		else
107
+			sed -i "s/Hubzilla addons commit.*/Hubzilla addons commit:$HUBZILLA_ADDONS_COMMIT/g" $COMPLETION_FILE
108
+		fi
109
+
110
+		# some extra themes
111
+		git_clone $HUBZILLA_THEMES_REPO $HUBZILLA_PATH/redmatrix-themes1
112
+		cp -r $HUBZILLA_PATH/redmatrix-themes1/* $HUBZILLA_PATH/view/theme/
113
+
114
+		chown -R www-data:www-data $HUBZILLA_PATH
115
+	fi
116
+
117
+	HUBZILLA_ONION_HOSTNAME=
118
+	if [[ $ONION_ONLY != "no" ]]; then
119
+		HUBZILLA_ONION_HOSTNAME=$(add_onion_service hubzilla 80 ${HUBZILLA_ONION_PORT})
120
+		echo "Hubzilla onion domain:${HUBZILLA_ONION_HOSTNAME}" >> $COMPLETION_FILE
121
+	fi
122
+
123
+    function_check get_mariadb_hubzilla_admin_password
124
+	get_mariadb_hubzilla_admin_password
125
+	if [ ! $HUBZILLA_ADMIN_PASSWORD ]; then
126
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
127
+			HUBZILLA_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
128
+		else
129
+			HUBZILLA_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
130
+		fi
131
+		echo '' >> /home/$MY_USERNAME/README
132
+		echo '' >> /home/$MY_USERNAME/README
133
+		echo 'Hubzilla' >> /home/$MY_USERNAME/README
134
+		echo '========' >> /home/$MY_USERNAME/README
135
+		if [[ $ONION_ONLY == 'no' ]]; then
136
+			echo $"Open https://$HUBZILLA_DOMAIN_NAME and register a new user" >> /home/$MY_USERNAME/README
137
+		else
138
+			echo $"Open http://$HUBZILLA_ONION_HOSTNAME and register a new user" >> /home/$MY_USERNAME/README
139
+		fi
140
+		echo $"Your MariaDB Hubzilla admin password is: $HUBZILLA_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
141
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
142
+		chmod 600 /home/$MY_USERNAME/README
143
+	fi
144
+
145
+    function_check create_database
146
+	create_database hubzilla "$HUBZILLA_ADMIN_PASSWORD"
147
+
148
+	if ! grep -q "$HUBZILLA_PATH" /etc/crontab; then
149
+		echo "12,22,32,42,52 * *   *   *   root cd $HUBZILLA_PATH; /usr/bin/timeout 500 /usr/bin/php include/poller.php" >> /etc/crontab
150
+	fi
151
+
152
+    function check add_ddns_domain
153
+	add_ddns_domain $HUBZILLA_DOMAIN_NAME
154
+
155
+	if [[ $ONION_ONLY == "no" ]]; then
156
+	    function_check nginx_http_redirect
157
+		nginx_http_redirect $HUBZILLA_DOMAIN_NAME
158
+		echo 'server {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
159
+		echo '    listen 443 ssl;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
160
+		echo "    root $HUBZILLA_PATH;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
161
+		echo "    server_name $HUBZILLA_DOMAIN_NAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
162
+		echo "    error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
163
+		echo '    index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
164
+		echo '    charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
165
+		echo '    access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
166
+		function_check nginx_limits
167
+		nginx_limits $HUBZILLA_DOMAIN_NAME
168
+		function_check nginx_ssl
169
+		nginx_ssl $HUBZILLA_DOMAIN_NAME
170
+		function_check nginx_disable_sniffing
171
+		nginx_disable_sniffing $HUBZILLA_DOMAIN_NAME
172
+		echo '    add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
173
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
174
+		echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
175
+		echo '    location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
176
+		echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
177
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
178
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
179
+		echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
180
+		echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
181
+		echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
182
+		echo '        allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
183
+		echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
184
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
185
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
186
+		echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
187
+		echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
188
+		echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
189
+		echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
190
+		echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
191
+		echo '        expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
192
+		echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
193
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
194
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
195
+		echo '    # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
196
+		echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
197
+		echo '        deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
198
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
199
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
200
+		echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
201
+		echo '    # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
202
+		echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
203
+		echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
204
+		echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
205
+		echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
206
+		echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
207
+		echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
208
+		echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
209
+		echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
210
+		echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
211
+		echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
212
+		echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
213
+		echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
214
+		echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
215
+		echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
216
+		echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
217
+		echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
218
+		echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
219
+		echo '        fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
220
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
221
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
222
+		echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
223
+		echo '    location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
224
+		echo '        deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
225
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
226
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
227
+		echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
228
+		echo '      deny  all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
229
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
230
+		echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
231
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
232
+	else
233
+		echo 'server {' > /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
234
+		echo "    listen 127.0.0.1:${HUBZILLA_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
235
+		echo "    root $HUBZILLA_PATH;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
236
+		echo "    server_name $HUBZILLA_ONION_HOSTNAME;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
237
+		echo "    error_log /var/log/nginx/${HUBZILLA_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
238
+		echo '    index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
239
+		echo '    charset utf-8;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
240
+		echo '    access_log off;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
241
+		nginx_limits $HUBZILLA_DOMAIN_NAME
242
+		nginx_disable_sniffing $HUBZILLA_DOMAIN_NAME
243
+		echo '    add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
244
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
245
+		echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
246
+		echo '    location / {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
247
+		echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
248
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
249
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
250
+		echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
251
+		echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
252
+		echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
253
+		echo '        allow all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
254
+		echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
255
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
256
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
257
+		echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
258
+		echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
259
+		echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
260
+		echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
261
+		echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
262
+		echo '        expires 30d;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
263
+		echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
264
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
265
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
266
+		echo '    # block these file types' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
267
+		echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
268
+		echo '        deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
269
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
270
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
271
+		echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
272
+		echo '    # or a unix socket' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
273
+		echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
274
+		echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
275
+		echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
276
+		echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
277
+		echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
278
+		echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
279
+		echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
280
+		echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
281
+		echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
282
+		echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
283
+		echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
284
+		echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
285
+		echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
286
+		echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
287
+		echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
288
+		echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
289
+		echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
290
+		echo '        fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
291
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
292
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
293
+		echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
294
+		echo '    location ~ /\. {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
295
+		echo '        deny all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
296
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
297
+		echo '' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
298
+		echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
299
+		echo '      deny  all;' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
300
+		echo '    }' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
301
+		echo '}' >> /etc/nginx/sites-available/$HUBZILLA_DOMAIN_NAME
302
+	fi
303
+
304
+    function_check configure_php
305
+	configure_php
306
+
307
+    function_check create_site_certificate
308
+	create_site_certificate $HUBZILLA_DOMAIN_NAME 'yes'
309
+
310
+	if [ ! -d $HUBZILLA_PATH/view/tpl/smarty3 ]; then
311
+		mkdir $HUBZILLA_PATH/view/tpl/smarty3
312
+	fi
313
+	if [ ! -d "$HUBZILLA_PATH/store" ]; then
314
+		mkdir "$HUBZILLA_PATH/store"
315
+	fi
316
+	if [ ! -d "$HUBZILLA_PATH/store/[data]" ]; then
317
+		mkdir "$HUBZILLA_PATH/store/[data]"
318
+	fi
319
+	if [ ! -d "$HUBZILLA_PATH/store/[data]/smarty3" ]; then
320
+		mkdir "$HUBZILLA_PATH/store/[data]/smarty3"
321
+		chmod 777 "$HUBZILLA_PATH/store/[data]/smarty3"
322
+	fi
323
+	chmod 777 $HUBZILLA_PATH/view/tpl
324
+	chown -R www-data:www-data "$HUBZILLA_PATH/store"
325
+	chmod 777 $HUBZILLA_PATH/view/tpl/smarty3
326
+
327
+	# Ensure that the database gets backed up locally, if remote
328
+	# backups are not being used
329
+	function_check backup_databases_script_header
330
+	backup_databases_script_header
331
+
332
+    function_check backup_database_local
333
+	backup_database_local hubzilla
334
+
335
+	chown -R www-data:www-data $HUBZILLA_PATH
336
+
337
+    function_check nginx_ensite
338
+	nginx_ensite $HUBZILLA_DOMAIN_NAME
339
+
340
+	# initialize the database
341
+	if [ ! -f $HUBZILLA_PATH/install/schema_mysql.sql ]; then
342
+		echo $'No database schema found for hubzilla'
343
+		exit 252782
344
+	fi
345
+	function_check initialise_database
346
+	initialise_database hubzilla $HUBZILLA_PATH/install/schema_mysql.sql
347
+
348
+	# create the config file
349
+	echo '<?php' > $HUBZILLA_PATH/.htconfig.php
350
+	echo "\$db_host = 'localhost';" >> $HUBZILLA_PATH/.htconfig.php
351
+	echo "\$db_port = '0';" >> $HUBZILLA_PATH/.htconfig.php
352
+	echo "\$db_user = 'root';" >> $HUBZILLA_PATH/.htconfig.php
353
+	echo "\$db_pass = '${MARIADB_PASSWORD}';" >> $HUBZILLA_PATH/.htconfig.php
354
+	echo "\$db_data = 'hubzilla';" >> $HUBZILLA_PATH/.htconfig.php
355
+	echo "\$db_type = '0';" >> $HUBZILLA_PATH/.htconfig.php
356
+	echo "\$default_timezone = 'Europe/London';" >> $HUBZILLA_PATH/.htconfig.php
357
+	if [[ $ONION_ONLY == 'no' ]]; then
358
+		echo "\$a->config['system']['baseurl'] = 'https://${HUBZILLA_DOMAIN_NAME}';" >> $HUBZILLA_PATH/.htconfig.php
359
+	else
360
+		echo "\$a->config['system']['baseurl'] = 'http://${HUBZILLA_ONION_HOSTNAME}';" >> $HUBZILLA_PATH/.htconfig.php
361
+	fi
362
+	echo "\$a->config['system']['sitename'] = \"Hubzilla\";" >> $HUBZILLA_PATH/.htconfig.php
363
+	HUBZILLA_LOCATION_HASH="$(create_password 30)"
364
+	echo "\$a->config['system']['location_hash'] = '${HUBZILLA_LOCATION_HASH}';" >> $HUBZILLA_PATH/.htconfig.php
365
+	echo "\$a->config['system']['register_policy'] = REGISTER_OPEN;" >> $HUBZILLA_PATH/.htconfig.php
366
+	echo "\$a->config['system']['register_text'] = '';" >> $HUBZILLA_PATH/.htconfig.php
367
+	echo "\$a->config['system']['admin_email'] = '${MY_EMAIL_ADDRESS}';" >> $HUBZILLA_PATH/.htconfig.php
368
+	echo "\$a->config['system']['verify_email'] = 1;" >> $HUBZILLA_PATH/.htconfig.php
369
+	echo "\$a->config['system']['access_policy'] = ACCESS_PRIVATE;" >> $HUBZILLA_PATH/.htconfig.php
370
+	echo "\$a->config['system']['sellpage'] = '';" >> $HUBZILLA_PATH/.htconfig.php
371
+	echo "\$a->config['system']['max_import_size'] = 200000;" >> $HUBZILLA_PATH/.htconfig.php
372
+	echo "\$a->config['system']['php_path'] = '/usr/bin/php';" >> $HUBZILLA_PATH/.htconfig.php
373
+	echo "\$a->config['system']['directory_mode']  = DIRECTORY_MODE_NORMAL;" >> $HUBZILLA_PATH/.htconfig.php
374
+	echo "\$a->config['system']['theme'] = 'redbasic';" >> $HUBZILLA_PATH/.htconfig.php
375
+	chown www-data:www-data $HUBZILLA_PATH/.htconfig.php
376
+	chmod 755 $HUBZILLA_PATH/.htconfig.php
377
+
378
+	systemctl restart php5-fpm
379
+	systemctl restart nginx
380
+	systemctl restart cron
381
+
382
+	freedombone-addemail -u $MY_USERNAME -e "noreply@$HUBZILLA_DOMAIN_NAME" -g hubzilla --public no
383
+
384
+	echo "Hubzilla domain:${HUBZILLA_DOMAIN_NAME}" >> $COMPLETION_FILE
385
+	echo 'install_hubzilla' >> $COMPLETION_FILE
386
+}
387
+
388
+# NOTE: deliberately there is no "exit 0"

+ 88
- 0
src/freedombone-app-intrusion View File

@@ -0,0 +1,88 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Intrusion detection application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function intrusion_detection {
32
+	if grep -Fxq "intrusion_detection" $COMPLETION_FILE; then
33
+		return
34
+	fi
35
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
36
+		return
37
+	fi
38
+	apt-get -y install tripwire
39
+	apt-get -y autoremove
40
+	cd /etc/tripwire
41
+	cp site.key $DEFAULT_DOMAIN_NAME-site.key
42
+	echo '*** Installing intrusion detection ***'
43
+	echo '
44
+
45
+' | tripwire --init
46
+
47
+	# make a script for easy resetting of the tripwire
48
+	echo '#!/bin/sh' > /usr/bin/reset-tripwire
49
+	echo 'tripwire --update-policy --secure-mode low /etc/tripwire/twpol.txt' >> /usr/bin/reset-tripwire
50
+	chmod +x /usr/bin/reset-tripwire
51
+
52
+	sed -i 's/SYSLOGREPORTING.*/SYSLOGREPORTING =false/g' /etc/tripwire/twcfg.txt
53
+	# only send emails if something has changed
54
+	sed -i 's|MAILNOVIOLATIONS.*|MAILNOVIOLATIONS = false|g' /etc/tripwire/twcfg.txt
55
+	sed -i '/# These files change the behavior of the root account/,/}/ s/.*//g' /etc/tripwire/twpol.txt
56
+	sed -i 's|/etc/rc.boot.*||g' /etc/tripwire/twpol.txt
57
+	# Don't show any changes to /proc
58
+	sed -i 's|/proc.*||g' /etc/tripwire/twpol.txt
59
+	# Don't report log changes
60
+	sed -i 's|/var/log.*||g' /etc/tripwire/twpol.txt
61
+	# Ignore /etc/tripwire
62
+	if ! grep -q '!/etc/tripwire' /etc/tripwire/twpol.txt; then
63
+		sed -i '\|/etc\t\t->.*|a\    !/etc/tripwire ;' /etc/tripwire/twpol.txt
64
+	fi
65
+	# ignore tt-rss cache
66
+	if ! grep -q '!/etc/share/tt-rss/cache' /etc/tripwire/twpol.txt; then
67
+		sed -i '\|/etc\t\t->.*|a\    !/etc/share/tt-rss/cache ;' /etc/tripwire/twpol.txt
68
+	fi
69
+	if ! grep -q '!/etc/share/tt-rss/lock' /etc/tripwire/twpol.txt; then
70
+		sed -i '\|/etc\t\t->.*|a\    !/etc/share/tt-rss/lock ;' /etc/tripwire/twpol.txt
71
+	fi
72
+	# Avoid logging the changed database
73
+	sed -i 's|$(TWETC)/tw.pol.*||g' /etc/tripwire/twpol.txt
74
+	# recreate the configuration
75
+	echo '
76
+
77
+	   ' | twadmin --create-cfgfile -S /etc/tripwire/site.key /etc/tripwire/twcfg.txt
78
+	# reset
79
+	echo '
80
+
81
+
82
+
83
+	   ' | reset-tripwire
84
+
85
+	echo 'intrusion_detection' >> $COMPLETION_FILE
86
+}
87
+
88
+# NOTE: deliberately no exit 0

+ 167
- 0
src/freedombone-app-ipfs View File

@@ -0,0 +1,167 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# ipfs functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+IPFS_GO_REPO="https://github.com/ipfs/go-ipfs"
32
+IPFS_COMMIT='20b06a4cbce8884f5b194da6e98cb11f2c77f166'
33
+IPFS_PORT=4001
34
+
35
+function install_ipfs {
36
+	if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
37
+		return
38
+	fi
39
+
40
+	function_check select_go_version
41
+	select_go_version
42
+
43
+	# update to the next commit
44
+	function_check set_repo_commit
45
+	set_repo_commit $GOPATH/src/github.com/ipfs/go-ipfs "ipfs commit" "$IPFS_COMMIT" $IPFS_REPO
46
+
47
+	if grep -Fxq "install_ipfs" $COMPLETION_FILE; then
48
+		return
49
+	fi
50
+
51
+	apt-get -y install golang libpam0g-dev fuse
52
+
53
+	if [ ! -d /home/git ]; then
54
+		# add a gogs user account
55
+		adduser --disabled-login --gecos 'Gogs' git
56
+
57
+		# install Go
58
+		if ! grep -q "export GOPATH=" ~/.bashrc; then
59
+			echo "export GOPATH=$GOPATH" >> ~/.bashrc
60
+		else
61
+			sed -i "s|export GOPATH=.*|export GOPATH=$GOPATH|g" ~/.bashrc
62
+		fi
63
+		systemctl set-environment GOPATH=$GOPATH
64
+		if ! grep -q "systemctl set-environment GOPATH=" ~/.bashrc; then
65
+			echo "systemctl set-environment GOPATH=$GOPATH" >> ~/.bashrc
66
+		else
67
+			sed -i "s|systemctl set-environment GOPATH=.*|systemctl set-environment GOPATH=$GOPATH|g" ~/.bashrc
68
+		fi
69
+		if [ ! -d $GOPATH ]; then
70
+			mkdir -p $GOPATH
71
+		fi
72
+	fi
73
+
74
+	IPFS_PATH=$GOPATH/bin
75
+	export PATH="$GOPATH/bin:$PATH:"
76
+	if ! grep -q 'GOPATH/bin' ~/.bashrc; then
77
+		echo 'export PATH="$GOPATH/bin:$PATH:";' >> ~/.bashrc
78
+	else
79
+		sed -i "s|systemctl set-environment GOPATH=.*|systemctl set-environment GOPATH=$GOPATH|g" ~/.bashrc
80
+	fi
81
+
82
+	# set gopath for the user
83
+	if ! grep -q "GOPATH=" /home/$MY_USERNAME/.bashrc; then
84
+		echo "export GOPATH=$GOPATH" >> /home/$MY_USERNAME/.bashrc
85
+		echo 'export PATH="$GOPATH/bin:$PATH:";' >> /home/$MY_USERNAME/.bashrc
86
+	else
87
+		sed -i "s|export GOPATH=.*|export GOPATH=$GOPATH|g" /home/$MY_USERNAME/.bashrc
88
+	fi
89
+	chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.bashrc
90
+
91
+	IPFS_GO_REPO2=$(echo "$IPFS_GO_REPO" | sed 's|https://||g')
92
+	go get -u ${IPFS_GO_REPO2}/cmd/ipfs
93
+	if [ ! "$?" = "0" ]; then
94
+		exit 8242
95
+	fi
96
+
97
+	cd $GOPATH/src/$IPFS_GO_REPO2
98
+	git checkout $IPFS_COMMIT -b $IPFS_COMMIT
99
+	if ! grep -q "ipfs commit" $COMPLETION_FILE; then
100
+		echo "ipfs commit:$IPFS_COMMIT" >> $COMPLETION_FILE
101
+	else
102
+		sed -i "s/ipfs commit.*/ipfs commit:$IPFS_COMMIT/g" $COMPLETION_FILE
103
+	fi
104
+
105
+	# initialise
106
+	su -c "$IPFS_PATH/ipfs init -b 4096" - $MY_USERNAME
107
+	if [ ! -d /home/$MY_USERNAME/.ipfs ]; then
108
+		echo "IPFS could not be initialised for user $MY_USERNAME"
109
+		exit 7358
110
+	fi
111
+
112
+	# directories to mount to
113
+	if [ ! -d /ipfs ]; then
114
+		mkdir /ipfs
115
+		mkdir /ipns
116
+		chown $MY_USERNAME:$MY_USERNAME /ipfs
117
+		chown $MY_USERNAME:$MY_USERNAME /ipns
118
+	fi
119
+
120
+	if [ -f /etc/fuse.conf ]; then
121
+		chown $MY_USERNAME:$MY_USERNAME /etc/fuse.conf
122
+	fi
123
+	if [ -f /dev/fuse ]; then
124
+		chown $MY_USERNAME:$MY_USERNAME /dev/fuse
125
+	fi
126
+
127
+	echo '[Unit]' > /etc/systemd/system/ipfs.service
128
+	echo 'Description=IPFS daemon' >> /etc/systemd/system/ipfs.service
129
+	echo 'After=syslog.target' >> /etc/systemd/system/ipfs.service
130
+	echo 'After=network.target' >> /etc/systemd/system/ipfs.service
131
+	echo '' >> /etc/systemd/system/ipfs.service
132
+	echo '[Service]' >> /etc/systemd/system/ipfs.service
133
+	echo 'Type=simple' >> /etc/systemd/system/ipfs.service
134
+	echo "User=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
135
+	echo "Group=$MY_USERNAME" >> /etc/systemd/system/ipfs.service
136
+	echo "WorkingDirectory=/home/$MY_USERNAME" >> /etc/systemd/system/ipfs.service
137
+	echo "ExecStart=$IPFS_PATH/ipfs daemon --mount" >> /etc/systemd/system/ipfs.service
138
+	echo 'Restart=on-failure' >> /etc/systemd/system/ipfs.service
139
+	echo "Environment=\"USER=$MY_USERNAME\" \"HOME=/home/$MY_USERNAME\" \"GOPATH=$GOPATH\" \"GVM_ROOT=$GVM_HOME\"" >> /etc/systemd/system/ipfs.service
140
+	echo '' >> /etc/systemd/system/ipfs.service
141
+	echo '[Install]' >> /etc/systemd/system/ipfs.service
142
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ipfs.service
143
+
144
+	systemctl enable ipfs
145
+	systemctl daemon-reload
146
+	systemctl restart ipfs
147
+
148
+	if [ -d /etc/avahi ]; then
149
+		su -c "echo $($IPFS_PATH/ipfs id | grep '\"ID\":' | awk -F '\"' '{print $4}') > /tmp/ipfsid" - $MY_USERNAME
150
+		if [ ! -f /tmp/ipfsid ]; then
151
+			echo 'No IPFS identity was created'
152
+			exit 37895
153
+		fi
154
+		IPFS_PEER_ID=$(cat /tmp/ipfsid)
155
+		if [ ${#IPFS_PEER_ID} -lt 10 ]; then
156
+			echo 'Invalid IPFS peer ID'
157
+			echo "$IPFS_PEER_ID"
158
+			exit 74782
159
+		fi
160
+		# Add an avahi service
161
+		function_check create_avahi_service
162
+		create_avahi_service ipfs "ipfs" udp $IPFS_PORT "$IPFS_PEER_ID"
163
+		rm /tmp/ipfsid
164
+	fi
165
+
166
+	echo 'install_ipfs' >> $COMPLETION_FILE
167
+}

+ 239
- 0
src/freedombone-app-irc View File

@@ -0,0 +1,239 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# IRC server application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+IRC_PORT=6697
32
+IRC_ONION_PORT=6697
33
+
34
+# An optional password to log into IRC. This applies to all users
35
+IRC_PASSWORD=
36
+
37
+function install_irc_server {
38
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
39
+		return
40
+	fi
41
+	if grep -Fxq "install_irc_server" $COMPLETION_FILE; then
42
+		return
43
+	fi
44
+	apt-get -y install ngircd
45
+
46
+	if [ ! -d /etc/ngircd ]; then
47
+		echo $"ERROR: ngircd does not appear to have installed. $CHECK_MESSAGE"
48
+		exit 53
49
+	fi
50
+
51
+	if [ ! -f /etc/ssl/certs/ngircd.dhparam ]; then
52
+		${PROJECT_NAME}-addcert -h ngircd --dhkey $DH_KEYLENGTH
53
+		function_check check_certificates
54
+		check_certificates ngircd
55
+	fi
56
+
57
+	DEFAULTDOMAIN=$DEFAULT_DOMAIN_NAME
58
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
59
+		DEFAULTDOMAIN="${DEFAULT_DOMAIN_NAME}.local"
60
+	fi
61
+
62
+	# create a login password if needed
63
+	if [ ! $IRC_PASSWORD ]; then
64
+		IRC_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
65
+	fi
66
+
67
+	echo '**************************************************' > /etc/ngircd/motd
68
+	echo $'*           F R E E D O M B O N E   I R C        *' >> /etc/ngircd/motd
69
+	echo '*                                                *' >> /etc/ngircd/motd
70
+	echo $'*               Freedom in the Cloud             *' >> /etc/ngircd/motd
71
+	echo '**************************************************' >> /etc/ngircd/motd
72
+	sed -i 's|MotdFile = /etc/ngircd/ngircd.motd|MotdFile = /etc/ngircd/motd|g' /etc/ngircd/ngircd.conf
73
+	sed -i "s/irc@irc.example.com/$MY_EMAIL_ADDRESS/g" /etc/ngircd/ngircd.conf
74
+	sed -i "s/irc.example.net/$DEFAULTDOMAIN/g" /etc/ngircd/ngircd.conf
75
+	sed -i "s|Yet another IRC Server running on Debian GNU/Linux|IRC Server of $DEFAULTDOMAIN|g" /etc/ngircd/ngircd.conf
76
+	sed -i 's/;Password = wealllikedebian/Password =/g' /etc/ngircd/ngircd.conf
77
+	sed -i 's|;CertFile = /etc/ssl/certs/server.crt|CertFile = /etc/ssl/certs/ngircd.crt|g' /etc/ngircd/ngircd.conf
78
+	sed -i 's|;DHFile = /etc/ngircd/dhparams.pem|DHFile = /etc/ssl/certs/ngircd.dhparam|g' /etc/ngircd/ngircd.conf
79
+	sed -i 's|;KeyFile = /etc/ssl/private/server.key|KeyFile = /etc/ssl/private/ngircd.key|g' /etc/ngircd/ngircd.conf
80
+	sed -i "s/;Ports =.*/Ports = $IRC_PORT/1" /etc/ngircd/ngircd.conf
81
+	sed -i "s/;Ports =.*/Ports = $IRC_PORT/2" /etc/ngircd/ngircd.conf
82
+	sed -i "s/;Name = #ngircd/Name = #${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
83
+	sed -i "s/;Topic = Our ngircd testing channel/Topic = ${PROJECT_NAME} chat channel/g" /etc/ngircd/ngircd.conf
84
+	sed -i 's/;MaxUsers = 23/MaxUsers = 23/g' /etc/ngircd/ngircd.conf
85
+	sed -i "s|;KeyFile = /etc/ngircd/#chan.key|KeyFile = /etc/ngircd/#${PROJECT_NAME}.key|g" /etc/ngircd/ngircd.conf
86
+	sed -i "s/;CloakHost = cloaked.host/CloakHost = ${PROJECT_NAME}/g" /etc/ngircd/ngircd.conf
87
+	IRC_SALT="$(create_password 30)"
88
+	if [ -f $IMAGE_PASSWORD_FILE ]; then
89
+		IRC_OPERATOR_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
90
+	else
91
+		IRC_OPERATOR_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
92
+	fi
93
+	sed -i "s|;CloakHostSalt = abcdefghijklmnopqrstuvwxyz|CloakHostSalt = $IRC_SALT|g" /etc/ngircd/ngircd.conf
94
+	sed -i 's/;ConnectIPv4 = yes/ConnectIPv4 = yes/g' /etc/ngircd/ngircd.conf
95
+	sed -i 's/;MorePrivacy = no/MorePrivacy = yes/g' /etc/ngircd/ngircd.conf
96
+	sed -i 's/;RequireAuthPing = no/RequireAuthPing = no/g' /etc/ngircd/ngircd.conf
97
+	sed -i "s/;Name = TheOper/Name = $MY_USERNAME/g" /etc/ngircd/ngircd.conf
98
+	sed -i "s/;Password = ThePwd/Password = $IRC_OPERATOR_PASSWORD/g" /etc/ngircd/ngircd.conf
99
+	sed -i 's|;Listen =.*|Listen = 0.0.0.0,0.0.0.0:9050,127.0.0.1,127.0.0.1:9050|g' /etc/ngircd/ngircd.conf
100
+	if [ $IRC_PASSWORD ]; then
101
+		sed -i "0,/RE/s/Password =.*/Password =$IRC_PASSWORD/" /etc/ngircd/ngircd.conf
102
+	fi
103
+	# If we are on a mesh then DNS is not available
104
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
105
+		sed -i "s/;DNS =.*/DNS = no/g" /etc/ngircd/ngircd.conf
106
+	fi
107
+	# upgrade a cypher
108
+	sed -i 's|SECURE128|SECURE256|g' /etc/ngircd/ngircd.conf
109
+	mkdir /var/run/ircd
110
+	chown -R irc:irc /var/run/ircd
111
+	mkdir /var/run/ngircd
112
+	touch /var/run/ngircd/ngircd.pid
113
+	chown -R irc:irc /var/run/ngircd
114
+
115
+	IRC_ONION_HOSTNAME=$(add_onion_service irc ${IRC_PORT} ${IRC_ONION_PORT})
116
+	if ! grep -q $"IRC onion domain" $COMPLETION_FILE; then
117
+		echo "IRC onion domain:$IRC_ONION_HOSTNAME" >> $COMPLETION_FILE
118
+	fi
119
+
120
+	systemctl restart ngircd
121
+
122
+	# keep the daemon running
123
+	echo '' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
124
+	echo '# keep irc daemon running' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
125
+	echo 'IRC_RUNNING=$(pgrep ngircd > /dev/null && echo Running)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
126
+	echo 'if [ ! $IRC_RUNNING ]; then' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
127
+	echo '  systemctl start ngircd' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
128
+	echo '  echo -n $CURRENT_DATE >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
129
+	echo '  echo " IRC daemon restarted" >> $LOGFILE' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
130
+	echo 'fi' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
131
+
132
+	if ! grep -q $"IRC Server" /home/$MY_USERNAME/README; then
133
+		echo '' >> /home/$MY_USERNAME/README
134
+		echo '' >> /home/$MY_USERNAME/README
135
+		echo $'IRC Server' >> /home/$MY_USERNAME/README
136
+		echo '==========' >> /home/$MY_USERNAME/README
137
+		echo $'To connect to your IRC server in irssi:' >> /home/$MY_USERNAME/README
138
+		echo '' >> /home/$MY_USERNAME/README
139
+		if [[ $ONION_ONLY != 'yes' ]]; then
140
+			echo "  irssi" >> /home/$MY_USERNAME/README
141
+			echo "  /server add -auto -ssl $DEFAULTDOMAIN $IRC_PORT" >> /home/$MY_USERNAME/README
142
+			echo "  /connect $DEFAULT_DOMAIN_NAME" >> /home/$MY_USERNAME/README
143
+		else
144
+			echo "  usetorwith irssi" >> /home/$MY_USERNAME/README
145
+			echo "  /server add -auto $IRC_ONION_HOSTNAME $IRC_PORT" >> /home/$MY_USERNAME/README
146
+			echo "  /connect $IRC_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
147
+		fi
148
+		echo "  /join #${PROJECT_NAME}" >> /home/$MY_USERNAME/README
149
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
150
+		chmod 600 /home/$MY_USERNAME/README
151
+	fi
152
+
153
+	function_check configure_firewall_for_irc
154
+	configure_firewall_for_irc
155
+	echo 'install_irc_server' >> $COMPLETION_FILE
156
+}
157
+
158
+function install_irc_client {
159
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
160
+		return
161
+	fi
162
+	if grep -Fxq "install_irc_client" $COMPLETION_FILE; then
163
+		return
164
+	fi
165
+	apt-get -y install irssi
166
+
167
+	if [ ! -d /home/$MY_USERNAME/.irssi ]; then
168
+		mkdir /home/$MY_USERNAME/.irssi
169
+	fi
170
+
171
+	echo 'servers = (' > /home/$MY_USERNAME/.irssi/config
172
+	echo '  {' >> /home/$MY_USERNAME/.irssi/config
173
+	echo '    address = "chat.freenode.net";' >> /home/$MY_USERNAME/.irssi/config
174
+	echo '    chatnet = "Freenode";' >> /home/$MY_USERNAME/.irssi/config
175
+	echo '    port = "6667";' >> /home/$MY_USERNAME/.irssi/config
176
+	echo '    autoconnect = "no";' >> /home/$MY_USERNAME/.irssi/config
177
+	echo '  },' >> /home/$MY_USERNAME/.irssi/config
178
+	echo '  {' >> /home/$MY_USERNAME/.irssi/config
179
+	echo '    address = "irc.oftc.net";' >> /home/$MY_USERNAME/.irssi/config
180
+	echo '    chatnet = "OFTC";' >> /home/$MY_USERNAME/.irssi/config
181
+	echo '    port = "6667";' >> /home/$MY_USERNAME/.irssi/config
182
+	echo '    autoconnect = "yes";' >> /home/$MY_USERNAME/.irssi/config
183
+	echo '  },' >> /home/$MY_USERNAME/.irssi/config
184
+	echo '  {' >> /home/$MY_USERNAME/.irssi/config
185
+	echo "    address = \"127.0.0.1\";" >> /home/$MY_USERNAME/.irssi/config
186
+	if [[ $ONION_ONLY == 'no' ]]; then
187
+		echo "    port = \"${IRC_PORT}\";" >> /home/$MY_USERNAME/.irssi/config
188
+		echo '    use_ssl = "yes";' >> /home/$MY_USERNAME/.irssi/config
189
+	else
190
+		IRC_ONION_HOSTNAME=$(cat $COMPLETION_FILE | grep "IRC onion domain" | awk -F ':' '{print $2}')
191
+		echo "    port = \"${IRC_ONION_PORT}\";" >> /home/$MY_USERNAME/.irssi/config
192
+		echo '    use_ssl = "no";' >> /home/$MY_USERNAME/.irssi/config
193
+	fi
194
+	echo '    chatnet = "Freedombone";' >> /home/$MY_USERNAME/.irssi/config
195
+	echo '    ssl_verify = "no";' >> /home/$MY_USERNAME/.irssi/config
196
+	echo '    autoconnect = "yes";' >> /home/$MY_USERNAME/.irssi/config
197
+	if [ $IRC_PASSWORD ]; then
198
+		echo "    password = \"${IRC_PASSWORD}\";" >> /home/$MY_USERNAME/.irssi/config
199
+	fi
200
+	echo '  }' >> /home/$MY_USERNAME/.irssi/config
201
+	echo ');' >> /home/$MY_USERNAME/.irssi/config
202
+	echo '' >> /home/$MY_USERNAME/.irssi/config
203
+	echo 'chatnets = {' >> /home/$MY_USERNAME/.irssi/config
204
+	echo '  Freedombone = {' >> /home/$MY_USERNAME/.irssi/config
205
+	echo '    type = "IRC";' >> /home/$MY_USERNAME/.irssi/config
206
+	echo '    max_kicks = "1";' >> /home/$MY_USERNAME/.irssi/config
207
+	echo '    max_msgs = "4";' >> /home/$MY_USERNAME/.irssi/config
208
+	echo '    max_whois = "1";' >> /home/$MY_USERNAME/.irssi/config
209
+	echo '  };' >> /home/$MY_USERNAME/.irssi/config
210
+	echo '  Freenode = {' >> /home/$MY_USERNAME/.irssi/config
211
+	echo '    type = "IRC";' >> /home/$MY_USERNAME/.irssi/config
212
+	echo '    max_kicks = "1";' >> /home/$MY_USERNAME/.irssi/config
213
+	echo '    max_msgs = "4";' >> /home/$MY_USERNAME/.irssi/config
214
+	echo '    max_whois = "1";' >> /home/$MY_USERNAME/.irssi/config
215
+	echo '  };' >> /home/$MY_USERNAME/.irssi/config
216
+	echo '  OFTC = {' >> /home/$MY_USERNAME/.irssi/config
217
+	echo '    type = "IRC";' >> /home/$MY_USERNAME/.irssi/config
218
+	echo '    max_kicks = "1";' >> /home/$MY_USERNAME/.irssi/config
219
+	echo '    max_msgs = "1";' >> /home/$MY_USERNAME/.irssi/config
220
+	echo '    max_whois = "1";' >> /home/$MY_USERNAME/.irssi/config
221
+	echo '  };' >> /home/$MY_USERNAME/.irssi/config
222
+	echo '};' >> /home/$MY_USERNAME/.irssi/config
223
+	echo '' >> /home/$MY_USERNAME/.irssi/config
224
+	echo 'channels = (' >> /home/$MY_USERNAME/.irssi/config
225
+	echo '  { name = "#freedombone"; chatnet = "Freedombone"; autojoin = "Yes"; },' >> /home/$MY_USERNAME/.irssi/config
226
+	echo ');' >> /home/$MY_USERNAME/.irssi/config
227
+	echo '' >> /home/$MY_USERNAME/.irssi/config
228
+	echo 'settings = {' >> /home/$MY_USERNAME/.irssi/config
229
+	echo "  core = { real_name = \"$MY_NAME\"; user_name = \"$MY_USERNAME\"; nick = \"$MY_USERNAME\"; };" >> /home/$MY_USERNAME/.irssi/config
230
+	echo '  "fe-text" = { actlist_sort = "refnum"; };' >> /home/$MY_USERNAME/.irssi/config
231
+	echo '};' >> /home/$MY_USERNAME/.irssi/config
232
+	echo 'ignores = ( { level = "CTCPS"; } );' >> /home/$MY_USERNAME/.irssi/config
233
+
234
+	chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.irssi
235
+
236
+	echo 'install_irc_client' >> $COMPLETION_FILE
237
+}
238
+
239
+# NOTE: deliberately no exit 0

+ 370
- 0
src/freedombone-app-mediagoblin View File

@@ -0,0 +1,370 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# mediagoblin functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+MEDIAGOBLIN_DOMAIN_NAME=
32
+MEDIAGOBLIN_CODE=
33
+MEDIAGOBLIN_REPO="git://git.savannah.gnu.org/mediagoblin.git"
34
+MEDIAGOBLIN_COMMIT='d1ac2d52fd8859c3f32fa38e4836ffe9615e5bba'
35
+MEDIAGOBLIN_ADMIN_PASSWORD=
36
+MEDIAGOBLIN_ONION_PORT=8096
37
+
38
+function install_mediagoblin {
39
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
40
+		return
41
+	fi
42
+	if [ ! $MEDIAGOBLIN_DOMAIN_NAME ]; then
43
+		return
44
+	fi
45
+
46
+	MEDIAGOBLIN_WORKING_DIRECTORY=/var/www/$MEDIAGOBLIN_DOMAIN_NAME/htdocs
47
+
48
+	# update to a new commit if needed
49
+	function_check set_repo_commit
50
+	set_repo_commit $MEDIAGOBLIN_WORKING_DIRECTORY "Mediagoblin commit" "$MEDIAGOBLIN_COMMIT" $MEDIAGOBLIN_REPO
51
+	if [ -d $MEDIAGOBLIN_WORKING_DIRECTORY ]; then
52
+		chown -hR mediagoblin:www-data $MEDIAGOBLIN_WORKING_DIRECTORY
53
+	fi
54
+
55
+	if grep -Fxq "install_mediagoblin" $COMPLETION_FILE; then
56
+		return
57
+	fi
58
+
59
+	apt-get -y install git-core python python-dev python-lxml python-pil
60
+	apt-get -y install python-virtualenv npm nodejs-legacy automake
61
+	apt-get -y install fcgiwrap
62
+
63
+	#apt-get -y install postgresql postgresql-client python-psycopg2
64
+	#apt-get -y install python-gst-1.0 libjpeg62-turbo-dev gstreamer1.0-plugins-base python-gobject
65
+	#apt-get -y install gstreamer1.0-plugins-good gstreamer1.0-libav libav-tools gstreamer0.10-tools
66
+	#apt-get -y install python-numpy python-scipy libsndfile1-dev python-gst0.10-dev
67
+	#apt-get -y install gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer1.0-tools
68
+	#su -c "createuser -A -D mediagoblin" - postgres
69
+	#su -c "createdb -E UNICODE -O mediagoblin mediagoblin" - postgres
70
+
71
+	useradd -c "GNU MediaGoblin system account" -d /var/lib/mediagoblin -m -r -g www-data mediagoblin
72
+	groupadd mediagoblin
73
+	usermod --append -G mediagoblin mediagoblin
74
+
75
+	if [ ! -d $MEDIAGOBLIN_WORKING_DIRECTORY ]; then
76
+		mkdir -p $MEDIAGOBLIN_WORKING_DIRECTORY
77
+	fi
78
+
79
+	function_check git_clone
80
+	git_clone $MEDIAGOBLIN_REPO $MEDIAGOBLIN_WORKING_DIRECTORY
81
+	cd $MEDIAGOBLIN_WORKING_DIRECTORY
82
+	git checkout $MEDIAGOBLIN_COMMIT -b $MEDIAGOBLIN_COMMIT
83
+	git submodule init
84
+	git submodule update
85
+
86
+	if ! grep -q "Mediagoblin commit" $COMPLETION_FILE; then
87
+		echo "Mediagoblin commit:$MEDIAGOBLIN_COMMIT" >> $COMPLETION_FILE
88
+	else
89
+		sed -i "s/Mediagoblin commit.*/Mediagoblin commit:$MEDIAGOBLIN_COMMIT/g" $COMPLETION_FILE
90
+	fi
91
+
92
+	chown -hR mediagoblin:www-data $MEDIAGOBLIN_WORKING_DIRECTORY
93
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bootstrap.sh" - mediagoblin
94
+	if [ ! "$?" = "0" ]; then
95
+		exit 278826
96
+	fi
97
+
98
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./configure" - mediagoblin
99
+	if [ ! "$?" = "0" ]; then
100
+		exit 462826
101
+	fi
102
+
103
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && make" - mediagoblin
104
+	if [ ! "$?" = "0" ]; then
105
+		exit 738229
106
+	fi
107
+
108
+	if [ ! -d $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev ]; then
109
+		mkdir $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev
110
+	fi
111
+	chmod 750 $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev
112
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install flup==1.0.3.dev-20110405" - mediagoblin
113
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade billiard" - mediagoblin
114
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade Paste" - mediagoblin
115
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade amqp" - mediagoblin
116
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade anyjson" - mediagoblin
117
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade py-bcrypt" - mediagoblin
118
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade wtforms" - mediagoblin
119
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade python-dateutil" - mediagoblin
120
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade alembic" - mediagoblin
121
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade waitress" - mediagoblin
122
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade imagesize" - mediagoblin
123
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade alabaster" - mediagoblin
124
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade snowballstemmer" - mediagoblin
125
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade docutils" - mediagoblin
126
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade Pygments" - mediagoblin
127
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade beautifulsoup4" - mediagoblin
128
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade WebOb" - mediagoblin
129
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade py" - mediagoblin
130
+	su -c "cd $MEDIAGOBLIN_WORKING_DIRECTORY && ./bin/easy_install --upgrade execnet" - mediagoblin
131
+
132
+	# create some directories
133
+	mkdir /var/log/mediagoblin
134
+	chown -hR mediagoblin:www-data /var/log/mediagoblin
135
+	mkdir /var/run/mediagoblin
136
+	chown -hR mediagoblin:www-data /var/run/mediagoblin
137
+
138
+	if [ ! -f $MEDIAGOBLIN_WORKING_DIRECTORY/mediagoblin.ini ]; then
139
+		echo $'mediagoblin.ini not found'
140
+		exit 737529
141
+	fi
142
+	if [ ! -f $MEDIAGOBLIN_WORKING_DIRECTORY/paste.ini ]; then
143
+		echo $'paste.ini not found'
144
+		exit 52762
145
+	fi
146
+
147
+	cp -av mediagoblin.ini mediagoblin_local.ini
148
+	cp -av paste.ini paste_local.ini
149
+
150
+	chown -hR mediagoblin:www-data $MEDIAGOBLIN_WORKING_DIRECTORY
151
+
152
+	# init with systemd
153
+	echo '[Unit]' > /etc/systemd/system/mediagoblin-celeryd.service
154
+	echo 'Description=Mediagoblin Celeryd' >> /etc/systemd/system/mediagoblin-celeryd.service
155
+	echo 'After=syslog.target' >> /etc/systemd/system/mediagoblin-celeryd.service
156
+	echo 'After=network.target' >> /etc/systemd/system/mediagoblin-celeryd.service
157
+	echo '' >> /etc/systemd/system/mediagoblin-celeryd.service
158
+	echo '[Service]' >> /etc/systemd/system/mediagoblin-celeryd.service
159
+	echo 'User=mediagoblin' >> /etc/systemd/system/mediagoblin-celeryd.service
160
+	echo 'Group=mediagoblin' >> /etc/systemd/system/mediagoblin-celeryd.service
161
+	echo 'Type=simple' >> /etc/systemd/system/mediagoblin-celeryd.service
162
+	echo "WorkingDirectory=$MEDIAGOBLIN_WORKING_DIRECTORY" >> /etc/systemd/system/mediagoblin-celeryd.service
163
+	echo "Environment=MEDIAGOBLIN_CONFIG=$MEDIAGOBLIN_WORKING_DIRECTORY/mediagoblin_local.ini \\" >> /etc/systemd/system/mediagoblin-celeryd.service
164
+	echo '    CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery' >> /etc/systemd/system/mediagoblin-celeryd.service
165
+	echo "ExecStart=$MEDIAGOBLIN_WORKING_DIRECTORY/bin/celery worker \\" >> /etc/systemd/system/mediagoblin-celeryd.service
166
+	echo '    --logfile=/var/log/mediagoblin/celery.log \' >> /etc/systemd/system/mediagoblin-celeryd.service
167
+	echo '    --loglevel=INFO' >> /etc/systemd/system/mediagoblin-celeryd.service
168
+	echo 'PIDFile=/var/run/mediagoblin/mediagoblin-celeryd.pid' >> /etc/systemd/system/mediagoblin-celeryd.service
169
+	echo '' >> /etc/systemd/system/mediagoblin-celeryd.service
170
+	echo '[Install]' >> /etc/systemd/system/mediagoblin-celeryd.service
171
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/mediagoblin-celeryd.service
172
+
173
+	echo '[Unit]' > /etc/systemd/system/mediagoblin-paster.service
174
+	echo 'Description=Mediagoblin' >> /etc/systemd/system/mediagoblin-paster.service
175
+	echo 'After=syslog.target' >> /etc/systemd/system/mediagoblin-paster.service
176
+	echo 'After=network.target' >> /etc/systemd/system/mediagoblin-paster.service
177
+	echo '' >> /etc/systemd/system/mediagoblin-paster.service
178
+	echo '[Service]' >> /etc/systemd/system/mediagoblin-paster.service
179
+	echo 'Type=forking' >> /etc/systemd/system/mediagoblin-paster.service
180
+	echo 'User=mediagoblin' >> /etc/systemd/system/mediagoblin-paster.service
181
+	echo 'Group=mediagoblin' >> /etc/systemd/system/mediagoblin-paster.service
182
+	echo 'Environment=CELERY_ALWAYS_EAGER=false' >> /etc/systemd/system/mediagoblin-paster.service
183
+	echo "WorkingDirectory=$MEDIAGOBLIN_WORKING_DIRECTORY" >> /etc/systemd/system/mediagoblin-paster.service
184
+	echo "ExecStart=$MEDIAGOBLIN_WORKING_DIRECTORY/bin/paster serve \\" >> /etc/systemd/system/mediagoblin-paster.service
185
+	echo "    $MEDIAGOBLIN_WORKING_DIRECTORY/paste_local.ini \\" >> /etc/systemd/system/mediagoblin-paster.service
186
+	echo '    --pid-file=/var/run/mediagoblin/mediagoblin.pid \' >> /etc/systemd/system/mediagoblin-paster.service
187
+	echo '    --log-file=/var/log/mediagoblin/mediagoblin.log \' >> /etc/systemd/system/mediagoblin-paster.service
188
+	echo '    --daemon \' >> /etc/systemd/system/mediagoblin-paster.service
189
+	echo '    --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543' >> /etc/systemd/system/mediagoblin-paster.service
190
+	echo "ExecStop=$MEDIAGOBLIN_WORKING_DIRECTORY/bin/paster serve \\" >> /etc/systemd/system/mediagoblin-paster.service
191
+	echo '    --pid-file=/var/run/mediagoblin/mediagoblin.pid \' >> /etc/systemd/system/mediagoblin-paster.service
192
+	echo "    $MEDIAGOBLIN_WORKING_DIRECTORY/paste_local.ini stop" >> /etc/systemd/system/mediagoblin-paster.service
193
+	echo 'PIDFile=/var/run/mediagoblin/mediagoblin.pid' >> /etc/systemd/system/mediagoblin-paster.service
194
+	echo '' >> /etc/systemd/system/mediagoblin-paster.service
195
+	echo '[Install]' >> /etc/systemd/system/mediagoblin-paster.service
196
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/mediagoblin-paster.service
197
+	systemctl daemon-reload
198
+	systemctl enable mediagoblin-celeryd
199
+	systemctl enable mediagoblin-paster
200
+	systemctl daemon-reload
201
+	systemctl start mediagoblin-celeryd
202
+	systemctl start mediagoblin-paster
203
+
204
+	MEDIAGOBLIN_ONION_HOSTNAME=$(add_onion_service mediagoblin 80 ${MEDIAGOBLIN_ONION_PORT})
205
+	if ! grep -q "Mediagoblin onion domain" $COMPLETION_FILE; then
206
+		echo "Mediagoblin onion domain:${MEDIAGOBLIN_ONION_HOSTNAME}" >> $COMPLETION_FILE
207
+	else
208
+		sed -i "s|Mediagoblin onion domain.*|Mediagoblin onion domain:${MEDIAGOBLIN_ONION_HOSTNAME}|g" $COMPLETION_FILE
209
+	fi
210
+	if [[ $MEDIAGOBLIN_ONION_HOSTNAME == *"not found"* ]]; then
211
+		echo $'Problem creating onion address for mediagoblin'
212
+		exit 672652
213
+	fi
214
+
215
+	# web config
216
+	MEDIAGOBLIN_VIRTUAL_HOST=/etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
217
+	function_check nginx_http_redirect
218
+	nginx_http_redirect $MEDIAGOBLIN_DOMAIN_NAME
219
+	if [[ $ONION_ONLY == 'no' ]]; then
220
+		echo 'server {' >> $MEDIAGOBLIN_VIRTUAL_HOST
221
+		echo '  listen 443 ssl;' >> $MEDIAGOBLIN_VIRTUAL_HOST
222
+		echo '  #################################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
223
+		echo '  # Stock useful config options, but ignore them :)' >> $MEDIAGOBLIN_VIRTUAL_HOST
224
+		echo '  #################################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
225
+		echo '  include /etc/nginx/mime.types;' >> $MEDIAGOBLIN_VIRTUAL_HOST
226
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
227
+		echo '  autoindex off;' >> $MEDIAGOBLIN_VIRTUAL_HOST
228
+		echo '  default_type  application/octet-stream;' >> $MEDIAGOBLIN_VIRTUAL_HOST
229
+		echo '  sendfile on;' >> $MEDIAGOBLIN_VIRTUAL_HOST
230
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
231
+		function_check nginx_limits
232
+		nginx_limits $MEDIAGOBLIN_DOMAIN_NAME '20m'
233
+		function_check nginx_ssl
234
+		nginx_ssl $MEDIAGOBLIN_DOMAIN_NAME
235
+		function_check nginx_disable_sniffing
236
+		nginx_disable_sniffing $MEDIAGOBLIN_DOMAIN_NAME
237
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
238
+		echo '  # Gzip' >> $MEDIAGOBLIN_VIRTUAL_HOST
239
+		echo '  gzip on;' >> $MEDIAGOBLIN_VIRTUAL_HOST
240
+		echo '  gzip_min_length 1024;' >> $MEDIAGOBLIN_VIRTUAL_HOST
241
+		echo '  gzip_buffers 4 32k;' >> $MEDIAGOBLIN_VIRTUAL_HOST
242
+		echo '  gzip_types text/plain application/x-javascript text/javascript text/xml text/css;' >> $MEDIAGOBLIN_VIRTUAL_HOST
243
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
244
+		echo '  #####################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
245
+		echo '  # Mounting MediaGoblin stuff' >> $MEDIAGOBLIN_VIRTUAL_HOST
246
+		echo '  # This is the section you should read' >> $MEDIAGOBLIN_VIRTUAL_HOST
247
+		echo '  #####################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
248
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
249
+		echo "  server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> $MEDIAGOBLIN_VIRTUAL_HOST
250
+		echo '  access_log /var/log/nginx/mediagoblin.log;' >> $MEDIAGOBLIN_VIRTUAL_HOST
251
+		echo '  error_log /var/log/nginx/mediagoblin.error.log;' >> $MEDIAGOBLIN_VIRTUAL_HOST
252
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
253
+		echo '  # MediaGoblins stock static files: CSS, JS, etc.' >> $MEDIAGOBLIN_VIRTUAL_HOST
254
+		echo '  location /mgoblin_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
255
+		echo "    alias $MEDIAGOBLIN_WORKING_DIRECTORY/mediagoblin/static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
256
+		echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
257
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
258
+		echo '  # Instance specific media:' >> $MEDIAGOBLIN_VIRTUAL_HOST
259
+		echo '  location /mgoblin_media/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
260
+		echo "    alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/media/public/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
261
+		echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
262
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
263
+		echo '  # Theme static files (usually symlinked in)' >> $MEDIAGOBLIN_VIRTUAL_HOST
264
+		echo '  location /theme_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
265
+		echo "    alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/theme_static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
266
+		echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
267
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
268
+		echo '  # Plugin static files (usually symlinked in)' >> $MEDIAGOBLIN_VIRTUAL_HOST
269
+		echo '  location /plugin_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
270
+		echo "    alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/plugin_static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
271
+		echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
272
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
273
+		echo '  # Mounting MediaGoblin itself via FastCGI.' >> $MEDIAGOBLIN_VIRTUAL_HOST
274
+		echo '  location / {' >> $MEDIAGOBLIN_VIRTUAL_HOST
275
+		echo '    fastcgi_pass 127.0.0.1:26543;' >> $MEDIAGOBLIN_VIRTUAL_HOST
276
+		echo '    include /etc/nginx/fastcgi_params;' >> $MEDIAGOBLIN_VIRTUAL_HOST
277
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
278
+		echo '    # our understanding vs nginxs handling of script_name vs' >> $MEDIAGOBLIN_VIRTUAL_HOST
279
+		echo '      # path_info dont match :)' >> $MEDIAGOBLIN_VIRTUAL_HOST
280
+		echo '    fastcgi_param PATH_INFO $fastcgi_script_name;' >> $MEDIAGOBLIN_VIRTUAL_HOST
281
+		echo '    fastcgi_param SCRIPT_NAME "";' >> $MEDIAGOBLIN_VIRTUAL_HOST
282
+		echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
283
+		echo '}' >> $MEDIAGOBLIN_VIRTUAL_HOST
284
+		echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
285
+	else
286
+		echo -n '' > $MEDIAGOBLIN_VIRTUAL_HOST
287
+	fi
288
+
289
+	echo 'server {' >> $MEDIAGOBLIN_VIRTUAL_HOST
290
+	echo "  listen 127.0.0.1:${MEDIAGOBLIN_ONION_PORT} default_server;" >> $MEDIAGOBLIN_VIRTUAL_HOST
291
+	echo '  #################################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
292
+	echo '  # Stock useful config options, but ignore them :)' >> $MEDIAGOBLIN_VIRTUAL_HOST
293
+	echo '  #################################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
294
+	echo '  include /etc/nginx/mime.types;' >> $MEDIAGOBLIN_VIRTUAL_HOST
295
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
296
+	echo '  autoindex off;' >> $MEDIAGOBLIN_VIRTUAL_HOST
297
+	echo '  default_type  application/octet-stream;' >> $MEDIAGOBLIN_VIRTUAL_HOST
298
+	echo '  sendfile on;' >> $MEDIAGOBLIN_VIRTUAL_HOST
299
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
300
+	function_check nginx_limits
301
+	nginx_limits $MEDIAGOBLIN_DOMAIN_NAME '20m'
302
+	function_check nginx_disable_sniffing
303
+	nginx_disable_sniffing $MEDIAGOBLIN_DOMAIN_NAME
304
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
305
+	echo '  # Gzip' >> $MEDIAGOBLIN_VIRTUAL_HOST
306
+	echo '  gzip on;' >> $MEDIAGOBLIN_VIRTUAL_HOST
307
+	echo '  gzip_min_length 1024;' >> $MEDIAGOBLIN_VIRTUAL_HOST
308
+	echo '  gzip_buffers 4 32k;' >> $MEDIAGOBLIN_VIRTUAL_HOST
309
+	echo '  gzip_types text/plain application/x-javascript text/javascript text/xml text/css;' >> $MEDIAGOBLIN_VIRTUAL_HOST
310
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
311
+	echo '  #####################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
312
+	echo '  # Mounting MediaGoblin stuff' >> $MEDIAGOBLIN_VIRTUAL_HOST
313
+	echo '  # This is the section you should read' >> $MEDIAGOBLIN_VIRTUAL_HOST
314
+	echo '  #####################################' >> $MEDIAGOBLIN_VIRTUAL_HOST
315
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
316
+	echo "  server_name $MEDIAGOBLIN_ONION_HOSTNAME;" >> $MEDIAGOBLIN_VIRTUAL_HOST
317
+	echo '  access_log /var/log/nginx/mediagoblin.log;' >> $MEDIAGOBLIN_VIRTUAL_HOST
318
+	echo '  error_log /var/log/nginx/mediagoblin.error.log;' >> $MEDIAGOBLIN_VIRTUAL_HOST
319
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
320
+	echo '  # MediaGoblins stock static files: CSS, JS, etc.' >> $MEDIAGOBLIN_VIRTUAL_HOST
321
+	echo '  location /mgoblin_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
322
+	echo "    alias $MEDIAGOBLIN_WORKING_DIRECTORY/mediagoblin/static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
323
+	echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
324
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
325
+	echo '  # Instance specific media:' >> $MEDIAGOBLIN_VIRTUAL_HOST
326
+	echo '  location /mgoblin_media/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
327
+	echo "    alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/media/public/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
328
+	echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
329
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
330
+	echo '  # Theme static files (usually symlinked in)' >> $MEDIAGOBLIN_VIRTUAL_HOST
331
+	echo '  location /theme_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
332
+	echo "    alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/theme_static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
333
+	echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
334
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
335
+	echo '  # Plugin static files (usually symlinked in)' >> $MEDIAGOBLIN_VIRTUAL_HOST
336
+	echo '  location /plugin_static/ {' >> $MEDIAGOBLIN_VIRTUAL_HOST
337
+	echo "    alias $MEDIAGOBLIN_WORKING_DIRECTORY/user_dev/plugin_static/;" >> $MEDIAGOBLIN_VIRTUAL_HOST
338
+	echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
339
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
340
+	echo '  # Mounting MediaGoblin itself via FastCGI.' >> $MEDIAGOBLIN_VIRTUAL_HOST
341
+	echo '  location / {' >> $MEDIAGOBLIN_VIRTUAL_HOST
342
+	echo '    fastcgi_pass 127.0.0.1:26543;' >> $MEDIAGOBLIN_VIRTUAL_HOST
343
+	echo '    include /etc/nginx/fastcgi_params;' >> $MEDIAGOBLIN_VIRTUAL_HOST
344
+	echo '' >> $MEDIAGOBLIN_VIRTUAL_HOST
345
+	echo '    # our understanding vs nginxs handling of script_name vs' >> $MEDIAGOBLIN_VIRTUAL_HOST
346
+	echo '      # path_info dont match :)' >> $MEDIAGOBLIN_VIRTUAL_HOST
347
+	echo '    fastcgi_param PATH_INFO $fastcgi_script_name;' >> $MEDIAGOBLIN_VIRTUAL_HOST
348
+	echo '    fastcgi_param SCRIPT_NAME "";' >> $MEDIAGOBLIN_VIRTUAL_HOST
349
+	echo '  }' >> $MEDIAGOBLIN_VIRTUAL_HOST
350
+	echo '}' >> $MEDIAGOBLIN_VIRTUAL_HOST
351
+
352
+	function_check create_site_certificate
353
+	create_site_certificate $MEDIAGOBLIN_DOMAIN_NAME
354
+
355
+	nginx_ensite $MEDIAGOBLIN_DOMAIN_NAME
356
+	systemctl restart php5-fpm
357
+	systemctl restart nginx
358
+
359
+	add_ddns_domain $MEDIAGOBLIN_DOMAIN_NAME
360
+
361
+	if ! grep -q "Mediagoblin domain" $COMPLETION_FILE; then
362
+		echo "Mediagoblin domain:$MEDIAGOBLIN_DOMAIN_NAME" >> $COMPLETION_FILE
363
+	else
364
+		sed -i "s/Mediagoblin domain.*/Mediagoblin domain:$MEDIAGOBLIN_DOMAIN_NAME/g" $COMPLETION_FILE
365
+	fi
366
+
367
+	echo 'install_mediagoblin' >> $COMPLETION_FILE
368
+}
369
+
370
+# NOTE: deliberately no exit 0

+ 159
- 0
src/freedombone-app-mumble View File

@@ -0,0 +1,159 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Mumble application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# Password used for VoIP server
32
+VOIP_SERVER_PASSWORD=
33
+# Port on which VoIP server listens
34
+VOIP_PORT=64738
35
+
36
+# Location of VoIP database and configuration
37
+VOIP_DATABASE="mumble-server.sqlite"
38
+VOIP_CONFIG_FILE="mumble-server.ini"
39
+
40
+function get_voip_server_password {
41
+	if [ -f /home/$MY_USERNAME/README ]; then
42
+		if grep -q "VoIP server password" /home/$MY_USERNAME/README; then
43
+			if [ ! $VOIP_SERVER_PASSWORD ]; then
44
+				VOIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "VoIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
45
+			fi
46
+		else
47
+			if grep -q "Mumble server password" /home/$MY_USERNAME/README; then
48
+				if [ ! $VOIP_SERVER_PASSWORD ]; then
49
+					VOIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Mumble server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
50
+				fi
51
+			fi
52
+		fi
53
+	fi
54
+}
55
+
56
+function install_mumble {
57
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
58
+		return
59
+	fi
60
+	if grep -Fxq "install_mumble" $COMPLETION_FILE; then
61
+		return
62
+	fi
63
+	if grep -Fxq "install_voip" $COMPLETION_FILE; then
64
+		return
65
+	fi
66
+	apt-get -y install mumble-server
67
+
68
+	function_check get_voip_server_password
69
+	get_voip_server_password
70
+	if [ ! $VOIP_SERVER_PASSWORD ]; then
71
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
72
+			VOIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
73
+		else
74
+			VOIP_SERVER_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
75
+			if [ ${#VOIP_SERVER_PASSWORD} -lt $MINIMUM_PASSWORD_LENGTH ]; then
76
+				VOIP_SERVER_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
77
+			fi
78
+		fi
79
+	fi
80
+
81
+	# Make an ssl cert for the server
82
+	if [ ! -f /etc/ssl/certs/mumble.dhparam ]; then
83
+		${PROJECT_NAME}-addcert -h mumble --dhkey $DH_KEYLENGTH
84
+		function_check check_certificates
85
+		check_certificates mumble
86
+	fi
87
+
88
+	# Check that the cert was created
89
+	if [ ! -f /etc/ssl/certs/mumble.crt ]; then
90
+		echo $'VoIP server certificate not created'
91
+		exit 57892
92
+	fi
93
+	if [ ! -f /etc/ssl/private/mumble.key ]; then
94
+		echo $'VoIP server key not created'
95
+		exit 57893
96
+	fi
97
+	if [ ! -d /var/lib/mumble-server ]; then
98
+		mkdir /var/lib/mumble-server
99
+	fi
100
+	cp /etc/ssl/certs/mumble.* /var/lib/mumble-server
101
+	cp /etc/ssl/private/mumble.key /var/lib/mumble-server
102
+	chown -R mumble-server:mumble-server /var/lib/mumble-server
103
+
104
+	sed -i "s|welcometext=.*|welcometext=\"<br />Welcome to $DEFAULT_DOMAIN_NAME <b>VoIP</b>.<br />Chat freely!<br />\"|g" /etc/mumble-server.ini
105
+
106
+	if [[ $VOIP_SERVER_PASSWORD && $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
107
+		sed -i "s|serverpassword=.*|serverpassword=$VOIP_SERVER_PASSWORD|g" /etc/mumble-server.ini
108
+	fi
109
+
110
+	sed -i 's|#autobanAttempts.*|autobanAttempts = 10|g' /etc/mumble-server.ini
111
+	sed -i 's|#autobanTimeframe.*|autobanTimeframe = 120|g' /etc/mumble-server.ini
112
+	sed -i 's|#autobanTime.*|autobanTime = 300|g' /etc/mumble-server.ini
113
+	sed -i 's|#sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
114
+	sed -i 's|sendversion=.*|sendversion=False|g' /etc/mumble-server.ini
115
+	if ! grep -q "allowping" /etc/mumble-server.ini; then
116
+		echo 'allowping=False' >> /etc/mumble-server.ini
117
+	fi
118
+	sed -i 's|allowping=.*|allowping=False|g' /etc/mumble-server.ini
119
+	sed -i 's|#sslCert=.*|sslCert=/var/lib/mumble-server/mumble.crt|g' /etc/mumble-server.ini
120
+	sed -i 's|#sslKey=.*|sslKey=/var/lib/mumble-server/mumble.key|g' /etc/mumble-server.ini
121
+	sed -i 's|#certrequired=.*|certrequired=True|g' /etc/mumble-server.ini
122
+	sed -i 's|users=100|users=10|g' /etc/mumble-server.ini
123
+	sed -i 's|#channelnestinglimit=10|channelnestinglimit=10|g' /etc/mumble-server.ini
124
+	sed -i 's|#textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
125
+	sed -i 's|textmessagelength=.*|textmessagelength=1000|g' /etc/mumble-server.ini
126
+	sed -i 's|#imagemessagelength=.*|imagemessagelength=131072|g' /etc/mumble-server.ini
127
+	sed -i 's|#allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
128
+	sed -i 's|allowhtml=.*|allowhtml=False|g' /etc/mumble-server.ini
129
+	sed -i "s|port=.*|port=${VOIP_PORT}|g" /etc/mumble-server.ini
130
+
131
+	VOIP_ONION_HOSTNAME=$(add_onion_service voip ${VOIP_PORT} ${VOIP_PORT})
132
+	if ! grep -q $"VoIP onion domain" $COMPLETION_FILE; then
133
+		echo "VoIP onion domain:$VOIP_ONION_HOSTNAME" >> $COMPLETION_FILE
134
+	fi
135
+
136
+	systemctl restart mumble-server
137
+
138
+	if ! grep -q $"Mumble Server" /home/$MY_USERNAME/README; then
139
+		echo '' >> /home/$MY_USERNAME/README
140
+		echo '' >> /home/$MY_USERNAME/README
141
+		echo $'Mumble Server' >> /home/$MY_USERNAME/README
142
+		echo '=============' >> /home/$MY_USERNAME/README
143
+		echo $"Mumble onion domain:$VOIP_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
144
+		echo $'Mumble server username: mumble-server' >> /home/$MY_USERNAME/README
145
+		if [[ $SYSTEM_TYPE != "VARIANT_MESH" ]]; then
146
+			echo $"Mumble server password: $VOIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
147
+		fi
148
+		echo '' >> /home/$MY_USERNAME/README
149
+		echo $'To connect to the Mumble server use your username and the server password shown above.' >> /home/$MY_USERNAME/README
150
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
151
+		chmod 600 /home/$MY_USERNAME/README
152
+	fi
153
+
154
+	function_check configure_firewall_for_voip
155
+	configure_firewall_for_voip
156
+	echo 'install_mumble' >> $COMPLETION_FILE
157
+}
158
+
159
+# NOTE: deliberately no exit 0

+ 422
- 0
src/freedombone-app-rss View File

@@ -0,0 +1,422 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# RSS reader application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+RSS_READER_REPO="https://tt-rss.org/git/tt-rss.git"
32
+RSS_READER_COMMIT='9e84bab449f9ed55e02e60378b0af1521026f3b8'
33
+RSS_READER_ADMIN_PASSWORD=
34
+RSS_READER_ONION_PORT=8092
35
+RSS_MOBILE_READER_ONION_PORT=8095
36
+RSS_READER_DOMAIN_NAME=ttrss
37
+RSS_MOBILE_READER_REPO="https://github.com/mboinet/ttrss-mobile"
38
+RSS_MOBILE_READER_COMMIT='d5242e1c269e9480ab3b66b7a38da3c892dfb326'
39
+RSS_READER_PATH=/etc/share/tt-rss
40
+RSS_READER_GNUSOCIAL_REPO="https://github.com/bashrc/ttrss-gnusocial"
41
+RSS_READER_GNUSOCIAL_COMMIT='8b92b8f5db7b0d12459c7bd86a50f48815efe642'
42
+
43
+function rss_reader_modifications {
44
+	# modify the rss reader to use a socks5 proxy rather than a http proxy
45
+	if [ ! -d $RSS_READER_PATH ]; then
46
+		return
47
+	fi
48
+
49
+	# ensure that socks5 proxy is used
50
+	if ! grep -q "CURLOPT_PROXYTYPE" $RSS_READER_PATH/plugins/af_unburn/init.php; then
51
+		sed -i '/curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);/a \\t\t\t\t\tcurl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);' $RSS_READER_PATH/plugins/af_unburn/init.php
52
+	fi
53
+	if ! grep -q "CURLOPT_PROXYTYPE" $RSS_READER_PATH/include/functions.php; then
54
+		sed -i '/curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);/a \\t\t\t\tcurl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);' $RSS_READER_PATH/include/functions.php
55
+	fi
56
+	chown -R www-data:www-data $RSS_READER_PATH
57
+	chmod a+x $RSS_READER_PATH
58
+}
59
+
60
+function install_rss_reader {
61
+	if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
62
+		return
63
+	fi
64
+
65
+	# update to the next commit
66
+	function_check set_repo_commit
67
+	set_repo_commit $RSS_READER_PATH "RSS reader commit" "$RSS_READER_COMMIT" $RSS_READER_REPO
68
+
69
+	if grep -Fxq "install_rss_reader" $COMPLETION_FILE; then
70
+		return
71
+	fi
72
+
73
+	apt-get -y install php-gettext php5-curl php5-gd php5-mysql git curl php-xml-parser
74
+
75
+	if [ ! -d /etc/share ]; then
76
+		mkdir /etc/share
77
+	fi
78
+	cd /etc/share
79
+	function_check git_clone
80
+	git_clone $RSS_READER_REPO tt-rss
81
+	if [ ! -d $RSS_READER_PATH ]; then
82
+		echo $'Could not clone RSS reader repo'
83
+		exit 52925
84
+	fi
85
+	cd $RSS_READER_PATH
86
+	git checkout $RSS_READER_COMMIT -b $RSS_READER_COMMIT
87
+	if ! grep -q "RSS reader commit" $COMPLETION_FILE; then
88
+		echo "RSS reader commit:$RSS_READER_COMMIT" >> $COMPLETION_FILE
89
+	fi
90
+
91
+	function_check install_mariadb
92
+	install_mariadb
93
+
94
+	function_check get_mariadb_password
95
+	get_mariadb_password
96
+
97
+	function_check repair_databases_script
98
+	repair_databases_script
99
+
100
+	function_check get_mariadb_rss_reader_admin_password
101
+	get_mariadb_rss_reader_admin_password
102
+	if [ ! $RSS_READER_ADMIN_PASSWORD ]; then
103
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
104
+			RSS_READER_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
105
+		else
106
+			RSS_READER_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
107
+		fi
108
+	fi
109
+
110
+	function_check create_database
111
+	create_database ttrss "$RSS_READER_ADMIN_PASSWORD" $MY_USERNAME
112
+
113
+	RSS_READER_ONION_HOSTNAME=$(add_onion_service ttrss 80 ${RSS_READER_ONION_PORT})
114
+	RSS_MOBILE_READER_ONION_HOSTNAME=$(add_onion_service ttrss 80 ${RSS_MOBILE_READER_ONION_PORT})
115
+
116
+	echo 'server {' > /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
117
+	echo "  listen 127.0.0.1:$RSS_MOBILE_READER_ONION_PORT;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
118
+	echo "  server_name $RSS_MOBILE_READER_ONION_HOSTNAME;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
119
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
120
+	echo '  access_log off;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
121
+	echo '  error_log off;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
122
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
123
+	echo '  root /etc/share/ttrss-mobile;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
124
+	echo '  index index.html index.php;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
125
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
126
+	echo '  location ~ \.php {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
127
+	echo '    include snippets/fastcgi-php.conf;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
128
+	echo '    fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
129
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
130
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
131
+	echo '  location / {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
132
+	echo '    try_files $uri $uri/ @ttrss;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
133
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
134
+	echo '  location /tt-rss {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
135
+	echo '    try_files $uri $uri/ @ttrss_base;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
136
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
137
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
138
+	echo '  location @ttrss {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
139
+	echo '    rewrite ^(.*)$ /index.html?p=$1 last;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
140
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
141
+	echo '  location @ttrss_base {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
142
+	echo '    rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
143
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
144
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
145
+	echo '  location ~ /\.(git) {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
146
+	echo '    deny all;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
147
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
148
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
149
+	echo '  add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
150
+	echo '  add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
151
+	echo '  client_max_body_size 15m;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
152
+	echo '}' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
153
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
154
+	echo 'server {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
155
+	echo "  listen 127.0.0.1:$RSS_READER_ONION_PORT default_server;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
156
+	echo "  server_name $RSS_READER_ONION_HOSTNAME;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
157
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
158
+	echo '  access_log off;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
159
+	echo '  error_log off;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
160
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
161
+	echo '  root /etc/share/tt-rss;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
162
+	echo '  index index.php;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
163
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
164
+	echo '  location ~ \.php {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
165
+	echo '    include snippets/fastcgi-php.conf;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
166
+	echo '    fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
167
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
168
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
169
+	echo '  set $mobile_rewrite do_not_perform;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
170
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
171
+	echo '  ## chi http_user_agent for mobile / smart phones ##' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
172
+	echo '  if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
173
+	echo '    set $mobile_rewrite perform;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
174
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
175
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
176
+	echo '  if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
177
+	echo '    set $mobile_rewrite perform;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
178
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
179
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
180
+	echo '  if ($mobile_rewrite = perform) {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
181
+	echo "    rewrite ^/(.*) http://$RSS_MOBILE_READER_ONION_HOSTNAME permanent;" >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
182
+	echo '    break;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
183
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
184
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
185
+	echo '  location ~ \.php {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
186
+	echo '    include snippets/fastcgi-php.conf;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
187
+	echo '    fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
188
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
189
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
190
+	echo '  location / {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
191
+	echo '    try_files $uri $uri/ @ttrss;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
192
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
193
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
194
+	echo '  location @ttrss {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
195
+	echo '    rewrite ^(.*)$ /index.php?p=$1 last;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
196
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
197
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
198
+	echo '  location ~ /\.(git) {' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
199
+	echo '    deny all;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
200
+	echo '  }' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
201
+	echo '' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
202
+	echo '  add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
203
+	echo '  add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
204
+	echo '  client_max_body_size 15m;' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
205
+	echo '}' >> /etc/nginx/sites-available/$RSS_READER_DOMAIN_NAME
206
+
207
+	if [ ! -f $RSS_READER_PATH/config.php ]; then
208
+		# generate a config file
209
+		RSS_FEED_CRYPT_KEY="$(create_password 24)"
210
+		echo '<?php' > $RSS_READER_PATH/config.php
211
+		echo "  define ('_CURL_HTTP_PROXY', '127.0.0.1:9050');" >> $RSS_READER_PATH/config.php
212
+		echo "  define('DB_TYPE', 'mysql');" >> $RSS_READER_PATH/config.php
213
+		echo "  define('DB_HOST', 'localhost');" >> $RSS_READER_PATH/config.php
214
+		echo "  define('DB_USER', 'root');" >> $RSS_READER_PATH/config.php
215
+		echo "  define('DB_NAME', 'ttrss');" >> $RSS_READER_PATH/config.php
216
+		echo "  define('DB_PASS', '${MARIADB_PASSWORD}');" >> $RSS_READER_PATH/config.php
217
+		echo "  define('DB_PORT', '3306');" >> $RSS_READER_PATH/config.php
218
+		echo "  define('MYSQL_CHARSET', 'UTF8');" >> $RSS_READER_PATH/config.php
219
+		echo "  define('SELF_URL_PATH', 'http://${RSS_READER_ONION_HOSTNAME}/');" >> $RSS_READER_PATH/config.php
220
+		echo "  define('FEED_CRYPT_KEY', '${RSS_FEED_CRYPT_KEY}');" >> $RSS_READER_PATH/config.php
221
+		echo "  define('SINGLE_USER_MODE', false);" >> $RSS_READER_PATH/config.php
222
+		echo "  define('SIMPLE_UPDATE_MODE', false);" >> $RSS_READER_PATH/config.php
223
+		echo "  define('PHP_EXECUTABLE', '/usr/bin/php');" >> $RSS_READER_PATH/config.php
224
+		echo "  define('LOCK_DIRECTORY', 'lock');" >> $RSS_READER_PATH/config.php
225
+		echo "  define('CACHE_DIR', 'cache');" >> $RSS_READER_PATH/config.php
226
+		echo "  define('ICONS_DIR', \"feed-icons\");" >> $RSS_READER_PATH/config.php
227
+		echo "  define('ICONS_URL', \"feed-icons\");" >> $RSS_READER_PATH/config.php
228
+		echo "  define('AUTH_AUTO_CREATE', true);" >> $RSS_READER_PATH/config.php
229
+		echo "  define('AUTH_AUTO_LOGIN', true);" >> $RSS_READER_PATH/config.php
230
+		echo "  define('FORCE_ARTICLE_PURGE', 0);" >> $RSS_READER_PATH/config.php
231
+		echo "  define('PUBSUBHUBBUB_HUB', '');" >> $RSS_READER_PATH/config.php
232
+		echo "  define('PUBSUBHUBBUB_ENABLED', false);" >> $RSS_READER_PATH/config.php
233
+		echo "  define('SPHINX_SERVER', 'localhost:9312');" >> $RSS_READER_PATH/config.php
234
+		echo "  define('SPHINX_INDEX', 'ttrss, delta');" >> $RSS_READER_PATH/config.php
235
+		echo "  define('ENABLE_REGISTRATION', false);" >> $RSS_READER_PATH/config.php
236
+		echo "  define('REG_NOTIFY_ADDRESS', '${MY_EMAIL_ADDRESS}');" >> $RSS_READER_PATH/config.php
237
+		echo "  define('REG_MAX_USERS', 10);" >> $RSS_READER_PATH/config.php
238
+		echo "  define('SESSION_COOKIE_LIFETIME', 86400);" >> $RSS_READER_PATH/config.php
239
+		echo "  define('SMTP_FROM_NAME', 'Tiny Tiny RSS');" >> $RSS_READER_PATH/config.php
240
+		echo "  define('SMTP_FROM_ADDRESS', 'noreply@${RSS_READER_ONION_HOSTNAME}');" >> $RSS_READER_PATH/config.php
241
+		echo "  define('DIGEST_SUBJECT', '[tt-rss] New headlines for last 24 hours');" >> $RSS_READER_PATH/config.php
242
+		echo "  define('SMTP_SERVER', '');" >> $RSS_READER_PATH/config.php
243
+		echo "  define('SMTP_LOGIN', '');" >> $RSS_READER_PATH/config.php
244
+		echo "  define('SMTP_PASSWORD', '');" >> $RSS_READER_PATH/config.php
245
+		echo "  define('SMTP_SECURE', '');" >> $RSS_READER_PATH/config.php
246
+		echo "  define('CHECK_FOR_UPDATES', false);" >> $RSS_READER_PATH/config.php
247
+		echo "  define('ENABLE_GZIP_OUTPUT', false);" >> $RSS_READER_PATH/config.php
248
+		echo "  define('PLUGINS', 'auth_internal, note, gnusocial');" >> $RSS_READER_PATH/config.php
249
+		echo "  define('LOG_DESTINATION', 'sql');" >> $RSS_READER_PATH/config.php
250
+		echo "  define('CONFIG_VERSION', 26);" >> $RSS_READER_PATH/config.php
251
+	fi
252
+
253
+	# initialize the database
254
+	if [ ! -f $RSS_READER_PATH/schema/ttrss_schema_mysql.sql ]; then
255
+		echo $'No database schema found for rss reader'
256
+		exit 52926
257
+	fi
258
+	initialise_database ttrss $RSS_READER_PATH/schema/ttrss_schema_mysql.sql
259
+
260
+	# change the password from the default
261
+	RSS_READER_ADMIN_PASSWORD_HASH=$(echo -n "${RSS_READER_ADMIN_PASSWORD}" | sha1sum | awk -F ' ' '{print $1}')
262
+
263
+	function_check run_query
264
+    run_query ttrss "update ttrss_users set pwd_hash = 'SHA1:${RSS_READER_ADMIN_PASSWORD_HASH}', salt= '' WHERE login = 'admin';"
265
+
266
+	function_check rss_reader_modifications
267
+	rss_reader_modifications
268
+
269
+	function_check configure_php
270
+	configure_php
271
+
272
+	nginx_ensite $RSS_READER_DOMAIN_NAME
273
+	systemctl restart php5-fpm
274
+	systemctl restart nginx
275
+
276
+	if ! grep -q "RSS reader onion domain" $COMPLETION_FILE; then
277
+		echo "RSS reader onion domain:${RSS_READER_ONION_HOSTNAME}" >> $COMPLETION_FILE
278
+	fi
279
+	if ! grep -q "RSS reader domain" $COMPLETION_FILE; then
280
+		echo "RSS reader domain:${RSS_READER_DOMAIN_NAME}" >> $COMPLETION_FILE
281
+	fi
282
+
283
+	# daemon to update feeds
284
+	echo '[Unit]' > /etc/systemd/system/ttrss.service
285
+	echo 'Description=ttrss_backend' >> /etc/systemd/system/ttrss.service
286
+	echo 'After=network.target mysql.service' >> /etc/systemd/system/ttrss.service
287
+	echo 'After=tor.service' >> /etc/systemd/system/ttrss.service
288
+	echo '' >> /etc/systemd/system/ttrss.service
289
+	echo '[Service]' >> /etc/systemd/system/ttrss.service
290
+	echo 'User=www-data' >> /etc/systemd/system/ttrss.service
291
+	echo "ExecStart=/usr/bin/php $RSS_READER_PATH/update.php --daemon" >> /etc/systemd/system/ttrss.service
292
+	echo '' >> /etc/systemd/system/ttrss.service
293
+	echo '[Install]' >> /etc/systemd/system/ttrss.service
294
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ttrss.service
295
+	systemctl enable ttrss
296
+	systemctl daemon-reload
297
+	systemctl start ttrss
298
+
299
+	# some post-install instructions for the user
300
+	if ! grep -q $"RSS Reader" /home/$MY_USERNAME/README; then
301
+		echo '' >> /home/$MY_USERNAME/README
302
+		echo '' >> /home/$MY_USERNAME/README
303
+		echo $'RSS Reader' >> /home/$MY_USERNAME/README
304
+		echo '==========' >> /home/$MY_USERNAME/README
305
+		echo $"RSS reader domain: ${RSS_READER_DOMAIN_NAME}" >> /home/$MY_USERNAME/README
306
+		echo $"RSS reader onion domain: ${RSS_READER_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
307
+		echo $"RSS reader admin username: admin" >> /home/$MY_USERNAME/README
308
+		echo $"RSS reader admin password: ${RSS_READER_ADMIN_PASSWORD}" >> /home/$MY_USERNAME/README
309
+		echo '' >> /home/$MY_USERNAME/README
310
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
311
+		chmod 600 /home/$MY_USERNAME/README
312
+	fi
313
+
314
+	echo 'install_rss_reader' >> $COMPLETION_FILE
315
+}
316
+
317
+function install_rss_reader_gnusocial {
318
+	if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
319
+		return
320
+	fi
321
+
322
+	if [ ! $MICROBLOG_DOMAIN_NAME ]; then
323
+		return
324
+	fi
325
+
326
+	if [ ! $RSS_READER_PATH ]; then
327
+		RSS_READER_PATH=/etc/share/tt-rss
328
+	fi
329
+	RSS_READER_GNUSOCIAL_PATH=${RSS_READER_PATH}/plugins/gnusocial
330
+
331
+	# update to the next commit
332
+	function_check set_repo_commit
333
+	set_repo_commit $RSS_READER_GNUSOCIAL_PATH "RSS reader gnusocial commit" "$RSS_READER_GNUSOCIAL_COMMIT" $RSS_READER_GNUSOCIAL_REPO
334
+	chown -R www-data:www-data $RSS_READER_GNUSOCIAL_PATH
335
+
336
+	if grep -Fxq "install_rss_reader_gnusocial" $COMPLETION_FILE; then
337
+		return
338
+	fi
339
+
340
+	if [ ! -d $INSTALL_DIR ]; then
341
+		mkdir -p $INSTALL_DIR
342
+	fi
343
+
344
+	cd $INSTALL_DIR
345
+	function_check git_clone
346
+	git_clone $RSS_READER_GNUSOCIAL_REPO ttrss-gnusocial
347
+	if [ ! -d $INSTALL_DIR/ttrss-gnusocial ]; then
348
+		echo $'Could not clone repo for RSS reader GNU Social plugin'
349
+		exit 52838
350
+	fi
351
+	cp -r $INSTALL_DIR/ttrss-gnusocial $RSS_READER_GNUSOCIAL_PATH
352
+	cd $RSS_READER_GNUSOCIAL_PATH
353
+	git checkout $RSS_READER_GNUSOCIAL_COMMIT -b $RSS_READER_GNUSOCIAL_COMMIT
354
+	if ! grep -q "RSS reader gnusocial commit" $COMPLETION_FILE; then
355
+		echo "RSS reader gnusocial commit:$RSS_READER_GNUSOCIAL_COMMIT" >> $COMPLETION_FILE
356
+	fi
357
+	chown -R www-data:www-data $RSS_READER_GNUSOCIAL_PATH
358
+
359
+	echo 'install_rss_reader_gnusocial' >> $COMPLETION_FILE
360
+}
361
+
362
+function install_rss_mobile_reader {
363
+	if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
364
+		return
365
+	fi
366
+
367
+	if [ ! $RSS_READER_PATH ]; then
368
+		RSS_READER_PATH=/etc/share/tt-rss
369
+	fi
370
+
371
+	if [ ! -d $RSS_READER_PATH ]; then
372
+		echo $'tt-rss is not installed, so the mobile version cannot be installed'
373
+		exit 63452
374
+	fi
375
+
376
+	RSS_MOBILE_READER_PATH=/etc/share/ttrss-mobile
377
+
378
+	# remove any previous install
379
+	if [ -d $RSS_READER_PATH/g2ttree-mobile ]; then
380
+		if grep -Fxq "install_rss_mobile_reader" $COMPLETION_FILE; then
381
+			sed -i '/install_rss_mobile_reader/d' $COMPLETION_FILE
382
+			sed -i '/RSS mobile reader commit/d' $COMPLETION_FILE
383
+			rm -rf $RSS_READER_PATH/g2ttree-mobile
384
+		fi
385
+	fi
386
+
387
+	# update to the next commit
388
+	function_check set_repo_commit
389
+	set_repo_commit $RSS_MOBILE_READER_PATH "RSS mobile reader commit" "$RSS_MOBILE_READER_COMMIT" $RSS_MOBILE_READER_REPO
390
+
391
+	if grep -Fxq "install_rss_mobile_reader" $COMPLETION_FILE; then
392
+		return
393
+	fi
394
+
395
+	cd /etc/share
396
+	function_check git_clone
397
+	git_clone $RSS_MOBILE_READER_REPO ttrss-mobile
398
+	if [ ! -d $RSS_MOBILE_READER_PATH ]; then
399
+		echo $'Could not clone RSS mobile reader repo'
400
+		exit 24816
401
+	fi
402
+	cd $RSS_MOBILE_READER_PATH
403
+	git checkout $RSS_MOBILE_READER_COMMIT -b $RSS_MOBILE_READER_COMMIT
404
+	if ! grep -q "RSS mobile reader commit" $COMPLETION_FILE; then
405
+		echo "RSS mobile reader commit:$RSS_MOBILE_READER_COMMIT" >> $COMPLETION_FILE
406
+	fi
407
+
408
+	echo 'define({' > $RSS_MOBILE_READER_PATH/scripts/conf.js
409
+	echo '  apiPath: "/tt-rss/"' >> $RSS_MOBILE_READER_PATH/scripts/conf.js
410
+	echo '});' >> $RSS_MOBILE_READER_PATH/scripts/conf.js
411
+
412
+	# link to the main site
413
+	ln -s $RSS_READER_PATH $RSS_MOBILE_READER_PATH/tt-rss
414
+
415
+	chown -R www-data:www-data $RSS_MOBILE_READER_PATH
416
+	chown -R www-data:www-data $RSS_READER_PATH
417
+	chmod a+x $RSS_MOBILE_READER_PATH
418
+
419
+	echo 'install_rss_mobile_reader' >> $COMPLETION_FILE
420
+}
421
+
422
+# NOTE: deliberately no exit 0

+ 248
- 0
src/freedombone-app-search View File

@@ -0,0 +1,248 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Search engine application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+SEARCH_ENGINE_REPO="https://github.com/asciimoo/searx"
32
+SEARCH_ENGINE_COMMIT='fee556c9904637051a9ba874ba7e71cd9f10789f'
33
+SEARCH_ENGINE_PATH=/etc
34
+SEARCH_ENGINE_ONION_PORT=8094
35
+SEARCH_ENGINE_ONION_HOSTNAME=
36
+SEARCH_ENGINE_LOGIN_TEXT=$"Search engine login"
37
+SEARCH_ENGINE_PASSWORD=
38
+
39
+function install_search_engine {
40
+	# Note: currently socks5 outgoing proxies to other search engines does not work
41
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
42
+		return
43
+	fi
44
+	if [ ! -d /etc/nginx ]; then
45
+		echo $'Webserver is not installed'
46
+		exit 62429
47
+	fi
48
+
49
+	# update to a new commit if needed
50
+	set_repo_commit $SEARCH_ENGINE_PATH/searx "Search engine commit" "$SEARCH_ENGINE_COMMIT" $SEARCH_ENGINE_REPO
51
+	if grep "Search engine key" $COMPLETION_FILE; then
52
+		if [ -f ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml ]; then
53
+			# note: this might change to a --tor option in a later version
54
+			if ! grep 'socks5://127.0.0.1:9050' ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml; then
55
+				echo 'outgoing: # communication with search engines' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
56
+				echo '    proxies:' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
57
+				echo '        http : socks5://127.0.0.1:9050' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
58
+				echo '        https: socks5://127.0.0.1:9050' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
59
+			fi
60
+			SEARCH_ENGINE_SECRET_KEY=$(cat $COMPLETION_FILE | grep "Search engine key" | awk -F ':' '{print $2}')
61
+			sed -i "s|secret_key.*|secret_key : \"${SEARCH_ENGINE_SECRET_KEY}\"|g" ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
62
+			if [ -f /var/lib/tor/hidden_service_searx/hostname ]; then
63
+				SEARCH_ENGINE_ONION_HOSTNAME=$(echo /var/lib/tor/hidden_service_searx/hostname)
64
+				sed -i '0,/RE/s/base_url.*/base_url : \"http://${SEARCH_ENGINE_ONION_HOSTNAME}\/' ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
65
+			fi
66
+		fi
67
+	fi
68
+
69
+	if grep -Fxq "install_search_engine" $COMPLETION_FILE; then
70
+		return
71
+	fi
72
+
73
+	apt-get -y install python-pip libyaml-dev python-werkzeug python-babel python-lxml apache2-utils
74
+	apt-get -y install git build-essential libxslt-dev python-dev python-virtualenv python-pybabel zlib1g-dev uwsgi uwsgi-plugin-python libapache2-mod-uwsgi
75
+
76
+	pip install --upgrade pip
77
+
78
+	pip install certifi
79
+	if [ ! "$?" = "0" ]; then
80
+		echo $'Failed to install certifi'
81
+		exit 737692
82
+	fi
83
+
84
+	pip install pyyaml
85
+	if [ ! "$?" = "0" ]; then
86
+		echo $'Failed to install pyyaml'
87
+		exit 469242
88
+	fi
89
+
90
+	pip install flask --upgrade
91
+	if [ ! "$?" = "0" ]; then
92
+		echo $'Failed to install flask'
93
+		exit 888575
94
+	fi
95
+
96
+	pip install flask_restless --upgrade
97
+	if [ ! "$?" = "0" ]; then
98
+		echo $'Failed to install flask_restless'
99
+		exit 54835
100
+	fi
101
+
102
+	pip install flask_babel --upgrade
103
+	if [ ! "$?" = "0" ]; then
104
+		echo $'Failed to install flask_babel'
105
+		exit 63738
106
+	fi
107
+
108
+	if [ ! -d $SEARCH_ENGINE_PATH ]; then
109
+		mkdir -p $SEARCH_ENGINE_PATH
110
+	fi
111
+
112
+	# clone the repo
113
+	cd $SEARCH_ENGINE_PATH
114
+	function_check git_clone
115
+	git_clone $SEARCH_ENGINE_REPO searx
116
+	git checkout $SEARCH_ENGINE_COMMIT -b $SEARCH_ENGINE_COMMIT
117
+	if ! grep -q "Search engine commit" $COMPLETION_FILE; then
118
+		echo "Search engine commit:$SEARCH_ENGINE_COMMIT" >> $COMPLETION_FILE
119
+	else
120
+		sed -i "s/Search engine commit.*/Search engine commit:$SEARCH_ENGINE_COMMIT/g" $COMPLETION_FILE
121
+	fi
122
+
123
+	# create an onion service
124
+	SEARCH_ENGINE_ONION_HOSTNAME=$(add_onion_service searx 80 ${SEARCH_ENGINE_ONION_PORT})
125
+	if ! grep "Search engine onion domain" $COMPLETION_FILE; then
126
+		echo "Search engine onion domain:${SEARCH_ENGINE_ONION_HOSTNAME}" >> $COMPLETION_FILE
127
+	else
128
+		sed -i "s|Search engine onion domain.*|Search engine onion domain:${SEARCH_ENGINE_ONION_HOSTNAME}|g" $COMPLETION_FILE
129
+	fi
130
+
131
+	# an unprivileged user to run as
132
+	useradd -d ${SEARCH_ENGINE_PATH}/searx/ -s /bin/false searx
133
+	adduser searx debian-tor
134
+
135
+	# daemon
136
+	echo '[Unit]' > /etc/systemd/system/searx.service
137
+	echo 'Description=Searx (search engine)' >> /etc/systemd/system/searx.service
138
+	echo 'After=syslog.target' >> /etc/systemd/system/searx.service
139
+	echo 'After=network.target' >> /etc/systemd/system/searx.service
140
+	echo '' >> /etc/systemd/system/searx.service
141
+	echo '[Service]' >> /etc/systemd/system/searx.service
142
+	echo 'Type=simple' >> /etc/systemd/system/searx.service
143
+	echo 'User=searx' >> /etc/systemd/system/searx.service
144
+	echo 'Group=searx' >> /etc/systemd/system/searx.service
145
+	echo "WorkingDirectory=${SEARCH_ENGINE_PATH}/searx" >> /etc/systemd/system/searx.service
146
+	echo "ExecStart=/usr/bin/python ${SEARCH_ENGINE_PATH}/searx/searx/webapp.py" >> /etc/systemd/system/searx.service
147
+	echo 'Restart=always' >> /etc/systemd/system/searx.service
148
+	echo 'Environment="USER=searx"' >> /etc/systemd/system/searx.service
149
+	echo '' >> /etc/systemd/system/searx.service
150
+	echo '[Install]' >> /etc/systemd/system/searx.service
151
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/searx.service
152
+
153
+	# create a webserver file
154
+	echo 'server {' > /etc/nginx/sites-available/searx
155
+	echo "    listen 127.0.0.1:${SEARCH_ENGINE_ONION_PORT} default_server;" >> /etc/nginx/sites-available/searx
156
+	echo "    root ${SEARCH_ENGINE_PATH}/searx;" >> /etc/nginx/sites-available/searx
157
+	echo "    server_name ${SEARCH_ENGINE_ONION_HOSTNAME};" >> /etc/nginx/sites-available/searx
158
+	echo '    access_log off;' >> /etc/nginx/sites-available/searx
159
+	echo "    error_log /var/log/searx_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/searx
160
+	echo '' >> /etc/nginx/sites-available/searx
161
+	function_check nginx_limits
162
+	nginx_limits searx '1M'
163
+	function_check nginx_disable_sniffing
164
+	nginx_disable_sniffing searx
165
+	echo '    add_header Strict-Transport-Security max-age=0;' >> /etc/nginx/sites-available/searx
166
+	echo '' >> /etc/nginx/sites-available/searx
167
+	echo '    location / {' >> /etc/nginx/sites-available/searx
168
+	echo '        proxy_pass http://localhost:8888;' >> /etc/nginx/sites-available/searx
169
+	echo '        proxy_set_header Host $host;' >> /etc/nginx/sites-available/searx
170
+	echo '        proxy_set_header X-Real-IP $remote_addr;' >> /etc/nginx/sites-available/searx
171
+	echo '        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> /etc/nginx/sites-available/searx
172
+	echo '        proxy_set_header X-Remote-Port $remote_port;' >> /etc/nginx/sites-available/searx
173
+	echo '        proxy_set_header X-Forwarded-Proto $scheme;' >> /etc/nginx/sites-available/searx
174
+	echo '        proxy_redirect off;' >> /etc/nginx/sites-available/searx
175
+
176
+	echo "        auth_basic \"${SEARCH_ENGINE_LOGIN_TEXT}\";" >> /etc/nginx/sites-available/searx
177
+	echo '        auth_basic_user_file /etc/nginx/.htpasswd;' >> /etc/nginx/sites-available/searx
178
+	echo '    }' >> /etc/nginx/sites-available/searx
179
+	echo '' >> /etc/nginx/sites-available/searx
180
+	echo '    fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/searx
181
+	echo '' >> /etc/nginx/sites-available/searx
182
+	echo '    error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/searx
183
+	echo '    error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/searx
184
+	echo '' >> /etc/nginx/sites-available/searx
185
+	echo '    location = /robots.txt {' >> /etc/nginx/sites-available/searx
186
+	echo '        allow all;' >> /etc/nginx/sites-available/searx
187
+	echo '        log_not_found off;' >> /etc/nginx/sites-available/searx
188
+	echo '        access_log off;' >> /etc/nginx/sites-available/searx
189
+	echo '    }' >> /etc/nginx/sites-available/searx
190
+	echo '}' >> /etc/nginx/sites-available/searx
191
+
192
+	# replace the secret key
193
+	if ! grep "Search engine key" $COMPLETION_FILE; then
194
+		SEARCH_ENGINE_SECRET_KEY="$(create_password 30)"
195
+		echo "Search engine key:${SEARCH_ENGINE_SECRET_KEY}" >> $COMPLETION_FILE
196
+	else
197
+		SEARCH_ENGINE_SECRET_KEY=$(cat $COMPLETION_FILE | grep "Search engine key" | awk -F ':' '{print $2}')
198
+	fi
199
+	sed -i "s|secret_key.*|secret_key : \"${SEARCH_ENGINE_SECRET_KEY}\"|g" ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
200
+	sed -i "s|secret_key.*|secret_key : \"${SEARCH_ENGINE_SECRET_KEY}\"|g" ${SEARCH_ENGINE_PATH}/searx/searx/settings_robot.yml
201
+	sed -i '0,/RE/s/base_url.*/base_url : \"http://${SEARCH_ENGINE_ONION_HOSTNAME}\/' ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
202
+	sed -i '0,/RE/s/base_url.*/base_url : \"http://${SEARCH_ENGINE_ONION_HOSTNAME}\/' ${SEARCH_ENGINE_PATH}/searx/searx/settings_robot.yml
203
+
204
+	# note: this might change to a --tor option in a later version
205
+	if ! grep 'socks5://127.0.0.1:9050' ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml; then
206
+		echo 'outgoing: # communication with search engines' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
207
+		echo '    proxies:' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
208
+		echo '        http : socks5://127.0.0.1:9050' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
209
+		echo '        https: socks5://127.0.0.1:9050' >> ${SEARCH_ENGINE_PATH}/searx/searx/settings.yml
210
+	fi
211
+
212
+	chown -R searx:searx ${SEARCH_ENGINE_PATH}/searx
213
+
214
+	# enable the site
215
+	nginx_ensite searx
216
+
217
+	# restart the web server
218
+	systemctl restart php5-fpm
219
+	systemctl restart nginx
220
+
221
+	# start the daemon
222
+	systemctl enable searx.service
223
+	systemctl daemon-reload
224
+	systemctl start searx.service
225
+
226
+	if ! grep -q "Your search engine password is" /home/$MY_USERNAME/README; then
227
+		if [ ${#SEARCH_ENGINE_PASSWORD} -lt 8 ]; then
228
+			if [ -f $IMAGE_PASSWORD_FILE ]; then
229
+				SEARCH_ENGINE_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
230
+			else
231
+				SEARCH_ENGINE_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
232
+			fi
233
+		fi
234
+		echo "$SEARCH_ENGINE_PASSWORD" | htpasswd -i -s -c /etc/nginx/.htpasswd $MY_USERNAME
235
+		echo '' >> /home/$MY_USERNAME/README
236
+		echo '' >> /home/$MY_USERNAME/README
237
+		echo $'Search Engine' >> /home/$MY_USERNAME/README
238
+		echo '=============' >> /home/$MY_USERNAME/README
239
+		echo $"Search engine onion domain: ${SEARCH_ENGINE_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
240
+		echo $"Your search engine password is: $SEARCH_ENGINE_PASSWORD" >> /home/$MY_USERNAME/README
241
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
242
+		chmod 600 /home/$MY_USERNAME/README
243
+	fi
244
+
245
+	echo 'install_search_engine' >> $COMPLETION_FILE
246
+}
247
+
248
+# NOTE: deliberately no exit 0

+ 318
- 0
src/freedombone-app-sip View File

@@ -0,0 +1,318 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# SIP functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+SIP_SERVER_PASSWORD=
32
+SIP_PORT=5060
33
+SIP_TLS_PORT=5061
34
+VOIP_TURN_PORT=3478
35
+VOIP_TURN_TLS_PORT=5349
36
+VOIP_TURN_NONCE=
37
+
38
+function get_sip_server_password {
39
+	if [ -f /home/$MY_USERNAME/README ]; then
40
+		if grep -q "SIP server password" /home/$MY_USERNAME/README; then
41
+			if [ ! $SIP_SERVER_PASSWORD ]; then
42
+				SIP_SERVER_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "SIP server password" | awk -F ':' '{print $2}' | sed 's/^ *//')
43
+			fi
44
+		fi
45
+	fi
46
+}
47
+
48
+function update_sipwitch_daemon {
49
+	if [ ! -f /etc/init.d/sipwitch ]; then
50
+		return
51
+	fi
52
+	service sipwitch stop
53
+
54
+	# remove the original sipwitch daemon if it exists
55
+	if [ -f /etc/init.d/sipwitch ]; then
56
+		rm -f /etc/init.d/sipwitch
57
+	fi
58
+
59
+	# daemon
60
+	echo '[Unit]' > /etc/systemd/system/sipwitch.service
61
+	echo 'Description=GNU SIP Witch, a SIP telephony service daemon.' >> /etc/systemd/system/sipwitch.service
62
+	echo 'After=network.target' >> /etc/systemd/system/sipwitch.service
63
+	echo '' >> /etc/systemd/system/sipwitch.service
64
+	echo '[Service]' >> /etc/systemd/system/sipwitch.service
65
+	echo 'Type=simple' >> /etc/systemd/system/sipwitch.service
66
+	echo 'Group=sipwitch' >> /etc/systemd/system/sipwitch.service
67
+	echo 'PIDFile=/var/run/sipwitch/pidfile' >> /etc/systemd/system/sipwitch.service
68
+	echo 'EnvironmentFile=-/etc/conf.d/sipwitch' >> /etc/systemd/system/sipwitch.service
69
+	echo 'EnvironmentFile=-/etc/sipwitch.conf' >> /etc/systemd/system/sipwitch.service
70
+	echo 'EnvironmentFile=-/etc/default/sipwitch' >> /etc/systemd/system/sipwitch.service
71
+	echo 'ExecStartPre=-/bin/rm -f /var/run/sipwitch/control' >> /etc/systemd/system/sipwitch.service
72
+	echo "ExecStart=/usr/sbin/sipw -f \$OPTIONS -P$SIP_PORT" >> /etc/systemd/system/sipwitch.service
73
+	echo 'Restart=always' >> /etc/systemd/system/sipwitch.service
74
+	echo 'NotifyAccess=main' >> /etc/systemd/system/sipwitch.service
75
+	echo '' >> /etc/systemd/system/sipwitch.service
76
+	echo '[Install]' >> /etc/systemd/system/sipwitch.service
77
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/sipwitch.service
78
+
79
+	systemctl enable sipwitch
80
+	systemctl daemon-reload
81
+	systemctl start sipwitch
82
+}
83
+
84
+function install_sip {
85
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
86
+		return
87
+	fi
88
+	if grep -Fxq "install_sip" $COMPLETION_FILE; then
89
+		return
90
+	fi
91
+
92
+	apt-get -y install sipwitch
93
+
94
+	function_check get_sip_server_password
95
+	get_sip_server_password
96
+	if [ ! $SIP_SERVER_PASSWORD ]; then
97
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
98
+			SIP_SERVER_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
99
+		else
100
+			SIP_SERVER_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
101
+		fi
102
+	fi
103
+
104
+	echo '<?xml version="1.0"?>' > /etc/sipwitch.conf
105
+	echo '<sipwitch>' >> /etc/sipwitch.conf
106
+	echo '<provision>' >> /etc/sipwitch.conf
107
+
108
+	echo "<user id=\"$MY_USERNAME\">" >> /etc/sipwitch.conf
109
+	echo '<extension>201</extension>' >> /etc/sipwitch.conf
110
+	echo "<secret>$SIP_SERVER_PASSWORD</secret>" >> /etc/sipwitch.conf
111
+	echo "<display>$MY_USERNAME 201</display>" >> /etc/sipwitch.conf
112
+	echo '</user>' >> /etc/sipwitch.conf
113
+
114
+	echo '</provision>' >> /etc/sipwitch.conf
115
+	echo '<access>' >> /etc/sipwitch.conf
116
+	echo '</access>' >> /etc/sipwitch.conf
117
+	echo '<stack>' >> /etc/sipwitch.conf
118
+	echo "  <localnames>$DEFAULT_DOMAIN_NAME</localnames>" >> /etc/sipwitch.conf
119
+	echo '  <mapped>200</mapped>' >> /etc/sipwitch.conf
120
+	echo '  <threading>2</threading>' >> /etc/sipwitch.conf
121
+	echo '  <interface>*</interface>' >> /etc/sipwitch.conf
122
+	echo '  <dumping>false</dumping>' >> /etc/sipwitch.conf
123
+	echo '  <system>system</system>' >> /etc/sipwitch.conf
124
+	echo '  <anon>anonymous</anon>' >> /etc/sipwitch.conf
125
+	echo '</stack>' >> /etc/sipwitch.conf
126
+	echo '<timers>' >> /etc/sipwitch.conf
127
+	echo '  <!-- ring every 4 seconds -->' >> /etc/sipwitch.conf
128
+	echo '  <ring>4</ring>' >> /etc/sipwitch.conf
129
+	echo '  <!-- call forward no answer after x rings -->' >> /etc/sipwitch.conf
130
+	echo '  <cfna>4</cfna>' >> /etc/sipwitch.conf
131
+	echo '  <!-- call reset to clear cid in stack, 6 seconds -->' >> /etc/sipwitch.conf
132
+	echo '  <reset>6</reset>' >> /etc/sipwitch.conf
133
+	echo '</timers>' >> /etc/sipwitch.conf
134
+	echo '<!-- we have 2xx numbers plus space for external users -->' >> /etc/sipwitch.conf
135
+	echo '<registry>' >> /etc/sipwitch.conf
136
+	echo '  <prefix>200</prefix>' >> /etc/sipwitch.conf
137
+	echo '  <range>100</range>' >> /etc/sipwitch.conf
138
+	echo '  <keysize>77</keysize>' >> /etc/sipwitch.conf
139
+	echo '  <mapped>200</mapped>' >> /etc/sipwitch.conf
140
+	echo '  <!-- <realm>GNU Telephony</realm> -->' >> /etc/sipwitch.conf
141
+	echo '</registry>' >> /etc/sipwitch.conf
142
+	echo '<routing>' >> /etc/sipwitch.conf
143
+	echo '</routing>' >> /etc/sipwitch.conf
144
+	echo '</sipwitch>' >> /etc/sipwitch.conf
145
+
146
+	sed -i 's|#PLUGINS=|PLUGINS=|g' /etc/default/sipwitch
147
+	sed -i 's|PLUGINS=.*|PLUGINS="zeroconf subscriber forward"|g' /etc/default/sipwitch
148
+	groupadd sipwitch
149
+	usermod -aG sipwitch $MY_USERNAME
150
+
151
+	SIP_ONION_HOSTNAME=$(add_onion_service sip ${SIP_PORT} ${SIP_PORT})
152
+	if ! grep -q $"SIP onion domain" $COMPLETION_FILE; then
153
+		echo "SIP onion domain:$SIP_ONION_HOSTNAME" >> $COMPLETION_FILE
154
+	fi
155
+
156
+	if ! grep -q $"SIP Server" /home/$MY_USERNAME/README; then
157
+		echo '' >> /home/$MY_USERNAME/README
158
+		echo '' >> /home/$MY_USERNAME/README
159
+		echo $'SIP Server' >> /home/$MY_USERNAME/README
160
+		echo '==========' >> /home/$MY_USERNAME/README
161
+		echo $"SIP onion_domain: $SIP_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
162
+		echo $"SIP server username: $MY_USERNAME" >> /home/$MY_USERNAME/README
163
+		echo $"SIP server extension: 201" >> /home/$MY_USERNAME/README
164
+		echo $"SIP server password: $SIP_SERVER_PASSWORD" >> /home/$MY_USERNAME/README
165
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
166
+		chmod 600 /home/$MY_USERNAME/README
167
+	fi
168
+
169
+	function_check configure_firewall_for_sip4
170
+	configure_firewall_for_sip4
171
+	echo 'install_sip' >> $COMPLETION_FILE
172
+}
173
+
174
+function install_sip_turn {
175
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
176
+		return
177
+	fi
178
+	if grep -Fxq "install_sip_turn" $COMPLETION_FILE; then
179
+		return
180
+	fi
181
+
182
+	apt-get -y install turnserver
183
+
184
+	# create a nonce if needed
185
+	if [ ! $VOIP_TURN_NONCE ]; then
186
+		VOIP_TURN_NONCE="$(create_password 30)"
187
+	fi
188
+
189
+	function_check create_site_certificate
190
+	create_site_certificate $DEFAULT_DOMAIN_NAME
191
+
192
+	echo '##' > /etc/turnserver/turnserver.conf
193
+	echo '# TurnServer configuration file.' >> /etc/turnserver/turnserver.conf
194
+	echo '#' >> /etc/turnserver/turnserver.conf
195
+	echo '' >> /etc/turnserver/turnserver.conf
196
+	echo '## Public IPv4 address of any relayed address (if not set, no relay for IPv4).' >> /etc/turnserver/turnserver.conf
197
+	echo '## To have multiple address, separate addresses with a comma' >> /etc/turnserver/turnserver.conf
198
+	echo '## (i.e. listen_address = { "172.16.0.1", "172.17.0.1" }).' >> /etc/turnserver/turnserver.conf
199
+	echo "listen_address = { \"192.168.0.1\" }" >> /etc/turnserver/turnserver.conf
200
+	echo '' >> /etc/turnserver/turnserver.conf
201
+	echo '## Public IPv6 address of any relayed address (if not set, no relay for IPv6).' >> /etc/turnserver/turnserver.conf
202
+	echo '## To have multiple address, separate address with a comma' >> /etc/turnserver/turnserver.conf
203
+	echo '## (i.e. listen_addressv6 = { "2001:db8:1::1", "2001:db8:2::1" }).' >> /etc/turnserver/turnserver.conf
204
+	echo "#listen_addressv6 = { \"2001:db8::1\" }" >> /etc/turnserver/turnserver.conf
205
+	echo '' >> /etc/turnserver/turnserver.conf
206
+	echo '## UDP listening port.' >> /etc/turnserver/turnserver.conf
207
+	echo "udp_port = $VOIP_TURN_PORT" >> /etc/turnserver/turnserver.conf
208
+	echo '' >> /etc/turnserver/turnserver.conf
209
+	echo '## TCP listening port.' >> /etc/turnserver/turnserver.conf
210
+	echo "tcp_port = $VOIP_TURN_PORT" >> /etc/turnserver/turnserver.conf
211
+	echo '' >> /etc/turnserver/turnserver.conf
212
+	echo '## TLS listening port.' >> /etc/turnserver/turnserver.conf
213
+	echo "tls_port = $VOIP_TURN_TLS_PORT" >> /etc/turnserver/turnserver.conf
214
+	echo '' >> /etc/turnserver/turnserver.conf
215
+	echo '## TLS support.' >> /etc/turnserver/turnserver.conf
216
+	echo 'tls = true' >> /etc/turnserver/turnserver.conf
217
+	echo '' >> /etc/turnserver/turnserver.conf
218
+	echo '## DTLS support. It is an experimental feature and is not defined in TURN' >> /etc/turnserver/turnserver.conf
219
+	echo '## standard.' >> /etc/turnserver/turnserver.conf
220
+	echo 'dtls = false' >> /etc/turnserver/turnserver.conf
221
+	echo '' >> /etc/turnserver/turnserver.conf
222
+	echo '## Maximum allocation port number.' >> /etc/turnserver/turnserver.conf
223
+	echo 'max_port = 65535' >> /etc/turnserver/turnserver.conf
224
+	echo '' >> /etc/turnserver/turnserver.conf
225
+	echo '## Minimum allocation port number.' >> /etc/turnserver/turnserver.conf
226
+	echo '' >> /etc/turnserver/turnserver.conf
227
+	echo 'min_port = 49152' >> /etc/turnserver/turnserver.conf
228
+	echo '' >> /etc/turnserver/turnserver.conf
229
+	echo '## TURN-TCP support.' >> /etc/turnserver/turnserver.conf
230
+	echo '' >> /etc/turnserver/turnserver.conf
231
+	echo 'turn_tcp = true' >> /etc/turnserver/turnserver.conf
232
+	echo '' >> /etc/turnserver/turnserver.conf
233
+	echo '## TURN-TCP buffering mode:' >> /etc/turnserver/turnserver.conf
234
+	echo '## - true, use userspace buffering;' >> /etc/turnserver/turnserver.conf
235
+	echo '## - false, use kernel buffering.' >> /etc/turnserver/turnserver.conf
236
+	echo 'tcp_buffer_userspace = true' >> /etc/turnserver/turnserver.conf
237
+	echo '' >> /etc/turnserver/turnserver.conf
238
+	echo '## TURN-TCP maximum buffer size.' >> /etc/turnserver/turnserver.conf
239
+	echo 'tcp_buffer_size = 32768' >> /etc/turnserver/turnserver.conf
240
+	echo '' >> /etc/turnserver/turnserver.conf
241
+	echo '## Daemon mode.' >> /etc/turnserver/turnserver.conf
242
+	echo 'daemon = true' >> /etc/turnserver/turnserver.conf
243
+	echo '' >> /etc/turnserver/turnserver.conf
244
+	echo '## Unprivileged user.' >> /etc/turnserver/turnserver.conf
245
+	echo '## If you want to use this feature create a system user.' >> /etc/turnserver/turnserver.conf
246
+	echo '## On Linux: adduser --system --group turnserver' >> /etc/turnserver/turnserver.conf
247
+	echo 'unpriv_user = turnserver' >> /etc/turnserver/turnserver.conf
248
+	echo '' >> /etc/turnserver/turnserver.conf
249
+	echo '## Realm value.' >> /etc/turnserver/turnserver.conf
250
+	echo "realm = \"$DEFAULT_DOMAIN_NAME\"" >> /etc/turnserver/turnserver.conf
251
+	echo '' >> /etc/turnserver/turnserver.conf
252
+	echo '## Nonce key.' >> /etc/turnserver/turnserver.conf
253
+	echo "nonce_key = \"$VOIP_TURN_NONCE\"" >> /etc/turnserver/turnserver.conf
254
+	echo '' >> /etc/turnserver/turnserver.conf
255
+	echo '## Max relay per username.' >> /etc/turnserver/turnserver.conf
256
+	echo 'max_relay_per_username = 5' >> /etc/turnserver/turnserver.conf
257
+	echo '' >> /etc/turnserver/turnserver.conf
258
+	echo '## Allocation lifetime.' >> /etc/turnserver/turnserver.conf
259
+	echo 'allocation_lifetime = 1800' >> /etc/turnserver/turnserver.conf
260
+	echo '' >> /etc/turnserver/turnserver.conf
261
+	echo '## Allocation bandwidth limitation (in KBytes/s).' >> /etc/turnserver/turnserver.conf
262
+	echo '## 0 value means bandwidth quota disabled.' >> /etc/turnserver/turnserver.conf
263
+	echo 'bandwidth_per_allocation = 150' >> /etc/turnserver/turnserver.conf
264
+	echo '' >> /etc/turnserver/turnserver.conf
265
+	echo '## Restricted user bandwidth (in KBytes/s).' >> /etc/turnserver/turnserver.conf
266
+	echo '## 0 value means bandwidth limitation disabled.' >> /etc/turnserver/turnserver.conf
267
+	echo 'restricted_bandwidth = 10' >> /etc/turnserver/turnserver.conf
268
+	echo '' >> /etc/turnserver/turnserver.conf
269
+	echo '## Denied addresses.' >> /etc/turnserver/turnserver.conf
270
+	echo '' >> /etc/turnserver/turnserver.conf
271
+	echo '# disallow relaying to localhost' >> /etc/turnserver/turnserver.conf
272
+	echo 'denied_address {' >> /etc/turnserver/turnserver.conf
273
+	echo '  address = "127.0.0.1"' >> /etc/turnserver/turnserver.conf
274
+	echo '  mask = "8"' >> /etc/turnserver/turnserver.conf
275
+	echo '  port = 0' >> /etc/turnserver/turnserver.conf
276
+	echo '}' >> /etc/turnserver/turnserver.conf
277
+	echo '' >> /etc/turnserver/turnserver.conf
278
+	echo '# disallow relaying to ip6-localhost' >> /etc/turnserver/turnserver.conf
279
+	echo 'denied_address {' >> /etc/turnserver/turnserver.conf
280
+	echo '  address = "::1"' >> /etc/turnserver/turnserver.conf
281
+	echo '  mask = "128"' >> /etc/turnserver/turnserver.conf
282
+	echo '  port = 0' >> /etc/turnserver/turnserver.conf
283
+	echo '}' >> /etc/turnserver/turnserver.conf
284
+	echo '' >> /etc/turnserver/turnserver.conf
285
+	echo '## Certification Authority file.' >> /etc/turnserver/turnserver.conf
286
+	echo "ca_file = \"/etc/ssl/certs/ca-certificates.crt\"" >> /etc/turnserver/turnserver.conf
287
+	echo '' >> /etc/turnserver/turnserver.conf
288
+	echo '## Server certificate file.' >> /etc/turnserver/turnserver.conf
289
+	if [ -f /etc/ssl/certs/$DEFAULT_DOMAIN_NAME.pem ]; then
290
+		echo "cert_file = \"/etc/ssl/certs/$DEFAULT_DOMAIN_NAME.pem\"" >> /etc/turnserver/turnserver.conf
291
+	else
292
+		if [ -f /etc/ssl/certs/$DEFAULT_DOMAIN_NAME.crt ]; then
293
+			echo "cert_file = \"/etc/ssl/certs/$DEFAULT_DOMAIN_NAME.crt\"" >> /etc/turnserver/turnserver.conf
294
+		fi
295
+	fi
296
+	echo '' >> /etc/turnserver/turnserver.conf
297
+	echo '## Private key file.' >> /etc/turnserver/turnserver.conf
298
+	echo "private_key_file = \"/etc/ssl/certs/$DEFAULT_DOMAIN_NAME.key\"" >> /etc/turnserver/turnserver.conf
299
+	echo '' >> /etc/turnserver/turnserver.conf
300
+	echo '## Account method.' >> /etc/turnserver/turnserver.conf
301
+	echo "account_method = \"file\"" >> /etc/turnserver/turnserver.conf
302
+	echo '' >> /etc/turnserver/turnserver.conf
303
+	echo '## Account file (if account_method = file).' >> /etc/turnserver/turnserver.conf
304
+	echo "account_file = \"/etc/turnserver/turnusers.txt\"" >> /etc/turnserver/turnserver.conf
305
+	echo '' >> /etc/turnserver/turnserver.conf
306
+	echo '## mod_tmpuser.' >> /etc/turnserver/turnserver.conf
307
+	echo 'mod_tmpuser = false' >> /etc/turnserver/turnserver.conf
308
+
309
+	echo "${MY_USERNAME}:password:${DEFAULT_DOMAIN_NAME}:authorized" > /etc/turnserver/turnusers.txt
310
+
311
+	systemctl restart turnserver
312
+
313
+	function_check configure_firewall_for_voip_turn
314
+	configure_firewall_for_voip_turn
315
+	echo 'install_sip_turn' >> $COMPLETION_FILE
316
+}
317
+
318
+# NOTE: deliberately no exit 0

+ 85
- 0
src/freedombone-app-syncthing View File

@@ -0,0 +1,85 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Syncthing application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+SYNCTHING_ID=
32
+SYNCTHING_CONFIG_PATH=/root/.config/syncthing
33
+SYNCTHING_CONFIG_FILE=$SYNCTHING_CONFIG_PATH/config.xml
34
+SYNCTHING_RELAY_SERVER='https://relays.syncthing.net/endpoint'
35
+SYNCTHING_RELEASES='https://api.github.com/repos/syncthing/syncthing/releases?per_page=30'
36
+SYNCTHING_PORT=22000
37
+SYNCTHING_SHARED_DATA=/var/lib/syncthing/SyncShared
38
+SYNCTHING_USER_IDS_FILE='.syncthingids'
39
+
40
+function install_syncthing {
41
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
42
+		return
43
+	fi
44
+	if grep -Fxq "install_syncthing" $COMPLETION_FILE; then
45
+		return
46
+	fi
47
+
48
+	apt-get -y install curl
49
+
50
+	curl -s https://syncthing.net/release-key.txt | apt-key add -
51
+	echo "deb http://apt.syncthing.net/ syncthing release" | tee /etc/apt/sources.list.d/syncthing.list
52
+	apt-get update
53
+	apt-get -y install syncthing
54
+
55
+	# This probably does need to run as root so that it can access the Sync directories
56
+	# in each user's home directory
57
+	echo '[Unit]' > /etc/systemd/system/syncthing.service
58
+	echo 'Description=Syncthing - Open Source Continuous File Synchronization' >> /etc/systemd/system/syncthing.service
59
+	echo 'Documentation=man:syncthing(1)' >> /etc/systemd/system/syncthing.service
60
+	echo 'After=network.target' >> /etc/systemd/system/syncthing.service
61
+	echo 'Wants=syncthing-inotify@.service' >> /etc/systemd/system/syncthing.service
62
+	echo '' >> /etc/systemd/system/syncthing.service
63
+	echo '[Service]' >> /etc/systemd/system/syncthing.service
64
+	echo 'User=root' >> /etc/systemd/system/syncthing.service
65
+	echo "Environment='all_proxy=socks5://localhost:9050'" >> /etc/systemd/system/syncthing.service
66
+	echo 'ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0' >> /etc/systemd/system/syncthing.service
67
+	echo 'Restart=on-failure' >> /etc/systemd/system/syncthing.service
68
+	echo 'SuccessExitStatus=3 4' >> /etc/systemd/system/syncthing.service
69
+	echo 'RestartForceExitStatus=3 4' >> /etc/systemd/system/syncthing.service
70
+	echo '' >> /etc/systemd/system/syncthing.service
71
+	echo '[Install]' >> /etc/systemd/system/syncthing.service
72
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/syncthing.service
73
+	systemctl enable syncthing
74
+	systemctl daemon-reload
75
+	systemctl start syncthing
76
+
77
+	function_check cron_add_mins
78
+	cron_add_mins 1 '/usr/local/bin/freedombone-syncthing > /dev/null'
79
+
80
+	function_check configure_firewall_for_syncthing
81
+	configure_firewall_for_syncthing
82
+	echo 'install_syncthing' >> $COMPLETION_FILE
83
+}
84
+
85
+# NOTE: deliberately no exit 0

+ 172
- 0
src/freedombone-app-tox View File

@@ -0,0 +1,172 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Tox Application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+TOX_PORT=33445
32
+TOXCORE_REPO="git://github.com/irungentoo/toxcore.git"
33
+TOXCORE_COMMIT='532629d486e3361c7d8d95b38293cc7d61dc4ee5'
34
+TOXID_REPO="https://github.com/bashrc/toxid"
35
+TOX_BOOTSTRAP_ID_FILE=/var/lib/tox-bootstrapd/pubkey.txt
36
+# These are some default nodes, but you can replace them with trusted nodes
37
+# as you prefer. See https://wiki.tox.im/Nodes
38
+TOX_NODES=
39
+#TOX_NODES=(
40
+#  '192.254.75.102,2607:5600:284::2,33445,951C88B7E75C867418ACDB5D273821372BB5BD652740BCDF623A4FA293E75D2F,Tox RELENG,US'
41
+#  '144.76.60.215,2a01:4f8:191:64d6::1,33445,04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F,sonOfRa,DE'
42
+#)
43
+TOXIC_REPO="https://github.com/Tox/toxic"
44
+TOXIC_COMMIT='cf16849b374e484a33a4dffa3dfb937b59d537f2'
45
+TOXIC_FILE=/usr/local/bin/toxic
46
+
47
+function tox_avahi {
48
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
49
+		return
50
+	fi
51
+	if grep -Fxq "tox_avahi" $COMPLETION_FILE; then
52
+		return
53
+	fi
54
+
55
+	if [ ! -d /etc/avahi ]; then
56
+		echo $'tox_avahi: avahi is not installed'
57
+		exit 87359
58
+	fi
59
+
60
+	# install a command to obtain the Tox ID
61
+	cd $INSTALL_DIR
62
+	function_check git_clone
63
+	git_clone $TOXID_REPO $INSTALL_DIR/toxid
64
+	if [ ! -d $INSTALL_DIR/toxid ]; then
65
+		exit 63921
66
+	fi
67
+	cd $INSTALL_DIR/toxid
68
+	make
69
+	if [ ! "$?" = "0" ]; then
70
+		exit 58432
71
+	fi
72
+	make install
73
+
74
+	toxavahi
75
+
76
+	# publish regularly
77
+	function_check cron_add_mins
78
+	cron_add_mins 1 'toxavahi > /dev/null'
79
+
80
+	systemctl restart avahi-daemon
81
+
82
+	echo 'tox_avahi' >> $COMPLETION_FILE
83
+}
84
+
85
+function install_tox_node {
86
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
87
+		return
88
+	fi
89
+
90
+	# update to the next commit
91
+	function_check set_repo_commit
92
+	set_repo_commit $INSTALL_DIR/toxcore "toxcore commit" "$TOXCORE_COMMIT" $TOXCORE_REPO
93
+
94
+	if grep -Fxq "install_tox_node" $COMPLETION_FILE; then
95
+		return
96
+	fi
97
+
98
+	${PROJECT_NAME}-mesh-install -f tox_node
99
+	if [ ! "$?" = "0" ]; then
100
+		echo $'Failed to install tox node'
101
+		exit 26778
102
+	fi
103
+
104
+	TOX_ONION_HOSTNAME=$(add_onion_service tox ${TOX_PORT} ${TOX_PORT})
105
+
106
+	if ! grep -q "tox onion domain" $COMPLETION_FILE; then
107
+		echo "tox onion domain:${TOX_ONION_HOSTNAME}" >> $COMPLETION_FILE
108
+	else
109
+		sed -i "s|tox onion domain.*|tox onion domain:${TOX_ONION_HOSTNAME}|g" $COMPLETION_FILE
110
+	fi
111
+
112
+	systemctl restart tox-bootstrapd.service
113
+
114
+	TOX_PUBLIC_KEY=$(cat /var/log/syslog | grep tox | grep "Public Key" | awk -F ' ' '{print $8}' | tail -1)
115
+	if [ ${#TOX_PUBLIC_KEY} -lt 30 ]; then
116
+		echo $'Could not obtain the tox node public key'
117
+		exit 6529
118
+	fi
119
+
120
+	# save the public key for later reference
121
+	echo "$TOX_PUBLIC_KEY" > $TOX_BOOTSTRAP_ID_FILE
122
+
123
+	function_check configure_firewall_for_tox
124
+	configure_firewall_for_tox
125
+
126
+	if ! grep -q $"Your Tox node public key is" /home/$MY_USERNAME/README; then
127
+		echo '' >> /home/$MY_USERNAME/README
128
+		echo '' >> /home/$MY_USERNAME/README
129
+		echo 'Tox' >> /home/$MY_USERNAME/README
130
+		echo '===' >> /home/$MY_USERNAME/README
131
+		echo $"tox onion domain: ${TOX_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
132
+		echo $"Your Tox node public key is: $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
133
+		echo $'In the Toxic client you can connect to it with:' >> /home/$MY_USERNAME/README
134
+		echo "  /connect $DEFAULT_DOMAIN_NAME.local $TOX_PORT $TOX_PUBLIC_KEY" >> /home/$MY_USERNAME/README
135
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
136
+		chmod 600 /home/$MY_USERNAME/README
137
+	fi
138
+
139
+	function_check configure_firewall_for_tox
140
+	configure_firewall_for_tox
141
+	echo 'install_tox_node' >> $COMPLETION_FILE
142
+}
143
+
144
+function install_tox_client {
145
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
146
+		return
147
+	fi
148
+
149
+	# update to the next commit
150
+	function_check set_repo_commit
151
+	set_repo_commit $INSTALL_DIR/toxic "Toxic commit" "$TOXIC_COMMIT" $TOXIC_REPO
152
+
153
+	if grep -Fxq "install_tox_client" $COMPLETION_FILE; then
154
+		return
155
+	fi
156
+
157
+	${PROJECT_NAME}-mesh-install -f tox_client
158
+	if [ ! "$?" = "0" ]; then
159
+		echo $'Could not install Tox client'
160
+		exit 67248
161
+	fi
162
+
163
+	# initial setup of username
164
+	#su -c "echo 'n
165
+	#/nick $MY_USERNAME
166
+	#/exit
167
+	#' | $TOXIC_FILE -d" - $MY_USERNAME
168
+
169
+	echo 'install_tox_client' >> $COMPLETION_FILE
170
+}
171
+
172
+# NOTE: deliberately no exit 0

+ 47
- 0
src/freedombone-app-vpn View File

@@ -0,0 +1,47 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# VPN functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function install_vpn_tunnel {
32
+	if ! grep -q "repo.universe-factory.net" /etc/apt/sources.list; then
33
+		echo 'deb http://repo.universe-factory.net/debian/ sid main' >> /etc/apt/sources.list
34
+		gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C
35
+		if [ ! "$?" = "0" ]; then
36
+			exit 76272
37
+		fi
38
+		gpg -a --export 16EF3F64CB201D9C | sudo apt-key add -
39
+		apt-get update
40
+		apt-get -y install fastd
41
+		if [ ! "$?" = "0" ]; then
42
+			exit 52026
43
+		fi
44
+	fi
45
+}
46
+
47
+# NOTE: deliberately there is no "exit 0"

+ 184
- 0
src/freedombone-app-webmail View File

@@ -0,0 +1,184 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Webmail application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+WEBMAIL_REPO="https://github.com/roundcube/roundcubemail"
32
+WEBMAIL_COMMIT='78cf9c2e5cff2d78cd8beb647d60570f195a2a9c'
33
+WEBMAIL_ONION_HOSTNAME=
34
+WEBMAIL_ONION_PORT=8097
35
+WEBMAIL_ADMIN_PASSWORD=
36
+
37
+function install_webmail {
38
+	if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
39
+		return
40
+	fi
41
+
42
+	WEB_PATH=/var/www
43
+	WEBMAIL_PATH=$WEB_PATH/webmail
44
+
45
+	# update to a new commit if needed
46
+	function_check set_repo_commit
47
+	set_repo_commit $WEBMAIL_PATH "Webmail commit" "$WEBMAIL_COMMIT" $WEBMAIL_REPO
48
+
49
+	if grep -Fxq "install_webmail" $COMPLETION_FILE; then
50
+		return
51
+	fi
52
+	if [ -d /etc/apache2 ]; then
53
+		rm -rf /etc/apache2
54
+		echo $'Removed Apache installation after Dokuwiki install'
55
+	fi
56
+
57
+	function_check install_mariadb
58
+	install_mariadb
59
+
60
+	function_check get_mariadb_password
61
+	get_mariadb_password
62
+
63
+	function_check repair_databases_script
64
+	repair_databases_script
65
+
66
+	apt-get -y install php5-common php5-cli php5-curl php5-gd php5-mysql php5-mcrypt git
67
+	apt-get -y install php5-dev imagemagick php5-imagick php5-sqlite php-auth-sasl php-net-smtp php-mime-type
68
+	apt-get -y install php-mail-mime php-mail-mimedecode php-net-ldap3 php5-pspell
69
+	pear install Net_IDNA2
70
+
71
+	if [ ! -f $WEBMAIL_PATH/index.php ]; then
72
+		cd $WEB_PATH
73
+		git_clone $WEBMAIL_REPO webmail
74
+		cd $WEBMAIL_PATH
75
+		git checkout $WEBMAIL_COMMIT -b $WEBMAIL_COMMIT
76
+		if ! grep -q "Webmail commit" $COMPLETION_FILE; then
77
+			echo "Webmail commit:$WEBMAIL_COMMIT" >> $COMPLETION_FILE
78
+		else
79
+			sed -i "s/Webmail commit.*/Webmail commit:$WEBMAIL_COMMIT/g" $COMPLETION_FILE
80
+		fi
81
+	fi
82
+	if [ ! -f $WEBMAIL_PATH/index.php ]; then
83
+		echo $'Did not clone webmail repo'
84
+		exit 52825
85
+	fi
86
+
87
+	WEBMAIL_ONION_HOSTNAME=$(add_onion_service webmail 80 ${WEBMAIL_ONION_PORT})
88
+	echo "Webmail onion domain:${WEBMAIL_ONION_HOSTNAME}" >> $COMPLETION_FILE
89
+
90
+	function_check get_mariadb_webmail_admin_password
91
+	get_mariadb_webmail_admin_password
92
+	if [ ! $WEBMAIL_ADMIN_PASSWORD ]; then
93
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
94
+			WEBMAIL_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
95
+		else
96
+			WEBMAIL_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
97
+		fi
98
+	fi
99
+	function_check create_database
100
+	create_database webmail "$WEBMAIL_ADMIN_PASSWORD"
101
+	mysql -u root --password="$MARIADB_PASSWORD" -D webmail < $WEBMAIL_PATH/SQL/mysql.initial.sql
102
+
103
+	if [ ! -d /var/www/$DEFAULT_DOMAIN_NAME/htdocs ]; then
104
+		mkdir -p /var/www/$DEFAULT_DOMAIN_NAME/htdocs
105
+	fi
106
+	ln -s $WEBMAIL_PATH /var/www/$DEFAULT_DOMAIN_NAME/htdocs/webmail
107
+
108
+	if [ ! -f /var/www/webmail/config/config.inc.php ]; then
109
+		# generate the configuration
110
+		echo '<?php' > /var/www/webmail/config/config.inc.php
111
+		echo "\$config['db_dsnw'] = 'mysql://root:${MARIADB_PASSWORD}@localhost/webmail';" >> /var/www/webmail/config/config.inc.php
112
+		echo "\$config['default_host'] = 'localhost';" >> /var/www/webmail/config/config.inc.php
113
+		echo "\$config['support_url'] = '';" >> /var/www/webmail/config/config.inc.php
114
+		WEBMAIL_DES_KEY="$(create_password 25)"
115
+		echo "\$config['des_key'] = '${WEBMAIL_DES_KEY}';" >> /var/www/webmail/config/config.inc.php
116
+		echo "\$config['product_name'] = '${PROJECT_NAME}';" >> /var/www/webmail/config/config.inc.php
117
+		echo "\$config['plugins'] = array('enigma');" >> /var/www/webmail/config/config.inc.php
118
+		echo "\$config['mime_param_folding'] = 0;" >> /var/www/webmail/config/config.inc.php
119
+		echo "\$config['enable_installer'] = false;" >> /var/www/webmail/config/config.inc.php
120
+	fi
121
+
122
+	chown -R www-data:www-data $WEBMAIL_PATH
123
+
124
+	echo 'server {' > /etc/nginx/sites-available/webmail
125
+	echo "  listen 127.0.0.1:$WEBMAIL_ONION_PORT default_server;" >> /etc/nginx/sites-available/webmail
126
+	echo "  server_name $WEBMAIL_ONION_HOSTNAME;" >> /etc/nginx/sites-available/webmail
127
+	echo "  root ${WEBMAIL_PATH};" >> /etc/nginx/sites-available/webmail
128
+	echo '  index index.php index.html index.htm;' >> /etc/nginx/sites-available/webmail
129
+	echo '  access_log off;' >> /etc/nginx/sites-available/webmail
130
+	echo '  error_log off;' >> /etc/nginx/sites-available/webmail
131
+	echo '  location / {' >> /etc/nginx/sites-available/webmail
132
+	echo '    try_files $uri $uri/ /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/webmail
133
+	echo '  }' >> /etc/nginx/sites-available/webmail
134
+	echo '  error_page 404 /404.html;' >> /etc/nginx/sites-available/webmail
135
+	echo '  error_page 500 502 503 504 /50x.html;' >> /etc/nginx/sites-available/webmail
136
+	echo '  location = /50x.html {' >> /etc/nginx/sites-available/webmail
137
+	echo "    root ${WEBMAIL_PATH};" >> /etc/nginx/sites-available/webmail
138
+	echo '  }' >> /etc/nginx/sites-available/webmail
139
+	echo '  location ~ ^/(README.md|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ {' >> /etc/nginx/sites-available/webmail
140
+	echo '    deny all;' >> /etc/nginx/sites-available/webmail
141
+	echo '  }' >> /etc/nginx/sites-available/webmail
142
+	echo '  location ~ ^/(config|temp|logs)/ {' >> /etc/nginx/sites-available/webmail
143
+	echo '    deny all;' >> /etc/nginx/sites-available/webmail
144
+	echo '  }' >> /etc/nginx/sites-available/webmail
145
+	echo '  location ~ /\. {' >> /etc/nginx/sites-available/webmail
146
+	echo '    deny all;' >> /etc/nginx/sites-available/webmail
147
+	echo '    access_log off;' >> /etc/nginx/sites-available/webmail
148
+	echo '    log_not_found off;' >> /etc/nginx/sites-available/webmail
149
+	echo '  }' >> /etc/nginx/sites-available/webmail
150
+	echo '  location ~ \.php$ {' >> /etc/nginx/sites-available/webmail
151
+	echo '    try_files $uri =404;' >> /etc/nginx/sites-available/webmail
152
+	echo '    fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/webmail
153
+	echo '    fastcgi_index index.php;' >> /etc/nginx/sites-available/webmail
154
+	echo '    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/webmail
155
+	echo '    include fastcgi_params;' >> /etc/nginx/sites-available/webmail
156
+	echo '  }' >> /etc/nginx/sites-available/webmail
157
+	echo '  add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/webmail
158
+	echo '  add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/webmail
159
+	echo '  client_max_body_size 15m;' >> /etc/nginx/sites-available/webmail
160
+	echo '}' >> /etc/nginx/sites-available/webmail
161
+
162
+	nginx_ensite webmail
163
+	systemctl restart php5-fpm
164
+	systemctl restart nginx
165
+
166
+	if ! grep -q "Webmail" /home/$MY_USERNAME/README; then
167
+		echo '' >> /home/$MY_USERNAME/README
168
+		echo '' >> /home/$MY_USERNAME/README
169
+		echo 'Webmail' >> /home/$MY_USERNAME/README
170
+		echo '=======' >> /home/$MY_USERNAME/README
171
+		if [[ $ONION_ONLY == 'no' ]]; then
172
+			echo $"Open https://$DEFAULT_DOMAIN_NAME/webmail/index.php" >> /home/$MY_USERNAME/README
173
+		else
174
+			echo $"Open http://$WEBMAIL_ONION_HOSTNAME" >> /home/$MY_USERNAME/README
175
+		fi
176
+		echo $"MariaDB webmail admin password: $WEBMAIL_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
177
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
178
+		chmod 600 /home/$MY_USERNAME/README
179
+	fi
180
+
181
+	echo 'install_webmail' >> $COMPLETION_FILE
182
+}
183
+
184
+# NOTE: deliberately no exit 0

+ 413
- 0
src/freedombone-app-wiki View File

@@ -0,0 +1,413 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Wiki application
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+WIKI_DOMAIN_NAME=
32
+WIKI_ADMIN_PASSWORD=
33
+WIKI_TITLE="${PROJECT_NAME} Wiki"
34
+WIKI_CODE=
35
+WIKI_ONION_PORT=8089
36
+
37
+function get_wiki_admin_password {
38
+	if [ -f /home/$MY_USERNAME/README ]; then
39
+		if grep -q "Wiki password" /home/$MY_USERNAME/README; then
40
+			WIKI_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Wiki password:" | awk -F ':' '{print $2}' | sed 's/^ *//')
41
+		fi
42
+	fi
43
+}
44
+
45
+function install_wiki {
46
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MASH" ]]; then
47
+		return
48
+	fi
49
+	if grep -Fxq "install_wiki" $COMPLETION_FILE; then
50
+		return
51
+	fi
52
+	if [ ! $WIKI_DOMAIN_NAME ]; then
53
+		return
54
+	fi
55
+	apt-get -y install dokuwiki
56
+	apt-get -y remove --purge apache*
57
+	if [ -d /etc/apache2 ]; then
58
+		rm -rf /etc/apache2
59
+		echo $'Removed Apache installation after Dokuwiki install'
60
+	fi
61
+
62
+	if [ ! -d /var/www/$WIKI_DOMAIN_NAME ]; then
63
+		mkdir /var/www/$WIKI_DOMAIN_NAME
64
+	fi
65
+	if [ -d /var/www/$WIKI_DOMAIN_NAME/htdocs ]; then
66
+		rm -rf /var/www/$WIKI_DOMAIN_NAME/htdocs
67
+	fi
68
+
69
+	ln -s /usr/share/dokuwiki /var/www/$WIKI_DOMAIN_NAME/htdocs
70
+
71
+	mkdir /var/lib/dokuwiki/custom
72
+	cp /etc/dokuwiki/local.php.dist /var/lib/dokuwiki/custom/local.php
73
+	ln -s /var/lib/dokuwiki/custom/local.php /etc/dokuwiki/local.php
74
+
75
+	chown www-data /var/lib/dokuwiki/custom
76
+	chown www-data /var/lib/dokuwiki/custom/local.php
77
+	chown -R www-data /etc/dokuwiki
78
+	chown -R www-data /usr/share/dokuwiki/lib/
79
+	chmod 600 /var/lib/dokuwiki/custom/local.php
80
+	chmod -R 755 /usr/share/dokuwiki/lib
81
+
82
+	sed -i 's|//$conf|$conf|g' /var/lib/dokuwiki/custom/local.php
83
+	sed -i "s|joe|$MY_USERNAME|g" /var/lib/dokuwiki/custom/local.php
84
+
85
+	sed -i "s|Debian DokuWiki|$WIKI_TITLE|g" /etc/dokuwiki/local.php
86
+
87
+	# set the admin user
88
+	sed -i "s/@admin/$MY_USERNAME/g" /etc/dokuwiki/local.php
89
+
90
+	# disallow registration of new users
91
+	if ! grep -q "disableactions" /etc/dokuwiki/local.php; then
92
+		echo "\$conf['disableactions'] = 'register';" >> /etc/dokuwiki/local.php
93
+	fi
94
+	if ! grep -q "disableactions" /var/lib/dokuwiki/custom/local.php; then
95
+		echo "\$conf['disableactions'] = 'register';" >> /var/lib/dokuwiki/custom/local.php
96
+	fi
97
+
98
+	if ! grep -q "authtype" /var/lib/dokuwiki/custom/local.php; then
99
+		echo "\$conf['authtype'] = 'authplain';" >> /var/lib/dokuwiki/custom/local.php
100
+	fi
101
+	if ! grep -q "authtype" /etc/dokuwiki/local.php; then
102
+		echo "\$conf['authtype'] = 'authplain';" >> /etc/dokuwiki/local.php
103
+	fi
104
+
105
+    function_check get_wiki_admin_password
106
+	get_wiki_admin_password
107
+	if [ ! $WIKI_ADMIN_PASSWORD ]; then
108
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
109
+			WIKI_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
110
+		else
111
+			WIKI_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
112
+		fi
113
+	fi
114
+	HASHED_WIKI_PASSWORD=$(echo -n "$WIKI_ADMIN_PASSWORD" | md5sum | awk -F ' ' '{print $1}')
115
+	echo -n "$MY_USERNAME:$HASHED_WIKI_PASSWORD:$MY_NAME:$MY_EMAIL:admin,user,upload" > /var/lib/dokuwiki/acl/users.auth.php
116
+	chmod 640 /var/lib/dokuwiki/acl/users.auth.php
117
+
118
+	if ! grep -q "video/ogg" /etc/dokuwiki/mime.conf; then
119
+		echo 'ogv     video/ogg' >> /etc/dokuwiki/mime.conf
120
+	fi
121
+	if ! grep -q "video/mp4" /etc/dokuwiki/mime.conf; then
122
+		echo 'mp4     video/mp4' >> /etc/dokuwiki/mime.conf
123
+	fi
124
+	if ! grep -q "video/webm" /etc/dokuwiki/mime.conf; then
125
+		echo 'webm    video/webm' >> /etc/dokuwiki/mime.conf
126
+	fi
127
+
128
+	WIKI_ONION_HOSTNAME=$(add_onion_service wiki 80 ${WIKI_ONION_PORT})
129
+
130
+	if [[ $ONION_ONLY == "no" ]]; then
131
+		echo 'server {' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
132
+		echo '    listen 80;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
133
+		echo "    root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
134
+		echo "    server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
135
+		echo '    access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
136
+		echo "    error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
137
+		echo '    index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
138
+		echo '    charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
139
+		echo '    proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
140
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
141
+		function_check nginx_disable_sniffing
142
+		nginx_disable_sniffing $WIKI_DOMAIN_NAME
143
+		function_check nginx_limits
144
+		nginx_limits $WIKI_DOMAIN_NAME
145
+		echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
146
+		echo '    location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
147
+		echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
148
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
149
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
150
+		echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
151
+		echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
152
+		echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
153
+		echo '        allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
154
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
155
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
156
+		echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
157
+		echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
158
+		echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
159
+		echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
160
+		echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
161
+		echo '        expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
162
+		echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
163
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
164
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
165
+		echo '    # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
166
+		echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
167
+		echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
168
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
169
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
170
+		echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
171
+		echo '    # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
172
+		echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
173
+		echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
174
+		echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
175
+		echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
176
+		echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
177
+		echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
178
+		echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
179
+		echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
180
+		echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
181
+		echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
182
+		echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
183
+		echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
184
+		echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
185
+		echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
186
+		echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
187
+		echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
188
+		echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
189
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
190
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
191
+		echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
192
+		echo '    location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
193
+		echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
194
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
195
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
196
+		echo '    #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
197
+		echo '    location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
198
+		echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
199
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
200
+		echo '    location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
201
+		echo '      deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
202
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
203
+		echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
204
+		echo '      deny  all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
205
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
206
+		echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
207
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
208
+		echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
209
+		echo '    listen 443 ssl;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
210
+		echo "    root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
211
+		echo "    server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
212
+		echo '    access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
213
+		echo "    error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
214
+		echo '    index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
215
+		echo '    charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
216
+		echo '    proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
217
+		function_check nginx_limits
218
+		nginx_limits $WIKI_DOMAIN_NAME
219
+		function_check nginx_ssl
220
+		nginx_ssl $WIKI_DOMAIN_NAME
221
+		function_check nginx_disable_sniffing
222
+		nginx_disable_sniffing $WIKI_DOMAIN_NAME
223
+		echo '    add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
224
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
225
+		echo '    # webmail' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
226
+		echo '    location /webmail {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
227
+		echo '        rewrite ^/(.*) /webmail/index.php last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
228
+		echo '        rewrite ^/(.*) /webmail/installer/index.php last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
229
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
230
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
231
+		echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
232
+		echo '    location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
233
+		echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
234
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
235
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
236
+		echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
237
+		echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
238
+		echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
239
+		echo '        allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
240
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
241
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
242
+		echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
243
+		echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
244
+		echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
245
+		echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
246
+		echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
247
+		echo '        expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
248
+		echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
249
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
250
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
251
+		echo '    # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
252
+		echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
253
+		echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
254
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
255
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
256
+		echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
257
+		echo '    # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
258
+		echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
259
+		echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
260
+		echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
261
+		echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
262
+		echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
263
+		echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
264
+		echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
265
+		echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
266
+		echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
267
+		echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
268
+		echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
269
+		echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
270
+		echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
271
+		echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
272
+		echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
273
+		echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
274
+		echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
275
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
276
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
277
+		echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
278
+		echo '    location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
279
+		echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
280
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
281
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
282
+		echo '    #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
283
+		echo '    location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
284
+		echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
285
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
286
+		echo '    location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
287
+		echo '      deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
288
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
289
+		echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
290
+		echo '      deny  all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
291
+		echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
292
+		echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
293
+		echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
294
+	else
295
+		echo -n '' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
296
+	fi
297
+	echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
298
+	echo "    listen 127.0.0.1:${WIKI_ONION_PORT} default_server;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
299
+	echo "    root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
300
+	echo "    server_name $WIKI_ONION_HOSTNAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
301
+	echo '    access_log off;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
302
+	echo "    error_log /var/log/nginx/${WIKI_DOMAIN_NAME}_error_ssl.log $WEBSERVER_LOG_LEVEL;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
303
+	echo '    index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
304
+	echo '    charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
305
+	echo '    proxy_read_timeout 86400s;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
306
+	function_check nginx_limits
307
+	nginx_limits $WIKI_DOMAIN_NAME
308
+	function_check nginx_disable_sniffing
309
+	nginx_disable_sniffing $WIKI_DOMAIN_NAME
310
+	echo '    add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
311
+	echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
312
+	echo '    # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
313
+	echo '    location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
314
+	echo '        rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
315
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
316
+	echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
317
+	echo "    # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
318
+	echo '    # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
319
+	echo '    location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
320
+	echo '        allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
321
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
322
+	echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
323
+	echo '    # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
324
+	echo '    # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
325
+	echo '    # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
326
+	echo '    # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
327
+	echo '    location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
328
+	echo '        expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
329
+	echo '        try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
330
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
331
+	echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
332
+	echo '    # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
333
+	echo '    location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
334
+	echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
335
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
336
+	echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
337
+	echo '    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
338
+	echo '    # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
339
+	echo '    location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
340
+	echo '        # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
341
+	echo '        # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
342
+	echo "        # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
343
+	echo "        # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
344
+	echo "        # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
345
+	echo "        # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
346
+	echo '        try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
347
+	echo '        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
348
+	echo '        fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
349
+	echo '        # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
350
+	echo '        # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
351
+	echo '        # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
352
+	echo '        fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
353
+	echo '        include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
354
+	echo '        fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
355
+	echo '        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
356
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
357
+	echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
358
+	echo '    # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
359
+	echo '    location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
360
+	echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
361
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
362
+	echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
363
+	echo '    #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
364
+	echo '    location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
365
+	echo '        deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
366
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
367
+	echo '    location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
368
+	echo '      deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
369
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
370
+	echo '    location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
371
+	echo '      deny  all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
372
+	echo '    }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
373
+	echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
374
+
375
+    function_check create_site_certificate
376
+	create_site_certificate $WIKI_DOMAIN_NAME
377
+
378
+    function_check configure_php
379
+	configure_php
380
+
381
+	nginx_ensite $WIKI_DOMAIN_NAME
382
+
383
+	systemctl restart php5-fpm
384
+	systemctl restart nginx
385
+
386
+	echo "Wiki onion domain:${WIKI_ONION_HOSTNAME}" >> $COMPLETION_FILE
387
+
388
+    function_check add_ddns_domain
389
+	add_ddns_domain $WIKI_DOMAIN_NAME
390
+
391
+	# add some post-install instructions
392
+	if ! grep -q $"Wiki password" /home/$MY_USERNAME/README; then
393
+		echo '' >> /home/$MY_USERNAME/README
394
+		echo '' >> /home/$MY_USERNAME/README
395
+		echo $'Wiki' >> /home/$MY_USERNAME/README
396
+		echo '====' >> /home/$MY_USERNAME/README
397
+		echo $"Wiki onion domain: ${WIKI_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
398
+		echo $"Wiki username: $MY_USERNAME" >> /home/$MY_USERNAME/README
399
+		echo $"Wiki password: $WIKI_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
400
+		echo '' >> /home/$MY_USERNAME/README
401
+		echo $'Once you have set up the wiki then remove the install file:' >> /home/$MY_USERNAME/README
402
+		echo '' >> /home/$MY_USERNAME/README
403
+		echo "  rm /var/www/$WIKI_DOMAIN_NAME/htdocs/install.php" >> /home/$MY_USERNAME/README
404
+		echo '' >> /home/$MY_USERNAME/README
405
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
406
+		chmod 600 /home/$MY_USERNAME/README
407
+	fi
408
+
409
+	echo "Wiki domain:$WIKI_DOMAIN_NAME" >> $COMPLETION_FILE
410
+	echo 'install_wiki' >> $COMPLETION_FILE
411
+}
412
+
413
+# NOTE: deliberately no exit 0

+ 346
- 0
src/freedombone-app-xmpp View File

@@ -0,0 +1,346 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# XMPP functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# Directory where XMPP settings are stored
32
+XMPP_DIRECTORY="/var/lib/prosody"
33
+XMPP_PASSWORD=
34
+
35
+XMPP_CIPHERS='"EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA"'
36
+XMPP_ECC_CURVE='"secp384r1"'
37
+
38
+function update_prosody_modules {
39
+	if [ ! -d $INSTALL_DIR/prosody-modules ]; then
40
+		return
41
+	fi
42
+	if [ ! -d /usr/lib/prosody ]; then
43
+		return
44
+	fi
45
+
46
+	cd $INSTALL_DIR/prosody-modules
47
+	hg pull
48
+	hg update
49
+
50
+	# support onion addresses
51
+	if [ -f $INSTALL_DIR/prosody-modules/mod_onions/mod_onions.lua ]; then
52
+		cp $INSTALL_DIR/prosody-modules/mod_onions/mod_onions.lua /usr/lib/prosody/modules/mod_onions.lua
53
+	fi
54
+
55
+	# XEP-0313 message archive management
56
+	# https://modules.prosody.im/mod_mam.html
57
+	# Allows you to download your previous messages onto a new client
58
+	# This only applies if you are not using forward secret crypto
59
+	# such as OTR or OMEMO (eg. OpenPGP)
60
+	if [ -d $INSTALL_DIR/prosody-modules/mod_mam ]; then
61
+		cp $INSTALL_DIR/prosody-modules/mod_mam/*.lua /usr/lib/prosody/modules
62
+	fi
63
+
64
+	# XEP-0352 Client State Indication
65
+	# Notifies the server if the app is in the background or not
66
+	if [ -d $INSTALL_DIR/prosody-modules/mod_csi ]; then
67
+		cp $INSTALL_DIR/prosody-modules/mod_csi/*.lua /usr/lib/prosody/modules
68
+	fi
69
+
70
+	# XEP-0280 Message Carbons
71
+	# Ensures all messages get delivered to all clients (if you have a mobile and desktop client)
72
+	if [ -d $INSTALL_DIR/prosody-modules/mod_carbons ]; then
73
+		cp $INSTALL_DIR/prosody-modules/mod_carbons/*.lua /usr/lib/prosody/modules
74
+	fi
75
+
76
+	# XEP-0198 Stream management
77
+	# Helps mobile apps recover when a device switches networks.
78
+	if [ -d $INSTALL_DIR/prosody-modules/mod_smacks ]; then
79
+		cp $INSTALL_DIR/prosody-modules/mod_smacks/*.lua /usr/lib/prosody/modules
80
+	fi
81
+	if [ -d $INSTALL_DIR/prosody-modules/mod_smacks_offline ]; then
82
+		cp $INSTALL_DIR/prosody-modules/mod_smacks_offline/*.lua /usr/lib/prosody/modules
83
+	fi
84
+
85
+	# XEP-0191: blocking
86
+	if [ -d $INSTALL_DIR/prosody-modules/mod_blocking ]; then
87
+		cp $INSTALL_DIR/prosody-modules/mod_blocking/*.lua /usr/lib/prosody/modules
88
+	fi
89
+
90
+	# XEP-0016 Privacy lists
91
+	if [ -d $INSTALL_DIR/prosody-modules/mod_privacy_lists ]; then
92
+		cp $INSTALL_DIR/prosody-modules/mod_privacy_lists/*.lua /usr/lib/prosody/modules
93
+	fi
94
+}
95
+
96
+function install_xmpp {
97
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
98
+		return
99
+	fi
100
+
101
+	update_prosody_modules
102
+
103
+	if grep -Fxq "install_xmpp" $COMPLETION_FILE; then
104
+		return
105
+	fi
106
+	apt-get -y install lua-sec lua-bitop
107
+	apt-get -y install prosody prosody-modules mercurial
108
+
109
+	if [ ! -d /etc/prosody ]; then
110
+		echo $"ERROR: prosody does not appear to have installed. $CHECK_MESSAGE"
111
+		exit 52
112
+	fi
113
+
114
+	# obtain the prosody modules
115
+	cd $INSTALL_DIR
116
+	hg clone https://hg.prosody.im/prosody-modules/ prosody-modules
117
+	if [ ! -d $INSTALL_DIR/prosody-modules/mod_onions ]; then
118
+		echo $'mod_onions prosody module could not be found'
119
+		exit 73254
120
+	fi
121
+
122
+	# install the onions module
123
+	update_prosody_modules
124
+	if [ ! -f /usr/lib/prosody/modules/mod_onions.lua ]; then
125
+		echo $'mod_onions.lua could not be copied to the prosody modules directory'
126
+		exit 63952
127
+	fi
128
+
129
+	# create a certificate
130
+	if [ ! -f /etc/ssl/certs/xmpp.dhparam ]; then
131
+		${PROJECT_NAME}-addcert -h xmpp --dhkey $DH_KEYLENGTH
132
+		check_certificates xmpp
133
+	fi
134
+	chown prosody:prosody /etc/ssl/private/xmpp.key
135
+	chown prosody:prosody /etc/ssl/certs/xmpp.*
136
+	cp -a /etc/prosody/conf.avail/example.com.cfg.lua /etc/prosody/conf.avail/xmpp.cfg.lua
137
+
138
+	sed -i 's|/etc/prosody/certs/example.com.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/conf.avail/xmpp.cfg.lua
139
+	sed -i 's|/etc/prosody/certs/example.com.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/conf.avail/xmpp.cfg.lua
140
+	if ! grep -q "xmpp.dhparam" /etc/prosody/conf.avail/xmpp.cfg.lua; then
141
+		sed -i '/certificate =/a\        dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/conf.avail/xmpp.cfg.lua
142
+	fi
143
+	if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/conf.avail/xmpp.cfg.lua; then
144
+		sed -i '/certificate =/a\        options = {"no_sslv2", "no_sslv3" };' /etc/prosody/conf.avail/xmpp.cfg.lua
145
+	fi
146
+	if ! grep -q 'ciphers =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
147
+		sed -i "/certificate =/a\        ciphers = $XMPP_CIPHERS;" /etc/prosody/conf.avail/xmpp.cfg.lua
148
+	fi
149
+	if ! grep -q 'depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua; then
150
+		sed -i '/certificate =/a\        depth = "1";' /etc/prosody/conf.avail/xmpp.cfg.lua
151
+	fi
152
+	if ! grep -q 'curve =' /etc/prosody/conf.avail/xmpp.cfg.lua; then
153
+		sed -i "/certificate =/a\        curve = $XMPP_ECC_CURVE;" /etc/prosody/conf.avail/xmpp.cfg.lua
154
+	fi
155
+
156
+	sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/conf.avail/xmpp.cfg.lua
157
+	sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/conf.avail/xmpp.cfg.lua
158
+
159
+	if ! grep -q "modules_enabled" /etc/prosody/conf.avail/xmpp.cfg.lua; then
160
+		echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
161
+		echo 'modules_enabled = {' >> /etc/prosody/conf.avail/xmpp.cfg.lua
162
+		echo '  "bosh"; -- Enable mod_bosh' >> /etc/prosody/conf.avail/xmpp.cfg.lua
163
+		echo '  "tls"; -- Enable mod_tls' >> /etc/prosody/conf.avail/xmpp.cfg.lua
164
+		echo '  "saslauth"; -- Enable mod_saslauth' >> /etc/prosody/conf.avail/xmpp.cfg.lua
165
+		echo '  "onions"; -- Enable chat via onion service' >> /etc/prosody/conf.avail/xmpp.cfg.lua
166
+		echo '  "mam"; -- Message archive management' >> /etc/prosody/conf.avail/xmpp.cfg.lua
167
+		echo '  "csi"; -- Client state indication' >> /etc/prosody/conf.avail/xmpp.cfg.lua
168
+		echo '  "carbons"; -- Message carbons' >> /etc/prosody/conf.avail/xmpp.cfg.lua
169
+		echo '  "smacks"; -- Stream management' >> /etc/prosody/conf.avail/xmpp.cfg.lua
170
+		echo '  "smacks_offline"; -- Stream management' >> /etc/prosody/conf.avail/xmpp.cfg.lua
171
+		echo '  "pep"; -- Personal Eventing Protocol (to support OMEMO)' >> /etc/prosody/conf.avail/xmpp.cfg.lua
172
+		echo '  "privacy"; -- Privacy lists' >> /etc/prosody/conf.avail/xmpp.cfg.lua
173
+		echo '  "privacy_lists"; -- Privacy lists' >> /etc/prosody/conf.avail/xmpp.cfg.lua
174
+		echo '  "blocking"; -- Blocking command' >> /etc/prosody/conf.avail/xmpp.cfg.lua
175
+		echo '  "roster"; -- Roster versioning' >> /etc/prosody/conf.avail/xmpp.cfg.lua
176
+		echo '}' >> /etc/prosody/conf.avail/xmpp.cfg.lua
177
+		echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
178
+		echo 'c2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
179
+		echo 's2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
180
+		echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
181
+	fi
182
+	ln -sf /etc/prosody/conf.avail/xmpp.cfg.lua /etc/prosody/conf.d/xmpp.cfg.lua
183
+
184
+	sed -i 's|/etc/prosody/certs/localhost.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/prosody.cfg.lua
185
+	sed -i 's|/etc/prosody/certs/localhost.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/prosody.cfg.lua
186
+	if ! grep -q "xmpp.dhparam" /etc/prosody/prosody.cfg.lua; then
187
+		sed -i '/certificate =/a\    dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/prosody.cfg.lua
188
+	fi
189
+	if ! grep -q 'options = {"no_sslv2", "no_sslv3" }' /etc/prosody/prosody.cfg.lua; then
190
+		sed -i '/certificate =/a\    options = {"no_sslv2", "no_sslv3" };' /etc/prosody/prosody.cfg.lua
191
+	fi
192
+	if ! grep -q 'ciphers =' /etc/prosody/prosody.cfg.lua; then
193
+		sed -i "/certificate =/a\    ciphers = $XMPP_CIPHERS;" /etc/prosody/prosody.cfg.lua
194
+	fi
195
+	if ! grep -q 'depth = "1";' /etc/prosody/prosody.cfg.lua; then
196
+		sed -i '/certificate =/a\    depth = "1";' /etc/prosody/prosody.cfg.lua
197
+	fi
198
+	if ! grep -q 'curve =' /etc/prosody/prosody.cfg.lua; then
199
+		sed -i "/certificate =/a\    curve = $XMPP_ECC_CURVE;" /etc/prosody/prosody.cfg.lua
200
+	fi
201
+	sed -i 's/c2s_require_encryption = false/c2s_require_encryption = true/g' /etc/prosody/prosody.cfg.lua
202
+	if ! grep -q "s2s_require_encryption" /etc/prosody/prosody.cfg.lua; then
203
+		sed -i '/c2s_require_encryption/a\s2s_require_encryption = true' /etc/prosody/prosody.cfg.lua
204
+	fi
205
+	if ! grep -q "allow_unencrypted_plain_auth" /etc/prosody/prosody.cfg.lua; then
206
+		echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
207
+	fi
208
+	sed -i 's/--"bosh";/"bosh";/g' /etc/prosody/prosody.cfg.lua
209
+	sed -i 's/authentication = "internal_plain"/authentication = "internal_hashed"/g' /etc/prosody/prosody.cfg.lua
210
+	sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/prosody.cfg.lua
211
+	sed -i 's|key = "/etc/prosody/certs/example.com.key"|key = "/etc/ssl/private/xmpp.key"|g' /etc/prosody/prosody.cfg.lua
212
+	sed -i 's|certificate = "/etc/prosody/certs/example.com.crt"|certificate = "/etc/ssl/certs/xmpp.crt"|g' /etc/prosody/prosody.cfg.lua
213
+	sed -i "s/example.com/$DEFAULT_DOMAIN_NAME/g" /etc/prosody/prosody.cfg.lua
214
+
215
+	systemctl restart prosody
216
+	touch /home/$MY_USERNAME/README
217
+
218
+	if [ ! -d /var/lib/tor ]; then
219
+		echo $'No Tor installation found. XMPP onion site cannot be configured.'
220
+		exit 877367
221
+	fi
222
+	if ! grep -q "hidden_service_xmpp" /etc/tor/torrc; then
223
+		echo 'HiddenServiceDir /var/lib/tor/hidden_service_xmpp/' >> /etc/tor/torrc
224
+		echo "HiddenServicePort 5222 127.0.0.1:5222" >> /etc/tor/torrc
225
+		echo "HiddenServicePort 5269 127.0.0.1:5269" >> /etc/tor/torrc
226
+		echo $'Added onion site for XMPP chat'
227
+	fi
228
+
229
+	systemctl restart tor
230
+	wait_for_onion_service 'xmpp'
231
+
232
+	if [ ! -f /var/lib/tor/hidden_service_xmpp/hostname ]; then
233
+		echo $'XMPP onion site hostname not found'
234
+		exit 65349
235
+	fi
236
+	XMPP_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_xmpp/hostname)
237
+	if ! grep -q "${XMPP_ONION_HOSTNAME}" /etc/prosody/conf.avail/xmpp.cfg.lua; then
238
+		echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
239
+		echo "VirtualHost \"${XMPP_ONION_HOSTNAME}\"" >> /etc/prosody/conf.avail/xmpp.cfg.lua
240
+		echo '    modules_enabled = { "onions" };' >> /etc/prosody/conf.avail/xmpp.cfg.lua
241
+	fi
242
+	if ! grep -q "XMPP onion domain" $COMPLETION_FILE; then
243
+		echo "XMPP onion domain:${XMPP_ONION_HOSTNAME}" >> $COMPLETION_FILE
244
+	else
245
+		sed -i "s|XMPP onion domain.*|XMPP onion domain:${XMPP_ONION_HOSTNAME}|g" $COMPLETION_FILE
246
+	fi
247
+
248
+	if ! grep -q "Your XMPP password is" /home/$MY_USERNAME/README; then
249
+		if [ ${#XMPP_PASSWORD} -lt 8 ]; then
250
+			if [ -f $IMAGE_PASSWORD_FILE ]; then
251
+				XMPP_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
252
+			else
253
+				XMPP_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
254
+			fi
255
+		fi
256
+		prosodyctl register $MY_USERNAME $DEFAULT_DOMAIN_NAME $XMPP_PASSWORD
257
+		echo '' >> /home/$MY_USERNAME/README
258
+		echo '' >> /home/$MY_USERNAME/README
259
+		echo $'XMPP' >> /home/$MY_USERNAME/README
260
+		echo '====' >> /home/$MY_USERNAME/README
261
+		echo $"XMPP onion domain: ${XMPP_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
262
+		echo $"Your XMPP password is: $XMPP_PASSWORD" >> /home/$MY_USERNAME/README
263
+		echo $'You can change it with: ' >> /home/$MY_USERNAME/README
264
+		echo '' >> /home/$MY_USERNAME/README
265
+		echo "    prosodyctl passwd $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/README
266
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
267
+		chmod 600 /home/$MY_USERNAME/README
268
+	fi
269
+
270
+	function_check configure_firewall_for_xmpp
271
+	configure_firewall_for_xmpp
272
+
273
+	echo 'install_xmpp' >> $COMPLETION_FILE
274
+}
275
+
276
+function install_xmpp_client {
277
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
278
+		return
279
+	fi
280
+	if grep -Fxq "install_xmpp_client" $COMPLETION_FILE; then
281
+		return
282
+	fi
283
+	apt-get -y install profanity
284
+
285
+	XMPP_CLIENT_DIR=/home/$MY_USERNAME/.local/share/profanity
286
+	XMPP_CLIENT_ACCOUNTS=$XMPP_CLIENT_DIR/accounts
287
+	if [ ! -d $XMPP_CLIENT_DIR ]; then
288
+		mkdir -p $XMPP_CLIENT_DIR
289
+	fi
290
+
291
+	if [[ $ONION_ONLY == 'no' ]]; then
292
+		echo "[${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}]" > $XMPP_CLIENT_ACCOUNTS
293
+		echo 'enabled=true' >> $XMPP_CLIENT_ACCOUNTS
294
+		echo "jid=${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}" >> $XMPP_CLIENT_ACCOUNTS
295
+		echo 'resource=profanity' >> $XMPP_CLIENT_ACCOUNTS
296
+		echo "muc.service=conference.${DEFAULT_DOMAIN_NAME}" >> $XMPP_CLIENT_ACCOUNTS
297
+		echo "muc.nick=${MY_USERNAME}" >> $XMPP_CLIENT_ACCOUNTS
298
+		echo 'presence.last=online' >> $XMPP_CLIENT_ACCOUNTS
299
+		echo 'presence.login=online' >> $XMPP_CLIENT_ACCOUNTS
300
+		echo 'priority.online=0' >> $XMPP_CLIENT_ACCOUNTS
301
+		echo 'priority.chat=0' >> $XMPP_CLIENT_ACCOUNTS
302
+		echo 'priority.away=0' >> $XMPP_CLIENT_ACCOUNTS
303
+		echo 'priority.xa=0' >> $XMPP_CLIENT_ACCOUNTS
304
+		echo 'priority.dnd=0' >> $XMPP_CLIENT_ACCOUNTS
305
+		if [ ${#XMPP_PASSWORD} -gt 2 ]; then
306
+			echo "password=$XMPP_PASSWORD" >> $XMPP_CLIENT_ACCOUNTS
307
+		fi
308
+	fi
309
+
310
+	if [ -f /var/lib/tor/hidden_service_xmpp/hostname ]; then
311
+		XMPP_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_xmpp/hostname)
312
+		echo "[${MY_USERNAME}@${XMPP_ONION_HOSTNAME}]" >> $XMPP_CLIENT_ACCOUNTS
313
+		if [[ $ONION_ONLY == 'no' ]]; then
314
+			echo 'enabled=false' >> $XMPP_CLIENT_ACCOUNTS
315
+		else
316
+			echo 'enabled=true' >> $XMPP_CLIENT_ACCOUNTS
317
+		fi
318
+		echo "jid=${MY_USERNAME}@${XMPP_ONION_HOSTNAME}" >> $XMPP_CLIENT_ACCOUNTS
319
+		echo 'resource=profanity' >> $XMPP_CLIENT_ACCOUNTS
320
+		echo "muc.service=conference.${XMPP_ONION_HOSTNAME}" >> $XMPP_CLIENT_ACCOUNTS
321
+		echo "muc.nick=${MY_USERNAME}" >> $XMPP_CLIENT_ACCOUNTS
322
+		echo 'presence.last=online' >> $XMPP_CLIENT_ACCOUNTS
323
+		echo 'presence.login=online' >> $XMPP_CLIENT_ACCOUNTS
324
+		echo 'priority.online=0' >> $XMPP_CLIENT_ACCOUNTS
325
+		echo 'priority.chat=0' >> $XMPP_CLIENT_ACCOUNTS
326
+		echo 'priority.away=0' >> $XMPP_CLIENT_ACCOUNTS
327
+		echo 'priority.xa=0' >> $XMPP_CLIENT_ACCOUNTS
328
+		echo 'priority.dnd=0' >> $XMPP_CLIENT_ACCOUNTS
329
+		if [ ${#XMPP_PASSWORD} -gt 2 ]; then
330
+			echo "password=$XMPP_PASSWORD" >> $XMPP_CLIENT_ACCOUNTS
331
+		fi
332
+	fi
333
+
334
+	if [ ! -d /home/$MY_USERNAME/.config/profanity ]; then
335
+		mkdir /home/$MY_USERNAME/.config/profanity
336
+	fi
337
+	echo '[connection]' > /home/$MY_USERNAME/.config/profanity/profrc
338
+	echo "account=${MY_USERNAME}@${DEFAULT_DOMAIN_NAME}" >> /home/$MY_USERNAME/.config/profanity/profrc
339
+
340
+	chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.local
341
+	chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
342
+
343
+	echo 'install_xmpp_client' >> $COMPLETION_FILE
344
+}
345
+
346
+# NOTE: deliberately no exit 0

+ 384
- 0
src/freedombone-app-zeronet View File

@@ -0,0 +1,384 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Zeronet functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+ZERONET_REPO="https://github.com/HelloZeroNet/ZeroNet.git"
32
+ZERONET_COMMIT='675bd462556c541d65e2d95f91f899146a373aad'
33
+ZERONET_BLOG_REPO="https://github.com/HelloZeroNet/ZeroBlog"
34
+ZERONET_BLOG_COMMIT='bbb0d6c36465fed2e6df71f1aab45fcc9c6ad609'
35
+ZERONET_MAIL_REPO="https://github.com/HelloZeroNet/ZeroMail"
36
+ZERONET_MAIL_COMMIT='955af09d643c72b02e4983d71eca5c0c93a6c131'
37
+ZERONET_FORUM_REPO="https://github.com/HelloZeroNet/ZeroTalk"
38
+ZERONET_FORUM_COMMIT='e2d2c9cb1cfbfef91b244935efb5c14c2ad95faa'
39
+ZERONET_URL=http://127.0.0.1:43110
40
+ZERONET_PORT=15441
41
+TRACKER_PORT=6969
42
+ZERONET_DEFAULT_BLOG_TAGLINE="Blogging on the Mesh"
43
+ZERONET_DEFAULT_FORUM_TAGLINE="A decentralized discussion group"
44
+ZERONET_DEFAULT_MAIL_TAGLINE="Mail for the Mesh"
45
+ZERONET_ID_REPO="https://github.com/HelloZeroNet/ZeroID"
46
+ZERONET_ID_COMMIT='ccf14fdc96fa9cdb2ddd8a7ab283a8e17a4f234b'
47
+
48
+function install_zeronet_blog {
49
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
50
+		return
51
+	fi
52
+
53
+    function_check set_repo_commit
54
+	set_repo_commit $MESH_INSTALL_DIR/zeronet/ZeroBlog "ZeroNet Blog commit" "$ZERONET_BLOG_COMMIT" $ZERONET_BLOG_REPO
55
+
56
+	if grep -Fxq "install_zeronet_blog" $COMPLETION_FILE; then
57
+		return
58
+	fi
59
+
60
+	if [ ! -f /home/$MY_USERNAME/README ]; then
61
+		touch /home/$MY_USERNAME/README
62
+	fi
63
+
64
+	if grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
65
+		return
66
+	fi
67
+
68
+	if [ ! -d /etc/avahi ]; then
69
+		echo $'Avahi is not installed'
70
+		exit 736
71
+	fi
72
+
73
+	ZERONET_DEFAULT_BLOG_TITLE="${MY_USERNAME}'s Blog"
74
+
75
+	cd $MESH_INSTALL_DIR/zeronet
76
+	python zeronet.py --batch siteCreate 2> $MESH_INSTALL_DIR/zeronet/blog.txt
77
+	if [ ! -f $MESH_INSTALL_DIR/zeronet/blog.txt ]; then
78
+		echo $'Unable to create blog'
79
+		exit 479
80
+	fi
81
+	blog_address=$(cat blog.txt | grep "Site address" | awk -F ':' '{print $2}')
82
+	blog_private_key=$(cat blog.txt | grep "Site private key" | awk -F ':' '{print $2}')
83
+	ZERONET_BLOG_ADDRESS=${blog_address//[[:blank:]]/}
84
+	ZERONET_BLOG_PRIVATE_KEY=${blog_private_key//[[:blank:]]/}
85
+
86
+	if [ ${#ZERONET_BLOG_ADDRESS} -lt 20 ]; then
87
+		echo $"Address:    $ZERONET_BLOG_ADDRESS"
88
+		echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
89
+		echo $'Unable to create zeronet blog address'
90
+		exit 7358
91
+	fi
92
+
93
+	if [ ${#ZERONET_BLOG_PRIVATE_KEY} -lt 20 ]; then
94
+		echo $"Address:    $ZERONET_BLOG_ADDRESS"
95
+		echo $"Public key: $ZERONET_BLOG_PRIVATE_KEY"
96
+		echo $'Unable to create zeronet blog private key'
97
+		exit 1639
98
+	fi
99
+
100
+	if [ ! -d "$MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS" ]; then
101
+		echo $"Unable to find site directory: $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS"
102
+		exit 7638
103
+	fi
104
+
105
+    function_check git_clone
106
+	git_clone $ZERONET_BLOG_REPO ZeroBlog
107
+	if [ ! -d $MESH_INSTALL_DIR/zeronet/ZeroBlog ]; then
108
+		echo $'ZeroBlog repo could not be cloned'
109
+		exit 6739
110
+	fi
111
+	cd $MESH_INSTALL_DIR/zeronet/ZeroBlog
112
+	git checkout $ZERONET_BLOG_COMMIT -b $ZERONET_BLOG_COMMIT
113
+	if ! grep -q "ZeroNet Blog commit" $COMPLETION_FILE; then
114
+		echo "ZeroNet Blog commit:$ZERONET_BLOG_COMMIT" >> $COMPLETION_FILE
115
+	else
116
+		sed -i "s/ZeroNet Blog commit.*/ZeroNet Blog commit:$ZERONET_BLOG_COMMIT/g" $COMPLETION_FILE
117
+	fi
118
+
119
+	echo $"ZeroNet Blog address:     $ZERONET_BLOG_ADDRESS"
120
+	echo $"ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY"
121
+	cp -r $MESH_INSTALL_DIR/zeronet/ZeroBlog/* $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS
122
+
123
+	if [ ! -d $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/data ]; then
124
+		mkdir $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/data
125
+	fi
126
+	cp $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/data-default/data.json $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/data
127
+	sed -i "s/MyZeroBlog/$ZERONET_DEFAULT_BLOG_TITLE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
128
+	sed -i "s/My ZeroBlog./$ZERONET_DEFAULT_BLOG_TAGLINE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/data/data.json
129
+	sed -i "s/ZeroBlog Demo/$ZERONET_DEFAULT_BLOG_TITLE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
130
+	sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_BLOG_TAGLINE</h3>|g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/index.html
131
+	sed -i "s/Blogging platform Demo/Blogging platform/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_BLOG_ADDRESS/content.json
132
+	python zeronet.py siteSign $ZERONET_BLOG_ADDRESS $ZERONET_BLOG_PRIVATE_KEY
133
+
134
+	# Add an avahi service
135
+	function_check create_avahi_service
136
+	create_avahi_service zeronet-blog "zeronet-blog" udp $ZERONET_PORT "$ZERONET_URL/$ZERONET_BLOG_ADDRESS"
137
+	cp /tmp/zeronet-blog.service /etc/avahi/services/zeronet-blog.service
138
+
139
+	if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
140
+		mkdir -p /home/$MY_USERNAME/.config/zeronet
141
+		chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
142
+	fi
143
+	echo "$ZERONET_URL/$ZERONET_BLOG_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myblog
144
+
145
+	if ! grep -q "ZeroNet Blog address" /home/$MY_USERNAME/README; then
146
+		echo '' >> /home/$MY_USERNAME/README
147
+		echo "ZeroNet Blog address: $ZERONET_BLOG_ADDRESS" >> /home/$MY_USERNAME/README
148
+		echo "ZeroNet Blog private key: $ZERONET_BLOG_PRIVATE_KEY" >> /home/$MY_USERNAME/README
149
+	fi
150
+
151
+	echo 'install_zeronet_blog' >> $COMPLETION_FILE
152
+}
153
+
154
+function install_zeronet_mail {
155
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
156
+		return
157
+	fi
158
+
159
+    function_check set_repo_commit
160
+	set_repo_commit $MESH_INSTALL_DIR/zeronet/ZeroMail "ZeroNet Mail commit" "$ZERONET_MAIL_COMMIT" $ZERONET_MAIL_REPO
161
+
162
+	if grep -Fxq "install_zeronet_mail" $COMPLETION_FILE; then
163
+		return
164
+	fi
165
+
166
+	if [ ! -f /home/$MY_USERNAME/README ]; then
167
+		touch /home/$MY_USERNAME/README
168
+	fi
169
+
170
+	if grep -q "ZeroNet Mail address" /home/$MY_USERNAME/README; then
171
+		return
172
+	fi
173
+
174
+	if [ ! -d /etc/avahi ]; then
175
+		echo 'Avahi is not installed'
176
+		exit 736
177
+	fi
178
+
179
+	ZERONET_DEFAULT_MAIL_TITLE="${MY_USERNAME}'s Mail"
180
+
181
+	cd $MESH_INSTALL_DIR/zeronet
182
+	python zeronet.py --batch siteCreate 2> $MESH_INSTALL_DIR/zeronet/mail.txt
183
+	if [ ! -f $MESH_INSTALL_DIR/zeronet/mail.txt ]; then
184
+		echo $'Unable to create mail'
185
+		exit 479
186
+	fi
187
+	mail_address=$(cat mail.txt | grep "Site address" | awk -F ':' '{print $2}')
188
+	mail_private_key=$(cat mail.txt | grep "Site private key" | awk -F ':' '{print $2}')
189
+	ZERONET_MAIL_ADDRESS=${mail_address//[[:blank:]]/}
190
+	ZERONET_MAIL_PRIVATE_KEY=${mail_private_key//[[:blank:]]/}
191
+
192
+	if [ ${#ZERONET_MAIL_ADDRESS} -lt 20 ]; then
193
+		echo $"Address:    $ZERONET_MAIL_ADDRESS"
194
+		echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
195
+		echo $'Unable to create zeronet mail address'
196
+		exit 7358
197
+	fi
198
+
199
+	if [ ${#ZERONET_MAIL_PRIVATE_KEY} -lt 20 ]; then
200
+		echo $"Address:    $ZERONET_MAIL_ADDRESS"
201
+		echo $"Public key: $ZERONET_MAIL_PRIVATE_KEY"
202
+		echo $'Unable to create zeronet mail private key'
203
+		exit 1639
204
+	fi
205
+
206
+	if [ ! -d "$MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS" ]; then
207
+		echo $"Unable to find site directory: $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS"
208
+		exit 7638
209
+	fi
210
+
211
+    function_check git_clone
212
+	git_clone $ZERONET_MAIL_REPO ZeroMail
213
+	if [ ! -d $MESH_INSTALL_DIR/zeronet/ZeroMail ]; then
214
+		echo $'ZeroMail repo could not be cloned'
215
+		exit 6739
216
+	fi
217
+	cd $MESH_INSTALL_DIR/zeronet/ZeroMail
218
+	git checkout $ZERONET_MAIL_COMMIT -b $ZERONET_MAIL_COMMIT
219
+	if ! grep -q "ZeroNet Mail commit" $COMPLETION_FILE; then
220
+		echo "ZeroNet Mail commit:$ZERONET_MAIL_COMMIT" >> $COMPLETION_FILE
221
+	else
222
+		sed -i "s/ZeroNet Mail commit.*/ZeroNet Mail commit:$ZERONET_MAIL_COMMIT/g" $COMPLETION_FILE
223
+	fi
224
+
225
+	echo $"ZeroNet Mail address:     $ZERONET_MAIL_ADDRESS"
226
+	echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY"
227
+	cp -r $MESH_INSTALL_DIR/zeronet/ZeroMail/* $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS
228
+
229
+	if [ ! -d $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/data ]; then
230
+		mkdir $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/data
231
+	fi
232
+	cp $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/data-default/data.json $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/data
233
+	sed -i "s/MyZeroMail/$ZERONET_DEFAULT_MAIL_TITLE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
234
+	sed -i "s/My ZeroMail./$ZERONET_DEFAULT_MAIL_TAGLINE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/data/data.json
235
+	sed -i "s/ZeroMail Demo/$ZERONET_DEFAULT_MAIL_TITLE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
236
+	sed -i "s|<h3 class=\"description\">.*|<h3 class=\"description\">$ZERONET_DEFAULT_MAIL_TAGLINE</h3>|g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/index.html
237
+	sed -i "s/Mailging platform Demo/Mailging platform/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_MAIL_ADDRESS/content.json
238
+	python zeronet.py siteSign $ZERONET_MAIL_ADDRESS $ZERONET_MAIL_PRIVATE_KEY
239
+
240
+	# Add an avahi service
241
+	function_check create_avahi_service
242
+	create_avahi_service zeronet-mail "zeronet-mail" udp $ZERONET_PORT "$ZERONET_URL/$ZERONET_MAIL_ADDRESS"
243
+	cp /tmp/zeronet-mail.service /etc/avahi/services/zeronet-mail.service
244
+
245
+	if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
246
+		mkdir -p /home/$MY_USERNAME/.config/zeronet
247
+		chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
248
+	fi
249
+	echo "$ZERONET_URL/$ZERONET_MAIL_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/mymail
250
+
251
+	if ! grep -q $"ZeroNet Mail address" /home/$MY_USERNAME/README; then
252
+		echo '' >> /home/$MY_USERNAME/README
253
+		echo $"ZeroNet Mail address: $ZERONET_MAIL_ADDRESS" >> /home/$MY_USERNAME/README
254
+		echo $"ZeroNet Mail private key: $ZERONET_MAIL_PRIVATE_KEY" >> /home/$MY_USERNAME/README
255
+	fi
256
+
257
+	echo 'install_zeronet_mail' >> $COMPLETION_FILE
258
+}
259
+
260
+function install_zeronet_forum {
261
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
262
+		return
263
+	fi
264
+
265
+	# update to the next commit
266
+	function_check set_repo_commit
267
+	set_repo_commit $MESH_INSTALL_DIR/zeronet/ZeroTalk "ZeroNet Forum commit" "$ZERONET_FORUM_COMMIT" $ZERONET_FORUM_REPO
268
+
269
+	if grep -Fxq "install_zeronet_forum" $COMPLETION_FILE; then
270
+		return
271
+	fi
272
+
273
+	if [ ! -f /home/$MY_USERNAME/README ]; then
274
+		touch /home/$MY_USERNAME/README
275
+	fi
276
+
277
+	if grep -q "ZeroNet Forum address" /home/$MY_USERNAME/README; then
278
+		return
279
+	fi
280
+
281
+	if [ ! -d /etc/avahi ]; then
282
+		echo $'Avahi is not installed'
283
+		exit 736
284
+	fi
285
+
286
+	ZERONET_DEFAULT_FORUM_TITLE=$"${MY_USERNAME}'s Forum"
287
+
288
+	cd $MESH_INSTALL_DIR/zeronet
289
+	python zeronet.py --batch siteCreate 2> $MESH_INSTALL_DIR/zeronet/forum.txt
290
+	if [ ! -f $MESH_INSTALL_DIR/zeronet/forum.txt ]; then
291
+		echo $'Unable to create forum'
292
+		exit 479
293
+	fi
294
+	forum_address=$(cat forum.txt | grep "Site address" | awk -F ':' '{print $2}')
295
+	forum_private_key=$(cat forum.txt | grep "Site private key" | awk -F ':' '{print $2}')
296
+	ZERONET_FORUM_ADDRESS=${forum_address//[[:blank:]]/}
297
+	ZERONET_FORUM_PRIVATE_KEY=${forum_private_key//[[:blank:]]/}
298
+
299
+	if [ ${#ZERONET_FORUM_ADDRESS} -lt 20 ]; then
300
+		echo $"Address:    $ZERONET_FORUM_ADDRESS"
301
+		echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
302
+		echo $'Unable to create zeronet forum address'
303
+		exit 76352
304
+	fi
305
+
306
+	if [ ${#ZERONET_FORUM_PRIVATE_KEY} -lt 20 ]; then
307
+		echo $"Address:    $ZERONET_FORUM_ADDRESS"
308
+		echo $"Public key: $ZERONET_FORUM_PRIVATE_KEY"
309
+		echo $'Unable to create zeronet forum private key'
310
+		exit 87356
311
+	fi
312
+
313
+	if [ ! -d "$MESH_INSTALL_DIR/zeronet/data/$ZERONET_FORUM_ADDRESS" ]; then
314
+		echo $"Unable to find site directory: $MESH_INSTALL_DIR/zeronet/data/$ZERONET_FORUM_ADDRESS"
315
+		exit 7638
316
+	fi
317
+
318
+    function_check git_clone
319
+	git_clone $ZERONET_FORUM_REPO ZeroTalk
320
+	if [ ! -d $MESH_INSTALL_DIR/zeronet/ZeroTalk ]; then
321
+		echo $'ZeroTalk repo could not be cloned'
322
+		exit 6739
323
+	fi
324
+	git checkout $ZERONET_FORUM_COMMIT -b $ZERONET_FORUM_COMMIT
325
+	if ! grep -q "ZeroNet Forum commit" $COMPLETION_FILE; then
326
+		echo "ZeroNet Forum commit:$ZERONET_FORUM_COMMIT" >> $COMPLETION_FILE
327
+	else
328
+		sed -i "s/ZeroNet Forum commit.*/ZeroNet Forum commit:$ZERONET_FORUM_COMMIT/g" $COMPLETION_FILE
329
+	fi
330
+
331
+	echo $"Forum address:     $ZERONET_FORUM_ADDRESS"
332
+	echo $"Forum private key: $ZERONET_FORUM_PRIVATE_KEY"
333
+	cp -r $MESH_INSTALL_DIR/zeronet/ZeroTalk/* $MESH_INSTALL_DIR/zeronet/data/$ZERONET_FORUM_ADDRESS
334
+	sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
335
+	sed -i "s/ZeroTalk/$ZERONET_DEFAULT_FORUM_TITLE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
336
+	sed -i "s|Demo for dynamic, decentralized content publishing.|$ZERONET_DEFAULT_FORUM_TAGLINE|g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_FORUM_ADDRESS/index.html
337
+	sed -i 's/Messaging Board Demo/Messaging Board/g' $MESH_INSTALL_DIR/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
338
+	sed -i "s/ZeroBoard/$ZERONET_DEFAULT_FORUM_TITLE/g" $MESH_INSTALL_DIR/zeronet/data/$ZERONET_FORUM_ADDRESS/content.json
339
+	python zeronet.py siteSign $ZERONET_FORUM_ADDRESS $ZERONET_FORUM_PRIVATE_KEY --inner_path data/users/content.json
340
+
341
+	# Add an avahi service
342
+	function_check create_avahi_service
343
+	create_avahi_service zeronet-forum "zeronet-forum" udp $ZERONET_PORT "$ZERONET_URL/$ZERONET_FORUM_ADDRESS"
344
+	sudo cp /tmp/zeronet-forum.service /etc/avahi/services/zeronet-forum.service
345
+
346
+	if [ ! -d /home/$MY_USERNAME/.config/zeronet ]; then
347
+		mkdir -p /home/$MY_USERNAME/.config/zeronet
348
+		chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.config
349
+	fi
350
+	echo "$ZERONET_URL/$ZERONET_FORUM_ADDRESS" > /home/$MY_USERNAME/.config/zeronet/myforum
351
+
352
+	if ! grep -q $"ZeroNet Forum address" /home/$MY_USERNAME/README; then
353
+		echo '' >> /home/$MY_USERNAME/README
354
+		echo $"ZeroNet Forum address: $ZERONET_FORUM_ADDRESS" >> /home/$MY_USERNAME/README
355
+		echo $"ZeroNet Forum private key: $ZERONET_FORUM_PRIVATE_KEY" >> /home/$MY_USERNAME/README
356
+	fi
357
+
358
+	echo 'install_zeronet_forum' >> $COMPLETION_FILE
359
+}
360
+
361
+function install_zeronet {
362
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
363
+		return
364
+	fi
365
+
366
+	# update to the next commit
367
+	function_check set_repo_commit
368
+	set_repo_commit $MESH_INSTALL_DIR/zeronet "ZeroNet commit" "$ZERONET_COMMIT" $ZERONET_REPO
369
+
370
+	if grep -Fxq "install_zeronet" $COMPLETION_FILE; then
371
+		return
372
+	fi
373
+
374
+	${PROJECT_NAME}-mesh-install -f zeronet
375
+	systemctl daemon-reload
376
+	systemctl start tracker.service
377
+	systemctl start zeronet.service
378
+
379
+	function_check configure_firewall_for_zeronet
380
+	configure_firewall_for_zeronet
381
+	echo 'install_zeronet' >> $COMPLETION_FILE
382
+}
383
+
384
+# NOTE: deliberately no exit 0

+ 85
- 0
src/freedombone-utils-avahi View File

@@ -0,0 +1,85 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Avahi functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function create_avahi_service {
32
+	service_name=$1
33
+	service_type=$2
34
+	service_protocol=$3
35
+	service_port=$4
36
+	service_description="$5"
37
+
38
+	if [ ! -d /etc/avahi ]; then
39
+	    echo $'create_avahi_service: avahi was not installed'
40
+		exit 52925
41
+	fi
42
+
43
+	echo '<?xml version="1.0" standalone="no"?><!--*-nxml-*-->' > /etc/avahi/services/${service_name}.service
44
+	echo '<!DOCTYPE service-group SYSTEM "avahi-service.dtd">' >> /etc/avahi/services/${service_name}.service
45
+	echo '<service-group>' >> /etc/avahi/services/${service_name}.service
46
+	echo "  <name replace-wildcards=\"yes\">%h ${service_type}</name>" >> /etc/avahi/services/${service_name}.service
47
+	echo '  <service>' >> /etc/avahi/services/${service_name}.service
48
+	echo "    <type>_${service_type}._${service_protocol}</type>" >> /etc/avahi/services/${service_name}.service
49
+	echo "    <port>${service_port}</port>" >> /etc/avahi/services/${service_name}.service
50
+	if [ "$service_description" ]; then
51
+		echo "    <txt-record>$description</txt-record>" >> /tmp/zeronet-blog.service
52
+	fi
53
+	echo '  </service>' >> /etc/avahi/services/${service_name}.service
54
+	echo '</service-group>' >> /etc/avahi/services/${service_name}.service
55
+}
56
+
57
+function configure_avahi {
58
+	if grep -Fxq "configure_avahi" $COMPLETION_FILE; then
59
+		return
60
+	fi
61
+	# only enable avahi if we're doing mesh networking
62
+	if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
63
+		return
64
+	fi
65
+
66
+	${PROJECT_NAME}-mesh-install -f avahi
67
+	if [ ! "$?" = "0" ]; then
68
+		echo $'Failed to install avahi'
69
+		exit 68442
70
+	fi
71
+
72
+	if [ $DEFAULT_DOMAIN_NAME ]; then
73
+		sed -i "s|#host-name=.*|host-name=$DEFAULT_DOMAIN_NAME|g" /etc/avahi/avahi-daemon.conf
74
+		sed -i "s|host-name=.*|host-name=$DEFAULT_DOMAIN_NAME|g" /etc/avahi/avahi-daemon.conf
75
+	else
76
+		decarray=( 1 2 3 4 5 6 7 8 9 0 )
77
+		PEER_ID=${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}
78
+		sed -i "s|#host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf
79
+		sed -i "s|host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf
80
+	fi
81
+
82
+	echo 'configure_avahi' >> $COMPLETION_FILE
83
+}
84
+
85
+# NOTE: deliberately there is no "exit 0"

+ 99
- 0
src/freedombone-utils-backup View File

@@ -0,0 +1,99 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Backup functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function configure_backup_key {
32
+	if grep -Fxq "configure_backup_key" $COMPLETION_FILE; then
33
+		return
34
+	fi
35
+	apt-get -y install gnupg
36
+
37
+	BACKUP_KEY_EXISTS=$(gpg_key_exists "root" "$MY_NAME (backup key)")
38
+	if [[ $BACKUP_KEY_EXISTS == "yes" ]]; then
39
+		return
40
+	fi
41
+
42
+	# Generate a GPG key for backups
43
+	BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
44
+	if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
45
+		echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
46
+		echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
47
+		echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
48
+		echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
49
+		echo "Name-Real:  $MY_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
50
+		echo "Name-Email: $MY_EMAIL_ADDRESS" >> /home/$MY_USERNAME/gpg-genkey.conf
51
+		echo "Name-Comment: backup key" >> /home/$MY_USERNAME/gpg-genkey.conf
52
+		echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
53
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
54
+		echo $'Backup key does not exist. Creating it.'
55
+		su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
56
+		shred -zu /home/$MY_USERNAME/gpg-genkey.conf
57
+		echo $'Checking that the Backup key was created'
58
+		BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)")
59
+		if [[ $BACKUP_KEY_EXISTS == "no" ]]; then
60
+			echo $'Backup key could not be created'
61
+			exit 43382
62
+		fi
63
+	fi
64
+	MY_BACKUP_KEY_ID=$(su -c "gpg --list-keys \"$MY_NAME (backup key)\" | grep 'pub '" - $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
65
+	echo "Backup key: $MY_BACKUP_KEY_ID"
66
+	MY_BACKUP_KEY=/home/$MY_USERNAME/backup_key
67
+	su -c "gpg --output ${MY_BACKUP_KEY}_public.asc --armor --export $MY_BACKUP_KEY_ID" - $MY_USERNAME
68
+	su -c "gpg --output ${MY_BACKUP_KEY}_private.asc --armor --export-secret-key $MY_BACKUP_KEY_ID" - $MY_USERNAME
69
+	if [ ! -f ${MY_BACKUP_KEY}_public.asc ]; then
70
+		echo 'Public backup key could not be exported'
71
+		exit 36829
72
+	fi
73
+	if [ ! -f ${MY_BACKUP_KEY}_private.asc ]; then
74
+		echo 'Private backup key could not be exported'
75
+		exit 29235
76
+	fi
77
+
78
+	# import backup key to root user
79
+	gpg --import --import ${MY_BACKUP_KEY}_public.asc
80
+	gpg --allow-secret-key-import --import ${MY_BACKUP_KEY}_private.asc
81
+
82
+	shred -zu ${MY_BACKUP_KEY}_public.asc
83
+	shred -zu ${MY_BACKUP_KEY}_private.asc
84
+
85
+	echo 'configure_backup_key' >> $COMPLETION_FILE
86
+}
87
+
88
+function backup_to_friends_servers {
89
+	# update crontab
90
+	echo '#!/bin/bash' > /etc/cron.daily/backuptofriends
91
+	echo "if [ -f /usr/local/bin/${PROJECT_NAME}-backup-remote ]; then" >> /etc/cron.daily/backuptofriends
92
+	echo "    /usr/local/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
93
+	echo 'else' >> /etc/cron.daily/backuptofriends
94
+	echo "    /usr/bin/${PROJECT_NAME}-backup-remote" >> /etc/cron.daily/backuptofriends
95
+	echo 'fi' >> /etc/cron.daily/backuptofriends
96
+	chmod +x /etc/cron.daily/backuptofriends
97
+}
98
+
99
+# NOTE: deliberately no exit 0

+ 606
- 0
src/freedombone-utils-config View File

@@ -0,0 +1,606 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Initial reading of the configuration file, typically called freedombone.cfg
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function read_configuration {
32
+	# if not installing on a Beaglebone then use sdb as the USB drive by default
33
+	if [ ! $INSTALLING_ON_BBB ]; then
34
+		if [[ $USB_DRIVE == /dev/sda1 ]]; then
35
+			USB_DRIVE=/dev/sdb1
36
+		fi
37
+	fi
38
+
39
+	if [[ $INSTALLING_FROM_CONFIGURATION_FILE == "yes"  ]]; then
40
+		if [ ! -f $CONFIGURATION_FILE ]; then
41
+			echo $"The configuration file $CONFIGURATION_FILE was not found"
42
+			exit 8935
43
+		fi
44
+	fi
45
+
46
+	if [ -f $CONFIGURATION_FILE ]; then
47
+		read_repo_servers
48
+
49
+		# Ensure that a copy of the config exists for upgrade purposes
50
+		if [[ $CONFIGURATION_FILE != "/root/${PROJECT_NAME}.cfg" ]]; then
51
+			cp $CONFIGURATION_FILE /root/${PROJECT_NAME}.cfg
52
+		fi
53
+		if grep -q "REFRESH_GPG_KEYS_HOURS" $CONFIGURATION_FILE; then
54
+			REFRESH_GPG_KEYS_HOURS=$(grep "REFRESH_GPG_KEYS_HOURS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
55
+		fi
56
+		if grep -q "WEBMAIL_REPO" $CONFIGURATION_FILE; then
57
+			WEBMAIL_REPO=$(grep "WEBMAIL_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
58
+		fi
59
+		if grep -q "WEBMAIL_COMMIT" $CONFIGURATION_FILE; then
60
+			WEBMAIL_COMMIT=$(grep "WEBMAIL_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
61
+		fi
62
+		if grep -q "WIFI_INTERFACE" $CONFIGURATION_FILE; then
63
+			WIFI_INTERFACE=$(grep "WIFI_INTERFACE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
64
+		fi
65
+		if grep -q "WIFI_SSID" $CONFIGURATION_FILE; then
66
+			WIFI_SSID=$(grep "WIFI_SSID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
67
+		fi
68
+		if grep -q "WIFI_TYPE" $CONFIGURATION_FILE; then
69
+			WIFI_TYPE=$(grep "WIFI_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
70
+		fi
71
+		if grep -q "WIFI_PASSPHRASE" $CONFIGURATION_FILE; then
72
+			WIFI_PASSPHRASE=$(grep "WIFI_PASSPHRASE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
73
+		fi
74
+		if grep -q "WIFI_HOTSPOT" $CONFIGURATION_FILE; then
75
+			WIFI_HOTSPOT=$(grep "WIFI_HOTSPOT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
76
+		fi
77
+		if grep -q "WIFI_NETWORKS_FILE" $CONFIGURATION_FILE; then
78
+			WIFI_NETWORKS_FILE=$(grep "WIFI_NETWORKS_FILE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
79
+		fi
80
+		if grep -q "SYNCTHING_ID" $CONFIGURATION_FILE; then
81
+			SYNCTHING_ID=$(grep "SYNCTHING_ID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
82
+		fi
83
+		if grep -q "SYNCTHING_CONFIG_PATH" $CONFIGURATION_FILE; then
84
+			SYNCTHING_CONFIG_PATH=$(grep "SYNCTHING_CONFIG_PATH" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
85
+		fi
86
+		if grep -q "SYNCTHING_CONFIG_FILE" $CONFIGURATION_FILE; then
87
+			SYNCTHING_CONFIG_FILE=$(grep "SYNCTHING_CONFIG_FILE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
88
+		fi
89
+		if grep -q "SYNCTHING_RELAY_SERVER" $CONFIGURATION_FILE; then
90
+			SYNCTHING_RELAY_SERVER=$(grep "SYNCTHING_RELAY_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
91
+		fi
92
+		if grep -q "SYNCTHING_RELEASES" $CONFIGURATION_FILE; then
93
+			SYNCTHING_RELEASES=$(grep "SYNCTHING_RELEASES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
94
+		fi
95
+		if grep -q "SYNCTHING_PORT" $CONFIGURATION_FILE; then
96
+			SYNCTHING_PORT=$(grep "SYNCTHING_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
97
+		fi
98
+		if grep -q "SYNCTHING_SHARED_DATA" $CONFIGURATION_FILE; then
99
+			SYNCTHING_SHARED_DATA=$(grep "SYNCTHING_SHARED_DATA" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
100
+		fi
101
+		if grep -q "VOIP_TURN_PORT" $CONFIGURATION_FILE; then
102
+			VOIP_TURN_PORT=$(grep "VOIP_TURN_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
103
+		fi
104
+		if grep -q "VOIP_TURN_TLS_PORT" $CONFIGURATION_FILE; then
105
+			VOIP_TURN_TLS_PORT=$(grep "VOIP_TURN_TLS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
106
+		fi
107
+		if grep -q "VOIP_TURN_NONCE" $CONFIGURATION_FILE; then
108
+			VOIP_TURN_NONCE=$(grep "VOIP_TURN_NONCE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
109
+		fi
110
+		if grep -q "DEFAULT_SEARCH" $CONFIGURATION_FILE; then
111
+			DEFAULT_SEARCH=$(grep "DEFAULT_SEARCH" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
112
+		fi
113
+		if grep -q "SEARCH_ENGINE_PASSWORD" $CONFIGURATION_FILE; then
114
+			SEARCH_ENGINE_PASSWORD=$(grep "SEARCH_ENGINE_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
115
+		fi
116
+		if grep -q "XMPP_PASSWORD" $CONFIGURATION_FILE; then
117
+			XMPP_PASSWORD=$(grep "XMPP_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
118
+		fi
119
+		if grep -q "RSS_READER_REPO" $CONFIGURATION_FILE; then
120
+			RSS_READER_REPO=$(grep "RSS_READER_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
121
+		fi
122
+		if grep -q "RSS_MOBILE_READER_REPO" $CONFIGURATION_FILE; then
123
+			RSS_MOBILE_READER_REPO=$(grep "RSS_MOBILE_READER_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
124
+		fi
125
+		if grep -q "RSS_READER_COMMIT" $CONFIGURATION_FILE; then
126
+			RSS_READER_COMMIT=$(grep "RSS_READER_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
127
+		fi
128
+		if grep -q "RSS_MOBILE_READER_COMMIT" $CONFIGURATION_FILE; then
129
+			RSS_MOBILE_READER_COMMIT=$(grep "RSS_MOBILE_READER_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
130
+		fi
131
+		if grep -q "RSS_READER_ADMIN_PASSWORD" $CONFIGURATION_FILE; then
132
+			RSS_READER_ADMIN_PASSWORD=$(grep "RSS_READER_ADMIN_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
133
+		fi
134
+		if grep -q "RSS_READER_DOMAIN_NAME" $CONFIGURATION_FILE; then
135
+			RSS_READER_DOMAIN_NAME=$(grep "RSS_READER_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
136
+		fi
137
+		if grep -q "MICROBLOG_BACKGROUND_IMAGE_URL" $CONFIGURATION_FILE; then
138
+			MICROBLOG_BACKGROUND_IMAGE_URL=$(grep "MICROBLOG_BACKGROUND_IMAGE_URL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
139
+		fi
140
+		if grep -q "MICROBLOG_WELCOME_MESSAGE" $CONFIGURATION_FILE; then
141
+			MICROBLOG_WELCOME_MESSAGE=$(grep "MICROBLOG_WELCOME_MESSAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
142
+		fi
143
+		if grep -q "PROJECT_WEBSITE" $CONFIGURATION_FILE; then
144
+			PROJECT_WEBSITE=$(grep "PROJECT_WEBSITE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
145
+		fi
146
+		if grep -q "PROJECT_REPO" $CONFIGURATION_FILE; then
147
+			PROJECT_REPO=$(grep "PROJECT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
148
+		fi
149
+		if grep -q "ONION_ONLY" $CONFIGURATION_FILE; then
150
+			ONION_ONLY=$(grep "ONION_ONLY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
151
+		fi
152
+		if grep -q "IRC_PASSWORD" $CONFIGURATION_FILE; then
153
+			IRC_PASSWORD=$(grep "IRC_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
154
+		fi
155
+		if grep -q "DEFAULT_LANGUAGE" $CONFIGURATION_FILE; then
156
+			DEFAULT_LANGUAGE=$(grep "DEFAULT_LANGUAGE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
157
+		fi
158
+		if grep -q "MINIMAL_INSTALL" $CONFIGURATION_FILE; then
159
+			MINIMAL_INSTALL=$(grep "MINIMAL_INSTALL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
160
+		fi
161
+		if grep -q "LETSENCRYPT_SERVER" $CONFIGURATION_FILE; then
162
+			LETSENCRYPT_SERVER=$(grep "LETSENCRYPT_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
163
+		fi
164
+		if grep -q "FULLBLOG_REPO" $CONFIGURATION_FILE; then
165
+			FULLBLOG_REPO=$(grep "FULLBLOG_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
166
+		fi
167
+		if grep -q "FULLBLOG_COMMIT" $CONFIGURATION_FILE; then
168
+			FULLBLOG_COMMIT=$(grep "FULLBLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
169
+		fi
170
+		if grep -q "GOGS_COMMIT" $CONFIGURATION_FILE; then
171
+			GOGS_COMMIT=$(grep "GOGS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
172
+		fi
173
+		if grep -q "TOXCORE_COMMIT" $CONFIGURATION_FILE; then
174
+			TOXCORE_COMMIT=$(grep "TOXCORE_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
175
+		fi
176
+		if grep -q "TOXIC_COMMIT" $CONFIGURATION_FILE; then
177
+			TOXIC_COMMIT=$(grep "TOXIC_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
178
+		fi
179
+		if grep -q "GPGIT_REPO" $CONFIGURATION_FILE; then
180
+			GPGIT_REPO=$(grep "GPGIT_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
181
+		fi
182
+		if grep -q "GPGIT_COMMIT" $CONFIGURATION_FILE; then
183
+			GPGIT_COMMIT=$(grep "GPGIT_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
184
+		fi
185
+		if grep -q "HUBZILLA_REPO" $CONFIGURATION_FILE; then
186
+			HUBZILLA_REPO=$(grep "HUBZILLA_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
187
+		fi
188
+		if grep -q "HUBZILLA_COMMIT" $CONFIGURATION_FILE; then
189
+			HUBZILLA_COMMIT=$(grep "HUBZILLA_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
190
+		fi
191
+		if grep -q "IPFS_COMMIT" $CONFIGURATION_FILE; then
192
+			IPFS_COMMIT=$(grep "IPFS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
193
+		fi
194
+		if grep -q "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE; then
195
+			ZERONET_BLOG_COMMIT=$(grep "ZERONET_BLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
196
+		fi
197
+		if grep -q "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE; then
198
+			ZERONET_MAIL_COMMIT=$(grep "ZERONET_MAIL_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
199
+		fi
200
+		if grep -q "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE; then
201
+			ZERONET_FORUM_COMMIT=$(grep "ZERONET_FORUM_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
202
+		fi
203
+		if grep -q "MICROBLOG_COMMIT" $CONFIGURATION_FILE; then
204
+			MICROBLOG_COMMIT=$(grep "MICROBLOG_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
205
+		fi
206
+		if grep -q "NGINX_ENSITE_REPO" $CONFIGURATION_FILE; then
207
+			NGINX_ENSITE_REPO=$(grep "NGINX_ENSITE_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
208
+		fi
209
+		if grep -q "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE; then
210
+			NGINX_ENSITE_COMMIT=$(grep "NGINX_ENSITE_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
211
+		fi
212
+		if grep -q "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE; then
213
+			CLEANUP_MAILDIR_COMMIT=$(grep "CLEANUP_MAILDIR_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
214
+		fi
215
+		if grep -q "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE; then
216
+			CLEANUP_MAILDIR_REPO=$(grep "CLEANUP_MAILDIR_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
217
+		fi
218
+		if grep -q "ZERONET_COMMIT" $CONFIGURATION_FILE; then
219
+			ZERONET_COMMIT=$(grep "ZERONET_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
220
+		fi
221
+		if grep -q "INADYN_REPO" $CONFIGURATION_FILE; then
222
+			INADYN_REPO=$(grep "INADYN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
223
+		fi
224
+		if grep -q "INADYN_COMMIT" $CONFIGURATION_FILE; then
225
+			INADYN_COMMIT=$(grep "INADYN_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
226
+		fi
227
+		if grep -q "GPG_KEYSERVER" $CONFIGURATION_FILE; then
228
+			GPG_KEYSERVER=$(grep "GPG_KEYSERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
229
+		fi
230
+		if grep -q "IPFS_PORT" $CONFIGURATION_FILE; then
231
+			IPFS_PORT=$(grep "IPFS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
232
+		fi
233
+		if grep -q "TRACKER_PORT" $CONFIGURATION_FILE; then
234
+			TRACKER_PORT=$(grep "TRACKER_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
235
+		fi
236
+		if grep -q "ZERONET_PORT" $CONFIGURATION_FILE; then
237
+			ZERONET_PORT=$(grep "ZERONET_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
238
+		fi
239
+		if grep -q "DH_KEYLENGTH" $CONFIGURATION_FILE; then
240
+			DH_KEYLENGTH=$(grep "DH_KEYLENGTH" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
241
+		fi
242
+		if grep -q "IRC_PORT" $CONFIGURATION_FILE; then
243
+			IRC_PORT=$(grep "IRC_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
244
+		fi
245
+		if grep -q "WIFI_CHANNEL" $CONFIGURATION_FILE; then
246
+			WIFI_CHANNEL=$(grep "WIFI_CHANNEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
247
+		fi
248
+		if grep -q "BATMAN_CELLID" $CONFIGURATION_FILE; then
249
+			BATMAN_CELLID=$(grep "BATMAN_CELLID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
250
+		fi
251
+		if grep -q "TOX_PORT" $CONFIGURATION_FILE; then
252
+			TOX_PORT=$(grep "TOX_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
253
+		fi
254
+		if grep -q "TOX_NODES" $CONFIGURATION_FILE; then
255
+			TOX_NODES=$(grep "TOX_NODES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
256
+		fi
257
+		if grep -q "TOXCORE_REPO" $CONFIGURATION_FILE; then
258
+			TOXCORE_REPO=$(grep "TOXCORE_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
259
+		fi
260
+		if grep -q "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE; then
261
+			ENABLE_SOCIAL_KEY_MANAGEMENT=$(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
262
+		fi
263
+		if grep -q "IPV6_NETWORK" $CONFIGURATION_FILE; then
264
+			IPV6_NETWORK=$(grep "IPV6_NETWORK" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
265
+		fi
266
+		if grep -q "HWRNG_TYPE" $CONFIGURATION_FILE; then
267
+			HWRNG_TYPE=$(grep "HWRNG_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
268
+		fi
269
+		if grep -q "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE; then
270
+			MEDIAGOBLIN_DOMAIN_NAME=$(grep "MEDIAGOBLIN_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
271
+		fi
272
+		if grep -q "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE; then
273
+			MEDIAGOBLIN_CODE=$(grep "MEDIAGOBLIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
274
+		fi
275
+		if grep -q "MEDIAGOBLIN_REPO" $CONFIGURATION_FILE; then
276
+			MEDIAGOBLIN_REPO=$(grep "MEDIAGOBLIN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
277
+		fi
278
+		if grep -q "MEDIAGOBLIN_COMMIT" $CONFIGURATION_FILE; then
279
+			MEDIAGOBLIN_COMMIT=$(grep "MEDIAGOBLIN_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
280
+		fi
281
+		if grep -q "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE; then
282
+			GIT_ADMIN_PASSWORD=$(grep "GIT_ADMIN_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
283
+		fi
284
+		if grep -q "GIT_DOMAIN_NAME" $CONFIGURATION_FILE; then
285
+			GIT_DOMAIN_NAME=$(grep "GIT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
286
+		fi
287
+		if grep -q "GIT_CODE" $CONFIGURATION_FILE; then
288
+			GIT_CODE=$(grep "GIT_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
289
+		fi
290
+		if grep -q "SYSTEM_TYPE" $CONFIGURATION_FILE; then
291
+			SYSTEM_TYPE=$(grep "SYSTEM_TYPE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
292
+		fi
293
+		if grep -q "SSL_PROTOCOLS" $CONFIGURATION_FILE; then
294
+			SSL_PROTOCOLS=$(grep "SSL_PROTOCOLS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
295
+		fi
296
+		if grep -q "SSL_CIPHERS" $CONFIGURATION_FILE; then
297
+			SSL_CIPHERS=$(grep "SSL_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
298
+		fi
299
+		if grep -q "SSH_CIPHERS" $CONFIGURATION_FILE; then
300
+			SSH_CIPHERS=$(grep "SSH_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
301
+		fi
302
+		if grep -q "SSH_MACS" $CONFIGURATION_FILE; then
303
+			SSH_MACS=$(grep "SSH_MACS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
304
+		fi
305
+		if grep -q "SSH_KEX" $CONFIGURATION_FILE; then
306
+			SSH_KEX=$(grep "SSH_KEX" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
307
+		fi
308
+		if grep -q "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE; then
309
+			SSH_HOST_KEY_ALGORITHMS=$(grep "SSH_HOST_KEY_ALGORITHMS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
310
+		fi
311
+		if grep -q "SSH_PASSWORDS" $CONFIGURATION_FILE; then
312
+			SSH_PASSWORDS=$(grep "SSH_PASSWORDS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
313
+		fi
314
+		if grep -q "XMPP_CIPHERS" $CONFIGURATION_FILE; then
315
+			XMPP_CIPHERS=$(grep "XMPP_CIPHERS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
316
+		fi
317
+		if grep -q "XMPP_ECC_CURVE" $CONFIGURATION_FILE; then
318
+			XMPP_ECC_CURVE=$(grep "XMPP_ECC_CURVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
319
+		fi
320
+		if grep -q "MY_USERNAME" $CONFIGURATION_FILE; then
321
+			MY_USERNAME=$(grep "MY_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
322
+		fi
323
+		if grep -q "DOMAIN_NAME" $CONFIGURATION_FILE; then
324
+			# for backwards compatability
325
+			DEFAULT_DOMAIN_NAME=$(grep "DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
326
+		fi
327
+		if grep -q "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE; then
328
+			DEFAULT_DOMAIN_NAME=$(grep "DEFAULT_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
329
+		fi
330
+		if grep -q "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE; then
331
+			DEFAULT_DOMAIN_CODE=$(grep "DEFAULT_DOMAIN_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
332
+		fi
333
+		if grep -q "NAMESERVER1" $CONFIGURATION_FILE; then
334
+			NAMESERVER1=$(grep "NAMESERVER1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
335
+		fi
336
+		if grep -q "NAMESERVER2" $CONFIGURATION_FILE; then
337
+			NAMESERVER2=$(grep "NAMESERVER2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
338
+		fi
339
+		if grep -q "DEBIAN_REPO" $CONFIGURATION_FILE; then
340
+			DEBIAN_REPO=$(grep "DEBIAN_REPO" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
341
+			CHECK_MESSAGE=$"Check your internet connection, /etc/network/interfaces and /etc/resolv.conf, then delete $COMPLETION_FILE, run 'rm -fR /var/lib/apt/lists/* && apt-get update --fix-missing' and run this script again. If hash sum mismatches persist then try setting $DEBIAN_REPO to a different mirror and also change /etc/apt/sources.list."
342
+		fi
343
+		if grep -q "VOIP_PORT" $CONFIGURATION_FILE; then
344
+			VOIP_PORT=$(grep "VOIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
345
+		fi
346
+		if grep -q "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
347
+			VOIP_SERVER_PASSWORD=$(grep "VOIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
348
+		fi
349
+		if grep -q "SIP_PORT" $CONFIGURATION_FILE; then
350
+			SIP_PORT=$(grep "SIP_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
351
+		fi
352
+		if grep -q "SIP_TLS_PORT" $CONFIGURATION_FILE; then
353
+			SIP_TLS_PORT=$(grep "SIP_TLS_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
354
+		fi
355
+		if grep -q "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE; then
356
+			SIP_SERVER_PASSWORD=$(grep "SIP_SERVER_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
357
+		fi
358
+		if grep -q "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE; then
359
+			GET_IP_ADDRESS_URL=$(grep "GET_IP_ADDRESS_URL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
360
+		fi
361
+		if grep -q "DDNS_PROVIDER" $CONFIGURATION_FILE; then
362
+			DDNS_PROVIDER=$(grep "DDNS_PROVIDER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
363
+		fi
364
+		if grep -q "DDNS_USERNAME" $CONFIGURATION_FILE; then
365
+			DDNS_USERNAME=$(grep "DDNS_USERNAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
366
+		fi
367
+		if grep -q "DDNS_PASSWORD" $CONFIGURATION_FILE; then
368
+			DDNS_PASSWORD=$(grep "DDNS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
369
+		fi
370
+		if grep -q "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE; then
371
+			LOCAL_NETWORK_STATIC_IP_ADDRESS=$(grep "LOCAL_NETWORK_STATIC_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
372
+		fi
373
+		if grep -q "ENABLE_BABEL" $CONFIGURATION_FILE; then
374
+			ENABLE_BABEL=$(grep "ENABLE_BABEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
375
+		fi
376
+		if grep -q "ENABLE_BATMAN" $CONFIGURATION_FILE; then
377
+			ENABLE_BATMAN=$(grep "ENABLE_BATMAN" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
378
+		fi
379
+		if grep -q "ENABLE_CJDNS" $CONFIGURATION_FILE; then
380
+			ENABLE_CJDNS=$(grep "ENABLE_CJDNS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
381
+		fi
382
+		if grep -q "CJDNS_COMMIT" $CONFIGURATION_FILE; then
383
+			CJDNS_COMMIT=$(grep "CJDNS_COMMIT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
384
+		fi
385
+		if grep -q "CJDNS_IPV6" $CONFIGURATION_FILE; then
386
+			CJDNS_IPV6=$(grep "CJDNS_IPV6" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
387
+		fi
388
+		if grep -q "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE; then
389
+			CJDNS_PUBLIC_KEY=$(grep "CJDNS_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
390
+		fi
391
+		if grep -q "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE; then
392
+			CJDNS_PRIVATE_KEY=$(grep "CJDNS_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
393
+		fi
394
+		if grep -q "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE; then
395
+			ROUTER_IP_ADDRESS=$(grep "ROUTER_IP_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
396
+		fi
397
+		if grep -q "CPU_CORES" $CONFIGURATION_FILE; then
398
+			CPU_CORES=$(grep "CPU_CORES" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
399
+		fi
400
+		if grep -q "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE; then
401
+			WEBSERVER_LOG_LEVEL=$(grep "WEBSERVER_LOG_LEVEL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
402
+		fi
403
+		if grep -q "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE; then
404
+			ROUTE_THROUGH_TOR=$(grep "ROUTE_THROUGH_TOR" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
405
+		fi
406
+		if grep -q "WIKI_TITLE" $CONFIGURATION_FILE; then
407
+			WIKI_TITLE=$(grep "WIKI_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
408
+		fi
409
+		if grep -q "MY_NAME" $CONFIGURATION_FILE; then
410
+			MY_NAME=$(grep "MY_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
411
+		fi
412
+		if grep -q "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE; then
413
+			MY_EMAIL_ADDRESS=$(grep "MY_EMAIL_ADDRESS" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
414
+		fi
415
+		if grep -q "INSTALLING_ON_BBB" $CONFIGURATION_FILE; then
416
+			INSTALLING_ON_BBB=$(grep "INSTALLING_ON_BBB" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
417
+		fi
418
+		if grep -q "SSH_PORT" $CONFIGURATION_FILE; then
419
+			SSH_PORT=$(grep "SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
420
+		fi
421
+		if grep -q "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE; then
422
+			INSTALLED_WITHIN_DOCKER=$(grep "INSTALLED_WITHIN_DOCKER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
423
+		fi
424
+		if grep -q "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE; then
425
+			PUBLIC_MAILING_LIST=$(grep "PUBLIC_MAILING_LIST" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
426
+		fi
427
+		if grep -q "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
428
+			MICROBLOG_DOMAIN_NAME=$(grep "MICROBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
429
+		fi
430
+		if grep -q "MICROBLOG_CODE" $CONFIGURATION_FILE; then
431
+			MICROBLOG_CODE=$(grep "MICROBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
432
+		fi
433
+		if grep -q "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE; then
434
+			HUBZILLA_DOMAIN_NAME=$(grep "HUBZILLA_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
435
+		fi
436
+		if grep -q "HUBZILLA_CODE" $CONFIGURATION_FILE; then
437
+			HUBZILLA_CODE=$(grep "HUBZILLA_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
438
+		fi
439
+		if grep -q "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE; then
440
+			WIKI_DOMAIN_NAME=$(grep "WIKI_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
441
+		fi
442
+		if grep -q "WIKI_CODE" $CONFIGURATION_FILE; then
443
+			WIKI_CODE=$(grep "WIKI_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
444
+		fi
445
+		if grep -q "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE; then
446
+			FULLBLOG_DOMAIN_NAME=$(grep "FULLBLOG_DOMAIN_NAME" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
447
+		fi
448
+		if grep -q "FULLBLOG_CODE" $CONFIGURATION_FILE; then
449
+			FULLBLOG_CODE=$(grep "FULLBLOG_CODE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
450
+		fi
451
+		if grep -q "MY_BLOG_TITLE" $CONFIGURATION_FILE; then
452
+			MY_BLOG_TITLE=$(grep "MY_BLOG_TITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
453
+		fi
454
+		if grep -q "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE; then
455
+			MY_BLOG_SUBTITLE=$(grep "MY_BLOG_SUBTITLE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
456
+		fi
457
+		if grep -q "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE; then
458
+			GPG_ENCRYPT_STORED_EMAIL=$(grep "GPG_ENCRYPT_STORED_EMAIL" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
459
+		fi
460
+		if grep -q "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE; then
461
+			MY_GPG_PUBLIC_KEY=$(grep "MY_GPG_PUBLIC_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
462
+		fi
463
+		if grep -q "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE; then
464
+			MY_GPG_PRIVATE_KEY=$(grep "MY_GPG_PRIVATE_KEY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
465
+		fi
466
+		if grep -q "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE; then
467
+			MY_GPG_PUBLIC_KEY_ID=$(grep "MY_GPG_PUBLIC_KEY_ID" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
468
+		fi
469
+		if grep -q "USB_DRIVE" $CONFIGURATION_FILE; then
470
+			USB_DRIVE=$(grep "USB_DRIVE" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
471
+		fi
472
+		if grep -q "MAX_PHP_MEMORY" $CONFIGURATION_FILE; then
473
+			MAX_PHP_MEMORY=$(grep "MAX_PHP_MEMORY" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
474
+		fi
475
+		if grep -q "TLS_TIME_SOURCE1" $CONFIGURATION_FILE; then
476
+			TLS_TIME_SOURCE1=$(grep "TLS_TIME_SOURCE1" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
477
+		fi
478
+		if grep -q "TLS_TIME_SOURCE2" $CONFIGURATION_FILE; then
479
+			TLS_TIME_SOURCE2=$(grep "TLS_TIME_SOURCE2" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
480
+		fi
481
+	fi
482
+	echo "System type: $SYSTEM_TYPE"
483
+}
484
+
485
+# check that domain names are sensible
486
+function check_domains {
487
+	if [ ${#WIKI_DOMAIN_NAME} -gt 1 ]; then
488
+		function_check test_domain_name
489
+		test_domain_name "$WIKI_DOMAIN_NAME"
490
+
491
+		if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
492
+			echo $'Wiki domain name is the same as blog domain name. They must be different'
493
+			exit 97326
494
+		fi
495
+		if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
496
+			echo $'Wiki domain name is the same as microblog domain name. They must be different'
497
+			exit 36827
498
+		fi
499
+		if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
500
+			echo $'Wiki domain name is the same as hubzilla domain name. They must be different'
501
+			exit 65848
502
+		fi
503
+		if [ ${#GIT_DOMAIN_NAME} -gt 1 ]; then
504
+			if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
505
+				echo $'Wiki domain name is the same as Gogs domain name. They must be different'
506
+				exit 73529
507
+			fi
508
+		fi
509
+	fi
510
+
511
+	if [ ${#FULLBLOG_DOMAIN_NAME} -gt 1 ]; then
512
+		function_check test_domain_name
513
+		test_domain_name "$FULLBLOG_DOMAIN_NAME"
514
+
515
+		if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
516
+			echo $'Blog domain name is the same as wiki domain name. They must be different'
517
+			exit 62348
518
+		fi
519
+		if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
520
+			echo $'Blog domain name is the same as microblog domain name. They must be different'
521
+			exit 38236
522
+		fi
523
+		if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
524
+			echo $'Blog domain name is the same as hubzilla domain name. They must be different'
525
+			exit 35483
526
+		fi
527
+		if [ $GIT_DOMAIN_NAME ]; then
528
+			if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
529
+				echo $'Blog domain name is the same as Gogs domain name. They must be different'
530
+				exit 84695
531
+			fi
532
+		fi
533
+	fi
534
+
535
+	if [ ${#MICROBLOG_DOMAIN_NAME} -gt 1 ]; then
536
+		function_check test_domain_name
537
+		test_domain_name "$MICROBLOG_DOMAIN_NAME"
538
+
539
+		if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
540
+			echo $'Microblog domain name is the same as wiki domain name. They must be different'
541
+			exit 73924
542
+		fi
543
+		if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
544
+			echo $'Microblog domain name is the same as blog domain name. They must be different'
545
+			exit 26832
546
+		fi
547
+		if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
548
+			echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
549
+			exit 678382
550
+		fi
551
+		if [ $GIT_DOMAIN_NAME ]; then
552
+			if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
553
+				echo $'Microblog domain name is the same as Gogs domain name. They must be different'
554
+				exit 684325
555
+			fi
556
+		fi
557
+	fi
558
+
559
+	if [ $HUBZILLA_DOMAIN_NAME ]; then
560
+		function_check test_domain_name
561
+		test_domain_name "$HUBZILLA_DOMAIN_NAME"
562
+
563
+		if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
564
+			echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
565
+			exit 83682
566
+		fi
567
+		if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
568
+			echo $'Hubzilla domain name is the same as blog domain name. They must be different'
569
+			exit 74817
570
+		fi
571
+		if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
572
+			echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
573
+			exit 83683
574
+		fi
575
+		if [ ${#GIT_DOMAIN_NAME} -gt 1 ]; then
576
+			if [[ "$test_domain_name" == "$GIT_DOMAIN_NAME" ]]; then
577
+				echo $'Hubzilla domain name is the same as Gogs domain name. They must be different'
578
+				exit 135523
579
+			fi
580
+		fi
581
+	fi
582
+
583
+	if [ ${#GIT_DOMAIN_NAME} -gt 1 ]; then
584
+		function_check test_domain_name
585
+		test_domain_name "$GIT_DOMAIN_NAME"
586
+
587
+		if [[ "$test_domain_name" == "$WIKI_DOMAIN_NAME" ]]; then
588
+			echo $'Hubzilla domain name is the same as wiki domain name. They must be different'
589
+			exit 83682
590
+		fi
591
+		if [[ "$test_domain_name" == "$FULLBLOG_DOMAIN_NAME" ]]; then
592
+			echo $'Hubzilla domain name is the same as blog domain name. They must be different'
593
+			exit 74817
594
+		fi
595
+		if [[ "$test_domain_name" == "$MICROBLOG_DOMAIN_NAME" ]]; then
596
+			echo $'Hubzilla domain name is the same as microblog domain name. They must be different'
597
+			exit 83683
598
+		fi
599
+		if [[ "$test_domain_name" == "$HUBZILLA_DOMAIN_NAME" ]]; then
600
+			echo $'Microblog domain name is the same as hubzilla domain name. They must be different'
601
+			exit 678382
602
+		fi
603
+	fi
604
+}
605
+
606
+# NOTE: deliberately no exit 0

+ 76
- 0
src/freedombone-utils-cron View File

@@ -0,0 +1,76 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Cron functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function cron_add_mins {
32
+	if ! grep -q "${2}" /etc/crontab; then
33
+		echo "*/${1}            * *   *   *   root ${2}" >> /etc/crontab
34
+		systemctl restart cron
35
+	fi
36
+}
37
+
38
+function randomize_cron {
39
+	# The predictable default timing of Debian cron jobs might
40
+	# be exploitable knowledge. Avoid too much predictability
41
+	# by randomizing the times when cron jobs run
42
+	if grep -Fxq "randomize_cron" $COMPLETION_FILE; then
43
+		return
44
+	fi
45
+
46
+	# randomize the day on which the weekly cron job runs
47
+	randdow=$(($RANDOM%6+1))
48
+	sed -i "s|\* \* 7|* * $randdow|g" /etc/crontab
49
+
50
+	# randomize the time when the weekly cron job runs
51
+	randmin=$(($RANDOM%60))
52
+	randhr=$(($RANDOM%3+1))
53
+	sed -i "s|47 6|$randmin $randhr|g" /etc/crontab
54
+
55
+	# randomize the time when the daily cron job runs
56
+	randmin=$(($RANDOM%60))
57
+	randhr=$(($RANDOM%3+4))
58
+	sed -i "s|25 6\t\* \* \*|$randmin $randhr\t* * *|g" /etc/crontab
59
+
60
+	# randomize the time when the hourly cron job runs
61
+	randmin=$(($RANDOM%60))
62
+	sed -i "s|17 \*\t|$randmin *\t|g" /etc/crontab
63
+
64
+	# randomize monthly cron job time and day
65
+	randmin=$(($RANDOM%60))
66
+	randhr=$(($RANDOM%22+1))
67
+	randdom=$(($RANDOM%27+1))
68
+	sed -i "s|52 6\t|$randmin $randhr\t|g" /etc/crontab
69
+	sed -i "s|\t1 \* \*|\t$randdom * *|g" /etc/crontab
70
+
71
+	systemctl restart cron
72
+
73
+	echo 'randomize_cron' >> $COMPLETION_FILE
74
+}
75
+
76
+# NOTE: deliberately there is no "exit 0"

+ 247
- 221
src/freedombone-utils-database View File

@@ -28,272 +28,298 @@
28 28
 # You should have received a copy of the GNU Affero General Public License
29 29
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
30 30
 
31
+# default MariaDB password
32
+MARIADB_PASSWORD=
33
+
34
+# Used to indicate whether the backup contains MariaDB databases or not
35
+BACKUP_INCLUDES_DATABASES="no"
36
+
37
+# contains the mysql root password which
38
+# is used for backups and repair
39
+DATABASE_PASSWORD_FILE=/root/dbpass
40
+
31 41
 function backup_database_local {
32
-# Makes local backups of databases which can then be automatically rolled
33
-# back if corruption is detected
34
-database_name=$1
35
-
36
-backup_databases_script=/usr/bin/backupdatabases
37
-echo '' >> $backup_databases_script
38
-echo "# Backup the ${database_name} database" >> $backup_databases_script
39
-echo "TEMPFILE=/root/${database_name}.sql" >> $backup_databases_script
40
-echo 'DAILYFILE=/var/backups/${database_name}_daily.sql' >> $backup_databases_script
41
-echo "mysqldump --password=\"\$MYSQL_PASSWORD\" ${database_name} > \$TEMPFILE" >> $backup_databases_script
42
-echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> $backup_databases_script
43
-echo 'if [ "$FILESIZE" -eq "0" ]; then' >> $backup_databases_script
44
-echo '    if [ -f $DAILYFILE ]; then' >> $backup_databases_script
45
-echo '        cp $DAILYFILE $TEMPFILE' >> $backup_databases_script
46
-echo '' >> $backup_databases_script
47
-echo '        # try to restore yesterdays database' >> $backup_databases_script
48
-echo "        mysql -u root --password=\"\$MYSQL_PASSWORD\" ${database_name} -o < \$DAILYFILE" >> $backup_databases_script
49
-echo '' >> $backup_databases_script
50
-echo '        # Send a warning email' >> $backup_databases_script
51
-echo "        echo \"Unable to create a backup of the ${database_name} database. Attempted to restore from yesterdays backup\" | mail -s \"${database_name} backup\" \$EMAIL" >> $backup_databases_script
52
-echo '    else' >> $backup_databases_script
53
-echo '        # Send a warning email' >> $backup_databases_script
54
-echo "        echo \"Unable to create a backup of the ${database_name} database.\" | mail -s \"${database_name} backup\" \$EMAIL" >> $backup_databases_script
55
-echo '    fi' >> $backup_databases_script
56
-echo 'else' >> $backup_databases_script
57
-echo '    chmod 600 $TEMPFILE' >> $backup_databases_script
58
-echo '    mv $TEMPFILE $DAILYFILE' >> $backup_databases_script
59
-echo '' >> $backup_databases_script
60
-echo '    # Make the backup readable only by root' >> $backup_databases_script
61
-echo '    chmod 600 $DAILYFILE' >> $backup_databases_script
62
-echo 'fi' >> $backup_databases_script
63
-
64
-weekly_backup_script=/etc/cron.weekly/backupdatabasesweekly
65
-if ! grep -q "${database_name}" ${weekly_backup_script}; then
66
-echo '' >> ${weekly_backup_script}
67
-echo "# ${database_name}" >> ${weekly_backup_script}
68
-echo "if [ -f /var/backups/${database_name}_weekly.sql ]; then" >> ${weekly_backup_script}
69
-echo "  cp -f /var/backups/${database_name}_weekly.sql /var/backups/${database_name}_2weekly.sql" >> ${weekly_backup_script}
70
-echo 'fi' >> ${weekly_backup_script}
71
-echo "if [ -f /var/backups/${database_name}_daily.sql ]; then" >> ${weekly_backup_script}
72
-echo "  cp -f /var/backups/${database_name}_daily.sql /var/backups/${database_name}_weekly.sql" >> ${weekly_backup_script}
73
-echo 'fi' >> ${weekly_backup_script}
74
-fi
75
-
76
-monthly_backup_script=/etc/cron.monthly/backupdatabasesmonthly
77
-if ! grep -q "${database_name}" ${monthly_backup_script}; then
78
-echo '' >> ${monthly_backup_script}
79
-echo "# ${database_name}" >> ${monthly_backup_script}
80
-echo "if [ -f /var/backups/${database_name}_monthly.sql ]; then" >> ${monthly_backup_script}
81
-echo "  cp -f /var/backups/${database_name}_monthly.sql /var/backups/${database_name}_2monthly.sql" >> ${monthly_backup_script}
82
-echo 'fi' >> ${monthly_backup_script}
83
-echo "if [ -f /var/backups/${database_name}_weekly.sql ]; then" >> ${monthly_backup_script}
84
-echo "  cp -f /var/backups/${database_name}_weekly.sql /var/backups/${database_name}_monthly.sql" >> ${monthly_backup_script}
85
-echo 'fi' >> ${monthly_backup_script}
86
-fi
87
-
88
-if ! grep -q "${database_name}" /etc/cron.hourly/repair; then
89
-echo "${PROJECT_NAME}-repair-database ${database_name}" >> /etc/cron.hourly/repair
90
-# remove legacy stuff
91
-sed -i 's|/usr/bin/repairdatabase redmatrix||g' /etc/cron.hourly/repair
92
-fi
42
+	# Makes local backups of databases which can then be automatically rolled
43
+	# back if corruption is detected
44
+	database_name=$1
45
+
46
+	backup_databases_script=/usr/bin/backupdatabases
47
+	echo '' >> $backup_databases_script
48
+	echo "# Backup the ${database_name} database" >> $backup_databases_script
49
+	echo "TEMPFILE=/root/${database_name}.sql" >> $backup_databases_script
50
+	echo 'DAILYFILE=/var/backups/${database_name}_daily.sql' >> $backup_databases_script
51
+	echo "mysqldump --password=\"\$MYSQL_PASSWORD\" ${database_name} > \$TEMPFILE" >> $backup_databases_script
52
+	echo 'FILESIZE=$(stat -c%s $TEMPFILE)' >> $backup_databases_script
53
+	echo 'if [ "$FILESIZE" -eq "0" ]; then' >> $backup_databases_script
54
+	echo '    if [ -f $DAILYFILE ]; then' >> $backup_databases_script
55
+	echo '        cp $DAILYFILE $TEMPFILE' >> $backup_databases_script
56
+	echo '' >> $backup_databases_script
57
+	echo '        # try to restore yesterdays database' >> $backup_databases_script
58
+	echo "        mysql -u root --password=\"\$MYSQL_PASSWORD\" ${database_name} -o < \$DAILYFILE" >> $backup_databases_script
59
+	echo '' >> $backup_databases_script
60
+	echo '        # Send a warning email' >> $backup_databases_script
61
+	echo "        echo \"Unable to create a backup of the ${database_name} database. Attempted to restore from yesterdays backup\" | mail -s \"${database_name} backup\" \$EMAIL" >> $backup_databases_script
62
+	echo '    else' >> $backup_databases_script
63
+	echo '        # Send a warning email' >> $backup_databases_script
64
+	echo "        echo \"Unable to create a backup of the ${database_name} database.\" | mail -s \"${database_name} backup\" \$EMAIL" >> $backup_databases_script
65
+	echo '    fi' >> $backup_databases_script
66
+	echo 'else' >> $backup_databases_script
67
+	echo '    chmod 600 $TEMPFILE' >> $backup_databases_script
68
+	echo '    mv $TEMPFILE $DAILYFILE' >> $backup_databases_script
69
+	echo '' >> $backup_databases_script
70
+	echo '    # Make the backup readable only by root' >> $backup_databases_script
71
+	echo '    chmod 600 $DAILYFILE' >> $backup_databases_script
72
+	echo 'fi' >> $backup_databases_script
73
+
74
+	weekly_backup_script=/etc/cron.weekly/backupdatabasesweekly
75
+	if ! grep -q "${database_name}" ${weekly_backup_script}; then
76
+		echo '' >> ${weekly_backup_script}
77
+		echo "# ${database_name}" >> ${weekly_backup_script}
78
+		echo "if [ -f /var/backups/${database_name}_weekly.sql ]; then" >> ${weekly_backup_script}
79
+		echo "  cp -f /var/backups/${database_name}_weekly.sql /var/backups/${database_name}_2weekly.sql" >> ${weekly_backup_script}
80
+		echo 'fi' >> ${weekly_backup_script}
81
+		echo "if [ -f /var/backups/${database_name}_daily.sql ]; then" >> ${weekly_backup_script}
82
+		echo "  cp -f /var/backups/${database_name}_daily.sql /var/backups/${database_name}_weekly.sql" >> ${weekly_backup_script}
83
+		echo 'fi' >> ${weekly_backup_script}
84
+	fi
85
+
86
+	monthly_backup_script=/etc/cron.monthly/backupdatabasesmonthly
87
+	if ! grep -q "${database_name}" ${monthly_backup_script}; then
88
+		echo '' >> ${monthly_backup_script}
89
+		echo "# ${database_name}" >> ${monthly_backup_script}
90
+		echo "if [ -f /var/backups/${database_name}_monthly.sql ]; then" >> ${monthly_backup_script}
91
+		echo "  cp -f /var/backups/${database_name}_monthly.sql /var/backups/${database_name}_2monthly.sql" >> ${monthly_backup_script}
92
+		echo 'fi' >> ${monthly_backup_script}
93
+		echo "if [ -f /var/backups/${database_name}_weekly.sql ]; then" >> ${monthly_backup_script}
94
+		echo "  cp -f /var/backups/${database_name}_weekly.sql /var/backups/${database_name}_monthly.sql" >> ${monthly_backup_script}
95
+		echo 'fi' >> ${monthly_backup_script}
96
+	fi
97
+
98
+	if ! grep -q "${database_name}" /etc/cron.hourly/repair; then
99
+		echo "${PROJECT_NAME}-repair-database ${database_name}" >> /etc/cron.hourly/repair
100
+		# remove legacy stuff
101
+		sed -i 's|/usr/bin/repairdatabase redmatrix||g' /etc/cron.hourly/repair
102
+	fi
93 103
 }
94 104
 
95 105
 function get_mariadb_password {
96
-if [ -f /home/$MY_USERNAME/README ]; then
97
-if grep -q "MariaDB password" /home/$MY_USERNAME/README; then
98
-if [ -f $DATABASE_PASSWORD_FILE ]; then
99
-MARIADB_PASSWORD=$(cat $DATABASE_PASSWORD_FILE)
100
-else
101
-MARIADB_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB password" | awk -F ':' '{print $2}' | sed 's/^ *//')
102
-echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
103
-chmod 600 $DATABASE_PASSWORD_FILE
104
-fi
105
-fi
106
-fi
106
+	if [ -f /home/$MY_USERNAME/README ]; then
107
+		if grep -q "MariaDB password" /home/$MY_USERNAME/README; then
108
+			if [ -f $DATABASE_PASSWORD_FILE ]; then
109
+				MARIADB_PASSWORD=$(cat $DATABASE_PASSWORD_FILE)
110
+			else
111
+				MARIADB_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB password" | awk -F ':' '{print $2}' | sed 's/^ *//')
112
+				echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
113
+				chmod 600 $DATABASE_PASSWORD_FILE
114
+			fi
115
+		fi
116
+	fi
107 117
 }
108 118
 
109 119
 function get_mariadb_media_server_admin_password {
110
-if [ -f /home/$MY_USERNAME/README ]; then
111
-if grep -q "Media server administrator password" /home/$MY_USERNAME/README; then
112
-MEDIA_SERVER_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Media server administrator password" | awk -F ':' '{print $2}' | sed 's/^ *//')
113
-fi
114
-fi
120
+	if [ -f /home/$MY_USERNAME/README ]; then
121
+		if grep -q "Media server administrator password" /home/$MY_USERNAME/README; then
122
+			MEDIA_SERVER_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Media server administrator password" | awk -F ':' '{print $2}' | sed 's/^ *//')
123
+		fi
124
+	fi
115 125
 }
116 126
 
117 127
 function get_mariadb_gnusocial_admin_password {
118
-if [ -f /home/$MY_USERNAME/README ]; then
119
-if grep -q "MariaDB gnusocial admin password" /home/$MY_USERNAME/README; then
120
-MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB gnusocial admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
121
-fi
122
-if grep -q "Microblog administrator password" /home/$MY_USERNAME/README; then
123
-MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Microblog administrator password" | awk -F ':' '{print $2}' | sed 's/^ *//')
124
-fi
125
-fi
128
+	if [ -f /home/$MY_USERNAME/README ]; then
129
+		if grep -q "MariaDB gnusocial admin password" /home/$MY_USERNAME/README; then
130
+			MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB gnusocial admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
131
+		fi
132
+		if grep -q "Microblog administrator password" /home/$MY_USERNAME/README; then
133
+			MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Microblog administrator password" | awk -F ':' '{print $2}' | sed 's/^ *//')
134
+		fi
135
+	fi
126 136
 }
127 137
 
128 138
 function get_mariadb_webmail_admin_password {
129
-if [ -f /home/$MY_USERNAME/README ]; then
130
-if grep -q "MariaDB webmail admin password" /home/$MY_USERNAME/README; then
131
-WEBMAIL_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB webmail admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
132
-fi
133
-fi
139
+	if [ -f /home/$MY_USERNAME/README ]; then
140
+		if grep -q "MariaDB webmail admin password" /home/$MY_USERNAME/README; then
141
+			WEBMAIL_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB webmail admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
142
+		fi
143
+	fi
134 144
 }
135 145
 
136 146
 function get_mariadb_rss_reader_admin_password {
137
-if [ -f /home/$MY_USERNAME/README ]; then
138
-if grep -q "RSS reader admin password" /home/$MY_USERNAME/README; then
139
-RSS_READER_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "RSS reader admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
140
-fi
141
-fi
147
+	if [ -f /home/$MY_USERNAME/README ]; then
148
+		if grep -q "RSS reader admin password" /home/$MY_USERNAME/README; then
149
+			RSS_READER_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "RSS reader admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
150
+		fi
151
+	fi
142 152
 }
143 153
 
144 154
 function get_mariadb_git_admin_password {
145
-if [ -f /home/$MY_USERNAME/README ]; then
146
-if grep -q "Gogs admin user password" /home/$MY_USERNAME/README; then
147
-GIT_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Gogs admin user password" | awk -F ':' '{print $2}' | sed 's/^ *//')
148
-fi
149
-fi
155
+	if [ -f /home/$MY_USERNAME/README ]; then
156
+		if grep -q "Gogs admin user password" /home/$MY_USERNAME/README; then
157
+			GIT_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "Gogs admin user password" | awk -F ':' '{print $2}' | sed 's/^ *//')
158
+		fi
159
+	fi
150 160
 }
151 161
 
152 162
 function get_mariadb_hubzilla_admin_password {
153
-if [ -f /home/$MY_USERNAME/README ]; then
154
-if grep -q "MariaDB Hubzilla admin password" /home/$MY_USERNAME/README; then
155
-HUBZILLA_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB Hubzilla admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
156
-fi
157
-fi
163
+	if [ -f /home/$MY_USERNAME/README ]; then
164
+		if grep -q "MariaDB Hubzilla admin password" /home/$MY_USERNAME/README; then
165
+			HUBZILLA_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB Hubzilla admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
166
+		fi
167
+	fi
158 168
 }
159 169
 
160 170
 function install_mariadb {
161
-if grep -Fxq "install_mariadb" $COMPLETION_FILE; then
162
-return
163
-fi
164
-apt-get -y install python-software-properties debconf-utils
165
-apt-get -y install software-properties-common
166
-apt-get -y update
167
-
168
-get_mariadb_password
169
-if [ ! $MARIADB_PASSWORD ]; then
170
-if [ -f $IMAGE_PASSWORD_FILE ]; then
171
-MARIADB_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
172
-else
173
-MARIADB_PASSWORD="$(openssl rand -base64 32 | cut -c1-${MINIMUM_PASSWORD_LENGTH})"
174
-fi
175
-echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
176
-chmod 600 $DATABASE_PASSWORD_FILE
177
-
178
-echo '' >> /home/$MY_USERNAME/README
179
-echo '' >> /home/$MY_USERNAME/README
180
-echo 'MariaDB / MySql' >> /home/$MY_USERNAME/README
181
-echo '===============' >> /home/$MY_USERNAME/README
182
-echo $"Your MariaDB password is: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
183
-echo '' >> /home/$MY_USERNAME/README
184
-chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
185
-chmod 600 /home/$MY_USERNAME/README
186
-fi
187
-
188
-debconf-set-selections <<< "mariadb-server mariadb-server/root_password password $MARIADB_PASSWORD"
189
-debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password $MARIADB_PASSWORD"
190
-apt-get -y install mariadb-server
191
-apt-get -y remove --purge apache*
192
-if [ -d /etc/apache2 ]; then
193
-rm -rf /etc/apache2
194
-echo $'Removed Apache installation after MariaDB install'
195
-fi
196
-
197
-if [ ! -d /etc/mysql ]; then
198
-echo $"ERROR: mariadb-server does not appear to have installed. $CHECK_MESSAGE"
199
-exit 54
200
-fi
201
-
202
-mysqladmin -u root password "$MARIADB_PASSWORD"
203
-echo 'install_mariadb' >> $COMPLETION_FILE
171
+	if grep -Fxq "install_mariadb" $COMPLETION_FILE; then
172
+		return
173
+	fi
174
+	apt-get -y install python-software-properties debconf-utils
175
+	apt-get -y install software-properties-common
176
+	apt-get -y update
177
+
178
+	function_check get_mariadb_password
179
+	get_mariadb_password
180
+	if [ ! $MARIADB_PASSWORD ]; then
181
+		if [ -f $IMAGE_PASSWORD_FILE ]; then
182
+			MARIADB_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
183
+		else
184
+			MARIADB_PASSWORD="$(openssl rand -base64 32 | cut -c1-${MINIMUM_PASSWORD_LENGTH})"
185
+		fi
186
+		echo "$MARIADB_PASSWORD" > $DATABASE_PASSWORD_FILE
187
+		chmod 600 $DATABASE_PASSWORD_FILE
188
+
189
+		echo '' >> /home/$MY_USERNAME/README
190
+		echo '' >> /home/$MY_USERNAME/README
191
+		echo 'MariaDB / MySql' >> /home/$MY_USERNAME/README
192
+		echo '===============' >> /home/$MY_USERNAME/README
193
+		echo $"Your MariaDB password is: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
194
+		echo '' >> /home/$MY_USERNAME/README
195
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
196
+		chmod 600 /home/$MY_USERNAME/README
197
+	fi
198
+
199
+	debconf-set-selections <<< "mariadb-server mariadb-server/root_password password $MARIADB_PASSWORD"
200
+	debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password $MARIADB_PASSWORD"
201
+	apt-get -y install mariadb-server
202
+	apt-get -y remove --purge apache*
203
+	if [ -d /etc/apache2 ]; then
204
+		rm -rf /etc/apache2
205
+		echo $'Removed Apache installation after MariaDB install'
206
+	fi
207
+
208
+	if [ ! -d /etc/mysql ]; then
209
+		echo $"ERROR: mariadb-server does not appear to have installed. $CHECK_MESSAGE"
210
+		exit 54
211
+	fi
212
+
213
+	mysqladmin -u root password "$MARIADB_PASSWORD"
214
+	echo 'install_mariadb' >> $COMPLETION_FILE
204 215
 }
205 216
 
206 217
 function backup_databases_script_header {
207
-if [ ! -f /usr/bin/backupdatabases ]; then
208
-# daily
209
-echo '#!/bin/sh' > /usr/bin/backupdatabases
210
-echo '' >> /usr/bin/backupdatabases
211
-echo "EMAIL='$MY_EMAIL_ADDRESS'" >> /usr/bin/backupdatabases
212
-echo '' >> /usr/bin/backupdatabases
213
-echo -n 'MYSQL_PASSWORD=$(cat ' >> /usr/bin/backupdatabases
214
-echo "$DATABASE_PASSWORD_FILE)" >> /usr/bin/backupdatabases
215
-echo 'umask 0077' >> /usr/bin/backupdatabases
216
-echo '' >> /usr/bin/backupdatabases
217
-echo '# exit if we are backing up to friends servers' >> /usr/bin/backupdatabases
218
-echo "if [ -f $FRIENDS_SERVERS_LIST ]; then" >> /usr/bin/backupdatabases
219
-echo '  exit 1' >> /usr/bin/backupdatabases
220
-echo 'fi' >> /usr/bin/backupdatabases
221
-chmod 600 /usr/bin/backupdatabases
222
-chmod +x /usr/bin/backupdatabases
223
-
224
-echo '#!/bin/sh' > /etc/cron.daily/backupdatabasesdaily
225
-echo '/usr/bin/backupdatabases' >> /etc/cron.daily/backupdatabasesdaily
226
-chmod 600 /etc/cron.daily/backupdatabasesdaily
227
-chmod +x /etc/cron.daily/backupdatabasesdaily
228
-
229
-# weekly
230
-echo '#!/bin/sh' > /etc/cron.weekly/backupdatabasesweekly
231
-echo '' >> /etc/cron.weekly/backupdatabasesweekly
232
-echo 'umask 0077' >> /etc/cron.weekly/backupdatabasesweekly
233
-
234
-chmod 600 /etc/cron.weekly/backupdatabasesweekly
235
-chmod +x /etc/cron.weekly/backupdatabasesweekly
236
-
237
-# monthly
238
-echo '#!/bin/sh' > /etc/cron.monthly/backupdatabasesmonthly
239
-echo '' >> /etc/cron.monthly/backupdatabasesmonthly
240
-echo 'umask 0077' >> /etc/cron.monthly/backupdatabasesmonthly
241
-
242
-chmod 600 /etc/cron.monthly/backupdatabasesmonthly
243
-chmod +x /etc/cron.monthly/backupdatabasesmonthly
244
-fi
218
+	if [ ! -f /usr/bin/backupdatabases ]; then
219
+		# daily
220
+		echo '#!/bin/sh' > /usr/bin/backupdatabases
221
+		echo '' >> /usr/bin/backupdatabases
222
+		echo "EMAIL='$MY_EMAIL_ADDRESS'" >> /usr/bin/backupdatabases
223
+		echo '' >> /usr/bin/backupdatabases
224
+		echo -n 'MYSQL_PASSWORD=$(cat ' >> /usr/bin/backupdatabases
225
+		echo "$DATABASE_PASSWORD_FILE)" >> /usr/bin/backupdatabases
226
+		echo 'umask 0077' >> /usr/bin/backupdatabases
227
+		echo '' >> /usr/bin/backupdatabases
228
+		echo '# exit if we are backing up to friends servers' >> /usr/bin/backupdatabases
229
+		echo "if [ -f $FRIENDS_SERVERS_LIST ]; then" >> /usr/bin/backupdatabases
230
+		echo '  exit 1' >> /usr/bin/backupdatabases
231
+		echo 'fi' >> /usr/bin/backupdatabases
232
+		chmod 600 /usr/bin/backupdatabases
233
+		chmod +x /usr/bin/backupdatabases
234
+
235
+		echo '#!/bin/sh' > /etc/cron.daily/backupdatabasesdaily
236
+		echo '/usr/bin/backupdatabases' >> /etc/cron.daily/backupdatabasesdaily
237
+		chmod 600 /etc/cron.daily/backupdatabasesdaily
238
+		chmod +x /etc/cron.daily/backupdatabasesdaily
239
+
240
+		# weekly
241
+		echo '#!/bin/sh' > /etc/cron.weekly/backupdatabasesweekly
242
+		echo '' >> /etc/cron.weekly/backupdatabasesweekly
243
+		echo 'umask 0077' >> /etc/cron.weekly/backupdatabasesweekly
244
+
245
+		chmod 600 /etc/cron.weekly/backupdatabasesweekly
246
+		chmod +x /etc/cron.weekly/backupdatabasesweekly
247
+
248
+		# monthly
249
+		echo '#!/bin/sh' > /etc/cron.monthly/backupdatabasesmonthly
250
+		echo '' >> /etc/cron.monthly/backupdatabasesmonthly
251
+		echo 'umask 0077' >> /etc/cron.monthly/backupdatabasesmonthly
252
+
253
+		chmod 600 /etc/cron.monthly/backupdatabasesmonthly
254
+		chmod +x /etc/cron.monthly/backupdatabasesmonthly
255
+	fi
245 256
 }
246 257
 
247 258
 function repair_databases_script {
248
-if [ -f /etc/cron.hourly/repair ]; then
249
-sed -i "s|/usr/bin/repairdatabase|${PROJECT_NAME}-repair-database|g" /etc/cron.hourly/repair
250
-fi
259
+	if [ -f /etc/cron.hourly/repair ]; then
260
+		sed -i "s|/usr/bin/repairdatabase|${PROJECT_NAME}-repair-database|g" /etc/cron.hourly/repair
261
+	fi
251 262
 
252
-if grep -Fxq "repair_databases_script" $COMPLETION_FILE; then
253
-return
254
-fi
263
+	if grep -Fxq "repair_databases_script" $COMPLETION_FILE; then
264
+		return
265
+	fi
255 266
 
256
-if [ ! -f $DATABASE_PASSWORD_FILE ]; then
257
-return
258
-fi
267
+	if [ ! -f $DATABASE_PASSWORD_FILE ]; then
268
+		return
269
+	fi
259 270
 
260
-echo '#!/bin/bash' > /etc/cron.hourly/repair
261
-echo '' >> /etc/cron.hourly/repair
262
-chmod 600 /etc/cron.hourly/repair
263
-chmod +x /etc/cron.hourly/repair
271
+	echo '#!/bin/bash' > /etc/cron.hourly/repair
272
+	echo '' >> /etc/cron.hourly/repair
273
+	chmod 600 /etc/cron.hourly/repair
274
+	chmod +x /etc/cron.hourly/repair
264 275
 
265
-echo 'repair_databases_script' >> $COMPLETION_FILE
276
+	echo 'repair_databases_script' >> $COMPLETION_FILE
266 277
 }
267 278
 
268 279
 function remove_database {
269
-app_name="$1"
270
-if [ ! -d $INSTALL_DIR ]; then
271
-mkdir $INSTALL_DIR
272
-fi
273
-echo "drop database ${app_name};
280
+	app_name="$1"
281
+	if [ ! -d $INSTALL_DIR ]; then
282
+		mkdir $INSTALL_DIR
283
+	fi
284
+	echo "drop database ${app_name};
274 285
 quit" > $INSTALL_DIR/batch.sql
275
-chmod 600 $INSTALL_DIR/batch.sql
276
-mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
277
-shred -zu $INSTALL_DIR/batch.sql
286
+	chmod 600 $INSTALL_DIR/batch.sql
287
+	mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
288
+	shred -zu $INSTALL_DIR/batch.sql
278 289
 }
279 290
 
280 291
 function create_database {
281
-app_name="$1"
282
-app_admin_password="$2"
283
-app_admin_username=$3
284
-if [ ! -d $INSTALL_DIR ]; then
285
-mkdir $INSTALL_DIR
286
-fi
287
-if [ ! $app_admin_username ]; then
288
-app_admin_username=${app_name}admin
289
-fi
290
-echo "create database ${app_name};
292
+	app_name="$1"
293
+	app_admin_password="$2"
294
+	app_admin_username=$3
295
+	if [ ! -d $INSTALL_DIR ]; then
296
+		mkdir $INSTALL_DIR
297
+	fi
298
+	if [ ! $app_admin_username ]; then
299
+		app_admin_username=${app_name}admin
300
+	fi
301
+	echo "create database ${app_name};
291 302
 CREATE USER '$app_admin_username@localhost' IDENTIFIED BY '${app_admin_password}';
292 303
 GRANT ALL PRIVILEGES ON ${app_name}.* TO '$app_admin_username@localhost';
293 304
 quit" > $INSTALL_DIR/batch.sql
294
-chmod 600 $INSTALL_DIR/batch.sql
295
-mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
296
-shred -zu $INSTALL_DIR/batch.sql
305
+	chmod 600 $INSTALL_DIR/batch.sql
306
+	mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
307
+	shred -zu $INSTALL_DIR/batch.sql
308
+}
309
+
310
+function initialise_database {
311
+	database_name=$1
312
+	database_file=$2
313
+	mysql -u root --password="$MARIADB_PASSWORD" -D $database_name < $database_file
314
+	if [ ! "$?" = "0" ]; then
315
+		exit 62952
316
+	fi
317
+}
318
+
319
+function run_query {
320
+	database_name=$1
321
+	database_query=$2
322
+	mysql -u root --password="$MARIADB_PASSWORD" -e "$database_query" $database_name
297 323
 }
298 324
 
299 325
 # NOTE: deliberately there is no "exit 0"

+ 39
- 0
src/freedombone-utils-depends View File

@@ -0,0 +1,39 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Dependency checking functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function function_check {
32
+    if [ ! "$(type ${1} 2>/dev/null)" ]; then
33
+		echo $"Dependency error: The function ${1} has not been defined"
34
+		exit 72528
35
+    fi
36
+}
37
+
38
+
39
+# NOTE: deliberately there is no "exit 0"

+ 241
- 0
src/freedombone-utils-dns View File

@@ -0,0 +1,241 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# DNS functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# DNS
32
+NAMESERVER1='213.73.91.35'
33
+NAMESERVER2='85.214.20.141'
34
+
35
+# parameters used when adding a new domain
36
+DDNS_PROVIDER="default@freedns.afraid.org"
37
+DDNS_USERNAME=
38
+DDNS_PASSWORD=
39
+
40
+INADYN_REPO="https://github.com/bashrc/inadyn"
41
+INADYN_COMMIT='fadbe17f520d337dfb8d69ee4bf1fcaa23fce0d6'
42
+
43
+# web site used to obtain the external IP address of the system
44
+GET_IP_ADDRESS_URL="checkip.two-dns.de"
45
+
46
+# other possible services to obtain the external IP address
47
+EXTERNAL_IP_SERVICES=( \
48
+	    'https://check.torproject.org/' \
49
+		'https://www.whatsmydns.net/whats-my-ip-address.html' \
50
+		'https://www.privateinternetaccess.com/pages/whats-my-ip/' \
51
+		'http://checkip.two-dns.de' \
52
+		'http://ip.dnsexit.com' \
53
+		'http://ifconfig.me/ip' \
54
+		'http://ipecho.net/plain' \
55
+		'http://checkip.dyndns.org/plain' \
56
+		'http://ipogre.com/linux.php' \
57
+		'http://whatismyipaddress.com/' \
58
+		'http://ip.my-proxy.com/' \
59
+		'http://websiteipaddress.com/WhatIsMyIp' \
60
+		'http://getmyipaddress.org/' \
61
+		'http://www.my-ip-address.net/' \
62
+		'http://myexternalip.com/raw' \
63
+		'http://www.canyouseeme.org/' \
64
+		'http://www.trackip.net/' \
65
+		'http://icanhazip.com/' \
66
+		'http://www.iplocation.net/' \
67
+		'http://www.howtofindmyipaddress.com/' \
68
+		'http://www.ipchicken.com/' \
69
+		'http://whatsmyip.net/' \
70
+		'http://www.ip-adress.com/' \
71
+		'http://checkmyip.com/' \
72
+		'http://www.tracemyip.org/' \
73
+		'http://checkmyip.net/' \
74
+		'http://www.lawrencegoetz.com/programs/ipinfo/' \
75
+		'http://www.findmyip.co/' \
76
+		'http://ip-lookup.net/' \
77
+		'http://www.dslreports.com/whois' \
78
+		'http://www.mon-ip.com/en/my-ip/' \
79
+		'http://www.myip.ru' \
80
+		'http://ipgoat.com/' \
81
+		'http://www.myipnumber.com/my-ip-address.asp' \
82
+		'http://www.whatsmyipaddress.net/' \
83
+		'http://formyip.com/' \
84
+		'http://www.displaymyip.com/' \
85
+		'http://www.bobborst.com/tools/whatsmyip/' \
86
+		'http://www.geoiptool.com/' \
87
+		'http://checkip.dyndns.com/' \
88
+		'http://myexternalip.com/' \
89
+		'http://www.ip-adress.eu/' \
90
+		'http://www.infosniper.net/' \
91
+		'http://wtfismyip.com/' \
92
+		'http://ipinfo.io/' \
93
+		'http://httpbin.org/ip')
94
+
95
+function create_freedns_updater {
96
+	if [[ $ONION_ONLY != "no" ]]; then
97
+		return
98
+	fi
99
+
100
+	# currently inadyn doesn't work as expected with freeDNS, so this is a workaround
101
+	if grep -Fxq "create_freedns_updater" $COMPLETION_FILE; then
102
+		return
103
+	fi
104
+	if [[ $DDNS_PROVIDER != "default@freedns.afraid.org" ]]; then
105
+		return
106
+	fi
107
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
108
+		return
109
+	fi
110
+
111
+	FREEDNS_WGET='wget -q --read-timeout=0.0 --waitretry=5 --tries=4 https://freedns.afraid.org/dynamic/update.php?'
112
+
113
+	echo '#!/bin/bash' > /usr/bin/dynamicdns
114
+	echo 'cd /tmp' >> /usr/bin/dynamicdns
115
+	if [ $DEFAULT_DOMAIN_CODE ]; then
116
+		echo "# $DEFAULT_DOMAIN_NAME" >> /usr/bin/dynamicdns
117
+		echo "$FREEDNS_WGET$DEFAULT_DOMAIN_CODE=" >> /usr/bin/dynamicdns
118
+	fi
119
+	if [ $WIKI_CODE ]; then
120
+		if [[ $WIKI_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
121
+			echo "# $WIKI_DOMAIN_NAME" >> /usr/bin/dynamicdns
122
+			echo "$FREEDNS_WGET$WIKI_CODE=" >> /usr/bin/dynamicdns
123
+		fi
124
+	fi
125
+	if [ $FULLBLOG_CODE ]; then
126
+		if [[ $FULLBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
127
+			echo "# $FULLBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
128
+			echo "$FREEDNS_WGET$FULLBLOG_CODE=" >> /usr/bin/dynamicdns
129
+		fi
130
+	fi
131
+	if [ $HUBZILLA_CODE ]; then
132
+		if [[ $HUBZILLA_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
133
+			echo "# $HUBZILLA_DOMAIN_NAME" >> /usr/bin/dynamicdns
134
+			echo "$FREEDNS_WGET$HUBZILLA_CODE=" >> /usr/bin/dynamicdns
135
+		fi
136
+	fi
137
+	if [ $MICROBLOG_CODE ]; then
138
+		if [[ $MICROBLOG_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
139
+			echo "# $MICROBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
140
+			echo "$FREEDNS_WGET$MICROBLOG_CODE=" >> /usr/bin/dynamicdns
141
+		fi
142
+	fi
143
+	if [ $GIT_CODE ]; then
144
+		if [[ $GIT_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
145
+			echo "# $GIT_DOMAIN_NAME" >> /usr/bin/dynamicdns
146
+			echo "$FREEDNS_WGET$GIT_CODE=" >> /usr/bin/dynamicdns
147
+		fi
148
+	fi
149
+	if [ $MEDIAGOBLIN_CODE ]; then
150
+		if [[ $MEDIAGOBLIN_CODE != "$DEFAULT_DOMAIN_CODE" ]]; then
151
+			echo "# $MEDIAGOBLIN_DOMAIN_NAME" >> /usr/bin/dynamicdns
152
+			echo "$FREEDNS_WGET$MEDIAGOBLIN_CODE=" >> /usr/bin/dynamicdns
153
+		fi
154
+	fi
155
+	echo 'exit 0' >> /usr/bin/dynamicdns
156
+	chmod 600 /usr/bin/dynamicdns
157
+	chmod +x /usr/bin/dynamicdns
158
+
159
+	if ! grep -q "/usr/bin/dynamicdns" /etc/crontab; then
160
+		function_check cron_add_mins
161
+		cron_add_mins 3 '/usr/bin/dynamicdns'
162
+		systemctl restart cron
163
+	fi
164
+
165
+	echo 'create_freedns_updater' >> $COMPLETION_FILE
166
+}
167
+
168
+function add_ddns_domain {
169
+	if [ ! $1 ]; then
170
+		echo $'ddns domain not specified'
171
+		exit 5638
172
+	fi
173
+	CURRENT_DDNS_DOMAIN="$1"
174
+	if [[ $ONION_ONLY != "no" ]]; then
175
+		return
176
+	fi
177
+	if [ ! -f /etc/inadyn.conf ]; then
178
+		echo $'Unable to find inadyn configuration file /etc/inadyn.conf'
179
+		exit 5745
180
+	fi
181
+	if ! grep -q "$DDNS_PROVIDER" /etc/inadyn.conf; then
182
+		echo '' >> /etc/inadyn.conf
183
+		echo "system $DDNS_PROVIDER" >> /etc/inadyn.conf
184
+		echo '  ssl' >> /etc/inadyn.conf
185
+		echo "  checkip-url $GET_IP_ADDRESS_URL /" >> /etc/inadyn.conf
186
+		if [ $DDNS_USERNAME ]; then
187
+			echo "  username $DDNS_USERNAME" >> /etc/inadyn.conf
188
+		fi
189
+		if [ $DDNS_PASSWORD ]; then
190
+			echo "  password $DDNS_PASSWORD" >> /etc/inadyn.conf
191
+		fi
192
+	fi
193
+
194
+	if ! grep -q "$CURRENT_DDNS_DOMAIN" /etc/inadyn.conf; then
195
+		echo "  alias $CURRENT_DDNS_DOMAIN" >> /etc/inadyn.conf
196
+	fi
197
+	chmod 600 /etc/inadyn.conf
198
+	systemctl restart inadyn
199
+	systemctl daemon-reload
200
+}
201
+
202
+function configure_dns {
203
+	if grep -Fxq "configure_dns" $COMPLETION_FILE; then
204
+		return
205
+	fi
206
+	echo 'domain localdomain' > /etc/resolv.conf
207
+	echo 'search localdomain' >> /etc/resolv.conf
208
+	echo "nameserver $NAMESERVER1" >> /etc/resolv.conf
209
+	echo "nameserver $NAMESERVER2" >> /etc/resolv.conf
210
+
211
+	# prevent resolv.conf from changing
212
+	chattr +i /etc/resolv.conf
213
+
214
+	echo 'configure_dns' >> $COMPLETION_FILE
215
+}
216
+
217
+function set_hostname {
218
+	DEFAULT_DOMAIN_NAME="$1"
219
+
220
+	echo "$DEFAULT_DOMAIN_NAME" > /etc/hostname
221
+	hostname $DEFAULT_DOMAIN_NAME
222
+
223
+	if grep -q "127.0.1.1" /etc/hosts; then
224
+		sed -i "s/127.0.1.1.*/127.0.1.1       $DEFAULT_DOMAIN_NAME/g" /etc/hosts
225
+	else
226
+		echo "127.0.1.1  $DEFAULT_DOMAIN_NAME" >> /etc/hosts
227
+	fi
228
+}
229
+
230
+function set_your_domain_name {
231
+	if grep -Fxq "set_your_domain_name" $COMPLETION_FILE; then
232
+		return
233
+	fi
234
+
235
+	function_check set_hostname
236
+	set_hostname $DEFAULT_DOMAIN_NAME
237
+
238
+	echo 'set_your_domain_name' >> $COMPLETION_FILE
239
+}
240
+
241
+# NOTE: deliberately no exit 0

+ 80
- 0
src/freedombone-utils-final View File

@@ -0,0 +1,80 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Final stage of install
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+OPEN_PORTS=()
32
+
33
+function install_final {
34
+	if grep -Fxq "install_final" $COMPLETION_FILE; then
35
+		return
36
+	fi
37
+	# unmount any attached usb drive
38
+	if [ -d $USB_MOUNT ]; then
39
+		umount $USB_MOUNT
40
+		rm -rf $USB_MOUNT
41
+	fi
42
+	function_check split_gpg_key_into_fragments
43
+	split_gpg_key_into_fragments
44
+	echo 'install_final' >> $COMPLETION_FILE
45
+	clear
46
+	echo ''
47
+
48
+	echo $"
49
+	*** ${PROJECT_NAME} installation is complete. Rebooting... ***
50
+
51
+	Now forward these ports from your internet router
52
+"
53
+	for p in "${OPEN_PORTS[@]}"
54
+	do
55
+		echo "  $p"
56
+	done
57
+	echo ''
58
+
59
+	if [ -f "/home/$MY_USERNAME/README" ]; then
60
+		echo $"See /home/$MY_USERNAME/README for post-installation instructions."
61
+		echo ''
62
+	fi
63
+	# add user menu on ssh login
64
+	if ! grep -q 'control' /home/$MY_USERNAME/.bashrc; then
65
+		echo 'control' >> /home/$MY_USERNAME/.bashrc
66
+	fi
67
+	if [ ! -f $IMAGE_PASSWORD_FILE ]; then
68
+		reboot
69
+	fi
70
+}
71
+
72
+function setup_final {
73
+	function_check intrusion_detection
74
+	intrusion_detection
75
+
76
+	function_check install_final
77
+	install_final
78
+}
79
+
80
+# NOTE: deliberately no exit 0

+ 521
- 0
src/freedombone-utils-firewall View File

@@ -0,0 +1,521 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Firewall functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function save_firewall_settings {
32
+	iptables-save > /etc/firewall.conf
33
+	ip6tables-save > /etc/firewall6.conf
34
+	printf '#!/bin/sh\n' > /etc/network/if-up.d/iptables
35
+	printf 'iptables-restore < /etc/firewall.conf\n' >> /etc/network/if-up.d/iptables
36
+	printf 'ip6tables-restore < /etc/firewall6.conf\n' >> /etc/network/if-up.d/iptables
37
+	chmod +x /etc/network/if-up.d/iptables
38
+}
39
+
40
+function enable_ipv6 {
41
+	# endure that ipv6 is enabled and can route
42
+	sed -i 's/net.ipv6.conf.all.disable_ipv6.*/net.ipv6.conf.all.disable_ipv6 = 0/g' /etc/sysctl.conf
43
+	#sed -i "s/net.ipv6.conf.all.accept_redirects.*/net.ipv6.conf.all.accept_redirects = 1/g" /etc/sysctl.conf
44
+	#sed -i "s/net.ipv6.conf.all.accept_source_route.*/net.ipv6.conf.all.accept_source_route = 1/g" /etc/sysctl.conf
45
+	sed -i "s/net.ipv6.conf.all.forwarding.*/net.ipv6.conf.all.forwarding=1/g" /etc/sysctl.conf
46
+	echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
47
+}
48
+
49
+function configure_firewall {
50
+	if grep -q "RELATED" /etc/firewall.conf; then
51
+		# recreate the firewall to remove RELATED
52
+		sed -i "/firewall/d" $COMPLETION_FILE
53
+	fi
54
+	if grep -Fxq "configure_firewall" $COMPLETION_FILE; then
55
+		return
56
+	fi
57
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
58
+		# docker does its own firewalling
59
+		return
60
+	fi
61
+	iptables -P INPUT ACCEPT
62
+	ip6tables -P INPUT ACCEPT
63
+	iptables -F
64
+	ip6tables -F
65
+	iptables -t nat -F
66
+	ip6tables -t nat -F
67
+	iptables -X
68
+	ip6tables -X
69
+	iptables -P INPUT DROP
70
+	ip6tables -P INPUT DROP
71
+	iptables -A INPUT -i lo -j ACCEPT
72
+	iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
73
+
74
+	# Make sure incoming tcp connections are SYN packets
75
+	iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
76
+
77
+	# Drop packets with incoming fragments
78
+	iptables -A INPUT -f -j DROP
79
+
80
+	# Drop bogons
81
+	iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
82
+	iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
83
+	iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
84
+
85
+	# Incoming malformed NULL packets:
86
+	iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
87
+
88
+	echo 'configure_firewall' >> $COMPLETION_FILE
89
+}
90
+
91
+function configure_firewall_ping {
92
+	if grep -Fxq "configure_firewall_ping" $COMPLETION_FILE; then
93
+		return
94
+	fi
95
+	# Only allow ping for mesh installs
96
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
97
+		return
98
+	fi
99
+	iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
100
+	iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
101
+	function_check save_firewall_settings
102
+	save_firewall_settings
103
+	echo 'configure_firewall_ping' >> $COMPLETION_FILE
104
+}
105
+
106
+function configure_firewall_for_voip {
107
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
108
+		return
109
+	fi
110
+	if grep -Fxq "configure_firewall_for_voip" $COMPLETION_FILE; then
111
+		return
112
+	fi
113
+	if [[ $ONION_ONLY != "no" ]]; then
114
+		return
115
+	fi
116
+	iptables -A INPUT -p udp --dport $VOIP_PORT -j ACCEPT
117
+	iptables -A INPUT -p tcp --dport $VOIP_PORT -j ACCEPT
118
+	function_check save_firewall_settings
119
+	save_firewall_settings
120
+
121
+	OPEN_PORTS+=("Mumble   $VOIP_PORT")
122
+	echo 'configure_firewall_for_voip' >> $COMPLETION_FILE
123
+}
124
+
125
+function configure_firewall_for_syncthing {
126
+	if grep -Fxq "configure_firewall_for_syncthing" $COMPLETION_FILE; then
127
+		return
128
+	fi
129
+	iptables -A INPUT -p udp --dport $SYNCTHING_PORT -j ACCEPT
130
+	iptables -A INPUT -p tcp --dport $SYNCTHING_PORT -j ACCEPT
131
+	function_check save_firewall_settings
132
+	save_firewall_settings
133
+
134
+	OPEN_PORTS+=("Syncthing $SYNCTHING_PORT")
135
+	echo 'configure_firewall_for_syncthing' >> $COMPLETION_FILE
136
+}
137
+
138
+function configure_firewall_for_voip_turn {
139
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
140
+		return
141
+	fi
142
+	if grep -Fxq "configure_firewall_for_voip_turn" $COMPLETION_FILE; then
143
+		return
144
+	fi
145
+	if [[ $ONION_ONLY != "no" ]]; then
146
+		return
147
+	fi
148
+	iptables -A INPUT -p udp --dport $VOIP_TURN_PORT -j ACCEPT
149
+	iptables -A INPUT -p tcp --dport $VOIP_TURN_PORT -j ACCEPT
150
+	iptables -A INPUT -p tcp --dport $VOIP_TURN_TLS_PORT -j ACCEPT
151
+	function_check save_firewall_settings
152
+	save_firewall_settings
153
+
154
+	OPEN_PORTS+=("TURN     $VOIP_TURN_PORT")
155
+	OPEN_PORTS+=("TURN TLS $VOIP_TURN_TLS_PORT")
156
+	echo 'configure_firewall_for_voip_turn' >> $COMPLETION_FILE
157
+}
158
+
159
+
160
+function configure_firewall_for_sip4 {
161
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
162
+		return
163
+	fi
164
+	if grep -Fxq "configure_firewall_for_sip4" $COMPLETION_FILE; then
165
+		return
166
+	fi
167
+	if [[ $ONION_ONLY != "no" ]]; then
168
+		return
169
+	fi
170
+	iptables -A INPUT -p udp --dport $SIP_PORT -j ACCEPT
171
+	iptables -A INPUT -p tcp --dport $SIP_PORT -j ACCEPT
172
+	iptables -A INPUT -p udp --dport $SIP_TLS_PORT -j ACCEPT
173
+	iptables -A INPUT -p tcp --dport $SIP_TLS_PORT -j ACCEPT
174
+	function_check save_firewall_settings
175
+	save_firewall_settings
176
+
177
+	OPEN_PORTS+=("SIP      $SIP_PORT")
178
+	OPEN_PORTS+=("SIP TLS  $SIP_TLS_PORT")
179
+	echo 'configure_firewall_for_sip4' >> $COMPLETION_FILE
180
+}
181
+
182
+function configure_firewall_for_ipfs {
183
+	if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
184
+		return
185
+	fi
186
+	if grep -Fxq "configure_firewall_for_ipfs" $COMPLETION_FILE; then
187
+		return
188
+	fi
189
+	if [[ $ONION_ONLY != "no" ]]; then
190
+		return
191
+	fi
192
+	iptables -A INPUT -p tcp --dport $IPFS_PORT -j ACCEPT
193
+	function_check save_firewall_settings
194
+	save_firewall_settings
195
+
196
+	OPEN_PORTS+=("IPFS     $IPFS_PORT")
197
+	echo 'configure_firewall_for_ipfs' >> $COMPLETION_FILE
198
+}
199
+
200
+function configure_firewall_for_avahi {
201
+	if grep -Fxq "configure_firewall_for_avahi" $COMPLETION_FILE; then
202
+		return
203
+	fi
204
+	iptables -A INPUT -p tcp --dport 548 -j ACCEPT
205
+	iptables -A INPUT -p udp --dport 548 -j ACCEPT
206
+	iptables -A INPUT -p tcp --dport 5353 -j ACCEPT
207
+	iptables -A INPUT -p udp --dport 5353 -j ACCEPT
208
+	iptables -A INPUT -p tcp --dport 5354 -j ACCEPT
209
+	iptables -A INPUT -p udp --dport 5354 -j ACCEPT
210
+	function_check save_firewall_settings
211
+	save_firewall_settings
212
+	echo 'configure_firewall_for_avahi' >> $COMPLETION_FILE
213
+}
214
+
215
+function configure_firewall_for_cjdns {
216
+	if grep -Fxq "configure_firewall_for_cjdns" $COMPLETION_FILE; then
217
+		return
218
+	fi
219
+	if [[ $ENABLE_CJDNS != "yes" ]]; then
220
+		return
221
+	fi
222
+	ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
223
+	ip6tables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
224
+	function_check save_firewall_settings
225
+	save_firewall_settings
226
+	echo 'configure_firewall_for_cjdns' >> $COMPLETION_FILE
227
+}
228
+
229
+function configure_firewall_for_batman {
230
+	if grep -Fxq "configure_firewall_for_batman" $COMPLETION_FILE; then
231
+		return
232
+	fi
233
+	if [[ $ENABLE_BATMAN != "yes" ]]; then
234
+		return
235
+	fi
236
+
237
+	function_check save_firewall_settings
238
+	save_firewall_settings
239
+	echo 'configure_firewall_for_batman' >> $COMPLETION_FILE
240
+}
241
+
242
+function configure_firewall_for_babel {
243
+	if grep -Fxq "configure_firewall_for_babel" $COMPLETION_FILE; then
244
+		return
245
+	fi
246
+	if [[ $ENABLE_BABEL != "yes" ]]; then
247
+		return
248
+	fi
249
+	iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $BABEL_PORT -j ACCEPT
250
+	function_check save_firewall_settings
251
+	save_firewall_settings
252
+
253
+	OPEN_PORTS+=("Babel    $BABEL_PORT")
254
+	echo 'configure_firewall_for_babel' >> $COMPLETION_FILE
255
+}
256
+
257
+function configure_firewall_for_zeronet {
258
+	if grep -Fxq "configure_firewall_for_zeronet" $COMPLETION_FILE; then
259
+		return
260
+	fi
261
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
262
+		return
263
+	fi
264
+	iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $ZERONET_PORT -j ACCEPT
265
+	iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $ZERONET_PORT -j ACCEPT
266
+	iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport $TRACKER_PORT -j ACCEPT
267
+	iptables -A INPUT -i $WIFI_INTERFACE -p tcp --dport $TRACKER_PORT -j ACCEPT
268
+	iptables -A INPUT -i $WIFI_INTERFACE -p udp --dport 1900 -j ACCEPT
269
+	function_check save_firewall_settings
270
+	save_firewall_settings
271
+
272
+	OPEN_PORTS+=("ZeroNet  $ZERONET_PORT")
273
+	OPEN_PORTS+=("Tracker  $TRACKER_PORT")
274
+	echo 'configure_firewall_for_zeronet' >> $COMPLETION_FILE
275
+}
276
+
277
+function configure_firewall_for_dlna {
278
+	if grep -Fxq "configure_firewall_for_dlna" $COMPLETION_FILE; then
279
+		return
280
+	fi
281
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
282
+		# docker does its own firewalling
283
+		return
284
+	fi
285
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
286
+		return
287
+	fi
288
+	iptables -A INPUT -p udp --dport 1900 -j ACCEPT
289
+	iptables -A INPUT -p tcp --dport 8200 -j ACCEPT
290
+	function_check save_firewall_settings
291
+	save_firewall_settings
292
+
293
+	OPEN_PORTS+=('DLNA     1900')
294
+	OPEN_PORTS+=('DLNA     8200')
295
+	echo 'configure_firewall_for_dlna' >> $COMPLETION_FILE
296
+}
297
+
298
+function configure_firewall_for_dns {
299
+	if grep -Fxq "configure_firewall_for_dns" $COMPLETION_FILE; then
300
+		return
301
+	fi
302
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
303
+		# docker does its own firewalling
304
+		return
305
+	fi
306
+	iptables -A INPUT -p udp -m udp --dport 1024:65535 --sport 53 -j ACCEPT
307
+	function_check save_firewall_settings
308
+	save_firewall_settings
309
+	echo 'configure_firewall_for_dns' >> $COMPLETION_FILE
310
+}
311
+
312
+function configure_firewall_for_xmpp {
313
+	if [ ! -d /etc/prosody ]; then
314
+		return
315
+	fi
316
+	if grep -Fxq "configure_firewall_for_xmpp" $COMPLETION_FILE; then
317
+		return
318
+	fi
319
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
320
+		# docker does its own firewalling
321
+		return
322
+	fi
323
+	if [[ $ONION_ONLY != "no" ]]; then
324
+		return
325
+	fi
326
+	iptables -A INPUT -p tcp --dport 5222:5223 -j ACCEPT
327
+	iptables -A INPUT -p tcp --dport 5269 -j ACCEPT
328
+	iptables -A INPUT -p tcp --dport 5280:5281 -j ACCEPT
329
+	function_check save_firewall_settings
330
+	save_firewall_settings
331
+
332
+	OPEN_PORTS+=('XMPP     5222-5223')
333
+	OPEN_PORTS+=('XMPP     5269')
334
+	OPEN_PORTS+=('XMPP     5280-5281')
335
+	echo 'configure_firewall_for_xmpp' >> $COMPLETION_FILE
336
+}
337
+
338
+function configure_firewall_for_irc {
339
+	if [ ! -d /etc/ngircd ]; then
340
+		return
341
+	fi
342
+	if grep -Fxq "configure_firewall_for_irc" $COMPLETION_FILE; then
343
+		return
344
+	fi
345
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
346
+		# docker does its own firewalling
347
+		return
348
+	fi
349
+	if [[ $ONION_ONLY != "no" ]]; then
350
+		return
351
+	fi
352
+	iptables -A INPUT -p tcp --dport $IRC_PORT  -j ACCEPT
353
+	iptables -I INPUT -p tcp --dport 1024:65535 --sport $IRC_PORT -j ACCEPT
354
+	function_check save_firewall_settings
355
+	save_firewall_settings
356
+
357
+	OPEN_PORTS+=("IRC      $IRC_PORT")
358
+	echo 'configure_firewall_for_irc' >> $COMPLETION_FILE
359
+}
360
+
361
+function configure_firewall_for_web_access {
362
+	if grep -Fxq "configure_firewall_for_web_access" $COMPLETION_FILE; then
363
+		return
364
+	fi
365
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
366
+		# docker does its own firewalling
367
+		return
368
+	fi
369
+	if [[ $ONION_ONLY != "no" ]]; then
370
+		return
371
+	fi
372
+	iptables -A INPUT -p tcp --dport 32768:61000 --sport 80 -j ACCEPT
373
+	iptables -A INPUT -p tcp --dport 32768:61000 --sport 443 -j ACCEPT
374
+	function_check save_firewall_settings
375
+	save_firewall_settings
376
+
377
+	echo 'configure_firewall_for_web_access' >> $COMPLETION_FILE
378
+}
379
+
380
+function configure_firewall_for_web_server {
381
+	if grep -Fxq "configure_firewall_for_web_server" $COMPLETION_FILE; then
382
+		return
383
+	fi
384
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
385
+		# docker does its own firewalling
386
+		return
387
+	fi
388
+	if [[ $ONION_ONLY != "no" ]]; then
389
+		return
390
+	fi
391
+	iptables -A INPUT -p tcp --dport 80 -j ACCEPT
392
+	iptables -A INPUT -p tcp --dport 443 -j ACCEPT
393
+	function_check save_firewall_settings
394
+	save_firewall_settings
395
+
396
+	OPEN_PORTS+=('HTTP     80')
397
+	OPEN_PORTS+=('HTTPS    443')
398
+	echo 'configure_firewall_for_web_server' >> $COMPLETION_FILE
399
+}
400
+
401
+function configure_firewall_for_tox {
402
+	if grep -Fxq "configure_firewall_for_tox" $COMPLETION_FILE; then
403
+		return
404
+	fi
405
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
406
+		# docker does its own firewalling
407
+		return
408
+	fi
409
+	if [[ $ONION_ONLY != "no" ]]; then
410
+		return
411
+	fi
412
+	iptables -A INPUT -p tcp --dport $TOX_PORT -j ACCEPT
413
+	function_check save_firewall_settings
414
+	save_firewall_settings
415
+
416
+	OPEN_PORTS+=("Tox      $TOX_PORT")
417
+	echo 'configure_firewall_for_tox' >> $COMPLETION_FILE
418
+}
419
+
420
+function configure_firewall_for_ssh {
421
+	if grep -Fxq "configure_firewall_for_ssh" $COMPLETION_FILE; then
422
+		return
423
+	fi
424
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
425
+		# docker does its own firewalling
426
+		return
427
+	fi
428
+	iptables -A INPUT -p tcp --dport 22 -j ACCEPT
429
+	iptables -A INPUT -p tcp --dport $SSH_PORT -j ACCEPT
430
+	function_check save_firewall_settings
431
+	save_firewall_settings
432
+
433
+	OPEN_PORTS+=("SSH      $SSH_PORT")
434
+	echo 'configure_firewall_for_ssh' >> $COMPLETION_FILE
435
+}
436
+
437
+function configure_firewall_for_git {
438
+	if grep -Fxq "configure_firewall_for_git" $COMPLETION_FILE; then
439
+		return
440
+	fi
441
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
442
+		# docker does its own firewalling
443
+		return
444
+	fi
445
+	if [[ $ONION_ONLY != "no" ]]; then
446
+		return
447
+	fi
448
+	iptables -A INPUT -p tcp --dport 9418 -j ACCEPT
449
+	function_check save_firewall_settings
450
+	save_firewall_settings
451
+
452
+	OPEN_PORTS+=("Git      9418")
453
+	echo 'configure_firewall_for_git' >> $COMPLETION_FILE
454
+}
455
+
456
+function configure_firewall_for_email {
457
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
458
+		return
459
+	fi
460
+	if grep -Fxq "configure_firewall_for_email" $COMPLETION_FILE; then
461
+		return
462
+	fi
463
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
464
+		# docker does its own firewalling
465
+		return
466
+	fi
467
+	if [[ $ONION_ONLY != "no" ]]; then
468
+		return
469
+	fi
470
+	iptables -A INPUT -p tcp --dport 25 -j ACCEPT
471
+	iptables -A INPUT -p tcp --dport 587 -j ACCEPT
472
+	iptables -A INPUT -p tcp --dport 465 -j ACCEPT
473
+	iptables -A INPUT -p tcp --dport 993 -j ACCEPT
474
+	function_check save_firewall_settings
475
+	save_firewall_settings
476
+
477
+	OPEN_PORTS+=('Email    25')
478
+	OPEN_PORTS+=('Email    587')
479
+	OPEN_PORTS+=('Email    465')
480
+	OPEN_PORTS+=('Email    993')
481
+	echo 'configure_firewall_for_email' >> $COMPLETION_FILE
482
+}
483
+
484
+function configure_internet_protocol {
485
+	if grep -Fxq "configure_internet_protocol" $COMPLETION_FILE; then
486
+		return
487
+	fi
488
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
489
+		return
490
+	fi
491
+	sed -i "s/#net.ipv4.tcp_syncookies=1/net.ipv4.tcp_syncookies=1/g" /etc/sysctl.conf
492
+	sed -i "s/#net.ipv4.conf.all.accept_redirects = 0/net.ipv4.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
493
+	sed -i "s/#net.ipv6.conf.all.accept_redirects = 0/net.ipv6.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
494
+	sed -i "s/#net.ipv4.conf.all.send_redirects = 0/net.ipv4.conf.all.send_redirects = 0/g" /etc/sysctl.conf
495
+	sed -i "s/#net.ipv4.conf.all.accept_source_route = 0/net.ipv4.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
496
+	sed -i "s/#net.ipv6.conf.all.accept_source_route = 0/net.ipv6.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
497
+	sed -i "s/#net.ipv4.conf.default.rp_filter=1/net.ipv4.conf.default.rp_filter=1/g" /etc/sysctl.conf
498
+	sed -i "s/#net.ipv4.conf.all.rp_filter=1/net.ipv4.conf.all.rp_filter=1/g" /etc/sysctl.conf
499
+	sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=0/g" /etc/sysctl.conf
500
+	sed -i "s/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=0/g" /etc/sysctl.conf
501
+	if ! grep -q "ignore pings" /etc/sysctl.conf; then
502
+		echo '# ignore pings' >> /etc/sysctl.conf
503
+		echo 'net.ipv4.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
504
+		echo 'net.ipv6.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
505
+	fi
506
+	if ! grep -q "disable ipv6" /etc/sysctl.conf; then
507
+		echo '# disable ipv6' >> /etc/sysctl.conf
508
+		echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
509
+	fi
510
+	if ! grep -q "net.ipv4.tcp_synack_retries" /etc/sysctl.conf; then
511
+		echo 'net.ipv4.tcp_synack_retries = 2' >> /etc/sysctl.conf
512
+		echo 'net.ipv4.tcp_syn_retries = 1' >> /etc/sysctl.conf
513
+	fi
514
+	if ! grep -q "keepalive" /etc/sysctl.conf; then
515
+		echo '# keepalive' >> /etc/sysctl.conf
516
+		echo 'net.ipv4.tcp_keepalive_probes = 9' >> /etc/sysctl.conf
517
+		echo 'net.ipv4.tcp_keepalive_intvl = 75' >> /etc/sysctl.conf
518
+		echo 'net.ipv4.tcp_keepalive_time = 7200' >> /etc/sysctl.conf
519
+	fi
520
+	echo 'configure_internet_protocol' >> $COMPLETION_FILE
521
+}

+ 1
- 18
src/freedombone-utils-git View File

@@ -88,24 +88,6 @@ function git_pull {
88 88
 	fi
89 89
 }
90 90
 
91
-# This might be replaced in future with a separate rss reader script
92
-function rss_reader_modifications {
93
-	# modify the rss reader to use a socks5 proxy rather than a http proxy
94
-	if [ ! -d $RSS_READER_PATH ]; then
95
-		return
96
-	fi
97
-
98
-	# ensure that socks5 proxy is used
99
-	if ! grep -q "CURLOPT_PROXYTYPE" $RSS_READER_PATH/plugins/af_unburn/init.php; then
100
-		sed -i '/curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);/a \\t\t\t\t\tcurl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);' $RSS_READER_PATH/plugins/af_unburn/init.php
101
-	fi
102
-	if ! grep -q "CURLOPT_PROXYTYPE" $RSS_READER_PATH/include/functions.php; then
103
-		sed -i '/curl_setopt($ch, CURLOPT_PROXY, _CURL_HTTP_PROXY);/a \\t\t\t\tcurl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);' $RSS_READER_PATH/include/functions.php
104
-	fi
105
-	chown -R www-data:www-data $RSS_READER_PATH
106
-	chmod a+x $RSS_READER_PATH
107
-}
108
-
109 91
 # This ensures that a given repo is on a given commit
110 92
 # If it isn't then it attempts to upgrade
111 93
 function set_repo_commit {
@@ -180,6 +162,7 @@ function set_repo_commit {
180 162
 					make install
181 163
 				fi
182 164
 				if [[ $repo_dir == $RSS_READER_PATH ]]; then
165
+					function_check rss_reader_modifications
183 166
 					rss_reader_modifications
184 167
 				fi
185 168
 				if [[ $repo_dir == *"inadyn" ]]; then

+ 148
- 0
src/freedombone-utils-go View File

@@ -0,0 +1,148 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Go functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+GO_VERSION=1.5
32
+
33
+GO_PACKAGE_MANAGER_REPO="https://github.com/gpmgo/gopm"
34
+GVM_HOME=/home/git/gvm
35
+GVM_REPO="https://github.com/moovweb/gvm"
36
+GVM_COMMIT='25ea8ae158e2861c92e2b22c458e60840157832f'
37
+
38
+function select_go_version {
39
+	if [ ! -d $GVM_HOME/bin ]; then
40
+		echo $'GVM was not installed'
41
+		exit 629532
42
+	fi
43
+	export GVM_ROOT=$GVM_HOME
44
+	if ! grep -q "GVM_ROOT=" ~/.bashrc; then
45
+		echo "export GVM_ROOT=$GVM_ROOT" >> ~/.bashrc
46
+	else
47
+		sed -i "s|export GVM_ROOT=.*|export GVM_ROOT=$GVM_ROOT|g" ~/.bashrc
48
+	fi
49
+	cd $GVM_ROOT/bin
50
+	[[ -s "$GVM_ROOT/scripts/gvm" ]] && source "$GVM_ROOT/scripts/gvm"
51
+	gvm use go${GO_VERSION} --default
52
+	systemctl set-environment GOPATH=$GOPATH
53
+
54
+	if [ ${#GOPATH} -lt 2 ]; then
55
+		echo $'GOPATH was not set'
56
+		exit 629825
57
+	fi
58
+}
59
+
60
+function upgrade_golang {
61
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
62
+		return
63
+	fi
64
+
65
+	# NOTE: this is annoyingly hacky and going in the opposite
66
+	# direction of a pure blend, but it's necessary if you want
67
+	# to run the latest version of gogs
68
+
69
+	# update to the next commit
70
+	function_check set_repo_commit
71
+	set_repo_commit $INSTALL_DIR/gvm "gvm commit" "$GVM_COMMIT" $GVM_REPO
72
+
73
+	if grep -Fxq "upgrade_golang" $COMPLETION_FILE; then
74
+		return
75
+	fi
76
+
77
+	export GVM_ROOT=$GVM_HOME
78
+
79
+	apt-get -y install curl git mercurial make binutils bison gcc build-essential
80
+	if [ ! -d $INSTALL_DIR ]; then
81
+		mkdir $INSTALL_DIR
82
+	fi
83
+	cd $INSTALL_DIR
84
+	function_check git_clone
85
+	git_clone $GVM_REPO gvm
86
+	cd $INSTALL_DIR/gvm
87
+	git checkout $GVM_COMMIT -b $GVM_COMMIT
88
+	if [ ! -f binscripts/gvm-installer ]; then
89
+		echo $'gvm installer not found'
90
+	fi
91
+	chmod +x binscripts/gvm-installer
92
+
93
+	if [ -d /root/.gvm ]; then
94
+		rm -rf /root/.gvm
95
+	fi
96
+	if [ -d $GVM_ROOT ]; then
97
+		rm -rf $GVM_ROOT
98
+	fi
99
+	sed -i "s|export GVM_ROOT=.*|export GVM_ROOT=$GVM_ROOT|g" ~/.bashrc
100
+
101
+	if [ ! -d /home/git ]; then
102
+		# add a gogs user account within which the gvm home directory will exist
103
+		adduser --disabled-login --gecos 'Gogs' git
104
+	fi
105
+	if [ -d /home/git/Maildir ]; then
106
+		rm -rf /home/git/Maildir
107
+	fi
108
+
109
+	# TODO: this script is all over the place
110
+	# and contains hardcoded github. See if you can do better
111
+	./binscripts/gvm-installer master /home/git
112
+
113
+	if [ ! -d $GVM_ROOT ]; then
114
+		echo $'Unable to install gvm'
115
+		exit 83537
116
+	fi
117
+
118
+	[[ -s "$GVM_ROOT/scripts/gvm" ]] && source "$GVM_ROOT/scripts/gvm"
119
+	if [ ! -f $GVM_ROOT/bin/gvm ]; then
120
+		echo $'gvm was not installed'
121
+	fi
122
+	if ! grep -q "export GVM_ROOT=" ~/.bashrc; then
123
+		echo "export GVM_ROOT=$GVM_ROOT" >> ~/.bashrc
124
+	fi
125
+
126
+	cd $GVM_ROOT/bin
127
+	gvm install go1.4
128
+	gvm use go1.4
129
+	export GOROOT_BOOTSTRAP=$GOROOT
130
+	gvm install go${GO_VERSION}
131
+	if [ ! "$?" = "0" ]; then
132
+		echo $'Unable to upgrade golang'
133
+		exit 529252
134
+	fi
135
+	gvm use go${GO_VERSION} --default
136
+
137
+	chown -R git:git $GVM_HOME
138
+
139
+	if ! grep -q "gvm commit" $COMPLETION_FILE; then
140
+		echo "gvm commit:$GVM_COMMIT" >> $COMPLETION_FILE
141
+	else
142
+		sed -i "s/gvm commit.*/gvm commit:$GVM_COMMIT/g" $COMPLETION_FILE
143
+	fi
144
+
145
+	echo 'upgrade_golang' >> $COMPLETION_FILE
146
+}
147
+
148
+# NOTE: deliberately there is no "exit 0"

+ 81
- 0
src/freedombone-utils-help View File

@@ -0,0 +1,81 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Show help
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function show_help {
32
+	echo ''
33
+	echo $"${PROJECT_NAME} -c [configuration file]"
34
+	echo ''
35
+	echo $'  -h --help             Show help'
36
+	echo $'     menuconfig         Easy interactive installation'
37
+	echo $'     menuconfig-full    Full interactive installation'
38
+	echo $'     menuconfig-onion   Interactive installation for onion-only sites'
39
+	echo $'  -c --config           Installing from a configuration file'
40
+	echo $'     --bbb              Installing on Beaglebone Black'
41
+	echo $'  -u --user             User to install the system as'
42
+	echo $'  -d --domain           Default domain name'
43
+	echo $'  -s --system           System type'
44
+	echo $'     --ip               Static LAN IP address of the system'
45
+	echo $'     --iprouter         LAN IP address of the internet router'
46
+	echo $'     --ddns             Dynamic DNS provider domain'
47
+	echo $'     --ddnsuser         Dynamic DNS provider username'
48
+	echo $'     --ddnspass         Dynamic DNS provider password'
49
+	echo ''
50
+	echo $'     --microblogdomain  Microblog domain name'
51
+	echo $'     --wikidomain       Wiki domain name'
52
+	echo $'     --blogdomain       Blog domain name'
53
+	echo $'     --hubzilladomain   Hubzilla domain name'
54
+	echo $'     --gitdomain        Git hosting domain name'
55
+	echo $'  -t --time             Domain used as a TLS time source'
56
+	echo $'     --ssh              ssh port number'
57
+	echo $'     --list             Public mailing list name'
58
+	echo $'     --cores            Number of CPU cores'
59
+	echo $'     --name             Your name'
60
+	echo $'     --email            Your email address'
61
+	echo $'     --usb              Path for the USB drive (eg. /dev/sdb1)'
62
+	echo $'     --cjdns            Enable CJDNS'
63
+	echo $'     --vpass            VoIP server password'
64
+	echo $'     --vport            VoIP server port'
65
+	echo $'     --ns1              First DNS nameserver'
66
+	echo $'     --ns2              Second DNS nameserver'
67
+	echo $'     --repo             Debian repository'
68
+	echo ''
69
+	echo $'system types'
70
+	echo '------------'
71
+	echo $'This can either be blank if you wish to install the full system,'
72
+	echo $"or for more specialised variants you can specify '$VARIANT_MAILBOX', '$VARIANT_CLOUD',"
73
+	echo $"'$VARIANT_CHAT', '$VARIANT_SOCIAL', '$VARIANT_MEDIA', '$VARIANT_WRITER', '$VARIANT_DEVELOPER'"
74
+	echo $"or '$VARIANT_MESH'."
75
+	echo ''
76
+	echo $"If you wish to install everything except email then use the '$VARIANT_NONMAILBOX' variaint."
77
+	echo ''
78
+	exit 0
79
+}
80
+
81
+# NOTE: deliberately no exit 0

+ 109
- 0
src/freedombone-utils-interactive View File

@@ -0,0 +1,109 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Interactive install functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function interactive_configuration_remote_backups {
32
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
33
+		return
34
+	fi
35
+	if [ ! -f /usr/local/bin/${PROJECT_NAME}-remote ]; then
36
+		if [ ! -f /usr/bin/${PROJECT_NAME}-remote ]; then
37
+			echo $"The command ${PROJECT_NAME}-remote was not found"
38
+			exit 87354
39
+		fi
40
+	fi
41
+	${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes
42
+	if [ ! "$?" = "0" ]; then
43
+		echo $'Command failed:'
44
+		echo ''
45
+		echo $"  ${PROJECT_NAME}-remote -u $MY_USERNAME -l $FRIENDS_SERVERS_LIST -m $MINIMUM_PASSWORD_LENGTH -r yes"
46
+		echo ''
47
+		exit 65892
48
+	fi
49
+}
50
+
51
+function interactive_configuration {
52
+	if [ ! -f /usr/local/bin/${PROJECT_NAME}-config ]; then
53
+		if [ ! -f /usr/bin/${PROJECT_NAME}-config ]; then
54
+			echo $"The command ${PROJECT_NAME}-config was not found"
55
+			exit 63935
56
+		fi
57
+	fi
58
+	if [ -f /tmp/meshuserdevice ]; then
59
+		rm -f /tmp/meshuserdevice
60
+	fi
61
+
62
+	if [[ $ONION_ONLY == "no" ]]; then
63
+		if [[ $MINIMAL_INSTALL == "no" ]]; then
64
+			${PROJECT_NAME}-config \
65
+						   -f $CONFIGURATION_FILE \
66
+						   -w $PROJECT_WEBSITE \
67
+						   -m $MINIMUM_PASSWORD_LENGTH
68
+		else
69
+			${PROJECT_NAME}-config \
70
+						   -f $CONFIGURATION_FILE \
71
+						   -w $PROJECT_WEBSITE \
72
+						   -m $MINIMUM_PASSWORD_LENGTH \
73
+						   --minimal "yes"
74
+		fi
75
+	else
76
+		${PROJECT_NAME}-config \
77
+					   -f $CONFIGURATION_FILE \
78
+					   -w $PROJECT_WEBSITE \
79
+					   -m $MINIMUM_PASSWORD_LENGTH \
80
+					   --onion "yes"
81
+	fi
82
+	if [ -f /tmp/meshuserdevice ]; then
83
+		# mesh network user device installation
84
+		rm -f /tmp/meshuserdevice
85
+		exit 0
86
+	fi
87
+	if [ ! "$?" = "0" ]; then
88
+		echo $'Command failed:'
89
+		echo ''
90
+		echo $"  ${PROJECT_NAME}-config -u $MY_USERNAME -f $CONFIGURATION_FILE -w $PROJECT_WEBSITE -b $PROJECT_BITMESSAGE -m $MINIMUM_PASSWORD_LENGTH --minimal [yes|no]"
91
+		echo ''
92
+		exit 73594
93
+	fi
94
+
95
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
96
+		FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
97
+
98
+		dialog --title $"Encrypted backup to other servers" \
99
+			   --backtitle $"${PROJECT_NAME} Configuration" \
100
+			   --defaultno \
101
+			   --yesno $"\nDo you wish to configure some remote backup locations?" 7 60
102
+		sel=$?
103
+		case $sel in
104
+			0) interactive_configuration_remote_backups;;
105
+		esac
106
+	fi
107
+}
108
+
109
+# NOTE: deliberately no exit 0

+ 54
- 0
src/freedombone-utils-international View File

@@ -0,0 +1,54 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# International/language functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function locale_setup {
32
+	if grep -Fxq "locale_setup" $COMPLETION_FILE; then
33
+		return
34
+	fi
35
+
36
+	apt-get -y install locales locales-all debconf
37
+
38
+	if [ ! "$DEFAULT_LANGUAGE" ]; then
39
+		DEFAULT_LANGUAGE='en_GB.UTF-8'
40
+	fi
41
+	if [ ${#DEFAULT_LANGUAGE} -lt 2 ]; then
42
+		DEFAULT_LANGUAGE='en_GB.UTF-8'
43
+	fi
44
+
45
+	update-locale LANG=${DEFAULT_LANGUAGE}
46
+	update-locale LANGUAGE=${DEFAULT_LANGUAGE}
47
+	update-locale LC_MESSAGES=${DEFAULT_LANGUAGE}
48
+	update-locale LC_ALL=${DEFAULT_LANGUAGE}
49
+	update-locale LC_CTYPE=${DEFAULT_LANGUAGE}
50
+
51
+	echo 'locale_setup' >> $COMPLETION_FILE
52
+}
53
+
54
+# NOTE: deliberately no exit 0

+ 86
- 0
src/freedombone-utils-login View File

@@ -0,0 +1,86 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# login functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function change_login_message {
32
+	if grep -Fxq "change_login_message" $COMPLETION_FILE; then
33
+		return
34
+	fi
35
+
36
+	# remove automatic motd creator if it exists
37
+	if [ -f /etc/init.d/motd ]; then
38
+		rm -f /etc/init.d/motd
39
+	fi
40
+
41
+	echo '' > /etc/motd
42
+	echo ".---.                  .              .                   " >> /etc/motd
43
+	echo "|                      |              |                   " >> /etc/motd
44
+	echo "|--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-. " >> /etc/motd
45
+	echo "|    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-' " >> /etc/motd
46
+	echo "'    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'" >> /etc/motd
47
+
48
+	if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
49
+		echo $'               M A I L B O X   E D I T I O N' >> /etc/motd
50
+	fi
51
+
52
+	if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
53
+		echo $'                 S O C I A L   E D I T I O N' >> /etc/motd
54
+	fi
55
+
56
+	if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
57
+		echo $'                  C H A T   E D I T I O N' >> /etc/motd
58
+	fi
59
+
60
+	if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
61
+		echo $'                  C L O U D   E D I T I O N' >> /etc/motd
62
+	fi
63
+
64
+	if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
65
+		echo $'                 W R I T E R   E D I T I O N ' >> /etc/motd
66
+	fi
67
+
68
+	if [[ $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
69
+		echo $'                  M E D I A   E D I T I O N' >> /etc/motd
70
+	fi
71
+
72
+	if [[ $SYSTEM_TYPE == "$VARIANT_DEVELOPER" ]]; then
73
+		echo $'             D E V E L O P E R   E D I T I O N' >> /etc/motd
74
+	fi
75
+
76
+	echo '' >> /etc/motd
77
+	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
78
+		echo $'                  Freedom in the Cloud' >> /etc/motd
79
+	else
80
+		echo $'                   Freedom in the Mesh' >> /etc/motd
81
+	fi
82
+	echo '' >> /etc/motd
83
+	echo 'change_login_message' >> $COMPLETION_FILE
84
+}
85
+
86
+# NOTE: deliberately no exit 0

+ 66
- 0
src/freedombone-utils-monkeysphere View File

@@ -0,0 +1,66 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# monkeysphere functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function install_monkeysphere {
32
+	if grep -Fxq "install_monkeysphere" $COMPLETION_FILE; then
33
+		return
34
+	fi
35
+	apt-get -y install monkeysphere msva-perl
36
+	#su -c "monkeysphere gen-subkey $MY_GPG_PUBLIC_KEY_ID" - $MY_USERNAME
37
+	mkdir /home/$MY_USERNAME/.monkeysphere
38
+	chmod 755 /home/$MY_USERNAME/.monkeysphere
39
+	echo "$MY_NAME <${MY_EMAIL_ADDRESS}>" > /home/$MY_USERNAME/.monkeysphere/authorized_user_ids
40
+	chmod 644 /home/$MY_USERNAME/.monkeysphere/authorized_user_ids
41
+	chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.monkeysphere
42
+	monkeysphere-authentication update-users
43
+
44
+	if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
45
+		echo $'monkeysphere import: ssh host key not found'
46
+		exit 76295
47
+	fi
48
+	monkeysphere-host import-key /etc/ssh/ssh_host_rsa_key ssh://$DEFAULT_DOMAIN_NAME
49
+	SSH_ONION_HOSTNAME=$(cat ${COMPLETION_FILE} | grep 'ssh onion domain' | awk -F ':' '{print $2}')
50
+	monkeysphere-host import-key /etc/ssh/ssh_host_rsa_key ssh://$SSH_ONION_HOSTNAME
51
+
52
+	if [ ! $MY_GPG_PUBLIC_KEY_ID ]; then
53
+		MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_USERNAME@$HOSTNAME")
54
+		if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then
55
+			echo $'monkeysphere unable to get GPG key ID for user $MY_USERNAME'
56
+			exit 52825
57
+		fi
58
+	fi
59
+	# The admin user is the identity certifier
60
+	fpr=$(gpg --with-colons --fingerprint $MY_GPG_PUBLIC_KEY_ID | grep fpr | head -n 1 | awk -F ':' '{print $10}')
61
+	monkeysphere-authentication add-identity-certifier $fpr
62
+
63
+	echo 'install_monkeysphere' >> $COMPLETION_FILE
64
+}
65
+
66
+# NOTE: deliberately no exit 0

+ 90
- 0
src/freedombone-utils-network View File

@@ -0,0 +1,90 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Network functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# If the system is on an IPv6 network
32
+IPV6_NETWORK='2001:470:26:307'
33
+
34
+# The static IP address of the system within the local network
35
+# By default the IP address is dynamic within your LAN
36
+LOCAL_NETWORK_STATIC_IP_ADDRESS=
37
+
38
+# IP address of the router (gateway)
39
+ROUTER_IP_ADDRESS="192.168.1.254"
40
+
41
+MESH_INSTALL_DIR=/var/lib
42
+
43
+function install_static_network {
44
+	if grep -Fxq "install_static_network" $COMPLETION_FILE; then
45
+		return
46
+	fi
47
+	if [[ $INSTALLING_ON_BBB == "yes" ]]; then
48
+		return
49
+	fi
50
+	if [ ! $LOCAL_NETWORK_STATIC_IP_ADDRESS ]; then
51
+		return
52
+	fi
53
+
54
+	echo '# The loopback network interface' > /etc/network/interfaces
55
+	echo 'auto lo' >> /etc/network/interfaces
56
+	echo 'iface lo inet loopback' >> /etc/network/interfaces
57
+	echo '' >> /etc/network/interfaces
58
+	echo '# The primary network interface' >> /etc/network/interfaces
59
+	echo 'auto eth0' >> /etc/network/interfaces
60
+	echo 'iface eth0 inet static' >> /etc/network/interfaces
61
+	echo "    address $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/network/interfaces
62
+	echo '    netmask 255.255.255.0' >> /etc/network/interfaces
63
+	echo "    gateway $ROUTER_IP_ADDRESS" >> /etc/network/interfaces
64
+	echo "    dns-nameservers $NAMESERVER1 $NAMESERVER2" >> /etc/network/interfaces
65
+	echo '# Example to keep MAC address between reboots' >> /etc/network/interfaces
66
+	echo '#hwaddress ether DE:AD:BE:EF:CA:FE' >> /etc/network/interfaces
67
+	echo '' >> /etc/network/interfaces
68
+	echo '# The secondary network interface' >> /etc/network/interfaces
69
+	echo '#auto eth1' >> /etc/network/interfaces
70
+	echo '#iface eth1 inet dhcp' >> /etc/network/interfaces
71
+	echo '' >> /etc/network/interfaces
72
+	echo '# WiFi Example' >> /etc/network/interfaces
73
+	echo "#auto $WIFI_INTERFACE" >> /etc/network/interfaces
74
+	echo "#iface $WIFI_INTERFACE inet dhcp" >> /etc/network/interfaces
75
+	echo '#    wpa-ssid "essid"' >> /etc/network/interfaces
76
+	echo '#    wpa-psk  "password"' >> /etc/network/interfaces
77
+	echo '' >> /etc/network/interfaces
78
+	echo '# Ethernet/RNDIS gadget (g_ether)' >> /etc/network/interfaces
79
+	echo '# ... or on host side, usbnet and random hwaddr' >> /etc/network/interfaces
80
+	echo '# Note on some boards, usb0 is automaticly setup with an init script' >> /etc/network/interfaces
81
+	echo '#iface usb0 inet static' >> /etc/network/interfaces
82
+	echo '#    address 192.168.7.2' >> /etc/network/interfaces
83
+	echo '#    netmask 255.255.255.0' >> /etc/network/interfaces
84
+	echo '#    network 192.168.7.0' >> /etc/network/interfaces
85
+	echo '#    gateway 192.168.7.1' >> /etc/network/interfaces
86
+
87
+	echo 'install_static_network' >> $COMPLETION_FILE
88
+}
89
+
90
+# NOTE: deliberately no exit 0

+ 349
- 0
src/freedombone-utils-onion View File

@@ -0,0 +1,349 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Onion functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function wait_for_onion_service {
32
+	onion_service_name="$1"
33
+
34
+	sleep_ctr=0
35
+	while [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; do
36
+		sleep 1
37
+		sleep_ctr=$((sleep_ctr + 1))
38
+		if [ $sleep_ctr -gt 10 ]; then
39
+			break
40
+		fi
41
+	done
42
+
43
+	if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
44
+		# restart and try a second time
45
+		systemctl restart tor
46
+		sleep_ctr=0
47
+		while [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; do
48
+			sleep 1
49
+			sleep_ctr=$((sleep_ctr + 1))
50
+			if [ $sleep_ctr -gt 10 ]; then
51
+				break
52
+			fi
53
+		done
54
+	fi
55
+}
56
+
57
+function add_onion_service {
58
+	onion_service_name="$1"
59
+	onion_service_port_from=$2
60
+	onion_service_port_to=$3
61
+
62
+	if [ -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
63
+		echo $(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
64
+		return
65
+	fi
66
+
67
+	if [ ! -d /var/lib/tor ]; then
68
+		echo $"No Tor installation found. ${onion_service_name} onion site cannot be configured."
69
+		exit 877367
70
+	fi
71
+	if ! grep -q "hidden_service_${onion_service_name}" /etc/tor/torrc; then
72
+		echo "HiddenServiceDir /var/lib/tor/hidden_service_${onion_service_name}/" >> /etc/tor/torrc
73
+		echo "HiddenServicePort ${onion_service_port_from} 127.0.0.1:${onion_service_port_to}" >> /etc/tor/torrc
74
+	fi
75
+
76
+	systemctl restart tor
77
+
78
+	function_check wait_for_onion_service
79
+	wait_for_onion_service ${onion_service_name}
80
+
81
+	if [ ! -f /var/lib/tor/hidden_service_${onion_service_name}/hostname ]; then
82
+		echo $"${onion_service_name} onion site hostname not found"
83
+		exit 76362
84
+	fi
85
+	echo $(cat /var/lib/tor/hidden_service_${onion_service_name}/hostname)
86
+}
87
+
88
+function set_default_onion_domains {
89
+	# If sites are only visible via Tor then for installation
90
+	# purposes assign them some default domain names
91
+	if [[ $ONION_ONLY == "no" ]]; then
92
+		return
93
+	fi
94
+
95
+	if [ ${#MICROBLOG_DOMAIN_NAME} -gt 1 ]; then
96
+		MICROBLOG_DOMAIN_NAME='microblog.local'
97
+	fi
98
+	if [ ${#FULLBLOG_DOMAIN_NAME} -gt 1 ]; then
99
+		FULLBLOG_DOMAIN_NAME='blog.local'
100
+	fi
101
+	if [ ${#WIKI_DOMAIN_NAME} -gt 1 ]; then
102
+		WIKI_DOMAIN_NAME='wiki.local'
103
+	fi
104
+	if [ ${#DEFAULT_DOMAIN_NAME} -gt 1 ]; then
105
+		DEFAULT_DOMAIN_NAME="${PROJECT_NAME}.local"
106
+	fi
107
+	if [ ${#GIT_DOMAIN_NAME} -gt 1 ]; then
108
+		GIT_DOMAIN_NAME='git.local'
109
+	fi
110
+	if [ ${#MEDIAGOBLIN_DOMAIN_NAME} -gt 1 ]; then
111
+		MEDIAGOBLIN_DOMAIN_NAME='media.local'
112
+	fi
113
+}
114
+
115
+function create_avahi_onion_domains {
116
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
117
+		return
118
+	fi
119
+	if [ ! -d /etc/avahi/services ]; then
120
+		return
121
+	fi
122
+	if [ $MICROBLOG_DOMAIN_NAME ]; then
123
+	    function_check create_avahi_service
124
+		create_avahi_service microblog http tcp $MICROBLOG_ONION_PORT
125
+	fi
126
+	if [ $FULLBLOG_DOMAIN_NAME ]; then
127
+	    function_check create_avahi_service
128
+		create_avahi_service blog http tcp $BLOG_ONION_PORT
129
+	fi
130
+	if [ $GIT_DOMAIN_NAME ]; then
131
+	    function_check create_avahi_service
132
+		create_avahi_service git http tcp $GIT_ONION_PORT
133
+	fi
134
+	if [ $WIKI_DOMAIN_NAME ]; then
135
+	    function_check create_avahi_service
136
+		create_avahi_service wiki http tcp $WIKI_ONION_PORT
137
+	fi
138
+}
139
+
140
+function allow_ssh_to_onion_address {
141
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
142
+		return
143
+	fi
144
+	if [ ! -d /home/$MY_USERNAME/.ssh ]; then
145
+		mkdir /home/$MY_USERNAME/.ssh
146
+	fi
147
+	if [ ! -d /etc/tor ]; then
148
+		echo $'Tor not found when updating ssh'
149
+		exit 528257
150
+	fi
151
+	if ! grep -q "onion" /home/$MY_USERNAME/.ssh/config; then
152
+		echo 'Host *.onion' >> /home/$MY_USERNAME/.ssh/config
153
+		echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/$MY_USERNAME/.ssh/config
154
+	fi
155
+}
156
+
157
+function enable_ssh_via_onion {
158
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
159
+		return
160
+	fi
161
+	if grep -Fxq "enable_ssh_via_onion" $COMPLETION_FILE; then
162
+		return
163
+	fi
164
+	apt-get -y install tor connect-proxy
165
+	if ! grep -q 'Host *.onion' /home/$MY_USERNAME/.ssh/config; then
166
+		if [ ! -d /home/$MY_USERNAME/.ssh ]; then
167
+			mkdir /home/$MY_USERNAME/.ssh
168
+		fi
169
+		echo 'Host *.onion' >> /home/$MY_USERNAME/.ssh/config
170
+		echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /home/$MY_USERNAME/.ssh/config
171
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
172
+		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh/config
173
+	fi
174
+	if ! grep -q 'Host *.onion' /root/.ssh/config; then
175
+		if [ ! -d /root/.ssh ]; then
176
+			mkdir /root/.ssh
177
+		fi
178
+		echo 'Host *.onion' >> /root/.ssh/config
179
+		echo 'ProxyCommand connect -R remote -5 -S 127.0.0.1:9050 %h %p' >> /root/.ssh/config
180
+	fi
181
+	echo 'enable_ssh_via_onion' >> $COMPLETION_FILE
182
+}
183
+
184
+function configure_ssh_onion {
185
+	if grep -Fxq "configure_ssh_onion" $COMPLETION_FILE; then
186
+		return
187
+	fi
188
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
189
+		return
190
+	fi
191
+
192
+	SSH_ONION_HOSTNAME=$(add_onion_service ssh ${SSH_PORT} ${SSH_PORT})
193
+
194
+	if ! grep -q "ssh onion domain" $COMPLETION_FILE; then
195
+		echo "ssh onion domain:${SSH_ONION_HOSTNAME}" >> $COMPLETION_FILE
196
+	else
197
+		sed -i "s|ssh onion domain.*|ssh onion domain:${SSH_ONION_HOSTNAME}|g" $COMPLETION_FILE
198
+	fi
199
+
200
+	echo 'configure_ssh_onion' >> $COMPLETION_FILE
201
+}
202
+
203
+function install_tor {
204
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
205
+		return
206
+	fi
207
+	if grep -Fxq "install_tor" $COMPLETION_FILE; then
208
+		return
209
+	fi
210
+	apt-get -y install tor
211
+	if [ ! -f /etc/tor/torrc ]; then
212
+		echo 'Tor failed to install'
213
+		exit 38259
214
+	fi
215
+	echo 'install_tor' >> $COMPLETION_FILE
216
+}
217
+
218
+function resolve_dns_via_tor {
219
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
220
+		return
221
+	fi
222
+	if grep -Fxq "resolve_dns_via_tor" $COMPLETION_FILE; then
223
+		return
224
+	fi
225
+	if [ ! -f /etc/tor/torrc ]; then
226
+		echo $'tor was not installed'
227
+		exit 52952
228
+	fi
229
+
230
+	# resolve DNS via tor
231
+	if ! grep 'DNSPort 53' /etc/tor/torrc; then
232
+		echo 'DNSPort 53' >> /etc/tor/torrc
233
+		echo 'AutomapHostsOnResolve 1' >> /etc/tor/torrc
234
+		echo 'AutomapHostsSuffixes .exit,.onion' >> /etc/tor/torrc
235
+		systemctl restart tor
236
+	fi
237
+
238
+	# don't change resolv.conf
239
+	sed -i 's|, domain-name-servers||g' /etc/dhcp/dhclient.conf
240
+
241
+	# point resolv.conf to tor
242
+	echo 'nameserver 127.0.0.1:53' > /etc/resolv.conf
243
+
244
+	# prevent resolv.conf from changing
245
+	chattr +i /etc/resolv.conf
246
+
247
+	echo 'resolve_dns_via_tor' >> $COMPLETION_FILE
248
+}
249
+
250
+# see https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy
251
+# Local Redirection and Anonymizing Middlebox
252
+function route_outgoing_traffic_through_tor {
253
+	if grep -Fxq "route_outgoing_traffic_through_tor" $COMPLETION_FILE; then
254
+		return
255
+	fi
256
+	if [[ $ROUTE_THROUGH_TOR != "yes" ]]; then
257
+		return
258
+	fi
259
+	apt-get -y install tor tor-arm
260
+
261
+	### set variables
262
+	# Destinations you don't want routed through Tor
263
+	_non_tor="192.168.1.0/24 192.168.0.0/24"
264
+
265
+	# The user that Tor runs as
266
+	_tor_uid="debian-tor"
267
+
268
+	# Tor's TransPort
269
+	_trans_port="9040"
270
+
271
+	# Your internal interface
272
+	_int_if="eth0"
273
+
274
+	### Set iptables *nat
275
+	iptables -t nat -A OUTPUT -o lo -j RETURN
276
+	iptables -t nat -A OUTPUT -m owner --uid-owner $_tor_uid -j RETURN
277
+	iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53
278
+
279
+	# Allow clearnet access for hosts in $_non_tor
280
+	for _clearnet in $_non_tor; do
281
+		iptables -t nat -A OUTPUT -d $_clearnet -j RETURN
282
+		iptables -t nat -A PREROUTING -i $_int_if -d $_clearnet -j RETURN
283
+	done
284
+
285
+	# Redirect all other pre-routing and output to Tor
286
+	iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $_trans_port
287
+	iptables -t nat -A PREROUTING -i $_int_if -p udp --dport 53 -j REDIRECT --to-ports 53
288
+	iptables -t nat -A PREROUTING -i $_int_if -p tcp --syn -j REDIRECT --to-ports $_trans_port
289
+
290
+	### set iptables *filter
291
+	iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
292
+
293
+	# Allow clearnet access for hosts in $_non_tor
294
+	for _clearnet in $_non_tor 127.0.0.0/8; do
295
+		iptables -A OUTPUT -d $_clearnet -j ACCEPT
296
+	done
297
+
298
+	# Allow only Tor output
299
+	iptables -A OUTPUT -m owner --uid-owner $_tor_uid -j ACCEPT
300
+	iptables -A OUTPUT -j REJECT
301
+
302
+	function_check save_firewall_settings
303
+	save_firewall_settings
304
+
305
+	if ! grep -q "fs.file-max" /etc/sysctl.conf; then
306
+		echo "fs.file-max=100000" >> /etc/sysctl.conf
307
+		/sbin/sysctl -p
308
+	fi
309
+
310
+	echo 'domain localdomain' > /etc/resolv.conf
311
+	echo 'search localdomain' >> /etc/resolv.conf
312
+	echo 'nameserver 127.0.0.1' >> /etc/resolv.conf
313
+
314
+	if ! grep -q "VirtualAddrNetworkIPv4" /etc/tor/torrc; then
315
+		echo 'VirtualAddrNetworkIPv4 10.192.0.0/10' >> /etc/tor/torrc
316
+	fi
317
+
318
+	if ! grep -q "AutomapHostsOnResolve" /etc/tor/torrc; then
319
+		echo 'AutomapHostsOnResolve 1' >> /etc/tor/torrc
320
+	fi
321
+
322
+	if ! grep -q "TransPort" /etc/tor/torrc; then
323
+		echo 'TransPort 9040' >> /etc/tor/torrc
324
+	fi
325
+
326
+	if ! grep -q "TransListenAddress 127.0.0.1" /etc/tor/torrc; then
327
+		echo 'TransListenAddress 127.0.0.1' >> /etc/tor/torrc
328
+	fi
329
+
330
+	if ! grep -q "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
331
+		echo "TransListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
332
+	fi
333
+
334
+	if ! grep -q "DNSPort" /etc/tor/torrc; then
335
+		echo 'DNSPort 53' >> /etc/tor/torrc
336
+	fi
337
+
338
+	if ! grep -q "DNSListenAddress 127.0.0.1" /etc/tor/torrc; then
339
+		echo 'DNSListenAddress 127.0.0.1' >> /etc/tor/torrc
340
+	fi
341
+
342
+	if ! grep -q "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" /etc/tor/torrc; then
343
+		echo "DNSListenAddress $LOCAL_NETWORK_STATIC_IP_ADDRESS" >> /etc/tor/torrc
344
+	fi
345
+
346
+	echo 'route_outgoing_traffic_through_tor' >> $COMPLETION_FILE
347
+}
348
+
349
+# NOTE: deliberately no exit 0

+ 54
- 0
src/freedombone-utils-passwords View File

@@ -0,0 +1,54 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Password functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# If this file exists it contains a global password used with
32
+# disk image installs. This simplifies password management for
33
+# deployment at scale
34
+IMAGE_PASSWORD_FILE=/root/login.txt
35
+
36
+# Minimum number of characters in a password
37
+MINIMUM_PASSWORD_LENGTH=10
38
+
39
+function enforce_good_passwords {
40
+	# because humans are generally bad at choosing passwords
41
+	if grep -Fxq "enforce_good_passwords" $COMPLETION_FILE; then
42
+		return
43
+	fi
44
+	apt-get -y install libpam-cracklib
45
+
46
+	sed -i 's/password.*requisite.*pam_cracklib.so.*/password        required                       pam_cracklib.so retry=2 dcredit=-4 ucredit=-1 ocredit=-1 lcredit=0 minlen=10 reject_username/g' /etc/pam.d/common-password
47
+	echo 'enforce_good_passwords' >> $COMPLETION_FILE
48
+}
49
+
50
+function create_password {
51
+    echo "$(openssl rand -base64 32 | cut -c1-${1})"
52
+}
53
+
54
+# NOTE: deliberately no exit 0

+ 149
- 0
src/freedombone-utils-repos View File

@@ -0,0 +1,149 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Functions to set repositories
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# The Debian package repository to use.
32
+DEBIAN_REPO="ftp.us.debian.org"
33
+
34
+# password used for accessing your repo mirrors
35
+MY_MIRRORS_PASSWORD=
36
+# friend's repo mirrors
37
+FRIENDS_MIRRORS_PASSWORD=
38
+FRIENDS_MIRRORS_SERVER=
39
+FRIENDS_MIRRORS_SSH_PORT=2222
40
+
41
+function create_repo_sources {
42
+	if grep -Fxq "create_repo_sources" $COMPLETION_FILE; then
43
+		return
44
+	fi
45
+	rm -rf /var/lib/apt/lists/*
46
+	apt-get clean
47
+
48
+	echo "deb http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION} main" > /etc/apt/sources.list
49
+	echo "deb-src http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION} main" >> /etc/apt/sources.list
50
+	echo '' >> /etc/apt/sources.list
51
+	echo "deb http://security.debian.org/ ${DEBIAN_VERSION}/updates main" >> /etc/apt/sources.list
52
+	echo "deb-src http://security.debian.org/ ${DEBIAN_VERSION}/updates main" >> /etc/apt/sources.list
53
+	echo '' >> /etc/apt/sources.list
54
+	echo "deb http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-updates main" >> /etc/apt/sources.list
55
+	echo "deb-src http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-updates main" >> /etc/apt/sources.list
56
+	echo '' >> /etc/apt/sources.list
57
+	echo "deb http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-backports main" >> /etc/apt/sources.list
58
+	echo "deb-src http://${DEBIAN_REPO}/debian/ ${DEBIAN_VERSION}-backports main" >> /etc/apt/sources.list
59
+
60
+	apt-get update
61
+	apt-get -y install apt-transport-https
62
+
63
+	echo 'create_repo_sources' >> $COMPLETION_FILE
64
+}
65
+
66
+function read_repo_servers {
67
+	if [ -f $CONFIGURATION_FILE ]; then
68
+		if grep -q "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE; then
69
+			FRIENDS_MIRRORS_SERVER=$(grep "FRIENDS_MIRRORS_SERVER" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
70
+		fi
71
+		if grep -q "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE; then
72
+			FRIENDS_MIRRORS_SSH_PORT=$(grep "FRIENDS_MIRRORS_SSH_PORT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
73
+		fi
74
+		if grep -q "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
75
+			MY_MIRRORS_PASSWORD=$(grep "MY_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
76
+		fi
77
+		if grep -q "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE; then
78
+			FRIENDS_MIRRORS_PASSWORD=$(grep "FRIENDS_MIRRORS_PASSWORD" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
79
+		fi
80
+	fi
81
+
82
+	if [ ! $FRIENDS_MIRRORS_SERVER ]; then
83
+		return
84
+	fi
85
+	if [ ${#FRIENDS_MIRRORS_SERVER} -lt 2 ]; then
86
+		return
87
+	fi
88
+
89
+	MAIN_COMMAND=/usr/local/bin/${PROJECT_NAME}
90
+	if [ ! -f $MAIN_COMMAND ]; then
91
+		MAIN_COMMAND=/usr/bin/${PROJECT_NAME}
92
+	fi
93
+
94
+	REPOS=($(cat ${MAIN_COMMAND} | grep "_REPO=\"" | uniq -u | sed 's|${PROJECT_NAME}|'"${PROJECT_NAME}"'|g'))
95
+
96
+	for line in "${REPOS[@]}"
97
+	do
98
+		repo_name=$(echo "$line" | awk -F '=' '{print $1}')
99
+		mirrors_name=$(echo "$repo_name" | sed "s|_REPO||g" | awk '{print tolower($0)}')
100
+		friends_repo_url="ssh://mirrors@${FRIENDS_MIRRORS_SERVER}:${FRIENDS_MIRRORS_SSH_PORT}/home/mirrors/${mirrors_name}"
101
+		${repo_name}="${friends_repo_url}"
102
+	done
103
+}
104
+
105
+# A command to create a git repository for a project
106
+function create_git_project {
107
+	if grep -Fxq "create_git_project" $COMPLETION_FILE; then
108
+		return
109
+	fi
110
+	apt-get -y install git
111
+
112
+	echo '#!/bin/bash' > /usr/bin/$CREATE_GIT_PROJECT_COMMAND
113
+	echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
114
+	echo 'GIT_PROJECT_NAME=$1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
115
+	echo 'if [ ! $GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
116
+	echo '  echo "Please specify a project name, without any spaces"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
117
+	echo '  exit 1' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
118
+	echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
119
+	echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
120
+	echo 'if [ ! -d /home/$USER/projects/$GIT_PROJECT_NAME ]; then' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
121
+	echo '  mkdir -p /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
122
+	echo 'fi' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
123
+	echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
124
+	echo 'cd /home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
125
+	echo 'git init --bare' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
126
+	echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
127
+	echo -n 'echo "Your project has been created, ' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
128
+	echo 'use the following command to clone the repository"' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
129
+	echo -n "  git clone ssh://$MY_USERNAME@$DEFAULT_DOMAIN_NAME:$SSH_PORT" >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
130
+	echo '/home/$USER/projects/$GIT_PROJECT_NAME' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
131
+	echo '' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
132
+	echo 'exit 0' >> /usr/bin/$CREATE_GIT_PROJECT_COMMAND
133
+	chmod +x /usr/bin/$CREATE_GIT_PROJECT_COMMAND
134
+
135
+	echo 'create_git_project' >> $COMPLETION_FILE
136
+}
137
+
138
+function create_mirrors {
139
+	if [ -d /home/trove ]; then
140
+		userdel -r trove
141
+	fi
142
+	if grep -Fxq "create_mirrors" $COMPLETION_FILE; then
143
+		return
144
+	fi
145
+	${PROJECT_NAME}-mirrors
146
+	echo 'create_mirrors' >> $COMPLETION_FILE
147
+}
148
+
149
+# NOTE: deliberately no exit 0

+ 167
- 0
src/freedombone-utils-rng View File

@@ -0,0 +1,167 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Random number generation functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# The type of hardware random number generator being used
32
+# This can be empty, "beaglebone" or "onerng"
33
+HWRNG_TYPE=
34
+
35
+# Download location for OneRNG driver
36
+ONERNG_PACKAGE="onerng_3.4-1_all.deb"
37
+ONERNG_PACKAGE_DOWNLOAD="https://github.com/OneRNG/onerng.github.io/blob/master/sw/$ONERNG_PACKAGE?raw=true"
38
+# Hash for OneRNG driver
39
+ONERNG_PACKAGE_HASH='78f1c2f52ae573e3b398a695ece7ab9f41868252657ea269f0d5cf0bd4f2eb59'
40
+
41
+# device name for OneRNG
42
+ONERNG_DEVICE='ttyACM0'
43
+
44
+function check_hwrng {
45
+	if [[ $HWRNG_TYPE == "beaglebone" ]]; then
46
+		# If hardware random number generation was enabled then make sure that the device exists.
47
+		# if /dev/hwrng is not found then any subsequent cryptographic key generation would
48
+		# suffer from low entropy and might be insecure
49
+		if [ ! -e /dev/hwrng ]; then
50
+			ls /dev/hw*
51
+			echo $'The hardware random number generator is enabled but could not be detected on'
52
+			echo $'/dev/hwrng.  There may be a problem with the installation or the Beaglebone hardware.'
53
+			exit 75
54
+		fi
55
+	fi
56
+
57
+	# If a OneRNG device was installed then verify its firmware
58
+	#check_onerng_verification
59
+}
60
+
61
+function check_onerng_verification {
62
+	if grep -Fxq "check_onerng_verification" $COMPLETION_FILE; then
63
+		return
64
+	fi
65
+	if [[ $HWRNG_TYPE != "onerng" ]]; then
66
+		return
67
+	fi
68
+	echo $'Checking OneRNG firmware verification'
69
+	last_onerng_validation=$(cat /var/log/syslog.1 | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
70
+	if [[ $last_onerng_validation != *"passed OK"* ]]; then
71
+		last_onerng_validation=$(cat /var/log/syslog | grep "OneRNG: firmware verification" | awk '/./{line=$0} END{print line}')
72
+		if [[ $last_onerng_validation != *"passed OK"* ]]; then
73
+			echo $last_onerng_validation
74
+			echo $'OneRNG firmware verification failed'
75
+			exit 735026
76
+		fi
77
+	fi
78
+	echo $'OneRNG firmware verification passed'
79
+	# if haveged was previously installed then remove it
80
+	apt-get -y remove haveged
81
+	echo 'check_onerng_verification' >> $COMPLETION_FILE
82
+}
83
+
84
+function install_onerng {
85
+	apt-get -y install rng-tools at python-gnupg
86
+
87
+	# Move to the installation directory
88
+	if [ ! -d $INSTALL_DIR ]; then
89
+		mkdir $INSTALL_DIR
90
+	fi
91
+	cd $INSTALL_DIR
92
+
93
+	# Download the package
94
+	if [ ! -f $ONERNG_PACKAGE ]; then
95
+		wget $ONERNG_PACKAGE_DOWNLOAD
96
+		mv "$ONERNG_PACKAGE?raw=true" $ONERNG_PACKAGE
97
+	fi
98
+	if [ ! -f $ONERNG_PACKAGE ]; then
99
+		echo $"OneRNG package could not be downloaded"
100
+		exit 59249
101
+	fi
102
+
103
+	# Check the hash
104
+	hash=$(sha256sum $ONERNG_PACKAGE | awk -F ' ' '{print $1}')
105
+	if [[ $hash != $ONERNG_PACKAGE_HASH ]]; then
106
+		echo $"OneRNG package: $ONERNG_PACKAGE"
107
+		echo $"Hash does not match. This could indicate that the package has been tampered with."
108
+		echo $"OneRNG expected package hash: $ONERNG_PACKAGE_HASH"
109
+		echo $"OneRNG actual hash: $hash"
110
+		exit 25934
111
+	fi
112
+
113
+	# install the package
114
+	dpkg -i $ONERNG_PACKAGE
115
+
116
+	# Check that the install worked
117
+	if [ ! -f /etc/onerng.conf ]; then
118
+		echo $'OneRNG configuration file not found. The package may not have installed successfully.'
119
+		exit 42904
120
+	fi
121
+
122
+	dialog --title $"OneRNG Device" \
123
+		   --msgbox $"Please plug in the OneRNG device" 6 40
124
+
125
+	# check rng-tools configuration
126
+	if ! grep -q "/dev/$ONERNG_DEVICE" /etc/default/rng-tools; then
127
+		echo "HRNGDEVICE=/dev/$ONERNG_DEVICE" >> /etc/default/rng-tools
128
+	fi
129
+
130
+	systemctl restart rng-tools
131
+}
132
+
133
+function random_number_generator {
134
+	if grep -Fxq "random_number_generator" $COMPLETION_FILE; then
135
+		return
136
+	fi
137
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
138
+		# it is assumed that docker uses the random number
139
+		# generator of the host system
140
+		return
141
+	fi
142
+
143
+	# if the hrng type has not been set but /dev/hwrng is detected
144
+	if [[ $HWRNG_TYPE != "beaglebone" ]]; then
145
+		if [ -e /dev/hwrng ]; then
146
+			HWRNG_TYPE="beaglebone"
147
+		fi
148
+	fi
149
+
150
+	case $HWRNG_TYPE in
151
+		beaglebone)
152
+			apt-get -y install rng-tools
153
+			sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' /etc/default/rng-tools
154
+			;;
155
+		onerng)
156
+			function_check install_onerng
157
+			install_onerng
158
+			;;
159
+		*)
160
+			apt-get -y install haveged
161
+			;;
162
+	esac
163
+
164
+	echo 'random_number_generator' >> $COMPLETION_FILE
165
+}
166
+
167
+# NOTE: deliberately no exit 0

+ 368
- 0
src/freedombone-utils-setup View File

@@ -0,0 +1,368 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Setup functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# Different system variants which may be specified within
32
+# the SYSTEM_TYPE option
33
+VARIANT_FULL="full"
34
+VARIANT_WRITER="writer"
35
+VARIANT_CLOUD="cloud"
36
+VARIANT_CHAT="chat"
37
+VARIANT_MAILBOX="mailbox"
38
+VARIANT_NONMAILBOX="nonmailbox"
39
+VARIANT_SOCIAL="social"
40
+VARIANT_MEDIA="media"
41
+VARIANT_DEVELOPER="developer"
42
+VARIANT_MESH="mesh"
43
+
44
+DEFAULT_DOMAIN_NAME=
45
+DEFAULT_DOMAIN_CODE=
46
+MY_USERNAME=
47
+SYSTEM_TYPE=$VARIANT_FULL
48
+
49
+# An optional configuration file which overrides some of these variables
50
+CONFIGURATION_FILE="${PROJECT_NAME}.cfg"
51
+
52
+# Directory where source code is downloaded and compiled
53
+INSTALL_DIR=$HOME/build
54
+
55
+# device name for an attached usb drive
56
+USB_DRIVE=/dev/sda1
57
+
58
+# Location where the USB drive is mounted to
59
+USB_MOUNT=/mnt/usb
60
+
61
+# Number of days to keep backups for
62
+BACKUP_MAX_DAYS=30
63
+
64
+# file containing a list of remote locations to backup to
65
+# Format: [username@friendsdomain//home/username] [ssh_password]
66
+# With the only space character being between the server and the password
67
+FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
68
+
69
+export DEBIAN_FRONTEND=noninteractive
70
+
71
+# used to limit CPU usage
72
+CPULIMIT='/usr/bin/cpulimit -l 20 -e'
73
+
74
+# command to create a git repository
75
+CREATE_GIT_PROJECT_COMMAND='create-project'
76
+
77
+# File which keeps track of what has already been installed
78
+COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
79
+
80
+# log file where details of remote backups are stored
81
+REMOTE_BACKUPS_LOG=/var/log/remotebackups.log
82
+
83
+# message if something fails to install
84
+CHECK_MESSAGE="Check your internet connection, /etc/network/interfaces and /etc/resolv.conf, then delete $COMPLETION_FILE, run 'rm -fR /var/lib/apt/lists/* && apt-get update --fix-missing' and run this script again. If hash sum mismatches persist then try setting $DEBIAN_REPO to a different mirror and also change /etc/apt/sources.list."
85
+
86
+# Default diffie-hellman key length in bits
87
+DH_KEYLENGTH=2048
88
+
89
+function initial_setup {
90
+	if grep -Fxq "initial_setup" $COMPLETION_FILE; then
91
+		return
92
+	fi
93
+
94
+	apt-get -y remove --purge apache*
95
+	apt-get -y dist-upgrade
96
+	apt-get -y install ca-certificates emacs24 cpulimit
97
+	apt-get -y install cryptsetup libgfshare-bin obnam sshpass wget
98
+	apt-get -y install avahi-daemon avahi-utils avahi-discover
99
+	apt-get -y install connect-proxy
100
+
101
+	if [ ! -d $INSTALL_DIR ]; then
102
+		mkdir -p $INSTALL_DIR
103
+	fi
104
+
105
+	echo 'initial_setup' >> $COMPLETION_FILE
106
+}
107
+
108
+function search_for_attached_usb_drive {
109
+	# If a USB drive is attached then search for email,
110
+	# gpg, ssh keys and emacs configuration
111
+	if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
112
+		return
113
+	fi
114
+	if [ -b $USB_DRIVE ]; then
115
+		if [ ! -d $USB_MOUNT ]; then
116
+			echo $'Mounting USB drive'
117
+			mkdir $USB_MOUNT
118
+			mount $USB_DRIVE $USB_MOUNT
119
+		fi
120
+		if ! [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
121
+			if [ -d $USB_MOUNT/Maildir ]; then
122
+				echo $'Maildir found on USB drive'
123
+				IMPORT_MAILDIR=$USB_MOUNT/Maildir
124
+			fi
125
+			if [ -d $USB_MOUNT/.gnupg ]; then
126
+				echo $'Importing GPG keyring'
127
+				cp -r $USB_MOUNT/.gnupg /home/$MY_USERNAME
128
+				chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
129
+				GPG_KEYS_IMPORTED="yes"
130
+				if [ ! -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
131
+					echo $'GPG files did not copy'
132
+					exit 73529
133
+				fi
134
+			fi
135
+
136
+			if [ -f $USB_MOUNT/.procmailrc ]; then
137
+				echo $'Importing procmail settings'
138
+				cp $USB_MOUNT/.procmailrc /home/$MY_USERNAME
139
+				chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
140
+			fi
141
+
142
+			if [ -f $USB_MOUNT/private_key.gpg ]; then
143
+				echo $'GPG private key found on USB drive'
144
+				MY_GPG_PRIVATE_KEY=$USB_MOUNT/private_key.gpg
145
+			fi
146
+			if [ -f $USB_MOUNT/public_key.gpg ]; then
147
+				echo $'GPG public key found on USB drive'
148
+				MY_GPG_PUBLIC_KEY=$USB_MOUNT/public_key.gpg
149
+			fi
150
+		fi
151
+		if [ -d $USB_MOUNT/prosody ]; then
152
+			if [ ! -d $XMPP_DIRECTORY ]; then
153
+				mkdir $XMPP_DIRECTORY
154
+			fi
155
+			cp -r $USB_MOUNT/prosody/* $XMPP_DIRECTORY
156
+			chown -R prosody:prosody $XMPP_DIRECTORY
157
+		fi
158
+		if [ -d $USB_MOUNT/.ssh ]; then
159
+			echo $'Importing ssh keys'
160
+			cp -r $USB_MOUNT/.ssh /home/$MY_USERNAME
161
+			chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
162
+			# for security delete the ssh keys from the usb drive
163
+			if [ ! -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
164
+				echo $'ssh files did not copy'
165
+				exit 8
166
+			fi
167
+		fi
168
+		if [ -f $USB_MOUNT/.emacs ]; then
169
+			echo $'Importing .emacs file'
170
+			cp -f $USB_MOUNT/.emacs /home/$MY_USERNAME/.emacs
171
+			chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
172
+		fi
173
+		if [ -d $USB_MOUNT/.emacs.d ]; then
174
+			echo $'Importing .emacs.d directory'
175
+			cp -r $USB_MOUNT/.emacs.d /home/$MY_USERNAME
176
+			chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
177
+		fi
178
+		if [ -d $USB_MOUNT/ssl ]; then
179
+			echo $'Importing SSL certificates'
180
+			cp -r $USB_MOUNT/ssl/* /etc/ssl
181
+			chmod 640 /etc/ssl/certs/*
182
+			chmod 400 /etc/ssl/private/*
183
+			# change ownership of some certificates
184
+			if [ -d /etc/prosody ]; then
185
+				chown prosody:prosody /etc/ssl/private/xmpp.*
186
+				chown prosody:prosody /etc/ssl/certs/xmpp.*
187
+			fi
188
+			if [ -d /etc/dovecot ]; then
189
+				chown root:dovecot /etc/ssl/certs/dovecot.*
190
+				chown root:dovecot /etc/ssl/private/dovecot.*
191
+			fi
192
+			if [ -f /etc/ssl/private/exim.key ]; then
193
+				cp /etc/ssl/private/exim.key /etc/exim4
194
+				cp /etc/ssl/certs/exim.crt /etc/exim4
195
+				cp /etc/ssl/certs/exim.dhparam /etc/exim4
196
+				chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
197
+				chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
198
+			fi
199
+		fi
200
+		if [ -d $USB_MOUNT/personal ]; then
201
+			echo $'Importing personal directory'
202
+			cp -r $USB_MOUNT/personal /home/$MY_USERNAME
203
+			chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
204
+		fi
205
+	else
206
+		if [ -d $USB_MOUNT ]; then
207
+			umount $USB_MOUNT
208
+			rm -rf $USB_MOUNT
209
+		fi
210
+		echo $'No USB drive attached'
211
+	fi
212
+	echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
213
+}
214
+
215
+function mark_admin_user_account {
216
+	if ! grep -q "Admin user:" $COMPLETION_FILE; then
217
+		echo "Admin user:$MY_USERNAME" >> $COMPLETION_FILE
218
+	fi
219
+}
220
+
221
+function remove_instructions_from_motd {
222
+	sed -i '/## /d' /etc/motd
223
+}
224
+
225
+function remove_default_user {
226
+	# make sure you don't use the default user account
227
+	if [[ $MY_USERNAME == "debian" ]]; then
228
+		echo 'Do not use the default debian user account. Create a different user with: adduser [username]'
229
+		exit 68
230
+	fi
231
+	# remove the default debian user to prevent it from becoming an attack vector
232
+	if [ -d /home/debian ]; then
233
+		userdel -r debian
234
+		echo 'Default debian user account removed'
235
+	fi
236
+}
237
+
238
+function setup_firewall {
239
+	configure_firewall
240
+	configure_firewall_ping
241
+	configure_firewall_for_dns
242
+	configure_firewall_for_avahi
243
+}
244
+
245
+function setup_system {
246
+	read_configuration
247
+	set_default_onion_domains
248
+	locale_setup
249
+	parse_args
250
+	check_domains
251
+	install_static_network
252
+	remove_default_user
253
+	setup_firewall
254
+	create_repo_sources
255
+	configure_dns
256
+	initial_setup
257
+	install_tor
258
+	#resolve_dns_via_tor
259
+	install_command_line_browser
260
+	enable_ssh_via_onion
261
+	check_date
262
+	install_dynamicdns
263
+	randomize_cron
264
+	create_freedns_updater
265
+	mark_admin_user_account
266
+	enforce_good_passwords
267
+	install_editor
268
+	change_login_message
269
+	enable_zram
270
+	random_number_generator
271
+	set_your_domain_name
272
+	time_synchronisation_tlsdate
273
+	configure_internet_protocol
274
+	create_git_project
275
+	setup_wifi
276
+	configure_ssh
277
+	configure_ssh_onion
278
+	allow_ssh_to_onion_address
279
+	remove_instructions_from_motd
280
+	check_hwrng
281
+	search_for_attached_usb_drive
282
+	regenerate_ssh_keys
283
+	create_mirrors
284
+	create_upgrade_script
285
+	letsencrypt_renewals
286
+	install_watchdog_script
287
+	configure_avahi
288
+	create_avahi_onion_domains
289
+	#install_atheros_wifi
290
+	route_outgoing_traffic_through_tor
291
+}
292
+
293
+function setup_mesh {
294
+	mesh_cjdns
295
+	mesh_cjdns_tools
296
+	mesh_batman
297
+	mesh_babel
298
+}
299
+
300
+function setup_email {
301
+	configure_email
302
+	create_procmail
303
+	handle_admin_emails
304
+	spam_filtering
305
+	configure_imap
306
+	#configure_imap_client_certs
307
+	configure_gpg
308
+	refresh_gpg_keys
309
+	configure_backup_key
310
+	install_monkeysphere
311
+	encrypt_incoming_email
312
+	encrypt_outgoing_email
313
+	email_client
314
+	email_archiving
315
+	email_from_address
316
+	create_public_mailing_list
317
+	#create_private_mailing_list
318
+	encrypt_all_email
319
+	import_email
320
+}
321
+
322
+function setup_web {
323
+	install_web_server
324
+	install_web_server_access_control
325
+}
326
+
327
+function setup_apps {
328
+	install_zeronet
329
+	install_zeronet_blog
330
+	install_zeronet_mail
331
+	install_zeronet_forum
332
+	install_syncthing
333
+	upgrade_golang
334
+	install_gogs
335
+	install_xmpp
336
+	install_xmpp_client
337
+	install_tox_node
338
+	install_tox_client
339
+	tox_avahi
340
+	install_irc_server
341
+	install_irc_client
342
+	install_mumble
343
+	install_sip
344
+	update_sipwitch_daemon
345
+	install_wiki
346
+	install_sip_turn
347
+	install_blog
348
+	mark_blog_domain
349
+	install_gnu_social
350
+	expire_gnu_social_posts
351
+	install_gnu_social_theme
352
+	install_gnu_social_markdown
353
+	install_gnu_social_plugin_sharings
354
+	install_gnu_social_plugin_sharings_theme
355
+	install_rss_reader
356
+	install_rss_reader_gnusocial
357
+	install_rss_mobile_reader
358
+	install_hubzilla
359
+	#install_webmail
360
+	#install_search_engine
361
+	install_dlna_server
362
+	#install_mediagoblin
363
+	#install_ipfs
364
+	repair_databases_script
365
+	backup_to_friends_servers
366
+}
367
+
368
+# NOTE: deliberately no exit 0

+ 142
- 0
src/freedombone-utils-ssh View File

@@ -0,0 +1,142 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# ssh functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+SSH_PORT=2222
32
+
33
+# ssh (from https://stribika.github.io/2015/01/04/secure-secure-shell.html)
34
+SSH_CIPHERS="chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr"
35
+SSH_MACS="hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com"
36
+SSH_KEX="curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256"
37
+SSH_HOST_KEY_ALGORITHMS="ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-ed25519,ssh-rsa"
38
+
39
+function configure_ssh {
40
+	if grep -Fxq "configure_ssh" $COMPLETION_FILE; then
41
+		return
42
+	fi
43
+	sed -i "s/Port .*/Port $SSH_PORT/g" /etc/ssh/sshd_config
44
+	sed -i 's/PermitRootLogin.*/PermitRootLogin no/g' /etc/ssh/sshd_config
45
+	sed -i 's/X11Forwarding.*/X11Forwarding no/g' /etc/ssh/sshd_config
46
+	sed -i 's/ServerKeyBits.*/ServerKeyBits 4096/g' /etc/ssh/sshd_config
47
+	sed -i 's/TCPKeepAlive.*/TCPKeepAlive no/g' /etc/ssh/sshd_config
48
+	sed -i 's|HostKey /etc/ssh/ssh_host_dsa_key|#HostKey /etc/ssh/ssh_host_dsa_key|g' /etc/ssh/sshd_config
49
+	sed -i 's|HostKey /etc/ssh/ssh_host_ecdsa_key|#HostKey /etc/ssh/ssh_host_ecdsa_key|g' /etc/ssh/sshd_config
50
+	if ! grep -q 'DebianBanner' /etc/ssh/sshd_config; then
51
+		echo 'DebianBanner no' >> /etc/ssh/sshd_config
52
+	else
53
+		sed -i 's|DebianBanner.*|DebianBanner no|g' /etc/ssh/sshd_config
54
+	fi
55
+	if grep -q 'ClientAliveInterval' /etc/ssh/sshd_config; then
56
+		sed -i 's/ClientAliveInterval.*/ClientAliveInterval 60/g' /etc/ssh/sshd_config
57
+	else
58
+		echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config
59
+	fi
60
+	if grep -q 'ClientAliveCountMax' /etc/ssh/sshd_config; then
61
+		sed -i 's/ClientAliveCountMax.*/ClientAliveCountMax 3/g' /etc/ssh/sshd_config
62
+	else
63
+		echo 'ClientAliveCountMax 3' >> /etc/ssh/sshd_config
64
+	fi
65
+	if grep -q 'Ciphers' /etc/ssh/sshd_config; then
66
+		sed -i "s|Ciphers.*|Ciphers $SSH_CIPHERS|g" /etc/ssh/sshd_config
67
+	else
68
+		echo "Ciphers $SSH_CIPHERS" >> /etc/ssh/sshd_config
69
+	fi
70
+	if grep -q 'MACs' /etc/ssh/sshd_config; then
71
+		sed -i "s|MACs.*|MACs $SSH_MACS|g" /etc/ssh/sshd_config
72
+	else
73
+		echo "MACs $SSH_MACS" >> /etc/ssh/sshd_config
74
+	fi
75
+	if grep -q 'KexAlgorithms' /etc/ssh/sshd_config; then
76
+		sed -i "s|KexAlgorithms.*|KexAlgorithms $SSH_KEX|g" /etc/ssh/sshd_config
77
+	else
78
+		echo "KexAlgorithms $SSH_KEX" >> /etc/ssh/sshd_config
79
+	fi
80
+
81
+	apt-get -y install fail2ban
82
+
83
+	function_check configure_firewall_for_ssh
84
+	configure_firewall_for_ssh
85
+	echo 'configure_ssh' >> $COMPLETION_FILE
86
+}
87
+
88
+# see https://stribika.github.io/2015/01/04/secure-secure-shell.html
89
+function ssh_remove_small_moduli {
90
+	awk '$5 > 2000' /etc/ssh/moduli > ~/moduli
91
+	mv ~/moduli /etc/ssh/moduli
92
+}
93
+
94
+function configure_ssh_client {
95
+	if grep -Fxq "configure_ssh_client" $COMPLETION_FILE; then
96
+		return
97
+	fi
98
+	#sed -i 's/#   PasswordAuthentication.*/   PasswordAuthentication no/g' /etc/ssh/ssh_config
99
+	#sed -i 's/#   ChallengeResponseAuthentication.*/   ChallengeResponseAuthentication no/g' /etc/ssh/ssh_config
100
+	sed -i "s/#   HostKeyAlgorithms.*/   HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS/g" /etc/ssh/ssh_config
101
+	sed -i "s/#   Ciphers.*/   Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
102
+	sed -i "s/#   MACs.*/   MACs $SSH_MACS/g" /etc/ssh/ssh_config
103
+	if ! grep -q "HostKeyAlgorithms" /etc/ssh/ssh_config; then
104
+		echo "   HostKeyAlgorithms $SSH_HOST_KEY_ALGORITHMS" >> /etc/ssh/ssh_config
105
+	fi
106
+	sed -i "s/Ciphers.*/Ciphers $SSH_CIPHERS/g" /etc/ssh/ssh_config
107
+	if ! grep -q "Ciphers " /etc/ssh/ssh_config; then
108
+		echo "   Ciphers $SSH_CIPHERS" >> /etc/ssh/ssh_config
109
+	fi
110
+	sed -i "s/MACs.*/MACs $SSH_MACS/g" /etc/ssh/ssh_config
111
+	if ! grep -q "MACs " /etc/ssh/ssh_config; then
112
+		echo "   MACs $SSH_MACS" >> /etc/ssh/ssh_config
113
+	fi
114
+
115
+	# Create ssh keys
116
+	if [ ! -f ~/.ssh/id_ed25519 ]; then
117
+		ssh-keygen -t ed25519 -o -a 100
118
+	fi
119
+	if [ ! -f ~/.ssh/id_rsa ]; then
120
+		ssh-keygen -t rsa -b 4096 -o -a 100
121
+	fi
122
+
123
+	function_check ssh_remove_small_moduli
124
+	ssh_remove_small_moduli
125
+	echo 'configure_ssh_client' >> $COMPLETION_FILE
126
+}
127
+
128
+function regenerate_ssh_keys {
129
+	if grep -Fxq "regenerate_ssh_keys" $COMPLETION_FILE; then
130
+		return
131
+	fi
132
+	rm -f /etc/ssh/ssh_host_*
133
+	dpkg-reconfigure openssh-server
134
+
135
+	function_check ssh_remove_small_moduli
136
+	ssh_remove_small_moduli
137
+
138
+    systemctl restart ssh
139
+	echo 'regenerate_ssh_keys' >> $COMPLETION_FILE
140
+}
141
+
142
+# NOTE: deliberately no exit 0

+ 129
- 0
src/freedombone-utils-time View File

@@ -0,0 +1,129 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Time functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# Why use Google as a time source?
32
+# The thinking here is that it's likely to be reliable and fast.
33
+# The ping doesn't reveal any information other than that the server
34
+# is running, and if anyone maliciously alters the time on Google's
35
+# servers then that would certainly be newsworthy and they'd be
36
+# likely to do something about it quickly.
37
+# If you have better time sources then change them here.
38
+TLS_TIME_SOURCE1="google.com"
39
+TLS_TIME_SOURCE2="www.ptb.de"
40
+
41
+# Time synchronisation
42
+TLSDATE_REPO="https://github.com/bashrc/tlsdate"
43
+TLSDATE_COMMIT='505e31540eebde8074e7dc93b29be0d848def06a'
44
+
45
+function check_date {
46
+	curr_date=$(date)
47
+	if [[ $curr_date == *"1970"* ]]; then
48
+		apt-get -y install ntp
49
+	fi
50
+}
51
+
52
+function time_synchronisation {
53
+	# mesh peers typically don't sync over the internet
54
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
55
+		return
56
+	fi
57
+
58
+	if [ -f /usr/local/bin/${PROJECT_NAME}-update-date ]; then
59
+		cp /usr/local/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
60
+	else
61
+		cp /usr/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
62
+	fi
63
+	chmod +x /usr/bin/updatedate
64
+
65
+	if grep -Fxq "time_synchronisation" $COMPLETION_FILE; then
66
+		return
67
+	fi
68
+
69
+	apt-get -y install tlsdate
70
+	apt-get -y remove ntpdate
71
+
72
+	function_check cron_add_mins
73
+	cron_add_mins 15 '/usr/bin/updatedate'
74
+
75
+	systemctl restart cron
76
+
77
+	echo 'time_synchronisation' >> $COMPLETION_FILE
78
+}
79
+
80
+function time_synchronisation_tlsdate {
81
+	# mesh peers typically don't sync over the internet
82
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
83
+		return
84
+	fi
85
+
86
+	if [ -f /usr/local/bin/${PROJECT_NAME}-update-date ]; then
87
+		cp /usr/local/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
88
+	else
89
+		cp /usr/bin/${PROJECT_NAME}-update-date /usr/bin/updatedate
90
+	fi
91
+	chmod +x /usr/bin/updatedate
92
+
93
+	if [ ! -d $INSTALL_DIR ]; then
94
+		mkdir -p $INSTALL_DIR
95
+	fi
96
+	set_repo_commit $INSTALL_DIR/tlsdate "tlsdate commit" "$TLSDATE_COMMIT" $TLSDATE_REPO
97
+
98
+	if grep -Fxq "time_synchronisation_tlsdate" $COMPLETION_FILE; then
99
+		return
100
+	fi
101
+
102
+	apt-get -y remove tlsdate ntpdate
103
+	apt-get -y install build-essential autoconf libevent-dev
104
+
105
+	cd $INSTALL_DIR
106
+	function_check git_clone
107
+	git_clone $TLSDATE_REPO $INSTALL_DIR/tlsdate
108
+	cd $INSTALL_DIR/tlsdate
109
+	git checkout $TLSDATE_COMMIT -b $TLSDATE_COMMIT
110
+	./autogen.sh
111
+	./configure
112
+	if [ ! "$?" = "0" ]; then
113
+		echo $'Unable to configure tlsdate'
114
+		exit 6825277
115
+	fi
116
+	make
117
+	if [ ! "$?" = "0" ]; then
118
+		echo $'Unable to build tlsdate'
119
+		exit 3792726
120
+	fi
121
+	make install
122
+
123
+	function_check cron_add_mins
124
+	cron_add_mins 15 '/usr/bin/updatedate'
125
+
126
+	echo 'time_synchronisation_tlsdate' >> $COMPLETION_FILE
127
+}
128
+
129
+# NOTE: deliberately no exit 0

+ 50
- 0
src/freedombone-utils-upgrade View File

@@ -0,0 +1,50 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Upgrading functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# name of a script used to upgrade the system
32
+UPGRADE_SCRIPT_NAME="${PROJECT_NAME}-upgrade"
33
+
34
+function create_upgrade_script {
35
+	if [ -f /usr/local/bin/${PROJECT_NAME}-upgrade ]; then
36
+		cp /usr/local/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
37
+	else
38
+		cp /usr/bin/${PROJECT_NAME}-upgrade /etc/cron.weekly/$UPGRADE_SCRIPT_NAME
39
+	fi
40
+
41
+	if grep -Fxq "create_upgrade_script" $COMPLETION_FILE; then
42
+		return
43
+	fi
44
+
45
+	apt-get -y install unattended-upgrades
46
+
47
+	echo 'create_upgrade_script' >> $COMPLETION_FILE
48
+}
49
+
50
+# NOTE: deliberately no exit 0

+ 51
- 0
src/freedombone-utils-watchdog View File

@@ -0,0 +1,51 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Watchdog functions to keep systems running even if they crash
12
+# systemd itself may be able to handle this to a large extent
13
+#
14
+# License
15
+# =======
16
+#
17
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
18
+#
19
+# This program is free software: you can redistribute it and/or modify
20
+# it under the terms of the GNU Affero General Public License as published by
21
+# the Free Software Foundation, either version 3 of the License, or
22
+# (at your option) any later version.
23
+#
24
+# This program is distributed in the hope that it will be useful,
25
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
26
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27
+# GNU Affero General Public License for more details.
28
+#
29
+# You should have received a copy of the GNU Affero General Public License
30
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
31
+
32
+# name of a script which keeps running processes going even if they crash
33
+WATCHDOG_SCRIPT_NAME="keepon"
34
+
35
+function install_watchdog_script {
36
+	if grep -Fxq "install_watchdog_script" $COMPLETION_FILE; then
37
+		return
38
+	fi
39
+	echo '#!/bin/bash' > /usr/bin/$WATCHDOG_SCRIPT_NAME
40
+	echo 'LOGFILE=/var/log/keepon.log' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
41
+	echo 'CURRENT_DATE=$(date)' >> /usr/bin/$WATCHDOG_SCRIPT_NAME
42
+	# application specific stuff is added later
43
+	chmod +x /usr/bin/$WATCHDOG_SCRIPT_NAME
44
+
45
+	function_check cron_add_mins
46
+	cron_add_mins 1 '/usr/bin/$WATCHDOG_SCRIPT_NAME'
47
+
48
+	echo 'install_watchdog_script' >> $COMPLETION_FILE
49
+}
50
+
51
+# NOTE: deliberately no exit 0

+ 551
- 0
src/freedombone-utils-web View File

@@ -0,0 +1,551 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Web related functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+# default search engine for command line browser
32
+DEFAULT_SEARCH='https://searx.laquadrature.net'
33
+
34
+# This isn't used here, but is included for mirrors creation purposes
35
+LETSENCRYPT_REPO="https://github.com/letsencrypt/letsencrypt"
36
+
37
+# Whether Let's Encrypt is enabled for all sites
38
+LETSENCRYPT_ENABLED="no"
39
+LETSENCRYPT_SERVER='https://acme-v01.api.letsencrypt.org/directory'
40
+
41
+# list of encryption protocols
42
+SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
43
+
44
+# list of ciphers to use.  See bettercrypto.org recommendations
45
+SSL_CIPHERS="EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA"
46
+
47
+NGINX_ENSITE_REPO="https://github.com/perusio/nginx_ensite"
48
+NGINX_ENSITE_COMMIT='fa4d72ce1c0a490442c8474e9c8dc21ed52c93d0'
49
+
50
+# memory limit for php in MB
51
+MAX_PHP_MEMORY=64
52
+
53
+# logging level for Nginx
54
+WEBSERVER_LOG_LEVEL='warn'
55
+
56
+# test a domain name to see if it's valid
57
+function validate_domain_name {
58
+	# count the number of dots in the domain name
59
+	dots=${TEST_DOMAIN_NAME//[^.]}
60
+	no_of_dots=${#dots}
61
+	if (( $no_of_dots > 3 )); then
62
+		TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has too many subdomains. It should be of the type w.x.y.z, x.y.z or y.z"
63
+	fi
64
+	if (( $no_of_dots == 0 )); then
65
+		TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has no top level domain. It should be of the type w.x.y.z, x.y.z or y.z"
66
+	fi
67
+}
68
+
69
+function nginx_disable_sniffing {
70
+	domain_name=$1
71
+	filename=/etc/nginx/sites-available/$domain_name
72
+	echo '    add_header X-Frame-Options DENY;' >> $filename
73
+	echo '    add_header X-Content-Type-Options nosniff;' >> $filename
74
+	echo '' >> $filename
75
+}
76
+
77
+function nginx_limits {
78
+	domain_name=$1
79
+	max_body='20m'
80
+	if [ $2 ]; then
81
+		max_body=$2
82
+	fi
83
+	filename=/etc/nginx/sites-available/$domain_name
84
+	echo "    client_max_body_size ${max_body};" >> $filename
85
+	echo '    client_body_buffer_size 128k;' >> $filename
86
+	echo '' >> $filename
87
+	echo '    limit_conn conn_limit_per_ip 10;' >> $filename
88
+	echo '    limit_req zone=req_limit_per_ip burst=10 nodelay;' >> $filename
89
+	echo '' >> $filename
90
+}
91
+
92
+function nginx_http_redirect {
93
+	# redirect port 80 to https
94
+	domain_name=$1
95
+	filename=/etc/nginx/sites-available/$domain_name
96
+	echo 'server {' > $filename
97
+	echo '    listen 80;' >> $filename
98
+	echo '    listen [::]:80;' >> $filename
99
+	echo "    server_name ${domain_name};" >> $filename
100
+	echo "    root /var/www/${domain_name}/htdocs;" >> $filename
101
+	echo '    access_log off;' >> $filename
102
+	echo "    error_log /var/log/nginx/${domain_name}_error.log $WEBSERVER_LOG_LEVEL;" >> $filename
103
+	function_check nginx_limits
104
+	nginx_limits $domain_name
105
+	echo '    rewrite ^ https://$server_name$request_uri? permanent;' >> $filename
106
+	echo '}' >> $filename
107
+	echo '' >> $filename
108
+}
109
+
110
+function nginx_ssl {
111
+	# creates the SSL/TLS section for a website
112
+	domain_name=$1
113
+	filename=/etc/nginx/sites-available/$domain_name
114
+	echo '    ssl on;' >> $filename
115
+	echo "    ssl_certificate /etc/ssl/certs/${domain_name}.crt;" >> $filename
116
+	echo "    ssl_certificate_key /etc/ssl/private/${domain_name}.key;" >> $filename
117
+	echo "    ssl_dhparam /etc/ssl/certs/${domain_name}.dhparam;" >> $filename
118
+	echo '' >> $filename
119
+	echo '    ssl_session_timeout 60m;' >> $filename
120
+	echo '    ssl_prefer_server_ciphers on;' >> $filename
121
+	echo "    ssl_protocols $SSL_PROTOCOLS;" >> $filename
122
+	echo "    ssl_ciphers '$SSL_CIPHERS';" >> $filename
123
+}
124
+
125
+# check an individual domain name
126
+function test_domain_name {
127
+	if [ $1 ]; then
128
+		TEST_DOMAIN_NAME=$1
129
+		function_ckeck validate_domain_name
130
+		validate_domain_name
131
+		if [[ $TEST_DOMAIN_NAME != $1 ]]; then
132
+			echo $TEST_DOMAIN_NAME
133
+			exit 8528
134
+		fi
135
+	fi
136
+}
137
+
138
+# Checks whether certificates were generated for the given hostname
139
+function check_certificates {
140
+	if [ ! $1 ]; then
141
+		return
142
+	fi
143
+	USE_LETSENCRYPT='no'
144
+	if [ $2 ]; then
145
+		USE_LETSENCRYPT=$2
146
+	fi
147
+	if [[ $USE_LETSENCRYPT == 'no' ]]; then
148
+		if [ ! -f /etc/ssl/private/$1.key ]; then
149
+			echo $"Private certificate for $CHECK_HOSTNAME was not created"
150
+			exit 63959
151
+		fi
152
+		if [ ! -f /etc/ssl/certs/$1.crt ]; then
153
+			echo $"Public certificate for $CHECK_HOSTNAME was not created"
154
+			exit 7679
155
+		fi
156
+	else
157
+		if [ ! -f /etc/letsencrypt/live/${1}/privkey.pem ]; then
158
+			echo $"Private certificate for $CHECK_HOSTNAME was not created"
159
+			exit 6282
160
+		fi
161
+		if [ ! -f /etc/letsencrypt/live/${1}/fullchain.pem ]; then
162
+			echo $"Public certificate for $CHECK_HOSTNAME was not created"
163
+			exit 5328
164
+		fi
165
+	fi
166
+	if [ ! -f /etc/ssl/certs/$1.dhparam ]; then
167
+		echo $"Diffie–Hellman parameters for $CHECK_HOSTNAME were not created"
168
+		exit 5989
169
+	fi
170
+}
171
+
172
+function create_site_certificate {
173
+	SITE_DOMAIN_NAME="$1"
174
+
175
+	# if yes then only "valid" certs are allowed, not self-signed
176
+	NO_SELF_SIGNED='no'
177
+	if [ $2 ]; then
178
+		NO_SELF_SIGNED="$2"
179
+	fi
180
+
181
+	if [[ $ONION_ONLY == "no" ]]; then
182
+		if [ ! -f /etc/ssl/certs/$SITE_DOMAIN_NAME.dhparam ]; then
183
+			if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
184
+				${PROJECT_NAME}-addcert -h $SITE_DOMAIN_NAME --dhkey $DH_KEYLENGTH
185
+				function_check check_certificates
186
+				check_certificates $SITE_DOMAIN_NAME
187
+			else
188
+				${PROJECT_NAME}-addcert -e $SITE_DOMAIN_NAME -s $LETSENCRYPT_SERVER --dhkey $DH_KEYLENGTH --email $MY_EMAIL_ADDRESS
189
+				if [ ! "$?" = "0" ]; then
190
+					if [[ $NO_SELF_SIGNED == 'no' ]]; then
191
+						echo $"Lets Encrypt failed for $SITE_DOMAIN_NAME, so try making a self-signed cert"
192
+						${PROJECT_NAME}-addcert -h $SITE_DOMAIN_NAME --dhkey $DH_KEYLENGTH
193
+						function_check check_certificates
194
+						check_certificates $SITE_DOMAIN_NAME
195
+					else
196
+						echo $"Lets Encrypt failed for $SITE_DOMAIN_NAME"
197
+						exit 682529
198
+					fi
199
+				else
200
+					function_check check_certificates
201
+					check_certificates $SITE_DOMAIN_NAME 'yes'
202
+				fi
203
+			fi
204
+		fi
205
+	fi
206
+}
207
+
208
+# script to automatically renew any Let's Encrypt certificates
209
+function letsencrypt_renewals {
210
+	if [[ $ONION_ONLY != "no" ]]; then
211
+		return
212
+	fi
213
+
214
+	renewals_script=/etc/cron.monthly/letsencrypt
215
+	renewals_retry_script=/etc/cron.daily/letsencrypt
216
+	renewal_failure_msg=$'The certificate for $LETSENCRYPT_DOMAIN could not be renewed'
217
+	renewal_email_title=$'${PROJECT_NAME} Lets Encrypt certificate renewal'
218
+
219
+	# the main script tries to renew once per month
220
+	echo '#!/bin/bash' > $renewals_script
221
+	echo '' >> $renewals_script
222
+	echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_script
223
+	echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_script
224
+	echo '' >> $renewals_script
225
+	echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_script
226
+	echo '    if [ -f ~/letsencrypt_failed ]; then' >> $renewals_script
227
+	echo '        rm ~/letsencrypt_failed' >> $renewals_script
228
+	echo '    fi' >> $renewals_script
229
+	echo -n '    ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_script
230
+	echo -n "awk -F ':' '{print " >> $renewals_script
231
+	echo -n '$2' >> $renewals_script
232
+	echo "}')" >> $renewals_script
233
+	echo '    ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_script
234
+	echo '    for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_script
235
+	echo -n '        LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_script
236
+	echo -n "awk -F '/' '{print " >> $renewals_script
237
+	echo -n '$5' >> $renewals_script
238
+	echo "}')" >> $renewals_script
239
+	echo '        if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_script
240
+	echo '            ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_script
241
+	echo '            if [ ! "$?" = "0" ]; then' >> $renewals_script
242
+	echo "                echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_script
243
+	echo '                echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_script
244
+	echo '                ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_script
245
+	echo -n "                cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_script
246
+	echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_script
247
+	echo '                rm ~/temp_renewletsencrypt.txt' >> $renewals_script
248
+	echo '                if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_script
249
+	echo '                    touch ~/letsencrypt_failed' >> $renewals_script
250
+	echo '                fi' >> $renewals_script
251
+	echo '            fi' >> $renewals_script
252
+	echo '        fi' >> $renewals_script
253
+	echo '    done' >> $renewals_script
254
+	echo 'fi' >> $renewals_script
255
+	chmod +x $renewals_script
256
+
257
+	# a secondary script keeps trying to renew after a failure
258
+	echo '#!/bin/bash' > $renewals_retry_script
259
+	echo '' >> $renewals_retry_script
260
+	echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_retry_script
261
+	echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_retry_script
262
+	echo '' >> $renewals_retry_script
263
+	echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_retry_script
264
+	echo '    if [ -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
265
+	echo '        rm ~/letsencrypt_failed' >> $renewals_retry_script
266
+	echo -n '        ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_retry_script
267
+	echo -n "awk -F ':' '{print " >> $renewals_retry_script
268
+	echo -n '$2' >> $renewals_retry_script
269
+	echo "}')" >> $renewals_retry_script
270
+	echo '        ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_retry_script
271
+	echo '        for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_retry_script
272
+	echo -n '            LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_retry_script
273
+	echo -n "awk -F '/' '{print " >> $renewals_retry_script
274
+	echo -n '$5' >> $renewals_retry_script
275
+	echo "}')" >> $renewals_retry_script
276
+	echo '            if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_retry_script
277
+	echo '                ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_retry_script
278
+	echo '                if [ ! "$?" = "0" ]; then' >> $renewals_retry_script
279
+	echo "                    echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_retry_script
280
+	echo '                    echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
281
+	echo '                    ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
282
+	echo -n "                    cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_retry_script
283
+	echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_retry_script
284
+	echo '                    rm ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
285
+	echo '                    if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
286
+	echo '                        touch ~/letsencrypt_failed' >> $renewals_retry_script
287
+	echo '                    fi' >> $renewals_retry_script
288
+	echo '                fi' >> $renewals_retry_script
289
+	echo '            fi' >> $renewals_retry_script
290
+	echo '        done' >> $renewals_retry_script
291
+	echo '    fi' >> $renewals_retry_script
292
+	echo 'fi' >> $renewals_retry_script
293
+	chmod +x $renewals_retry_script
294
+}
295
+
296
+function configure_php {
297
+	sed -i "s/memory_limit = 128M/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/fpm/php.ini
298
+	sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
299
+	sed -i "s/memory_limit = -1/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/cli/php.ini
300
+	sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
301
+	sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
302
+}
303
+
304
+function install_web_server_access_control {
305
+	if [ ! -f /etc/pam.d/nginx ]; then
306
+		echo '#%PAM-1.0' > /etc/pam.d/nginx
307
+		echo '@include common-auth' >> /etc/pam.d/nginx
308
+		echo '@include common-account' >> /etc/pam.d/nginx
309
+		echo '@include common-session' >> /etc/pam.d/nginx
310
+	fi
311
+}
312
+
313
+function install_dynamicdns {
314
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
315
+		return
316
+	fi
317
+	if [[ $ONION_ONLY != "no" ]]; then
318
+		return
319
+	fi
320
+
321
+	# update to the next commit
322
+	function_check set_repo_commit
323
+	set_repo_commit $INSTALL_DIR/inadyn "inadyn commit" "$INADYN_COMMIT" $INADYN_REPO
324
+
325
+	if grep -Fxq "install_dynamicdns" $COMPLETION_FILE; then
326
+		return
327
+	fi
328
+
329
+	# Here we compile from source because the current package
330
+	# doesn't support https, which could result in passwords
331
+	# being leaked
332
+	# Debian version 1.99.4-1
333
+	# https version 1.99.8
334
+
335
+	apt-get -y install build-essential curl libgnutls28-dev automake1.11
336
+	if [ ! -d $INSTALL_DIR/inadyn ]; then
337
+		git_clone $INADYN_REPO $INSTALL_DIR/inadyn
338
+	fi
339
+	if [ ! -d $INSTALL_DIR/inadyn ]; then
340
+		echo 'inadyn repo not cloned'
341
+		echo -n | openssl s_client -showcerts -connect github.com:443 -CApath /etc/ssl/certs
342
+		exit 6785
343
+	fi
344
+	cd $INSTALL_DIR/inadyn
345
+	git checkout $INADYN_COMMIT -b $INADYN_COMMIT
346
+	if ! grep -q "inadyn commit" $COMPLETION_FILE; then
347
+		echo "inadyn commit:$INADYN_COMMIT" >> $COMPLETION_FILE
348
+	else
349
+		sed -i "s/inadyn commit.*/inadyn commit:$INADYN_COMMIT/g" $COMPLETION_FILE
350
+	fi
351
+
352
+	./configure
353
+	if [ ! "$?" = "0" ]; then
354
+		exit 74890
355
+	fi
356
+	USE_OPENSSL=1 make
357
+	if [ ! "$?" = "0" ]; then
358
+		exit 74858
359
+	fi
360
+	make install
361
+	if [ ! "$?" = "0" ]; then
362
+		exit 3785
363
+	fi
364
+
365
+	# create an unprivileged user
366
+	#useradd -r -s /bin/false debian-inadyn
367
+
368
+	# create a configuration file
369
+	echo 'background' > /etc/inadyn.conf
370
+	echo 'verbose        1' >> /etc/inadyn.conf
371
+	echo 'period         300' >> /etc/inadyn.conf
372
+	echo 'startup-delay  60' >> /etc/inadyn.conf
373
+	echo 'cache-dir      /run/inadyn' >> /etc/inadyn.conf
374
+	echo 'logfile        /dev/null' >> /etc/inadyn.conf
375
+	chmod 600 /etc/inadyn.conf
376
+
377
+	echo '[Unit]' > /etc/systemd/system/inadyn.service
378
+	echo 'Description=inadyn (DynDNS updater)' >> /etc/systemd/system/inadyn.service
379
+	echo 'After=network.target' >> /etc/systemd/system/inadyn.service
380
+	echo '' >> /etc/systemd/system/inadyn.service
381
+	echo '[Service]' >> /etc/systemd/system/inadyn.service
382
+	echo 'ExecStart=/usr/local/sbin/inadyn --config /etc/inadyn.conf' >> /etc/systemd/system/inadyn.service
383
+	echo 'Restart=always' >> /etc/systemd/system/inadyn.service
384
+	echo 'Type=forking' >> /etc/systemd/system/inadyn.service
385
+	echo '' >> /etc/systemd/system/inadyn.service
386
+	echo '[Install]' >> /etc/systemd/system/inadyn.service
387
+	echo 'WantedBy=multi-user.target' >> /etc/systemd/system/inadyn.service
388
+	systemctl enable inadyn
389
+	systemctl start inadyn
390
+	systemctl daemon-reload
391
+
392
+	echo 'install_dynamicdns' >> $COMPLETION_FILE
393
+}
394
+
395
+function install_web_server {
396
+	if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
397
+		return
398
+	fi
399
+
400
+	# update to the next commit
401
+	function_check set_repo_commit
402
+	set_repo_commit $INSTALL_DIR/nginx_ensite "Nginx-ensite commit" "$NGINX_ENSITE_COMMIT" $NGINX_ENSITE_REPO
403
+
404
+	if grep -Fxq "install_web_server" $COMPLETION_FILE; then
405
+		return
406
+	fi
407
+	# remove apache
408
+	apt-get -y remove --purge apache2
409
+	if [ -d /etc/apache2 ]; then
410
+		rm -rf /etc/apache2
411
+	fi
412
+	# install nginx
413
+	apt-get -y install nginx php5-fpm git
414
+
415
+	# limit the number of php processes
416
+	sed -i 's/; process.max =.*/process.max = 32/g' /etc/php5/fpm/php-fpm.conf
417
+	#sed -i 's/;process_control_timeout =.*/process_control_timeout = 300/g' /etc/php5/fpm/php-fpm.conf
418
+
419
+	if ! grep -q "pm.max_children" /etc/php5/fpm/php-fpm.conf; then
420
+		echo 'pm.max_children = 10' >> /etc/php5/fpm/php-fpm.conf
421
+		echo 'pm.start_servers = 2' >> /etc/php5/fpm/php-fpm.conf
422
+		echo 'pm.min_spare_servers = 2' >> /etc/php5/fpm/php-fpm.conf
423
+		echo 'pm.max_spare_servers = 5' >> /etc/php5/fpm/php-fpm.conf
424
+		echo 'pm.max_requests = 50' >> /etc/php5/fpm/php-fpm.conf
425
+	fi
426
+
427
+	if [ ! -d /etc/nginx ]; then
428
+		echo $"ERROR: nginx does not appear to have installed. $CHECK_MESSAGE"
429
+		exit 51
430
+	fi
431
+
432
+	# Nginx settings
433
+	echo 'user www-data;' > /etc/nginx/nginx.conf
434
+	#echo "worker_processes; $CPU_CORES" >> /etc/nginx/nginx.conf
435
+	echo 'pid /run/nginx.pid;' >> /etc/nginx/nginx.conf
436
+	echo '' >> /etc/nginx/nginx.conf
437
+	echo 'events {' >> /etc/nginx/nginx.conf
438
+	echo '        worker_connections 50;' >> /etc/nginx/nginx.conf
439
+	echo '        # multi_accept on;' >> /etc/nginx/nginx.conf
440
+	echo '}' >> /etc/nginx/nginx.conf
441
+	echo '' >> /etc/nginx/nginx.conf
442
+	echo 'http {' >> /etc/nginx/nginx.conf
443
+	echo '        # limit the number of connections per single IP' >> /etc/nginx/nginx.conf
444
+	echo '        limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;' >> /etc/nginx/nginx.conf
445
+	echo '' >> /etc/nginx/nginx.conf
446
+	echo '        # limit the number of requests for a given session' >> /etc/nginx/nginx.conf
447
+	echo '        limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=140r/s;' >> /etc/nginx/nginx.conf
448
+	echo '' >> /etc/nginx/nginx.conf
449
+	echo '        # if the request body size is more than the buffer size, then the entire (or partial) request body is written into a temporary file' >> /etc/nginx/nginx.conf
450
+	echo '        client_body_buffer_size  128k;' >> /etc/nginx/nginx.conf
451
+	echo '' >> /etc/nginx/nginx.conf
452
+	echo '        # headerbuffer size for the request header from client, its set for testing purpose' >> /etc/nginx/nginx.conf
453
+	echo '        client_header_buffer_size 3m;' >> /etc/nginx/nginx.conf
454
+	echo '' >> /etc/nginx/nginx.conf
455
+	echo '        # maximum number and size of buffers for large headers to read from client request' >> /etc/nginx/nginx.conf
456
+	echo '        large_client_header_buffers 4 256k;' >> /etc/nginx/nginx.conf
457
+	echo '' >> /etc/nginx/nginx.conf
458
+	echo '        # read timeout for the request body from client, its set for testing purpose' >> /etc/nginx/nginx.conf
459
+	echo '        client_body_timeout   3m;' >> /etc/nginx/nginx.conf
460
+	echo '' >> /etc/nginx/nginx.conf
461
+	echo '        # how long to wait for the client to send a request header, its set for testing purpose' >> /etc/nginx/nginx.conf
462
+	echo '        client_header_timeout 3m;' >> /etc/nginx/nginx.conf
463
+	echo '' >> /etc/nginx/nginx.conf
464
+	echo '        ##' >> /etc/nginx/nginx.conf
465
+	echo '        # Basic Settings' >> /etc/nginx/nginx.conf
466
+	echo '        ##' >> /etc/nginx/nginx.conf
467
+	echo '' >> /etc/nginx/nginx.conf
468
+	echo '        sendfile on;' >> /etc/nginx/nginx.conf
469
+	echo '        tcp_nopush on;' >> /etc/nginx/nginx.conf
470
+	echo '        tcp_nodelay on;' >> /etc/nginx/nginx.conf
471
+	echo '        keepalive_timeout 65;' >> /etc/nginx/nginx.conf
472
+	echo '        types_hash_max_size 2048;' >> /etc/nginx/nginx.conf
473
+	echo '        server_tokens off;' >> /etc/nginx/nginx.conf
474
+	echo '' >> /etc/nginx/nginx.conf
475
+	echo '        # server_names_hash_bucket_size 64;' >> /etc/nginx/nginx.conf
476
+	echo '        # server_name_in_redirect off;' >> /etc/nginx/nginx.conf
477
+	echo '' >> /etc/nginx/nginx.conf
478
+	echo '        include /etc/nginx/mime.types;' >> /etc/nginx/nginx.conf
479
+	echo '        default_type application/octet-stream;' >> /etc/nginx/nginx.conf
480
+	echo '' >> /etc/nginx/nginx.conf
481
+	echo '        ##' >> /etc/nginx/nginx.conf
482
+	echo '        # Logging Settings' >> /etc/nginx/nginx.conf
483
+	echo '        ##' >> /etc/nginx/nginx.conf
484
+	echo '' >> /etc/nginx/nginx.conf
485
+	echo '        access_log /var/log/nginx/access.log;' >> /etc/nginx/nginx.conf
486
+	echo '        error_log /var/log/nginx/error.log;' >> /etc/nginx/nginx.conf
487
+	echo '' >> /etc/nginx/nginx.conf
488
+	echo '        ###' >> /etc/nginx/nginx.conf
489
+	echo '        # Gzip Settings' >> /etc/nginx/nginx.conf
490
+	echo '        ##' >> /etc/nginx/nginx.conf
491
+	echo '        gzip on;' >> /etc/nginx/nginx.conf
492
+	echo '        gzip_disable "msie6";' >> /etc/nginx/nginx.conf
493
+	echo '' >> /etc/nginx/nginx.conf
494
+	echo '        # gzip_vary on;' >> /etc/nginx/nginx.conf
495
+	echo '        # gzip_proxied any;' >> /etc/nginx/nginx.conf
496
+	echo '        # gzip_comp_level 6;' >> /etc/nginx/nginx.conf
497
+	echo '        # gzip_buffers 16 8k;' >> /etc/nginx/nginx.conf
498
+	echo '        # gzip_http_version 1.1;' >> /etc/nginx/nginx.conf
499
+	echo '        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;' >> /etc/nginx/nginx.conf
500
+	echo '' >> /etc/nginx/nginx.conf
501
+	echo '        ##' >> /etc/nginx/nginx.conf
502
+	echo '        # Virtual Host Configs' >> /etc/nginx/nginx.conf
503
+	echo '        ##' >> /etc/nginx/nginx.conf
504
+	echo '' >> /etc/nginx/nginx.conf
505
+	echo '        include /etc/nginx/conf.d/*.conf;' >> /etc/nginx/nginx.conf
506
+	echo '        include /etc/nginx/sites-enabled/*;' >> /etc/nginx/nginx.conf
507
+	echo '}' >> /etc/nginx/nginx.conf
508
+
509
+	# install a script to easily enable and disable nginx virtual hosts
510
+	if [ ! -d $INSTALL_DIR ]; then
511
+		mkdir $INSTALL_DIR
512
+	fi
513
+	cd $INSTALL_DIR
514
+	function_check git_clone
515
+	git_clone $NGINX_ENSITE_REPO $INSTALL_DIR/nginx_ensite
516
+	cd $INSTALL_DIR/nginx_ensite
517
+	git checkout $NGINX_ENSITE_COMMIT -b $NGINX_ENSITE_COMMIT
518
+	if ! grep -q "Nginx-ensite commit" $COMPLETION_FILE; then
519
+		echo "Nginx-ensite commit:$NGINX_ENSITE_COMMIT" >> $COMPLETION_FILE
520
+	else
521
+		sed -i "s/Nginx-ensite commit.*/Nginx-ensite commit:$NGINX_ENSITE_COMMIT/g" $COMPLETION_FILE
522
+	fi
523
+
524
+	make install
525
+	nginx_dissite default
526
+
527
+	function_check configure_firewall_for_web_access
528
+	configure_firewall_for_web_access
529
+
530
+	echo 'install_web_server' >> $COMPLETION_FILE
531
+}
532
+
533
+function install_command_line_browser {
534
+	if grep -Fxq "install_command_line_browser" $COMPLETION_FILE; then
535
+		return
536
+	fi
537
+	apt-get -y install elinks
538
+
539
+	# set the home page
540
+	if ! grep -q "WWW_HOME" /home/$MY_USERNAME/.bashrc; then
541
+		if ! grep -q 'control' /home/$MY_USERNAME/.bashrc; then
542
+			echo "export WWW_HOME=$DEFAULT_SEARCH" >> /home/$MY_USERNAME/.bashrc
543
+		else
544
+			sed -i "/control/i export WWW_HOME=$DEFAULT_SEARCH" /home/$MY_USERNAME/.bashrc
545
+		fi
546
+	fi
547
+
548
+	echo 'install_command_line_browser' >> $COMPLETION_FILE
549
+}
550
+
551
+# NOTE: deliberately no exit 0

+ 133
- 0
src/freedombone-utils-wifi View File

@@ -0,0 +1,133 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# Wifi functions
12
+
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2015-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+WIFI_CHANNEL=2
32
+WIFI_INTERFACE=wlan0
33
+WIFI_TYPE='wpa2-psk'
34
+WIFI_SSID=
35
+WIFI_PASSPHRASE=
36
+WIFI_HOTSPOT='no'
37
+WIFI_NETWORKS_FILE=~/${PROJECT_NAME}-wifi.cfg
38
+
39
+# repo for atheros AR9271 wifi driver
40
+ATHEROS_WIFI_REPO="https://github.com/qca/open-ath9k-htc-firmware.git"
41
+
42
+function setup_wifi {
43
+	if [[ $SYSTEM_TYPE == "$VARIANT_MESH" ]]; then
44
+		return
45
+	fi
46
+	if [ ! $WIFI_SSID ]; then
47
+		return
48
+	fi
49
+	if [ ${#WIFI_SSID} -lt 2 ]; then
50
+		return
51
+	fi
52
+	if grep -Fxq "setup_wifi" $COMPLETION_FILE; then
53
+		return
54
+	fi
55
+
56
+	HOTSPOT='no'
57
+	if [[ $WIFI_HOTSPOT != 'no' ]]; then
58
+		HOTSPOT='yes'
59
+	fi
60
+
61
+	if [ -f $WIFI_NETWORKS_FILE ]; then
62
+		${PROJECT_NAME}-wifi -i $WIFI_INTERFACE --networks $WIFI_NETWORKS_FILE
63
+		echo 'setup_wifi' >> $COMPLETION_FILE
64
+		return
65
+	fi
66
+
67
+	if [[ $WIFI_TYPE != 'none' ]]; then
68
+		if [ ! $WIFI_PASSPHRASE ]; then
69
+			echo $'No wifi passphrase was given'
70
+			return
71
+		fi
72
+		if [ ${#WIFI_PASSPHRASE} -lt 2 ]; then
73
+			echo $'Wifi passphrase was too short'
74
+			return
75
+		fi
76
+		${PROJECT_NAME}-wifi -i $WIFI_INTERFACE -s $WIFI_SSID -t $WIFI_TYPE -p $WIFI_PASSPHRASE --hotspot $HOTSPOT --networks $WIFI_NETWORKS_FILE
77
+	else
78
+		${PROJECT_NAME}-wifi -i $WIFI_INTERFACE -s $WIFI_SSID -t $WIFI_TYPE --hotspot $HOTSPOT --networks $WIFI_NETWORKS_FILE
79
+	fi
80
+	echo 'setup_wifi' >> $COMPLETION_FILE
81
+}
82
+
83
+# ath9k_htc driver
84
+function install_atheros_wifi {
85
+	if grep -Fxq "install_atheros_wifi" $COMPLETION_FILE; then
86
+		return
87
+	fi
88
+	if [ $INSTALLING_ON_BBB != "yes" ]; then
89
+		return
90
+	fi
91
+	if [[ $ENABLE_BABEL != "yes" && $ENABLE_BATMAN != "yes" && $ENABLE_CJDNS != "yes" ]]; then
92
+		return
93
+	fi
94
+	if [ -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
95
+		return
96
+	fi
97
+	# have drivers already been installed ?
98
+	if [ -f /lib/firmware/htc_9271.fw ]; then
99
+		return
100
+	fi
101
+	apt-get -y install build-essential cmake git m4 texinfo
102
+	if [ ! -d $INSTALL_DIR ]; then
103
+		mkdir -p $INSTALL_DIR
104
+	fi
105
+	cd $INSTALL_DIR
106
+	if [ ! -d $INSTALL_DIR/open-ath9k-htc-firmware ]; then
107
+		function_check git_clone
108
+		git_clone $ATHEROS_WIFI_REPO $INSTALL_DIR/open-ath9k-htc-firmware
109
+		if [ ! "$?" = "0" ]; then
110
+			rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
111
+			exit 74283
112
+		fi
113
+	fi
114
+	cd $INSTALL_DIR/open-ath9k-htc-firmware
115
+	git checkout 1.4.0
116
+	make toolchain
117
+	if [ ! "$?" = "0" ]; then
118
+		rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
119
+		exit 24820
120
+	fi
121
+	make firmware
122
+	if [ ! "$?" = "0" ]; then
123
+		rm -rf $INSTALL_DIR/open-ath9k-htc-firmware
124
+		exit 63412
125
+	fi
126
+	cp target_firmware/*.fw /lib/firmware/
127
+	if [ ! "$?" = "0" ]; then
128
+		exit 74681
129
+	fi
130
+	echo 'install_atheros_wifi' >> $COMPLETION_FILE
131
+}
132
+
133
+# NOTE: deliberately no exit 0

+ 46
- 0
src/freedombone-utils-zram View File

@@ -0,0 +1,46 @@
1
+#!/bin/bash
2
+#
3
+# .---.                  .              .
4
+# |                      |              |
5
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
6
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
7
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
8
+#
9
+#                    Freedom in the Cloud
10
+#
11
+# zram functions
12
+#
13
+# License
14
+# =======
15
+#
16
+# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
17
+#
18
+# This program is free software: you can redistribute it and/or modify
19
+# it under the terms of the GNU Affero General Public License as published by
20
+# the Free Software Foundation, either version 3 of the License, or
21
+# (at your option) any later version.
22
+#
23
+# This program is distributed in the hope that it will be useful,
24
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
+# GNU Affero General Public License for more details.
27
+#
28
+# You should have received a copy of the GNU Affero General Public License
29
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
30
+
31
+function enable_zram {
32
+	if grep -Fxq "enable_zram" $COMPLETION_FILE; then
33
+		return
34
+	fi
35
+
36
+	if [[ $INSTALLED_WITHIN_DOCKER == "yes" || $INSTALLING_ON_BBB != "yes" ]]; then
37
+		${PROJECT_NAME}-zram off
38
+		return
39
+	fi
40
+
41
+	${PROJECT_NAME}-zram on
42
+
43
+	echo 'enable_zram' >> $COMPLETION_FILE
44
+}
45
+
46
+# NOTE: deliberately no exit 0