mirror of https://framagit.org/kyodev/kyopages.git
3.3.0
This commit is contained in:
parent
6821f8580c
commit
75d66ed971
|
@ -1,9 +1,9 @@
|
|||
#!/bin/bash
|
||||
|
||||
version=3.2.2
|
||||
date="24/08/2017"
|
||||
version=3.3.3
|
||||
date="25/08/2017"
|
||||
projet="simpledeb"
|
||||
contact="IRC freenode ##sdeb ou https://framagit.org/kyodev/kyopages/issues"
|
||||
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/"
|
||||
|
@ -15,7 +15,7 @@ lognameDev="kyodev"
|
|||
# contributeurs: kyodev, coyotus, naguam
|
||||
#####
|
||||
|
||||
f__affichage(){ # v06/2017 définition couleurs
|
||||
f__affichage(){ # v06/2017 définition couleurs
|
||||
YELLOW="$(printf "\033[0;33m")" # ?
|
||||
GREEN="$(printf "\033[0;32m")" # ok
|
||||
BLUE="$(printf "\033[0;34m")" # info
|
||||
|
@ -36,13 +36,13 @@ echo -e "$YELLOW pour Firefox, version $version - $date$COLOR\n"
|
|||
}
|
||||
|
||||
# test validité archive, $1 fichier (gzip), return 1 si invalide
|
||||
f__archive_test(){ # v07/2017
|
||||
f__archive_test(){ # v07/2017
|
||||
file -b "$1" | grep -q 'gzip compressed data' || return 1
|
||||
}
|
||||
|
||||
# affichage $1 en rouge, $1++ optionnels en bleu, sortie script sur erreur, log $1 si upgrade($opType)
|
||||
f__error() { # v16/08/2017
|
||||
echo -e "\n$RED Erreur critique: $1 $COLOR"
|
||||
# affichage $1 en rouge, $1++ optionnels en bleu, sortie script sur erreur, log $1 si $opType=upgrade
|
||||
f__error() { # v25/08/2017
|
||||
echo -e "\n$RED $script $version, 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
|
||||
|
@ -51,16 +51,17 @@ f__error() { # v16/08/2017
|
|||
|
||||
# affichage des paramètres en bleu, si $1=raw, pas d'espace en début de ligne, pas de ligne vide à la fin
|
||||
# si $1=log, uniquement $2 logué
|
||||
f__info() { # v21/08/2017
|
||||
if [ "$1" == "raw" ] || [ "$1" == "log" ]; then depart=2;
|
||||
else local espace=" "; local depart=1; fi
|
||||
f__info() { # v24/08/2017
|
||||
local espace=" " depart=1
|
||||
if [ "$1" == "raw" ] || [ "$1" == "log" ]; then depart=2; fi
|
||||
if [ "$1" == "raw" ]; then espace=""; fi
|
||||
[ "$1" == "log" ] && f__log "$(sed -E 's/\\t//;s/\\n// ' <<< $2 | xargs )"
|
||||
for (( i=$depart ; i<=$# ; i++ )); do echo -e "$espace$BLUE${!i}"; done
|
||||
[ "$1" == raw ] && printf "$COLOR" || echo "$COLOR"
|
||||
}
|
||||
|
||||
# log spécifique, fichier log limité à 10000octets, $1 message à loguer
|
||||
f__log(){ # v08/2017
|
||||
f__log(){ # v08/2017
|
||||
if [ -w "$fileLogs" ]; then
|
||||
if [ "$(stat -c %s $fileLogs)" -ge "10000" ]; then
|
||||
echo "$(date +%Y%m%d\ %H%M%S) $1" &>/dev/null > "$fileLogs"
|
||||
|
@ -77,7 +78,7 @@ f__log(){ # v08/2017
|
|||
# si $2=debOnly et si paquets manquants: return 1 et $debOnlyPackages ( $1=liste paquets )
|
||||
# si $2=debOnly et si paquets présent: return 0 et $debOnlyPresents ( $1=liste paquets )
|
||||
# attention priorité $debOnlyPackages sur $debOnlyPresents
|
||||
f__requis(){ # v17/08/2017-3
|
||||
f__requis(){ # v17/08/2017-3
|
||||
local dependsMissing packagesMissing
|
||||
unset debOnlyPackages debOnlyPresents
|
||||
for i in $1; do
|
||||
|
@ -107,7 +108,7 @@ f__requis(){ # v17/08/2017-3
|
|||
# user ayant initié la session graphique, assigne $user_
|
||||
# return 1 sur échec identification user, return 2 sur absence home/
|
||||
# gestion variable environnement user avec: USER_INSTALL=user script
|
||||
f__user(){ # v21/08/2017-4
|
||||
f__user(){ # v21/08/2017-4
|
||||
if [ "$USER_INSTALL" ]; then # user_ via variable environnement, moyen d'injecter root
|
||||
user_="$USER_INSTALL";
|
||||
return 0
|
||||
|
@ -138,121 +139,22 @@ f__user(){ # v21/08/2017-4
|
|||
return 0
|
||||
}
|
||||
|
||||
# test wget, $1 url à tester, sortie script sur erreur
|
||||
f__wget_test(){ # v07/2017
|
||||
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."
|
||||
}
|
||||
|
||||
# spécifique getFlashPlayer
|
||||
fscript_cronAnacron_special(){ # v19/08/2017
|
||||
rm "/home/$user_/.mozilla/plugins/libflashplayer.anacrontab" &>/dev/null # ancienne localisation
|
||||
rm "/home/$user_/.config/anacron/spool/getFP"* &>/dev/null # ancien job
|
||||
[ $EUID -eq 0 ] && sed -i "/libflashplayer.anacrontab/d" /etc/crontab # ancienne localisation anacrontab
|
||||
}
|
||||
|
||||
# inscription dans tache upgrade en anacron hebdomadaire, via cron horaire
|
||||
fscript_cronAnacron(){ # v23/08/2017
|
||||
[ "$(type -t fscript_cronAnacron_special)" ] && fscript_cronAnacron_special # test, si fonction spécifique, appel
|
||||
local dirAnacron="/home/$user_/.config/anacron"
|
||||
local dirSpool="$dirAnacron/spool"
|
||||
local fileAnacron="$dirAnacron/$script.anacrontab"
|
||||
[ $EUID -eq 0 ] && sed -i "/$script.anacrontab/d" /etc/crontab
|
||||
case "$1" in
|
||||
install | upgrade )
|
||||
mkdir -p "$dirAnacron"
|
||||
# table anacron
|
||||
echo "7 10 $script nice /opt/bin/$script --upgrade 1>/dev/null" > "$fileAnacron" # juste erreurs en syslog
|
||||
## anacron journalier pour dev logname
|
||||
if [ "$user_" == "$lognameDev" ]; then
|
||||
echo "1 00 $script""Dev nice /opt/bin/$script --upgrade 1>/dev/null" >> "$fileAnacron" # juste erreurs en syslog
|
||||
fi
|
||||
# création spool anacron utilisateur
|
||||
mkdir -p "$dirSpool"
|
||||
chown -R "$user_": "$dirAnacron" "$dirSpool"
|
||||
if [ $EUID -eq 0 ]; then
|
||||
# crontab pour activation horaire anacron
|
||||
echo "@hourly $user_ /usr/sbin/anacron -t $fileAnacron -S $dirSpool" >> /etc/crontab
|
||||
fi
|
||||
[ "$(grep "$script" /etc/crontab)" ] || echo f__error "inscription crontab" \
|
||||
"certains systèmes semblent poser poser problème, merci de rapporter ce bug à $projet $contact"
|
||||
;;
|
||||
remove )
|
||||
rm "$dirSpool/$script"* &>/dev/null
|
||||
rm "$fileAnacron" &>/dev/null
|
||||
rmdir "$dirSpool" "$dirAnacron" &>/dev/null
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# mise à jour script si dispo
|
||||
fscript_dl(){ # v22/08/2017
|
||||
f__requis "wget"
|
||||
if [ "$script_aJour" == "ok" ]; then
|
||||
f__info "log" "pas de mise à jour disponible pour $script"
|
||||
return 0
|
||||
fi
|
||||
local dirTemp="/tmp/$script-$RANDOM/"
|
||||
mkdir -p "$dirTemp"
|
||||
wget -q --tries=2 --timeout=15 -O "$dirTemp$script" "$urlScript"
|
||||
if [ "$?" != "0" ]; then f__wget_test "$urlScript"; fi
|
||||
chmod 755 "$dirTemp$script"
|
||||
chown "$user_": "$dirTemp$script"
|
||||
cp -d "$dirTemp$script" /opt/bin/"$script"
|
||||
rm -rf "$dirTemp"
|
||||
fscript_cronAnacron "upgrade"
|
||||
f__info "log" "\n $script mis à jour en version $versionScript"
|
||||
}
|
||||
|
||||
# version script en ligne, assigne $versionScript, $script_aJour=ok|ko
|
||||
fscript_get_version(){ # v19/08/2017
|
||||
f__requis "wget"
|
||||
f__info "$GREEN""\n version script en cours: $version"
|
||||
versionScript="$(wget -q --tries=2 --timeout=15 -O - "$urlScript" | grep '^version=' | cut -d '=' -f 2)"
|
||||
if [ "$versionScript" ]; then
|
||||
if [ "$version" != "$versionScript" ]; then
|
||||
f__info "version script en ligne: $versionScript, mise à jour possible"
|
||||
script_aJour="ko"
|
||||
else
|
||||
f__info "version script en ligne: $versionScript"
|
||||
script_aJour="ok"
|
||||
fi
|
||||
else f__info "version script en ligne non accessible"; fi
|
||||
}
|
||||
|
||||
# installation du script dans le système
|
||||
fscript_install(){ # v21/08/2017
|
||||
if dirname "$0" | grep -q 'bin' ; then
|
||||
f__info "\n $script $version est déjà installé"
|
||||
return 1
|
||||
fi
|
||||
[ $EUID -eq 0 ] || f__error "vous devez être ROOT pour installer ce script dans le système"
|
||||
f__requis "wget anacron cron"
|
||||
# install /opt
|
||||
mkdir -p /opt/bin/
|
||||
cp -d "$(basename $0)" "/opt/bin/$script"
|
||||
ln -s "/opt/bin/$script" "/usr/bin/$script" &>/dev/null
|
||||
chmod 755 "/opt/bin/$script"
|
||||
# cron/anacron install
|
||||
fscript_cronAnacron "install"
|
||||
# création fichier log
|
||||
touch "$fileLogs"
|
||||
chmod 644 "$fileLogs"
|
||||
chown "$user_": "$fileLogs" "/opt/bin/$script"
|
||||
[ -f "$script"_changelog.md ] || rm "$(basename $0)" &>/dev/null ## on efface pas si changelog (dev)
|
||||
f__info "log" "$script $version installé dans le système." "maintenant, appel du script par:$GREEN $script$BLUE (sans ./)"
|
||||
}
|
||||
|
||||
# suppression du script dans le système
|
||||
fscript_remove(){ # v21/08/2017
|
||||
[ $EUID -eq 0 ] || 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
|
||||
# cron/anacron remove
|
||||
fscript_cronAnacron "remove"
|
||||
f__info "log" "$script $version supprimé du système."
|
||||
# test wget, $1 url à tester affiche url testée & entêtes http, sortie script sur erreur
|
||||
f__wget_test(){ #v25/08/2017
|
||||
local file_test_wget="/tmp/testWget-$RANDOM"
|
||||
wget -Sq --tries=1 --timeout=10 --user-agent="$user_agent" --spider --save-headers "$1" &>"$file_test_wget" || local retourWget="$?"
|
||||
[ "$retourWget" == 1 ] && retourWget="code erreur générique"
|
||||
[ "$retourWget" == 2 ] && retourWget="parse erreur (ligne de commande?)"
|
||||
[ "$retourWget" == 3 ] && retourWget="erreur Entrée/sortie fichier"
|
||||
[ "$retourWget" == 4 ] && retourWget="défaut réseau"
|
||||
[ "$retourWget" == 5 ] && retourWget="défaut vérification SSL"
|
||||
[ "$retourWget" == 6 ] && retourWget="défaut authentification"
|
||||
[ "$retourWget" == 7 ] && retourWget="erreur de protocole"
|
||||
[ "$retourWget" == 8 ] && retourWget="réponse serveur en erreur"
|
||||
retourHttp="$(grep -i 'HTTP/' "$file_test_wget" | tr -d '\n' | xargs)"
|
||||
f__error "erreur wget: $retourWget" "url: $1" "$retourHttp" \
|
||||
"Erreur wget" "si persistance, contacter $projet $contact en indiquant les messages précédents"
|
||||
rm "$file_test_wget"
|
||||
}
|
||||
|
||||
# pas beau ce soft :(
|
||||
|
@ -385,17 +287,126 @@ fflash_remove(){
|
|||
fflash_upgrade(){ #24/08/2017
|
||||
fflash_get_version
|
||||
if [ "$plugin_aJour" == "ko" ]; then
|
||||
opType="upgrade"
|
||||
fflash_install
|
||||
else f__info "log" "pas de plugin Flash à mettre à jour"; fi
|
||||
}
|
||||
|
||||
# spécifique getFlashPlayer
|
||||
fscript_cronAnacron_special(){ # v19/08/2017
|
||||
rm "/home/$user_/.mozilla/plugins/libflashplayer.anacrontab" &>/dev/null # ancienne localisation
|
||||
rm "/home/$user_/.config/anacron/spool/getFP"* &>/dev/null # ancien job
|
||||
[ $EUID -eq 0 ] && sed -i "/libflashplayer.anacrontab/d" /etc/crontab # ancienne localisation anacrontab
|
||||
}
|
||||
|
||||
# inscription dans tache upgrade en anacron hebdomadaire, via cron horaire
|
||||
fscript_cronAnacron(){ # v23/08/2017
|
||||
[ "$(type -t fscript_cronAnacron_special)" ] && fscript_cronAnacron_special # test, si fonction spécifique, appel
|
||||
local dirAnacron="/home/$user_/.config/anacron"
|
||||
local dirSpool="$dirAnacron/spool"
|
||||
local fileAnacron="$dirAnacron/$script.anacrontab"
|
||||
[ $EUID -eq 0 ] && sed -i "/$script.anacrontab/d" /etc/crontab
|
||||
case "$1" in
|
||||
install | upgrade )
|
||||
mkdir -p "$dirAnacron"
|
||||
# table anacron
|
||||
echo "7 10 $script nice /opt/bin/$script --upgrade 1>/dev/null" > "$fileAnacron" # juste erreurs en syslog
|
||||
## anacron journalier pour dev logname
|
||||
if [ "$user_" == "$lognameDev" ]; then
|
||||
echo "1 00 $script""Dev nice /opt/bin/$script --upgrade 1>/dev/null" >> "$fileAnacron" # juste erreurs en syslog
|
||||
fi
|
||||
# création spool anacron utilisateur
|
||||
mkdir -p "$dirSpool"
|
||||
chown -R "$user_": "$dirAnacron" "$dirSpool"
|
||||
if [ $EUID -eq 0 ]; then
|
||||
# crontab pour activation horaire anacron
|
||||
echo "@hourly $user_ /usr/sbin/anacron -t $fileAnacron -S $dirSpool" >> /etc/crontab
|
||||
fi
|
||||
[ "$(grep "$script" /etc/crontab)" ] || echo f__error "inscription crontab" \
|
||||
"certains systèmes semblent poser poser problème, merci de rapporter ce bug à $projet $contact"
|
||||
;;
|
||||
remove )
|
||||
rm "$dirSpool/$script"* &>/dev/null
|
||||
rm "$fileAnacron" &>/dev/null
|
||||
rmdir "$dirSpool" "$dirAnacron" &>/dev/null
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# version script en ligne, assigne $versionScript, $script_aJour=ok|ko
|
||||
fscript_get_version(){ # v19/08/2017
|
||||
f__requis "wget"
|
||||
f__info "$GREEN""\n version script en cours: $version"
|
||||
versionScript="$(wget -q --tries=2 --timeout=15 -O - "$urlScript" | grep '^version=' | cut -d '=' -f 2)"
|
||||
if [ "$versionScript" ]; then
|
||||
if [ "$version" != "$versionScript" ]; then
|
||||
f__info "version script en ligne: $versionScript, mise à jour possible"
|
||||
script_aJour="ko"
|
||||
else
|
||||
f__info "version script en ligne: $versionScript"
|
||||
script_aJour="ok"
|
||||
fi
|
||||
else f__info "version script en ligne non accessible"; fi
|
||||
}
|
||||
|
||||
# installation du script dans le système
|
||||
fscript_install(){ # v24/08/2017
|
||||
if dirname "$0" | grep -q 'bin' ; then
|
||||
f__info "\n $script $version est déjà installé"
|
||||
return 1
|
||||
fi
|
||||
[ $EUID -eq 0 ] || f__error "vous devez être ROOT pour installer ce script dans le système"
|
||||
f__requis "wget anacron cron"
|
||||
# install /opt
|
||||
mkdir -p /opt/bin/
|
||||
cp -d "$(basename $0)" "/opt/bin/$script"
|
||||
ln -s "/opt/bin/$script" "/usr/bin/$script" &>/dev/null
|
||||
chmod 755 "/opt/bin/$script"
|
||||
# cron/anacron install
|
||||
fscript_cronAnacron "install"
|
||||
# création fichier log
|
||||
touch "$fileLogs"
|
||||
chmod 644 "$fileLogs"
|
||||
chown "$user_": "$fileLogs" "/opt/bin/$script"
|
||||
[ -e "$script"_changelog.md ] || rm "$(basename $0)" &>/dev/null ## on efface pas si changelog (dev)
|
||||
f__info "log" "$script $version installé dans le système." "maintenant, appel du script par:$GREEN $script$BLUE (sans ./)"
|
||||
}
|
||||
|
||||
# suppression du script dans le système
|
||||
fscript_remove(){ # v21/08/2017
|
||||
[ $EUID -eq 0 ] || 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
|
||||
# cron/anacron remove
|
||||
fscript_cronAnacron "remove"
|
||||
f__info "log" "$script $version supprimé du système."
|
||||
}
|
||||
|
||||
# mise à jour script si dispo
|
||||
fscript_update(){ # v25/08/2017
|
||||
fscript_get_version
|
||||
if [ "$script_aJour" == "ok" ]; then
|
||||
f__info "log" "pas de mise à jour disponible pour $script"
|
||||
return 0
|
||||
fi
|
||||
local dirTemp="/tmp/$script-$RANDOM/"
|
||||
mkdir -p "$dirTemp"
|
||||
wget -q --tries=2 --timeout=15 -O "$dirTemp$script" "$urlScript"
|
||||
if [ "$?" != "0" ]; then f__wget_test "$urlScript"; fi
|
||||
chmod 755 "$dirTemp$script"
|
||||
chown "$user_": "$dirTemp$script"
|
||||
cp -d "$dirTemp$script" /opt/bin/"$script"
|
||||
rm -rf "$dirTemp"
|
||||
fscript_cronAnacron "upgrade"
|
||||
f__info "log" "\n $script mis à jour en version $versionScript"
|
||||
}
|
||||
|
||||
#initialisation
|
||||
PATH='/usr/sbin:/usr/bin:/sbin:/bin' ; IFS=' '; TERM=xterm
|
||||
export PATH TERM
|
||||
f__affichage
|
||||
f__user || f__error "échec détection user"
|
||||
f__requis "file tar" # pour fonctionnement programme
|
||||
f__requis "file tar" # requis pour fonctionnement programme
|
||||
|
||||
fileLogs="/var/log/sdeb_$script.log"
|
||||
dirInstall="/home/$user_/.mozilla/plugins"
|
||||
|
@ -403,7 +414,7 @@ urlOnline="https://get.adobe.com/fr/flashplayer/" # test version & referer
|
|||
|
||||
[ -e "/opt/bin/$script" ] && [ "$(stat -c %G /opt/bin/$script)" == "root" ] && problemDetected+="-1" # droits inappropriés sur le script, version de dev
|
||||
options="$@"
|
||||
if [ "$(dirname $0)" == "." ]; then unset options
|
||||
if [ "$(dirname $0)" == "." ]; then unset options # induira ascript install
|
||||
elif ! grep -qE '\-u|\-\-upgrade' <<< "$options"; then
|
||||
if [ ! -w "$fileLogs" ] && [ -e "$dirInstall/libflashplayer.so" ] ; then problemDetected+="-2"; fi # ancien système de logs via syslog
|
||||
fi
|
||||
|
@ -412,27 +423,43 @@ fi
|
|||
|
||||
for i in $options; do
|
||||
case "$i" in
|
||||
install ) fflash_install; break ;; # installation plugin
|
||||
manuel ) fflash_install_manuel "$2"; break ;; # installation manuelle d'un chargement
|
||||
remove ) fflash_remove; break ;; # désinstallation plugin
|
||||
upgrade ) fflash_upgrade; break ;; # upgrade plugin si installé
|
||||
install )
|
||||
fflash_install
|
||||
break ;; # installation plugin
|
||||
manuel )
|
||||
fflash_install_manuel "$2"
|
||||
break ;; # installation manuelle d'un chargement
|
||||
remove )
|
||||
fflash_remove
|
||||
break ;; # désinstallation plugin
|
||||
upgrade )
|
||||
fflash_upgrade
|
||||
opType="upgrade"
|
||||
break ;; # upgrade plugin si installé
|
||||
version | versions )
|
||||
fflash_get_version
|
||||
fscript_get_version; break ;; # version plugin en ligne & installée
|
||||
"" ) if ! dirname "$0" | grep -q 'bin' ; then
|
||||
fscript_get_version
|
||||
break ;; # version plugin en ligne & installée
|
||||
"" )
|
||||
if ! dirname "$0" | grep -q 'bin' ; then
|
||||
fscript_install
|
||||
else fflash_help; fi ;; # installation du script dans le système
|
||||
-r | --remove | sysremove ) fscript_remove; break ;; # désinstallation du script
|
||||
else fflash_help; fi
|
||||
break ;; # installation du script dans le système
|
||||
-r | --remove | sysremove )
|
||||
fscript_remove
|
||||
break ;; # désinstallation du script
|
||||
-u | --upgrade )
|
||||
opType="upgrade"
|
||||
fscript_update
|
||||
$0 upgrade # on relance le script en upgrade pour le plugin
|
||||
break ;; # upgrade script et plugin
|
||||
-v | --version )
|
||||
fscript_get_version
|
||||
fscript_dl
|
||||
$0 upgrade # si script mis à jour, on relance le script en upgrade pour le plugin
|
||||
break ;; # upgrade script et plugin
|
||||
-v | --version ) fscript_get_version; break ;; # version du script, en ligne et exécuté
|
||||
break ;; # version du script, en ligne et exécuté
|
||||
-h | --help | * )
|
||||
fflash_help
|
||||
fflash_avertissement; break ;; # affichage help
|
||||
fflash_avertissement
|
||||
break ;; # affichage help
|
||||
esac
|
||||
done
|
||||
|
||||
|
|
|
@ -1,5 +1,13 @@
|
|||
# changelog getFlashPlayer
|
||||
|
||||
|
||||
## 3.3.0 25/08/2017
|
||||
|
||||
* renommage fscript_dl en fscript_update
|
||||
* révision fscript_install, fscript_update
|
||||
* révision f__wget_test
|
||||
* révision f__error, f__info
|
||||
|
||||
## 3.2.2 24/08/2017
|
||||
|
||||
* avertissement pas de maj plugin
|
||||
|
|
Loading…
Reference in New Issue