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.

#126 Hier à 21:02

iznobe

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

j ' avais deja mis auparavant ( ls -R ) et re voilà :

iznobe@iznobe-pc:~$ cd /usr/share/cups/model; \ls -1
Brother
brother-MFCL2710DW-cups-en.ppd
re.ppd
iznobe@iznobe-pc:/usr/share/cups/model$ ls -R /usr/share/cups/model
/usr/share/cups/model:
Brother  brother-MFCL2710DW-cups-en.ppd  re.ppd

/usr/share/cups/model/Brother:
brother_dcpl3560cdw_printer_en.ppd
iznobe@iznobe-pc:/usr/share/cups/model$ 

je suis censé recuperé quoi dans la variable " PPDs " , un tableau des noms de fichiers comportant brother dans leur nom et .ppd à la fin si j ' ai bien compris ?
Mais il y a une erreur de syntaxe à priori ...
Avec le code donné :

if [[ -z "$Ppd_File" ]]; then
		#regex="^brother.*\.ppd$"
		shopt -s nullglob extglob
		PPDs=( /usr/share/cups/model/*brother*@($Model_Name|$Printer_Name)*.ppd )
		echo "${PPDs[*]}"
		exit

j ' obtiens :

iznobe@iznobe-pc:~$ sudo bash Scripts/demonipuch.sh MFCL-2710DW 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.025 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.074 ms

--- 192.168.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1019ms
rtt min/avg/max/mdev = 0.025/0.049/0.074/0.024 ms
   ...done.
Scripts/demonipuch.sh: ligne 361: erreur de syntaxe près du symbole inattendu « ( »
Scripts/demonipuch.sh: ligne 361: `		PPDs=( /usr/share/cups/model/*brother*@($Model_Name|$Printer_Name)*.ppd )'

iznobe@iznobe-pc:~$ 

j ' ai essayé avec des accolades ( dans tous les sens ) comme le suggere shellcheck et d ' encadré avec des doubles quotes , mais rien a faire .
ce qui est curieux , c' est que shellcheck ne remet pas la meme erreur que j' avais au depart ... comprend pas roll

Dernière modification par iznobe (Hier à 21:10)


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#127 Hier à 21:07

Watael

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

il faut descendre sous Brother/ ?

j'ai recréé l'arborescence sous /tmp/

$ cd /tmp
$ \ls -1R usr/share/cups/model/
usr/share/cups/model/:
Brother
brother-MFCL2710DW-cups-en.ppd
re.ppd

usr/share/cups/model/Brother:
brother_dcpl3560cdw_printer_en.ppd
$ shopt -s extglob nullglob globstar
$ PPDs=( usr/share/cups/model/**/*brother*@($Model_Name|$Printer_Name)*.ppd )
$ printf '%s\n' "${PPDs[@]}"
usr/share/cups/model/Brother/brother_dcpl3560cdw_printer_en.ppd
usr/share/cups/model/brother-MFCL2710DW-cups-en.ppd

EDIT
/!\
oula! attends : j'ai oublié d'assigner les variables !
qu'utilises-tu pour Model_Name et Printer_Name ?

Dernière modification par Watael (Hier à 21:13)


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

Hors ligne

#128 Hier à 21:12

iznobe

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

a priori oui  d' ou le " find à l' origine , puisque certains fichiers sont dans
/usr/share/cups/model/Brother :

/usr/share/cups/model/Brother:
brother_dcpl3560cdw_printer_en.ppd

retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#129 Hier à 21:13

iznobe

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

un truc est bizzare :

iznobe@iznobe-pc:~$ shopt -s extglob nullglob globstar
iznobe@iznobe-pc:~$ PPDs=( usr/share/cups/model/**/*brother*@($Model_Name|$Printer_Name)*.ppd )
iznobe@iznobe-pc:~$ printf '%s\n' "${PPDs[@]}"

iznobe@iznobe-pc:~$ 

retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#130 Hier à 21:14

Watael

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

edit message précédent

Dernière modification par Watael (Hier à 21:15)


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

Hors ligne

#131 Hier à 21:14

iznobe

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

il me semble que les noms de variables sont OK , enfin je verifie et te dis ça .

oui , ca me parait correct :

while [[ -z "$Model_Name" ]]; do read -rp "Entrez votre modèle d' imprimante : " Model_Name;done
	Model_Name=${Model_Name^^}
	# Si le 2eme argument est vide on demande comment est connectée l'imprimante
	while [[ -z "$Connection" ]]; do
		read -rp "Sélectionner le type de connectivité : [0] USB - [1] Réseau , votre choix : "
		case $REPLY in
			0)
				Connection="USB"
			;;
			1)
				Connection="Réseau"
				log "Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe." "Red"
				log "Veuillez consulter le manuel de votre imprimante pour plus de détails : http://support.brother.com/g/b/productsearch.aspx?c=fr&lang=fr&content=ml" "Red"
			;;
		esac
	done
	# Si connection == reseau on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then
		while [[ -z "$IP" ]]; do
			read -rp "Entrez l'adresse IP de votre imprimante : " IP
			control_ip "$IP"
	    done
	fi
	# On transforme le nom de l'imprimante ( enleve le " - " )
	Printer_Name="${Model_Name//-/}"

Dernière modification par iznobe (Hier à 21:16)


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#132 Hier à 21:15

Watael

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

peut-être, mais, moi, je n'en ai pas mis, donc ça marche peut-être parce que les variables ne sont pas déclarées...


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

Hors ligne

#133 Hier à 22:36

iznobe

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

heu , admettons , mais alors pourquoi ? :

iznobe@iznobe-pc:~$ sudo bash Scripts/demonipuch.sh MFCL-2710DW 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.025 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.074 ms

--- 192.168.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1019ms
rtt min/avg/max/mdev = 0.025/0.049/0.074/0.024 ms
   ...done.
