#326 Hier à 13:49
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
le " continue " ne fais pas reprendre la boucle au départ si je met une IP invalide ?
même sans d' ailleurs , du moment qu ' on passe par " unset IP " la boucle devrait perdurer ...
Parce que le read assigne une valeur et donc annule le unset.
Hors ligne
#327 Hier à 14:10
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
tout à fait.
voilà la solution :
if test "$IP" = "USB"
then
echo "Installation en USB."
unset IP
else
until test -n "$IP"
do
if test -n "$2"; then
IP=$2
shift $#
else
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
echo "$REPLY"
[[ $REPLY == [YyOo] ]] || break
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
if test -n "$IP"; then
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"; do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"; then
err=0
unset IP
#read -rp "Adresse erronée , re-donner l'IP de votre imprimante : " IP
echo "Adresse erronée !"
fi
fi
done
fi
echo "IP == $IP"
exit
et le retour terminal :
iznobe@iznobe-pc:~$ sudo bash Scripts/Watael_brprinter_install.sh MFC-L2710DW 1.1.1
Connection to brother.com (13.248.151.157) 80 port [tcp/http] succeeded!
Adresse erronée !
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] o
o
Entrez l’adresse IP de votre imprimante : 1
Adresse erronée !
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] o
o
Entrez l’adresse IP de votre imprimante : 1.
Adresse erronée !
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] o
o
Entrez l’adresse IP de votre imprimante : 1.2.3
Adresse erronée !
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] o
o
Entrez l’adresse IP de votre imprimante : 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
--- 1.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 30.694/31.641/32.588/0.947 ms
IP == 1.1.1.1
iznobe@iznobe-pc:~$
Dernière modification par iznobe (Hier à 14:18)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#328 Hier à 14:12
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
iznobe a écrit :au final , retour de la fonction check_IP non ?
Oui, je vais tâcher de regarder ça à tête reposée.
Je ne comprends pas, chez moi ça fonctionne convenablement.
…
#check IP
if test "$IP" = "USB" # ???????????????
then
echo "Installation en USB."
unset IP
else
until test -n "$IP"
do
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
echo "$REPLY"
[[ $REPLY == [YyOo] ]] || break
if test -n "$2"
then
IP=$2
shift $#
else
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
echo "IP == $IP"
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"
do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"
then
err=0
unset IP
fi
done
fi
exit
…
~$ sudo ./watael_printer-install.sh MFC-L2710DW 1.1.1.
+ shopt -s extglob nullglob globstar
+ test -f /etc/lsb-release
+ . /etc/lsb-release
++ DISTRIB_ID=Ubuntu
++ DISTRIB_RELEASE=24.04
++ DISTRIB_CODENAME=noble
++ DISTRIB_DESCRIPTION='Ubuntu 24.04.3 LTS'
+ DistroName=Ubuntu
+ VersionYear=24
+ codeName=noble
+ user=nany
++ uname -m
+ arch=x86_64
++ date +%F_%T
+ date=2025-08-21_14:00:31
+ tmpDir=/tmp/packages
+ Logfile=/home/nany/brprinter_install.log
+ libDir=/usr/lib/x86_64-linux-gnu
+ declare -A printer
+ declare -i err
+ Url_Info=https://download.brother.com/pub/com/linux/linux/infs
+ Url_Pkg=https://download.brother.com/pub/com/linux/linux/packages
+ Udev_Rules=/lib/udev/rules.d/60-libsane1.rules
+ Udev_Deb_Name=brother-udev-rule-type1-1.0.2-0.all.deb
+ Udev_Deb_Url=http://download.brother.com/welcome/dlf006654
+ Scankey_Drv_Deb_Name=brscan-skey-0.3.4-0.amd64.deb
+ test /bin/bash '!=' /bin/bash
+ test x86_64 '!=' x86_64
+ (( EUID ))
+ nc -z -w5 brother.com 80
Connection to brother.com (13.248.151.157) 80 port [tcp/http] succeeded!
+ apt-get update -qq
+ install_pkg wget nmap libxml2-utils gawk
+ for pkg in "$@"
+ dpkg-query -f '${binary:Package}\n' -W wget
+ for pkg in "$@"
+ dpkg-query -f '${binary:Package}\n' -W nmap
+ for pkg in "$@"
+ dpkg-query -f '${binary:Package}\n' -W libxml2-utils
+ for pkg in "$@"
+ dpkg-query -f '${binary:Package}\n' -W gawk
+ test -d /tmp/packages
+ declare -u modelName=MFC-L2710DW
+ test -z MFC-L2710DW
+ printerName=MFCL2710DW
+ test '' = USB
+ test -n ''
+ read -rp 'Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] '
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] o
+ echo o
o
+ [[ o == [YyOo] ]]
+ test -n 1.1.1.
+ IP=1.1.1.
+ shift 2
+ echo 'IP == 1.1.1.'
IP == 1.1.1.
+ IFS=.
+ read -ra ip
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ (( 3 != 4 ))
+ err=0
+ unset IP
+ test -n ''
+ read -rp 'Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] '
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] O
+ echo O
O
+ [[ O == [YyOo] ]]
+ test -n ''
+ read -rp 'Entrez l’adresse IP de votre imprimante : ' IP
Entrez l’adresse IP de votre imprimante : 1.1.1.
+ echo 'IP == 1.1.1.'
IP == 1.1.1.
+ IFS=.
+ read -ra ip
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ (( 3 != 4 ))
+ err=0
+ unset IP
+ test -n ''
+ read -rp 'Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] '
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] Y
+ echo Y
Y
+ [[ Y == [YyOo] ]]
+ test -n ''
+ read -rp 'Entrez l’adresse IP de votre imprimante : ' IP
Entrez l’adresse IP de votre imprimante : 1.1.1.1
+ echo 'IP == 1.1.1.1'
IP == 1.1.1.1
+ IFS=.
+ read -ra ip
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ (( 4 != 4 ))
+ (( err ))
+ ping -qc2 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
--- 1.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 9.164/9.375/9.587/0.211 ms
+ test -n 1.1.1.1
+ exit
~$
À part que le ping valide l’adresse 1.1.1.1.
Hors ligne
#329 Hier à 14:21
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Bonjour ,
je n' arrive pas à mettre en place un contrôle " propre " ( : sans doubler des parties de code ) pour cette partie qui ne va pas :if test "$IP" = "USB" then echo "Installation en USB." unset IP else until test -n "$IP" do read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] " echo "$REPLY" [[ $REPLY == [YyOo] ]] || break if test -n "$2" then IP=$2 shift $# else read -rp "Entrez l’adresse IP de votre imprimante : " IP fi IFS='.' read -ra ip <<< "$IP" for i in "${ip[@]}" do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1" done if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP" then err=0 unset IP fi done fi
ca devrait faire :
si on a une IP , on vérifie qu ' elle est correcte ( automatique , peut être pas nécessaire ? , en argument ou en réponse à la question posée à l' utilisateur )
si l' IP en argument ou en réponse à la question n ' est pas correcte , on redemande l' IP. ( pas si il veut l ' installer en réseau ... ) .
nany a écrit :iznobe a écrit :au final , retour de la fonction check_IP non ?
Oui, je vais tâcher de regarder ça à tête reposée.
Je ne comprends pas, chez moi ça fonctionne convenablement.
… #check IP if test "$IP" = "USB" # ??????????????? then echo "Installation en USB." unset IP else until test -n "$IP" do read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] " echo "$REPLY" [[ $REPLY == [YyOo] ]] || break if test -n "$2" then IP=$2 shift $# else read -rp "Entrez l’adresse IP de votre imprimante : " IP fi echo "IP == $IP" IFS='.' read -ra ip <<< "$IP" for i in "${ip[@]}" do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1" done if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP" then err=0 unset IP fi done fi exit …
...
À part que le ping valide l’adresse 1.1.1.1.
si j' ai modifié , c' est qu il doit y avoir un problème . je remet , teste les 3 façons d' obtenir une IP et te dis ca .
Mais il me semble que le soucis etait lors de la detection auto .
Dernière modification par iznobe (Hier à 14:45)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#330 Hier à 14:29
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
Pareil en reprenant ce que tu avais posté et en ajoutant juste un echo.
…
#check IP
if test "$IP" = "USB"
then
echo "Installation en USB."
unset IP
else
until test -n "$IP"
do
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
echo "$REPLY"
[[ $REPLY == [YyOo] ]] || break
if test -n "$2"
then
IP=$2
shift $#
else
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"
do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"
then
echo "Adresse erronée !"
err=0
unset IP
fi
done
fi
exit
…
~$ sudo ./watael_printer-install.sh MFC-L2710DW 1.1.1.
[sudo] Mot de passe de nany :
+ shopt -s extglob nullglob globstar
+ test -f /etc/lsb-release
+ . /etc/lsb-release
++ DISTRIB_ID=Ubuntu
++ DISTRIB_RELEASE=24.04
++ DISTRIB_CODENAME=noble
++ DISTRIB_DESCRIPTION='Ubuntu 24.04.3 LTS'
+ DistroName=Ubuntu
+ VersionYear=24
+ codeName=noble
+ user=nany
++ uname -m
+ arch=x86_64
++ date +%F_%T
+ date=2025-08-21_14:25:13
+ tmpDir=/tmp/packages
+ Logfile=/home/nany/brprinter_install.log
+ libDir=/usr/lib/x86_64-linux-gnu
+ declare -A printer
+ declare -i err
+ Url_Info=https://download.brother.com/pub/com/linux/linux/infs
+ Url_Pkg=https://download.brother.com/pub/com/linux/linux/packages
+ Udev_Rules=/lib/udev/rules.d/60-libsane1.rules
+ Udev_Deb_Name=brother-udev-rule-type1-1.0.2-0.all.deb
+ Udev_Deb_Url=http://download.brother.com/welcome/dlf006654
+ Scankey_Drv_Deb_Name=brscan-skey-0.3.4-0.amd64.deb
+ test /bin/bash '!=' /bin/bash
+ test x86_64 '!=' x86_64
+ (( EUID ))
+ nc -z -w5 brother.com 80
Connection to brother.com (13.248.151.157) 80 port [tcp/http] succeeded!
+ apt-get update -qq
+ install_pkg wget nmap libxml2-utils gawk
+ for pkg in "$@"
+ dpkg-query -f '${binary:Package}\n' -W wget
+ for pkg in "$@"
+ dpkg-query -f '${binary:Package}\n' -W nmap
+ for pkg in "$@"
+ dpkg-query -f '${binary:Package}\n' -W libxml2-utils
+ for pkg in "$@"
+ dpkg-query -f '${binary:Package}\n' -W gawk
+ test -d /tmp/packages
+ declare -u modelName=MFC-L2710DW
+ test -z MFC-L2710DW
+ printerName=MFCL2710DW
+ test '' = USB
+ test -n ''
+ read -rp 'Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] '
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] o
+ echo o
o
+ [[ o == [YyOo] ]]
+ test -n 1.1.1.
+ IP=1.1.1.
+ shift 2
+ IFS=.
+ read -ra ip
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ (( 3 != 4 ))
+ echo 'Adresse erronée !'
Adresse erronée !
+ err=0
+ unset IP
+ test -n ''
+ read -rp 'Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] '
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] O
+ echo O
O
+ [[ O == [YyOo] ]]
+ test -n ''
+ read -rp 'Entrez l’adresse IP de votre imprimante : ' IP
Entrez l’adresse IP de votre imprimante : 1.1.1.
+ IFS=.
+ read -ra ip
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ (( 3 != 4 ))
+ echo 'Adresse erronée !'
Adresse erronée !
+ err=0
+ unset IP
+ test -n ''
+ read -rp 'Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] '
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] Y
+ echo Y
Y
+ [[ Y == [YyOo] ]]
+ test -n ''
+ read -rp 'Entrez l’adresse IP de votre imprimante : ' IP
Entrez l’adresse IP de votre imprimante : 1.1.1.1
+ IFS=.
+ read -ra ip
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ for i in "${ip[@]}"
+ (( n++ ? i >=0 && i<=255 : i>0 && i<=255 ))
+ (( 4 != 4 ))
+ (( err ))
+ ping -qc2 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
--- 1.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 9.077/9.348/9.620/0.271 ms
+ test -n 1.1.1.1
+ exit
~$
Hors ligne
#331 Hier à 14:56
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
j ' ai retrouvé le soucis ... :
iznobe@k-pi3:~ $ sudo bash brprinter_install.sh DCPL3560CDW 1.1.1.1
printerName == DCPL3560CDW
IP ==
Installation en réseau.
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N]
le code est legerement different ( puisque sur le pi pour tester avec détection multiple ), c ' est peut etre moi qui ait fait une ko...rie
#!/bin/bash -x
# > vim search whole line : `yy / <Ctrl-F> p <Enter>'
# définitions de variables
# gestion des arguments
# infos Brother
# quelques fonctions
# quelques vérifications
# initialisation du tableau associatif `printer'
# vérification de variables disponibles dans `printer'
# préparation du système
# téléchargement des pilotes
# configuration de l'imprimante
# configuration du scanner
# <
shopt -s extglob nullglob globstar
############################
# définitions de variables
############################
if test -f /etc/lsb-release
then
. /etc/lsb-release
DistroName="$DISTRIB_ID"
VersionYear="${DISTRIB_RELEASE::2}"
codeName="$DISTRIB_CODENAME"
elif test -f /usr/lib/os-release
then
. /usr/lib/os-release
DistroName="$NAME"
VersionYear="${VERSION_ID::2}"
codeName="$VERSION_CODENAME"
fi
user="$SUDO_USER"
arch="$(uname -m)"
date=$(date +%F_%T)
tmpDir="/tmp/packages"
Logfile="/home/$user/brprinter_install.log"
libDir="/usr/lib/$arch-linux-gnu"
declare -A printer
declare -i err
#################
# infos Brother
#################
# ancienne adresse d' obtention des infos :
#Url_Info="http://www.brother.com/pub/bsc/linux/infs"
# nouvelle adresse :
Url_Info="https://download.brother.com/pub/com/linux/linux/infs"
# Packages :
Url_Pkg="https://download.brother.com/pub/com/linux/linux/packages"
#Url_Pkg2="http://www.brother.com/pub/bsc/linux/packages" # ancienne adresse d'obtention des paquets
Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"
#Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=${printerName}_us_eu_as"
#######################
# quelques fonctions #
#######################
errQuit()
{
>&2 echo "$@"
exit 1
}
verif_lien()
{ # pour faire un boucle, suffit-il vérifier que le nombre d'arguments est pair ?
local lien=$1 cible=$2
if ! test -L "$lien"
then
ln -s "$cible" "$lien"
fi
}
install_pkg()
{
for pkg do
if ! dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null
then
apt-get install -qq "$pkg"
fi
done
}
###########################
# quelques vérifications #
###########################
#if test "$DistroName" != "Ubuntu"; then errQuit "La distribution n’est pas Ubuntu ou une des ses variantes officielles."; fi
if test "$SHELL" != "/bin/bash"; then errQuit "Shell non compatible. utilisez : bash"; fi
# if [[ $arch != @(i386|i686|) ]] armv7l
#if test "$arch" != "x86_64"; then errQuit "Système non compatible."; fi
if ((EUID)); then errQuit "Vous devez lancer le script en root : sudo $0"; fi
if ! nc -z -w5 'brother.com' 80; then errQuit "le site \"brother.com\" n'est pas joignable."; fi
######################
# prérequis pour le script #
######################
# a remettre le script en service
# if test -f "$Logfile"; then
# Old_Date="$(head -n1 "$Logfile")"
# mv -v "$Logfile" "$Logfile"."$Old_Date".log
# fi
# echo "$date" >> "$Logfile" # indispensable pour la rotation du log .
#apt-get update -qq
# script : "wget" "nmap" "libxml2-utils" " gawk"
# imprimantes : "multiarch-support" "lib32stdc++6" "cups"
# scanner : "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
install_pkg "wget" "nmap" "libxml2-utils" "gawk"
if ! test -d "$tmpDir"
then
mkdir -pv "$tmpDir"
fi
declare -u modelName=$1
if test -z "$modelName"
then
##########################
# DETECTION AUTOMATIQUE #
##########################
# NET_printer_name= ???
declare -a printer_IP printer_name
# my_IP="$(hostname -I | cut -d ' ' -f1)"
# mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
# #printer_IP=( $(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') )
# #echo "${printer_IP[*]}"
# for p_ip in "${printer_IP[@]}"; do
# if wget -E "$p_ip" -O "$tmpDir/index.html"; then
# printer_name+=( "$(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" )
# #echo "printer_name == ${printer_name[*]}"
# fi
# done
##### VERSION AVAHI-BROWSE #####
mapfile -t printer_IP < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {print $8}')
mapfile -t printer_name < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
##### VERSION AVAHI-BROWSE #####
#echo "printer_name RESULT ==
#TAB printer_IP == ${printer_IP[*]}
#TAB printer_name == ${printer_name[*]}"
# USB_printer_name= ???
if lsusb | grep -q 04f9:
then
mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}')
for p_usb in "${printer_usb[@]}"
do
printer_name+=( "$p_usb" )
printer_IP+=("USB")
done
fi
#echo "printer_name ==
#${#printer_name[*]} ,
#${printer_name[*]}"
case ${#printer_name[*]} in
0) echo "Aucune imprimante détectée !
Êtes vous sûr de l’avoir connectée au port USB de votre ordinateur ou à votre réseau local ?"
# on repars donc avec les questions de base : modele etc ...
;;
1) echo "Une seule imprimante détectée."
modelName=${printer_name[0]} # ! printer_name != printerName
IP=${printer_IP[0]}
# pas besoin de poser de question , il ne reste plus qu ' a installer
;;
*) echo "Plusieurs imprimantes ont été détectées."
# il faut presenter sous forme de liste les éléments recupérés :
# modele du materriel : IP ou USB
# et demander à l' utilisateur de choisir un numero dans cette liste
n_print=$(("${#printer_name[@]}"))
for n in "${!printer_name[@]}"
do
echo " $((n+1)) ⇒ ${printer_name[$n]} : ${printer_IP[$n]}"
done
while test -z "$choix"
do
read -rp "Choisissez le numéro qui correspond à l’imprimante que voulez installer : " choix
echo "$choix"
if ! ((choix > 0 && choix <= n_print))
then
echo "Choix invalide !"
unset choix
fi
done
modelName="${printer_name[$choix-1]}"
IP=${printer_IP[$choix-1]}
;;
esac
#else
##########################
# gestion des arguments #
##########################
until test -n "$modelName"
do
read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
fi
printerName="${modelName//-/}" # ! printer_name != printerName
echo " printerName == $printerName
IP == $IP"
#check IP
if test "$IP" = "USB" # ???????????????
then
echo "Installation en USB."
unset IP
else
echo "Installation en réseau."
until test -n "$IP"
do
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
echo "$REPLY"
[[ $REPLY == [YyOo] ]] || break
if test -n "$2"
then
IP=$2
shift $#
else
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"
do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"
then
err=0
unset IP
fi
done
fi
###################################################
# initialisation du tableau associatif `printer' #
###################################################
# creation $Url_PrinterInfo
Url_PrinterInfo="$Url_Info/$printerName"
echo "Url_PrinterInfo == $Url_PrinterInfo"
while IFS='=' read -r k v
do
printer[$k]=$v
done < <(wget -qO- "$Url_PrinterInfo" | sed '/\(]\|rpm\|=\)$/d')
echo "Tab printer == ${printer[*]}"
#exit
#########################################################
# vérification de variables disponibles dans `printer' #
#########################################################
if test -n "${printer[LNK]}"; then # on telecharge le fichier donné en lien
Url_PrinterInfo="$Url_Info/${printer[LNK]}"
while IFS='=' read -r k v
do
printer[$k]=$v
done < <(wget -qO- "$Url_PrinterInfo" | sed '/\(]\|rpm\|=\)$/d')
fi
if ! test "${printer[PRINTERNAME]}" == "$printerName"
then
errQuit "Les données du fichier info récupéré et le nom de l’imprimante ne correspondent pas."
fi
if test -n "${printer[SCANNER_DRV]}"
then
#install_pkg "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
printer[udev_rules]="$Udev_Deb_Name"
. <(wget -qO- "$Url_Info/${printer[SCANNER_DRV]}.lnk" | sed -n '/^DEB/s/^/scanner_/p')
. <(wget -qO- "$Url_Info/${printer[SCANKEY_DRV]}.lnk" | sed -n '/^DEB/s/^/scanKey_/p')
printer[SCANNER_DRV]="$scanner_DEB64"
printer[SCANKEY_DRV]="$scanKey_DEB64"
# if test -n "$VersionYear"; then
# if (( VersionYear >= 24 )) && test "${printer[SCANKEY_DRV]}" = "brscan-skey-0.3.2-0.amd64.deb"
# then
# printer[SCANKEY_DRV]="$Scankey_Drv_Deb_Name"
# fi
# else
# errQuit "Impossible d’évaluer la version de la distribution."
# fi
else
err+="1"
echo "Pas de pilote pour le scanner."
fi
exit
###########################
# préparation du système #
###########################
install_pkg "multiarch-support" "lib32stdc++6" "cups"
for d in "/usr/share/cups/model" "/var/spool/lpd"
do
if ! test -d "$d"
then
mkdir -pv "$d"
fi
done
for i in \
DCP-{11{0,5,7}C,120C,31{0,5}CN,340CW} \
FAX-{18{15,20,35,40}C,19{2,4}0CN,2440C} \
MFC-{21{0,5}C,32{2,4}0C,33{2,4}0CN,3420C,3820CN,4{1,2}0CN,425CN,5440CN,5840CN,620CN,640CW,820CW}
do
if test "$i" = "$modelName"
then
install_pkg "csh"
fi
done
for i in \
DCP-{1{0,4}00,80{{20,25D},{40,45D},{60,65DN}}} \
FAX-{2{850,900},3800,4{100,750e},5750e} \
HL-{1{030,230,2{4,5}0,270N,4{3,4,5}0,470N,650,670N,850,870N},5{0{3,4,5}0,070N,1{3,4}0,150D,170DN,240,2{5,7}0DN,280DW},6050{,D}} \
MFC-{4800,6800,8{4{20,40,60N},500,660DN,8{20D,40D,60DN,70DW}},9{0{3,7}0,1{6,8}0,420CN,660,7{0,6}0,8{0,6,8}0}}
do
if test "$i" = "$modelName"
then
verif_lien "/etc/init.d/lpd" "/etc/init.d/cups"
if test -L /sbin/init
then
verif_lien "/lib/systemd/system/cups.service" "/lib/systemd/system/lpd.service"
systemd daemon-reload
fi
fi
done
###############################
# téléchargement des pilotes #
###############################
for drv in "${printer[@]}"
do
if [[ $drv == @($printerName|no|yes) ]]; then continue;fi
if ! test -f "$tmpDir/$drv"
then
Url_Deb="$Url_Pkg/$drv"
if test "$drv" = "${printer[udev_rules]}"
then
Url_Deb="$Udev_Deb_Url/$drv"
fi
wget -cP "$tmpDir" "$Url_Deb"
fi
pkg2install+=( "$tmpDir/$drv" )
done
echo "PKG2INSTALL == ${pkg2install[*]}"
#exit
#installation des pilotes
if (( ${#pkg2install[*]} == 0 ))
then
errQuit "Rien à installer."
else
dpkg --install --force-all "${pkg2install[@]}"
fi
##################################
# configuration de l'imprimante #
##################################
#retrouver le fichier `.ppd' pour l'imprimante
for drv in "PRN_CUP_DEB" "PRN_DRV_DEB"
do
pkg=${printer[$drv]}
#echo "pkg == $pkg"
if test -n "$pkg" -a -f "$tmpDir/$pkg"
then
while read -rd '' fileName # avec ou sans option " r " ?
do
PPDs+=( "$fileName" )
done < <(dpkg --contents "$tmpDir/$pkg" | gawk 'BEGIN{ORS="\0"} /ppd/{sub(".","",$NF); print $NF}')
fi
done
#echo "PPDs == ${PPDs[*]}"
if test -z "$Ppd_File"
then
PPDs=( /usr/share/cups/model/**/*brother*@($printerName|$modelName)*.ppd )
fi
case ${#PPDs[*]} in
0) echo "no ppd"
err+="1"
;;
1) echo one ppd
Ppd_File=${PPDs[0]}
;;
*) err+="1"
echo "more than one ppd"
Ppd_File=${PPDs[0]}
;;
esac
cp /etc/cups/printers.conf.O /etc/cups/printers.conf "$tmpDir"
systemctl restart cups
sleep 1
if test -n "$IP"
then
lpadmin -p "$modelName" -E -v "lpd://$IP/binary_p1" -P "$Ppd_File"
else
lpadmin -p "$modelName" -E -v 'usb://dev/usb/lp0' -P "$Ppd_File"
fi
#############################
# configuration du scanner #
#############################
if test -z "$IP"
then #USB
if grep -q "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
then
echo " - Règle udev deja presente dans le fichier $Udev_Rules"
else
sed -i "/LABEL=\"libsane_usb_rules_begin\"/a\
\n# Brother\nATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
udevadm control --reload-rules
fi
else #network
for saneConf in /usr/bin/brsaneconfig{,{2..5}}
do
test -x "$saneConf" && cmd=$saneConf
done
if test -z "$cmd"
then
errQuit "no brsaneconfig found."
elif test "$cmd" = '/usr/bin/brsaneconfig4'
then
sed -i '/Support Model/a\
0x029a, 117, 1, "MFC-8690DW", 133, 4\
0x0279, 14, 2, "DCP-J525W"\
0x027b, 13, 2, "DCP-J725DW"\
0x027d, 13, 2, "DCP-J925DW"\
0x027f, 14, 1, "MFC-J280W"\
0x028f, 13, 1, "MFC-J425W"\
0x0281, 13, 1, "MFC-J430W"\
0x0280, 13, 1, "MFC-J435W"\
0x0282, 13, 1, "MFC-J625DW"\
0x0283, 13, 1, "MFC-J825DW"\
0x028d, 13, 1, "MFC-J835DW"' /opt/brother/scanner/brscan4/Brsane4.ini
fi
$cmd -a name=SCANNER model="$modelName" ip="$IP"
fi
if test -d "$libDir"
then
case $cmd in
/usr/bin/brsaneconfig)
cd "$libDir" || exit;
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$libDir"
ln -sf libbrscandec.so.1.0.0 libbrscandec.so.1
ln -sf libbrscandec.so.1 libbrscandec.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother.so.1.0.7 .
ln -sf libsane-brother.so.1.0.7 libsane-brother.so.1
ln -sf libsane-brother.so.1 libsane-brother.so
;;
/usr/bin/brsaneconfig2)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
ln -sf libbrscandec2.so.1 libbrscandec2.so
cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
ln -sf libbrcolm2.so.1 libbrcolm2.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother2.so.1.0.7 .
ln -sf libsane-brother2.so.1.0.7 libsane-brother2.so.1
ln -sf libsane-brother2.so.1 libsane-brother2.so
;;
/usr/bin/brsaneconfig3)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
ln -sf libbrscandec3.so.1 libbrscandec3.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother3.so.1.0.7 .
ln -sf libsane-brother3.so.1.0.7 libsane-brother3.so.1
ln -sf libsane-brother3.so.1 libsane-brother3.so
;;
/usr/bin/brsaneconfig4)
cd "$libDir"/sane || exit
ln -sf libsane-brother4.so.1.0.7 libsane-brother4.so.1
ln -sf libsane-brother4.so.1 libsane-brother4.so
;;
/usr/bin/brsaneconfig5)
cd "$libDir"/sane || exit
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
;;
esac
fi
A priori non , puisque meme sur mon ordi , j' obtiens :
iznobe@iznobe-pc:~$ sudo bash Scripts/Watael_brprinter_install.sh MFC-L2710DW 1.1.1.1
Connection to brother.com (13.248.151.157) 80 port [tcp/http] succeeded!
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N]
si je remplace par :
voilà j' ai trouvé la solution
, j ' obtiens :
iznobe@iznobe-pc:~$ sudo bash Scripts/Watael_brprinter_install.sh MFC-L2710DW 1.1.1.1
Connection to brother.com (13.248.151.157) 80 port [tcp/http] succeeded!
Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] ^C
iznobe@iznobe-pc:~$ sudo bash Scripts/Watael_brprinter_install.sh MFC-L2710DW 1.1.1.1
Connection to brother.com (13.248.151.157) 80 port [tcp/http] succeeded!
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
--- 1.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 28.897/29.970/31.043/1.073 ms
IP == 1.1.1.1
iznobe@iznobe-pc:~$
et là c' est OK .
meme avec une adresse erronée , il demande " en reseau ? " puis " adresse IP ? "
ce qui semble couvrir tout les cas .
Dernière modification par iznobe (Hier à 15:09)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#332 Hier à 15:12
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
le code qui " semble " bien aller :
#!/bin/bash -x
# > vim search whole line : `yy / <Ctrl-F> p <Enter>'
# définitions de variables
# gestion des arguments
# infos Brother
# quelques fonctions
# quelques vérifications
# initialisation du tableau associatif `printer'
# vérification de variables disponibles dans `printer'
# préparation du système
# téléchargement des pilotes
# configuration de l'imprimante
# configuration du scanner
# <
shopt -s extglob nullglob globstar
############################
# définitions de variables
############################
if test -f /etc/lsb-release
then
. /etc/lsb-release
DistroName="$DISTRIB_ID"
VersionYear="${DISTRIB_RELEASE::2}"
codeName="$DISTRIB_CODENAME"
elif test -f /usr/lib/os-release
then
. /usr/lib/os-release
DistroName="$NAME"
VersionYear="${VERSION_ID::2}"
codeName="$VERSION_CODENAME"
fi
user="$SUDO_USER"
arch="$(uname -m)"
date=$(date +%F_%T)
tmpDir="/tmp/packages"
Logfile="/home/$user/brprinter_install.log"
libDir="/usr/lib/$arch-linux-gnu"
declare -A printer
declare -i err
declare -a printer_IP printer_name
#################
# infos Brother
#################
# ancienne adresse d' obtention des infos :
#Url_Info="http://www.brother.com/pub/bsc/linux/infs"
# nouvelle adresse :
Url_Info="https://download.brother.com/pub/com/linux/linux/infs"
# Packages :
Url_Pkg="https://download.brother.com/pub/com/linux/linux/packages"
#Url_Pkg2="http://www.brother.com/pub/bsc/linux/packages" # ancienne adresse d'obtention des paquets
Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"
#Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=${printerName}_us_eu_as"
#######################
# quelques fonctions #
#######################
errQuit()
{
>&2 echo "$@"
exit 1
}
verif_lien()
{ # pour faire un boucle, suffit-il vérifier que le nombre d'arguments est pair ?
local lien=$1 cible=$2
if ! test -L "$lien"
then
ln -s "$cible" "$lien"
fi
}
install_pkg()
{
for pkg do
if ! dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null
then
apt-get install -qq "$pkg"
fi
done
}
###########################
# quelques vérifications #
###########################
#if test "$DistroName" != "Ubuntu"; then errQuit "La distribution n’est pas Ubuntu ou une des ses variantes officielles."; fi
if test "$SHELL" != "/bin/bash"; then errQuit "Shell non compatible. utilisez : bash"; fi
# if [[ $arch != @(i386|i686|) ]] armv7l
if test "$arch" != "x86_64"; then errQuit "Système non compatible."; fi
if ((EUID)); then errQuit "Vous devez lancer le script en root : sudo $0"; fi
if ! nc -z -w5 'brother.com' 80; then errQuit "le site \"brother.com\" n'est pas joignable."; fi
######################
# prérequis pour le script #
######################
# a remettre le script en service
# if test -f "$Logfile"; then
# Old_Date="$(head -n1 "$Logfile")"
# mv -v "$Logfile" "$Logfile"."$Old_Date".log
# fi
# echo "$date" >> "$Logfile" # indispensable pour la rotation du log .
#apt-get update -qq
# script : "wget" "nmap" "libxml2-utils" " gawk" "avahi-utils"
# imprimantes : "multiarch-support" "lib32stdc++6" "cups"
# scanner : "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
install_pkg "wget" "nmap" "libxml2-utils" "gawk" "avahi-utils"
if ! test -d "$tmpDir"
then
mkdir -pv "$tmpDir"
fi
declare -u modelName=$1
if test -z "$modelName"
then
##########################
# DETECTION AUTOMATIQUE #
##########################
# NET_printer_name= ???
##### VERSION NMAP #####
# my_IP="$(hostname -I | cut -d ' ' -f1)"
# mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
# #printer_IP=( $(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') )
# #echo "${printer_IP[*]}"
# for p_ip in "${printer_IP[@]}"; do
# if wget -E "$p_ip" -O "$tmpDir/index.html"; then
# printer_name+=( "$(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" )
# #echo "printer_name == ${printer_name[*]}"
# fi
# done
##### VERSION AVAHI-BROWSE #####
mapfile -t printer_IP < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {print $8}')
mapfile -t printer_name < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
##### VERSION AVAHI-BROWSE #####
#echo "printer_name RESULT ==
#TAB printer_IP == ${printer_IP[*]}
#TAB printer_name == ${printer_name[*]}"
# USB_printer_name= ???
if lsusb | grep -q 04f9:
then
mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}')
for p_usb in "${printer_usb[@]}"
do
printer_name+=( "$p_usb" )
printer_IP+=("USB")
done
fi
#echo "printer_name ==
#${#printer_name[*]} ,
#${printer_name[*]}"
case ${#printer_name[*]} in
0) echo "Aucune imprimante détectée !
Êtes vous sûr de l’avoir connectée au port USB de votre ordinateur ou à votre réseau local ?"
# on repars donc avec les questions de base : modele etc ...
;;
1) echo "Une seule imprimante détectée."
modelName=${printer_name[0]} # ! printer_name != printerName
IP=${printer_IP[0]}
# pas besoin de poser de question , il ne reste plus qu ' a installer
;;
*) echo "Plusieurs imprimantes ont été détectées."
# il faut presenter sous forme de liste les éléments recupérés :
# modele du materriel : IP ou USB
# et demander à l' utilisateur de choisir un numero dans cette liste
n_print=$(("${#printer_name[@]}"))
for n in "${!printer_name[@]}"
do
echo " $((n+1)) ⇒ ${printer_name[$n]} : ${printer_IP[$n]}"
done
while test -z "$choix"
do
read -rp "Choisissez le numéro qui correspond à l’imprimante que voulez installer : " choix
if ! ((choix > 0 && choix <= n_print))
then
echo "Choix invalide !"
unset choix
fi
done
modelName="${printer_name[$choix-1]}"
IP=${printer_IP[$choix-1]}
;;
esac
#else
##########################
# gestion des arguments #
##########################
until test -n "$modelName"
do
read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
fi
printerName="${modelName//-/}" # ! printer_name != printerName
# echo " printerName == $printerName"
# si on a une IP detectée
# ou bien si on a une IP en argument => controle
# sinon on demande l ' IP => controle
#check IP
if test "$IP" = "USB"
then
echo "Installation en USB."
unset IP
else
echo "Installation en réseau."
until test -n "$IP"
do
if test -n "$2"; then
IP=$2
shift $#
else
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
echo "$REPLY"
[[ $REPLY == [YyOo] ]] || break
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
if test -n "$IP"; then
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"; do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"; then
err=0
unset IP
#read -rp "Adresse erronée , re-donner l'IP de votre imprimante : " IP
echo "Adresse erronée !"
fi
fi
done
fi
echo "IP == $IP"
exit
###################################################
# initialisation du tableau associatif `printer' #
###################################################
# creation $Url_PrinterInfo
Url_PrinterInfo="$Url_Info/$printerName"
while IFS='=' read -r k v
do
printer[$k]=$v
done < <(wget -qO- "$Url_PrinterInfo" | sed '/\(]\|rpm\|=\)$/d')
#exit
#########################################################
# vérification de variables disponibles dans `printer' #
#########################################################
if test -n "${printer[LNK]}"; then # on telecharge le fichier donné en lien
Url_PrinterInfo="$Url_Info/${printer[LNK]}"
while IFS='=' read -r k v
do
printer[$k]=$v
done < <(wget -qO- "$Url_PrinterInfo" | sed '/\(]\|rpm\|=\)$/d')
fi
if ! test "${printer[PRINTERNAME]}" == "$printerName"
then
errQuit "Les données du fichier info récupéré et le nom de l’imprimante ne correspondent pas."
fi
if test -n "${printer[SCANNER_DRV]}"
then
install_pkg "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
printer[udev_rules]="$Udev_Deb_Name"
. <(wget -qO- "$Url_Info/${printer[SCANNER_DRV]}.lnk" | sed -n '/^DEB/s/^/scanner_/p')
. <(wget -qO- "$Url_Info/${printer[SCANKEY_DRV]}.lnk" | sed -n '/^DEB/s/^/scanKey_/p')
printer[SCANNER_DRV]="$scanner_DEB64"
printer[SCANKEY_DRV]="$scanKey_DEB64"
if test -n "$VersionYear"; then
if (( VersionYear >= 24 )) && test "${printer[SCANKEY_DRV]}" = "brscan-skey-0.3.2-0.amd64.deb"
then
printer[SCANKEY_DRV]="$Scankey_Drv_Deb_Name"
fi
else
errQuit "Impossible d’évaluer la version de la distribution."
fi
else
err+="1"
echo "Pas de pilote pour le scanner."
fi
###########################
# préparation du système #
###########################
install_pkg "multiarch-support" "lib32stdc++6" "cups"
for d in "/usr/share/cups/model" "/var/spool/lpd"
do
if ! test -d "$d"
then
mkdir -pv "$d"
fi
done
for i in \
DCP-{11{0,5,7}C,120C,31{0,5}CN,340CW} \
FAX-{18{15,20,35,40}C,19{2,4}0CN,2440C} \
MFC-{21{0,5}C,32{2,4}0C,33{2,4}0CN,3420C,3820CN,4{1,2}0CN,425CN,5440CN,5840CN,620CN,640CW,820CW}
do
if test "$i" = "$modelName"
then
install_pkg "csh"
fi
done
for i in \
DCP-{1{0,4}00,80{{20,25D},{40,45D},{60,65DN}}} \
FAX-{2{850,900},3800,4{100,750e},5750e} \
HL-{1{030,230,2{4,5}0,270N,4{3,4,5}0,470N,650,670N,850,870N},5{0{3,4,5}0,070N,1{3,4}0,150D,170DN,240,2{5,7}0DN,280DW},6050{,D}} \
MFC-{4800,6800,8{4{20,40,60N},500,660DN,8{20D,40D,60DN,70DW}},9{0{3,7}0,1{6,8}0,420CN,660,7{0,6}0,8{0,6,8}0}}
do
if test "$i" = "$modelName"
then
verif_lien "/etc/init.d/lpd" "/etc/init.d/cups"
if test -L /sbin/init
then
verif_lien "/lib/systemd/system/cups.service" "/lib/systemd/system/lpd.service"
systemd daemon-reload
fi
fi
done
###############################
# téléchargement des pilotes #
###############################
for drv in "${printer[@]}"
do
if [[ $drv == @($printerName|no|yes) ]]; then continue;fi
if ! test -f "$tmpDir/$drv"
then
Url_Deb="$Url_Pkg/$drv"
if test "$drv" = "${printer[udev_rules]}"
then
Url_Deb="$Udev_Deb_Url/$drv"
fi
wget -cP "$tmpDir" "$Url_Deb"
fi
pkg2install+=( "$tmpDir/$drv" )
done
echo "PKG2INSTALL == ${pkg2install[*]}"
#exit
#installation des pilotes
if (( ${#pkg2install[*]} == 0 ))
then
errQuit "Rien à installer."
else
dpkg --install --force-all "${pkg2install[@]}"
fi
##################################
# configuration de l'imprimante #
##################################
#retrouver le fichier `.ppd' pour l'imprimante
for drv in "PRN_CUP_DEB" "PRN_DRV_DEB"
do
pkg=${printer[$drv]}
#echo "pkg == $pkg"
if test -n "$pkg" -a -f "$tmpDir/$pkg"
then
while read -rd '' fileName # avec ou sans option " r " ?
do
PPDs+=( "$fileName" )
done < <(dpkg --contents "$tmpDir/$pkg" | gawk 'BEGIN{ORS="\0"} /ppd/{sub(".","",$NF); print $NF}')
fi
done
#echo "PPDs == ${PPDs[*]}"
if test -z "$Ppd_File"
then
PPDs=( /usr/share/cups/model/**/*brother*@($printerName|$modelName)*.ppd )
fi
case ${#PPDs[*]} in
0) echo "no ppd"
err+="1"
;;
1) echo one ppd
Ppd_File=${PPDs[0]}
;;
*) err+="1"
echo "more than one ppd"
Ppd_File=${PPDs[0]}
;;
esac
cp /etc/cups/printers.conf.O /etc/cups/printers.conf "$tmpDir"
systemctl restart cups
sleep 1
if test -n "$IP"
then
lpadmin -p "$modelName" -E -v "lpd://$IP/binary_p1" -P "$Ppd_File"
else
lpadmin -p "$modelName" -E -v 'usb://dev/usb/lp0' -P "$Ppd_File"
fi
#############################
# configuration du scanner #
#############################
if test -z "$IP"
then #USB
if grep -q "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
then
echo " - Règle udev deja presente dans le fichier $Udev_Rules"
else
sed -i "/LABEL=\"libsane_usb_rules_begin\"/a\
\n# Brother\nATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
udevadm control --reload-rules
fi
else #network
for saneConf in /usr/bin/brsaneconfig{,{2..5}}
do
test -x "$saneConf" && cmd=$saneConf
done
if test -z "$cmd"
then
errQuit "no brsaneconfig found."
elif test "$cmd" = '/usr/bin/brsaneconfig4'
then
sed -i '/Support Model/a\
0x029a, 117, 1, "MFC-8690DW", 133, 4\
0x0279, 14, 2, "DCP-J525W"\
0x027b, 13, 2, "DCP-J725DW"\
0x027d, 13, 2, "DCP-J925DW"\
0x027f, 14, 1, "MFC-J280W"\
0x028f, 13, 1, "MFC-J425W"\
0x0281, 13, 1, "MFC-J430W"\
0x0280, 13, 1, "MFC-J435W"\
0x0282, 13, 1, "MFC-J625DW"\
0x0283, 13, 1, "MFC-J825DW"\
0x028d, 13, 1, "MFC-J835DW"' /opt/brother/scanner/brscan4/Brsane4.ini
fi
$cmd -a name=SCANNER model="$modelName" ip="$IP"
fi
if test -d "$libDir"
then
case $cmd in
/usr/bin/brsaneconfig)
cd "$libDir" || exit;
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$libDir"
ln -sf libbrscandec.so.1.0.0 libbrscandec.so.1
ln -sf libbrscandec.so.1 libbrscandec.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother.so.1.0.7 .
ln -sf libsane-brother.so.1.0.7 libsane-brother.so.1
ln -sf libsane-brother.so.1 libsane-brother.so
;;
/usr/bin/brsaneconfig2)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
ln -sf libbrscandec2.so.1 libbrscandec2.so
cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
ln -sf libbrcolm2.so.1 libbrcolm2.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother2.so.1.0.7 .
ln -sf libsane-brother2.so.1.0.7 libsane-brother2.so.1
ln -sf libsane-brother2.so.1 libsane-brother2.so
;;
/usr/bin/brsaneconfig3)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
ln -sf libbrscandec3.so.1 libbrscandec3.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother3.so.1.0.7 .
ln -sf libsane-brother3.so.1.0.7 libsane-brother3.so.1
ln -sf libsane-brother3.so.1 libsane-brother3.so
;;
/usr/bin/brsaneconfig4)
cd "$libDir"/sane || exit
ln -sf libsane-brother4.so.1.0.7 libsane-brother4.so.1
ln -sf libsane-brother4.so.1 libsane-brother4.so
;;
/usr/bin/brsaneconfig5)
cd "$libDir"/sane || exit
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
;;
esac
fi
Dernière modification par iznobe (Hier à 15:14)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#333 Hier à 15:14
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
iznobe@k-pi3:~ $ sudo bash brprinter_install.sh DCPL3560CDW 1.1.1.1 printerName == DCPL3560CDW IP == Installation en réseau. Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N]
Jusqu’ici je ne vois rien d’anormal puisqu’on ne sait pas encore si on va faire une installation en réseau (le « echo "Installation en réseau." » n’est pas correct).
Que se passe-t-il en répondant o ?
meme sur mon ordi , j' obtiens :
iznobe@iznobe-pc:~$ sudo bash Scripts/Watael_brprinter_install.sh MFC-L2710DW 1.1.1.1 Connection to brother.com (13.248.151.157) 80 port [tcp/http] succeeded! Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N]
Même question : que se passe-t-il en répondant o ?
Hors ligne
#334 Hier à 15:16
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ba si on fournit une IP , on est censé obtenir :
IP == echo "$IP"
et pas " " ...
et donc il n' a pas besoin de rentrer dans le cas ou il demande l' IP puisqu' elle est fournie .
et donc pas non plus si on veut installer en reseau , surtout si elle est valide .
Surtout qu on voit le ping OK , donc il a validé l ' IP ...
Dernière modification par iznobe (Hier à 15:19)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#335 Hier à 15:23
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
Ton code en #332 fonctionne également. Je crois qu’on peut en rester là.
Hors ligne
#336 Hier à 15:26
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
Surtout qu on voit le ping OK , donc il a validé l ' IP ...
Sauf que, comme je l’ai dit, le ping valide une adresse comme 1.1.1.1. Ce n’est pas terrible.
Hors ligne
#337 Hier à 15:57
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
oui , c' est sur .
Mais c' est pratique pour les test
Sinon , quoi faire ?
parceque du coup , comme ça , ca autorise d ' installer une imprimante en externe situé a coté d' un serveur ( ce qui est mon cas ) .
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#338 Hier à 16:01
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
Ton code en #332 fonctionne également.
À part le fait que le « echo "Installation en réseau." » est mal placé car on ne sait pas encore à ce moment là si on va vraiment faire une installation en réseau.
#check IP
if test "$IP" = "USB"
then
echo "Installation en USB."
unset IP
else
until test -n "$IP"
do
if test -n "$2"; then
IP=$2
shift $#
else
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
echo "$REPLY"
[[ $REPLY == [YyOo] ]] || break
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
if test -n "$IP"; then
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"; do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"; then
err=0
unset IP
#read -rp "Adresse erronée , re-donner l'IP de votre imprimante : " IP
echo "Adresse erronée !"
fi
fi
done
if test -n #$IP"
then
echo "Installation en réseau."
else
echo "Installation en USB."
fi
fi
Dernière modification par nany (Hier à 16:07)
Hors ligne
#339 Hier à 16:08
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
Sinon , quoi faire ?
Je ne sais pas. ¯\_(ツ)_/¯
Il faudrait peut-être pouvoir tester si l’adresse IP renseignée est une adresse potentielle du réseau local avant de faire un ping ?
Hors ligne
#340 Hier à 16:22
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
pour l ' affichage " installation en reseau " , si ce n' est pas en USB , il n' y a pas d' autre choix que de tenter l ' install reseau .
pour ca que je l' ai mis tout en haut .
Il faudrait peut-être pouvoir tester si l’adresse IP renseignée est une adresse potentielle du réseau local avant de faire un ping ?
c' est justement ça qui m' empecherait d' installer l ' imprimante situé au coté de mon serveur sur mon ordinateur de la maison
Enfin je pense .
Ca serait dommage de se priver d' une capacité aussi intéressante non ?
Dernière modification par iznobe (Hier à 16:29)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#341 Hier à 16:41
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
pour l ' affichage " installation en reseau " , si ce n' est pas en USB , il n' y a pas d' autre choix que de tenter l ' install reseau .
Non car on ne sait pas encore s’il y a un deuxième argument et donc si on va traiter cette partie réseau ou non.
nany a écrit :Il faudrait peut-être pouvoir tester si l’adresse IP renseignée est une adresse potentielle du réseau local avant de faire un ping ?
c' est justement ça qui m' empecherait d' installer l ' imprimante situé au coté de mon serveur sur mon ordinateur de la maison
Enfin je pense .
Ca serait dommage de se priver d' une capacité aussi inintéressante non ?
Certes, mais il existe une multitude d’adresses internet qui répondent au ping et qui ne correspondent pas à une imprimante.
D’ailleurs, on n’est même pas sûr que l’adresse IP saisie, quand bien même celle-ci est locale, soit une adresse d’imprimante.
En l’état actuelle des choses, on fait confiance à l’utilisateur pour qu’il saisisse bien l’adresse IP de l’imprimante.
Hors ligne
#342 Hier à 16:44
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
Watael a écrit :if test "$IP" = "USB"
à ce moment du script IP n'est pas encore assigné
Peut-être que si car, s’il n’y avait pas d’argument $1 alors on est donc passé dans la détection automatique (qui assigne une valeur à $IP (sauf si pas d’imprimante détectée)), sinon il y avait un argument $1 et là $IP n’est pas encore assignée donc on passe au else pour vérifier si $2 est présent.
ça me renforce dans l'idée d'un contrôle plus strict (via getopts) des paramètres.
alors, soit on renseigne obligatoirement les options passées
soit on interagit avec l'utilisateur pour chaque option manquante
parce que là à jouer à cache-cache avec des paramètres qui peuvent être présent (ou pas), ici, là ou ailleurs (ou pas ), on perd de vue le véritable intérêt/but du script.
Dernière modification par Watael (Hier à 16:45)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#343 Hier à 16:50
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
parce que là à jouer à cache-cache avec des paramètres qui peuvent être présent (ou pas), ici, là ou ailleurs (ou pas
), on perd de vue le véritable intérêt/but du script.
Je suis bien d’accord.
Donc @iznobe : « cent fois sur le métier remets ton ouvrage ».
Hors ligne
#344 Hier à 17:04
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ba , là , ca parait bien .
soit on passe les arguments et ca traite ce qu ' on a entré en permettant d' installer même sur une IP externe ( le top du top ) .
soit on ne passe aucun argument et on a droit à la détection automatique .
Et si rien n' est détecté on passe en mode interactif avec l' utilisateur .
c' est pas compliqué ...
il reste encore à voir la partie scanner : DEB64 ...
A refaire ( ce dont je n' ai pas envie ) , autant partir sur un tableau qui couple : modele / IP ( si pas d' IP , USB ) , ca simplifiera les choses à mon avis .
dans l' idée de ce qu' avait fait @nany a un moment .
Pour les paramètres , de toute manière , je n' ai pas le niveau
Dernière modification par iznobe (Hier à 17:09)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#345 Hier à 19:34
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Dans le script, j'ai du mal à comprendre comment la ligne suivante peut donner un résultat pertinent :
mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
En adaptant à mon I.P et en enlevant le filtre bien sur, la commande suivante
sudo nmap -sn -oG - 192.138.0.38/24
me renvoie ça :
# Nmap 7.95 scan initiated Sun Aug 17 16:33:55 2025 as: nmap -sn -oG - 192.138.0.38/24 Host: 192.138.0.1 () Status: Up Host: 192.138.0.2 () Status: Up Host: 192.138.0.8 () Status: Up Host: 192.138.0.9 () Status: Up Host: 192.138.0.12 () Status: Up Host: 192.138.0.45 () Status: Up Host: 192.138.0.238 () Status: Up Host: 192.138.0.239 () Status: Up Host: 192.138.0.255 () Status: Up # Nmap done at Sun Aug 17 16:34:03 2025 -- 256 IP addresses (9 hosts up) scanned in 7.97 seconds
Il n'y a pas de trace d'un quelconque nom d'imprimante... Est-ce que l'I.P est vraiment importante du moment qu'on arrive à déterminer le modèle de l'imprimante existant ?
Autrement, il y a également lpstat qui donne des infos sur le modèle :
lpstat -a Canon_MF620C_Series accepte des requêtes depuis dim. 17 août 2025 15:59:36
lpstat -v matériel pour Canon_MF620C_Series : implicitclass://Canon_MF620C_Series/
Et aussi arp-scan qui donnera une liste d'I.P dont celle de l'imprimante mais sans nommer implicitement la marque (mes adresses MAC sont masqués):
sudo arp-scan -q --localnet Interface: eno1, type: EN10MB, MAC: xx:xx:xx:xx:xx:xx, IPv4: 192.168.0.38 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.0.27 xx:xx:xx:xx:xx:xx 192.168.0.44 xx:xx:xx:xx:xx:xx 192.168.0.1 xx:xx:xx:xx:xx:xx 192.168.0.9 xx:xx:xx:xx:xx:xx 192.168.0.28 xx:xx:xx:xx:xx:xx 192.168.0.7 xx:xx:xx:xx:xx:xx 192.168.0.39 xx:xx:xx:xx:xx:xx 192.168.0.47 xx:xx:xx:xx:xx:xx 192.168.0.10 xx:xx:xx:xx:xx:xx 192.168.0.254 xx:xx:xx:xx:xx:xx 192.168.0.6 xx:xx:xx:xx:xx:xx 11 packets received by filter, 0 packets dropped by kernel Ending arp-scan 1.10.0: 256 hosts scanned in 1.868 seconds (137.04 hosts/sec). 11 responded
Salut @lynn , situ passes par là , peux tu me donner les retours suivants stp :
sudo apt install avahi-utils
avahi-browse -d local -a -tkr | grep -i Canon
stp , que je voie ce qu ' on peut faire pour optimiser les résultats de la detection automatique .
Dernière modification par iznobe (Hier à 19:35)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#346 Hier à 21:59
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
sinon , on peut remplacer ( presque ) toute la partie lsusb :
# USB_printer_name= ???
if lsusb | grep -q 04f9:
then
mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}')
for p_usb in "${printer_usb[@]}"
do
printer_name+=( "$p_usb" )
printer_IP+=("USB")
done
fi
par :
# USB_printer_name= ???
mapfile -t printer_IP < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
Mais je sais pas trop comment faire pour la partie ...
printer_IP+=("USB")
Dernière modification par iznobe (Hier à 22:12)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#347 Hier à 22:19
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
à voir :
#!/bin/bash
# Gestion des options
# -n nom : modèle de l'imprimante/scanner
# -u usb : pas de paramètres
# -i réseau : ip de l'imprimante/scanner
# -u et -i sont exclusives
errQuit()
{
>&2 echo "$@"
exit 1
}
excluOpts()
{
if test -v $1; then errQuit "-u et -i ne peuvent pas être utilisées simultanément"; fi
}
while getopts n:i:u option
do
case $option in
n) modelName=$OPTARG
;;
u) excluOpts ip
usb=usb #pour la démo, sinon usb=1
;;
i) excluOpts usb
ip=$OPTARG
;;
esac
done
shift $((--OPTIND))
printf 'model: %s\nconnexion: %s\n' $modelName $usb $ip
petit problème si on passe -u avec un argument avant d'autres options, ça merdoie.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#348 Hier à 22:31
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
heu ...
déjà , faudrait m' expliquer comment tu appelles le script du coup ...
Tu fais genre comme pour une commande ?
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne
#349 Hier à 22:40
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
ouaip!
$ nomScript -n modelImpScan -i xxx.xxx.xxx.xxx # o -u
le code est succinct; c'est pour que tu vois comment fonctionne getopts et l'exclusion d'option.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#350 Hier à 23:30
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ouai , c' est cool . mais bon , clairement , je connais pas la moitié des mots clés utilisés ...
le code harmonisé / nettoyer et modifs de 2 / 3 bricoles :
#!/bin/bash -x
# > vim search whole line : `yy / <Ctrl-F> p <Enter>'
# définitions de variables
# gestion des arguments
# infos Brother
# quelques fonctions
# quelques vérifications
# prérequis pour le script
# initialisation du tableau associatif `printer'
# vérification de variables disponibles dans `printer'
# préparation du système
# téléchargement des pilotes
# configuration de l'imprimante
# configuration du scanner
# <
shopt -s extglob nullglob globstar
#############################
# définitions de variables #
#############################
if test -f /etc/lsb-release
then
. /etc/lsb-release
DistroName="$DISTRIB_ID"
VersionYear="${DISTRIB_RELEASE::2}"
codeName="$DISTRIB_CODENAME"
elif test -f /usr/lib/os-release
then
. /usr/lib/os-release
DistroName="$NAME"
VersionYear="${VERSION_ID::2}"
codeName="$VERSION_CODENAME"
fi
user="$SUDO_USER"
arch="$(uname -m)"
date=$(date +%F_%T)
tmpDir="/tmp/packages"
Logfile="/home/$user/brprinter_install.log"
libDir="/usr/lib/$arch-linux-gnu"
declare -u modelName=$1
declare -A printer
declare -i err
declare -a printer_IP printer_name
##################
# infos Brother #
##################
# Infos
Url_Info="https://download.brother.com/pub/com/linux/linux/infs"
# Packages :
Url_Pkg="https://download.brother.com/pub/com/linux/linux/packages"
Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"
Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=${printerName}_us_eu_as"
#######################
# quelques fonctions #
#######################
errQuit()
{
>&2 echo "$@"
exit 1
}
verif_lien()
{ # pour faire un boucle, suffit-il vérifier que le nombre d'arguments est pair ?
local lien=$1 cible=$2
if ! test -L "$lien"
then
ln -s "$cible" "$lien"
fi
}
install_pkg()
{
for pkg do
if ! dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null
then
apt-get install -qq "$pkg"
fi
done
}
###########################
# quelques vérifications #
###########################
if test "$DistroName" != "Ubuntu"; then errQuit "La distribution n’est pas Ubuntu ou une des ses variantes officielles."; fi
if test "$SHELL" != "/bin/bash"; then errQuit "Shell non compatible. utilisez : bash"; fi
if test "$arch" != "x86_64"; then errQuit "Système non compatible."; fi
if ((EUID)); then errQuit "Vous devez lancer le script en root : sudo $0"; fi
if ! nc -z -w5 'brother.com' 80; then errQuit "le site \"brother.com\" n'est pas joignable."; fi
#############################
# prérequis pour le script #
#############################
# a remettre le script en service
# if test -f "$Logfile"; then
# Old_Date="$(head -n1 "$Logfile")"
# mv -v "$Logfile" "$Logfile"."$Old_Date".log
# fi
# echo "$date" >> "$Logfile" # indispensable pour la rotation du log .
apt-get update -qq
sleep 1
# script : "wget" "nmap"( - ) "libxml2-utils" " gawk" "avahi-utils"
# imprimantes : "multiarch-support" "lib32stdc++6" "cups"
# scanner : "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
install_pkg "wget" "libxml2-utils" "gawk" "avahi-utils"
if ! test -d "$tmpDir"
then
mkdir -pv "$tmpDir"
fi
if test -z "$modelName"
then
##########################
# DETECTION AUTOMATIQUE #
##########################
# NET_printer_name= ???
##### VERSION NMAP #####
# my_IP="$(hostname -I | cut -d ' ' -f1)"
# mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
# #printer_IP=( $(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') )
# #echo "${printer_IP[*]}"
# for p_ip in "${printer_IP[@]}"; do
# if wget -E "$p_ip" -O "$tmpDir/index.html"; then
# printer_name+=( "$(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" )
# #echo "printer_name == ${printer_name[*]}"
# fi
# done
##### VERSION AVAHI-BROWSE ( plus rapide et plus simple que nmap )#####
mapfile -t printer_IP < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {print $8}')
mapfile -t printer_name < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
# USB_printer_name= ???
# mapfile -t printer_IP < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
if lsusb | grep -q 04f9:
then
mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}')
for p_usb in "${printer_usb[@]}"
do
printer_name+=( "$p_usb" )
printer_IP+=("USB")
done
fi
case ${#printer_name[*]} in
0) echo "Aucune imprimante détectée !
Êtes vous sûr de l’avoir connectée au port USB de votre ordinateur ou à votre réseau local ?"
# on repars donc avec les questions de base : modele etc ...
;;
1) echo "Une seule imprimante détectée."
modelName=${printer_name[0]} # ! printer_name != printerName
IP=${printer_IP[0]}
# pas besoin de poser de question , il ne reste plus qu ' a installer
;;
*) echo "Plusieurs imprimantes ont été détectées."
# il faut presenter sous forme de liste les éléments recupérés :
# modele du materriel : IP ou USB
# et demander à l' utilisateur de choisir un numero dans cette liste
n_print=$(("${#printer_name[@]}"))
for n in "${!printer_name[@]}"
do
echo " $((n+1)) ⇒ ${printer_name[$n]} : ${printer_IP[$n]}"
done
while test -z "$choix"
do
read -rp "Choisissez le numéro qui correspond à l’imprimante que voulez installer : " choix
echo "$choix"
if ! ((choix > 0 && choix <= n_print))
then
echo "Choix invalide !"
unset choix
fi
done
modelName="${printer_name[$choix-1]}"
IP=${printer_IP[$choix-1]}
;;
esac
##########################
# gestion des arguments #
##########################
until test -n "$modelName"
do
read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
fi
printerName="${modelName//-/}" # ! printer_name != printerName
#check IP
if test "$IP" = "USB"
then
unset IP
echo "Installation en USB."
else
until test -n "$IP"
do
if test -n "$2"; then
IP=$2
shift $#
else
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
echo "$REPLY"
if [[ $REPLY == [YyOo] ]]; then
read -rp "Entrez l’adresse IP de votre imprimante : " IP
else
echo "Installation en USB."
break
fi
fi
if test -n "$IP"; then
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"; do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"; then
err=0
unset IP
echo "Adresse erronée !"
fi
echo "Installation en réseau."
fi
done
fi
###################################################
# initialisation du tableau associatif `printer' #
###################################################
# creation $Url_PrinterInfo
Url_PrinterInfo="$Url_Info/$printerName"
while IFS='=' read -r k v
do
printer[$k]=$v
done < <(wget -qO- "$Url_PrinterInfo" | sed '/\(]\|rpm\|=\)$/d')
#########################################################
# vérification de variables disponibles dans `printer' #
#########################################################
if test -n "${printer[LNK]}"; then # on telecharge le fichier donné en lien
Url_PrinterInfo="$Url_Info/${printer[LNK]}" # ????
while IFS='=' read -r k v
do
printer[$k]=$v
done < <(wget -qO- "$Url_PrinterInfo" | sed '/\(]\|rpm\|=\)$/d')
fi
if ! test "${printer[PRINTERNAME]}" == "$printerName"
then
errQuit "Les données du fichier info récupéré et le nom de l’imprimante ne correspondent pas."
fi
if test -n "${printer[SCANNER_DRV]}"
then
install_pkg "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
printer[udev_rules]="$Udev_Deb_Name"
. <(wget -qO- "$Url_Info/${printer[SCANNER_DRV]}.lnk" | sed -n '/^DEB/s/^/scanner_/p')
. <(wget -qO- "$Url_Info/${printer[SCANKEY_DRV]}.lnk" | sed -n '/^DEB/s/^/scanKey_/p')
printer[SCANNER_DRV]="$scanner_DEB64"
printer[SCANKEY_DRV]="$scanKey_DEB64"
if test -n "$VersionYear"; then
if (( VersionYear >= 24 )) && test "${printer[SCANKEY_DRV]}" = "brscan-skey-0.3.2-0.amd64.deb"
then
printer[SCANKEY_DRV]="$Scankey_Drv_Deb_Name"
fi
else
errQuit "Impossible d’évaluer la version de la distribution."
fi
else
err+="1"
echo "Pas de pilote pour le scanner."
fi
###########################
# préparation du système #
###########################
install_pkg "multiarch-support" "lib32stdc++6" "cups"
for d in "/usr/share/cups/model" "/var/spool/lpd"
do
if ! test -d "$d"
then
mkdir -pv "$d"
fi
done
for i in \
DCP-{11{0,5,7}C,120C,31{0,5}CN,340CW} \
FAX-{18{15,20,35,40}C,19{2,4}0CN,2440C} \
MFC-{21{0,5}C,32{2,4}0C,33{2,4}0CN,3420C,3820CN,4{1,2}0CN,425CN,5440CN,5840CN,620CN,640CW,820CW}
do
if test "$i" = "$modelName"
then
install_pkg "csh"
fi
done
for i in \
DCP-{1{0,4}00,80{{20,25D},{40,45D},{60,65DN}}} \
FAX-{2{850,900},3800,4{100,750e},5750e} \
HL-{1{030,230,2{4,5}0,270N,4{3,4,5}0,470N,650,670N,850,870N},5{0{3,4,5}0,070N,1{3,4}0,150D,170DN,240,2{5,7}0DN,280DW},6050{,D}} \
MFC-{4800,6800,8{4{20,40,60N},500,660DN,8{20D,40D,60DN,70DW}},9{0{3,7}0,1{6,8}0,420CN,660,7{0,6}0,8{0,6,8}0}}
do
if test "$i" = "$modelName"
then
verif_lien "/etc/init.d/lpd" "/etc/init.d/cups"
if test -L /sbin/init
then
verif_lien "/lib/systemd/system/cups.service" "/lib/systemd/system/lpd.service"
systemd daemon-reload
fi
fi
done
###############################
# téléchargement des pilotes #
###############################
for drv in "${printer[@]}"
do
if [[ $drv == @($printerName|no|yes) ]]; then continue;fi
if ! test -f "$tmpDir/$drv"
then
Url_Deb="$Url_Pkg/$drv"
if test "$drv" = "${printer[udev_rules]}"
then
Url_Deb="$Udev_Deb_Url/$drv"
fi
wget -cP "$tmpDir" "$Url_Deb"
fi
pkg2install+=( "$tmpDir/$drv" )
done
# installation des pilotes
if (( ${#pkg2install[*]} == 0 ))
then
errQuit "Rien à installer."
else
dpkg --install --force-all "${pkg2install[@]}"
fi
##################################
# configuration de l'imprimante #
##################################
#retrouver le fichier `.ppd' pour l'imprimante
for drv in "PRN_CUP_DEB" "PRN_DRV_DEB"
do
pkg=${printer[$drv]}
if test -n "$pkg" -a -f "$tmpDir/$pkg"
then
while read -rd '' fileName
do
PPDs+=( "$fileName" )
done < <(dpkg --contents "$tmpDir/$pkg" | gawk 'BEGIN{ORS="\0"} /ppd/{sub(".","",$NF); print $NF}')
fi
done
if test -z "$Ppd_File"
then
PPDs=( /usr/share/cups/model/**/*brother*@($printerName|$modelName)*.ppd )
fi
case ${#PPDs[*]} in
0) echo "no ppd"
err+="1"
;;
1) echo one ppd
Ppd_File=${PPDs[0]}
;;
*) err+="1"
echo "plus d'un fichier ppd trouvé , utilisation du 1er."
Ppd_File=${PPDs[0]}
;;
esac
cp /etc/cups/printers.conf.O /etc/cups/printers.conf "$tmpDir"
systemctl restart cups
sleep 1
if test -n "$IP"
then
lpadmin -p "$modelName" -E -v "lpd://$IP/binary_p1" -P "$Ppd_File"
else
lpadmin -p "$modelName" -E -v 'usb://dev/usb/lp0' -P "$Ppd_File"
fi
#############################
# configuration du scanner #
#############################
if test -z "$IP"
then #USB
if grep -q "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
then
echo " - Règle udev deja presente dans le fichier $Udev_Rules"
else
sed -i "/LABEL=\"libsane_usb_rules_begin\"/a\
\n# Brother\nATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
udevadm control --reload-rules
fi
else #network
for saneConf in /usr/bin/brsaneconfig{,{2..5}}
do
test -x "$saneConf" && cmd=$saneConf
done
if test -z "$cmd"
then
errQuit "no brsaneconfig found."
elif test "$cmd" = '/usr/bin/brsaneconfig4'
then
sed -i '/Support Model/a\
0x029a, 117, 1, "MFC-8690DW", 133, 4\
0x0279, 14, 2, "DCP-J525W"\
0x027b, 13, 2, "DCP-J725DW"\
0x027d, 13, 2, "DCP-J925DW"\
0x027f, 14, 1, "MFC-J280W"\
0x028f, 13, 1, "MFC-J425W"\
0x0281, 13, 1, "MFC-J430W"\
0x0280, 13, 1, "MFC-J435W"\
0x0282, 13, 1, "MFC-J625DW"\
0x0283, 13, 1, "MFC-J825DW"\
0x028d, 13, 1, "MFC-J835DW"' /opt/brother/scanner/brscan4/Brsane4.ini
fi
$cmd -a name=SCANNER model="$modelName" ip="$IP"
fi
if test -d "$libDir"
then
case $cmd in
/usr/bin/brsaneconfig)
cd "$libDir" || exit;
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$libDir"
ln -sf libbrscandec.so.1.0.0 libbrscandec.so.1
ln -sf libbrscandec.so.1 libbrscandec.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother.so.1.0.7 .
ln -sf libsane-brother.so.1.0.7 libsane-brother.so.1
ln -sf libsane-brother.so.1 libsane-brother.so
;;
/usr/bin/brsaneconfig2)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
ln -sf libbrscandec2.so.1 libbrscandec2.so
cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
ln -sf libbrcolm2.so.1 libbrcolm2.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother2.so.1.0.7 .
ln -sf libsane-brother2.so.1.0.7 libsane-brother2.so.1
ln -sf libsane-brother2.so.1 libsane-brother2.so
;;
/usr/bin/brsaneconfig3)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
ln -sf libbrscandec3.so.1 libbrscandec3.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother3.so.1.0.7 .
ln -sf libsane-brother3.so.1.0.7 libsane-brother3.so.1
ln -sf libsane-brother3.so.1 libsane-brother3.so
;;
/usr/bin/brsaneconfig4)
cd "$libDir"/sane || exit
ln -sf libsane-brother4.so.1.0.7 libsane-brother4.so.1
ln -sf libsane-brother4.so.1 libsane-brother4.so
;;
/usr/bin/brsaneconfig5)
cd "$libDir"/sane || exit
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
;;
esac
fi
je le met aussi sur github , celui là .
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
En ligne