#!/bin/bash
#
# .---.                  .              .
# |                      |              |
# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
#
#                    Freedom in the Cloud
#
# GNU Social application
#
# License
# =======
#
# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
#
# 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/>.

MICROBLOG_DOMAIN_NAME=
MICROBLOG_CODE=
MICROBLOG_ONION_PORT=8087
MICROBLOG_REPO="https://git.gnu.io/gnu/gnu-social.git"
MICROBLOG_COMMIT='c67b89e56bf0f90730a9e22beca7e1bd41fc26c3'
MICROBLOG_ADMIN_PASSWORD=
MICROBLOG_THEME_REPO="https://git.gnu.io/h2p/Qvitter.git"
MICROBLOG_THEME_COMMIT='34510bcf37c727f91afad789fb0a531a45171ccf'
MICROBLOG_WELCOME_MESSAGE=$'<h1>Welcome to GNU Social – a federated microblog</h1><p>Another Freedombone site</p>'
MICROBLOG_BACKGROUND_IMAGE_URL=
MICROBLOG_MARKDOWN_REPO="https://git.gnu.io/chimo/markdown.git"
MICROBLOG_MARKDOWN_COMMIT='03c53942f94b3376f0946e6e1fe566cc21ccf232'

# Sharings plugin for the microblog
SHARINGS_REPO="http://git.lasindias.club/bashrc/Sharings"
SHARINGS_COMMIT='d5c6c7f855d9afff9086c09ea706f38c859bc0d4'
SHARINGS_THEME_REPO="http://git.lasindias.club/manuel/SharingsTheme"
SHARINGS_THEME_COMMIT='7106c7ef03'

function remove_gnu_social {
	if ! grep -Fxq "install_gnu_social" $COMPLETION_FILE; then
		return
	fi
	nginx_dissite $MICROBLOG_DOMAIN_NAME
	if [ -d /var/www/$MICROBLOG_DOMAIN_NAME ]; then
		rm -rf /var/www/$MICROBLOG_DOMAIN_NAME
	fi
	if [ -f /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME ]; then
		rm /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
	fi
	function_check drop_database
	drop_database gnusocial
	function_check remove_onion_service
	remove_onion_service microblog ${MICROBLOG_ONION_PORT}
	sed -i '/install_gnu_social/d' $COMPLETION_FILE
	sed -i '/GNU Social /d' $COMPLETION_FILE
}

