#!/bin/bash version=2.8.1 date="30/07/2017" projet="simpledebian" contact="IRC freenode ##sdeb ou https://framagit.org/kyodev/kyopages/issues" script="getFlashPlayer" urlScript="https://framagit.org/kyodev/kyopages/raw/master/scripts/getFlashPlayer" urlNotice="https://kyodev.frama.io/kyopages/scripts/getFlashPlayer/" user_agent="Mozilla/5.0 (X11; Linux $(uname -m); rv:54.0) Gecko/20100101 Firefox/54.0" ##### license LPRAB/WTFPL # auteur: simpledebian # contributeurs: kyodev, coyotus, naguam ##### PATH='/bin:/usr/bin' ; IFS=' ' f__affichage(){ # définition couleurs YELLOW="$(printf "\033[0;33m")" # ? GREEN="$(printf "\033[0;32m")" # ok BLUE="$(printf "\033[0;34m")" # info RED="$(printf "\033[0;31m")" # alerte COLOR="$(printf "\033[0m")" # standard clear printf "$BLUE" cat << 'EOF' _ _____ _ _ ____ _ __ _ ___| |_| ___| | __ _ ___| |__ | _ \| | __ _ _ _ ___ _ __ / _' |/ _ \ __| |_ | |/ _' / __| '_ \| |_) | |/ _' | | | |/ _ \ '__| | (_| | __/ |_| _| | | (_| \__ \ | | | __/| | (_| | |_| | __/ | \__, |\___|\__|_| |_|\__,_|___/_| |_|_| |_|\__,_|\__, |\___|_| |___/ |___/ EOF echo -e "$YELLOW pour Firefox, version $version - $date$COLOR\n" } # user ayant initié la session graphique, assigne $user_, 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 "utilisateur indéterminé" " lancer le script avec:\n\tUSER_INSTALL=user $0" fi } # log spécifique, fichier log limité à 10000octets, $1 message à loguer f__log(){ if [ -w "$fileLogs" ]; then if [ "$(stat -c %s $fileLogs)" -ge "10000" ]; then echo "$(date +%Y%m%d\ %H%M%S) $1" &>/dev/null > "$fileLogs" else echo "$(date +%Y%m%d\ %H%M%S) $1" &>/dev/null >> "$fileLogs" fi fi } # affichage $1 en rouge, $1++ optionnels en bleu, sortie script sur erreur, log $1 si upgrade($opType) f__error() { 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 f__log "$script $version: $1"; fi exit 1 } # affichage des paramètres en bleu, ligne vide à la fin f__info() { for (( i=1 ; i<=$# ; i++ )); do echo -e " $BLUE${!i}"; done echo "$COLOR" } #test dépendances (commandes disponibles), $1 liste commandes f__requis(){ for i in $@; do if [ ! "$(which $i)" ]; then local 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" } # root? return 0 si root else 1 f__root(){ if [ $EUID == 0 ]; then return 0; else return 1; fi } # test wget, $1 url à tester, sortie script sur erreur f__wget_test(){ 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 (gzip), return 1 si invalide f__archive_test(){ file -b "$1" | grep -q 'gzip compressed data' || return 1 } # install du script dans le système fscript_install(){ f__root || f__error "vous devez être ROOT pour installer ce script dans le système" # si debian on vire 'flashplugin-nonfree' si installé if [ "$(which dpkg)" ]; then dpkg --get-selections | grep '[[:space:]]install' | grep -q '^flashplugin-nonfree[[:space:]]' \ && apt-get purge flashplugin-nonfree fi # install /opt mkdir -p /opt/bin/ ln -s "/opt/bin/$script" "/usr/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 # création fichier log touch "$fileLogs" chmod a+rwx "$fileLogs" chown "$user_": "$fileLogs" [ -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 ./)" f__log "$script $version installé dans le système" 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/bin/"$script" &>/dev/null unlink /usr/local/bin/"$script" &>/dev/null # ancienne localisation # cron/anacron remove fscript_cronAnacron remove f__info "$GREEN$script supprimé du système." f__log "$script $version supprimé du système" } # version script en ligne, assigne $versionScript, $script_aJour=ok|ko, fscript_get_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" script_aJour="ko" else script_aJour="ok"; fi } # mise à jour script si dispo fscript_dl(){ if [ "$script_aJour" == "ok" ]; then return 0; fi local dirTemp="/tmp/$script-$RANDOM/" mkdir -p "$dirTemp" wget -q --show-progress --tries=1 --timeout=15 --user-agent="$user_agent" -O "$dirTemp$script" "$urlScript" if [ "$?" != "0" ]; then f__wget_test "$urlScript"; fi chmod a+rwx "$dirTemp$script" chown "$user_": "$dirTemp$script" cp -d "$dirTemp$script" /opt/bin/"$script" rm -rf "$dirTemp" f__info "\n $script mis à jour en version $versionScript" f__log "$script mis à jour en version $versionScript" $0 upgrade #script mis à jour, on relance le script en upgrade pour le plugin exit 0 } # inscription dans tache upgrade en anacron hebdomadaire, via cron horaire fscript_cronAnacron(){ case "$1" in install ) if [ ! -e "$fileAnacron" ]; then # création répertoire plugin/ mkdir -p "$dirInstall" chown "$user_": "$dirInstall" # table anacron echo "7 15 getFP nice /opt/bin/$script upgrade &>/dev/null" > "$fileAnacron" ## test: anacron journalier: echo "1 05 getFPtest nice /opt/bin/$script upgrade &>/dev/null" >> "$fileAnacron" chown "$user_": "$fileAnacron" # 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 $fileAnacron -S /home/$user_/.config/anacron/spool" >> /etc/crontab fi ;; remove ) rm "/home/$user_/.config/anacron/spool/getFP"* &>/dev/null sed -i "/^\@hourly.*libflashplayer.anacrontab.*$/d" /etc/crontab rm "$fileAnacron" ;; esac } # version Flash en ligne & installée, si $1="quiet" pas d'affichage, $verFlash=x.y|na, $plugin_aJour=ok|ko fflash_get_version(){ local verInstall="$(strings $dirInstall/libflashplayer.so | grep -Eo '[0-9]+_[0-9]+_[0-9]+_[0-9]+' | sed 's/_/./g')" plugin_aJour="ok" verFlash="$(wget -q --tries=2 --timeout=15 --user-agent="$user_agent" -O - "$urlOnline" | \ sed -nr 's/^.*AUTO_ID.*Version[[:blank:]]+([0-9].*[0-9]).*$/\1/p')" || verFlash="na" if [ "$?" != "0" ]; then f__wget_test "$urlOnline"; fi # sortie script si erreur wget if [ $verFlash == "na" ]; then f__error "version FlashPlayer non accessible"; else [ "$1" == "quiet" ] || f__info "version FlashPlayer en ligne: $verFlash"; fi if [ -z "$verInstall" ]; then f__info "FlashPlayer non installé" elif [ "$verInstall" == "$verFlash" ]; then [ "$1" == "quiet" ] || f__info "FlashPlayer à jour" else plugin_aJour="ko" [ "$1" == "quiet" ] || f__info "version FlashPlayer installée: $verInstall, mise à jour possible" fi } # pas beau ce soft :( fflash_avertissement(){ cat << 'EOF' FlashPlayer n'est pas libre, c'est un programme propriétaire dont on ne peut pas connaître le code source, ni l'utiliser sans conditions, ni le distribuer librement. Il souffre de nombreuses vulnérabilités chroniques, depuis des années sans que l'éditeur fasse beaucoup d'efforts pour corriger cela... Il sera bloqué plus ou moins bloqué à terme pas les navigateurs majeurs, c'est à dire Firefox et Chrom(ium). Préparez vous à cela... EOF echo -e " voir:$GREEN https://developer.mozilla.org/fr/docs/Plugins/Roadmap$COLOR\n" } # affichage help fflash_help(){ printf "$BLUE" cat << 'EOF' ----------------------------------------------------------------------- ./getFlashPlayer : installation du script dans le système, en ROOT getFlashPlayer install : téléchargement & installation & update Flash getFlashPlayer remove : désinstallation de FlashPlayer getFlashPlayer version : version en ligne de FlashPlayer getFlashPlayer upgrade : MAJ si disponible, cron hebdomadaire ---- getFlashPlayer manuel fichier.tar.gz : installation d'une archive manuellement ---- getFlashPlayer sysremove : désinstall du script du système, en ROOT EOF printf "$COLOR" cat << 'EOF' ----------------------------------------------------------------------- Ce script doit être exécuté avec les droits root uniquement pour l'installation et la suppression du script dans le système. Il désinstallera le paquet flashplugin-nonfree si présent. Seul le plugin sera installé, en tant que plugin Mozilla Firefox. ----------------------------------------------------------------------- EOF echo -e "plus d'infos:$GREEN https://kyodev.frama.io/kyopages/scripts/getFlashPlayer/$COLOR\n" } # calcul url téléchargement plugin, assigne $recup_url, fflash_recup_url_v1(){ local recup1="https://fpdownload.adobe.com/get/flashplayer/pdc/" if [ "$(uname -m)" == "i686" ] || [ "$(uname -m)" == "i386" ]; then local recup2='i386'; elif [ "$(uname -m)" == "x86_64" ] || [ "$(uname -m)" == "amd64" ]; then local recup2='x86_64'; else f__error "architecture non reconnue" ; fi recup_url="$recup1$verFlash/flash_player_npapi_linux.$recup2.tar.gz" } # installation du plugin chargé manuellement, $1 fflash_install_manuel(){ if [ ! -e "$1" ]; then f__error "fichier plugin $1 introuvable"; fi f__archive_test "$1" || f__error "Le fichier $1 n'est pas une archive tar.gz valide" f__info "installation manuelle $1" fflash_install "manuel" "$1" } # install plugin dans config user mozilla, $1 manuel (install manuelle), $2 script à installer si install manuelle fflash_install(){ [ "$opType" == "upgrade" ] || fflash_avertissement if [ "$1" == "manuel" ]; then local dirTemp="$(dirname $2)/$script-$RANDOM/" local file="$(basename $2)" mkdir -p "$dirTemp" else local file="flash_player_npapi_linux.$(getconf LONG_BIT).tar.gz" local dirTemp="/tmp/$script-$RANDOM/" if [ $verFlash == "na" ]; then fflash_get_version "quiet"; fi f__info "installation FlashPlayer, version $verFlash" mkdir -p "$dirTemp" # détection/chargement/test archive plugin flashplayer fflash_recup_url_v1 wget -q -c --show-progress --tries=1 --timeout=15 --user-agent="$user_agent" --referer="$urlOnline" -O "$dirTemp$file" "$recup_url" if [ "$?" != "0" ]; then f__wget_test "$recup_url"; fi f__archive_test "$dirTemp$file" || f__error " Le fichier $dirTemp$file n'est pas une archive tar.gz valide" fi # décompression archive téléchargée dans dossier de travail if [ -e "$file" ]; then tar -xaf "$file" -C "$dirTemp"; else tar -xaf "$dirTemp$file" -C "$dirTemp"; fi if [ "$1" == "manuel" ]; then verFlash="$(strings $dirTemp/libflashplayer.so | grep -Eo '[0-9]+_[0-9]+_[0-9]+_[0-9]+' | sed 's/_/./g')"; fi # copie de la bibliothèque flash dans plugins/ user mozilla, effacement répertoire temporaire mkdir -p "$dirInstall" cp -f "$dirTemp"libflashplayer.so "$dirInstall/" rm -Rf "$dirTemp" # droits user si jamais installation par root chown -R "$user_": "$dirInstall" f__info "\n FlashPlayer $verFlash installé pour $user_" "\tPour tester: http://get.adobe.com/flashplayer/about/" f__log "FlashPlayer $verFlash installé pour $user_" } # test et mise à jour plugin si plugin outdated fflash_upgrade(){ if [ "$plugin_aJour" == "ko" ]; then fflash_install; fi } # suppression du plugin fflash_remove(){ [ -e /home/kyodev/.mozilla/plugins/libflashplayer.so ] || f__error "FlashPlayer inexistant pour $user_\n" local verInstall="$(strings $dirInstall/libflashplayer.so | grep -Eo '[0-9]+_[0-9]+_[0-9]+_[0-9]+' | sed 's/_/./g')" rm "$dirInstall/libflashplayer.so" rm "$dirInstall/libflashplayer.maj" &>/dev/null # ancien fichier éventuel rm "$dirInstall/libflashplayer.version" &>/dev/null # ancien fichier éventuel f__info "$GREEN FlashPlayer $verInstall désinstallé pour $user_" f__log "FlashPlayer $verInstall désinstallé pour $user_" } #initialisation f__affichage f__user verFlash="na" f__requis "wget file tar" fileLogs="/var/log/sdeb_getFlash.log" dirInstall="/home/$user_/.mozilla/plugins" fileAnacron="$dirInstall/libflashplayer.anacrontab" urlOnline="https://get.adobe.com/fr/flashplayer/" # test version & referer [ -e "$dirInstall/libflashplayer.so" ] && flash_installed="ok" || flash_installed="ko" # installation du script si appel pas fait depuis le système dirname "$0" | grep -q 'bin' || fscript_install # détection droits inappropriés sur le script, cas de figure sur version de dev [ "$1" != "sysremove" ] && [ -e "/opt/bin/$script" ] && ls -l "/opt/bin/$script" | grep -q 'root' && f__error "bug sécu 01" \ "veuillez désinstaller le script et le réinstaller" "voir: $urlNotice#supprimer-le-script" # détection ancien système de logs via syslog [ -w "$fileLogs" ] || f__info "pour bénéficier de la nouvelle version des logs, vous devriez réinstaller manuellement $script" \ "voir https://kyodev.frama.io/kyopages/scripts/getFlashPlayer/#installation-rapide-du-script" case "$1" in "install" ) fflash_install;; # installation plugin "remove" ) fflash_remove ;; # désinstallation plugin "version" ) fflash_get_version fscript_get_version ;; # version plugin en ligne & installée "sysremove" ) fscript_remove ;; # désinstallation du script "upgrade" ) opType="upgrade" f__log="tests mise à jour" fscript_get_version fscript_dl [ "$flash_installed" == "ko" ] && exit 0 fflash_get_version fflash_upgrade ;; # upgrade script et plugin si installé "manuel" ) fflash_install_manuel "$2" ;; # installation manuelle d'un chargement * ) fflash_help fflash_avertissement ;; # affichage help par défaut esac exit 0