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.

#176 Hier à 19:47

xubu1957

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

Bonsoir,

Nous avions vu des remarques d'Ordissimo1

Dernière modification par xubu1957 (Hier à 19:47)


Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.                   Membre de Linux-Azur

Hors ligne

#177 Hier à 20:53

nany

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

Bonjour,



iznobe a écrit :
gawk: ligne de commande:1: BEGIN{ORS="\0"; /ppd/{sub(".","",$NF); print $NF}
gawk: ligne de commande:1:                      ^ syntax error

Il faut fermer le BEGIN avec une accolade et non un point-virgule. Je pense aussi qu’il faudrait échapper le point dans la fonction sub.

…
        while read -d '' fileName
        do
            PPDs+=( "$fileName" )
        done < <(dpkg --contents "$tmpDir/$pkg" | gawk 'BEGIN{ORS="\0"} /ppd/{sub("\.","",$NF); print $NF}')
…

Mes deux sous.

En ligne

#178 Hier à 21:29

Watael

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

Je pense aussi qu’il faudrait échapper le point dans la fonction sub.

la flemme.
sub() substitue la première correspondance (ici, n'importe quel caractère), et le premier caractère de la chaîne est un point.
trop la flemme.
lol


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

Hors ligne

#179 Hier à 21:49

nany

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

Watael a écrit :

trop la flemme.

:shocked:

En ligne

#180 Hier à 22:30

iznobe

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

Salut et merci @nany big_smile

le soucis , c ' est pas tellement le code et la maniere dont il est ecrit pour ma part ( bien que , quand meme faut bien avouer que c' est plus ou moins lisible comment c' eest fait tongue , mais plutot la validité de ce qui est fait dans le script de demonipuch .
En particulier pour la derniere partie ' configuration imprimante / scanner , sans vouloir etre medisant , il y a des trucs plutot surprenant ...

Par exemple , cette variable :

Lib_Dir="/usr/lib/$Arch-linux-gnu"

j ' ai bien une idée de ce qu ' elle devrait contenir , mais bon , vu le code de imprimante / scanner , au final , je suis plus trop sur ...

$Arch-linux-gnu

n ' est pas initialisée ni declarée , elle affiche n' importe quoi chez moi , et elle est utilisée dans la partie scanner qu ' il faut vérifier et corriger .
il reste la regle UDEV a ecrire et a ajouter correctement , si c' est utile que je ne sais absolument pas faire , voir : https://forum.ubuntu-fr.org/viewtopic.php?id=2092050
bref , malgré la ré écriture , le script n' est pas correct ni fonctionnel dans sa totalité ... il faudrait tester les différentes parties une à une , ce que j' ai fait mais pas entièrement , il ne reste plus que la partie configuration scanner .
Mais besoin d' une pause big_smile ....


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#181 Hier à 22:38

Watael

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

ce n'est pas $arch-linux-gnu
c'est $(uname -m)-linux-gnu
parce que arch=$(uname -m)

ou je n'ai pas compris ce que tu ne comprends pas ? tongue

Dernière modification par Watael (Hier à 22:39)


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

Hors ligne

#182 Aujourd'hui à 00:47

iznobe

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

ok , mais de toute maniere , ubuntu n' existe plus pour arch i686 ou i386 si puisque on ne peut pas telecharger de version 32 bit ?

Donc , dans le script tout ce qui gere $Arch , est inutile non ? on pourrait faire le script que pour arch=x86-64 du coup ...


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#183 Aujourd'hui à 03:34

nany

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

Bonjour,



iznobe a écrit :

il reste la regle UDEV a ecrire et a ajouter correctement , si c' est utile que je ne sais absolument pas faire , voir : https://forum.ubuntu-fr.org/viewtopic.php?id=2092050
bref , malgré la ré écriture , le script n' est pas correct ni fonctionnel dans sa totalité ... il faudrait tester les différentes parties une à une , ce que j' ai fait mais pas entièrement , il ne reste plus que la partie configuration scanner .

Puisque tu as créé un fil spécifique, j’ai répondu dedans.

En ligne

#184 Aujourd'hui à 08:24

iznobe

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

du coup , j' ai fini a peu pres de corriger les quelques bus du script de @Watael .
il reste cependant des " trucs " a gerer .
Par exemple à la ligne 160 :

if [[ ${DISTRIB_RELEASE:-24} =~ ^24 && ${printer[SCANKEY_DRV]} = brscan-skey-0.3.2-0.amd64.deb ]]

si ça commande par 24 , sauf que c' est valable aussi pour 25.XX et certainement les versions futures de ubuntu .
et que signifie :
if [[ ${DISTRIB_RELEASE:-24} ?

Autre chose , il y a des " errQuit "pas de pilote pour le scanner." un peu partout , sauf que il ne faut pas interrompre le script si on ne trouve pas de pilote pour le scanner ...

+++++++++++++++++++++

pour la partie scanner , une chose que je ne comprends pas :
un lien vers un fichier , evite de copier le fichier à l' emplacement du lien non ?
du coup quel intérêt de faire :

cp --force /usr/lib64/libbrcolm.so.1.0.1 .

plutot que de creer un lien vers "/usr/lib64/libbrcolm.so.1.0.1" ?
qui existe deja en plus . ca permettrait de supprimer ce fichier inutile et de gagner un lien , ou j' ai faux ?

+++++++++++++++++++++

le code du script de @Watael :

#!/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
############################
user="$SUDO_USER"
codeName="$(lsb_release -cs)"
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

#########################
 # gestion des arguments
#########################
declare -u modelName=$1
until test -n "$modelName"
do
    read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
printerName="${modelName//-/}"
#check IP
until test -n "$IP"
do
    read -p "vous voulez configurer votre imprimante pour qu'elle fonctionne en réseau ? [y/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

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

printerInfo="$Url_Info/$printerName"
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 [[ $arch != @(i386|i686|x86_64) ]]
then
    errQuit "système non compatible."
fi
if ((EUID))
then
    errQuit "must be root."
fi
if ! nc -z -w5 'brother.com' 80
then
    errQuit "\"brother.com\" n'est pas joignable"
fi

##################################################
 # initialisation du tableau associatif `printer'
##################################################
while IFS='=' read -r k v
do
    printer[$k]=$v
done < <(wget -qO- "$printerInfo" | sed '/\(]\|rpm\|=\)$/d')
########################################################
 # vérification de variables disponibles dans `printer'
########################################################
if ! test "${printer[PRINTERNAME]}" = "$printerName"
then
    errQuit "les données du fichier .inf et le nom de l'imprimante ne correspondent pas."
fi
if test -n "${printer[LNK]}"
then
    printerInf="$Url_Info/${printer[LNK]}"
fi

if test -n "${printer[SCANNER_DRV]}"
then
    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')
    case $arch in
        i[36]86)
            printer[SCANNER_DRV]="$scanner_DEB32"
            printer[SCANKEY_DRV]="$scanKey_DEB32"
            ;;
        x86_64)
            printer[SCANNER_DRV]="$scanner_DEB64"
            printer[SCANKEY_DRV]="$scanKey_DEB64"

            if test -f /etc/lsb-release; then . /etc/lsb-release; fi
            if [[ ${DISTRIB_RELEASE:-24} =~ ^24 && ${printer[SCANKEY_DRV]} = brscan-skey-0.3.2-0.amd64.deb ]]
            then
                printer[SCANKEY_DRV]="brscan-skey-0.3.4-0.amd64.deb" #mais pourquoi Brother ne donnent-ils pas la bonne info ?
            fi
            ;;
    esac
else
    err+=1
    echo "pas de pilote pour le scanner."
fi

##########################
 # préparation du système
##########################
if test -f "$Logfile"
then
    mv -v "$Logfile" "$Logfile.$date"
fi
for d in  "$tmpDir" "/usr/share/cups/model" "/var/spool/lpd"
do
    if ! test -d "$d"
    then
        mkdir -pv "$d"
    fi
done

apt-get update -qq
install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget" "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
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 test $drv = $printerName; then continue;fi
    if test $drv = "no"; then continue;fi
    if test  $drv = "yes"; then continue;fi
    for addr in "$Url_Pkg" "$Url2_Pkg"
    do
        if ! test -f "$tmpDir/$drv"
        then
            Url_Deb="$addr/$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
dpkg --install --force-all  "${pkg2install[@]}"
##

#################################
 # configuration de l'imprimante
#################################
#retrouver le fichier `.ppd' pour l'imprimante
#for drv in PRN_CUPS PRN_DRV
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 -d '' fileName
        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


#sauvegarde fichier conf.0 (n'existe pas chez moi)
cp /etc/cups/printers.conf.O "$tmpDir"
systemctl stop cups
cp "$tmpDir/printers.conf.O" /etc/cups/printers.conf
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
#restauration fichier conf


############################
 # configuration du scanner
############################
if test -z "ÎP"
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 "$arch" = "x86_64" -a -d "$libDir"
then
    case $cmd in
        /usr/bin/brsaneconfig)
            cd "$libDir" || exit;
            cp --force /usr/lib64/libbrcolm.so.1.0.1 .
            ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
            ln -sf libbrcolm.so.1 libbrcolm.so
            cp --force /usr/lib64/libbrscandec.so.1.0.0 "$libDir"
            ln -sf libbrscandec.so.1.0.0 libbrscandec.so.1
            ln -sf libbrscandec.so.1 libbrscandec.so
            cd "$libDir"/sane || exit
            cp --force /usr/lib64/sane/libsane-brother.so.1.0.7 .
            ln -sf libsane-brother.so.1.0.7 libsane-brother.so.1
            ln -sf libsane-brother.so.1 libsane-brother.so
            ;;
        /usr/bin/brsaneconfig2)
            cd "$libDir" || exit
            cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
            ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
            ln -sf libbrscandec2.so.1 libbrscandec2.so
            cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
            ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
            ln -sf libbrcolm2.so.1 libbrcolm2.so
            cd "$libDir"/sane || exit
            cp --force /usr/lib64/sane/libsane-brother2.so.1.0.7 .
            ln -sf libsane-brother2.so.1.0.7 libsane-brother2.so.1
            ln -sf libsane-brother2.so.1 libsane-brother2.so
            ;;
        /usr/bin/brsaneconfig3)
            cd "$libDir" || exit
            cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
            ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
            ln -sf libbrscandec3.so.1 libbrscandec3.so
            cd "$libDir"/sane || exit
            cp --force /usr/lib64/sane/libsane-brother3.so.1.0.7 .
            ln -sf libsane-brother3.so.1.0.7 libsane-brother3.so.1
            ln -sf libsane-brother3.so.1 libsane-brother3.so
            ;;
        /usr/bin/brsaneconfig4)
            cd "$libDir"/sane || exit
            ln -sf libsane-brother4.so.1.0.7 libsane-brother4.so.1
            ln -sf libsane-brother4.so.1 libsane-brother4.so
            ;;
        /usr/bin/brsaneconfig5)
            cd "$libDir"/sane || exit
            ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
            ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
            ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
            ;;
    esac