function install_gnu_social {
	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
		return
	fi
	if [ ! $MICROBLOG_DOMAIN_NAME ]; then
		echo $'No domain name was given for the microblog'
		exit 7359
	fi

	# update to the next commit
	function_check set_repo_commit
	set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs "GNU Social commit" "$MICROBLOG_COMMIT" $MICROBLOG_REPO

	# add a script to check that the daemon is running
	echo '#!/bin/bash' > /etc/cron.hourly/gnusocial-daemons
	echo 'daemon_lines=$(ps aux | grep "scripts/queuedaemon.php" | grep "/var/www")' >> /etc/cron.hourly/gnusocial-daemons
	echo 'if [[ $daemon_lines != *"/var/www/"* ]]; then' >> /etc/cron.hourly/gnusocial-daemons

	echo "    ADMIN_USER=\$(cat $COMPLETION_FILE | grep 'Admin user' | awk -F ':' '{print \$2}')" >> /etc/cron.hourly/gnusocial-daemons
	echo '    MY_EMAIL_ADDRESS=$ADMIN_USER@$HOSTNAME' >> /etc/cron.hourly/gnusocial-daemons
	echo '    echo "Restarting GNU Social daemons" | mail -s "GNU Social daemons not found" $MY_EMAIL_ADDRESS' >> /etc/cron.hourly/gnusocial-daemons
	echo "    cd /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs" >> /etc/cron.hourly/gnusocial-daemons
	echo '    scripts/startdaemons.sh' >> /etc/cron.hourly/gnusocial-daemons
	echo 'fi' >> /etc/cron.hourly/gnusocial-daemons
	chmod +x /etc/cron.hourly/gnusocial-daemons

	if grep -Fxq "install_gnu_social" $COMPLETION_FILE; then
		return
	fi

	function_check install_mariadb
	install_mariadb

	function_check get_mariadb_password
	get_mariadb_password

	function_check repair_databases_script
	repair_databases_script

	apt-get -y install php-gettext php5-curl php5-gd php5-mysql git curl php-xml-parser
	apt-get -y install php5-memcached

	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME ]; then
		mkdir /var/www/$MICROBLOG_DOMAIN_NAME
	fi
	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
		function_check git_clone
		git_clone $MICROBLOG_REPO /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
		if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
			echo $'Unable to clone gnusocial repo'
			exit 87525
		fi
	fi

	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
	git checkout $MICROBLOG_COMMIT -b $MICROBLOG_COMMIT
	if ! grep -q "GNU Social commit" $COMPLETION_FILE; then
		echo "GNU Social commit:$MICROBLOG_COMMIT" >> $COMPLETION_FILE
	else
		sed -i "s/GNU Social commit.*/GNU Social commit:$MICROBLOG_COMMIT/g" $COMPLETION_FILE
	fi

	chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
	chown www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
	chmod +x /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php

	function_check get_mariadb_gnusocial_admin_password
	get_mariadb_gnusocial_admin_password
	if [ ! $MICROBLOG_ADMIN_PASSWORD ]; then
		if [ -f $IMAGE_PASSWORD_FILE ]; then
			MICROBLOG_ADMIN_PASSWORD="$(printf `cat $IMAGE_PASSWORD_FILE`)"
		else
			MICROBLOG_ADMIN_PASSWORD="$(create_password ${MINIMUM_PASSWORD_LENGTH})"
		fi
	fi

	function_check create_database
	create_database gnusocial "$MICROBLOG_ADMIN_PASSWORD" $MY_USERNAME

	if [ ! -f "/etc/aliases" ]; then
		touch /etc/aliases
	fi
	if ! grep -q "www-data: root" /etc/aliases; then
		echo 'www-data: root' >> /etc/aliases
	fi
	if ! grep -q "/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" /etc/aliases; then
		echo "*: /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" >> /etc/aliases
	fi

	function_check add_ddns_domain
	add_ddns_domain $MICROBLOG_DOMAIN_NAME

	microblog_nginx_site=/etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
	if [[ $ONION_ONLY == "no" ]]; then
		function_check nginx_http_redirect
		nginx_http_redirect $MICROBLOG_DOMAIN_NAME
		echo 'server {' >> $microblog_nginx_site
		echo '  listen 443 ssl;' >> $microblog_nginx_site
		echo "  server_name $MICROBLOG_DOMAIN_NAME;" >> $microblog_nginx_site
		echo '' >> $microblog_nginx_site
		echo '  # Security' >> $microblog_nginx_site
		function_check nginx_ssl
		nginx_ssl $MICROBLOG_DOMAIN_NAME

		function_check nginx_disable_sniffing
		nginx_disable_sniffing $MICROBLOG_DOMAIN_NAME

		function_check nginx_limits
		nginx_limits $MICROBLOG_DOMAIN_NAME '15m'
		echo '  add_header Strict-Transport-Security max-age=15768000;' >> $microblog_nginx_site
		echo '' >> $microblog_nginx_site
		echo '  # Logs' >> $microblog_nginx_site
		echo '  access_log off;' >> $microblog_nginx_site
		echo '  error_log off;' >> $microblog_nginx_site
		echo '' >> $microblog_nginx_site
		echo '  # Root' >> $microblog_nginx_site
		echo "  root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> $microblog_nginx_site
		echo '' >> $microblog_nginx_site
		echo '  # Index' >> $microblog_nginx_site
		echo '  index index.php;' >> $microblog_nginx_site
		echo '' >> $microblog_nginx_site
		echo '  # PHP' >> $microblog_nginx_site
		echo '  location ~ \.php {' >> $microblog_nginx_site
		echo '    include snippets/fastcgi-php.conf;' >> $microblog_nginx_site
		echo '    fastcgi_pass unix:/var/run/php5-fpm.sock;' >> $microblog_nginx_site
		echo '  }' >> $microblog_nginx_site
		echo '' >> $microblog_nginx_site
		echo '  # Location' >> $microblog_nginx_site
		echo '  location / {' >> $microblog_nginx_site
		echo '    try_files $uri $uri/ @gnusocial;' >> $microblog_nginx_site
		echo '  }' >> $microblog_nginx_site
		echo '' >> $microblog_nginx_site
		echo '  # Fancy URLs' >> $microblog_nginx_site
		echo '  location @gnusocial {' >> $microblog_nginx_site
		echo '    rewrite ^(.*)$ /index.php?p=$1 last;' >> $microblog_nginx_site
		echo '  }' >> $microblog_nginx_site
		echo '' >> $microblog_nginx_site
		echo '  # Restrict access that is unnecessary anyway' >> $microblog_nginx_site
		echo '  location ~ /\.(ht|git) {' >> $microblog_nginx_site
		echo '    deny all;' >> $microblog_nginx_site
		echo '  }' >> $microblog_nginx_site
		echo '}' >> $microblog_nginx_site
	else
		echo -n '' > $microblog_nginx_site
	fi
	echo 'server {' >> $microblog_nginx_site
	echo "    listen 127.0.0.1:$MICROBLOG_ONION_PORT default_server;" >> $microblog_nginx_site
	echo "    server_name $MICROBLOG_DOMAIN_NAME;" >> $microblog_nginx_site
	echo '' >> $microblog_nginx_site
	function_check nginx_disable_sniffing
	nginx_disable_sniffing $MICROBLOG_DOMAIN_NAME
	function_check nginx_limits
	nginx_limits $MICROBLOG_DOMAIN_NAME '15m'
	echo '' >> $microblog_nginx_site
	echo '  # Logs' >> $microblog_nginx_site
	echo '  access_log off;' >> $microblog_nginx_site
	echo '  error_log off;' >> $microblog_nginx_site
	echo '' >> $microblog_nginx_site
	echo '  # Root' >> $microblog_nginx_site
	echo "  root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> $microblog_nginx_site
	echo '' >> $microblog_nginx_site
	echo '  # Index' >> $microblog_nginx_site
	echo '  index index.php;' >> $microblog_nginx_site
	echo '' >> $microblog_nginx_site
	echo '  # PHP' >> $microblog_nginx_site
	echo '  location ~ \.php {' >> $microblog_nginx_site
	echo '    include snippets/fastcgi-php.conf;' >> $microblog_nginx_site
	echo '    fastcgi_pass unix:/var/run/php5-fpm.sock;' >> $microblog_nginx_site
	echo '  }' >> $microblog_nginx_site
	echo '' >> $microblog_nginx_site
	echo '  # Location' >> $microblog_nginx_site
	echo '  location / {' >> $microblog_nginx_site
	echo '    try_files $uri $uri/ @gnusocial;' >> $microblog_nginx_site
	echo '  }' >> $microblog_nginx_site
	echo '' >> $microblog_nginx_site
	echo '  # Fancy URLs' >> $microblog_nginx_site
	echo '  location @gnusocial {' >> $microblog_nginx_site
	echo '    rewrite ^(.*)$ /index.php?p=$1 last;' >> $microblog_nginx_site
	echo '  }' >> $microblog_nginx_site
	echo '' >> $microblog_nginx_site
	echo '  # Restrict access that is unnecessary anyway' >> $microblog_nginx_site
	echo '  location ~ /\.(ht|git) {' >> $microblog_nginx_site
	echo '    deny all;' >> $microblog_nginx_site
	echo '  }' >> $microblog_nginx_site
	echo '}' >> $microblog_nginx_site

	function_check configure_php
	configure_php

	function_check create_site_certificate
	create_site_certificate $MICROBLOG_DOMAIN_NAME 'yes'

	# Ensure that the database gets backed up locally, if remote
	# backups are not being used
	function_check backup_databases_script_header
	backup_databases_script_header

	function_check backup_database_local
	backup_database_local gnusocial

	function_check nginx_ensite
	nginx_ensite $MICROBLOG_DOMAIN_NAME

	# NOTE: For the typical case always enable SSL and only
	# disable it if in onion only mode. This is due to complexities
	# with the way URLs are generated by GNU Social
	gnu_social_ssl='always'
	if [[ $ONION_ONLY != 'no' ]]; then
		gnu_social_ssl='never'
	fi

	MICROBLOG_ONION_HOSTNAME=$(add_onion_service microblog 80 ${MICROBLOG_ONION_PORT})

	MICROBLOG_SERVER=${MICROBLOG_DOMAIN_NAME}
	if [[ $ONION_ONLY != 'no' ]]; then
		MICROBLOG_SERVER=${MICROBLOG_ONION_HOSTNAME}
	fi

	# Create the configuration
	gnu_social_installer=/var/www/${MICROBLOG_DOMAIN_NAME}/htdocs/scripts/install_cli.php
	if [ ! -f $gnu_social_installer ]; then
		echo $'No GNU Social commandline installer found'
		exit 53026
	fi
	${gnu_social_installer} --server "${MICROBLOG_SERVER}" \
							--host="localhost" --database="gnusocial" \
							--dbtype=mysql --username="root" -v \
							--password="$MARIADB_PASSWORD" \
							--sitename=$"GNU Social" --fancy='yes' \
							--admin-nick="$MY_USERNAME" \
							--admin-pass="$MICROBLOG_ADMIN_PASSWORD" \
							--site-profile="community" \
							--ssl=${gnu_social_ssl}
	# There can be a lot of warnings here so the return value check is disabled
	#if [ ! "$?" = "0" ]; then
	#    # failed to install
	#    echo $'Could not install GNU Social'
	#    exit 72357
	#fi

	# check microblog has a config file
	microblog_config_file=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
	if [ ! -f $microblog_config_file ]; then
		echo $'Microblog config.php not found'
		exit 87586
	fi

	# Some useful settings
	if ! grep -q "Recommended GNU social settings" $microblog_config_file; then
		echo "" >> $microblog_config_file
		echo "// Recommended GNU social settings" >> $microblog_config_file
		echo "\$config['thumbnail']['maxsize'] = 3000;" >> $microblog_config_file
		echo "\$config['profile']['delete'] = true;" >> $microblog_config_file
		echo "\$config['profile']['changenick'] = true;" >> $microblog_config_file
		echo "\$config['public']['localonly'] = false;" >> $microblog_config_file
		echo "addPlugin('StoreRemoteMedia');" >> $microblog_config_file
		echo "\$config['queue']['enabled'] = true;" >> $microblog_config_file
		echo "\$config['queue']['daemon'] = true;" >> $microblog_config_file
		echo "\$config['ostatus']['hub_retries'] = 3;" >> $microblog_config_file
	fi

	# This improves performance
	sed -i "s|//\$config\['db'\]\['schemacheck'\].*|\$config\['db'\]\['schemacheck'\] = 'script';|g" $microblog_config_file

	systemctl restart php5-fpm
	systemctl restart nginx

	freedombone-addemail -u $MY_USERNAME -e "noreply@$MICROBLOG_DOMAIN_NAME" -g gnusocial --public no

	# some post-install instructions for the user
	if ! grep -q $"Microblog administrator" /home/$MY_USERNAME/README; then
		echo '' >> /home/$MY_USERNAME/README
		echo '' >> /home/$MY_USERNAME/README
		echo $'Microblog' >> /home/$MY_USERNAME/README
		echo '=========' >> /home/$MY_USERNAME/README
		echo $"Microblog administrator nickname: $MY_USERNAME" >> /home/$MY_USERNAME/README
		echo $"Microblog administrator password: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
		chmod 600 /home/$MY_USERNAME/README
	fi

	if ! grep -q "Microblog onion domain" /home/$MY_USERNAME/README; then
		echo $"Microblog onion domain: ${MICROBLOG_ONION_HOSTNAME}" >> /home/$MY_USERNAME/README
		echo '' >> /home/$MY_USERNAME/README
		chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
		chmod 600 /home/$MY_USERNAME/README
	fi
	echo "GNU Social onion domain:${MICROBLOG_ONION_HOSTNAME}" >> $COMPLETION_FILE

	echo "GNU Social domain:$MICROBLOG_DOMAIN_NAME" >> $COMPLETION_FILE
	echo 'install_gnu_social' >> $COMPLETION_FILE
}