Scripts/demonipuch.sh: ligne 361: erreur de syntaxe près du symbole inattendu « ( »
Scripts/demonipuch.sh: ligne 361: `		PPDs=( /usr/share/cups/model/*brother*@($Model_Name|$Printer_Name)*.ppd )'

iznobe@iznobe-pc:~$ shopt -s extglob nullglob globstar
iznobe@iznobe-pc:~$ PPDs=( usr/share/cups/model/**/*brother*@($Model_Name|$Printer_Name)*.ppd )
iznobe@iznobe-pc:~$ printf '%s\n' "${PPDs[@]}"

iznobe@iznobe-pc:~$ cat -n Scripts/demonipuch.sh | grep 361
   361			PPDs=( /usr/share/cups/model/*brother*@($Model_Name|$Printer_Name)*.ppd )
iznobe@iznobe-pc:~$ 

Dernière modification par iznobe (Hier à 22:37)


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#134 Hier à 22:52

iznobe

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

on ne pourrait pas se servir de " du " ( qui fonctionne presque comme find ) ?

j ' ai trouvé ça , qui a l' air de fonctionner :

iznobe@iznobe-pc:~$ shopt -s nullglob globstar
for file in /usr/share/cups/model/**/*; do echo "trouvé $file"; done
trouvé /usr/share/cups/model/Brother
trouvé /usr/share/cups/model/Brother/brother_dcpl3560cdw_printer_en.ppd
trouvé /usr/share/cups/model/brother-MFCL2710DW-cups-en.ppd
trouvé /usr/share/cups/model/re.ppd
iznobe@iznobe-pc:~$ 

tongue : https://forum.ubuntu-fr.org/viewtopic.php?id=574651

Dernière modification par iznobe (Hier à 23:03)


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#135 Hier à 23:00

diesel

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

iznobe a écrit :

on ne pourrait pas se servir de " du " ( qui fonctionne presque comme find ) ?

du (disk usage) qui fonctionne "presque" comme find ???????

Amicalement.

Jean-Marie

Dernière modification par diesel (Hier à 23:00)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#136 Hier à 23:05

Watael

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

tu n'as peut-être pas configuré correctement les options du shell avec shopt...
et puis, ce que j'ai écrit correspond à l'arborescence que j'ai reconstruite sous /tmp

$ shopt -s extglob nullglob extglob
$ Printer_Name=MFCL-2710DW; Model_Name=MFCL2710DW
$ PPDs=( /tmp/usr/share/cups/model/**/*brother*@($Model_Name|$Printer_Name)*.ppd )
$ printf '%s\n' "${PPDs[@]}"
/tmp/usr/share/cups/model/brother-MFCL2710DW-cups-en.ppd

fichier trouvé !

Dernière modification par Watael (Hier à 23:05)


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

Hors ligne

#137 Hier à 23:09

iznobe

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

@diesel oui , sur certains points . il esst evident que son utilisation premiere est completement differente ...


bon , j' ai la regex qui va bien :

grep -E ^brother.*\.ppd$

la boucle qui va bien :

for file in /usr/share/cups/model/**/*

comment assembler les 2 pour obtenir le resultat desiré ?


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#138 Hier à 23:12

iznobe

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

Watael a écrit :

tu n'as peut-être pas configuré correctement les options du shell avec shopt...
et puis, ce que j'ai écrit correspond à l'arborescence que j'ai reconstruite sous /tmp

$ shopt -s extglob nullglob extglob
$ Printer_Name=MFCL-2710DW; Model_Name=MFCL2710DW
$ PPDs=( /tmp/usr/share/cups/model/**/*brother*@($Model_Name|$Printer_Name)*.ppd )
$ printf '%s\n' "${PPDs[@]}"
/tmp/usr/share/cups/model/brother-MFCL2710DW-cups-en.ppd

fichier trouvé !

ha , là , ça fonctionne :

iznobe@iznobe-pc:~$ shopt -s extglob nullglob extglob
iznobe@iznobe-pc:~$ Printer_Name=MFCL-2710DW; Model_Name=MFCL2710DW
iznobe@iznobe-pc:~$ PPDs=( /usr/share/cups/model/**/*brother*@($Model_Name|$Printer_Name)*.ppd )
iznobe@iznobe-pc:~$ printf '%s\n' "${PPDs[@]}"
/usr/share/cups/model/brother-MFCL2710DW-cups-en.ppd
iznobe@iznobe-pc:~$ 

mais , je sais pas pourquoi , il me donne cette erreur de syntaxe ...

voilà le script au complet , si jamais ( shellcheck lui , n ' emet aucune objection avec ce code ) :

#!/bin/bash
# Script d'installation pour imprimantes Brother
# ecrit par @demonipuch .
# re-ecrit par ubuntu team : https://forum.ubuntu-fr.org/viewtopic.php?id=2091835&p=2

# todo :
# verification de l' installation des dependances / paquets sur version ubuntu 24.04 et superieures
# multiarch-support , libsane etc ...

if test -f /lib/lsb/init-functions; then . /lib/lsb/init-functions;fi

valid_ip() {
    IFS='.' read -ra ip <<< "$1"
    [[ ${ip[0]} -gt 0 ]] && [[ ${ip[0]} -le 255 ]] && [[ ${ip[1]} -ge 0 ]] && [[ ${ip[1]} -le 255 ]] && [[ ${ip[2]} -ge 0 ]] && [[ ${ip[2]} -le 255 ]] && [[ ${ip[3]} -ge 0 ]] && [[ ${ip[3]} -le 255 ]]
}

control_ip() {
	if [[ -n "$IP" ]]; then
		if valid_ip "$IP"; then
			if ping -c2 "$IP"; then log_action_end_msg 0
			else
				log "Votre IP ne permet pas de joindre l ' hote. Eclairer votre imprimante si celle-ci est eteinte , ou bien , corriger votre adresse IP."
				unset IP
				log_action_end_msg 1
			fi
		else
			log "L ' adresse IP que vous avez entrée est incorrecte"
			unset IP
			log_action_end_msg 1
		fi
	fi
}

install_pkg() {
	for pkg do
		log "Recherche du paquet : ' $pkg ' sur votre système"
		if dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null; then
			echo " - Paquet ' $pkg ' deja installé" &>> "$Logfile"
			log_action_end_msg 0
		else
			echo " - Paquet ' $pkg ' non installé" &>> "$Logfile"
			log_action_end_msg 1
			log "Installation du paquet : ' $pkg ' sur votre système"
			apt-get install -qq "$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
}

verif_rep() {
	for dir do
	log "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log "Creation du dossier ' $dir '"
			mkdir -pv "$dir" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
}

verif_lien() { # utilisation : # verif_lien "lien" "cible" . affichage de ls -l ' lien : /etc/init.d/lpd ~> /etc/init.d/cups : cible '
	# Musique -> /datas/iznobe/Musique
	# lien -> cible
	lien=$1
	cible=$2

	log "Recherche du lien ' $lien ' sur votre système"
	if ! test -L "$lien"; then
		log_action_end_msg 1
		log "Creation du lien ' $lien '"
		ln -s "$cible" "$lien" &>> "$Logfile"
		log_action_end_msg $?
	else log_action_end_msg $?;
	fi
}

log() {
	message="$1"
	if test -z "$2"; then
		log_action_begin_msg "$message"
		echo -e " - $message" &>> "$Logfile"
	else
		if test "$2" == "Blue"; then color="\\033[1;34m";fi
		if test "$2" == "Red"; then color="\\033[1;31m";fi
			echo -e "$color $message \\033[0;0m" # Resetcolor
			echo -e "
			# $message" &>> "$Logfile"
	fi
}

Model_Name="$1"
if [ -n "$2" ]; then
	IP="$2"
 	if control_ip "$IP"; then Connection="Réseau"; fi
fi

User="$SUDO_USER"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter_install.log"
#Logfile="/home/$User/brprinter_install.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
# 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"

declare -A printer

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; fi
	# On vérifie qu'on lance le script en root
	if ((EUID)); then log "Vous devez lancer ce script en tant que root : sudo bash $0" "Red"; exit 1;fi
	if [[ $Arch != "i386" ]] && [[ $Arch != "i686" ]] && [[ $Arch != "x86_64" ]]; then #  && [[ $Arch != "armv7l" ]]
		log "Achitecture $Arch non prise en charge ! script interrompu." "Red"
		exit 2
	fi
	# on verifie la connection au serveur
	if ! nc -z -w5 'brother.com' 80; then
		log "serveur brother injoignable ! script interrompu." "Red"
		log "Veuillez verifier votre connexion internet." "Red"
		exit 3
	fi

	# Si le premier argument est vide on demande le modèle de l'imprimante
	while [[ -z "$Model_Name" ]]; do read -rp "Entrez votre modèle d' imprimante : " Model_Name;done
	Model_Name=${Model_Name^^}
	# Si le 2eme argument est vide on demande comment est connectée l'imprimante
	while [[ -z "$Connection" ]]; do
		read -rp "Sélectionner le type de connectivité : [0] USB - [1] Réseau , votre choix : "
		case $REPLY in
			0)
				Connection="USB"
			;;
			1)
				Connection="Réseau"
				log "Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe." "Red"
				log "Veuillez consulter le manuel de votre imprimante pour plus de détails : http://support.brother.com/g/b/productsearch.aspx?c=fr&lang=fr&content=ml" "Red"
			;;
		esac
	done
	# Si connection == reseau on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then
		while [[ -z "$IP" ]]; do
			read -rp "Entrez l'adresse IP de votre imprimante : " IP
			control_ip "$IP"
	    done
	fi
	# On transforme le nom de l'imprimante ( enleve le " - " )
	Printer_Name="${Model_Name//-/}"
	# On construit l'URL du fichier contenant les informations
	Printer_Url_Info="$Url_Info/$Printer_Name"
	Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=""$Printer_Name""_us_eu_as"
	# resumé pour logfile
	log "                     $date
			# Ubuntu Codename : $Codename
			# Architecture : $Arch
			# Modèle de l'imprimante : $Model_Name
			# Type de connexion : $Connection
			# Adresse IP : $IP
			# Repertoire courant : $Temp_Dir
			# Repertoire de telechargement des pilotes : $Temp_Dir
			# Fichier d'informations : $Printer_Url_Info
			# page de telechargement des pilotes : $Printer_dl_url" "Blue"
	log "initialisation du script." "Blue"
	# on cree le repertoire temporaire de travail.
	verif_rep "$Temp_Dir"
	# On vérifie l'URL
	Printer_Info="$Temp_Dir/Printer_Info.html"
	log "Obtention des infos de l' imprimante"
	wget -q "$Printer_Url_Info" -O "$Printer_Info"
	#while IFS='=' read -r k v; do printer[$k]=$v; done < <(wget -qO - "$Printer_Url_Info" | sed '/\(]\|rpm\|=\)$/d')

    log_action_end_msg $?
	# On vérifie que le fichier fournit les informations
	log "Vérification du fichier obtenu"
	#if test "${printer[PRINTERNAME]}" == "$Printer_Name"; then log_action_end_msg 0
	if test "$(grep PRINTERNAME "$Printer_Info" | cut -d= -f2)" == "$Printer_Name"; then log_action_end_msg 0
    	else
    		log_action_end_msg 1
    		log "Aucun pilote trouvé. Veuillez vérifier le modèle de votre imprimante ou
			visitez la page suivante : $Printer_dl_url
			afin de télécharger les pilotes et les installer manuellement." "Red"
			exit 2
    fi
	# ???????? pas compris a quoi sert ce controle , ni quelles infos il est censé recuperé . peut etre certaines URL comporte des liens vers d' autres pages
	#if test -n "${printer[LNK]}"; then Printer_Url_Info="$Url_Info/${printer[LNK]}";log "LNK = ${printer[LNK]}" "Red";fi
	Lnk="$(grep LNK "$Printer_Info" | cut -d= -f2)"
	if test -n "$Lnk"; then Printer_Url_Info="$Url_Info/$Lnk";log "LNK = $Lnk" "Red";fi
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	log "Vérification des pré-requis" "Blue"
	log "Mise à jour de la liste des paquets"
	apt-get update -qq
	log_action_end_msg $?
	# On vérifie que la liste des paquets est installée et on l'installe le cas échéant
	log "installation des paquets requis"
	if ! install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget" "gawk"; then
		log "impossible d' installer les paquets indispensables" "Red"
		exit 4
	else
		log_action_end_msg $?
	fi

	# Si un pilote pour le scanner a été trouvé on vérifie que la liste des paquets est installée
	if [[ -n $Scanner_Deb ]]; then install_pkg "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"; fi

	# On vérifie que le paquet csh est installé et on l'installe le cas échéant (uniquement pour certaines imprimantes)
	for i in DCP-110C DCP-115C DCP-117C DCP-120C DCP-310CN DCP-315CN DCP-340CW FAX-1815C FAX-1820C FAX-1835C FAX-1840C FAX-1920CN FAX-1940CN FAX-2440C MFC-210C MFC-215C MFC-3220C MFC-3240C MFC-3320CN MFC-3340CN MFC-3420C MFC-3820CN MFC-410CN MFC-420CN MFC-425CN MFC-5440CN MFC-5840CN MFC-620CN MFC-640CW MFC-820CW; do
		if [[ "$Model_Name" == "$i" ]]; then install_pkg "csh";	fi
	done
	# On vérifie que le dossier de téléchargement temporaire et /usr/share/cups/model et /var/spool/lpd existent et on les crée le cas échéant
	verif_rep "/usr/share/cups/model" "/var/spool/lpd"

	# On vérifie que le lien symbolique /etc/init.d/lpd existe et on le crée le cas échéant (uniquement pour certaines imprimantes)
	for i in DCP-1000 DCP-1400 DCP-8020 DCP-8025D DCP-8040 DCP-8045D DCP-8060 DCP-8065DN FAX-2850 FAX-2900 FAX-3800 FAX-4100 FAX-4750e FAX-5750e HL-1030 HL-1230 HL-1240 HL-1250 HL-1270N HL-1430 HL-1440 HL-1450 HL-1470N HL-1650 HL-1670N HL-1850 HL-1870N HL-5030 HL-5040 HL-5050 HL-5070N HL-5130 HL-5140 HL-5150D HL-5170DN HL-5240 HL-5250DN HL-5270DN HL-5280DW HL-6050 HL-6050D MFC-4800 MFC-6800 MFC-8420 MFC-8440 MFC-8460N MFC-8500 MFC-8660DN MFC-8820D MFC-8840D MFC-8860DN MFC-8870DW MFC-9030 MFC-9070 MFC-9160 MFC-9180 MFC-9420CN MFC-9660 MFC-9700 MFC-9760 MFC-9800 MFC-9860 MFC-9880; do
		if [[ "$Model_Name" == "$i" ]]; then verif_lien "/etc/init.d/lpd" "/etc/init.d/cups"; # verif_lien "lien" "cible" 'lien : /etc/init.d/lpd ~> /etc/init.d/cups : cible'
			# On crée un lien symbolique vers cups.service si systemd est utilisé : ln -s /lib/systemd/system/cups.service /lib/systemd/system/lpd.service
			if [[ -L /sbin/init ]]; then
				verif_lien "/lib/systemd/system/cups.service" "/lib/systemd/system/lpd.service" # ' lien : /lib/systemd/system/cups.service ~> /lib/systemd/system/lpd.service: cible'
				systemd daemon-reload
			fi
		fi
	done
	echo "" &>> "$Logfile"
}

##############################
# TÉLÉCHARGEMENT DES PILOTES #
##############################
do_download_drivers() {
    log "Recherche des pilotes" "Blue"
    log "Recherche des pilotes pour l' imprimante"
    printer=(
        [prn_lpd]="$(grep PRN_LPD_DEB "$Printer_Info"  | cut -d= -f2)"
        [prn_cups]="$(grep PRN_CUP_DEB "$Printer_Info" | cut -d= -f2)"
        [prn_drv]="$(grep PRN_DRV_DEB "$Printer_Info"  | cut -d= -f2)"
    )
    log_action_end_msg $?

    Scanner_Deb=$(grep SCANNER_DRV "$Printer_Info" | cut -d= -f2)
    if test -n "$Scanner_Deb"; then
    	printer+=(
    		[udev_rules]="$Udev_Deb_Name"
    	)
        log "Recherche des pilotes pour le scanner"

        Scankey_Deb=$(grep SCANKEY_DRV "$Printer_Info" | cut -d= -f2)

        Scanner_Url_Info="$Url_Info/$Scanner_Deb.lnk"
        Scankey_Url_Info="$Url_Info/$Scankey_Deb.lnk"
        echo " - Scanner infos :
        	$Scanner_Url_Info
        	$Scankey_Url_Info" &>> "$Logfile"

        Scanner_Info="$Temp_Dir/Scanner_Url_Info.html"
        wget -q "$Scanner_Url_Info" -O "$Scanner_Info"
        Scankey_Info="$Temp_Dir/Scankey_Url_Info.html"
		wget -q "$Scankey_Url_Info" -O "$Scankey_Info"

        # On récupère les pilotes du scanner en fonctionnement de l'architecture du système (32-bits ou 64-bits)
        case "$Arch" in
            i386|i686)
                printer+=(
                    [scanner_drv]="$(grep DEB32 "$Scanner_Info" | cut -d= -f2)"
                    [scanKey_drv]="$(grep DEB32 "$Scankey_Info" | cut -d= -f2)"
                )
                log_action_end_msg 0
                ;;
            x86_64)
                printer+=(
                    [scanner_drv]="$(grep DEB64 "$Scanner_Info" | cut -d= -f2)"
                    [scanKey_drv]="$(grep DEB64 "$Scankey_Info" | cut -d= -f2)"
                )
                # pour ubuntu 24.04 et superieurs
                if [[ $(grep DISTRIB_RELEASE= /etc/lsb*release | cut -d= -f2 | cut -c1-2) -ge 24 ]]; then
                	if test "${printer[scanKey_drv]}" = "brscan-skey-0.3.2-0.amd64.deb"; then printer[scanKey_drv]="$Scankey_Drv_Deb_Name";fi
                fi
                log_action_end_msg 0
                ;;
                *)
					log "Architecture inconnue: $Arch" "Red"
				;;
        esac
    else
        log "Pas de scanner détecté" "Red"
        log_action_end_msg 1
    fi

    log "Téléchargement des pilotes" "Blue"
    for pkg in "${printer[@]}"; do
        # On ajoute la liste des pilotes trouvés au fichier de journalisation
        if test -n "$pkg"; then
            echo " - Paquet trouvé : $pkg" &>> "$Logfile"
            # On télécharge les pilotes trouvés si ils ne le sont pas deja
            if [[ ! -f "$Temp_Dir"/"$pkg" ]]; then
                Url_Deb="$Url_Pkg"/"$pkg"
                # le paquet 'udev-rules' est situé a un autre emplacement
                if test "$pkg" == "${printer[udev_rules]}"; then Url_Deb="$Udev_Deb_Url"/"$pkg"; fi
                log "Téléchargement du paquet : $pkg"
                wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
                if [[ ! -f "$Temp_Dir"/"$pkg" ]]; then
                  Url_Deb2="$Url_Pkg2"/"$pkg"
                  wget -cP "$Temp_Dir" "$Url_Deb2" &>> "$Logfile"
                fi
                log_action_end_msg $?
            else
                log "Le paquet : $pkg a deja été telechargé"
                log_action_end_msg 0
            fi
        fi
    done
}

############################
# INSTALLATION DES PILOTES #
############################
do_install_drivers() {
	log "Installation des pilotes" "Blue"
	for pkg in "${printer[@]}"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			log "Installation du paquet : $pkg"
			dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
	echo "" &>> "$Logfile"
}

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	log "Configuration de l'imprimante" "Blue"
	log "Recherche d'un fichier PPD sur votre système"
	for pkg in "${printer[prn_cups]}" "${printer[prn_drv]}"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			Ppd_File=$(dpkg --contents "$Temp_Dir/$pkg" | gawk '/ppd/{sub(".","",$NF); print $NF}')
			log_action_end_msg 0;
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		#regex="^brother.*\.ppd$"
		shopt -s nullglob extglob
		PPDs=( /usr/share/cups/model/*brother*@($Model_Name|$Printer_Name)*.ppd )
		echo "${PPDs[*]}"
		exit

		# for file in "${PPDs[@]}"; do
		# 	if [[ "$file" =~ $regex ]]; then
		# 		Ppd_File="${BASH_REMATCH[0]}"
		# 		echo " - Fichier PPD : ' $Ppd_File ' trouvé" &>> "$Logfile"
		# 		log_action_end_msg 0;
		# 	else
		# 		echo " - Fichier PPD : $Ppd_File non trouvé !" &>> "$Logfile"
		# 		log_action_end_msg 1
		# 	fi
		# done
	fi
	# On ajoute la nouvelle imprimante
	log "Ajout de l'imprimante $Model_Name"
	{
		echo " - Backup du fichier /etc/cups/printers.conf.O"
		cp /etc/cups/printers.conf.O "$Temp_Dir"
		echo " - Arret du service CUPS"
		echo " - Restauration du fichier printers.conf"
		systemctl stop cups
		cp "$Temp_Dir"/printers.conf.O /etc/cups/printers.conf
		echo " - Redémarrage du service CUPS"
		systemctl restart cups
		sleep 1
	} &>> "$Logfile"
	case "$Connection" in
	"USB")
		lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File" &>> "$Logfile"
	;;
	"Réseau")
		lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File" &>> "$Logfile"
	;;
	esac
	log_action_end_msg $?
	{
		cp "$Temp_Dir"/printers.conf.O /etc/cups/printers.conf.O
		echo " - Restauration du fichier printers.conf.O"
		echo ""
	} &>> "$Logfile"
}

############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
	log "Configuration du scanner" "Blue"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log "Configuration du scanner USB"
			# On ajoute une entrée au fichier /lib/udev/rules.d/60-libsane1.rules
			if grep -q "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"; then
				log_action_end_msg $?
				echo " - Règle udev deja presente dans le fichier $Udev_Rules" &>> "$Logfile"

			else
				# ?????????? n ' ajoute pas la regle correctement .
				sed -i "/LABEL=\"libsane_usb_rules_begin\"/a\
				\n# Brother\nATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
				log_action_end_msg $?
				echo " - Règle udev ajoutée dans le fichier $Udev_Rules" &>> "$Logfile"
				# On recharge les règles udev
				# udevadm control --reload
				udevadm control --reload-rules
			fi
		elif [[ $Connection == "Réseau" ]]; then
			log "Configuration du scanner réseau"
			if [[ -x /usr/bin/brsaneconfig ]]; then
				brsaneconfig -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			elif [[ -x /usr/bin/brsaneconfig2 ]]; then
				brsaneconfig2 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			elif [[ -x /usr/bin/brsaneconfig3 ]]; then
				brsaneconfig3 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			elif [[ -x /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
				brsaneconfig4 -a name=SCANNER model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			elif [[ -x /usr/bin/brsaneconfig5 ]]; then
				# ??????????????
				brsaneconfig5 -a name=SCANNER model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			fi
		fi
		# On copie les bibliotheques
		if [[ "$Arch" == "x86_64" ]] && [[ -d $Lib_Dir ]]; then
			if [[ -e /usr/bin/brsaneconfig ]]; then cd "$Lib_Dir" || exit;
				log "Copie des bibliotheques nécessaires brsaneconfig"
				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 "$Lib_Dir"
				ln -sf libbrscandec.so.1.0.0 libbrscandec.so.1
				ln -sf libbrscandec.so.1 libbrscandec.so
				cd "$Lib_Dir"/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
				log_action_end_msg 0
			elif [[ -e /usr/bin/brsaneconfig2 ]]; then cd "$Lib_Dir" || exit
				log "Copie des bibliotheques nécessaires brsaneconfig2"
				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 "$Lib_Dir"/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
				log_action_end_msg 0
			elif [[ -e /usr/bin/brsaneconfig3 ]]; then cd "$Lib_Dir" || exit
				log "Copie des bibliotheques nécessaires brsaneconfig3"
				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 "$Lib_Dir"/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
				log_action_end_msg 0
			elif [[ -e /usr/bin/brsaneconfig4 ]]; then cd "$Lib_Dir"/sane || exit
				log "Copie des bibliotheques nécessaires brsaneconfig4"
				ln -sf libsane-brother4.so.1.0.7 libsane-brother4.so.1
				ln -sf libsane-brother4.so.1 libsane-brother4.so
				log_action_end_msg 0
			elif [[ -e /usr/bin/brsaneconfig5 ]]; then cd "$Lib_Dir"/sane || exit
				log "Copie des bibliotheques nécessaires brsaneconfig5"
				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
				log_action_end_msg 0
			else
				log_action_end_msg 1
				log "No config binary found." "Red"
			fi
		fi
	fi
	echo "" &>> "$Logfile"
}

#################
# FIN DU SCRIPT #
#################
do_clean() {
	cd || exit
	# On réattribue les droits des dossiers/fichiers crées à l'utilisateur
	chown -R "$User": "$Temp_Dir" "$Logfile"
	log "Configuration de votre imprimante Brother $Model_Name terminée. Bye :D" "Blue"
  	log "Vous pouvez supprimer le dossier $Temp_Dir avec la commande suivante :  rm -r $Temp_Dir" "Blue"
	exit 0
}

do_init_script
do_check_prerequisites
do_download_drivers
do_install_drivers
do_configure_printer
do_configure_scanner
do_clean

shellcheck:

$ shellcheck myscript
 
Line 10:
if test -f /lib/lsb/init-functions; then . /lib/lsb/init-functions;fi
                                           ^-- SC1091 (info): Not following: /lib/lsb/init-functions was not specified as input (see shellcheck -x).

$ 

et pourtant :

iznobe@iznobe-pc:~$ sudo bash Scripts/demonipuch.sh MFCL-2710DW 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.024 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.069 ms

--- 192.168.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1047ms
rtt min/avg/max/mdev = 0.024/0.046/0.069/0.022 ms
   ...done.
Scripts/demonipuch.sh: ligne 364: erreur de syntaxe près du symbole inattendu « ( »
Scripts/demonipuch.sh: ligne 364: `		PPDs=( /usr/share/cups/model/*brother*@($Model_Name|$Printer_Name)*.ppd )'

iznobe@iznobe-pc:~$ 

j ' ai certainement fait un truc qu ' il ne fallait pas , mais je ne vois pas quoi , depuis hier au soir , je n' ai pas fait de modif ( ou tres peu ) ...

Dernière modification par iznobe (Hier à 23:17)


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#139 Hier à 23:27

iznobe

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

En fait le soucis , c' est la 2eme parenthese ouverte de la ligne .

si je met à la place :

PPDs=(/usr/share/cups/model/**/*brother*@$Model_Name*.ppd)

plus de soucis roll


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#140 Hier à 23:29

Watael

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

je ne vois pas pourquoi.
sors le shopt de la fonction pour le placer sous le shebang.
bizarre.


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

Hors ligne

#141 Hier à 23:30

Watael

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

iznobe a écrit :

En fait le soucis , c' est la 2eme parenthese ouverte de la ligne .

si je met à la place :

PPDs=(/usr/share/cups/model/**/*brother*@$Model_Name*.ppd)

plus de soucis roll

ça n'a plus du tout la même signification.
les parenthèses après le @ font partie de la syntaxe des extglobs

n'oublie pas, si tu utilises les doubles astériques, il faut positionner globstar

Dernière modification par Watael (Hier à 23:33)


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

Hors ligne

#142 Hier à 23:39

Watael

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

erreur de syntaxe près du symbole inattendu « ( »

on obtient cette erreur quand extglob n'est pas positionné.


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

Hors ligne

#143 Hier à 23:41

iznobe

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

pour que ce soit clair , en premiere ligne de script je met :

shopt -s nullglob ?????????????

retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#144 Aujourd'hui à 00:13

Watael

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

#!/bin/bash

shopt -s nullglob globstar extglob
#...

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

Hors ligne

#145 Aujourd'hui à 00:29

iznobe

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

le nouveau code :

#!/bin/bash
# Script d'installation pour imprimantes Brother
# ecrit par @demonipuch .
# re-ecrit par ubuntu team : https://forum.ubuntu-fr.org/viewtopic.php?id=2091835&p=2

# todo :
# verification de l' installation des dependances / paquets sur version ubuntu 24.04 et superieures
# multiarch-support , libsane etc ...

if test -f /lib/lsb/init-functions; then . /lib/lsb/init-functions;fi
shopt -s nullglob globstar extglob

valid_ip() {
    IFS='.' read -ra ip <<< "$1"
    [[ ${ip[0]} -gt 0 ]] && [[ ${ip[0]} -le 255 ]] && [[ ${ip[1]} -ge 0 ]] && [[ ${ip[1]} -le 255 ]] && [[ ${ip[2]} -ge 0 ]] && [[ ${ip[2]} -le 255 ]] && [[ ${ip[3]} -ge 0 ]] && [[ ${ip[3]} -le 255 ]]
}

control_ip() {
	if [[ -n "$IP" ]]; then
		if valid_ip "$IP"; then
			if ping -q -c2 "$IP"; then log_action_end_msg 0
			else
				log "Votre IP ne permet pas de joindre l ' hote. Eclairer votre imprimante si celle-ci est eteinte , ou bien , corriger votre adresse IP."
				unset IP
				log_action_end_msg 1
			fi
		else
			log "L ' adresse IP que vous avez entrée est incorrecte"
			unset IP
			log_action_end_msg 1
		fi
	fi
}

install_pkg() {
	for pkg do
		log "Recherche du paquet : ' $pkg ' sur votre système"
		if dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null; then
			echo " - Paquet ' $pkg ' deja installé" &>> "$Logfile"
			log_action_end_msg 0
		else
			echo " - Paquet ' $pkg ' non installé" &>> "$Logfile"
			log_action_end_msg 1
			log "Installation du paquet : ' $pkg ' sur votre système"
			apt-get install -qq "$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
}

verif_rep() {
	for dir do
	log "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log "Creation du dossier ' $dir '"
			mkdir -pv "$dir" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
}

verif_lien() { # utilisation : # verif_lien "lien" "cible" . affichage de ls -l ' lien : /etc/init.d/lpd ~> /etc/init.d/cups : cible '
	# Musique -> /datas/iznobe/Musique
	# lien -> cible
	lien=$1
	cible=$2

	log "Recherche du lien ' $lien ' sur votre système"
	if ! test -L "$lien"; then
		log_action_end_msg 1
		log "Creation du lien ' $lien '"
		ln -s "$cible" "$lien" &>> "$Logfile"
		log_action_end_msg $?
	else log_action_end_msg $?;
	fi
}

log() {
	message="$1"
	if test -z "$2"; then
		log_action_begin_msg "$message"
		echo -e " - $message" &>> "$Logfile"
	else
		if test "$2" == "Blue"; then color="\\033[1;34m";fi
		if test "$2" == "Red"; then color="\\033[1;31m";fi
			echo -e "$color $message \\033[0;0m" # Resetcolor
			echo -e "
			# $message" &>> "$Logfile"
	fi
}

Model_Name="$1"
if [ -n "$2" ]; then
	IP="$2"
 	if control_ip "$IP"; then Connection="Réseau"; fi
fi

User="$SUDO_USER"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter_install.log"
#Logfile="/home/$User/brprinter_install.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
# 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"

declare -A printer

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; fi
	# On vérifie qu'on lance le script en root
	if ((EUID)); then log "Vous devez lancer ce script en tant que root : sudo bash $0" "Red"; exit 1;fi
	if [[ $Arch != "i386" ]] && [[ $Arch != "i686" ]] && [[ $Arch != "x86_64" ]]; then #  && [[ $Arch != "armv7l" ]]
		log "Achitecture $Arch non prise en charge ! script interrompu." "Red"
		exit 2
	fi
	# on verifie la connection au serveur
	if ! nc -z -w5 'brother.com' 80; then
		log "serveur brother injoignable ! script interrompu." "Red"
		log "Veuillez verifier votre connexion internet." "Red"
		exit 3
	fi

	# Si le premier argument est vide on demande le modèle de l'imprimante
	while [[ -z "$Model_Name" ]]; do read -rp "Entrez votre modèle d' imprimante : " Model_Name;done
	Model_Name=${Model_Name^^}
	# Si le 2eme argument est vide on demande comment est connectée l'imprimante
	while [[ -z "$Connection" ]]; do
		read -rp "Sélectionner le type de connectivité : [0] USB - [1] Réseau , votre choix : "
		case $REPLY in
			0)
				Connection="USB"
			;;
			1)
				Connection="Réseau"
				log "Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe." "Red"
				log "Veuillez consulter le manuel de votre imprimante pour plus de détails : http://support.brother.com/g/b/productsearch.aspx?c=fr&lang=fr&content=ml" "Red"
			;;
		esac
	done
	# Si connection == reseau on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then
		while [[ -z "$IP" ]]; do
			read -rp "Entrez l'adresse IP de votre imprimante : " IP
			control_ip "$IP"
	    done
	fi
	# On transforme le nom de l'imprimante ( enleve le " - " )
	Printer_Name="${Model_Name//-/}"
	# On construit l'URL du fichier contenant les informations
	Printer_Url_Info="$Url_Info/$Printer_Name"
	Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=""$Printer_Name""_us_eu_as"
	# resumé pour logfile
	log "                     $date
			# Ubuntu Codename : $Codename
			# Architecture : $Arch
			# Modèle de l'imprimante : $Model_Name
			# Type de connexion : $Connection
			# Adresse IP : $IP
			# Repertoire courant : $Temp_Dir
			# Repertoire de telechargement des pilotes : $Temp_Dir
			# Fichier d'informations : $Printer_Url_Info
			# page de telechargement des pilotes : $Printer_dl_url" "Blue"
	log "initialisation du script." "Blue"
	# on cree le repertoire temporaire de travail.
	verif_rep "$Temp_Dir"
	# On vérifie l'URL
	Printer_Info="$Temp_Dir/Printer_Info.html"
	log "Obtention des infos de l' imprimante"
	wget -q "$Printer_Url_Info" -O "$Printer_Info"
	#while IFS='=' read -r k v; do printer[$k]=$v; done < <(wget -qO - "$Printer_Url_Info" | sed '/\(]\|rpm\|=\)$/d')

    log_action_end_msg $?
	# On vérifie que le fichier fournit les informations
	log "Vérification du fichier obtenu"
	#if test "${printer[PRINTERNAME]}" == "$Printer_Name"; then log_action_end_msg 0
	if test "$(grep PRINTERNAME "$Printer_Info" | cut -d= -f2)" == "$Printer_Name"; then log_action_end_msg 0
    	else
    		log_action_end_msg 1
    		log "Aucun pilote trouvé. Veuillez vérifier le modèle de votre imprimante ou
			visitez la page suivante : $Printer_dl_url
			afin de télécharger les pilotes et les installer manuellement." "Red"
			exit 2
    fi
	# ???????? pas compris a quoi sert ce controle , ni quelles infos il est censé recuperé . peut etre certaines URL comporte des liens vers d' autres pages
	#if test -n "${printer[LNK]}"; then Printer_Url_Info="$Url_Info/${printer[LNK]}";log "LNK = ${printer[LNK]}" "Red";fi
	Lnk="$(grep LNK "$Printer_Info" | cut -d= -f2)"
	if test -n "$Lnk"; then Printer_Url_Info="$Url_Info/$Lnk";log "LNK = $Lnk" "Red";fi
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	log "Vérification des pré-requis" "Blue"
	log "Mise à jour de la liste des paquets"
	apt-get update -qq
	log_action_end_msg $?
	# On vérifie que la liste des paquets est installée et on l'installe le cas échéant
	log "installation des paquets requis"
	if ! install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget" "gawk"; then
		log "impossible d' installer les paquets indispensables" "Red"
		exit 4
	fi

	# Si un pilote pour le scanner a été trouvé on vérifie que la liste des paquets est installée
	if [[ -n $Scanner_Deb ]]; then install_pkg "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"; fi

	# On vérifie que le paquet csh est installé et on l'installe le cas échéant (uniquement pour certaines imprimantes)
	for i in DCP-110C DCP-115C DCP-117C DCP-120C DCP-310CN DCP-315CN DCP-340CW FAX-1815C FAX-1820C FAX-1835C FAX-1840C FAX-1920CN FAX-1940CN FAX-2440C MFC-210C MFC-215C MFC-3220C MFC-3240C MFC-3320CN MFC-3340CN MFC-3420C MFC-3820CN MFC-410CN MFC-420CN MFC-425CN MFC-5440CN MFC-5840CN MFC-620CN MFC-640CW MFC-820CW; do
		if [[ "$Model_Name" == "$i" ]]; then install_pkg "csh";	fi
	done
	# On vérifie que le dossier de téléchargement temporaire et /usr/share/cups/model et /var/spool/lpd existent et on les crée le cas échéant
	verif_rep "/usr/share/cups/model" "/var/spool/lpd"

	# On vérifie que le lien symbolique /etc/init.d/lpd existe et on le crée le cas échéant (uniquement pour certaines imprimantes)
	for i in DCP-1000 DCP-1400 DCP-8020 DCP-8025D DCP-8040 DCP-8045D DCP-8060 DCP-8065DN FAX-2850 FAX-2900 FAX-3800 FAX-4100 FAX-4750e FAX-5750e HL-1030 HL-1230 HL-1240 HL-1250 HL-1270N HL-1430 HL-1440 HL-1450 HL-1470N HL-1650 HL-1670N HL-1850 HL-1870N HL-5030 HL-5040 HL-5050 HL-5070N HL-5130 HL-5140 HL-5150D HL-5170DN HL-5240 HL-5250DN HL-5270DN HL-5280DW HL-6050 HL-6050D MFC-4800 MFC-6800 MFC-8420 MFC-8440 MFC-8460N MFC-8500 MFC-8660DN MFC-8820D MFC-8840D MFC-8860DN MFC-8870DW MFC-9030 MFC-9070 MFC-9160 MFC-9180 MFC-9420CN MFC-9660 MFC-9700 MFC-9760 MFC-9800 MFC-9860 MFC-9880; do
		if [[ "$Model_Name" == "$i" ]]; then verif_lien "/etc/init.d/lpd" "/etc/init.d/cups"; # verif_lien "lien" "cible" 'lien : /etc/init.d/lpd ~> /etc/init.d/cups : cible'
			# On crée un lien symbolique vers cups.service si systemd est utilisé : ln -s /lib/systemd/system/cups.service /lib/systemd/system/lpd.service
			if [[ -L /sbin/init ]]; then
				verif_lien "/lib/systemd/system/cups.service" "/lib/systemd/system/lpd.service" # ' lien : /lib/systemd/system/cups.service ~> /lib/systemd/system/lpd.service: cible'
				systemd daemon-reload
			fi
		fi
	done
	echo "" &>> "$Logfile"
}