fi

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#185 Aujourd'hui à 11:59

Watael

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

${DISTRIB_RELEASE:-24} parce que je n'ai pas de fichier /etc/lsb-release, il me fallait donc une valeur par défaut.

if ((DISTRIB_RELEASE>=24)) && test "${printer[SCANKEY_DRV]}" = 'brscan-skey-0.3.2-0.amd64.deb'

Dernière modification par Watael (Aujourd'hui à 12:00)


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

Hors ligne

#186 Aujourd'hui à 13:14

nany

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

Watael a écrit :

parce que je n'ai pas de fichier /etc/lsb-release

Et en sourçant /usr/lib/os-release (s’il existe) ?
Dans ce cas c’est VERSION_ID qui est à tester.

Ceci dit, ce bout de code ne concerne qu’Ubuntu, il faudrait alors tester aussi le nom de l’OS.



Sinon, le nom du modèle peut-être saisi en minuscules et du coup il n’y aura pas de driver trouvé.
Alors qu’il suffit de passer en lettres capitales :

…
#########################
 # gestion des arguments
#########################
declare -u modelName=$1
until test -n "$modelName"
do
    read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
printerName="${modelName//-/}"
printerName="${printerName^^}"
…

 


Autre remarque : Brother propose un script d’installation. Attention Watael, ça pique les yeux ! Mais il a l’air de faire le job.
Alors je me demande si l’élaboration du présent script vaut la chandelle.

En ligne

#187 Aujourd'hui à 14:09

iznobe

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

Watael a écrit :

${DISTRIB_RELEASE:-24} parce que je n'ai pas de fichier /etc/lsb-release, il me fallait donc une valeur par défaut.

if ((DISTRIB_RELEASE>=24)) && test "${printer[SCANKEY_DRV]}" = 'brscan-skey-0.3.2-0.amd64.deb'

Maôrche pô big_smile

Mais ça , oui :

if (( $(echo "$DISTRIB_RELEASE" | cut -c1-2) >=24 )) && test "${printer[SCANKEY_DRV]}" = 'brscan-skey-0.3.2-0.amd64.deb'

+ diverses petites optimisation du code .

Et nouveau code eclairci de " $arch " :

#!/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
############################
user="$SUDO_USER"
codeName="$(lsb_release -cs)"
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

#########################
 # gestion des arguments
#########################
declare -u modelName=$1
until test -n "$modelName"
do
    read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
modelName="${modelName^^}"
printerName="${modelName//-/}"
#check IP
until test -n "$IP"
do
    read -rp "vous voulez configurer votre imprimante pour qu'elle fonctionne en réseau ? [y/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

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

printerInfo="$Url_Info/$printerName"
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 [[ $arch != @(i386|i686|x86_64) ]]
if [[ $arch != x86_64 ]]
then
    errQuit "système non compatible."
fi
if ((EUID))
then
    errQuit "vous devez lancer le script en root : sudo brprinter_install.sh "
fi
if ! nc -z -w5 'brother.com' 80
then
    errQuit le site "\"brother.com\" n'est pas joignable"
fi

##################################################
 # initialisation du tableau associatif `printer'
##################################################
while IFS='=' read -r k v
do
    printer[$k]=$v
done < <(wget -qO- "$printerInfo" | sed '/\(]\|rpm\|=\)$/d')
########################################################
 # vérification de variables disponibles dans `printer'
########################################################
if ! test "${printer[PRINTERNAME]}" = "$printerName"
then
    errQuit "les données du fichier info recupéré et le nom de l'imprimante ne correspondent pas."
fi
if test -n "${printer[LNK]}"
then
    printerInf="$Url_Info/${printer[LNK]}"
fi

if test -n "${printer[SCANNER_DRV]}"
then
    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 -f /etc/lsb-release; then
         . /etc/lsb-release
        if (( $(echo "$DISTRIB_RELEASE" | cut -c1-2) >=24 )) && test "${printer[SCANKEY_DRV]}" = 'brscan-skey-0.3.2-0.amd64.deb'
        then
            printer[SCANKEY_DRV]="brscan-skey-0.3.4-0.amd64.deb"
        fi
    fi
else
    err+=1
    echo "pas de pilote pour le scanner."
fi

##########################
 # préparation du système
##########################
if test -f "$Logfile"
then
    mv -v "$Logfile" "$Logfile.$date"
fi
for d in  "$tmpDir" "/usr/share/cups/model" "/var/spool/lpd"
do
    if ! test -d "$d"
    then
        mkdir -pv "$d"
    fi
done

apt-get update -qq
install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget" "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
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" "$Url2_Pkg"
    do
        if ! test -f "$tmpDir/$drv"
        then
            Url_Deb="$addr/$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
dpkg --install --force-all  "${pkg2install[@]}"
##

#################################
 # 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 -d '' fileName
        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
#restauration fichier conf


############################
 # configuration du scanner
############################
if test -z "ÎP"
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

EDIT ha , exact @nany .
je corrige donc .
Mais modelName aussi doit etre en majuscule pour que le fichier info soit trouvé et que ca fonctionne big_smile
Merci .

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#188 Aujourd'hui à 14:44

iznobe

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

nany a écrit :

Autre remarque : Brother propose un script d’installation. Attention Watael, ça pique les yeux ! Mais il a l’air de faire le job.
Alors je me demande si l’élaboration du présent script vaut la chandelle.

Effectivement .

D ' ailleurs , je trouve que le script de demonipuch et le script de brother se ressemblent beaucoup . Meme si celui de brother est plus étendu et complet avec des similitudes plutôt étonnantes et importantes .


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#189 Aujourd'hui à 15:03

eric63

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

le script de brother est en anglais
la plupart ne téléchargent que les paquets de l’imprimante et pas le script qui est peu compréhensible

Step1. Download the tool.(linux-brprinter-installer-*.*.*-*.gz)

The tool will be downloaded into the default "Download" directory.
(The directory location varies depending on your Linux distribution.)
e.g. /home/(LoginName)/Download

Step2. Open a terminal window.

Step3. Go to the directory you downloaded the file to in the last step. By using the cd command.

e.g. cd Downloads

Step4. Enter this command to extract the downloaded file:

Command: gunzip linux-brprinter-installer-*.*.*-*.gz

e.g. gunzip linux-brprinter-installer-2.1.1-1.gz

Step5. Get superuser authorization with the "su" command or "sudo su" command.

Step6. Run the tool:

Command: bash linux-brprinter-installer-*.*.*-* Brother machine name
e.g. bash linux-brprinter-installer-2.1.1-1 MFC-J880DW

Step7. The driver installation will start. Follow the installation screen directions.


When you see the message "Will you specify the DeviceURI ?",

For USB Users: Choose N(No)
For Network Users: Choose Y(Yes) and DeviceURI number.

The install process may take some time. Please wait until it is complete.

perso pour un néophyte c’est peine perdue

le script de demonipuch est plus basique et accessible et en français
modèle imprimante
usb ou réseau
adresse IP
et un fichier de log

Dernière modification par eric63 (Aujourd'hui à 15:06)


Kubuntu 25.04 wayland Plasma 6.4.3 KDE Qt 6.8.3 noyau 6.14.0-24 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script demonipuch
J’utilise le clavier LDLC AFNOR

Hors ligne

#190 Aujourd'hui à 16:58

Watael

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

ahhhhh! mes yeux !

if [ "$(ls -al $ORGC  2> /dev/null | grep ^l | grep "$SYMLNC" )" != '' ]

Nooooon! mais pourquoi !?

lol

Dernière modification par Watael (Aujourd'hui à 17:01)


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

Hors ligne

#191 Aujourd'hui à 17:28

iznobe

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

eric63 a écrit :

le script de brother est en anglais
la plupart ne téléchargent que les paquets de l’imprimante et pas le script qui est peu compréhensible

perso pour un néophyte c’est peine perdue

le script de demonipuch est plus basique et accessible et en français
modèle imprimante
usb ou réseau
adresse IP
et un fichier de log


ça c' etait avant !!!

Avant que Watael passe par là tongue

on pourrait se contenter de faire :
la commande pour telecharger le script brother
et traduire ce qu ' ils racontent en anglais en francais . et donner les commandes .
C' est ce que j ' ai fait des dizaines de fois sur le forum , avant de me lancer dans la reprise du script de demonipuch d ' ailleurs , c' est vraiment simple big_smile

Mais bon , on a vu des personnes qui ne savait pas quoi choisir entre " reseau " ou " usb " ... quoi qu ' on fasse , tout sera trop compliqué pour ceux là sans assistanat .

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#192 Aujourd'hui à 17:43

iznobe

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

Watael a écrit :

ahhhhh! mes yeux !

if [ "$(ls -al $ORGC  2> /dev/null | grep ^l | grep "$SYMLNC" )" != '' ]

Nooooon! mais pourquoi !?

lol

j ' aurais plutot fait ça :

ELLE="^l"
if test -z [[ "$(ls -al "$ORGC"  2> /dev/null | grep "$ELLE" | grep "$SYMLNC" )" =='' ]] 

histoire d' harmoniser les doubles quotes tongue big_smile

Blague à part , tiens , justement , comment faire un

grep -E "machin &  truc"

plutot que des piper les grep ?

on voit souvent des

grep -E "machin | truc"

mais rarement l' inverse ...

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#193 Aujourd'hui à 21:34

nany

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

iznobe a écrit :

Maôrche pô big_smile

Mais ça , oui :

if (( $(echo "$DISTRIB_RELEASE" | cut -c1-2) >=24 )) && test "${printer[SCANKEY_DRV]}" = 'brscan-skey-0.3.2-0.amd64.deb'
(( ${DISTRIB_RELEASE:0:2} >= 24 ))

Mais on peut faire mieux avec des variables en début de script :

…
############################
 # définitions de variables
############################
if test -f /etc/lsb-release; then
    . /etc/lsb-release
elif test -f /usr/lib/os-release; then
    . /usr/lib/os-release
fi
if test -n "$DISTRIB_ID"; then
    DistroName="$DISTRIB_ID"
elif test -n "$NAME"; then
    DistroName="$NAME"
fi
if test -n "$DISTRIB_RELEASE"; then
    VersionYear="${DISTRIB_RELEASE:0:2}"
elif test -n "$VERSION_ID"; then
    VersionYear="${VERSION_ID:0:2}"
fi
user="$SUDO_USER"
codeName="$(lsb_release -cs)" # n’est pas utilisée, pourrait être remplacée par :
#if test -n "$DISTRIB_CODENAME"; then
#    codeName="$DISTRIB_CODENAME"
#elif test -n "$VERSION_CODENAME"; then
#    codeName="$VERSION_CODENAME"
#fi
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
…
##########################
 # quelques vérifications
##########################
if test "$DistroName" != "Ubuntu"
then
    errQuit "La distribution n’est pas Ubuntu ou une des ses variantes officielles."
fi
#if [[ $arch != @(i386|i686|x86_64) ]]
if test "$arch" != "x86_64"
then
    errQuit "Système non compatible."
fi
if ((EUID))
then
    errQuit "Vous devez lancer le script en root : sudo brprinter_install.sh" # Je mettrais plutôt sudo $0.
fi
if ! nc -z -w5 'brother.com' 80
then
    errQuit "le site \"brother.com\" n'est pas joignable."
fi
…
########################################################
 # vérification de variables disponibles dans `printer'
########################################################
if ! test "${printer[PRINTERNAME]}" = "$printerName"
then
    errQuit "les données du fichier info recupéré et le nom de l'imprimante ne correspondent pas."
fi
if test -n "${printer[LNK]}"
then
    printerInf="$Url_Info/${printer[LNK]}"
fi

if test -n "${printer[SCANNER_DRV]}"
then
    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
…

En ligne

#194 Aujourd'hui à 21:35

nany

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

Watael a écrit :

ahhhhh! mes yeux !

if [ "$(ls -al $ORGC  2> /dev/null | grep ^l | grep "$SYMLNC" )" != '' ]

Nooooon! mais pourquoi !?

lol

J’avais prévenu. tongue

En ligne

#195 Aujourd'hui à 22:05

Watael

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

nany a écrit :

Alors qu’il suffit de passer en lettres capitales :

c'est ce que fait declare -u

¿ une raison de ne pas faire

if test -f /etc/lsb-release
then
    . /etc/lsb-release
    DistroName="$DISTRIB_ID"
    VersionYear="${DISTRIB_RELEASE::2}"
elif test -f /usr/lib/os-release
then
    . /usr/lib/os-release
    DistroName="$NAME"
    VersionYear="${VERSION_ID::2}"
fi

?


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

Hors ligne

#196 Aujourd'hui à 22:46

nany

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

Watael a écrit :
nany a écrit :

Alors qu’il suffit de passer en lettres capitales :

c'est ce que fait declare -u

Oups, j’avais pas fait gaffe !

Watael a écrit :

¿ une raison de ne pas faire

if test -f /etc/lsb-release
then
    . /etc/lsb-release
    DistroName="$DISTRIB_ID"
    VersionYear="${DISTRIB_RELEASE::2}"
elif test -f /usr/lib/os-release
then
    . /usr/lib/os-release
    DistroName="$NAME"
    VersionYear="${VERSION_ID::2}"
fi

?

Aucune, je me suis compliqué la vie pour rien. roll


Bon ben je crois que j’ai plus qu’à aller me coucher.

En ligne

#197 Aujourd'hui à 23:07

nany

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

Et avant de me coucher, je pose le script avec les dernières modifications.

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

#########################
 # gestion des arguments
#########################
declare -u modelName=$1
until test -n "$modelName"
do
    read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
printerName="${modelName//-/}"
#check IP
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

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

printerInfo="$Url_Info/$printerName"
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 [[ $arch != @(i386|i686|x86_64) ]]
if test "$arch" != "x86_64"
then
    errQuit "Système non compatible."
fi
if ((EUID))
then
    errQuit "Vous devez lancer le script en root : sudo brprinter_install.sh" # Je mettrais plutôt sudo $0.
fi
if ! nc -z -w5 'brother.com' 80
then
    errQuit "le site \"brother.com\" n'est pas joignable."
fi

##################################################
 # initialisation du tableau associatif `printer'
##################################################
while IFS='=' read -r k v
do
    printer[$k]=$v
done < <(wget -qO- "$printerInfo" | sed '/\(]\|rpm\|=\)$/d')
########################################################
 # vérification de variables disponibles dans `printer'
########################################################
if ! test "${printer[PRINTERNAME]}" = "$printerName"
then
    errQuit "les données du fichier info recupéré et le nom de l'imprimante ne correspondent pas."
fi
if test -n "${printer[LNK]}"
then
    printerInf="$Url_Info/${printer[LNK]}"
fi

if test -n "${printer[SCANNER_DRV]}"
then
    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
##########################
if test -f "$Logfile"
then
    mv -v "$Logfile" "$Logfile.$date"
fi
for d in  "$tmpDir" "/usr/share/cups/model" "/var/spool/lpd"
do
    if ! test -d "$d"
    then
        mkdir -pv "$d"
    fi
done

apt-get update -qq
install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget" "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
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" "$Url2_Pkg"
    do
        if ! test -f "$tmpDir/$drv"
        then
            Url_Deb="$addr/$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
dpkg --install --force-all  "${pkg2install[@]}"
##

#################################
 # 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 -d '' fileName
        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
#restauration fichier conf


############################
 # configuration du scanner
############################
if test -z "ÎP"
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

En ligne