#!/bin/bash
#
######################################################################
### TYPO3 Update Script ##############################################
######################################################################
#
#--[ LIZENZ ]---------------------------------------------------------
#
# Copyright (c) 2009 Peter Kraume <pk@k-w-s.net>
# All rights reserved.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
#--[ README ]---------------------------------------------------------
#
# Dieses Script ist für ein semi-automatisches Update von TYPO3
# Installationen bei domainfactory, insbesondere dem Reseller Tool RP
# gedacht. Hauptanwendungsbereich ist die Installation von Bugfix
# Releases von TYPO3.
#
# Funktionen aus dem Install Tool, z.B. das setzen von
# [SYS][compat_version] oder ein compare im Database Analyzer werden
# durch das Script NICHT übernommen!
#
# Was macht das Script genau?
# - Runterladen des gewünschten Source von typo3.org
# - entpacken des Source
# - Source Tarball wieder löschen
# - .htaccess Dateien für mod_expires durch umbennnen aktivieren
# - alten Symlink im Dummy Verzeichnis löschen
# - neuen Symlink anlegen
# - index.php aus Source Verzeichnis in Dummy Verzeichnis kopieren
# - temp_CACHED_* Dateien aus /typo3conf löschen
#
# Die Nutzung dieses Scripts erfolgt auf eigene Gefahr! Vor jedem
# Update sind Backups anzufertigen!
#
#
#--[ Installation / Nutzung ]-----------------------------------------
#
# Voraussetzung ist eine Symlink Installation von TYPO3 und ein SSH
# Zugang. Per Default wird davon ausgegangen, dass der TYPO3 Source in
# der Regel immer in einem Unterverzeichnis des in der Variablen
# SRC_DIR bezeichneten Verzeichnisses gespeichert ist.
# Desweiteren wird davon ausgegangen, dass sich dieses Shell Script im
# Ordner unterhalb des Document Roots befindet. Das Dummy Verzeichnis
# läßt sich über die Variable DUMMY_DIR anpassen.
# Über die Variablen läßt sich das Script leicht an eigene Bedürfnisse
# anpassen.
#
# Das Script muss in jede RP Instanz kopiert werden, da bei df kein
# zentraler Zugriff auf alle TYPO3 Instanzen möglich ist.
#
# Um das Script nutzen zu können muss es ausführbar gemacht werden:
# 	chmod +x t3update.sh
#
# Aufruf des Scripts:
#	./t3update.sh
#
#
#--[ CHANGELOG ]------------------------------------------------------
#
# 09.02.2009
# 	* Release von Version 0.3
#	* Prüfung, ob Source Download erfolgreich war
#   * index.php aus Source Verzeichnis in Dummy Verzeichnis kopieren
#
# 21.01.2009
# 	* Release von Version 0.2 (erste öffentliche Version)
#	* Finetuning
#	* temp_CACHED_ Dateien aus typo3conf löschen
#	* weitere erklärende Texte im Script Header
#
# 21.01.2009
# 	* Release von Version 0.1
#
#
#--[ TODO ]-----------------------------------------------------------
#
#	* Abfrage, ob mod_expires aktiviert werden soll
#	* cli_dispatch.phpsh ändern, so dass es bei df funktioniert
#
#---------------------------------------------------------------------



#--[ Variablen ]------------------------------------------------------

SRC_DIR=${HOME}"/source/"
DUMMY_DIR=${PWD}"/live/"

TYPO3_SRC_URL_PREFIX="http://prdownloads.sourceforge.net/typo3/"
TYPO3_SRC_URL_SUFFIX=".tar.gz?download"
TYPO3_SRC_FILE_PREFIX="typo3_src-"
TYPO3_SRC_FILE_SUFFIX=".tar.gz"

VERSION=0.3

#--[ Funktionen ]-----------------------------------------------------

# erzeugt Eingabeaufforderung
prompt() {
    echo
    echo $1
    echo -n "> "
    read inputvalue
}

echoStatus() {
    echo
    echo "-----[" $1 "]-----"
}

# TYPO3 Source von typo3.org holen und entpacken
getTYPO3source() {
    # SRC_DIR abfragen
    prompt "Soll als Source Verzeichnis ${SRC_DIR} verwendet werden? (Y/n):"
    
    case ${inputvalue} in
	    N|n)
		setSrcDir
	    ;;
    esac
    
    # prüfen, ob SRC_DIR gültig ist
    if [ ! -d ${SRC_DIR} ]; then
		echo "Fehler: der angegebene Pfad ist ungültig!"
		setSrcDir
    fi
    
    # prüfen, ob TYPO3 nicht vielleicht schon runtergeladen wurde
    if [ -d ${TYPO3_SRC_TOTAL} ]; then
		echoStatus "TYPO3 Source existiert bereits, Download wird übersprungen"
		return
    fi

    cd ${SRC_DIR}

    echoStatus "Hole Source von typo3.org"
    echo
    wget -nc ${TYPO3_SRC_URL}

	# prüfen, ob der Source erfolgreich runtergeladen wurde
	if [ ! -f ${TYPO3_SRC_FILE} ]; then
		echoStatus "Fehler: Download des Source fehlgeschlagen!";
		exit;
	fi

    echoStatus "Entpacke Source"
    tar xzf ${TYPO3_SRC_FILE}
    
    echoStatus "Lösche Tarball"
    rm -f ${TYPO3_SRC_FILE}
    
    echoStatus "Aktiviere .htaccess Dateien für mod_expires"
    cd ${TYPO3_SRC_FILE_PREFIX}${TYPO3_VER}
    mv -v typo3/gfx/_.htaccess typo3/gfx/.htaccess
    mv -v typo3/mod/user/ws/_.htaccess typo3/mod/user/ws/.htaccess
    mv -v typo3/sysext/_.htaccess typo3/sysext/.htaccess
    mv -v typo3/sysext/t3skin/stylesheets/_.htaccess typo3/sysext/t3skin/stylesheets/.htaccess
    
    echoStatus "Neue TYPO3 Version "${TYPO3_VER}" geladen und entpackt"
}