##############################
# TÉLÉCHARGEMENT DES PILOTES #
##############################
do_download_drivers() {
    log "Recherche des pilotes" "Blue"
    log "Recherche des pilotes pour l' imprimante"
    printer=(
        [prn_lpd]="$(grep PRN_LPD_DEB "$Printer_Info"  | cut -d= -f2)"
        [prn_cups]="$(grep PRN_CUP_DEB "$Printer_Info" | cut -d= -f2)"
        [prn_drv]="$(grep PRN_DRV_DEB "$Printer_Info"  | cut -d= -f2)"
    )
    log_action_end_msg $?

    Scanner_Deb=$(grep SCANNER_DRV "$Printer_Info" | cut -d= -f2)
    if test -n "$Scanner_Deb"; then
    	printer+=(
    		[udev_rules]="$Udev_Deb_Name"
    	)
        log "Recherche des pilotes pour le scanner"

        Scankey_Deb=$(grep SCANKEY_DRV "$Printer_Info" | cut -d= -f2)

        Scanner_Url_Info="$Url_Info/$Scanner_Deb.lnk"
        Scankey_Url_Info="$Url_Info/$Scankey_Deb.lnk"
        echo " - Scanner infos :
        	$Scanner_Url_Info
        	$Scankey_Url_Info" &>> "$Logfile"

        Scanner_Info="$Temp_Dir/Scanner_Url_Info.html"
        wget -q "$Scanner_Url_Info" -O "$Scanner_Info"
        Scankey_Info="$Temp_Dir/Scankey_Url_Info.html"
		wget -q "$Scankey_Url_Info" -O "$Scankey_Info"

        # On récupère les pilotes du scanner en fonctionnement de l'architecture du système (32-bits ou 64-bits)
        case "$Arch" in
            i386|i686)
                printer+=(
                    [scanner_drv]="$(grep DEB32 "$Scanner_Info" | cut -d= -f2)"
                    [scanKey_drv]="$(grep DEB32 "$Scankey_Info" | cut -d= -f2)"
                )
                log_action_end_msg 0
                ;;
            x86_64)
                printer+=(
                    [scanner_drv]="$(grep DEB64 "$Scanner_Info" | cut -d= -f2)"
                    [scanKey_drv]="$(grep DEB64 "$Scankey_Info" | cut -d= -f2)"
                )
                # pour ubuntu 24.04 et superieurs
                if [[ $(grep DISTRIB_RELEASE= /etc/lsb*release | cut -d= -f2 | cut -c1-2) -ge 24 ]]; then
                	if test "${printer[scanKey_drv]}" = "brscan-skey-0.3.2-0.amd64.deb"; then printer[scanKey_drv]="$Scankey_Drv_Deb_Name";fi
                fi
                log_action_end_msg 0
                ;;
                *)
					log "Architecture inconnue: $Arch" "Red"
				;;
        esac
    else
        log "Pas de scanner détecté" "Red"
        log_action_end_msg 1
    fi

    log "Téléchargement des pilotes" "Blue"
    for pkg in "${printer[@]}"; do
        # On ajoute la liste des pilotes trouvés au fichier de journalisation
        if test -n "$pkg"; then
            echo " - Paquet trouvé : $pkg" &>> "$Logfile"
            # On télécharge les pilotes trouvés si ils ne le sont pas deja
            if [[ ! -f "$Temp_Dir"/"$pkg" ]]; then
                Url_Deb="$Url_Pkg"/"$pkg"
                # le paquet 'udev-rules' est situé a un autre emplacement
                if test "$pkg" == "${printer[udev_rules]}"; then Url_Deb="$Udev_Deb_Url"/"$pkg"; fi
                log "Téléchargement du paquet : $pkg"
                wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
                if [[ ! -f "$Temp_Dir"/"$pkg" ]]; then
                  Url_Deb2="$Url_Pkg2"/"$pkg"
                  wget -cP "$Temp_Dir" "$Url_Deb2" &>> "$Logfile"
                fi
                log_action_end_msg $?
            else
                log "Le paquet : $pkg a deja été telechargé"
                log_action_end_msg 0
            fi
        fi
    done
}

