kyopages/scripts/getFlashPlayer

381 lines
15 KiB
Bash
Executable File

#!/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