Newer
Older
#!/bin/bash
#
# _____ _ _
# | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
# | __| _| -_| -_| . | . | | . | . | | -_|
# |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___|
#
# Freedom in the Cloud
#
# This needs python 3.6, which is later than the debian version
#
# License
# =======
#
# Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
IN_DEFAULT_INSTALL=0
SHOW_ON_ABOUT=1
MICROBLOGPUB_DOMAIN_NAME=
MICROBLOGPUB_CODE=
MICROBLOGPUB_ONION_PORT=9261
MICROBLOGPUB_REPO="https://github.com/tsileo/microblog.pub"
MICROBLOGPUB_COMMIT='791e55c7f5eee26792b90b94668d5f0dbbc767f9'
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
MICROBLOGPUB_PORT_INTERNAL=5005
# These parameters are used by the FreedomBox mobile app
MICROBLOGPUB_SHORT_DESCRIPTION=
MICROBLOGPUB_DESCRIPTION=
MICROBLOGPUB_MOBILE_APP_URL=
microblogpub_variables=(ONION_ONLY
MICROBLOGPUB_DOMAIN_NAME
MICROBLOGPUB_CODE
DDNS_PROVIDER
MY_USERNAME)
function logging_on_microblogpub {
echo -n ''
}
function logging_off_microblogpub {
echo -n ''
}
function remove_user_microblogpub {
remove_username="$1"
"${PROJECT_NAME}-pass" -u "$remove_username" --rmapp microblogpub
}
function add_user_microblogpub {
new_username="$1"
new_user_password="$2"
"${PROJECT_NAME}-pass" -u "$new_username" -a microblogpub -p "$new_user_password"
echo '0'
}
function install_interactive_microblogpub {
if [ ! "$ONION_ONLY" ]; then
ONION_ONLY='no'
fi
if [[ "$ONION_ONLY" != "no" ]]; then
MICROBLOGPUB_DOMAIN_NAME='microblogpub.local'
write_config_param "MICROBLOGPUB_DOMAIN_NAME" "$MICROBLOGPUB_DOMAIN_NAME"
else
interactive_site_details "microblogpub" "MICROBLOGPUB_DOMAIN_NAME" "MICROBLOGPUB_CODE"
fi
APP_INSTALLED=1
}
function change_password_microblogpub {
#curr_username="$1"
new_user_password="$2"
read_config_param 'MY_USERNAME'
read_config_param 'MICROBLOGPUB_DOMAIN_NAME'
"${PROJECT_NAME}-pass" -u "$MY_USERNAME" -a microblogpub -p "$new_user_password"
{ echo 'import bcrypt';
echo "print(bcrypt.hashpw(\"$new_user_password\", bcrypt.gensalt()).decode('utf-8'))"; } > /tmp/microblogpub
MICROBLOGPUB_HASHED_PASSWORD=$(python /tmp/microblogpub)
rm /tmp/microblogpub
}
function microblogpub_create_database {
if [ -f "$IMAGE_PASSWORD_FILE" ]; then
MICROBLOGPUB_ADMIN_PASSWORD="$(printf "%d" "$(cat "")")"
else
if [ ! "$MICROBLOGPUB_ADMIN_PASSWORD" ]; then
MICROBLOGPUB_ADMIN_PASSWORD=$(create_password "${MINIMUM_PASSWORD_LENGTH}")
fi
fi
if [ ! "$MICROBLOGPUB_ADMIN_PASSWORD" ]; then
return
fi
create_database_mongodb microblogpub "$MICROBLOGPUB_ADMIN_PASSWORD" "$MY_USERNAME"
}
function reconfigure_microblogpub {
# This is used if you need to switch identity. Dump old keys and generate new ones
echo -n ''
}
function configure_interactive_microblogpub {
W=(1 $"Option 1"
2 $"Option 2")
while true
do
# shellcheck disable=SC2068
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)
if [ ! "$selection" ]; then
break
fi
case $selection in
1) # call some function for option 1
;;
2) # call some function for option 2
;;
esac
done
}
function upgrade_microblogpub {
CURR_MICROBLOGPUB_COMMIT=$(get_completion_param "microblogpub commit")
if [[ "$CURR_MICROBLOGPUB_COMMIT" == "$MICROBLOGPUB_COMMIT" ]]; then
return
fi
if grep -q "microblogpub domain" "$COMPLETION_FILE"; then
MICROBLOGPUB_DOMAIN_NAME=$(get_completion_param "microblogpub domain")
fi
# update to the next commit
set_repo_commit "/etc/microblogpub" "microblogpub commit" "$MICROBLOGPUB_COMMIT" "$MICROBLOGPUB_REPO"
chown -R microblogpub:microblogpub "/etc/microblogpub"
systemctl restart microblogpub
}
function backup_local_microblogpub {
MICROBLOGPUB_DOMAIN_NAME='microblogpub'
if grep -q "microblogpub domain" "$COMPLETION_FILE"; then
MICROBLOGPUB_DOMAIN_NAME=$(get_completion_param "microblogpub domain")
fi
source_directory=/etc/microblogpub
suspend_site "${MICROBLOGPUB_DOMAIN_NAME}"
systemctl stop microblogpub
dest_directory=microblogpub
backup_directory_to_usb "$source_directory" $dest_directory
USE_MONGODB=1
backup_database_to_usb microblogpub
restart_site
systemctl start microblogpub
}
function restore_local_microblogpub {
if ! grep -q "microblogpub domain" "$COMPLETION_FILE"; then
return
fi
MICROBLOGPUB_DOMAIN_NAME=$(get_completion_param "microblogpub domain")
if [ ! "$MICROBLOGPUB_DOMAIN_NAME" ]; then
return
fi
suspend_site "${MICROBLOGPUB_DOMAIN_NAME}"
systemctl stop microblogpub
temp_restore_dir=/root/tempmicroblogpub
microblogpub_dir=/etc/microblogpub
microblogpub_create_database
USE_MONGODB=1
restore_database microblogpub
if [ -d $temp_restore_dir ]; then
rm -rf $temp_restore_dir
fi
restore_directory_from_usb $temp_restore_dir microblogpub
if [ -d $temp_restore_dir ]; then
if [ -d "$temp_restore_dir$microblogpub_dir" ]; then
cp -rp "$temp_restore_dir$microblogpub_dir"/* "$microblogpub_dir"/
else
if [ ! -d "$microblogpub_dir" ]; then
mkdir "$microblogpub_dir"
fi
cp -rp "$temp_restore_dir"/* "$microblogpub_dir"/
fi
chown -R microblogpub:microblogpub "$microblogpub_dir"
rm -rf $temp_restore_dir
fi
systemctl start microblogpub
restart_site
}
function backup_remote_microblogpub {
}
function restore_remote_microblogpub {
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
}
function remove_microblogpub {
nginx_dissite "$MICROBLOGPUB_DOMAIN_NAME"
remove_certs "$MICROBLOGPUB_DOMAIN_NAME"
if [ -f /etc/systemd/system/microblogpub.service ]; then
systemctl stop microblogpub
systemctl disable microblogpub
rm /etc/systemd/system/microblogpub.service
fi
userdel -r microblogpub
if [ -d "/var/www/$MICROBLOGPUB_DOMAIN_NAME" ]; then
rm -rf "/var/www/$MICROBLOGPUB_DOMAIN_NAME"
fi
if [ -f "/etc/nginx/sites-available/$MICROBLOGPUB_DOMAIN_NAME" ]; then
rm "/etc/nginx/sites-available/$MICROBLOGPUB_DOMAIN_NAME"
fi
drop_database_mongodb microblogpub
remove_onion_service microblogpub "${MICROBLOGPUB_ONION_PORT}"
if grep -q "microblogpub" /etc/crontab; then
sed -i "/microblogpub/d" /etc/crontab
fi
remove_app microblogpub
remove_completion_param install_microblogpub
sed -i '/microblogpub/d' "$COMPLETION_FILE"
remove_ddns_domain "$MICROBLOGPUB_DOMAIN_NAME"
}
function install_microblogpub {
$INSTALL_PACKAGES python3-pip python3-flask
if [ ! "$MICROBLOGPUB_DOMAIN_NAME" ]; then
echo $'No domain name was given'
exit 3568356
fi
if [ -d "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs" ]; then
rm -rf "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs"
fi
if [ -d /repos/microblogpub ]; then
cp -r -p /repos/microblogpub/. "/etc/microblogpub"
cd "/etc/microblogpub" || exit 36487365
git pull
else
git_clone "$MICROBLOGPUB_REPO" "/etc/microblogpub"
fi
if [ ! -d "/etc/microblogpub" ]; then
echo $'Unable to clone microblogpub repo'
exit 87525
fi
cd "/etc/microblogpub" || exit 3463754637
git checkout "$MICROBLOGPUB_COMMIT" -b "$MICROBLOGPUB_COMMIT"
set_completion_param "microblogpub commit" "$MICROBLOGPUB_COMMIT"
{ echo 'import sass';
echo "sass.compile(dirname=('sass', 'static/css'), output_style='compressed')"; } > generate_css.py
{ echo "username: '$MY_USERNAME'";
echo "name: '$MY_NAME'";
echo "icon_url: 'https://$MICROBLOGPUB_DOMAIN_NAME/me.png'";
echo "domain: '$MICROBLOGPUB_DOMAIN_NAME'";
echo "summary: 'your summary'";
echo 'https: false'; } > config/me.yml
chmod g+w "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs"
chown -R www-data:www-data "/var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs"
add_ddns_domain "$MICROBLOGPUB_DOMAIN_NAME"
MICROBLOGPUB_ONION_HOSTNAME=$(add_onion_service microblogpub 80 "${MICROBLOGPUB_ONION_PORT}")
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
microblogpub_nginx_site=/etc/nginx/sites-available/$MICROBLOGPUB_DOMAIN_NAME
if [[ "$ONION_ONLY" == "no" ]]; then
nginx_http_redirect "$MICROBLOGPUB_DOMAIN_NAME" "index index.html"
{ echo 'server {';
echo ' listen 443 ssl;';
echo ' #listen [::]:443 ssl;';
echo " server_name $MICROBLOGPUB_DOMAIN_NAME;";
echo ''; } >> "$microblogpub_nginx_site"
nginx_compress "$MICROBLOGPUB_DOMAIN_NAME"
echo '' >> "$microblogpub_nginx_site"
echo ' # Security' >> "$microblogpub_nginx_site"
nginx_ssl "$MICROBLOGPUB_DOMAIN_NAME"
nginx_security_options "$MICROBLOGPUB_DOMAIN_NAME"
{ echo ' add_header Strict-Transport-Security max-age=15768000;';
echo '';
echo ' access_log /dev/null;';
echo ' error_log /dev/null;';
echo '';
echo " root /var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs;";
echo '';
echo ' index index.html;';
echo ' # Location';
echo ' location / {'; } >> "$microblogpub_nginx_site"
nginx_limits "$MICROBLOGPUB_DOMAIN_NAME" '15m'
{ echo " proxy_pass http://localhost:$MICROBLOGPUB_PORT_INTERNAL;";
echo ' }';
echo '}'; } >> "$microblogpub_nginx_site"
else
echo -n '' > "$microblogpub_nginx_site"
fi
{ echo 'server {';
echo " listen 127.0.0.1:$MICROBLOGPUB_ONION_PORT default_server;";
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
echo " server_name $MICROBLOGPUB_ONION_HOSTNAME;";
echo ''; } >> "$microblogpub_nginx_site"
nginx_compress "$MICROBLOGPUB_DOMAIN_NAME"
echo '' >> "$microblogpub_nginx_site"
nginx_security_options "$MICROBLOGPUB_DOMAIN_NAME"
{ echo '';
echo ' access_log /dev/null;';
echo ' error_log /dev/null;';
echo '';
echo " root /var/www/$MICROBLOGPUB_DOMAIN_NAME/htdocs;";
echo '';
echo ' index index.html;';
echo ' # Location';
echo ' location / {'; } >> "$microblogpub_nginx_site"
nginx_limits "$MICROBLOGPUB_DOMAIN_NAME" '15m'
{ echo " proxy_pass http://localhost:$MICROBLOGPUB_PORT_INTERNAL;";
echo ' }';
echo '}'; } >> "$microblogpub_nginx_site"
adduser --system --home="/etc/microblogpub" --group microblogpub
{ echo '[Unit]';
echo 'Description=microblogpub';
echo 'After=syslog.target';
echo 'After=network.target';
echo "Documentation=$MICROBLOGPUB_REPO";
echo '';
echo '[Service]';
echo 'Type=simple';
echo 'User=microblogpub';
echo 'Group=microblogpub';
echo 'WorkingDirectory=/etc/microblogpub';
echo "ExecStart=/usr/local/bin/flask run -p $MICROBLOGPUB_PORT_INTERNAL --with-threads";
echo 'Environment=USER=microblogpub';
echo 'Environment=FLASK_APP=app.py';
echo 'Environment=MICROBLOGPUB_DEBUG=1';
echo 'Restart=always';
echo 'StandardError=syslog';
echo '';
echo '[Install]';
echo 'WantedBy=multi-user.target'; } > "/etc/systemd/system/microblogpub.service"
systemctl enable microblogpub
chown -R microblogpub:microblogpub "/etc/microblogpub"
increment_app_install_progress
create_site_certificate "$MICROBLOGPUB_DOMAIN_NAME" 'yes'
nginx_ensite "$MICROBLOGPUB_DOMAIN_NAME"
systemctl restart nginx
"${PROJECT_NAME}-pass" -u "$MY_USERNAME" -a microblogpub -p "$MICROBLOGPUB_ADMIN_PASSWORD"
{ echo 'import bcrypt';
echo "print(bcrypt.hashpw(\"$MICROBLOGPUB_ADMIN_PASSWORD\", bcrypt.gensalt()).decode('utf-8'))"; } > /tmp/microblogpub
MICROBLOGPUB_HASHED_PASSWORD=$(python /tmp/microblogpub)
rm /tmp/microblogpub
set_completion_param "microblogpub domain" "$MICROBLOGPUB_DOMAIN_NAME"
APP_INSTALLED=1
}
# NOTE: deliberately there is no "exit 0"