############################
# INSTALLATION DES PILOTES #
############################
do_install_drivers() {
	log "Installation des pilotes" "Blue"
	for pkg in "${printer[@]}"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			log "Installation du paquet : $pkg"
			dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
	echo "" &>> "$Logfile"
}

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	log "Configuration de l'imprimante" "Blue"
	log "Recherche d'un fichier PPD sur votre système"
	for pkg in "${printer[prn_cups]}" "${printer[prn_drv]}"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			Ppd_File=$(dpkg --contents "$Temp_Dir/$pkg" | gawk '/ppd/{sub(".","",$NF); print $NF}')
		fi
	done
	if test -z "$Ppd_File"; then
		for file in /usr/share/cups/model/**/brother*@($Model_Name|$Printer_Name)*.ppd; do Ppd_File="$file";done
	fi
	if test -n "$Ppd_File"; then
		log_action_end_msg 0
		echo " - Fichier PPD : ' $Ppd_File ' trouvé" &>> "$Logfile"
	else
		echo " - Fichier PPD : $Ppd_File non trouvé !" &>> "$Logfile"
		log_action_end_msg 1
	fi
	# On ajoute la nouvelle imprimante
	log "Ajout de l'imprimante $Model_Name"
	{
		echo " - Backup du fichier /etc/cups/printers.conf.O"
		cp /etc/cups/printers.conf.O "$Temp_Dir"
		echo " - Arret du service CUPS"
		echo " - Restauration du fichier printers.conf"
		systemctl stop cups
		cp "$Temp_Dir"/printers.conf.O /etc/cups/printers.conf
		echo " - Redémarrage du service CUPS"
		systemctl restart cups
		sleep 1
	} &>> "$Logfile"
	case "$Connection" in
	"USB")
		lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File" &>> "$Logfile"
	;;
	"Réseau")
		lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File" &>> "$Logfile"
	;;
	esac
	log_action_end_msg $?
	{
		cp "$Temp_Dir"/printers.conf.O /etc/cups/printers.conf.O
		echo " - Restauration du fichier printers.conf.O"
		echo ""
	} &>> "$Logfile"
}