function install_gnu_social_plugin_sharings {
	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
		return
	fi

	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins ]; then
		echo $'No local/plugins directory found for the microblog'
		exit 72945
	fi

	# update to the next commit
	function_check set_repo_commit
	set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins "GNU Social sharings plugin commit" "$SHARINGS_COMMIT" $SHARINGS_REPO

	if grep -Fxq "install_gnu_social_plugin_sharings" $COMPLETION_FILE; then
		return
	fi

	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
	function_check git_clone
	git_clone $SHARINGS_REPO Sharings
	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings ]; then
		echo $'Unable to clone microblog sharings plugin'
		exit 36738
	fi

	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings
	git stash
	git checkout master
	git branch -D $SHARINGS_COMMIT
	git checkout $SHARINGS_COMMIT -b $SHARINGS_COMMIT

	# enable the plugin
	if ! grep -q "addPlugin('Sharings');" /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php; then
		echo "addPlugin('Sharings');" >> /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
	fi

	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
	php scripts/checkschema.php
	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings
	php scripts/seedsharings.php
	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
	php scripts/checkschema.php

	# Languages
	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings/locale/en/LC_MESSAGES
	msgfmt -o Sharings.mo Sharings.po
	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings/locale/en_GB/LC_MESSAGES
	msgfmt -o Sharings.mo Sharings.po
	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Sharings/locale/en_US/LC_MESSAGES
	msgfmt -o Sharings.mo Sharings.po

	chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs

	if ! grep -q "GNU Social sharings plugin commit" $COMPLETION_FILE; then
		echo "GNU Social sharings plugin commit:$SHARINGS_COMMIT" >> $COMPLETION_FILE
	else
		sed -i "s|GNU Social sharings plugin commit.*|GNU Social sharings plugin commit:$SHARINGS_COMMIT|g" $COMPLETION_FILE
	fi
	echo 'install_gnu_social_plugin_sharings' >> $COMPLETION_FILE
}

