Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#326 Hier à 13:49

nany

Re : remise au gout du jour du script de demonipuch imprimante brother

iznobe a écrit :

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 big_smile :

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

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
…
~$ 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. hmm

Hors ligne

#329 Hier à 14:21

iznobe

Re : remise au gout du jour du script de demonipuch imprimante brother

iznobe a écrit :

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 :
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. hmm

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 roll

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

iznobe a écrit :

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 a écrit :
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 ?

iznobe a écrit :

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

iznobe a écrit :

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. hmm

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 tongue
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

nany a écrit :

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. tongue

#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

iznobe a écrit :

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 .

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 roll
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

iznobe a écrit :

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.
 


iznobe a écrit :
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 roll
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

nany a écrit :
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 big_smile ), 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

Watael a écrit :

parce que là à jouer à cache-cache avec des paramètres qui peuvent être présent (ou pas), ici, là ou ailleurs (ou pas big_smile ), 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 ». tongue

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 big_smile ) , 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 tongue

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

lynn a écrit :

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. hmm


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