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.

#351 Aujourd'hui à 00:00

Watael

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

iznobe a écrit :

je connais pas la moitié des mots [...] utilisés

quoi ? "succinct" ? lol

Dernière modification par Watael (Aujourd'hui à 16:04)


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

Hors ligne

#352 Aujourd'hui à 08:02

iznobe

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

Bonjour , comment faire pour remplacer :

# 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 ça proprement :

# USB_printer_name= ???
        mapfile -t printer_usb < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')

printer_IP+=("USB") # ????

on peut faire une double mapfile ? tongue

ca : ?

# USB_printer_name= ???
        mapfile -t printer_usb < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
        for p_usb in "${printer_usb[@]}"
			do
					printer_IP+=("USB")
			done

Allez hop , sur github  wink

là , je pense que le script est pas trop mal big_smile
la détection automatique pourrait probablement être améliorée .
faudrait des retours de " avahi-browse -a -trk " pour vérifier le protocole qu ' utilise une imprimante en réseau qui ne fait pas serveur web ( certainement ipp ? ) .

Dernière modification par iznobe (Aujourd'hui à 08:23)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#353 Aujourd'hui à 08:42

nany

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

Bonjour,



iznobe a écrit :

Pour les paramètres , de toute manière , je n' ai pas le niveau tongue

Bien, alors, avant de vérifier s’il y avait des nouveaux messages (je n’ai donc pas pris en compte tes dernières modifications), j’ai remis l’ouvrage sur le métier et j’ai pondu ça avec getopts :

#!/bin/bash
# > vim search whole line : `yy / <Ctrl-F> p <Enter>'
 # définitions de variables
 # infos Brother
 # quelques fonctions
 # gestion des options
 # 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 # Cette ligne est-elle toujours d’actualité ?

#############################
 # 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
declare -A printer
declare -i err
declare -a printer_IP printer_name

##################
 # infos Brother #
##################
# adresse d’obtention des 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"

#######################
 # quelques fonctions #
#######################
usage()
{
    echo "
    Usage : sudo $0 [-h] [-m <Nom_Modèle>] [-u|-i <adresse_IP>]
    
    Options :
        
        -h
            Affiche cette aide et quitte.
        
        -m <Nom_Modèle>
            Renseigne <Nom_Modèle> comme nom du modèle de l’imprimante.
            Le paramètre <Nom_Modèle> est obligatoire pour cette option.
        
        -u
            Choisissez cette option pour une installation en USB.
            Vous ne pouvez pas l’utiliser en même temps que l’option -i.
        
        -i <adresse_IP>
            Choisissez cette option pour une installation en réseau.
            <adresse_IP> sera alors considérée comme l’adresse de l’imprimante.
            Le paramètre <adresse_IP> est obligatoire pour cette option.
            Vous ne pouvez pas l’utiliser en même temps que l’option -u.
    "
}
errQuit()
{
    >&2 echo "$@"
    exit 1
}
verif_lien()
{
    local lien=$1 cible=$2
    if ! test -L "$lien"
    then
        ln -s "$cible" "$lien"
    fi
}
install_pkg()
{
    apt-get update -qq
    for pkg do
        if ! dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null
        then
            apt-get install -qq "$pkg"
        fi
    done
}

########################
 # gestion des options #
########################
while getopts "hm:ui:" opt
do
    case "$opt" in
        "h")
            usage
            exit 0
            ;;
        "m")
            modelName="$OPTARG"
            ;;
        "u")
            if test -z "$IP"
            then
                IP="USB"
            else
                usage
                errQuit "Vous ne pouvez pas utiliser l’option -u en même temps que l’option -i."
            fi
            ;;
        "i")
            if test "$IP" = "USB"
            then
                usage
                errQuit "Vous ne pouvez pas utiliser l’option -i en même temps que l’option -u."
            else
                IP="$OPTARG"
            fi
            ;;
        "?")
            usage
            errQuit "Erreur : mauvaise option ou argument manquant."
            ;;
    esac
