Betaversionen von Firefox nutzen

Auch auf in stabilen Desktopumgebung wie Debian (Stable) möchte ich persönlich nicht auf aktuellste Browserversionen von Mozilla nutzen. Prinzipbedingt kann hier Debian mit seinen Standard-Repositories nichts bieten. Auch eine Installation aus dem SID-Zweig von Debian (Debian Unstable) hinkt leider der aktuellen Entwicklung des Browser von Mozilla noch hinterher.

Hier kann nur die direkte Installation aus den Mozilla Archiv einer Betaversion von Firefox weiterhelfen. Im Verzeichnis releases sind alle jemals veröffentlichten Firefoxversionen in einem jeweiligen Unterverzeichnis mit der Versionsnummer abgelegt auch die Betaversionen.

Die Betaversionen von Firefox werden nach folgenden Schema benamt:

Majorversion.Minorversion.BetaversionNr

Wobei es immer neun Betaversionen im Laufe des Entwicklungszykluses gibt.

53.0b1, 53.0b2, … ,53.0b9

Will ich also die aktuellste Betaversion installieren gehe auf der Webseite des Mozilla Archives in das Verzeichnis 53.0.b9. Dort sind die verschieden Plattformen für die der Browser verfügbar ist aufgelistet. In meinem Fall ist das Unterverzeichnis linux-x86_64 das richtige. Danach kommen die jeweiligen verfügbaren Sprachversionen, hier wählen ich das de Unterverzeichnis aus. Hier finde ich ein komprimiertes bz2-Archiv mit dem Namen firefox-53.0b9.tar.bz2 das ich mit einem Klick auf die rechte Maustaste downloaden kann.

Da das Archiv nicht mit dem Paketmanager des System (hier: dpkg/apt) installierbar ist, muss man es manuell an geeigneten Ort auspacken. Hierzu bietet sich im HOME-Verzeichnis das Verzeichnis $HOME/opt an.

Da die Betaversionen in recht zügiger Reihenfolge veröffentlicht werden habe ich diese Installation mit einem Script automatisiert.

Mein sebstentwickltes Shellscript installiert als User oder root die aktuellste Betaversion des Firefox herunter und installiert das Archiv unter $HOME/opt (User) oder /opt (root). Mit nachfolgenden Aufruf auf der Kommandozeile wird dies erledigt.

$ ./run_download-ff.sh -i

Will man eine spezielle Betaversion oder auch eine Releaseversion installieren kann man dies der Option -s bewerkstelligen.

$ ./run_download-ff.sh -s 53.0b2

$ ./run_download-ff.sh -s 52.0.2

Will man eine alte Version wieder löschen benutzt man die Option -p.

$ ./run_download-ff.sh -p 53.0b8

Alle verfügbaren Firefoxversionen bekommt man mit der Option -a.

$ ./run_download-ff.sh -a

Die aktuellste verfügbare bzw, die aktuellste lokal installierte Version listet die Option -v.

$ ./run_download-ff.sh -v

Eine kurze Hilfe zu den einzelnen Optionen erhält man mit der Option -h.

$ ./run_download-ff.sh -h

Nachfolgend das Listing des Shellscriptes run_download-ff.sh oder hier der Downloadlink.


#!/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=$(curl -s $DOWNLOADSITE | awk '{print $9,$11}' | egrep '^[0-9]{1,2}.[0-9](.[0-9]{1,2}b[0-9]{1,2}|b[0-9]{1,2})[^-]' | sort -t"." -n -k1,2 -k3 | tail -1 | cut -d" " -f1)
    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=$(curl -s $DOWNLOADSITE | awk '{print $9,$11}' | egrep "latest" | head -1 | cut -d" " -f2)
    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](.[0-9]{1,2}b[0-9]{1,2}|b[0-9]{1,2})[^-]' | sed 's|/||g' | egrep -w $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)
    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