function install_gnu_social_plugin_sharings_theme {
	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
		return
	fi

	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins ]; then
		echo $'No local/plugins directory found for the microblog'
		exit 74458
	fi

	# update to the next commit
	function_check set_repo_commit
	set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins "GNU Social sharings theme plugin commit" "$SHARINGS_THEME_COMMIT" $SHARINGS_THEME_REPO

	if grep -Fxq "install_gnu_social_plugin_sharings_theme" $COMPLETION_FILE; then
		return
	fi

	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
	function_check git_clone
	git_clone $SHARINGS_THEME_REPO SharingsTheme
	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/SharingsTheme ]; then
		echo $'Unable to clone microblog sharings plugin theme'
		exit 639253
	fi

	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/SharingsTheme
	git stash
	git checkout master
	git branch -D $SHARINGS_THEME_COMMIT
	git checkout $SHARINGS_THEME_COMMIT -b $SHARINGS_THEME_COMMIT

	# enable the plugin
	if ! grep -q "addPlugin('SharingsTheme');" /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php; then
		echo "addPlugin('SharingsTheme');" >> /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
	fi

	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
	php scripts/checkschema.php

	chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs

	if ! grep -q "GNU Social sharings plugin theme commit" $COMPLETION_FILE; then
		echo "GNU Social sharings plugin theme commit:$SHARINGS_THEME_COMMIT" >> $COMPLETION_FILE
	else
		sed -i "s|GNU Social sharings plugin theme commit.*|GNU Social sharings plugin theme commit:$SHARINGS_THEME_COMMIT|g" $COMPLETION_FILE
	fi
	echo 'install_gnu_social_plugin_sharings_theme' >> $COMPLETION_FILE
}