############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
	log "Configuration du scanner" "Blue"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log "Configuration du scanner USB"
			# On ajoute une entrée au fichier /lib/udev/rules.d/60-libsane1.rules
			if grep -q "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"; then
				log_action_end_msg $?
				echo " - Règle udev deja presente dans le fichier $Udev_Rules" &>> "$Logfile"

			else
				# ?????????? n ' ajoute pas la regle correctement .
				sed -i "/LABEL=\"libsane_usb_rules_begin\"/a\
				\n# Brother\nATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
				log_action_end_msg $?
				echo " - Règle udev ajoutée dans le fichier $Udev_Rules" &>> "$Logfile"
				# On recharge les règles udev
				# udevadm control --reload
				udevadm control --reload-rules
			fi
		elif [[ $Connection == "Réseau" ]]; then
			log "Configuration du scanner réseau"
			if [[ -x /usr/bin/brsaneconfig ]]; then
				brsaneconfig -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			elif [[ -x /usr/bin/brsaneconfig2 ]]; then
				brsaneconfig2 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			elif [[ -x /usr/bin/brsaneconfig3 ]]; then
				brsaneconfig3 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			elif [[ -x /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
				brsaneconfig4 -a name=SCANNER model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			elif [[ -x /usr/bin/brsaneconfig5 ]]; then
				# ??????????????
				brsaneconfig5 -a name=SCANNER model="$Model_Name" ip="$IP" &>> "$Logfile"
				log_action_end_msg $?
			fi
		fi
		# On copie les bibliotheques
		if [[ "$Arch" == "x86_64" ]] && [[ -d $Lib_Dir ]]; then
			if [[ -e /usr/bin/brsaneconfig ]]; then cd "$Lib_Dir" || exit;
				log "Copie des bibliotheques nécessaires brsaneconfig"
				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 "$Lib_Dir"
				ln -sf libbrscandec.so.1.0.0 libbrscandec.so.1
				ln -sf libbrscandec.so.1 libbrscandec.so
				cd "$Lib_Dir"/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
				log_action_end_msg 0
			elif [[ -e /usr/bin/brsaneconfig2 ]]; then cd "$Lib_Dir" || exit
				log "Copie des bibliotheques nécessaires brsaneconfig2"
				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 "$Lib_Dir"/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
				log_action_end_msg 0
			elif [[ -e /usr/bin/brsaneconfig3 ]]; then cd "$Lib_Dir" || exit
				log "Copie des bibliotheques nécessaires brsaneconfig3"
				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 "$Lib_Dir"/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
				log_action_end_msg 0
			elif [[ -e /usr/bin/brsaneconfig4 ]]; then cd "$Lib_Dir"/sane || exit
				log "Copie des bibliotheques nécessaires brsaneconfig4"
				ln -sf libsane-brother4.so.1.0.7 libsane-brother4.so.1
				ln -sf libsane-brother4.so.1 libsane-brother4.so
				log_action_end_msg 0
			elif [[ -e /usr/bin/brsaneconfig5 ]]; then cd "$Lib_Dir"/sane || exit
				log "Copie des bibliotheques nécessaires brsaneconfig5"
				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
				log_action_end_msg 0
			else
				log_action_end_msg 1
				log "No config binary found." "Red"
			fi
		fi
	fi
	echo "" &>> "$Logfile"
}

#################
# FIN DU SCRIPT #
#################
do_clean() {
	cd || exit
	# On réattribue les droits des dossiers/fichiers crées à l'utilisateur
	chown -R "$User": "$Temp_Dir" "$Logfile"
	log "Configuration de votre imprimante Brother $Model_Name terminée. Bye :D" "Blue"
  	log "Vous pouvez supprimer le dossier $Temp_Dir avec la commande suivante :  rm -r $Temp_Dir" "Blue"
	exit 0
}

do_init_script
do_check_prerequisites
do_download_drivers
do_install_drivers
do_configure_printer
do_configure_scanner
do_clean

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#146 Aujourd'hui à 00:42

Watael

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

		for file in /usr/share/cups/model/**/brother*@($Model_Name|$Printer_Name)*.ppd; do Ppd_File="$file";done

comme ça, ça passe ?
et avec l'assignation directe du tableau, t'as réessayé ?


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

Hors ligne

#147 Aujourd'hui à 06:30

Watael

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

et t'as de l'aspirine aussi ?

#!/bin/bash
# > 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 ((err)) && ! ping -c2 "$IP"
    then
        err=0
        unset IP
    fi
done

#################
 # infos Brother
#################
Url_Info="http://www.brother.com/pub/bsc/linux/infs"
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"

printerInf="$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- "$printerInf" | 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"

            . /etc/lsb-release #TODO: test file exists
            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
    errQuit "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
##############################
for drv in "${printer[@]}"
do
    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
#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
do
    pkg=${printer[$drv]}
    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
if test -z "$Ppd_File"
then
    PPDs=( /usr/share/cups/model/**/*brother*@($printerName|$modelName)*.ppd )
fi
case ${#PPDs[*]} in
    0) errQuit "no ppd"
        ;;
    1) : echo one ppd
        ;;
    *) errQuit "more than one ppd" # et s'il y en a plusieurs, y en a-t-il un à privilégier ?
        ;;
