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.

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

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

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

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

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

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

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

Hors ligne