function expire_gnu_social_posts {
	# To prevent the database size from growing endlessly this script expires posts
	# after a number of months
	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
		return
	fi
	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
		return
	fi

	gnusocial_expire_script=/usr/bin/gnusocial-expire

	echo '<?php' > $gnusocial_expire_script
	echo '' >> $gnusocial_expire_script
	echo '// GNU Social post expiry script, based on StatExpire by Tony Baldwin' >> $gnusocial_expire_script
	echo '// https://github.com/tonybaldwin/statexpire' >> $gnusocial_expire_script
	echo '' >> $gnusocial_expire_script
	echo '$oldate=date(("Y-m-d"), strtotime("-3 months"));' >> $gnusocial_expire_script
	echo '$username="root";' >> $gnusocial_expire_script
	echo "\$password=trim(file_get_contents(\"$DATABASE_PASSWORD_FILE\"));" >> $gnusocial_expire_script
	echo '$database="gnusocial";' >> $gnusocial_expire_script
	echo '' >> $gnusocial_expire_script
	echo 'if (!$link = mysql_connect("localhost", $username, $password)) {' >> $gnusocial_expire_script
	echo '    echo "Could not connect to mariadb";' >> $gnusocial_expire_script
	echo '    exit;' >> $gnusocial_expire_script
	echo '}' >> $gnusocial_expire_script
	echo '' >> $gnusocial_expire_script
	echo 'if (!mysql_select_db($database, $link)) {' >> $gnusocial_expire_script
	echo '    echo "Could not select gnusocial database";' >> $gnusocial_expire_script
	echo '    exit;' >> $gnusocial_expire_script
	echo '}' >> $gnusocial_expire_script
	echo '' >> $gnusocial_expire_script
	echo "\$notice_query=\"DELETE FROM notice WHERE created <= '\$oldate 01:01:01'\";" >> $gnusocial_expire_script
	echo "\$conversation_query=\"DELETE FROM conversation WHERE created <= '$oldate 01:01:01'\";" >> $gnusocial_expire_script
	echo "\$reply_query=\"DELETE FROM reply WHERE modified <= '\$oldate 01:01:01'\";" >> $gnusocial_expire_script
	echo '' >> $gnusocial_expire_script
	echo 'mysql_query($notice_query);' >> $gnusocial_expire_script
	echo '$rowaff1=mysql_affected_rows();' >> $gnusocial_expire_script
	echo 'mysql_query($conversation_query);' >> $gnusocial_expire_script
	echo '$rowaff2=mysql_affected_rows();' >> $gnusocial_expire_script
	echo 'mysql_query($reply_query);' >> $gnusocial_expire_script
	echo '$rowaff3=mysql_affected_rows();' >> $gnusocial_expire_script
	echo 'mysql_close();' >> $gnusocial_expire_script
	echo '' >> $gnusocial_expire_script
	echo 'echo "Expire GNU Social posts: $rowaff1 notices, $rowaff2 conversations, and $rowaff3 replies deleted from database.\n";' >> $gnusocial_expire_script
	chmod +x $gnusocial_expire_script

	# Add a cron job
	if ! grep -q "$gnusocial_expire_script" /etc/crontab; then
		echo "10 3 5   *   *   root /usr/bin/timeout 500 /usr/bin/php $gnusocial_expire_script" >> /etc/crontab
	fi

	# remove old expire script
	if [ -f /etc/cron.weekly/clear-microblog-database ]; then
		rm /etc/cron.weekly/clear-microblog-database
	fi
}

