#!/bin/bash
|
|
|
|
setup()
|
|
{
|
|
export LC_ALL=C
|
|
MY_PATH="`dirname \"$0\"`"
|
|
MY_PATH="`( cd \"$MY_PATH\" && pwd )`"
|
|
. $MY_PATH/tim-common
|
|
}
|
|
|
|
usage()
|
|
{
|
|
cat << EOF
|
|
TIM - Tiki Instance Manager
|
|
usage: $0 -c <command>[:subcommand] -u <user> -g <git branch> -t <svn tag> -i <instance id>
|
|
|
|
OPTIONS:
|
|
-h Show this message
|
|
-c Command (one of: create, destroy, snapshot, debug, info[:versions|diskspace], update, reset)
|
|
-i id of instance
|
|
-u username on Tiki.org
|
|
-U userid on Tiki.org
|
|
-r GIT Repository
|
|
-g GIT Branch
|
|
-t SVN Tag (Tiki version)
|
|
-p admin password (simple passwords only)
|
|
-P Subdirectory path
|
|
EOF
|
|
}
|
|
|
|
while getopts “hc:i:t:u:U:p:P:s:g:r:” OPTION
|
|
do
|
|
case $OPTION in
|
|
h)
|
|
usage
|
|
exit 1
|
|
;;
|
|
c)
|
|
# SSH always passes -c, so we catch it
|
|
# maybe we can use it later
|
|
COMMAND=$(echo "$OPTARG" | tr A-Z a-z | sed -e 's/[^a-z:]//g' | sed -e 's/:.*//')
|
|
# TODO: Have a regex that does this correctly without the need for the unset hack
|
|
SUBCOMMAND=$(echo "$OPTARG" | tr A-Z a-z | sed -e 's/[^a-z:]//g' | sed -e 's/[^:]*:\(.*\)/\1/')
|
|
if [ "$SUBCOMMAND" = "$COMMAND" ]; then unset SUBCOMMAND; fi
|
|
;;
|
|
i)
|
|
ID=$(echo "$OPTARG" | sed -e 's/[^0-9]//g')
|
|
;;
|
|
g)
|
|
GITBRANCH="$OPTARG"
|
|
;;
|
|
t)
|
|
SVNTAG=$(echo "$OPTARG" | sed -e 's/[^a-zA-Z0-9.]//g')
|
|
;;
|
|
u)
|
|
TUSER=$(echo "$OPTARG" | tr A-Z a-z | sed -e 's/[^a-z]//g')
|
|
if [[ $TUSER == "" ]] ; then TUSER="user"; fi
|
|
;;
|
|
U)
|
|
TUSERID=$(echo "$OPTARG" | sed -e 's/[^0-9]//g')
|
|
;;
|
|
p)
|
|
APASSWORD=$(echo "$OPTARG" | sed -e 's/[^a-zA-Z0-9.]//g')
|
|
;;
|
|
P)
|
|
TPATH="$OPTARG"
|
|
;;
|
|
r)
|
|
GITREP="$OPTARG"
|
|
;;
|
|
?)
|
|
usage
|
|
exit
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z $COMMAND ]]
|
|
then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $GITREP ]]
|
|
then
|
|
GITREP='https://gitlab.com/tikiwiki/tiki.git'
|
|
fi
|
|
|
|
setup
|
|
|
|
debug()
|
|
{
|
|
echo "COMMAND: $COMMAND"
|
|
echo "GITREP: $GITREP"
|
|
echo "GITBRANCH: $GITBRANCH"
|
|
echo "SVNTAG: $SVNTAG"
|
|
echo "TUSER: $TUSER"
|
|
echo "TUSERID: $TUSERID"
|
|
echo "TPATH: $TPATH"
|
|
echo "ID: $ID"
|
|
}
|
|
|
|
destroy()
|
|
{
|
|
startlog
|
|
log "Dropping database"
|
|
mysql -e "DROP DATABASE $DB;" && echo "DATABASE $DB suppressed" || echo "ERROR: database $DB not suppressed"
|
|
|
|
log "Removing webroot"
|
|
rm -r $INSTANCE_DIR && echo "FILES in $INSTANCE_DIR suppressed" || echo "ERROR: FILES in $INSTANCE_DIR not suppressed"
|
|
|
|
# No use logging after this point as we log into the webroot
|
|
if [[ -f $INSTANCE_LOCK ]]
|
|
then
|
|
rm $INSTANCE_LOCK && echo "LOCK file removed" || echo "ERROR: LOCK file could not be removed"
|
|
fi
|
|
}
|
|
|
|
reset()
|
|
{
|
|
startlog
|
|
# Use detected database name unless there is none, then use expected
|
|
# If detected and expected don't match, display warning
|
|
# If none, display error and abort
|
|
if [[ "$DB_DETECTED" != "$DB" ]]
|
|
then
|
|
echo -n "WARNING: Detected database (${DB_DETECTED}) does not match expected database (${DB})."
|
|
if [[ ! -z "${DB_DETECTED}" ]]
|
|
then
|
|
DB_RESET="${DB_DETECTED}"
|
|
echo " Using detected database."
|
|
else
|
|
DB_RESET="${DB}"
|
|
echo " Using expected database."
|
|
fi
|
|
else
|
|
if [[ -z "${DB_DETECTED}" ]]
|
|
then
|
|
echo "ERROR: Coud not find database to reset"
|
|
return 1
|
|
else
|
|
DB_RESET="${DB_DETECTED}"
|
|
fi
|
|
fi
|
|
[[ -z $DB_DETECTED ]] && echo "WARNING: Could not detect database for instance"
|
|
if [[ -z "${APASSWORD}" ]]; then APASSWORD="12345"; fi
|
|
mysql -e "UPDATE users_users SET hash= md5('${APASSWORD}') WHERE login='admin';" $DB_DETECTED && echo "SUCCESS: Admin password reset to ${APASSWORD} in database ${DB_DETECTED}" || echo "ERROR: admin password not reset in database ${DB_DETECTED}"
|
|
}
|
|
|
|
update()
|
|
{
|
|
startlog
|
|
echo "UPDATE" > $INSTANCE_LOCK
|
|
cd $INSTANCE_DIR
|
|
|
|
if [[ ! -z $GITBRANCH ]]
|
|
then
|
|
log "GIT pull"
|
|
git pull
|
|
else
|
|
log "Doing SVN upgrade (just in case)"
|
|
svn upgrade
|
|
log "SVN upping"
|
|
svn up
|
|
fi
|
|
|
|
log "Running setup.sh"
|
|
sh setup.sh -u $TIM_USER -g $TIM_GROUP -n fix
|
|
log "Running php console.php database:update (database upgrade)"
|
|
php console.php database:update
|
|
mk_info
|
|
rm $INSTANCE_LOCK
|
|
}
|
|
|
|
info()
|
|
{
|
|
if [[ ! -z "${SUBCOMMAND}" ]]
|
|
then
|
|
case $SUBCOMMAND in
|
|
versions)
|
|
echo "INFO: List of available versions"
|
|
cd $SVN_CACHE
|
|
VERSIONSLIST=$(ls *.tar.gz | sed -e 's/\.tar\.gz//' | sort -V -r | uniq)
|
|
echo "LIST: "${VERSIONSLIST}
|
|
;;
|
|
diskspace)
|
|
echo "INFO: Disk partitions occupation"
|
|
# Remove those which are not actually partitions
|
|
df -h | grep -v '^tmpfs' | grep -v '^rootfs' | grep -v '^udev'
|
|
;;
|
|
*)
|
|
echo "ERROR: Sub command unknown/forbidden. Valid sub commands are: versions diskspace"
|
|
;;
|
|
esac
|
|
else
|
|
cd $WEBROOT
|
|
if [[ -z $TUSERID ]] && [[ -z $ID ]]
|
|
then
|
|
echo "INFO: List of all user IDs with currently live sites"
|
|
cd $WEBROOT; for i in *-*-*; do echo $i| cut -d'-' -f2; done | sort -n | uniq
|
|
elif [[ ! -z $TUSERID ]] && [[ -z $ID ]]
|
|
then
|
|
echo "INFO: List of active sites for userID $TUSERID "
|
|
for site in *-${TUSERID}-*; do echo $site ; done | sort -n
|
|
else
|
|
echo "INFO: Status of subdomain "
|
|
if [[ $(ls -d -1 *-${TUSERID}-${ID} 2>/dev/null | wc -l ) == 0 ]]
|
|
then
|
|
echo "STATUS: NONE"
|
|
elif [[ $(ls -d -1 *-${TUSERID}-${ID} 2>/dev/null | wc -l ) == 1 ]]
|
|
then
|
|
SUBDOMAIN=$(ls -d -1 *-${TUSERID}-${ID})
|
|
if [[ -e $INSTANCE_LOCK ]]
|
|
then
|
|
echo "STATUS: $INSTANCE_LOCK_REASON"
|
|
else
|
|
echo "STATUS: ACTIVE"
|
|
grep Version $WEBROOT/$SUBDOMAIN/info.txt | sed -e 's/Version/VERSION/'
|
|
fi
|
|
if [[ ! -z $TUSER ]] && [[ "${SUBDOMAIN}" != "$TUSER-$TUSERID-$ID" ]]
|
|
then
|
|
echo "WARNING: The subdomain found ( ${SUBDOMAIN} ) does not match the subdomain queried ( $TUSER-$TUSERID-$ID )"
|
|
fi
|
|
echo "SITE: ${SUBDOMAIN}.show.tiki.org "
|
|
elif [[ $(ls -d -1 *-${TUSERID}-${ID} 2>/dev/null | wc -l ) > 1 ]]
|
|
then
|
|
SUBDOMAIN=$(ls -d -1 *-${TUSERID}-${ID})
|
|
if [[ ! -z $TUSER ]] && [[ -d "$TUSER-$TUSERID-$ID" ]]
|
|
then
|
|
if [[ -e $INSTANCE_LOCK ]]
|
|
then
|
|
BEINGBUILT=$(/bin/cat "${INSTANCE_LOCK}")
|
|
if [[ "${BEINGBUILT}" == "${TUSER}" ]]
|
|
then
|
|
echo "STATUS: BUILDING"
|
|
else
|
|
echo "STATUS: ACTIVE"
|
|
fi
|
|
else
|
|
echo "STATUS: ACTIVE"
|
|
fi
|
|
echo "WARNING: There are more than one site matching *-${TUSERID}-${ID}."
|
|
echo "SITE: ${TUSER}-${TUSERID}-${ID}.show.tiki.org "
|
|
else
|
|
echo "FAIL: There are more than one site matching *-${TUSERID}-${ID}. Please provide the -u username parameter to select among the following."
|
|
echo "${SUBDOMAIN}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Commands white-listing, so we do not pass any remotely provided command
|
|
# Also, more flexibility for handling different commands differently (like create is too long)
|
|
case ${COMMAND} in
|
|
create)
|
|
# TODO: Check INSTANCE_DIR not exists
|
|
if [[ -z $TUSERID ]] && ([[ -z $SVNTAG ]] || ([[ -z $GITBRANCH ]] && [[ -z $GITREP ]]))
|
|
then
|
|
echo "FAIL: Missing parameters"
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
echo "START: ${COMMAND}"
|
|
echo "SITE: ${SUBDOMAIN}.show.tiki.org "
|
|
echo "LOG: http://${SUBDOMAIN}.show.tiki.org/install_log.txt (available after a delay)"
|
|
if [[ -d $INSTANCE_DIR ]];
|
|
then
|
|
echo "FAIL: Instance exists"
|
|
exit 1
|
|
fi
|
|
# This is simply too long for synchronous feedback
|
|
if [[ ! -z $GITBRANCH ]]
|
|
then
|
|
$PREFIX/tim-create -r "$GITREP" -g "$GITBRANCH" -u "$TUSER" -U "$TUSERID" -i "$ID" &
|
|
else
|
|
$PREFIX/tim-create -t "$SVNTAG" -u "$TUSER" -U "$TUSERID" -i "$ID" &
|
|
fi
|
|
exit 0
|
|
;;
|
|
destroy)
|
|
# TODO: Check INSTANCE_DIR exists
|
|
if [[ -z $TUSERID ]] || [[ -z $ID ]]
|
|
then
|
|
usage
|
|
exit 1
|
|
fi
|
|
echo "START: ${COMMAND}"
|
|
echo "SITE: ${SUBDOMAIN}.show.tiki.org "
|
|
${COMMAND}
|
|
echo "END: ${COMMAND}"
|
|
exit 0
|
|
;;
|
|
debug)
|
|
echo "START: ${COMMAND}"
|
|
${COMMAND}
|
|
echo "END: ${COMMAND}"
|
|
exit 0
|
|
;;
|
|
date)
|
|
echo "START: ${COMMAND}"
|
|
${COMMAND}
|
|
echo "END: ${COMMAND}"
|
|
exit 0
|
|
;;
|
|
info)
|
|
echo "START: ${COMMAND}"
|
|
${COMMAND}
|
|
echo "END: ${COMMAND}"
|
|
exit 0
|
|
;;
|
|
reset)
|
|
if [[ -z $TUSERID ]] || [[ -z $ID ]]
|
|
then
|
|
usage
|
|
exit 1
|
|
fi
|
|
if [[ ! -e "$INSTANCE_DIR" ]] ; then echo "FAIL: $INSTANCE_DIR not found. It is not possible to reset a non-existing website."; exit 0; fi
|
|
echo "START: ${COMMAND}"
|
|
${COMMAND}
|
|
echo "END: ${COMMAND}"
|
|
exit 0
|
|
;;
|
|
snapshot)
|
|
if [[ -z $TUSERID ]] || [[ -z $ID ]]
|
|
then
|
|
usage
|
|
exit 1
|
|
fi
|
|
if [[ ! -e "$INSTANCE_DIR" ]] ; then echo "FAIL: $INSTANCE_DIR not found. It is not possible to snapshot a non-existing website."; exit 0; fi
|
|
echo "START: ${COMMAND}"
|
|
echo "LOG: http://${SUBDOMAIN}.show.tiki.org/last_snapshot_log.txt (available after a delay)"
|
|
#${COMMAND}
|
|
nohup $PREFIX/tim-snapshot -u $TUSER -U $TUSERID -i $ID 1>$INSTANCE_DIR/last_snapshot_log.txt 2>&1 &
|
|
# TODO: Show links
|
|
exit 0
|
|
;;
|
|
update)
|
|
if [[ -z $TUSERID ]] || [[ -z $ID ]]
|
|
then
|
|
usage
|
|
exit 1
|
|
fi
|
|
echo "START: ${COMMAND}"
|
|
${COMMAND}
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Command unknown/forbidden"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 1
|