You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

356 lines
11 KiB

#!/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