function install_gnu_social_theme {
	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
		return
	fi

	# update to the next commit
	function_check set_repo_commit
	set_repo_commit /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter "GNU Social theme commit" "$MICROBLOG_THEME_COMMIT" $MICROBLOG_THEME_REPO

	# customise with project logo
	if [ -f /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter/img/sprite.png ]; then
		if [ -f ~/freedombone/img/gnusocial_sprite.png ]; then
			cp ~/freedombone/img/gnusocial_sprite.png /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter/img/sprite.png
		fi
	fi

	if grep -Fxq "install_gnu_social_theme" $COMPLETION_FILE; then
		return
	fi

	apt-get -y install wget

	if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins ]; then
		mkdir -p /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
	fi

	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins
	function_check git_clone
	git_clone $MICROBLOG_THEME_REPO Qvitter
	cd /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter
	git checkout $MICROBLOG_THEME_COMMIT -b $MICROBLOG_THEME_COMMIT

	# download a custom background image
	MICROBLOG_BACKGROUND_IMAGE_URL_EXT=
	if [ $MICROBLOG_BACKGROUND_IMAGE_URL ]; then
		if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".jpeg" || $$MICROBLOG_BACKGROUND_IMAGE_URL == *".jpg" ]]; then
			MICROBLOG_BACKGROUND_IMAGE_URL_EXT="jpg"
		fi
		if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".png" ]]; then
			MICROBLOG_BACKGROUND_IMAGE_URL_EXT="png"
		fi
		if [[ $$MICROBLOG_BACKGROUND_IMAGE_URL == *".gif" ]]; then
			MICROBLOG_BACKGROUND_IMAGE_URL_EXT="gif"
		fi
		if [ $MICROBLOG_BACKGROUND_IMAGE_URL_EXT ]; then
			wget $MICROBLOG_BACKGROUND_IMAGE_URL -O img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}
			if [ ! -f img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT} ]; then
				echo "$MICROBLOG_BACKGROUND_IMAGE_URL"
				echo $'Custom background image for microblog could not be downloaded'
				exit 87524
			fi
		fi
	fi

	microblog_config_file=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/config.php
	if ! grep -q "addPlugin('Qvitter')" $microblog_config_file; then
		MICROBLOG_WELCOME_MESSAGE=$(echo $MICROBLOG_WELCOME_MESSAGE | sed "s|\$MICROBLOG_DOMAIN_NAME|$MICROBLOG_DOMAIN_NAME|g")
		echo "" >> $microblog_config_file
		echo "// Qvitter settings" >> $microblog_config_file
		echo "addPlugin('Qvitter');" >> $microblog_config_file
		echo "\$config['site']['qvitter']['enabledbydefault'] = true;" >> $microblog_config_file
		echo "\$config['site']['qvitter']['defaultbackgroundcolor'] = '#f4f4f4';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['defaultlinkcolor'] = '#0084B4';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['timebetweenpolling'] = 30000; // 30 secs" >> $microblog_config_file
		echo "\$config['site']['qvitter']['urlshortenerapiurl'] = 'http://qttr.at/shortener.php';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['urlshortenersignature'] = 'b6afeec983';" >> $microblog_config_file
		if [ $MICROBLOG_BACKGROUND_IMAGE_URL ]; then
			echo "\$config['site']['qvitter']['sitebackground'] = 'img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}';" >> $microblog_config_file
		else
			echo "\$config['site']['qvitter']['sitebackground'] = 'img/vagnsmossen.jpg';" >> $microblog_config_file
		fi
		echo "\$config['site']['qvitter']['favicon'] = 'img/favicon.ico?v=4';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['sprite'] = Plugin::staticPath('Qvitter', '').'img/sprite.png?v=40';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['enablewelcometext'] = true;" >> $microblog_config_file
		echo "\$config['site']['qvitter']['customwelcometext']['en'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['customwelcometext']['de'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['customwelcometext']['fr'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['customwelcometext']['es'] = '$MICROBLOG_WELCOME_MESSAGE';" >> $microblog_config_file
		echo "\$config['site']['qvitter']['blocked_ips'] = array();" >> $microblog_config_file
	else
		if [ $MICROBLOG_BACKGROUND_IMAGE_URL_EXT ]; then
			if [ -f img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT} ]; then
				sed -i "s|\$config['site']['qvitter']['sitebackground'].*|\$config['site']['qvitter']['sitebackground'] = 'img/custom.${MICROBLOG_BACKGROUND_IMAGE_URL_EXT}';|g" $microblog_config_file
			fi
		fi
	fi

	# customise with project logo
	if [ -f /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter/img/sprite.png ]; then
		if [ -f ~/freedombone/img/gnusocial_sprite.png ]; then
			cp ~/freedombone/img/gnusocial_sprite.png /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/local/plugins/Qvitter/img/sprite.png
		fi
	fi

	if ! grep -q "GNU Social theme commit" $COMPLETION_FILE; then
		echo "GNU Social theme commit:$MICROBLOG_THEME_COMMIT" >> $COMPLETION_FILE
	fi

	chown -R www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs

	echo 'install_gnu_social_theme' >> $COMPLETION_FILE
}