done
shift $((OPTIND -1))
if (($#))
then
    usage
    errQuit "Erreur : trop d’arguments ou argument manquant dans une option."
fi

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

# installation éventuelle de certains paquets
# 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

if test -z "$modelName"
then # Détection automatique
    # NET_printer_name= ???
    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= ???
    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 repart donc avec les questions de base : modèle 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’à installer
            ;;
        *)  echo "Plusieurs imprimantes ont été détectées."
            # il faut presenter sous forme de liste les éléments recupérés :
            # modèle du materriel : IP ou USB
            # et demander à l’utilisateur de choisir un numéro 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
    until test -n "$modelName"
    do
        read -rp 'Entrez le modèle de votre imprimante : ' modelName
    done
fi

printerName="${modelName//-/}" # ! printer_name != printerName
# check IP
# Trop complexe de tester l’IP à différents endroits.
# On ne la teste que lorsqu’elle est renseignée avec un errQuit si elle est erronée.
until test -n "$IP"
do
    read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
    echo "${REPLY,,}"
    case "${REPLY,,}" in
        "o"|"oui"|"y"|"yes")
            until test -n "$IP"
            do
                read -rp "Entrez l’adresse IP de votre imprimante : " IP
            done
            ;;
        *)
            IP="USB"
            break
            ;;
    esac
done
if test "$IP" = "USB"
then
    echo "Installation en USB."
    unset IP
else
    echo "Installation en réseau."
    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
        errQuit "Adresse erronée !"
    fi
fi

###################################################
 # initialisation du tableau associatif `printer' #
###################################################
# création $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
    # installation éventuelle de certains paquets
    # 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 "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 #
###########################
# installation éventuelle de certains paquets
# 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 "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[*]}"

# 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 # avec ou sans option " r " ?
        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 "Pas de ppd."
       err+="1"
       ;;
    1) echo "Un ppd."
       Ppd_File=${PPDs[0]}
       ;;
    *) err+="1"
       echo "Plusieurs 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 me semble plus clair.
J’ai testé différentes options envoyées au script quelque soit l’ordre et avec ou sans arguments mais j’ai peut-être oublié quelque chose alors, amis testeurs, n’hésitez pas à tester en long, en large et en travers.

N’ayant pas d’imprimante Brother (que ce soit en réseau ou en USB) je ne peux pas tout tester et j’ai donc mis un exit à la ligne 390 (juste avant la ligne « # installation des pilotes »).

Hors ligne

#354 Aujourd'hui à 08:55

nany

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

iznobe a écrit :

ca : ?

# USB_printer_name= ???
        mapfile -t printer_usb < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
        for p_usb in "${printer_usb[@]}"
			do
					printer_IP+=("USB")
			done

Et que devient alors printer_name ? Si elle n’est pas alimentée, il n’y aura pas d’imprimante USB de proposée dans la liste en cas de détection multiple.

Comme dit dans mon message précédent, je ne peux pas tester cette partie du code mais je pense qu’il faudrait plutôt :

# USB_printer_name= ???
        mapfile -t printer_usb < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
        for p_usb in "${printer_usb[@]}"
        do
            printer_name+=( "$p_usb" )
            printer_IP+=( "USB" )
        done

Ceci dit, avahi-browse est-il vraiment plus performant et du coup est-ce que ça vaut la peine de remplacer lsusb ?

Dernière modification par nany (Aujourd'hui à 08:58)

Hors ligne

#355 Aujourd'hui à 09:08

iznobe

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

nany a écrit :

Ceci dit, avahi-browse est-il vraiment plus performant et du coup est-ce que ça vaut la peine de remplacer lsusb ?

De ce point de vue là , non .
lsub est instantanné .
avahi-browse scanne le reseau .

c' etait plus dans un soucis d' harmonisation et de moins de ligne de code .

nany a écrit :

et que deviens alors printername

bonne remarque !
j' etais pas bien reveillé
ca devrait plutot etre ça :

# USB_printer_name= ???
    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}')
    for p_usb in "${printer_name[@]}"
	do
		printer_IP+=("USB")
	done

ca devrait le faire non ? le " mapfile avahi gawk  " recupere bien le nom du modele connecté en usb .


je regarde le code " getopts " un peu plus tard ...


Plutôt que de faire 3 mapfile avahi-browse , on pourrait :
remplir un tableau avec mapfile qui contient toute les lignes qui commencent par un " = " .
trier ensuite ce dont on a besoin .
Du coup , un seul appel a " avahi-browse " et plus besoin de lsusb .
Qu ' en penses tu ?

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#356 Aujourd'hui à 10:06

nany

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

iznobe a écrit :
nany a écrit :

et que deviens alors printername

bonne remarque !
j' etais pas bien reveillé
ca devrait plutot etre ça :

# USB_printer_name= ???
    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}')
    for p_usb in "${printer_name[@]}"
	do
		printer_IP+=("USB")
	done

ca devrait le faire non ? le " mapfile avahi gawk  " recupere bien le nom du modele connecté en usb .

Il ne faut pas oublier qu’on peut avoir des imprimantes en réseau ET en USB. Or

help mapfile a écrit :
    Si la commande « mapfile » n'est pas appelée avec une origine explicite, le tableau est
    vidé avant affectation.