esac


#sauvegarde fichier conf.0 (n'existe pas chez moi)
cp /etc/cups/printers.conf.O "$tmpDir"
systemctl stop cups

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
cp "$tmpDir/printers.conf.O" /etc/cups/printers.conf
systemctl restart cups
sleep 1

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

je serais très surpris que ça fonctionne sans correction, mais je ne peux pas le tester en entier.

Dernière modification par Watael (Aujourd'hui à 15:56)


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

Hors ligne

#148 Aujourd'hui à 13:04

iznobe

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

Watael a écrit :
		for file in /usr/share/cups/model/**/brother*@($Model_Name|$Printer_Name)*.ppd; do Ppd_File="$file";done

comme ça, ça passe ?
et avec l'assignation directe du tableau, t'as réessayé ?

Salut , les 2 passes , depuis que , j ' ai modifié :

Watael a écrit :
shopt -s nullglob extglob

en

shopt -s nullglob globstar extglob

mais je vois pas l ' interet de creer un tableau , surtout qu ' on ne peut a priori utiliser qu ' un seul fichier ppd ( enfin je pense , pas verifié ).

Pour l' aspirine , ma femme ma deja fait epuisé le stock tongue
je vais tout de meme jeter un coup d' oeil , sachant que je dois rester " à mon niveau " , si je veux pouvoir maintenir le script au fil du temps .


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#149 Aujourd'hui à 13:11

iznobe

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

    if ((err)) && ! ping -c2 "$IP"
    then
        err=0
        unset IP
    fi

il ne faudrait pas plutot un " || " dans la condition ? si erreur ou pas de ping ...

--------------------------------------------

shift

kezako ??

--------------------------------------------

do
    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

un " break " casse la boucle . un continue , saute et passe au suivant sans interrompre la boucle non ?
d' ailleurs dans un cas comme dans l' autre , break / continue , je ne suis pas certain que ce soit utile , ne rien faire du tout , et passez au suivant , ne me parait pas plus mal big_smile
ou encore , vu que le fichier est présent sur le disque , carrément l' installer directement . et supprimer le tableau pkg2install .

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

En ligne

#150 Aujourd'hui à 15:55

Watael

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

shift décale les paramètres positionnels.
mais, là, c'est une erreur, parce que shift décale "par la gauche", il faut en fait décaler tous les arguments pour que $2 ne soit plus disponible.
je corrige shift $# pour décaler tous les paramètres positionnels.

il ne faudrait pas plutot un " || " dans la condition ? si erreur ou pas de ping ...

pour le diagnostic, il faudrait même "désolidariser" les deux tests : ip non valide, ou (en effet) noPing).

ne rien faire du tout , et passez au suivant , ne me parait pas plus mal

si la première URL fonctionne, il n'y a pas besoin de (il ne faut pas)  faire un second tour.


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

Hors ligne