Browse Source

Beginning of microblog.pub

Bob Mottram 6 years ago
parent
commit
0661895206
1 changed files with 461 additions and 0 deletions
  1. 461
    0
      src/freedombone-app-microblogpub

+ 461
- 0
src/freedombone-app-microblogpub View File

@@ -0,0 +1,461 @@
1
+#!/bin/bash
2
+#
3
+#  _____               _           _
4
+# |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
5
+# |   __|  _| -_| -_| . | . |     | . | . |   | -_|
6
+# |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
7
+#
8
+#                              Freedom in the Cloud
9
+#
10
+# License
11
+# =======
12
+#
13
+# Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
14
+#
15
+# This program is free software: you can redistribute it and/or modify
16
+# it under the terms of the GNU Affero General Public License as published by
17
+# the Free Software Foundation, either version 3 of the License, or
18
+# (at your option) any later version.
19
+#
20
+# This program is distributed in the hope that it will be useful,
21
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
22
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
+# GNU Affero General Public License for more details.
24
+#
25
+# You should have received a copy of the GNU Affero General Public License
26
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
27
+
28
+VARIANTS='full full-vim'
29
+
30
+IN_DEFAULT_INSTALL=0
31
+SHOW_ON_ABOUT=1
32
+
33
+MICROBLOGPUB_DOMAIN_NAME=
34
+MICROBLOGPUB_CODE=
35
+MICROBLOGPUB_ONION_PORT=9261
36
+MICROBLOGPUB_REPO="https://github.com/tsileo/microblog.pub"
37
+MICROBLOGPUB_COMMIT='848b8b23a8765d86bab2830c8d65d6b37337d03b'
38
+MICROBLOGPUB_PORT_INTERNAL=5005
39
+
40
+# These parameters are used by the FreedomBox mobile app
41
+MICROBLOGPUB_SHORT_DESCRIPTION=
42
+MICROBLOGPUB_DESCRIPTION=
43
+MICROBLOGPUB_MOBILE_APP_URL=
44
+
45
+microblogpub_variables=(ONION_ONLY
46
+                        MICROBLOGPUB_DOMAIN_NAME
47
+                        MICROBLOGPUB_CODE
48
+                        DDNS_PROVIDER
49
+                        MY_USERNAME)
50
+
51
+function logging_on_microblogpub {
52
+    echo -n ''
53
+}
54
+
55
+function logging_off_microblogpub {
56
+    echo -n ''
57
+}
58
+
59
+function remove_user_microblogpub {
60
+    remove_username="$1"
61
+
62
+    "${PROJECT_NAME}-pass" -u "$remove_username" --rmapp microblogpub
63
+}
64
+
65
+function add_user_microblogpub {
66
+    new_username="$1"
67
+    new_user_password="$2"
68
+
69
+    "${PROJECT_NAME}-pass" -u "$new_username" -a microblogpub -p "$new_user_password"
70
+    echo '0'
71
+}
72
+
73
+function install_interactive_microblogpub {
74
+    if [ ! "$ONION_ONLY" ]; then
75
+        ONION_ONLY='no'
76
+    fi
77
+
78
+    if [[ "$ONION_ONLY" != "no" ]]; then
79
+        MICROBLOGPUB_DOMAIN_NAME='microblogpub.local'
80
+        write_config_param "MICROBLOGPUB_DOMAIN_NAME" "$MICROBLOGPUB_DOMAIN_NAME"
81
+    else
82
+        interactive_site_details "microblogpub" "MICROBLOGPUB_DOMAIN_NAME" "MICROBLOGPUB_CODE"
83
+    fi
84
+    APP_INSTALLED=1
85
+}
86
+
87
+function change_password_microblogpub {
88
+    #curr_username="$1"
89
+    new_user_password="$2"
90
+
91
+    read_config_param 'MY_USERNAME'
92
+    read_config_param 'MICROBLOGPUB_DOMAIN_NAME'
93
+
94
+    "${PROJECT_NAME}-pass" -u "$MY_USERNAME" -a microblogpub -p "$new_user_password"
95
+
96
+    { echo 'import bcrypt';
97
+      echo "print(bcrypt.hashpw(\"$new_user_password\", bcrypt.gensalt()).decode('utf-8'))"; } > /tmp/microblogpub
98
+    MICROBLOGPUB_HASHED_PASSWORD=$(python /tmp/microblogpub)
99
+    rm /tmp/microblogpub
100
+}
101
+
102
+function microblogpub_create_database {
103
+    if [ -f "$IMAGE_PASSWORD_FILE" ]; then
104
+        MICROBLOGPUB_ADMIN_PASSWORD="$(printf "%d" "$(cat "")")"
105
+    else
106
+        if [ ! "$MICROBLOGPUB_ADMIN_PASSWORD" ]; then
107
+            MICROBLOGPUB_ADMIN_PASSWORD=$(create_password "${MINIMUM_PASSWORD_LENGTH}")
108
+        fi
109
+    fi
110
+    if [ ! "$MICROBLOGPUB_ADMIN_PASSWORD" ]; then
111
+        return
112
+    fi
113
+
114
+    create_database_mongodb microblogpub "$MICROBLOGPUB_ADMIN_PASSWORD" "$MY_USERNAME"
115
+}
116
+
117
+function reconfigure_microblogpub {
118
+    # This is used if you need to switch identity. Dump old keys and generate new ones
119
+    echo -n ''
120
+}
121
+
122
+function configure_interactive_microblogpub {
123
+    W=(1 $"Option 1"
124
+       2 $"Option 2")
125
+
126
+    while true
127
+    do
128
+        # shellcheck disable=SC2068
129
+        selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"microblogpub" --menu $"Choose an operation, or ESC for main menu:" 14 70 3 "${W[@]}" 3>&2 2>&1 1>&3)
130
+
131
+        if [ ! "$selection" ]; then
132
+            break
133
+        fi
134
+        case $selection in
135
+            1) # call some function for option 1
136
+            ;;
137
+            2) # call some function for option 2
138
+            ;;
139
+        esac
140
+    done
141
+}
142
+
143
+function upgrade_microblogpub {
144
+    CURR_MICROBLOGPUB_COMMIT=$(get_completion_param "microblogpub commit")
145
+    if [[ "$CURR_MICROBLOGPUB_COMMIT" == "$MICROBLOGPUB_COMMIT" ]]; then
146
+        return
147
+    fi
148
+
149
+    if grep -q "microblogpub domain" "$COMPLETION_FILE"; then
150
+        MICROBLOGPUB_DOMAIN_NAME=$(get_completion_param "microblogpub domain")
151
+    fi
152
+
153
+    # update to the next commit
154
+    set_repo_commit "/etc/microblogpub" "microblogpub commit" "$MICROBLOGPUB_COMMIT" "$MICROBLOGPUB_REPO"
155
+    chown -R microblogpub:microblogpub "/etc/microblogpub"
156
+    systemctl restart microblogpub
157
+}
158
+
159
+function backup_local_microblogpub {
160
+    MICROBLOGPUB_DOMAIN_NAME='microblogpub'
161
+    if grep -q "microblogpub domain" "$COMPLETION_FILE"; then
162
+        MICROBLOGPUB_DOMAIN_NAME=$(get_completion_param "microblogpub domain")
163
+    fi
164
+
165
+    source_directory=/etc/microblogpub
166
+
167
+    suspend_site "${MICROBLOGPUB_DOMAIN_NAME}"
168
+
169
+    systemctl stop microblogpub
170
+
171
+    dest_directory=microblogpub
172
+    backup_directory_to_usb "$source_directory" $dest_directory
173
+
174
+    USE_MONGODB=1
175
+    backup_database_to_usb microblogpub
176
+
177
+    restart_site
178
+    systemctl start microblogpub
179
+}
180
+
181
+function restore_local_microblogpub {
182
+    if ! grep -q "microblogpub domain" "$COMPLETION_FILE"; then
183
+        return
184
+    fi
185
+    MICROBLOGPUB_DOMAIN_NAME=$(get_completion_param "microblogpub domain")
186
+    if [ ! "$MICROBLOGPUB_DOMAIN_NAME" ]; then
187
+        return
188
+    fi
189
+    suspend_site "${MICROBLOGPUB_DOMAIN_NAME}"
190
+    systemctl stop microblogpub
191
+
192
+    temp_restore_dir=/root/tempmicroblogpub
193
+    microblogpub_dir=/etc/microblogpub
194
+
195
+    microblogpub_create_database
196
+
197
+    USE_MONGODB=1
198
+    restore_database microblogpub
199
+    if [ -d $temp_restore_dir ]; then
200
+        rm -rf $temp_restore_dir
201
+    fi
202
+
203
+    restore_directory_from_usb $temp_restore_dir microblogpub
204
+    if [ -d $temp_restore_dir ]; then
205
+        if [ -d "$temp_restore_dir$microblogpub_dir" ]; then
206
+            cp -rp "$temp_restore_dir$microblogpub_dir"/* "$microblogpub_dir"/
207
+        else
208
+            if [ ! -d "$microblogpub_dir" ]; then
209
+                mkdir "$microblogpub_dir"
210
+            fi
211
+            cp -rp "$temp_restore_dir"/* "$microblogpub_dir"/
212
+        fi
213
+        chown -R microblogpub:microblogpub "$microblogpub_dir"
214
+        rm -rf $temp_restore_dir
215
+    fi
216
+    systemctl start microblogpub
217
+
218
+    restart_site
219
+}
220
+
221
+function backup_remote_microblogpub {
222
+    MICROBLOGPUB_DOMAIN_NAME='microblogpub'
223
+    if grep -q "microblogpub domain" "$COMPLETION_FILE"; then
224
+        MICROBLOGPUB_DOMAIN_NAME=$(get_completion_param "microblogpub domain")
225
+    fi
226
+
227
+    source_directory=/etc/microblogpub
228
+
229
+    suspend_site "${MICROBLOGPUB_DOMAIN_NAME}"
230
+    systemctl stop microblogpub
231
+
232
+    dest_directory=microblogpub
233
+    backup_directory_to_friend "$source_directory" $dest_directory
234
+    USE_MONGODB=1
235
+    backup_database_to_friend microblogpub
236
+
237
+
238
+    systemctl start microblogpub
239
+
240
+    restart_site
241
+}
242
+
243
+function restore_remote_microblogpub {
244
+    if ! grep -q "microblogpub domain" "$COMPLETION_FILE"; then
245
+        return
246
+    fi
247
+    MICROBLOGPUB_DOMAIN_NAME=$(get_completion_param "microblogpub domain")
248
+    if [ ! "$MICROBLOGPUB_DOMAIN_NAME" ]; then
249
+        return
250
+    fi
251
+    suspend_site "${MICROBLOGPUB_DOMAIN_NAME}"
252
+    systemctl stop microblogpub
253
+
254
+    temp_restore_dir=/root/tempmicroblogpub
255
+    microblogpub_dir=/etc/microblogpub
256
+
257
+    microblogpub_create_database
258
+
259
+    USE_MONGODB=1
260
+    restore_database_from_friend microblogpub
261
+    if [ -d "$temp_restore_dir" ]; then
262
+        rm -rf $temp_restore_dir
263
+    fi
264
+
265
+    restore_directory_from_friend $temp_restore_dir microblogpub
266
+    if [ -d $temp_restore_dir ]; then
267
+        if [ -d "$temp_restore_dir$microblogpub_dir" ]; then
268
+            cp -rp "$temp_restore_dir$microblogpub_dir"/* "$microblogpub_dir"/
269
+        else
270
+            if [ ! -d "$microblogpub_dir" ]; then
271
+                mkdir "$microblogpub_dir"
272
+            fi
273
+            cp -rp $temp_restore_dir/* "$microblogpub_dir"/
274
+        fi
275
+        chown -R microblogpub:microblogpub "$microblogpub_dir"
276
+        rm -rf $temp_restore_dir
277
+    fi
278
+    systemctl start microblogpub
279
+
280
+    restart_site
281
+}
282
+
283
+function remove_microblogpub {
284
+    nginx_dissite "$MICROBLOGPUB_DOMAIN_NAME"
285
+    remove_certs "$MICROBLOGPUB_DOMAIN_NAME"
286
+
287
+    if [ -f /etc/systemd/system/microblogpub.service ]; then
288
+        systemctl stop microblogpub
289
+        systemctl disable microblogpub
290
+        rm /etc/systemd/system/microblogpub.service
291
+    fi
292
+    userdel -r microblogpub
293
+
294
+    if [ -d "/var/www/$MICROBLOGPUB_DOMAIN_NAME" ]; then
295
+        rm -rf "/var/www/$MICROBLOGPUB_DOMAIN_NAME"
296
+    fi
297
+    if [ -f "/etc/nginx/sites-available/$MICROBLOGPUB_DOMAIN_NAME" ]; then
298
+        rm "/etc/nginx/sites-available/$MICROBLOGPUB_DOMAIN_NAME"
299
+    fi
300
+    drop_database_mongodb microblogpub
301
+    remove_onion_service microblogpub "${MICROBLOGPUB_ONION_PORT}"
302
+    if grep -q "microblogpub" /etc/crontab; then
303
+        sed -i "/microblogpub/d" /etc/crontab
304
+    fi
305
+    remove_app microblogpub
306
+    remove_completion_param install_microblogpub
307
+    sed -i '/microblogpub/d' "$COMPLETION_FILE"
308
+
309
+    remove_ddns_domain "$MICROBLOGPUB_DOMAIN_NAME"
310
+}
311
+
312
+function install_microblogpub {
313
+    install_mongodb
314
+
315
+    if [ ! "$MICROBLOGPUB_DOMAIN_NAME" ]; then
316
+        echo $'No domain name was given'
317
+        exit 3568356
318
+    fi
319
+
320
+    if [ -d "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs" ]; then
321
+        rm -rf "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs"
322
+    fi
323
+    if [ -d /repos/microblogpub ]; then
324
+        mkdir "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs"
325
+        cp -r -p /repos/microblogpub/. "/etc/microblogpub"
326
+        cd "/etc/microblogpub" || exit 36487365
327
+        git pull
328
+    else
329
+        git_clone "$MICROBLOGPUB_REPO" "/etc/microblogpub"
330
+    fi
331
+
332
+    if [ ! -d "/etc/microblogpub" ]; then
333
+        echo $'Unable to clone microblogpub repo'
334
+        exit 87525
335
+    fi
336
+
337
+    cd "/etc/microblogpub" || exit 3463754637
338
+    git checkout "$MICROBLOGPUB_COMMIT" -b "$MICROBLOGPUB_COMMIT"
339
+    set_completion_param "microblogpub commit" "$MICROBLOGPUB_COMMIT"
340
+
341
+    pip install -r requirements.txt
342
+
343
+    { echo 'import sass';
344
+      echo "sass.compile(dirname=('sass', 'static/css'), output_style='compressed')"; } > generate_css.py
345
+    python generate_css.py
346
+
347
+    { echo "username: '$MY_USERNAME'";
348
+      echo "name: '$MY_NAME'";
349
+      echo "icon_url: 'https://$MICROBLOGPUB_DOMAIN_NAME/me.png'";
350
+      echo "domain: '$MICROBLOGPUB_DOMAIN_NAME'";
351
+      echo "summary: 'your summary'";
352
+      echo 'https: false'; } > config/me.yml
353
+
354
+    chmod g+w "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs"
355
+    chown -R www-data:www-data "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs"
356
+
357
+    microblogpub_create_database
358
+
359
+    add_ddns_domain "$MICROBLOGPUB_DOMAIN_NAME"
360
+
361
+    MICROBLOGPUB_ONION_HOSTNAME=$(add_onion_service microblogpub 80 "${MICROBLOGPUB_ONION_PORT}")
362
+
363
+    microblogpub_nginx_site=/etc/nginx/sites-available/$MICROBLOGPUB_DOMAIN_NAME
364
+    if [[ "$ONION_ONLY" == "no" ]]; then
365
+        nginx_http_redirect "$MICROBLOGPUB_DOMAIN_NAME" "index index.html"
366
+        { echo 'server {';
367
+          echo '  listen 443 ssl;';
368
+          echo '  #listen [::]:443 ssl;';
369
+          echo "  server_name $MICROBLOGPUB_DOMAIN_NAME;";
370
+          echo ''; } >> "$microblogpub_nginx_site"
371
+        nginx_compress "$MICROBLOGPUB_DOMAIN_NAME"
372
+        echo '' >> "$microblogpub_nginx_site"
373
+        echo '  # Security' >> "$microblogpub_nginx_site"
374
+        nginx_ssl "$MICROBLOGPUB_DOMAIN_NAME"
375
+
376
+        nginx_security_options "$MICROBLOGPUB_DOMAIN_NAME"
377
+
378
+        { echo '  add_header Strict-Transport-Security max-age=15768000;';
379
+          echo '';
380
+          echo '    access_log /dev/null;';
381
+          echo '    error_log /dev/null;';
382
+          echo '';
383
+          echo "    root /var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs;";
384
+          echo '';
385
+          echo '  index index.html;';
386
+          echo '  # Location';
387
+          echo '  location / {'; } >> "$microblogpub_nginx_site"
388
+        nginx_limits "$MICROBLOGPUB_DOMAIN_NAME" '15m'
389
+        { echo "    proxy_pass http://localhost:$MICROBLOGPUB_PORT_INTERNAL;";
390
+          echo '  }';
391
+          echo '}'; } >> "$microblogpub_nginx_site"
392
+    else
393
+        echo -n '' > "$microblogpub_nginx_site"
394
+    fi
395
+    { echo 'server {';
396
+      echo "    listen 127.0.0.1:$MICROBLOGPUB_ONION_PORT default_server;";
397
+      echo "    server_name $MICROBLOGPUB_ONION_HOSTNAME;";
398
+      echo ''; } >> "$microblogpub_nginx_site"
399
+    nginx_compress "$MICROBLOGPUB_DOMAIN_NAME"
400
+    echo '' >> "$microblogpub_nginx_site"
401
+    nginx_security_options "$MICROBLOGPUB_DOMAIN_NAME"
402
+    { echo '';
403
+      echo '    access_log /dev/null;';
404
+      echo '    error_log /dev/null;';
405
+      echo '';
406
+      echo "    root /var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs;";
407
+      echo '';
408
+      echo '  index index.html;';
409
+      echo '  # Location';
410
+      echo '  location / {'; } >> "$microblogpub_nginx_site"
411
+    nginx_limits "$MICROBLOGPUB_DOMAIN_NAME" '15m'
412
+    { echo "    proxy_pass http://localhost:$MICROBLOGPUB_PORT_INTERNAL;";
413
+      echo '  }';
414
+      echo '}'; } >> "$microblogpub_nginx_site"
415
+
416
+    adduser --system --home="/etc/microblogpub" --group microblogpub
417
+
418
+    { echo '[Unit]';
419
+      echo 'Description=microblogpub';
420
+      echo 'After=syslog.target';
421
+      echo 'After=network.target';
422
+      echo "Documentation=$MICROBLOGPUB_REPO";
423
+      echo '';
424
+      echo '[Service]';
425
+      echo 'Type=simple';
426
+      echo 'User=microblogpub';
427
+      echo 'Group=microblogpub';
428
+      echo 'WorkingDirectory=/etc/microblogpub';
429
+      echo "ExecStart=/usr/local/bin/flask run -p $MICROBLOGPUB_PORT_INTERNAL --with-threads";
430
+      echo 'Environment=USER=microblogpub';
431
+      echo 'Environment=FLASK_APP=app.py';
432
+      echo 'Environment=MICROBLOGPUB_DEBUG=1';
433
+      echo 'Restart=always';
434
+      echo 'StandardError=syslog';
435
+      echo '';
436
+      echo '[Install]';
437
+      echo 'WantedBy=multi-user.target'; } >> "/etc/systemd/system/microblogpub.service"
438
+    systemctl enable microblogpub
439
+    chown -R microblogpub:microblogpub "/etc/microblogpub"
440
+    systemctl start microblogpub
441
+
442
+    create_site_certificate "$MICROBLOGPUB_DOMAIN_NAME" 'yes'
443
+
444
+    nginx_ensite "$MICROBLOGPUB_DOMAIN_NAME"
445
+
446
+    systemctl restart nginx
447
+
448
+    "${PROJECT_NAME}-pass" -u "$MY_USERNAME" -a microblogpub -p "$MICROBLOGPUB_ADMIN_PASSWORD"
449
+
450
+
451
+    { echo 'import bcrypt';
452
+      echo "print(bcrypt.hashpw(\"$MICROBLOGPUB_ADMIN_PASSWORD\", bcrypt.gensalt()).decode('utf-8'))"; } > /tmp/microblogpub
453
+    MICROBLOGPUB_HASHED_PASSWORD=$(python /tmp/microblogpub)
454
+    rm /tmp/microblogpub
455
+
456
+    set_completion_param "microblogpub domain" "$MICROBLOGPUB_DOMAIN_NAME"
457
+
458
+    APP_INSTALLED=1
459
+}
460
+
461
+# NOTE: deliberately there is no "exit 0"