# eigentliches Update durchführen
updateTYPO3() {
    # DUMMY_DIR abfragen
    prompt "Soll als Dummy Verzeichnis ${DUMMY_DIR} verwendet werden? (Y/n):"
    
    case ${inputvalue} in
	    N|n)
		setDummyDir
	    ;;
    esac
    
    # prüfen, ob DUMMY_DIR gültig ist
    if [ ! -d ${DUMMY_DIR}typo3_src/ ]; then
		echo "Fehler: Keine TYPO3 Installation im gewünschten Pfad gefunden!"
		setDummyDir
    fi
    
    cd ${DUMMY_DIR}
    
    echoStatus "Lösche alten Symlink"
    unlink typo3_src
    
    echoStatus "Setze neuen Symlink"
    ln -s ${TYPO3_SRC_TOTAL} typo3_src
	
	echoStatus "Kopiere index.php ins Dummy Verzeichnis"
	rm -f index.php
	cp -f typo3_src/index.php ./
	
	echoStatus "Lösche temp_CACHED_* Dateien aus /typo3conf"
	cd typo3conf
	rm -fv temp_CACHED_*
    
    echoStatus "TYPO3 Update erfolgreich abgeschlossen!"
}

# neues SRC_DIR setzen
setSrcDir() {
    prompt "Bitte bestehenden Pfad, beginnend bei ${HOME}, eingeben:"
    
    # Slash am Anfang einfügen, wenn keiner da ist
    if [ ! "${inputvalue:0:1}" == "/" ]; then inputvalue="/"${inputvalue}; fi

    # Slash am Ende anhängen, wenn keiner da ist
    if [ ! "${inputvalue:(-1)}" == "/" ]; then inputvalue=${inputvalue}"/"; fi
    
    # wenn angegebener Pfad ungültig ist, Funktion erneut aufrufen
    if [ ! -d ${HOME}${inputvalue} ]; then
	echo "Fehler: der angegebene Pfad ist ungültig!"
	setSrcDir
    else
	SRC_DIR=${HOME}${inputvalue}
    fi
}

# neues DUMMY_DIR setzen
setDummyDir() {
    prompt "Bitte bestehenden Pfad, beginnend bei ${HOME}, eingeben:"
    
    # Slash am Anfang einfügen, wenn keiner da ist
    if [ ! "${inputvalue:0:1}" == "/" ]; then inputvalue="/"${inputvalue}; fi

    # Slash am Ende anhängen, wenn keiner da ist
    if [ ! "${inputvalue:(-1)}" == "/" ]; then inputvalue=${inputvalue}"/"; fi
    
    # wenn angegebener Pfad ungültig ist, Funktion erneut aufrufen
    if [ ! -d ${HOME}${inputvalue} ]; then
	echo "Fehler: der angegebene Pfad ist ungültig!"
	setDummyDir
    else
	DUMMY_DIR=${HOME}${inputvalue}
    fi
}

#--[ los gehts ]------------------------------------------------------
clear
echo
echo "**********************************************************************"
echo "*                                                                    *"
echo "* TYPO3 Update Script ${VERSION}                                            *"
echo "* Copyright (c) 2009 Peter Kraume <pk@k-w-s.net>                     *"
echo "*                                                                    *"
echo "**********************************************************************"

prompt "Auf welche Version soll das Update von TYPO3 erfolgen? (z.B. 4.2.4): "

TYPO3_VER=${inputvalue}
TYPO3_SRC_FILE=${TYPO3_SRC_FILE_PREFIX}${TYPO3_VER}${TYPO3_SRC_FILE_SUFFIX}
TYPO3_SRC_URL=${TYPO3_SRC_URL_PREFIX}${TYPO3_SRC_FILE_PREFIX}${TYPO3_VER}${TYPO3_SRC_URL_SUFFIX}
TYPO3_SRC_TOTAL=${SRC_DIR}${TYPO3_SRC_FILE_PREFIX}${TYPO3_VER}/

prompt "Soll der neue Source von typo3.org geladen werden? (Y/n):"

case ${inputvalue} in
	N|n)
	    echoStatus "Download wird übersprungen"
		
		# SRC_DIR abfragen
		prompt "Soll als Source Verzeichnis ${SRC_DIR} verwendet werden? (Y/n):"
		
		case ${inputvalue} in
			N|n)
				setSrcDir
			;;
		esac
		
		# prüfen, ob SRC_DIR gültig ist
		if [ ! -d ${SRC_DIR} ]; then
			echo "Fehler: der angegebene Pfad ist ungültig!"
			setSrcDir
		fi
		
		TYPO3_SRC_TOTAL=${SRC_DIR}${TYPO3_SRC_FILE_PREFIX}${TYPO3_VER}/
	;;
	*)
	    getTYPO3source
	;;
esac

updateTYPO3

echo
exit 0