Donc, si je ne fais pas d’erreur à la lecture de help mapfile, il faudrait utiliser l’option -O :

# USB_printer_name= ???
    orig=${#printer_name[@]}
    mapfile -O $orig -t printer_name < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')
    for p_usb in "${printer_name[@]:$orig}"
    do
        printer_IP+=( "USB" )
    done

Pour la simplification, je crois que c’est raté.

iznobe a écrit :

Plutôt que de faire 3 mapfile avahi-browse , on pourrait :
remplir un tableau avec mapfile qui contient toute les lignes qui commencent par un " = " .
trier ensuite ce dont on a besoin .
Du coup , un seul appel a " avahi-browse " et plus besoin de lsusb .
Qu ' en penses tu ?

J’en pense que c’est compliqué et que, compte tenu de ce que je viens de dire ci-dessus, le code avec lsusb tient mieux la route.

Dernière modification par nany (Aujourd'hui à 10:07)

Hors ligne

#357 Aujourd'hui à 11:11

iznobe

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

ca ne me semble pas si compliqué que ca .
Avec ce code :

##### VERSION AVAHI-BROWSE #####
    mapfile -t printers < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/')
    #echo "printers ==     ${printers[*]}"
    for p in "${printers[@]}"
    do
        echo "$p"
    done
    echo "printer_name RESULT ==
    TAB printer_IP == ${printer_IP[*]}
    TAB printer_name == ${printer_name[*]}"
    exit

, j ' obtiens le retour terminal suivant :

iznobe@k-pi3:~ $ sudo bash brprinter_install.sh
=;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local;BRN94DDF80CF268.local;192.168.1.84;80;
=;lo;IPv4;Brother\032DCP-L3560CDW\032series\032\040USB\041;_http._tcp;local;k-pi3.local;127.0.0.1;60000;
printer_name RESULT ==
    TAB printer_IP == 
    TAB printer_name == 
iznobe@k-pi3:~ $ 

jusque là tout va bien tongue

par contre , là , plus rien ne va plus .... :

##### VERSION AVAHI-BROWSE #####
    mapfile -t printers < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/')
    #echo "printers ==     ${printers[*]}"
    for p in "${printers[@]}"
    do
        #echo "$p"
        if [[ "$p" =~ "^=;lo;" ]]; then # USB
            printer_name+=( "$("$p" | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')" )
            printer_IP+=("USB")
        else # reseau
            printer_name+=( "$("$p" | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')" )
            printer_IP+=( "$("$p" | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {print $8}')" )
        fi
    done
    echo "printer_name RESULT ==
    TAB printer_IP == ${printer_IP[*]}
    TAB printer_name == ${printer_name[*]}"
    exit

le retour terminal :

iznobe@k-pi3:~ $ sudo bash brprinter_install.sh
brprinter_install.sh: ligne 146: =;lo;IPv4;Brother\032DCP-L3560CDW\032series\032\040USB\041;_http._tcp;local;k-pi3.local;127.0.0.1;60000; : commande introuvable
brprinter_install.sh: ligne 147: =;lo;IPv4;Brother\032DCP-L3560CDW\032series\032\040USB\041;_http._tcp;local;k-pi3.local;127.0.0.1;60000; : commande introuvable
brprinter_install.sh: ligne 146: =;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local;BRN94DDF80CF268.local;192.168.1.84;80; : commande introuvable
brprinter_install.sh: ligne 147: =;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local;BRN94DDF80CF268.local;192.168.1.84;80; : commande introuvable
printer_name RESULT ==
    TAB printer_IP ==  
    TAB printer_name ==  
iznobe@k-pi3:~ $ 

comme je ne maitrise pas du tout gawk / awk , normal , mais ca ne doit pas etre grand chose .
il suffit de savoir comment appliquer gawk correctement sur une variable je suppose .
ou encore de mettre le retour du tableau dans un fichier ...

Dernière modification par iznobe (Aujourd'hui à 11:17)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#358 Aujourd'hui à 11:53

iznobe

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

le script avec " getopts " est effectivement plus clair .
il à l' air de bien fonctionner .
il y a quelques retouches à faire .
apt update dans la fonction est à mon avis inutile , mieux vaut ne la faire qu ' une fois , plutot qu ' a chaque appel de install_pkg ( 3 fois souvents ... )
les paquets du prerequis ne s' installe toujours pas correctement , sans que je sache pourquoi , depuis le debut de cette discussion .
une paire d' autres trucs insignifiants que je me rappelle plus .

sur mon pi :

iznobe@k-pi3:~ $ sudo apt remove nmap
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Lecture des informations d'état... Fait      
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  dc liblinear4 lua-lpeg nmap-common
Veuillez utiliser « sudo apt autoremove » pour les supprimer.
Les paquets suivants seront ENLEVÉS :
  nmap
0 mis à jour, 0 nouvellement installés, 1 à enlever et 0 non mis à jour.
Après cette opération, 4217 ko d'espace disque seront libérés.
Souhaitez-vous continuer ? [O/n] 
(Lecture de la base de données... 106351 fichiers et répertoires déjà installés.)
Suppression de nmap (7.91+dfsg1+really7.80+dfsg1-2) ...
Traitement des actions différées (« triggers ») pour man-db (2.9.4-2) ...
iznobe@k-pi3:~ $ sudo bash sans_titre.sh 
Plusieurs imprimantes ont été détectées.
 1  ⇒  DCP-L3560CDW  :  192.168.1.84
 2  ⇒  DCP-L3560CDW  :  USB
Choisissez le numéro qui correspond à l’imprimante que voulez installer : 1
Installation en réseau.
PING 192.168.1.84 (192.168.1.84) 56(84) bytes of data.
...
PKG2INSTALL == /tmp/packages/dcpl3560cdwpdrv-3.5.1-1.i386.deb /tmp/packages/brother-udev-rule-type1-1.0.2-0.all.deb /tmp/packages/brscan-skey-0.3.2-0.amd64.deb /tmp/packages/brscan5-1.3.10-5.amd64.deb
iznobe@k-pi3:~ $ apt policy nmap
nmap:
  Installé : (aucun)
  Candidat : 7.91+dfsg1+really7.80+dfsg1-2
 Table de version :
     7.91+dfsg1+really7.80+dfsg1-2 500
        500 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages
iznobe@k-pi3:~ $ 

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#359 Aujourd'hui à 16:19

nany

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

iznobe a écrit :

par contre , là , plus rien ne va plus .... :

##### VERSION AVAHI-BROWSE #####
    mapfile -t printers < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/')
    #echo "printers ==     ${printers[*]}"
    for p in "${printers[@]}"
    do
        #echo "$p"
        if [[ "$p" =~ "^=;lo;" ]]; then # USB
            printer_name+=( "$("$p" | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && /USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')" )
            printer_IP+=("USB")
        else # reseau
            printer_name+=( "$("$p" | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4}')" )
            printer_IP+=( "$("$p" | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {print $8}')" )
        fi
    done
    echo "printer_name RESULT ==
    TAB printer_IP == ${printer_IP[*]}
    TAB printer_name == ${printer_name[*]}"
    exit

le retour terminal :

iznobe@k-pi3:~ $ sudo bash brprinter_install.sh
brprinter_install.sh: ligne 146: =;lo;IPv4;Brother\032DCP-L3560CDW\032series\032\040USB\041;_http._tcp;local;k-pi3.local;127.0.0.1;60000; : commande introuvable
brprinter_install.sh: ligne 147: =;lo;IPv4;Brother\032DCP-L3560CDW\032series\032\040USB\041;_http._tcp;local;k-pi3.local;127.0.0.1;60000; : commande introuvable
brprinter_install.sh: ligne 146: =;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local;BRN94DDF80CF268.local;192.168.1.84;80; : commande introuvable
brprinter_install.sh: ligne 147: =;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local;BRN94DDF80CF268.local;192.168.1.84;80; : commande introuvable
printer_name RESULT ==
    TAB printer_IP ==  
    TAB printer_name ==  
iznobe@k-pi3:~ $ 

Essaie ça :

##### VERSION AVAHI-BROWSE #####
    mapfile -t printers < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/')
    #echo "printers ==     ${printers[*]}"
    for p in "${printers[@]}"
    do
        printer_name+=( "$(echo "$p" | grep -oP 'Brother\\032\K[^\\]+')" )
        if [[ "$p" =~ '=;lo;' ]]; then # USB
            printer_IP+=( "USB" )
        else # reseau
            printer_IP+=( "$(echo "$p" | grep -oP '\.local\;\K[^\;]+')" )
        fi
    done
    echo "printer_name RESULT ==
    TAB printer_IP == ${printer_IP[*]}
    TAB printer_name == ${printer_name[*]}"
    exit

(Si grep se suffit en lui-même, pas besoin d’utiliser awk.)

Hors ligne

#360 Aujourd'hui à 16:27

nany

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

iznobe a écrit :

apt update dans la fonction est à mon avis inutile , mieux vaut ne la faire qu ' une fois , plutot qu ' a chaque appel de install_pkg ( 3 fois souvents ... )

Ok.

iznobe a écrit :

les paquets du prerequis ne s' installe toujours pas correctement , sans que je sache pourquoi , depuis le debut de cette discussion .

Avais-tu vu ma réponse en #312 ?

iznobe a écrit :

une paire d' autres trucs insignifiants que je me rappelle plus .

Ça serait bien que tu te les rappelles qu’on sache de quoi il s’agit. tongue

Hors ligne

#361 Aujourd'hui à 16:49

iznobe

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

nany a écrit :

Essaie ça :

Au top smile :

iznobe@k-pi3:~ $ sudo bash brprinter_install.sh
printer_name RESULT ==
    TAB printer_IP == USB 192.168.1.84
    TAB printer_name == DCP-L3560CDW DCP-L3560CDW
iznobe@k-pi3:~ $

Bravo !



Pour le #312 , Oui , j' avais vu . Mais ca n ' avais pas aidé , ( pas trop creuser sur le coup ... )
En fait , c' est ma condition qui n' est pas bonne mad
le dpkg-query renvoit le nom du paquet , meme si il n' est meme pas installé ...
forcément du coup ça n' installe rien roll


Pour les broutilles , faut que je regarde à nouveau ton code de prés big_smile

Dernière modification par iznobe (Aujourd'hui à 16:56)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#362 Aujourd'hui à 17:24

nany

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

iznobe a écrit :

Pour le #312 , Oui , j' avais vu . Mais ca n ' avais pas aidé , ( pas trop creuser sur le coup ... )
En fait , c' est ma condition qui n' est pas bonne mad
le dpkg-query renvoit le nom du paquet , meme si il n' est meme pas installé ...
forcément du coup ça n' installe rien roll

Oui, je viens de purger des paquets pour tester et j’ai le même comportement que toi.
Pour résoudre le problème, je n’ai pas trouvé mieux que :

install_pkg()
{
    for pkg do
        if ! dpkg-query -l "$pkg" | grep -q "^[hi]i"
        then
            apt-get install -qq "$pkg"
        fi
    done
}

Dernière modification par nany (Aujourd'hui à 17:26)

Hors ligne

#363 Aujourd'hui à 17:57

iznobe

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

pourquoi : grep -q "^[hi]i"
et pas simplement "^ii" ?


Au fait c' est quoi le débogueur mode terminal que tu as utilisé la dernière fois ?

les dernières modifications apportées au script ,  version finale , cette fois :

#!/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()
{
	local lien=$1 cible=$2
	if ! test -L "$lien"
	then
		ln -s "$cible" "$lien"
	fi
}
install_pkg()
{
	for pkg do
		if ! dpkg-query -l "$pkg" | grep -q "^[hi]i"
		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

##########################
 # gestion des arguments #
##########################
if test -z "$modelName"
then
	# DETECTION AUTOMATIQUE ##### VERSION AVAHI-BROWSE #####
    mapfile -t printers < <(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/')
    for p in "${printers[@]}"
    do
        printer_name+=( "$(echo "$p" | grep -oP 'Brother\\032\K[^\\]+')" )
        if [[ "$p" =~ '=;lo;' ]]; then # USB
            printer_IP+=( "USB" )
        else # reseau
            printer_IP+=( "$(echo "$p" | grep -oP '\.local\;\K[^\;]+')" )
        fi
    done

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

	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

y a plus qu ' a tester !
github mis à jour aussi .

Reste plus qu ' a se pencher qur la version " getopts " de @nany ...

Dernière modification par iznobe (Aujourd'hui à 18:36)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#364 Aujourd'hui à 19:34

nany

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

iznobe a écrit :

pourquoi : grep -q "^[hi]i"
et pas simplement "^ii" ?

Parce qu’on ne sait jamais, les paquets pourrait être installés mais marqués hold.
Cas rarissime, je te l’accorde, mais au moins c’est prévu.

iznobe a écrit :

Au fait c' est quoi le débogueur mode terminal que tu as utilisé la dernière fois ?

C’est dû à l’option -x de la première ligne du script (le shebang). Il faudra d’ailleurs l’enlever lors de la version finale.

Et aussi, je trouve surprenant que tu n’aies pas ces mêmes retours. Enlèverais-tu cette option lors de tes tests ?

Hors ligne

#365 Aujourd'hui à 20:21

nany

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

iznobe a écrit :

les dernières modifications apportées au script ,  version finale , cette fois :

y a plus qu ' a tester !
github mis à jour aussi .

Ligne 457 : $User n’existe pas, c’est plutôt $user (cf. lignes 35 et 39).

Hors ligne