浏览代码

Beginning of hackmd

Bob Mottram 6 年前
父节点
当前提交
e03d056d8a
共有 1 个文件被更改,包括 484 次插入0 次删除
  1. 484
    0
      src/freedombone-app-hackmd

+ 484
- 0
src/freedombone-app-hackmd 查看文件

@@ -0,0 +1,484 @@
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
+HACKMD_DOMAIN_NAME=
34
+HACKMD_CODE=
35
+HACKMD_ONION_PORT=9052
36
+HACKMD_REPO="https://github.com/hackmdio/hackmd"
37
+HACKMD_COMMIT='c71361467d6eee6519b050fb5c40fc32520a19a8'
38
+HACKMD_PORT_INTERNAL=TODO
39
+
40
+hackmd_variables=(ONION_ONLY
41
+                  HACKMD_DOMAIN_NAME
42
+                  HACKMD_CODE
43
+                  DDNS_PROVIDER
44
+                  MY_USERNAME)
45
+
46
+function logging_on_hackmd {
47
+    echo -n ''
48
+}
49
+
50
+function logging_off_hackmd {
51
+    echo -n ''
52
+}
53
+
54
+function remove_user_hackmd {
55
+    remove_username="$1"
56
+
57
+    "${PROJECT_NAME}-pass" -u "$remove_username" --rmapp hackmd
58
+}
59
+
60
+function add_user_hackmd {
61
+    new_username="$1"
62
+    new_user_password="$2"
63
+
64
+    "${PROJECT_NAME}-pass" -u "$new_username" -a hackmd -p "$new_user_password"
65
+    echo '0'
66
+}
67
+
68
+function install_interactive_hackmd {
69
+    if [ ! "$ONION_ONLY" ]; then
70
+        ONION_ONLY='no'
71
+    fi
72
+
73
+    if [[ "$ONION_ONLY" != "no" ]]; then
74
+        HACKMD_DOMAIN_NAME='hackmd.local'
75
+        write_config_param "HACKMD_DOMAIN_NAME" "$HACKMD_DOMAIN_NAME"
76
+    else
77
+        interactive_site_details "hackmd" "HACKMD_DOMAIN_NAME" "HACKMD_CODE"
78
+    fi
79
+    APP_INSTALLED=1
80
+}
81
+
82
+function change_password_hackmd {
83
+    curr_username="$1"
84
+    new_user_password="$2"
85
+
86
+    read_config_param 'HACKMD_DOMAIN_NAME'
87
+
88
+    "${PROJECT_NAME}-pass" -u "$curr_username" -a hackmd -p "$new_user_password"
89
+}
90
+
91
+function hackmd_create_database {
92
+    if [ -f $IMAGE_PASSWORD_FILE ]; then
93
+        HACKMD_ADMIN_PASSWORD="$(printf "%d" "$(cat "")")"
94
+    else
95
+        if [ ! $HACKMD_ADMIN_PASSWORD ]; then
96
+            HACKMD_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
97
+        fi
98
+    fi
99
+    if [ ! $HACKMD_ADMIN_PASSWORD ]; then
100
+        return
101
+    fi
102
+
103
+    create_database hackmd "$HACKMD_ADMIN_PASSWORD" $MY_USERNAME
104
+}
105
+
106
+function reconfigure_hackmd {
107
+    # This is used if you need to switch identity. Dump old keys and generate new ones
108
+    echo -n ''
109
+}
110
+
111
+function configure_interactive_hackmd {
112
+    W=(1 $"Option 1"
113
+       2 $"Option 2")
114
+
115
+    while true
116
+    do
117
+        # shellcheck disable=SC2068
118
+        selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"hackmd" --menu $"Choose an operation, or ESC for main menu:" 14 70 3 "${W[@]}" 3>&2 2>&1 1>&3)
119
+
120
+        if [ ! "$selection" ]; then
121
+            break
122
+        fi
123
+        case $selection in
124
+            1) # call some function for option 1
125
+            ;;
126
+            2) # call some function for option 2
127
+            ;;
128
+        esac
129
+    done
130
+}
131
+
132
+function upgrade_hackmd {
133
+    CURR_HACKMD_COMMIT=$(get_completion_param "hackmd commit")
134
+    if [[ "$CURR_HACKMD_COMMIT" == "$HACKMD_COMMIT" ]]; then
135
+        return
136
+    fi
137
+
138
+    if grep -q "hackmd domain" "$COMPLETION_FILE"; then
139
+        HACKMD_DOMAIN_NAME=$(get_completion_param "hackmd domain")
140
+    fi
141
+
142
+    # update to the next commit
143
+    set_repo_commit "/etc/hackmd" "hackmd commit" "$HACKMD_COMMIT" "$HACKMD_REPO"
144
+    chown -R hackmd:hackmd "/etc/hackmd"
145
+    systemctl restart hackmd
146
+}
147
+
148
+function backup_local_hackmd {
149
+    HACKMD_DOMAIN_NAME='hackmd'
150
+    if grep -q "hackmd domain" "$COMPLETION_FILE"; then
151
+        HACKMD_DOMAIN_NAME=$(get_completion_param "hackmd domain")
152
+    fi
153
+
154
+    source_directory=/etc/hackmd
155
+
156
+    suspend_site "${HACKMD_DOMAIN_NAME}"
157
+
158
+    systemctl stop hackmd
159
+
160
+    dest_directory=hackmd
161
+    backup_directory_to_usb "$source_directory" $dest_directory
162
+
163
+    backup_database_to_usb hackmd
164
+
165
+    restart_site
166
+    systemctl start hackmd
167
+}
168
+
169
+function restore_local_hackmd {
170
+    if ! grep -q "hackmd domain" "$COMPLETION_FILE"; then
171
+        return
172
+    fi
173
+    HACKMD_DOMAIN_NAME=$(get_completion_param "hackmd domain")
174
+    if [ ! "$HACKMD_DOMAIN_NAME" ]; then
175
+        return
176
+    fi
177
+    suspend_site "${HACKMD_DOMAIN_NAME}"
178
+    systemctl stop hackmd
179
+
180
+    temp_restore_dir=/root/temphackmd
181
+    hackmd_dir=/etc/hackmd
182
+
183
+    hackmd_create_database
184
+
185
+    restore_database hackmd
186
+    if [ -d $temp_restore_dir ]; then
187
+        rm -rf $temp_restore_dir
188
+    fi
189
+
190
+    restore_directory_from_usb $temp_restore_dir hackmd
191
+    if [ -d $temp_restore_dir ]; then
192
+        if [ -d "$temp_restore_dir$hackmd_dir" ]; then
193
+            cp -rp "$temp_restore_dir$hackmd_dir"/* "$hackmd_dir"/
194
+        else
195
+            if [ ! -d "$hackmd_dir" ]; then
196
+                mkdir "$hackmd_dir"
197
+            fi
198
+            cp -rp "$temp_restore_dir"/* "$hackmd_dir"/
199
+        fi
200
+        chown -R hackmd:hackmd "$hackmd_dir"
201
+        rm -rf $temp_restore_dir
202
+    fi
203
+    systemctl start hackmd
204
+
205
+    restart_site
206
+}
207
+
208
+function backup_remote_hackmd {
209
+    HACKMD_DOMAIN_NAME='hackmd'
210
+    if grep -q "hackmd domain" "$COMPLETION_FILE"; then
211
+        HACKMD_DOMAIN_NAME=$(get_completion_param "hackmd domain")
212
+    fi
213
+
214
+    source_directory=/etc/hackmd
215
+
216
+    suspend_site "${HACKMD_DOMAIN_NAME}"
217
+    systemctl stop hackmd
218
+
219
+    dest_directory=hackmd
220
+    backup_directory_to_friend "$source_directory" $dest_directory
221
+    backup_database_to_friend hackmd
222
+
223
+
224
+    systemctl start hackmd
225
+
226
+    restart_site
227
+}
228
+
229
+function restore_remote_hackmd {
230
+    if ! grep -q "hackmd domain" "$COMPLETION_FILE"; then
231
+        return
232
+    fi
233
+    HACKMD_DOMAIN_NAME=$(get_completion_param "hackmd domain")
234
+    if [ ! "$HACKMD_DOMAIN_NAME" ]; then
235
+        return
236
+    fi
237
+    suspend_site "${HACKMD_DOMAIN_NAME}"
238
+    systemctl stop hackmd
239
+
240
+    temp_restore_dir=/root/temphackmd
241
+    hackmd_dir=/etc/hackmd
242
+
243
+    hackmd_create_database
244
+
245
+    restore_database_from_friend hackmd
246
+    if [ -d "$temp_restore_dir" ]; then
247
+        rm -rf $temp_restore_dir
248
+    fi
249
+
250
+    restore_directory_from_friend $temp_restore_dir hackmd
251
+    if [ -d $temp_restore_dir ]; then
252
+        if [ -d "$temp_restore_dir$hackmd_dir" ]; then
253
+            cp -rp "$temp_restore_dir$hackmd_dir"/* "$hackmd_dir"/
254
+        else
255
+            if [ ! -d "$hackmd_dir" ]; then
256
+                mkdir "$hackmd_dir"
257
+            fi
258
+            cp -rp $temp_restore_dir/* "$hackmd_dir"/
259
+        fi
260
+        chown -R hackmd:hackmd "$hackmd_dir"
261
+        rm -rf $temp_restore_dir
262
+    fi
263
+    systemctl start hackmd
264
+
265
+    restart_site
266
+}
267
+
268
+function remove_hackmd {
269
+    nginx_dissite "$HACKMD_DOMAIN_NAME"
270
+    remove_certs "$HACKMD_DOMAIN_NAME"
271
+
272
+    if [ -f /etc/systemd/system/hackmd.service ]; then
273
+        systemctl stop hackmd
274
+        systemctl disable hackmd
275
+        rm /etc/systemd/system/hackmd.service
276
+    fi
277
+    userdel -r hackmd
278
+    remove_nodejs hackmd
279
+
280
+
281
+    if [ -d "/var/www/$HACKMD_DOMAIN_NAME" ]; then
282
+        rm -rf "/var/www/$HACKMD_DOMAIN_NAME"
283
+    fi
284
+    if [ -f "/etc/nginx/sites-available/$HACKMD_DOMAIN_NAME" ]; then
285
+        rm "/etc/nginx/sites-available/$HACKMD_DOMAIN_NAME"
286
+    fi
287
+    drop_database hackmd
288
+    remove_onion_service hackmd "${HACKMD_ONION_PORT}"
289
+    if grep -q "hackmd" /etc/crontab; then
290
+        sed -i "/hackmd/d" /etc/crontab
291
+    fi
292
+    remove_app hackmd
293
+    remove_completion_param install_hackmd
294
+    sed -i '/hackmd/d' "$COMPLETION_FILE"
295
+
296
+    remove_ddns_domain "$HACKMD_DOMAIN_NAME"
297
+}
298
+
299
+function hackmd_create_config {
300
+    { echo '{';
301
+      echo '    "production": {';
302
+      echo '        "domain": "localhost",';
303
+      echo '        "hsts": {';
304
+      echo '            "enable": true,';
305
+      echo '            "maxAgeSeconds": "31536000",';
306
+      echo '            "includeSubdomains": true,';
307
+      echo '            "preload": true';
308
+      echo '        },';
309
+      echo '        "csp": {';
310
+      echo '            "enable": true,';
311
+      echo '            "directives": {';
312
+      echo '            },';
313
+      echo '            "upgradeInsecureRequests": "auto",';
314
+      echo '            "addDefaults": true,';
315
+      echo '            "addDisqus": true,';
316
+      echo '            "addGoogleAnalytics": true';
317
+      echo '        },';
318
+      echo '        "db": {';
319
+      echo "            \"username\": \"root\",";
320
+      echo "            \"password\": \"$MARIADB_PASSWORD\",";
321
+      echo '            "database": "hackmd",';
322
+      echo '            "host": "localhost",';
323
+      echo '            "port": "5432",';
324
+      echo '            "dialect": "mysql"';
325
+      echo '        },';
326
+      echo '        "github": {';
327
+      echo '            "clientID": "change this",';
328
+      echo '            "clientSecret": "change this"';
329
+      echo '        },';
330
+      echo '        "gitlab": {';
331
+      echo '            "baseURL": "change this",';
332
+      echo '            "clientID": "change this",';
333
+      echo '            "clientSecret": "change this",';
334
+      echo '            "scope": "use read_user scope for auth user only or remove this property if you need gitlab snippet import/export support (will result to be default scope api)"';
335
+      echo '        }';
336
+      echo '    }';
337
+      echo '}'; } > config.json
338
+}
339
+
340
+function install_hackmd {
341
+    install_mariadb
342
+
343
+    get_mariadb_password
344
+
345
+    install_nodejs hackmd
346
+    if [ ! "$HACKMD_DOMAIN_NAME" ]; then
347
+        echo $'No domain name was given'
348
+        exit 3568356
349
+    fi
350
+
351
+    if [ -d "/var/www/$HACKMD_DOMAIN_NAME/htdocs" ]; then
352
+        rm -rf "/var/www/$HACKMD_DOMAIN_NAME/htdocs"
353
+    fi
354
+    if [ -d /repos/hackmd ]; then
355
+        mkdir "/var/www/$HACKMD_DOMAIN_NAME/htdocs"
356
+        cp -r -p /repos/hackmd/. "/etc/hackmd"
357
+        cd "/etc/hackmd" || exit 36487365
358
+        git pull
359
+    else
360
+        git_clone "$HACKMD_REPO" "/etc/hackmd"
361
+    fi
362
+
363
+    if [ ! -d "/etc/hackmd" ]; then
364
+        echo $'Unable to clone hackmd repo'
365
+        exit 87525
366
+    fi
367
+
368
+    cd "/etc/hackmd" || exit 3463754637
369
+    git checkout "$HACKMD_COMMIT" -b "$HACKMD_COMMIT"
370
+    set_completion_param "hackmd commit" "$HACKMD_COMMIT"
371
+
372
+    if [ ! -f bin/setup ]; then
373
+        echo $'No setup file found'
374
+        exit 36587356
375
+    fi
376
+    chmod +x bin/setup
377
+    ./bin/setup
378
+    hackmd_create_config
379
+    npm run build
380
+
381
+    chmod g+w "/var/www/$HACKMD_DOMAIN_NAME/htdocs"
382
+    chown -R www-data:www-data "/var/www/$HACKMD_DOMAIN_NAME/htdocs"
383
+
384
+    hackmd_create_database
385
+
386
+    add_ddns_domain "$HACKMD_DOMAIN_NAME"
387
+
388
+    HACKMD_ONION_HOSTNAME=$(add_onion_service hackmd 80 "${HACKMD_ONION_PORT}")
389
+
390
+    hackmd_nginx_site=/etc/nginx/sites-available/$HACKMD_DOMAIN_NAME
391
+    if [[ "$ONION_ONLY" == "no" ]]; then
392
+        nginx_http_redirect "$HACKMD_DOMAIN_NAME" "index index.html"
393
+        { echo 'server {';
394
+          echo '  listen 443 ssl;';
395
+          echo '  #listen [::]:443 ssl;';
396
+          echo "  server_name $HACKMD_DOMAIN_NAME;";
397
+          echo ''; } >> "$hackmd_nginx_site"
398
+        nginx_compress "$HACKMD_DOMAIN_NAME"
399
+        echo '' >> "$hackmd_nginx_site"
400
+        echo '  # Security' >> "$hackmd_nginx_site"
401
+        nginx_ssl "$HACKMD_DOMAIN_NAME"
402
+
403
+        nginx_security_options "$HACKMD_DOMAIN_NAME"
404
+
405
+        { echo '  add_header Strict-Transport-Security max-age=15768000;';
406
+          echo '';
407
+          echo '    access_log /dev/null;';
408
+          echo '    error_log /dev/null;';
409
+          echo '';
410
+          echo "    root /var/www/$HACKMD_DOMAIN_NAME/htdocs;";
411
+          echo '';
412
+          echo '  index index.html;';
413
+          echo '  # Location';
414
+          echo '  location / {'; } >> "$hackmd_nginx_site"
415
+        nginx_limits "$HACKMD_DOMAIN_NAME" '15m'
416
+        { echo "    proxy_pass http://localhost:$HACKMD_PORT_INTERNAL;";
417
+          echo '  }';
418
+          echo '}'; } >> "$hackmd_nginx_site"
419
+    else
420
+        echo -n '' > "$hackmd_nginx_site"
421
+    fi
422
+    { echo 'server {';
423
+      echo "    listen 127.0.0.1:$HACKMD_ONION_PORT default_server;";
424
+      echo "    server_name $HACKMD_ONION_HOSTNAME;";
425
+      echo ''; } >> "$hackmd_nginx_site"
426
+    nginx_compress "$HACKMD_DOMAIN_NAME"
427
+    echo '' >> "$hackmd_nginx_site"
428
+    nginx_security_options "$HACKMD_DOMAIN_NAME"
429
+    { echo '';
430
+      echo '    access_log /dev/null;';
431
+      echo '    error_log /dev/null;';
432
+      echo '';
433
+      echo "    root /var/www/$HACKMD_DOMAIN_NAME/htdocs;";
434
+      echo '';
435
+      echo '  index index.html;';
436
+      echo '  # Location';
437
+      echo '  location / {'; } >> "$hackmd_nginx_site"
438
+    nginx_limits "$HACKMD_DOMAIN_NAME" '15m'
439
+    { echo "    proxy_pass http://localhost:$HACKMD_PORT_INTERNAL;";
440
+      echo '  }';
441
+      echo '}'; } >> "$hackmd_nginx_site"
442
+
443
+    adduser --system --home="/etc/hackmd" --group hackmd
444
+
445
+
446
+
447
+    { echo '[Unit]';
448
+      echo 'Description=hackmd';
449
+      echo 'After=syslog.target';
450
+      echo 'After=network.target';
451
+      echo "Documentation=$HACKMD_REPO";
452
+      echo '';
453
+      echo '[Service]';
454
+      echo 'Type=simple';
455
+      echo 'User=hackmd';
456
+      echo 'Group=hackmd';
457
+      echo 'WorkingDirectory=/etc/hackmd';
458
+      echo 'ExecStart=/usr/local/bin/npm start';
459
+      echo 'ExecStop=/usr/local/bin/npm stop';
460
+      echo 'Environment=USER=hackmd';
461
+      echo 'Restart=always';
462
+      echo 'StandardError=syslog';
463
+      echo '';
464
+      echo '[Install]';
465
+      echo 'WantedBy=multi-user.target'; } >> "/etc/systemd/system/hackmd.service"
466
+    systemctl enable hackmd
467
+    chown -R hackmd:hackmd "/etc/hackmd"
468
+    systemctl start hackmd
469
+
470
+    create_site_certificate "$HACKMD_DOMAIN_NAME" 'yes'
471
+
472
+    nginx_ensite "$HACKMD_DOMAIN_NAME"
473
+
474
+    systemctl restart mariadb
475
+
476
+    systemctl restart nginx
477
+
478
+    "${PROJECT_NAME}-pass" -u "$MY_USERNAME" -a hackmd -p "$HACKMD_ADMIN_PASSWORD"
479
+    set_completion_param "hackmd domain" "$HACKMD_DOMAIN_NAME"
480
+
481
+    APP_INSTALLED=1
482
+}
483
+
484
+# NOTE: deliberately there is no "exit 0"