#!/bin/sh set -eu FRIENDICA_VERSION=${FRIENDICA_VERSION:-develop} FRIENDICA_ADDONS=${FRIENDICA_ADDONS:-develop} AUTOINSTALL=${AUTOINSTALL:-false} SOURCEDIR=/usr/src WORKDIR=/var/www/html # change delimiter for arrays from whitespaces to newlines (so we can pass strings with whitespaces) #IFS=\r\n VERBOSE=1 for arg; do case "$arg" in -q|--quit) if [ "$VERBOSE" -eq "2" ]; then echo 'You cannot use verbose and quiet at the same time' exit 1 fi VERBOSE=0 break ;; -v|--verbose) if [ "$VERBOSE" -eq "0" ]; then echo 'You cannot use verbose and quiet at the same time' exit 1 fi VERBOSE=2 break ;; esac done # run an command with the www-data user run_as() { if [ "$(id -u)" = 0 ]; then su - www-data -s /bin/sh -c "$1" else sh -c "$1" fi } # log event log() { currVerb=1 if [ $# -eq 2 ]; then currVerb=$2 fi if [ "$VERBOSE" -ge "$currVerb" ]; then echo "$1" fi } # checks if the the first parameter is greater than the second parameter version_greater() { [ "$(printf '%s\n' "$@" | sort -t '.' -n -k1,1 -k2,2 | head -n 1)" != "$1" ] } # clones the whole develop branch (Friendica and Addons) clone_develop() { dir="${1:-$SOURCEDIR}" friendica="${2:-$FRIENDICA_VERSION}" addons="${3:-$FRIENDICA_ADDONS}" friendica_git=$friendica addons_git=$addons if echo "$friendica" | grep -Eq '^.*\-dev'; then friendica_git="develop" fi if echo "$addons" | grep -Eq '^.*\-dev'; then addons_git="develop" fi log 'Cloning Friendica '\'$friendica_git\'' with Addons '\'$addons_git\'' into '\'$dir\' # Removing the whole directory first rm -fr $dir/friendica sh -c "git clone -q -b ${friendica_git} https://github.com/friendica/friendica ${dir}/friendica" mkdir $dir/friendica/addon sh -c "git clone -q -b ${addons_git} https://github.com/friendica/friendica-addons ${dir}/friendica/addon" } # help of this shell script friendica_help() { echo "Usage: friendica []" echo "" echo "Commands:" echo " console Executes an command in the Friendica console" echo " composer Executes the composer.phar executable for Friendica" echo " install Installs Friendica" echo " update Updates Friendica" exit 0 } # executes the Friendica console console() { cd $WORKDIR # Todo starting a php-executable without quoting the arguments seems not secure (but is the only way it works) sh -c "php $WORKDIR/bin/console.php $@" } # executes the composer.phar binary of Friendica composer() { if [ -f $WORKDIR/bin/composer.phar ]; then run_as "cd $WORKDIR;$WORKDIR/bin/composer.phar $@ -d $WORKDIR" fi } copy_sources() { installed_version="0.0.0.0" if [ -f ${WORKDIR}/VERSION ]; then installed_version="$(cat ${WORKDIR}/VERSION)" fi if echo "$FRIENDICA_VERSION" | grep -Eq '^.*(\-dev|-rc)'; then clone_develop fi image_version="0.0.0.0" if [ -f $SOURCEDIR/friendica/VERSION ]; then image_version="$(cat $SOURCEDIR/friendica/VERSION)" else # no given installation and not using the developer branch => nothing to do log 'Friendica command '\'$1\'' failed, because of no version found', 0 exit 1; fi if version_greater "$installed_version" "$image_version"; then log 'Can'\''t copy Friendica sources because the version of the data ($installed_version) is higher than the docker image ('$image_version')', 0 exit 1; fi if version_greater "$image_version" "$installed_version"; then if [ "$(id -u)" = 0 ]; then rsync_options="-rlDog --chown=www-data:root" else rsync_options="-rlD" fi log 'Copying Friendica sources ('$image_version') from '\'$SOURCEDIR'/friendica'\'' to '\'$WORKDIR\' rsync $rsync_options --delete --exclude=.git --exclude=photo --exclude=proxy --exclude=.htconfig.php $SOURCEDIR/friendica/ $WORKDIR/ if [ -f $WORKDIR/view/smarty3 ]; then chmod 777 $WORKDIR/view/smarty3 fi fi } # install Friendica install() { if [ -f ${WORKDIR}/VERSION ]; then # If there is a given installation of Friendica and we should not update it => exit # We have to explicit update Friendica to avoid breaking something return fi copy_sources log 'Installing Friendica' if echo "$FRIENDICA_VERSION" | grep -Eq '^.*(\-dev|-rc)'; then composer "install" fi if [ ! -f ${WORKDIR}/.htconfig.php ] && [ -f ${SOURCEDIR}/config/htconfig.php ] && "$AUTOINSTALL" == "true"; then run_as "cp ${SOURCEDIR}/config/htconfig.php ${WORKDIR}/html/.htconfig.php" # TODO Pull Request for dba Change run_as "sed -i 's/\s+\sDNS_CNAME//g' ${WORKDIR}/include/dba.php" console "autoinstall -f .htconfig.php" # TODO Workaround because of a strange permission issue rm -fr ${WORKDIR}/view/smarty3/compiled fi } update() { if [ ! -f ${WORKDIR}/VERSION ]; then # We want to update a given installation # if there is no installation, exit return fi copy_sources log 'Upgrading Friendica' if echo "$FRIENDICA_VERSION" | grep -Eq '^.*(\-dev|-rc)'; then composer "install" fi console "dbstructure update" } sendmail() { if [ ! -f /etc/init.d/sendmail ]; then # If sendmail isn't installed, exit this method return fi line=$(head -n 1 /etc/hosts) line2=$(echo $line | awk '{print $2}') echo "$line $line2.localdomain" >> /etc/hosts log 'Starting sendmail for Mail-Support' nohup /etc/init.d/sendmail start > /dev/null 2>&1 & } if [ $# -eq 0 ]; then friendica_help exit 0 fi case "$1" in install) shift; install "$@";; update) shift; update "$@" ;; console) shift; console "$@" ;; composer) shift; composer "$@" ;; sendmail) shift; sendmail "$@" ;; *) friendica_help ;; esac