#!/bin/bash version=0.4.2 date="18/07/2017" projet="Kyodev" contact="https://framagit.org/kyodev/kyopages/issues" script="getFirefox" urlScript="https://framagit.org/kyodev/kyopages/raw/master/scripts/getFirefox" urlNotice="https://kyodev.frama.io/kyopages/scripts/getFirefox/" user_agent="Mozilla/5.0 (X11; Linux $(uname -m); rv:54.0) Gecko/20100101 Firefox/54.0" ##### license LPRAB/WTFPL # auteurs: kyodev # contibuteurs: - ##### PATH='/bin:/usr/bin' ; IFS=' ' #### définition couleurs ----------------------------------------------- YELLOW=`printf "\033[0;33m"` # ? GREEN=`printf "\033[0;32m"` # ok BLUE=`printf "\033[0;34m"` # info COLOR=`printf "\033[0m"` # standard RED=`printf "\033[0;31m"` # alerte #### entete ============================================================ clear echo "$BLUE" cat << 'EOF' _ _____ _ __ __ _ ___| |_| ___(_)_ __ ___ / _| _____ __ / _' |/ _ \ __| |_ | | '__/ _ \ |_ / _ \ \/ / | (_| | __/ |_| _| | | | | __/ _| (_) > < \__, |\___|\__|_| |_|_| \___|_| \___/_/\_\ |___/ EOF echo -e "$YELLOW pour Debian, version $version - $date\n$COLOR" #### fonctions diverses ================================================ # detect system architecture, assign $architecture : linux | linux64, return 1 on unknown architecture f__architecture(){ case "$(uname -m)" in amd64 | x86_64 ) architecture="linux64";; i?86 | x86 ) architecture="linux";; * ) case "$(getconf LONG_BIT)" in 64 ) architecture="linux64";; 32 ) architecture="linux";; *) return 1 esac ;; esac } # user ayant initié la session graphique, assigne $user_, testé avec mate, gnome # sortie script sur erreur, gestion variable environnement pour personnaliser l'user avec: # USER_INSTALL=user script f__user(){ # user_ via variable en environnement test "$USER_INSTALL" && user_="$USER_INSTALL" # sudo ou gnome: uid test "$SUDO_UID" && user_id="$SUDO_UID" || user_id="$(echo "$XAUTHORITY" | grep -Eo '[0-9]+')" # si user_ vide, extraction classique user dans XAUTHORITY, donc priorité à $USER_INSTALL test "$user_" || user_="$(echo "$XAUTHORITY" | cut -d "/" -f 3)" # si user_id, extraction via passwd test "$user_id" && user_="$(grep "$user_" /etc/passwd | cut -d ":" -f 1 )" # derniers tests, home existant ou user_ défini if [ "$user_" ]; then ls "/home/$user_" &>/dev/null || f__error "répertoire /home/$user_ INEXISTANT" else f__error "user indéterminé" " lancer le script avec:\n\tUSER_INSTALL=user $0" fi } #test dépendances (commandes disponibles), $1 liste commandes f__requis(){ for i in "$@"; do if [ ! "$(which $i)" ]; then testDepends="ko" f__info "$RED vous devez avoir la commande $i pour exploiter ce script" fi done [ -z "$testDepends" ] || f__error "Paquets manquants" " Contacter administrateur pour disposer de ces commandes" } # test wget, $1 url à tester, retourne url testée & entêtes f__testWget(){ echo " $1" wget -Sq --tries=1 --timeout=15 --user-agent="$user_agent" -O /dev/null "$1" f__error "Erreur wget" " réessayer et si persistance, contacter $projet $contact" " en indiquant les messages précédents." } # test validité archive, $1 fichier (bzip2), assigne $archive_detect, return 1 si invalide f__testArchive(){ file -b "$1" | grep 'bzip2 compressed data' &>/dev/null && archive_detect="bzip2" || return 1 } # sortie sur erreur, log $1 si upgrade f__error() { #affichage $1 en rouge, $1++ optionnels en bleu, sortie du script, log $1 si upgrade echo -e "\n$RED Erreur critique: $1 $COLOR" for (( i=2 ; i<=$# ; i++ )); do echo -e " $BLUE${!i}"; done echo "$COLOR" if [ "$opType" == "upgrade" ]; then logger --id -p user.err "$script $version: $1"; fi exit 1 } # affichage information, log $1 si upgrade f__info() { # tous les paramètres en ligne en couleur bleue, accepte \n, ligne vide à la fin for (( i=1 ; i<=$# ; i++ )); do echo -e " $BLUE${!i}"; done echo "$COLOR" if [ "$opType" == "upgrade" ]; then logger --id -p user.info "$1"; fi } # root? return 0 else 1 f__root(){ if [ $EUID -eq 0 ]; then return 0; else return 1; fi } #### fonctions script ================================================== # install du script dans le système fscript_install(){ # si script inexistant ou inaccessible en écriture, ou si cronAnacron non installé: root requis if [ ! -w "/opt/bin/$script" ] || [ ! -e "/home/$user_/.mozilla/$script.anacrontab" ]; then f__root || f__error "vous devez être ROOT pour installer ce script dans le système" if [ "$(which dpkg)" ]; then # on vire 'firefox-esr' si installé dpkg --get-selections | grep '^firefox-esr[[:space:]]' &>/dev/null && apt-get remove firefox-esr fi # install /opt mkdir -p /opt/bin/ ln -s /opt/bin/"$script" /usr/local/bin/"$script" &>/dev/null cp -d "$(basename $0)" "/opt/bin/$script" chmod a+rwx "/opt/bin/$script" chown "$user_": "/opt/bin/$script" # cron/anacron install fscript_cronAnacron install else # maj en user (upgrade manuel ou auto) chmod a+rwx "$(basename $0)" chown "$user_": "$(basename $0)" cp -d "$(basename $0)" "/opt/bin/$script" fi [ -f "$script"_changelog.md ] || rm "$(basename $0)" &>/dev/null ## on efface pas si changelog (dev) f__info "$GREEN$script installé dans le système." "maintenant, appel du script par:$GREEN $script$BLUE (sans ./)" exit 0 } # suppression du script dans le système fscript_remove(){ f__root || f__error "vous devez être ROOT pour supprimer ce script dans le système" # suppression de /opt rm /opt/bin/"$script" &>/dev/null unlink /usr/local/bin/"$script" &>/dev/null # cron/anacron remove fscript_cronAnacron remove f__info "$GREEN$script supprimé du système." } # version script en ligne, assigne $versionScript, $uptd_script=""|ko, fscript_version(){ versionScript="$(wget -q --tries=2 --timeout=15 --user-agent="$user_agent" -O - "$urlScript" | grep '^version=' | cut -d '=' -f 2)" if [ "$version" != "$versionScript" ]; then f__info "version script en ligne: $versionScript, mise à jour possible" uptd_script="ko" else uptd_script=""; fi } # mise à jour script si dispo fscript_dl(){ if [ "$uptd_script" != "ko" ]; then return 0; fi dirTemp="/tmp/$script-$RANDOM/" mkdir -p "$dirTemp" wget -q --show-progress --tries=2 --timeout=15 --user-agent="$user_agent" -O "$dirTemp$script" "$urlScript" if [ "$?" != "0" ]; then f__testWget "$urlScript"; fi chmod a+rwx "$dirTemp$script" chown "$user_": "$dirTemp$script" cp -d "$dirTemp$script" /opt/bin/"$script" rm -rf "$dirTemp" echo ""; f__info "$script mis à jour en version $versionScript" } #inscription dans tache upgrade en cron hebdomadaire, une partie requiert root fscript_cronAnacron(){ case "$1" in "install" ) # table anacron echo "7 05 getFF nice /opt/bin/$script upgrade &>/dev/null" > "/home/$user_/.mozilla/$script.anacrontab" ## test: anacron journalier: echo "1 05 getFF nice /opt/bin/$script upgrade &>/dev/null" >> "/home/$user_/.mozilla/$script.anacrontab" chown "$user_": "/home/$user_/.mozilla/$script.anacrontab" # création spool anacron utilisateur mkdir -p "/home/$user_/.config/anacron/spool" chown "$user_": "/home/$user_/.config/anacron/spool" # cron tab pour activation horaire anacron echo "@hourly $user_ /usr/sbin/anacron -t /home/$user_/.mozilla/$script.anacrontab -S /home/$user_/.config/anacron/spool" >> /etc/crontab ;; "remove" ) [ -e "/home/$user_/.config/anacron/spool/getFF" ] && rm "/home/$user_/.config/anacron/spool/getFF" sed -i "/^\@hourly.*$script.anacrontab.*$/d" /etc/crontab rm "/home/$user_/.mozilla/$script.anacrontab" ;; esac } # ascii art godzilla ffx_godzilla(){ printf "$RED" cat << 'EOF' _.-~-. 7'' Q..\ _7 (_ _7 _/ _q. / _7 . ___ /VVvv-'_ . 7/ / /~- \_\\ '-._ .-' / // ./ ( /-~-/||'=.__ '::. '-~'' { ___ / // ./{ V V-~-~| || __''_ ':::. ''~-~.___.-'' _/ // / {_ / { / VV/-~-~-|/ \ .'__'. '. ':: _ _ _ ''. / /~~~~||VVV/ / \ ) \ _ __ ___ ___ ___(_) | | __ _ .::' / (~-~-~\\.-' / \' \::::. | '_ ' _ \ / _ \_ / | | |/ _' | :::' /..\ /..\__/ ' '::: | | | | | | (_) / /| | | | (_| | ::' vVVv vVVv ': |_| |_| |_|\___/___|_|_|_|\__,_| '' EOF echo "$COLOR" } # affichage help ffx_help(){ printf $BLUE cat << 'EOF' ---------------------------------------------------------------------- ./getFirefox : installation du script dans le système getFirefox +latest : installation Firefox Release getFirefox +aurora : installation de Firefox Developer Edition getFirefox +nightly : installation de Firefox Nightly getFirefox +esr : installation de Firefox ESR ---- getFirefox -latest : désinstallation Firefox Release getFirefox -aurora : désinstallation Firefox Developer Edition getFirefox -nightly : désinstallation Firefox Nightly getFirefox -esr : désinstallation Firefox ESR ---- getFirefox version : version en ligne Firefox Release & ESR getFirefox upgrade : mise à jour forcée du script ---- getFirefox sysremove : désinstallation du script du système EOF printf "$COLOR" cat << 'EOF' ---------------------------------------------------------------------- Ce script doit être exécuté avec les droits ROOT pour les installations et les désinstallations. FERMER et DESINSTALLER un Firefox existant avant d'installer un nouveau canal Il désinstallera le *paquet Debian* firefox-esr si présent. ---------------------------------------------------------------------- EOF } # sauvegarde profil ffx_sauveProfil(){ cp -a "/home/$user_".mozilla/firefox/ "/home/$user_".mozilla/"$(date -u +%Y%m%d-%H%M%S)"/ #revoir en fonction des canaux installés } # création lanceur ffx_lanceur(){ rm -f /usr/share/applications/firefox-"$product".desktop cat << "EOF" >> /usr/share/applications/firefox-"$product".desktop #!/usr/bin/env xdg-open [Desktop Entry] EOF echo -e "Name=Firefox $product\nName[fr]=Firefox $product" >> /usr/share/applications/firefox-"$product".desktop echo -e "X-GNOME-FullName=Firefox-$product Web Browser\nX-GNOME-FullName[fr]=Firefox-$product Navigateur Web" >> /usr/share/applications/firefox-"$product".desktop echo -e "StartupWMClass=Firefox-$product" >> /usr/share/applications/firefox-"$product".desktop echo -e "Exec=/opt/firefox-$product/firefox %u" >> /usr/share/applications/firefox-"$product".desktop echo -e "Icon=/opt/firefox-$product/browser/icons/mozicon128.png" >> /usr/share/applications/firefox-"$product".desktop cat << "EOF" >> /usr/share/applications/firefox-"$product".desktop Comment=Browse the World Wide Web Comment[fr]=Naviguer sur Internet GenericName=Web Browser GenericName[fr]=Navigateur Web Terminal=false X-MultipleArgs=false Type=Application Categories=Network;WebBrowser; MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/vnd.mozilla.xul+xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https; StartupNotify=true EOF } # version Firefox en ligne, $verLatest, $verEsr, $versionInstall, $urlOnline, si $1="quiet", pas d'affichage version en ligne ffx_versionFF(){ urlOnline="https://www.mozilla.org/en-US/firefox/notes/" stockUrlOnline="$(wget -q --tries=2 --timeout=15 --user-agent=$user_agent -O - $urlOnline)" verLatest="$(echo $stockUrlOnline | grep -Eo 'data-latest-firefox="[0-9\.]+"' | grep -Eo '[0-9\.]+')" verEsr="$(echo $stockUrlOnline | grep -Eo 'data-esr-versions="[0-9\.]+"' | grep -Eo '[0-9\.]+')" versionInstall="-" if [ -x /opt/firefox-latest/firefox ]; then versionInstall+="\n Release: $(/opt/firefox-latest/firefox -v | grep -Eo '[0-9].*')"; fi if [ -x /opt/firefox-esr/firefox ]; then versionInstall+="\n ESR: $(/opt/firefox-esr/firefox -v | grep -Eo '[0-9].*')"; fi if [ -x /opt/firefox-aurora/firefox ]; then versionInstall+="\n Aurora: $(/opt/firefox-aurora/firefox -v | grep -Eo '[0-9].*')"; fi if [ -x /opt/firefox-nightly/firefox ]; then versionInstall+="\n Nightly: $(/opt/firefox-nightly/firefox -v | grep -Eo '[0-9].*')"; fi if [ "$1" != "quiet" ]; then f__info "Firefox installé(s): $versionInstall"; fi if [ "$1" != "quiet" ]; then f__info "Version Firefox en ligne:\n Release: $verLatest\n ESR: $verEsr"; fi } # install firefox, $1 canal à installer ffx_install(){ # f__root || f__error "vous devez être ROOT pour installer Firefox" ffx_godzilla f__info "installation Firefox-$product" #ffx_versionFF "quiet" f__architecture # calcul $file, $recup_url, affichage version pendant l'install file="firefox-$product.$architecture.tar.bz2" if [ "$product" == "latest" ]; then recup_url="https://download.mozilla.org/?product=firefox-$product&os=$architecture&lang=fr" elif [ "$product" == "esr" ]; then recup_url="https://download.mozilla.org/?product=firefox-$product-latest&os=$architecture&lang=fr" else recup_url="https://download.mozilla.org/?product=firefox-$product-latest-l10n-ssl&os=linux&lang=fr" ;fi # dossier temporaire de travail, création $dirTemp # dirTemp="/tmp/$script-$RANDOM/" dirTemp="/tmp/getFirefox-12201/" mkdir -p "$dirTemp" # chargement f__info "téléchargement..." # wget -q -c --show-progress --tries=2 --timeout=15 --user-agent="$user_agent" -O "$dirTemp$file" "$recup_url" # if [ "$?" != "0" ]; then f__testWget "$recup_url"; fi f__testArchive "$dirTemp$file" || f__error "Le fichier $dirTemp$file n'est pas une archive tar.gz valide" # décompression archive f__info "décompression...." tar -xaf "$dirTemp$file" -C "$dirTemp" f__info "installation...." exit # on déplace le répertoire firefox en /opt rm -rf /opt/firefox-"$product"/ mkdir -p /opt/firefox-"$product"/ mv -f "$dirTemp"firefox/* /opt/firefox-"$product"/ #ménage rm -rf "$dirTemp" #sauvegarde du profil ffx_sauveProfil # préparer profile.ini #ffx_profile # install lanceur ffx_lanceur # lien pixmap ln -sf /opt/firefox-"$product"/browser/chrome/icons/default/default48.png /usr/share/pixmaps/firefox-"$product".png # # alternatives, trop intrusif pour plusieurs versions simultanées? # update-alternatives --quiet --install /usr/bin/firefox-"$product" x-www-browser /opt/firefox-"$product"/firefox 100 #grep -Ec '\[Profile' ~/.mozilla/firefox/profiles.ini -> 2 #firefox -P nightly # test sans alternatives, et avec liens dans /usr/bin pour latest en tant que firefox if [ "$product" == "latest" ]; then ln -sf /opt/firefox-"$product"/firefox /usr/bin/firefox; fi # the end f__info "$GREEN Firefox-$product installé." if [ $product == "nightly" ]; then f__info "pour savoir comment participer au développement:\nhttps://nightly.mozfr.org/participer/"; fi } # désinstallation de firefox ffx_remove(){ f__root || f__error "vous devez être ROOT pour désinstaller" ffx_godzilla if [ ! -e /usr/share/applications/firefox-"$product".desktop ]; then f__info "$GREEN" "Firefox-$product n'est pas installé." return 0 fi # suppression du répertoire firefox en /opt if [ -d "/opt/firefox-$product/" ]; then rm -rf "/opt/firefox-$product/"; fi # suppression du lanceur rm -f /usr/share/applications/firefox-"$product".desktop # suppression lien pixmap unlink /usr/share/pixmaps/firefox-"$product".png &>/dev/null # suppression alternatives si existantes if update-alternatives --display x-www-browser &>/dev/null; then update-alternatives --display x-www-browser | grep firefox-"$product" &>/dev/null && update-alternatives --quiet --remove x-www-browser /opt/firefox/firefox-"$product" fi f__info "$GREEN" "Firefox-$product désinstallé." } ### début script ======================================================= #initialisation f__architecture || f__error "Architecture non supportée" f__user f__requis "wget" "logger" "file" "tar" # installation du script si pas dans le système dirname "$0" | grep 'bin' &>/dev/null || fscript_install [ "$1" != "sysremove" ] && [ -e "/opt/bin/$script" ] && ls -l "/opt/bin/$script" | grep 'root' &>/dev/null && f__error "bug sécu 01" \ "veuillez désinstaller le script et le réinstaller" "voir: $urlNotice#supprimer-le-script" case "$1" in "sysremove" ) fscript_remove ;; # désinstallation du script "version" ) ffx_versionFF fscript_version ffx_godzilla ;; # affiche versions FF en ligne & installée & version script "upgrade" ) opType="upgrade" fscript_version fscript_dl ;; # upgrade script si maj possible +latest | +esr | +aurora | +nightly ) f__error "script en cours de refonte, installations non permise aujourd'hui" product="$(echo $1 | sed 's/+//')" ffx_install ;; # installation plugin -latest | -esr | -aurora | -nightly ) product="$(echo $1 | sed 's/-//')" ffx_remove ;; # désinstallation plugin "manuel" ) f__error "option pas encore implémentée" ffx_manuelInstall "$2" ;; # install manuelle d'un chargement * ) ffx_help ;; # affichage help par défaut esac exit 0