#!/bin/bash # ################ Variablenbelegung ################## ERRORMESSAGE="Achtung - Diese Option ist nicht verfuegbar" LOCAL_PATH="/tmp" DOWNLOADSITE="http://archive.mozilla.org/pub/firefox/releases/" PLATFORM="linux-$(uname -m)" LANGUAGE="de" EXECUTE_USER=$(id -u) ################### Funktionen ###################### do_print_version() { echo " --> Installtion als Benutzer "$USER" im Verzeichnis: "$INST_PATH echo " --> Aktuellste downloadbare Firefox Beta-Version (Mozilla): "$DOWNLOAD_VERSION echo " --> Aktuellste downloadbare Firefox Release-Version (Mozilla): "$DOWNLOAD_VERSION_RELEASE echo " --> Aktuellste installierte Firefox Version (lokal): "$INSTALLED_VERSION } do_check_instdir() { if [ $EXECUTE_USER -eq 0 ] then if [ ! -d "$INST_PATH" ] then mkdir -p "$INST_PATH" fi elif [ $EXECUTE_USER -ne 0 ] then if [ ! -d "$INST_PATH" ] then mkdir -p "$INST_PATH" fi fi } do_set_env() { if [ $EXECUTE_USER -eq 0 ] then INST_PATH="/opt" LINK_DIR="/opt/firefox" elif [ $EXECUTE_USER -ne 0 ] then INST_PATH="$HOME/opt" LINK_DIR="$HOME/opt/firefox" fi do_check_instdir } do_get_installed_version() { if [ -h "$LINK_DIR" ] then echo " Ermittle Versionnummer von lokalen Firefox ..." INSTALLED_VERSION=$(basename $(stat --format="%N" $LINK_DIR | cut -d" " -f3 | sed "s/'//g")) do_print_okay_fail $? elif [ -d "$LINK_DIR" ] then echo " $LINK_DIR ist kein Link, sondern ein Verzeichnis. Firefox kann nicht installiert werden" do_print_okay_fail 1 exit 1 elif [ ! -e "$LINK_DIR" ] then echo " Firefox ist nicht vorhanden und kann installiert werden ..." INSTALLED_VERSION="" do_print_okay_fail $? else echo " Die aktuellste installierte lokale Firefox Version ist nicht ermittelbar" do_print_okay_fail 2 exit 2 fi } do_get_all_installed_versions() { if [ -L $LINK_DIR ] then echo " Ermittle alle lokal installierten Versionen von Firefox ..." ls -dgo --time-style=long-iso "$LINK_DIR"* | awk '{if ($7 != "") print " --> [LINK] "$6" --> "$8; else print " --> [DIR] "$6}' else echo " Firefox ist nicht vorhanden" INSTALLED_VERSION="" do_print_okay_fail 2 fi } do_get_version() { # Beta-Versionen suchen # findet auch Beta-Versionen ala 38.0b1 oder 38.0.5b1 LATEST_VERSION=$(wget -qnv -O - $DOWNLOADSITE | html2text | awk '{print $2}' | egrep '^[0-9]{1,2}.[0-9](.[0-9]{1,2}b[0-9]{1,2}|b[0-9]{1,2})[^-]'| sort --version-sort | tail -1 | sed 's|/||g') DOWNLOAD_VERSION="firefox-$LATEST_VERSION" # Release-Version suchen LATEST_VERSION_RELEASE=$(wget -qnv -O - $DOWNLOADSITE | html2text | awk '{print $2}' | egrep -v '[a-z]' | sed 's|/||g' | sort -t"." -n -k1,2 -k3 | tail -1) DOWNLOAD_VERSION_RELEASE="firefox-$LATEST_VERSION_RELEASE" } do_get_special_version() { echo " Ermittle Versionnummer von angebenen Firefox ..." # ungueltige Eingabe abfangen (letztes Zeichen ".") LENGTH=${#OPTARG} LAST_OPTARG=${OPTARG:LENGTH-1:1} if [ "$LAST_OPTARG" = "." ] then do_print_okay_fail 8 fi # angegebene Version suchen # Variable OPTARG (angegebene Version) bearbeiten. Punkte mit Backslash entwerten OPTARG_TMP=${OPTARG//./\\.} LATEST_VERSION=$(wget -qnv -O - $DOWNLOADSITE | html2text | awk '{print $2}' | egrep '^[0-9]{1,2}.[0-9]' | sed 's|/||g' | egrep -w $OPTARG_TMP\$) if [ "$LATEST_VERSION" ] then DOWNLOAD_VERSION="firefox-$LATEST_VERSION" elif [ "$LATEST_VERSION" = "" ] then do_print_okay_fail 9 fi } do_list_all_available_versions() { wget -qnv -O - $DOWNLOADSITE | html2text | awk '{print $2}' | egrep '^[0-9]{1,2}.[0-9]' | sed 's|/||g' | sort -t"." -n -k1,2 } do_download() { DOWNLOAD_FILE="firefox-$LATEST_VERSION.tar.bz2" DOWNLOAD_PATH="$DOWNLOADSITE$LATEST_VERSION/$PLATFORM/$LANGUAGE" echo " Mozilla Firefox $LATEST_VERSION wird heruntergeladen ins Verzeichnis $LOCAL_PATH ..." wget -q -P $LOCAL_PATH $DOWNLOAD_PATH/$DOWNLOAD_FILE do_print_okay_fail $? } do_uncompress() { echo " Datei $DOWNLOAD_FILE wird dekomprimiert ..." bzip2 -d $LOCAL_PATH/$DOWNLOAD_FILE do_print_okay_fail $? } do_print_okay_fail() { RC=$1 if [ $RC -eq 0 ] then echo " --> [OKAY]" elif [ $RC -eq 8 ] then echo " --> [WRONG ENTRY and EXIT]" exit 8 elif [ $RC -ne 0 ] then echo " --> [FAIL and EXIT]" exit 3 fi } do_inst_new_version() { TAR_FILE="firefox-$LATEST_VERSION.tar" echo " Link im Verzeichnis $INST_PATH entfernen ..." if [ -h $INST_PATH/firefox ] then rm $INST_PATH/firefox do_print_okay_fail $? fi echo " Archiv $LOCAL_PATH/$TAR_FILE entpacken ..." tar -xf $LOCAL_PATH/$TAR_FILE -C $INST_PATH do_print_okay_fail $? echo " Link setzen auf neue Version ..." mv $INST_PATH/firefox $INST_PATH/firefox-$LATEST_VERSION ln -s $INST_PATH/$DOWNLOAD_VERSION $INST_PATH/firefox do_print_okay_fail $? USERID=$(id -u) if [ $USERID -eq 0 ] then echo " Zugriffsrechte auf Installationsverzeichnis setzen ..." chmod 750 $INST_PATH/$DOWNLOAD_VERSION find $INST_PATH/$DOWNLOAD_VERSION -type d -exec chmod 750 {} \; do_print_okay_fail $? echo " Ownership auf Installationsverzeichnis setzen ..." chown -R root.users $INST_PATH/$DOWNLOAD_VERSION do_print_okay_fail $? fi } do_del_tmpfiles() { if [ -e $LOCAL_PATH/firefox-*.tar* ] then echo " Temporaere Archivdatei(en) loeschen..." rm $LOCAL_PATH/firefox-*.tar* do_print_okay_fail $? fi } do_can_del_version() { if [ -e $INST_PATH/$DEL_VERSION ] then RC=$? do_get_installed_version else RC=$? echo " Angegebene Version $DEL_VERSION ist nicht vorhanden" do_print_okay_fail $RC fi } do_get_linked_version() { LINKED_VERSION=$(basename $(stat --format="%N" $LINK_DIR | sed -e "s/[',>]//g" | cut -d" " -f3)) if [ "$DEL_VERSION" = "$LINKED_VERSION" ] then echo " Zu loeschende Version $DEL_VERSION ist aktuell auf die ausfuehrbare Version verlinkt" read -p " Trotzdem loeschen? (y/n): " DEL_FORCE if [ "$DEL_FORCE" = "y" ] then do_print_okay_fail 0 elif [ "$DEL_FORCE" = "n" ] then do_print_okay_fail 1 else echo " Ungueltige Eingabe" do_print_okay_fail 1 fi else echo " Zu loeschende Version $DEL_VERSION ist aktuell nicht verlinkt auf die ausfuehrbare Version" do_print_okay_fail 0 fi } do_purge_version() { REALY_FF="firefox-" REALY_DEL_VERSION=${DEL_VERSION:0:8} if [ "$REALY_FF" = "$REALY_DEL_VERSION" ] then rm -r $INST_PATH/$DEL_VERSION RC=$? echo " Version $DEL_VERSION loeschen ..." do_print_okay_fail $RC DEAD_LINK=$(symlinks $INST_PATH | egrep ^dangling | cut -d" " -f4) if [ "$DEAD_LINK" ] then symlinks -d $INST_PATH 1>/dev/null echo " Defekten Link in $INST_PATH loeschen" do_print_okay_fail 0 fi elif [ "$REALY_FF" != "$REALY_DEL_VERSION" ] then echo " Angebenes Verzeichnis $DEL_VERSION existiert darf aber nicht geloescht werden" do_print_okay_fail 1 fi } change_linkdir() { # Überprüfen ob generell ein Link vorhanden ist CHECK_LINK=$(symlinks $INST_PATH) if [ "$CHECK_LINK" = "" ] then ln -s $INST_PATH/$CHANGE_VERSION $INST_PATH/firefox RC=$? if [ $RC -eq 0 ] then do_print_okay_fail 0 elif [ $RC -ne 0 ] then do_print_okay_fail 1 fi fi # Überprüfen $INST_PATH/firefox ein symbolischer Link ist if [ -L "$INST_PATH/firefox" ] then # überprüfen ob angebene Version ein Verzeichnis ist if [ -d "$INST_PATH/$CHANGE_VERSION" ] then echo " Linkverzeichnis löschen ..." rm $INST_PATH/firefox RC=$? if [ $RC -eq 0 ] then do_print_okay_fail 0 elif [ $RC -ne 0 ] then do_print_okay_fail 1 fi echo " Neuen Link auf Version $CHANGE_VERSION setzen ..." ln -s $INST_PATH/$CHANGE_VERSION $INST_PATH/firefox RC=$? if [ $RC -eq 0 ] then do_print_okay_fail 0 elif [ $RC -ne 0 ] then do_print_okay_fail 1 fi else echo " $INST_PATH/$CHANGE_VERSION ist kein Verzeichnis oder nicht vorhanden" do_print_okay_fail 1 fi else echo " Verzeichnis $INST_PATH/firefox ist kein Link oder nicht vorhanden" do_print_okay_fail 1 fi } debug_var_show() { echo "--------------- Debuging Variablen ---------------" echo "" echo "LATEST_VERSION_RELEASE="$LATEST_VERSION_RELEASE echo "LATEST_VERSION="$LATEST_VERSION echo "DOWNLOAD_VERSION="$DOWNLOAD_VERSION echo "DOWNLOAD_VERSION_RELEASE="$DOWNLOAD_VERSION_RELEASE echo "INSTALLED_VERSION="$INSTALLED_VERSION echo "" echo "--------------------------------------------------" } usage() { echo "Syntax: $0 [-h|-v|-l|-a|-d|-i|-r|-s |-p |-c |-b]" echo "" echo "Das Script ermittelt die aktuellste verfuegbare Firefox Version von Mozilla, laedt es" echo "herunter und installiert es bzw. loescht die Version (als root oder User). Es wird" echo "jeweils ein symbolischer Link erstellt der von dem aktuellen Versionsverzeichnis" echo "unterhalb von /opt bzw. $HOME/opt auf das Verzeichnis firefox zeigt." echo "" echo " -h (help): diese Hilfeseite" echo " -v (version): zeigt die aktuellste verfuegbare Beta- und Releaseversion, sowie" echo " die aktuellste lokal installierte Version von Firefox an" echo " -l (list): listet alle lokal installierten Versionen von Firefox auf" echo " -a (availabel): listet alle verfuegbaren und installierbaren Versionen von Firefox auf" echo " -d (download): laedt die aktuellste verfuegbare Beta-Version von Firefox ins" echo " Verzeichnis /tmp herunter" echo " -i (install beta): installiert die aktuellste verfuegbare Beta-Version von Firefox" echo " im Verzeichnis /opt (als root oder User moeglich)" echo " -r (install release) installiert die aktuellste verfuegbare Release-Version von Firefox" echo " im Verzeichnis /opt (als root oder User moeglich)" echo " -s (special): installiert eine anzugebende Version von Firefox im Verzeichnis /opt" echo " (als root oder User moeglich)" echo " -c (change): setzt den Link (Quellverzeichnis firefox) des auf ein anderes" echo " Verzeichnis innerhalb des Installationsverzeichnisses" echo " -p (purge): eine vorhandene Installationsversion deinstallatieren" echo " -b (browse): im ftp-Verzeichnis von Mozilla browsen" echo "" } ################### Hauptprogramm ################### if [ $# -eq 0 ] then usage exit 4 fi while getopts hdirs:p:vlaic:b OPTION; do case $OPTION in h) usage ;; d) do_set_env do_get_version do_download ;; i) do_set_env do_del_tmpfiles do_get_version do_get_installed_version if [ "$DOWNLOAD_VERSION" != "$INSTALLED_VERSION" ] then do_download do_uncompress do_inst_new_version do_del_tmpfiles else echo " Die installierte Version von Firefox $INSTALLED_VERSION ist bereits die aktuellste" fi ;; r) do_set_env do_del_tmpfiles do_get_version do_get_installed_version if [ "$DOWNLOAD_VERSION_RELEASE" != "$INSTALLED_VERSION" ] then if [ -d "$INST_PATH/$DOWNLOAD_VERSION_RELEASE" ] then echo " Version $DOWNLOAD_VERSION_RELEASE existiert bereits und wird geloescht ..." rm -r $INST_PATH/$DOWNLOAD_VERSION_RELEASE do_print_okay_fail 0 fi LATEST_VERSION=$LATEST_VERSION_RELEASE DOWNLOAD_VERSION=$DOWNLOAD_VERSION_RELEASE do_download do_uncompress do_inst_new_version do_del_tmpfiles else echo " Die installierte Version von Firefox $INSTALLED_VERSION ist bereits vorhanden" fi ;; s) do_set_env do_del_tmpfiles do_get_special_version do_get_installed_version if [ "$DOWNLOAD_VERSION" != "$INSTALLED_VERSION" ] then do_download do_uncompress do_inst_new_version do_del_tmpfiles else echo " Die installierte Version von Firefox $INSTALLED_VERSION ist bereits vorhanden" fi ;; p) do_set_env DEL_VERSION="firefox-$OPTARG" do_can_del_version do_get_linked_version do_purge_version ;; v) do_set_env do_get_version do_get_installed_version do_print_version ;; l) do_set_env do_get_all_installed_versions ;; a) do_list_all_available_versions ;; c) CHANGE_VERSION="firefox-$OPTARG" do_set_env change_linkdir ;; b) elinks $DOWNLOADSITE ;; \?) echo $ERRORMESSAGE exit 99 ;; esac done shift `expr $OPTIND - 1` exit 0 # #EOF