function install_gnu_social_markdown {
	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
		return
	fi

	MICROBLOG_PATH=/var/www/$MICROBLOG_DOMAIN_NAME/htdocs

	# update to the next commit
	function_check set_repo_commit
	set_repo_commit $MICROBLOG_PATH/local/plugins/Markdown "GNU Social Markdown commit" "$MICROBLOG_MARKDOWN_COMMIT" $MICROBLOG_MARKDOWN_REPO

	if grep -Fxq "install_gnu_social_markdown" $COMPLETION_FILE; then
		return
	fi

	if [ -d $MICROBLOG_PATH/local/plugins/Markdown ]; then
		rm -rf $MICROBLOG_PATH/local/plugins/Markdown
	fi

	if [ ! -d $MICROBLOG_PATH/local/plugins ]; then
		mkdir -p $MICROBLOG_PATH/local/plugins
	fi

	cd $MICROBLOG_PATH/local/plugins
	function_check git_clone
	git_clone $MICROBLOG_MARKDOWN_REPO Markdown
	cd $MICROBLOG_PATH/local/plugins/Markdown
	git checkout $MICROBLOG_MARKDOWN_COMMIT -b $MICROBLOG_MARKDOWN_COMMIT

	microblog_config_file=$MICROBLOG_PATH/config.php
	if ! grep -q "addPlugin('Markdown'" $microblog_config_file; then
		echo "" >> $microblog_config_file
		echo "// Markdown settings" >> $microblog_config_file
		echo "addPlugin('Markdown');" >> $microblog_config_file
	fi

	if ! grep -q "GNU Social Markdown commit" $COMPLETION_FILE; then
		echo "GNU Social Markdown commit:$MICROBLOG_MARKDOWN_COMMIT" >> $COMPLETION_FILE
	fi

	chown -R www-data:www-data $MICROBLOG_PATH

	echo 'install_gnu_social_markdown' >> $COMPLETION_FILE
}

# NOTE: deliberately there is no "exit 0"
