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.

#301 Le 17/08/2025, à 22:17

nany

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

iznobe a écrit :

( probablement normal tongue vu que c ' est pas du 64 bit et une archi en armvl / armhf)

Oui, c’est tout à fait normal pour un pi.
C’est d’ailleurs étonnant que tu ne sois pas éjecté par cette ligne :

if test "$arch" != "x86_64"; then errQuit "Système non compatible."; fi

À moins que tu l’aies commenté et dé-commenté celle-ci :

#if test "$arch" != "armv7l"; then errQuit "Système non compatible."; fi

Dernière modification par nany (Le 17/08/2025, à 22:18)

Hors ligne

#302 Le 17/08/2025, à 22:20

nany

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

iznobe a écrit :

Comme personne a répondu à ma question ( posée plusieurs fois )

Quelle question ?
J’ai dû louper quelque chose.

Hors ligne

#303 Le 18/08/2025, à 07:08

iznobe

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

Bonjour .

A priori mon pi est en rade yikes

pour remplacer nmap par avahi , voici ce que j' ai fais :

	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}')

Le code complet :

#!/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 test "$arch" != "armv7l"; then errQuit "Système non compatible."; 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
                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"
#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] "
        [[ $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"
F_P_fichier_Info="$tmpDir/$printerName.info"
wget -q "$Url_PrinterInfo" -O "$F_P_fichier_Info"
if ! test "$(grep PRINTERNAME "$F_P_fichier_Info" | cut -d= -f2)" == "$printerName"
then
    errQuit "Les données du fichier info récupéré et le nom de l’imprimante ne correspondent pas."
elif test "$(grep LNK "$F_P_fichier_Info" | cut -d= -f2)"; then
    Url_PrinterInfo="$Url_Info/$(grep LNK "$F_P_fichier_Info" | cut -d= -f2)"
fi
#echo "$Url_PrinterInfo"
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[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 #
###############################
#echo " DL DRV TAB == ${printer[*]}"
for drv in "${printer[@]}"
do
    if [[ $drv == @($printerName|no|yes) ]]; then continue;fi
    for addr in $Url_Pkg
    do
        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"
        else
            break
        fi
    done
    pkg2install+=( "$tmpDir/$drv" )
done
echo "PKG2INSTALL == ${pkg2install[*]}"
#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

si quelqu ' un veut tester en attendant que je remette mon pi en route .
il ya un

exit 

en ligne 251 dans le code ci-dessus .
Donc le script ne modifie rien sur votre ordinateur hors mis qu il va creer le dossier /tmp/packages pour y stocker les fichiers dont il a besoin pour aller jusqu ' au " exit " .
Pour tester le script en totalité , il faudra enlever le exit .

EDIT code suite aux remarques du message suivant de @nany .

Dernière modification par iznobe (Le 18/08/2025, à 11:33)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#304 Le 18/08/2025, à 10:21

iznobe

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

nany a écrit :
iznobe a écrit :

Comme personne a répondu à ma question ( posée plusieurs fois )

Quelle question ?
J’ai dû louper quelque chose.

je demandais si pour le post de code au complet , ce n' était pas mieux de faire ça sur le github , plutôt qu ' en passant par le forum , pour éviter de surcharger ( inutilement ? ) le serveur du forum .


et oui , pour tester sur le pi , j' ai du modifier le code de façon a ce que ca passe , je n' ai pas d' ordi ubuntu pour tester avec l' imprimante ...
le seul truc dispo , c' est le rapberry pi ( en 32 bit sous raspios bookworm ) . la carte n' a pas aimé les tests à répétition ... à priori elle est morte , j' ai une erreur avec le secteur 0 qui ne peut pas être écrit roll .

Dernière modification par iznobe (Le 18/08/2025, à 10:31)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#305 Le 18/08/2025, à 11:23

nany

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

Bonjour,



iznobe a écrit :
	mapfile -t printer_IP < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ print $8}')

Il manque une accolade ouvrante devant le print.

	mapfile -t printer_IP < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {print $8}')
iznobe a écrit :
if test "$IP" = "USB" # ???????????????

S’il y a une suite de points d’interrogation, c’est que tu te demandes pourquoi on fait ce test.
Eh bien si l’imprimante est en USB, $IP prend la valeur "USB", on teste donc cette valeur pour déterminer le type d’installation et sinon on demande éventuellement (dans le cas où $IP est vide) si on veut installer en réseau avec une demande de saisie d’IP et vérification de le validité de l’IP.
D’ailleurs, je me rends compte qu’il faut vider la variable si celle-ci est "USB" sinon il y aura des problèmes lors de la configuration de l’imprimante et du scanner.

if test "$IP" = "USB"
then
    echo "Installation en USB."
    unset IP
else

 


iznobe a écrit :

je demandais si pour le post de code au complet , ce n' était pas mieux de faire ça sur le github , plutôt qu ' en passant par le forum , pour éviter de surcharger ( inutilement ? ) le serveur du forum .

Effectivement, j’avais loupé ça (il faut dire que ma première intervention dans la discussion était tardive).
Honnêtement, je ne sais pas.

Hors ligne

#306 Le 18/08/2025, à 11:36

iznobe

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

les " ?????? " je les met en general  quand je pressent que ca va poser probleme tongue

avec le unset , je laisse les ???? histoire de verifier dans mes prochains test comment ça se passe .
Mais effectivement ca devrait aller mieux big_smile

Merci pour la correction de " {  " qui manquait dans le gawk .

j ' ai rectifier le code dans le message precedent plutot que de reposter un code au complet .

je finalise la reinstallation de mon pi roll

Dernière modification par iznobe (Le 18/08/2025, à 11:37)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#307 Le 19/08/2025, à 22:34

iznobe

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

Bonjour , je viens de tester en vitesse le script ça m' a l ' air pas trop mal .

j ' ai mis le code sur le github .
Pour ceux qui veulent aider a tester , sans rien modifier à leur ordinateur :
telecharger le script et decommenter le  " exit " de la ligne 254 et donner les retours svp , si possible en ayant connecté votre imprimante réseau aussi avec le cable USB , de façon à voir comment se comporte le code .

Pour les plus temeraires pas encore testé a fond et il faudrait modifier la double boucle imbriquée ( voir les " ???? " ) , dans le code suivant :

#!/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 test "$arch" != "armv7l"; then errQuit "Système non compatible."; 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
                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"
#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
            err=0
            unset IP
        fi
    done
fi

###################################################
 # initialisation du tableau associatif `printer' #
###################################################
# creation $Url_PrinterInfo
Url_PrinterInfo="$Url_Info/$printerName"
#F_P_fichier_Info="$tmpDir/$printerName.info"
#wget -q "$Url_PrinterInfo" -O "$F_P_fichier_Info"
# if ! test "$(grep PRINTERNAME "$F_P_fichier_Info" | cut -d= -f2)" == "$printerName"
# then
#     errQuit "Les données du fichier info récupéré et le nom de l’imprimante ne correspondent pas."
# elif test "$(grep LNK "$F_P_fichier_Info" | cut -d= -f2)"; then
#     Url_PrinterInfo="$Url_Info/$(grep LNK "$F_P_fichier_Info" | cut -d= -f2)"
# fi
#echo "$Url_PrinterInfo"
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 #
###############################
#echo " DL DRV TAB == ${printer[*]}"
for drv in "${printer[@]}"
do
    if [[ $drv == @($printerName|no|yes) ]]; then continue;fi
    for addr in $Url_Pkg # ????? comment enlever cette boucle ???
    do
        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"
        else
            break
        fi
    done
    pkg2install+=( "$tmpDir/$drv" )
done
echo "PKG2INSTALL == ${pkg2install[*]}"
#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

Aussi , je ne suis pas certain que forcé le telechargement des pilotes scanners en deb64 soit forcément une bonne idée . a voir .

Dernière modification par iznobe (Hier à 08:46)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#308 Hier à 06:00

nany

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

Bonjour,



iznobe a écrit :
    for addr in $Url_Pkg # ????? comment enlever cette boucle ???

Comment l’enlever ? Eh bien tout simplement en la supprimant :

…
###############################
 # téléchargement des pilotes #
###############################
#echo " DL DRV TAB == ${printer[*]}"
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[*]}"
#installation des pilotes
if (( ${#pkg2install[*]} == 0 ))
then
    errQuit "Rien à installer."
else
    dpkg --install --force-all  "${pkg2install[@]}"
fi
…

Hors ligne

#309 Hier à 08:47

iznobe

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

j ' avais essayé de simplement l' enlevé , ca ne fonctionne pas .
j ' aurais du le dire ...
le tableau " pkg2install " se retrouve alors vide .

j' avais testé ça :

...
for drv in "${printer[@]}"
do
    if [[ $drv == @($printerName|no|yes) ]]; then continue;fi
    #for addr in $Url_Pkg # ????? comment enlever cette boucle ???
    #do
        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"
        else
            break
        fi
    #done
    pkg2install+=( "$tmpDir/$drv" )
done
echo "PKG2INSTALL == ${pkg2install[*]}"
...

Mais ta version fonctionne , Merci @nany wink

j ' ai posté le code sur github .

Dernière modification par iznobe (Hier à 09:07)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#310 Hier à 14:14

Christophe C

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

Au fait, à quoi sert ce script ? Aujourd'hui toutes les imprimantes sont compatibles IPP Everywhere, donc marchent sans les drivers. C'est uniquement pour la partie scanner ?
J'ai une brother, je n'ai rien installé. Même pas pour le scanner, d'ailleurs, qui marche sous SANE.

Dernière modification par Christophe C (Hier à 14:39)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#311 Hier à 18:23

iznobe

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

Christophe C a écrit :

Au fait, à quoi sert ce script ? Aujourd'hui toutes les imprimantes sont compatibles IPP Everywhere, donc marchent sans les drivers. C'est uniquement pour la partie scanner ?
J'ai une brother, je n'ai rien installé. Même pas pour le scanner, d'ailleurs, qui marche sous SANE.

Bonjour ............

c' est bien pour ça que personne ne vient poster sur le forum pour son imprimante brother , parce que ca marche tout seul .

il manque le paquet " avahi-utils " au pre-requis pour exécuter le script , et , les paquets pre-requis ne s' installent pas .

Dernière modification par iznobe (Hier à 18:25)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#312 Hier à 20:12

nany

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

iznobe a écrit :

les paquets pre-requis ne s' installent pas .

La fonction install_pkg est censée n’installer en mode silencieux que les paquets qui ne sont pas déjà installés.
S’il n’y a pas d’installation et que tu veux voir ce qui se passe :

install_pkg()
{
    for pkg do
#        if ! dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null
        if ! dpkg-query -f '${binary:Package} est déjà installé.\n' -W "$pkg"
        then
#            apt-get install -qq "$pkg"
            apt-get install -y "$pkg"
        fi
    done
}

Hors ligne

#313 Aujourd'hui à 10:10

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

Peut etre de cette maniere :

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

    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
        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 "Entrez l’adresse IP de votre imprimante : " IP
        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

retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#314 Aujourd'hui à 11:43

Watael

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

if test "$IP" = "USB"

à ce moment du script IP n'est pas encore assigné; il faudrait tester $2

n'atteindrait-on pas la limite de l'emploi de paramètres positionnels ?
ne vaudrait-il pas la peine de passer à des options :

$ nomScript [-n <nomPériphérique> -[u|i xxx.xxx.xxx.xxx]]

le -n est évident. wink
-u (USB) et -i (IP) sont exclusifs l'un de l'autre, et -i doit avoir un argument, sinon il faut demander un complément d'information
...
cf. help getopts
enjoy big_smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#315 Aujourd'hui à 11:58

nany

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

Bonjour,



iznobe a écrit :

je n' arrive pas  à mettre en place un contrôle " propre " ( : sans doubler des parties de code ) pour cette partie qui ne va pas :

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

Je pense qu’on ne pourra pas faire mieux sans compliquer le code et que tu te compliques la vie pour pas grand chose (éviter de redemander si on veut une installation en réseau).

Je vais tenter d’expliquer avec des commentaires pour que tu vois le cheminement.

if test "$IP" = "USB" # c’est qu’on est passé par la détection automatique donc qu’il n’y avait pas d’argument $1
then
    echo "Installation en USB."
    unset IP
else # sinon il y avait un argument $1
    until test -n "$IP" # répéter jusqu’à ce qu’on ait une adresse IP valide
    do
        read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] " # on demande si on veut bien une installation en réseau
        echo "$REPLY"
        [[ $REPLY == [YyOo] ]] || break # si la réponse n’est pas Y, y, O ou o (l’utilisateur a la possibilité de répondre « oui » par exemple et cette réponse sera interprétée comme un non mais c’est une autre histoire) alors on arrête le traitement ; l’installation sera faite en USB
        if test -n "$2"  # s’il existe un argument $2 alors on prend cet argument comme valeur de $IP
        then
            IP=$2
            shift $# # pour ne pas recommencer le test de $2 si cet argument est une IP invalide
        else # sinon on demande d’entrer une adresse IP
            read -rp "Entrez l’adresse IP de votre imprimante : " IP
        fi
        # vérification de l’adresse 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" # si l’adresse IP est invalide alors on vide $IP
        then
            # peut-être ajouter : echo "Adresse IP invalide !"
            err=0
            unset IP
        fi
    done # si $IP est toujours vide alors on recommence en demandant si on veut vraiment faire une installation en réseau : c’est certes redondant mais difficile de faire mieux
fi

Hors ligne

#316 Aujourd'hui à 12:06

nany

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.

Dernière modification par nany (Aujourd'hui à 12:11)

Hors ligne

#317 Aujourd'hui à 12:12

iznobe

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

j ' ai tester le dernier  code que j' ai donné , ca m ' a l ' air de fonctionner impeccable .

Le truc , c' etait que ca ne fonctionnait pas correctement ( pas me compliquer la vie big_smile ) , dans le sens ou si on entrait une adresse erronée en argument ( $2 ) , ca ne controlait pass l' IP ....et le script continuait avec une adresse IP non valide .

je vais regarder ton dernier code @nany , en mangeant un bout .

Dernière modification par iznobe (Aujourd'hui à 12:13)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#318 Aujourd'hui à 12:31

nany

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

iznobe a écrit :

j ' ai tester le dernier  code que j' ai donné , ca m ' a l ' air de fonctionner impeccable .

Hmmm… Avec la demande d’entrer une adresse IP à deux endroits différents ? Je ne pense pas que cette adresse soit vérifiée après la deuxième demande.
Mais je peux me tromper, je n’ai pas testé.
 

iznobe a écrit :

je vais regarder ton dernier code @nany , en mangeant un bout .

Je n’ai rien changé à ce qu’il y avait avant ta dernière proposition, j’ai juste mis des commentaires. Du coup,

iznobe a écrit :

dans le sens ou si on entrait une adresse erronée en argument ( $2 ) , ca ne controlait pass l' IP

Cela me surprend.

Hors ligne

#319 Aujourd'hui à 12:57

iznobe

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

nany a écrit :
iznobe a écrit :

dans le sens ou si on entrait une adresse erronée en argument ( $2 ) , ca ne controlait pass l' IP

Cela me surprend.

Pourtant :

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
        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 "Entrez l’adresse IP de votre imprimante : " IP
        fi

si un argument $2 existe , on saute le else , sinon , on pose la questoin et on controle l' IP ...


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#320 Aujourd'hui à 13:02

iznobe

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

Avec " mon " code modifié dans le dernier post :

#check IP
if test "$IP" = "USB"
then
    echo "Installation en USB."
    unset IP
else # Dans le cas ou pas de detection auto en USB , on fait :
    until test -n "$IP" # tant que IP n ' est pas " remplie "
    do
        if test -n "$2" # si on a un argument d' IP
        then
            IP=$2
            shift $#
        else # si on a pas d' argument 
            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
        # dans tous les cas , ( else de USB ) , on vérifie l' IP et on pose la question si l ' IP est invalide 
        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 "Entrez l’adresse IP de votre imprimante : " IP
        fi
    done
fi

des essais avec l ' ancien code et un exit en ligne suivante du check_IP :

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!
IP == 
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!
Installation en réseau.
IP == 
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!
IP == 

on voit qu ' il ne redemande ... rien .

Avec le code que j' ai modifié :

iznobe@iznobe-pc:~$ sudo bash Scripts/Watael_brprinter_install.sh MFC-L2710DW 1.1.1
[sudo] Mot de passe de iznobe : 
Connection to brother.com (13.248.151.157) 80 port [tcp/http] succeeded!
Entrez l’adresse IP de votre imprimante : 1.1.1.1
IP == 1.1.1.1
iznobe@iznobe-pc:~$

Dernière modification par iznobe (Aujourd'hui à 13:10)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#321 Aujourd'hui à 13:06

nany

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

iznobe a écrit :

si un argument $2 existe , on saute le else , sinon , on pose la questoin et on controle l' IP ...

Oui et alors ?
La vérification de l’adresse IP est effectuée après le fi, non ?

Hors ligne

#322 Aujourd'hui à 13:11

nany

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

iznobe a écrit :

Avec " mon " code modifié dans le dernier post :

Je persiste à penser que la nouvelle adresse IP entrée la deuxième fois n’est pas vérifiée.

Hors ligne

#323 Aujourd'hui à 13:12

iznobe

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

ba non , si une adresse IP invalide est entrée en argument , le script se poursuit sans broncher ...

voir mon édit précédent .
c' est bien pour ça que j' ai modifié d' ailleurs roll


nany a écrit :

Je persiste à penser que la nouvelle adresse IP entrée la deuxième fois n’est pas vérifiée.

tu as raison :

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!
Entrez l’adresse IP de votre imprimante : 1.1.1
IP == 1.1.1
iznobe@iznobe-pc:~$ 

au final , retour de la fonction check_IP non ?

Dernière modification par iznobe (Aujourd'hui à 13:14)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#324 Aujourd'hui à 13:22

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.

Hors ligne

#325 Aujourd'hui à 13:28

iznobe

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

pourquoi si je fais :

    while test -z "$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
        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
            continue
        fi
    done

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

Alors que j' obtiens :

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 , re-donner l'IP de votre imprimante : 1.2
IP == 1.2
iznobe@iznobe-pc:~$ 

avec ou sans " continue " .

Dernière modification par iznobe (Aujourd'hui à 13:45)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne