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.

#76 Le 05/08/2025, à 17:33

Watael

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

je ne comprends pas pourquoi tu te fais des nœuds comme ça...

ça sert à quoi, ça

read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"

KISS : tab=( "$1" "$2" "$3" "$... )
mais de toute façon, je ne vois pas pourquoi tu fais ça puisque les seuls arguments de la fonction sont le lien et la cible

alors verif_lien <lien> <cible>
et donc relis mon message précédent.


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

Hors ligne

#77 Le 05/08/2025, à 20:43

iznobe

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

Bon , adopté .
galere , cette histoire de lien , toujours peur de faire une k____erie roll

j ' en ai profité pour condenser un peu et rectifié des bricoles afin d' optimiser l ' execution :

#!/bin/bash
# Script d'installation pour imprimantes Brother

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

. /lib/lsb/init-functions

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 echo "# Adresse IP : $IP" &>> "$Logfile"; log_action_end_msg 0
			else
				log_action_begin_msg "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_action_begin_msg "L ' adresse IP que vous avez entrée est incorrecte"
			unset IP
			log_action_end_msg 1
		fi
	fi
}

install_pkg() {
	read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
	#echo ${tab[@]}

	for pkg in "${tab[@]}"; do
		log_action_begin_msg "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_action_begin_msg "Installation du paquet : ' $pkg ' sur votre système"
			apt-get install -qq "$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
}

verif_rep() {
	read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"

	for dir in "${tab[@]}"; do
	log_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log_action_begin_msg "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

	# ln -s /datas/$USER/{Bureau,Documents,Images,Scripts,Ressources,Photos,Musique,Téléchargements,Vidéos_famille}  /home/$USER/
	# ln -s cible    lien
	lien=$1
	cible=$2

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

Model_Name="$1"
if [ -n "$2" ]; then
	if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Dir="$(pwd)"/"$(dirname "$0")"
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"
Url_Inf="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
# https://download.brother.com/pub/com/linux/linux/packages/
Url_Pkg="http://www.brother.com/pub/bsc/linux/packages"

Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/$Udev_Deb"

Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	# On vérifie qu'on lance le script en root
	if ((EUID)); then
		echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"
		exit 0
	fi
	# Si un log existe déjà on le renomme
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; 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"
				echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
				echo -e "$Red 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 $Resetcolor"
			;;
		esac
	done

	# Si le 3eme argument est vide on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then control_ip "$IP";
		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_Info="$Url_Inf/$Printer_Name"
	# On vérifie l'URL
	if ! wget -q --spider "$Printer_Info"; then
		log_action_end_msg 1
		echo " - Aucun pilote trouvé" &>> "$Logfile"
		echo -e "$Red Aucun pilote trouvé. Veuillez vérifier le modèle de votre imprimante ou visitez la page suivante http://support.brother.com/g/b/productsearch.aspx?c=us&lang=en&content=dl afin de télécharger les pilotes et les installer manuellement. $Resetcolor"
		exit 1
	fi
	# On vérifie que le fichier fournit les informations
	# ???????? pas compris a quoi sert ce controle , ni quelles info il est censé recuperé
	Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
	if [[ "$Lnk" ]]; then Printer_Info="$Url_Inf/$Lnk"; fi

	echo "                              $date
			# Ubuntu Codename : $Codename
			# Architecture : $Arch
			# Modèle de l'imprimante : $Model_Name
			# Type de connexion : $Connection
			# Repertoire courant : $Dir
			# Repertoire de telechargement des pilotes : $Temp_Dir
			# Fichier d'informations : $Printer_Info
			" &>> "$Logfile"
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	echo -e "$Blue Vérification des pré-requis $Resetcolor"
	echo "# Vérification des pré-requis" &>> "$Logfile"
	log_action_begin_msg "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
	install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget"

	# 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 /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() {
	echo -e "$Blue Téléchargement des pilotes de l'imprimante $Resetcolor"
	echo "# Téléchargement des pilotes de l'imprimante" &>> "$Logfile"
	# On crée le dossier de téléchargement des paquets si il n' existe pas deja
	if [[ ! -d "$Temp_Dir" ]]; then
		mkdir "$Temp_Dir"
	fi
	log_action_begin_msg "Recherche des pilotes"
	# On récupère le nom des paquets disponibles
	Printer_Lpd_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_LPD_DEB - | cut -d= -f2)
	Printer_Cups_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_CUP_DEB - | cut -d= -f2)
	Printer_Drv_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_DRV_DEB - | cut -d= -f2)
	Scanner_Deb=$(wget -q "$Printer_Info" -O - | grep SCANNER_DRV - | cut -d= -f2)
	Scankey_Deb=$(wget -q "$Printer_Info" -O - | grep SCANKEY_DRV - | cut -d= -f2)

	Scanner_Info="$Url_Inf/$Scanner_Deb.lnk"
	Scankey_Info="$Url_Inf/$Scankey_Deb.lnk"

	# On récupère les pilotes du scanner en fonctionnement de l'architecture du système (32-bits ou 64-bits)
	case "$Arch" in
		i*86)
			Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB32 | cut -d= -f2)
			Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB32 | cut -d= -f2)
			echo "Architecture : $Arch" &>> "$Logfile"
		;;
		x86_64)
			Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB64 | cut -d= -f2)
			Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB64 | cut -d= -f2)
			echo "Architecture : $Arch" &>> "$Logfile"
		;;
		*)
			echo "Architecture inconnue: $Arch" &>> "$Logfile"
		;;
	esac

	for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb" "$Udev_Deb"; do
		# On ajoute la liste des pilotes trouvés au fichier de journalisation
		if [[ -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 [[ -n "$Scanner_Drv_Deb" ]]; then # on ne le telecharge qu ' en cas d ' install du scanner
					if [[ "$pkg" == "$Udev_Deb" ]]; then Url_Deb="$Udev_Deb_Url"; fi
				fi
				echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
				log_action_begin_msg "Téléchargement du paquet : $pkg"
				wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
				log_action_end_msg $?
			else
				log_action_begin_msg "Le paquet : $pkg a deja été telechargé"
				log_action_end_msg 0
			fi
		fi
	done
	echo " " &>> "$Logfile"
}

############################
# INSTALLATION DES PILOTES #
############################
do_install_drivers() {
	echo -e "$Blue Installation des pilotes $Resetcolor"
	echo "# Installation des pilotes" &>> "$Logfile"
	for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb" "$Udev_Deb"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			log_action_begin_msg "Installation du paquet : $pkg"
			echo " - Installation par 'dpkg' du paquet : $pkg" &>> "$Logfile"
			dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
	echo " " &>> "$Logfile"
}

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	echo " " &>> "$Logfile"
	echo -e "$Blue Configuration de l'imprimante $Resetcolor"
	echo "# Configuration de l'imprimante" &>> "$Logfile"
	# On recherche un fichier ppd
	log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
	echo " - Recherche d'un fichier PPD" &>> "$Logfile"
	for pkg in "$Printer_Cups_Deb" "$Printer_Drv_Deb"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			Ppd_File=$(dpkg --contents "$Temp_Dir/$pkg" | grep ppd | awk '{print $6}' | sed 's/^.//g')
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		for file in $(find /usr/share/cups/model -type f); do
			if [[ $(grep -i Brother "$file" | grep -E "$Model_Name"|"$Printer_Name") ]]; then
				Ppd_File="$file"
			else
				echo " - Fichier PPD : $Ppd_File non trouvé !" &>> "$Logfile"
				log_action_end_msg 1
			fi
		done
	fi
	if [[ -n "$Ppd_File" ]]; then echo " - Fichier PPD : $Ppd_File trouvé " &>> "$Logfile"; log_action_end_msg 0; 	fi

	# On ajoute une nouvelle imprimante
	log_action_begin_msg "Ajout de l'imprimante $Model_Name"
	{
		echo " - Ajout de l'imprimante $Model_Name"
		echo " - Backup du fichier /etc/cups/printers.conf.O"
		cp /etc/cups/printers.conf.O "$Dir"
		echo " - Arret du service CUPS"
		systemctl stop cups
		echo " - Restauration du fichier printers.conf"
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf
		echo " - Redémarrage du service CUPS"
		systemctl restart cups
	} &>> "$Logfile"
	case "$Connection" in
	"USB")
		sleep 1 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
	;;
	"Réseau")
		sleep 1 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
	;;
	esac
	log_action_end_msg $?

	log_action_begin_msg " - Restauration du fichier printers.conf.O"
	{
		echo " - Restauration du fichier printers.conf.O"
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O
		echo ""
	} &>> "$Logfile"
}

############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
	echo -e "$Blue Configuration du scanner $Resetcolor"
	echo "# Configuration du scanner" &>> "$Logfile"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log_action_begin_msg "Configuration du scanner USB"
			echo " - Configuration du scanner USB" &>> "$Logfile"
			# 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
				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"
				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_action_begin_msg "Configuration du scanner réseau"
			echo " - Configuration du scanner réseau" &>> "$Logfile"
			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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
				echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
				echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
				echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
				echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
				echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
				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
				echo -e "$Red No config binary found. $Resetcolor"
			fi
		fi
	fi
	echo " " &>> "$Logfile"
}

#################
# FIN DU SCRIPT #
#################
do_clean() {
	cd || exit
	# On supprime le fichier printers.conf.O
	if [[ -e "$Dir"/printers.conf.O ]]; then
		rm "$Dir"/printers.conf.O &>> "$Logfile"
	fi
	# On réattribue les droits des dossiers/fichiers crées à l'utilisateur
	chown -R "$User": "$Temp_Dir" "$Logfile"
	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 (Le 06/08/2025, à 16:41)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#78 Le 07/08/2025, à 02:07

iznobe

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

j ' ai mis le script sur github .
j ' ai modifié en rapport de la derniere discussion : https://forum.ubuntu-fr.org/viewtopic.php?id=2092052
et donc voici le 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 ...

. /lib/lsb/init-functions

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_action_begin_msg "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_action_begin_msg "L ' adresse IP que vous avez entrée est incorrecte"
			unset IP
			log_action_end_msg 1
		fi
	fi
}

install_pkg() {
	read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
	#echo ${tab[@]}

	for pkg in "${tab[@]}"; do
		log_action_begin_msg "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_action_begin_msg "Installation du paquet : ' $pkg ' sur votre système"
			apt-get install -qq "$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
}

verif_rep() {
	read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"

	for dir in "${tab[@]}"; do
	log_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log_action_begin_msg "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

	# ln -s /datas/$USER/{Bureau,Documents,Images,Scripts,Ressources,Photos,Musique,Téléchargements,Vidéos_famille}  /home/$USER/
	# ln -s cible    lien
	lien=$1
	cible=$2

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

Model_Name="$1"
if [ -n "$2" ]; then
	if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Dir="$(pwd)"/"$(dirname "$0")"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Inf="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
# https://download.brother.com/pub/com/linux/linux/packages/
Url_Pkg="http://www.brother.com/pub/bsc/linux/packages"

Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/$Udev_Deb_Name"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"
Scankey_Drv_Deb_Url="https://download.brother.com/welcome/dlf006652/brscan-skey-0.3.4-0.amd64.deb"

Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	# On vérifie qu'on lance le script en root
	if ((EUID)); then
		echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"
		exit 0
	fi
	# Si un log existe déjà on le renomme
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; 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"
				echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
				echo -e "$Red 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 $Resetcolor"
			;;
		esac
	done

	# Si le 3eme argument est vide on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then control_ip "$IP";
		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_Info="$Url_Inf/$Printer_Name"
	# On vérifie l'URL
	if ! wget -q --spider "$Printer_Info"; then
		log_action_end_msg 1
		echo " - Aucun pilote trouvé" &>> "$Logfile"
		echo -e "$Red Aucun pilote trouvé. Veuillez vérifier le modèle de votre imprimante ou visitez la page suivante http://support.brother.com/g/b/productsearch.aspx?c=us&lang=en&content=dl afin de télécharger les pilotes et les installer manuellement. $Resetcolor"
		exit 1
	fi
	# On vérifie que le fichier fournit les informations
	# ???????? pas compris a quoi sert ce controle , ni quelles info il est censé recuperé
	Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
	if [[ "$Lnk" ]]; then Printer_Info="$Url_Inf/$Lnk"; fi

	echo "                              $date
			# Ubuntu Codename : $Codename
			# Architecture : $Arch
			# Modèle de l'imprimante : $Model_Name
			# Type de connexion : $Connection
			# Adresse IP : $IP
			# Repertoire courant : $Dir
			# Repertoire de telechargement des pilotes : $Temp_Dir
			# Fichier d'informations : $Printer_Info
			" &>> "$Logfile"
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	echo -e "$Blue Vérification des pré-requis $Resetcolor"
	echo "# Vérification des pré-requis" &>> "$Logfile"
	log_action_begin_msg "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
	install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget"

	# 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 /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() {
	# On crée le dossier de téléchargement des paquets si il n' existe pas deja
	verif_rep "$Temp_Dir"

	echo -e "$Blue Recherche des pilotes $Resetcolor"
	echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
	log_action_begin_msg "Recherche des pilotes pour l' imprimante"
	Printer_Lpd_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_LPD_DEB - | cut -d= -f2)
	Printer_Cups_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_CUP_DEB - | cut -d= -f2)
	Printer_Drv_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_DRV_DEB - | cut -d= -f2)
	log_action_end_msg 0

	Scanner_Deb=$(wget -q "$Printer_Info" -O - | grep SCANNER_DRV - | cut -d= -f2)
	if [[ -n "$Scanner_Deb" ]]; then
		echo "# Recherche des pilotes du scanner" &>> "$Logfile"
		log_action_begin_msg "Recherche des pilotes pour le scanner"
		Scankey_Deb=$(wget -q "$Printer_Info" -O - | grep SCANKEY_DRV - | cut -d= -f2)
		Scanner_Info="$Url_Inf/$Scanner_Deb.lnk" &>> "$Logfile"
		Scankey_Info="$Url_Inf/$Scankey_Deb.lnk" &>> "$Logfile"

		# 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)
				Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB32 | cut -d= -f2)
				Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB32 | cut -d= -f2)
				echo " - Architecture : $Arch" &>> "$Logfile"
				log_action_end_msg 0
			;;
			i686)
				Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB32 | cut -d= -f2)
				Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB32 | cut -d= -f2)
				echo " - Architecture : $Arch" &>> "$Logfile"
				log_action_end_msg 0
			;;
			x86_64)
				Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB64 | cut -d= -f2)
				Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB64 | cut -d= -f2)
				echo " - Architecture : $Arch" &>> "$Logfile"
				log_action_end_msg 0
			;;
			*)
				echo "Architecture inconnue: $Arch" &>> "$Logfile"
				log_action_end_msg 1
			;;
		esac
	else
		echo "$Red Pas de scanner détecté $Resetcolor"
		echo " - Pas de scanner détecté" &>> "$Logfile"
		log_action_end_msg 1
	fi

	echo -e "$Blue Téléchargement des pilotes $Resetcolor"
	for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb" "$Udev_Deb_Name"; do
		# On ajoute la liste des pilotes trouvés au fichier de journalisation
		if [[ -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' et 'brscan-skey' sont situés a un autre emplacement
				if [[ -n "$Scanner_Drv_Deb" ]]; then # on ne le telecharge qu ' en cas d ' install du scanner
					if [[ "$pkg" == "$Udev_Deb_Name" ]]; then Url_Deb="$Udev_Deb_Url"; fi
					if [[ "$pkg" == "$Scankey_Drv_Deb" ]] && [[ $Arch == "x86_64" ]]; then Url_Deb="$Scankey_Drv_Deb_Url"; pkg="$Scankey_Drv_Deb_Name"; fi
				fi
				echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
				log_action_begin_msg "Téléchargement du paquet : $pkg"
				wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
				log_action_end_msg $?
			else
				log_action_begin_msg "Le paquet : $pkg a deja été telechargé"
				log_action_end_msg 0
			fi
		fi
	done
	echo " " &>> "$Logfile"
}

############################
# INSTALLATION DES PILOTES #
############################
do_install_drivers() {
	echo -e "$Blue Installation des pilotes $Resetcolor"
	echo "# Installation des pilotes" &>> "$Logfile"
	for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb" "$Udev_Deb_Name" "$Scankey_Drv_Deb_Name"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			log_action_begin_msg "Installation du paquet : $pkg"
			echo " - Installation par 'dpkg' du paquet : $pkg" &>> "$Logfile"
			dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
	#echo " " &>> "$Logfile"
}

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	echo " " &>> "$Logfile"
	echo -e "$Blue Configuration de l'imprimante $Resetcolor"
	echo "# Configuration de l'imprimante" &>> "$Logfile"
	log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
	echo " - Recherche d'un fichier PPD" &>> "$Logfile"
	for pkg in "$Printer_Cups_Deb" "$Printer_Drv_Deb"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			Ppd_File=$(dpkg --contents "$Temp_Dir/$pkg" | grep ppd | awk '{print $6}' | sed 's/^.//g')
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		for file in $(find /usr/share/cups/model -type f); do
			if [[ $(grep -i Brother "$file" | grep -E "$Model_Name"|"$Printer_Name") ]]; then Ppd_File="$file"
			else
				echo " - Fichier PPD : $Ppd_File non trouvé !" &>> "$Logfile"
				log_action_end_msg 1
			fi
		done
	fi
	if [[ -n "$Ppd_File" ]]; then echo " - Fichier PPD : $Ppd_File trouvé " &>> "$Logfile"; log_action_end_msg 0; 	fi

	# On ajoute une nouvelle imprimante
	log_action_begin_msg "Ajout de l'imprimante $Model_Name"
	{
		echo " - Ajout de l'imprimante $Model_Name"
		echo " - Backup du fichier /etc/cups/printers.conf.O"
		cp /etc/cups/printers.conf.O "$Dir"
		echo " - Arret du service CUPS"
		echo " - Restauration du fichier printers.conf"
		systemctl stop cups
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf
		echo " - Redémarrage du service CUPS"
		systemctl restart cups
	} &>> "$Logfile"
	case "$Connection" in
	"USB")
		sleep 1 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
	;;
	"Réseau")
		sleep 1 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
	;;
	esac
	log_action_end_msg $?
	{
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O
		echo " - Restauration du fichier printers.conf.O"
		echo ""
	} &>> "$Logfile"
}

############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
	echo -e "$Blue Configuration du scanner $Resetcolor"
	echo "# Configuration du scanner" &>> "$Logfile"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log_action_begin_msg "Configuration du scanner USB"
			echo " - Configuration du scanner USB" &>> "$Logfile"
			# 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
				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"
				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_action_begin_msg "Configuration du scanner réseau"
			echo " - Configuration du scanner réseau" &>> "$Logfile"
			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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
				echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
				echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
				echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
				echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
				echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
				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
				echo -e "$Red No config binary found. $Resetcolor"
			fi
		fi
	fi
	echo " " &>> "$Logfile"
}

#################
# FIN DU SCRIPT #
#################
do_clean() {
	echo -e "$Blue Configuration de votre imprimante Brother $Model_Name terminée. $Resetcolor"
	echo "# Configuration imprimante terminée" &>> "$Logfile"
	cd || exit
	# On supprime le fichier printers.conf.O
	if [[ -e "$Dir"/printers.conf.O ]]; then
		rm "$Dir"/printers.conf.O &>> "$Logfile"
	fi
	# On réattribue les droits des dossiers/fichiers crées à l'utilisateur
	chown -R "$User": "$Temp_Dir" "$Logfile"
	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 (Le 07/08/2025, à 02:53)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#79 Le 07/08/2025, à 11:13

Watael

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

nomFonc() {
    read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
    for i in "${tab[@]}"; do...

pourquoi ?
alors que

nomFonc() {
    for i in "$@"; do ...

tout simplement !

ps: on peut même se passer du in "$@" :

for i do ...

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

Hors ligne

#80 Le 07/08/2025, à 11:30

iznobe

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

Salut @Watael , quelle fonction ?
celle-ci ( par exemple ) ? :

install_pkg() {
	read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
	#echo ${tab[@]}

	for pkg in "${tab[@]}"; do

ca mériterait un peu plus de details pour que , à mon niveau , je comprenne bien ce que tu essaies de montrer .
il me semble que j' avais essayer celà des le depart :

for i in "s1" "$2" etc ... ; do 

ou quelquechose de très proche .
mais alors voir le message #44

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#81 Le 07/08/2025, à 15:17

iznobe

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

bon , et bien , apres tests , ça fonctionne ( meme avec la syntaxe ultracourte big_smile )

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

. /lib/lsb/init-functions

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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log_action_begin_msg "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

	# ln -s /datas/$USER/{Bureau,Documents,Images,Scripts,Ressources,Photos,Musique,Téléchargements,Vidéos_famille}  /home/$USER/
	# ln -s cible    lien
	lien=$1
	cible=$2

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

Model_Name="$1"
if [ -n "$2" ]; then
	if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Dir="$(pwd)"/"$(dirname "$0")"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Inf="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
# https://download.brother.com/pub/com/linux/linux/packages/
Url_Pkg="http://www.brother.com/pub/bsc/linux/packages"

Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/$Udev_Deb_Name"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"
Scankey_Drv_Deb_Url="https://download.brother.com/welcome/dlf006652/$Scankey_Drv_Deb_Name"

Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	# On vérifie qu'on lance le script en root
	if ((EUID)); then
		echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"
		exit 0
	fi
	# Si un log existe déjà on le renomme
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; 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"
				echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
				echo -e "$Red 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 $Resetcolor"
			;;
		esac
	done

	# Si le 3eme argument est vide on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then control_ip "$IP";
		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_Info="$Url_Inf/$Printer_Name"
	# On vérifie l'URL
	if ! wget -q --spider "$Printer_Info"; then
		log_action_end_msg 1
		echo " - Aucun pilote trouvé" &>> "$Logfile"
		echo -e "$Red Aucun pilote trouvé. Veuillez vérifier le modèle de votre imprimante ou visitez la page suivante http://support.brother.com/g/b/productsearch.aspx?c=us&lang=en&content=dl afin de télécharger les pilotes et les installer manuellement. $Resetcolor"
		exit 1
	fi
	# On vérifie que le fichier fournit les informations
	# ???????? pas compris a quoi sert ce controle , ni quelles info il est censé recuperé
	Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
	if [[ "$Lnk" ]]; then Printer_Info="$Url_Inf/$Lnk"; fi

	echo "                              $date
			# Ubuntu Codename : $Codename
			# Architecture : $Arch
			# Modèle de l'imprimante : $Model_Name
			# Type de connexion : $Connection
			# Adresse IP : $IP
			# Repertoire courant : $Dir
			# Repertoire de telechargement des pilotes : $Temp_Dir
			# Fichier d'informations : $Printer_Info
			" &>> "$Logfile"
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	echo -e "$Blue Vérification des pré-requis $Resetcolor"
	echo "# Vérification des pré-requis" &>> "$Logfile"
	log_action_begin_msg "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
	install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget"

	# 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 /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() {
	# On crée le dossier de téléchargement des paquets si il n' existe pas deja
	verif_rep "$Temp_Dir"

	echo -e "$Blue Recherche des pilotes $Resetcolor"
	echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
	log_action_begin_msg "Recherche des pilotes pour l' imprimante"
	Printer_Lpd_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_LPD_DEB - | cut -d= -f2)
	Printer_Cups_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_CUP_DEB - | cut -d= -f2)
	Printer_Drv_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_DRV_DEB - | cut -d= -f2)
	log_action_end_msg 0

	Scanner_Deb=$(wget -q "$Printer_Info" -O - | grep SCANNER_DRV - | cut -d= -f2)
	if [[ -n "$Scanner_Deb" ]]; then
		echo "# Recherche des pilotes du scanner" &>> "$Logfile"
		log_action_begin_msg "Recherche des pilotes pour le scanner"
		Scankey_Deb=$(wget -q "$Printer_Info" -O - | grep SCANKEY_DRV - | cut -d= -f2)

		Scanner_Info="$Url_Inf/$Scanner_Deb.lnk" &>> "$Logfile"
		Scankey_Info="$Url_Inf/$Scankey_Deb.lnk" &>> "$Logfile"

		# 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)
				Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB32 | cut -d= -f2)
				Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB32 | cut -d= -f2)
				echo " - Architecture : $Arch" &>> "$Logfile"
				log_action_end_msg 0
			;;
			x86_64)
				Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB64 | cut -d= -f2)
				Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB64 | cut -d= -f2)
				# pour ubuntu 24.04 et superieurs
				if [[ "$Scankey_Drv_Deb" == "brscan-skey-0.3.2-0.amd64.deb" ]]; then Scankey_Drv_Deb="brscan-skey-0.3.4-0.amd64.deb";fi
				echo " - Architecture : $Arch" &>> "$Logfile"
				log_action_end_msg 0
			;;
			*)
				echo "Architecture inconnue: $Arch" &>> "$Logfile"
				log_action_end_msg 1
			;;
		esac
	else
		echo "$Red Pas de scanner détecté $Resetcolor"
		echo " - Pas de scanner détecté" &>> "$Logfile"
		log_action_end_msg 1
	fi

	echo -e "$Blue Téléchargement des pilotes $Resetcolor"
	for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb" "$Udev_Deb_Name"; do
		# On ajoute la liste des pilotes trouvés au fichier de journalisation
		if [[ -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' et 'brscan-skey' sont situés a un autre emplacement
				 if [[ -n "$Scanner_Drv_Deb" ]]; then # on ne le telecharge qu ' en cas d ' install du scanner
				 	if [[ "$pkg" == "$Udev_Deb_Name" ]]; then Url_Deb="$Udev_Deb_Url"; fi
				 fi
				echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
				log_action_begin_msg "Téléchargement du paquet : $pkg"
				wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
				log_action_end_msg $?
			else
				log_action_begin_msg "Le paquet : $pkg a deja été telechargé"
				log_action_end_msg 0
			fi
		fi
	done
	echo " " &>> "$Logfile"
}

############################
# INSTALLATION DES PILOTES #
############################
do_install_drivers() {
	echo -e "$Blue Installation des pilotes $Resetcolor"
	echo "# Installation des pilotes" &>> "$Logfile"
	for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Udev_Deb_Name" "$Scankey_Drv_Deb_Name"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			log_action_begin_msg "Installation du paquet : $pkg"
			echo " - Installation par 'dpkg' du paquet : $pkg" &>> "$Logfile"
			dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
	#echo " " &>> "$Logfile"
}

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	echo " " &>> "$Logfile"
	echo -e "$Blue Configuration de l'imprimante $Resetcolor"
	echo "# Configuration de l'imprimante" &>> "$Logfile"
	log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
	echo " - Recherche d'un fichier PPD" &>> "$Logfile"
	for pkg in "$Printer_Cups_Deb" "$Printer_Drv_Deb"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			Ppd_File=$(dpkg --contents "$Temp_Dir/$pkg" | grep ppd | awk '{print $6}' | sed 's/^.//g')
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		for file in $(find /usr/share/cups/model -type f); do
			if [[ $(grep -i Brother "$file" | grep -E "$Model_Name"|"$Printer_Name") ]]; then Ppd_File="$file"
			else
				echo " - Fichier PPD : $Ppd_File non trouvé !" &>> "$Logfile"
				log_action_end_msg 1
			fi
		done
	fi
	if [[ -n "$Ppd_File" ]]; then echo " - Fichier PPD : $Ppd_File trouvé " &>> "$Logfile"; log_action_end_msg 0; 	fi

	# On ajoute une nouvelle imprimante
	log_action_begin_msg "Ajout de l'imprimante $Model_Name"
	{
		echo " - Ajout de l'imprimante $Model_Name"
		echo " - Backup du fichier /etc/cups/printers.conf.O"
		cp /etc/cups/printers.conf.O "$Dir"
		echo " - Arret du service CUPS"
		echo " - Restauration du fichier printers.conf"
		systemctl stop cups
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf
		echo " - Redémarrage du service CUPS"
		systemctl restart cups
	} &>> "$Logfile"
	case "$Connection" in
	"USB")
		sleep 1 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
	;;
	"Réseau")
		sleep 1 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
	;;
	esac
	log_action_end_msg $?
	{
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O
		echo " - Restauration du fichier printers.conf.O"
		echo ""
	} &>> "$Logfile"
}

############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
	echo -e "$Blue Configuration du scanner $Resetcolor"
	echo "# Configuration du scanner" &>> "$Logfile"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log_action_begin_msg "Configuration du scanner USB"
			echo " - Configuration du scanner USB" &>> "$Logfile"
			# 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
				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"
				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_action_begin_msg "Configuration du scanner réseau"
			echo " - Configuration du scanner réseau" &>> "$Logfile"
			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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
				echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
				echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
				echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
				echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
				echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
				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
				echo -e "$Red No config binary found. $Resetcolor"
			fi
		fi
	fi
	echo " " &>> "$Logfile"
}

#################
# FIN DU SCRIPT #
#################
do_clean() {
	echo -e "$Blue Configuration de votre imprimante Brother $Model_Name terminée. $Resetcolor"
	echo "# Configuration imprimante terminée" &>> "$Logfile"
	cd || exit
	# On supprime le fichier printers.conf.O
	if [[ -e "$Dir"/printers.conf.O ]]; then
		rm "$Dir"/printers.conf.O &>> "$Logfile"
	fi
	# On réattribue les droits des dossiers/fichiers crées à l'utilisateur
	chown -R "$User": "$Temp_Dir" "$Logfile"
	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 (Le 07/08/2025, à 15:22)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#82 Le 07/08/2025, à 15:58

Watael

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

for dir; do le point virgule n'est pas obligatoire.


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

Hors ligne

#83 Le 07/08/2025, à 18:40

iznobe

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

ok , merci big_smile

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

. /lib/lsb/init-functions

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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log_action_begin_msg "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

	# ln -s /datas/$USER/{Bureau,Documents,Images,Scripts,Ressources,Photos,Musique,Téléchargements,Vidéos_famille}  /home/$USER/
	# ln -s cible    lien
	lien=$1
	cible=$2

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

Model_Name="$1"
if [ -n "$2" ]; then
	if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Dir="$(pwd)"/"$(dirname "$0")"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Inf="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
# https://download.brother.com/pub/com/linux/linux/packages/
Url_Pkg="http://www.brother.com/pub/bsc/linux/packages"

Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/$Udev_Deb_Name"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"

Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	# On vérifie qu'on lance le script en root
	if ((EUID)); then
		echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"
		exit 0
	fi
	# Si un log existe déjà on le renomme
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; 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"
				echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
				echo -e "$Red 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 $Resetcolor"
			;;
		esac
	done

	# Si le 3eme argument est vide on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then control_ip "$IP";
		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_Info="$Url_Inf/$Printer_Name"
	# On vérifie l'URL
	Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=""$Printer_Name""_us_eu_as"

	if ! wget -q --spider "$Printer_Info"; then
		log_action_end_msg 1
		echo " - Aucun pilote trouvé" &>> "$Logfile"
		echo -e "$Red Aucun pilote trouvé. Veuillez verifier votre connexion internet .
		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. $Resetcolor"
		exit 1
	fi
	# On vérifie que le fichier fournit les informations
	# ???????? pas compris a quoi sert ce controle , ni quelles infos il est censé recuperé
	Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
	if [[ "$Lnk" ]]; then Printer_Info="$Url_Inf/$Lnk"; fi

	echo "                              $date
			# Ubuntu Codename : $Codename
			# Architecture : $Arch
			# Modèle de l'imprimante : $Model_Name
			# Type de connexion : $Connection
			# Adresse IP : $IP
			# Repertoire courant : $Dir
			# Repertoire de telechargement des pilotes : $Temp_Dir
			# Fichier d'informations : $Printer_Info
			# page de telechargement des pilotes : $Printer_dl_url
			" &>> "$Logfile"
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	echo -e "$Blue Vérification des pré-requis $Resetcolor"
	echo "# Vérification des pré-requis" &>> "$Logfile"
	log_action_begin_msg "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
	install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget"

	# 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 /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() {
	# On crée le dossier de téléchargement des paquets si il n' existe pas deja
	verif_rep "$Temp_Dir"

	echo -e "$Blue Recherche des pilotes $Resetcolor"
	echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
	log_action_begin_msg "Recherche des pilotes pour l' imprimante"
	Printer_Lpd_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_LPD_DEB - | cut -d= -f2)
	Printer_Cups_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_CUP_DEB - | cut -d= -f2)
	Printer_Drv_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_DRV_DEB - | cut -d= -f2)
	log_action_end_msg 0

	Scanner_Deb=$(wget -q "$Printer_Info" -O - | grep SCANNER_DRV - | cut -d= -f2)
	if [[ -n "$Scanner_Deb" ]]; then
		echo "# Recherche des pilotes du scanner" &>> "$Logfile"
		log_action_begin_msg "Recherche des pilotes pour le scanner"
		Scankey_Deb=$(wget -q "$Printer_Info" -O - | grep SCANKEY_DRV - | cut -d= -f2)

		Scanner_Info="$Url_Inf/$Scanner_Deb.lnk"
		Scankey_Info="$Url_Inf/$Scankey_Deb.lnk"
		echo "Scanner infos : $Scanner_Info , $Scankey_Info" &>> "$Logfile"

		# 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)
				Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB32 | cut -d= -f2)
				Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB32 | cut -d= -f2)
				echo " - Architecture : $Arch" &>> "$Logfile"
				log_action_end_msg 0
			;;
			x86_64)
				Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB64 | cut -d= -f2)
				Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB64 | cut -d= -f2)
				# pour ubuntu 24.04 et superieurs
				if [[ "$Scankey_Drv_Deb" == "brscan-skey-0.3.2-0.amd64.deb" ]]; then Scankey_Drv_Deb="brscan-skey-0.3.4-0.amd64.deb";fi
				echo " - Architecture : $Arch" &>> "$Logfile"
				log_action_end_msg 0
			;;
			*)
				echo "Architecture inconnue: $Arch" &>> "$Logfile"
				log_action_end_msg 1
			;;
		esac
	else
		echo "$Red Pas de scanner détecté $Resetcolor"
		echo " - Pas de scanner détecté" &>> "$Logfile"
		log_action_end_msg 1
	fi

	echo -e "$Blue Téléchargement des pilotes $Resetcolor"
	for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb" "$Udev_Deb_Name"; do
		# On ajoute la liste des pilotes trouvés au fichier de journalisation
		if [[ -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' et 'brscan-skey' sont situés a un autre emplacement
				 if [[ -n "$Scanner_Drv_Deb" ]]; then # on ne le telecharge qu ' en cas d ' install du scanner
				 	if [[ "$pkg" == "$Udev_Deb_Name" ]]; then Url_Deb="$Udev_Deb_Url"; fi
				 fi
				echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
				log_action_begin_msg "Téléchargement du paquet : $pkg"
				wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
				log_action_end_msg $?
			else
				log_action_begin_msg "Le paquet : $pkg a deja été telechargé"
				log_action_end_msg 0
			fi
		fi
	done
	echo " " &>> "$Logfile"
}

############################
# INSTALLATION DES PILOTES #
############################
do_install_drivers() {
	echo -e "$Blue Installation des pilotes $Resetcolor"
	echo "# Installation des pilotes" &>> "$Logfile"
	for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Udev_Deb_Name" "$Scankey_Drv_Deb_Name"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			log_action_begin_msg "Installation du paquet : $pkg"
			echo " - Installation par 'dpkg' du paquet : $pkg" &>> "$Logfile"
			dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
	#echo " " &>> "$Logfile"
}

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	echo " " &>> "$Logfile"
	echo -e "$Blue Configuration de l'imprimante $Resetcolor"
	echo "# Configuration de l'imprimante" &>> "$Logfile"
	log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
	echo " - Recherche d'un fichier PPD" &>> "$Logfile"
	for pkg in "$Printer_Cups_Deb" "$Printer_Drv_Deb"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			Ppd_File=$(dpkg --contents "$Temp_Dir/$pkg" | grep ppd | awk '{print $6}' | sed 's/^.//g')
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		for file in $(find /usr/share/cups/model -type f); do
			if [[ $(grep -i Brother "$file" | grep -E "$Model_Name"|"$Printer_Name") ]]; then Ppd_File="$file"
			else
				echo " - Fichier PPD : $Ppd_File non trouvé !" &>> "$Logfile"
				log_action_end_msg 1
			fi
		done
	fi
	if [[ -n "$Ppd_File" ]]; then echo " - Fichier PPD : $Ppd_File trouvé " &>> "$Logfile"; log_action_end_msg 0; 	fi

	# On ajoute une nouvelle imprimante
	log_action_begin_msg "Ajout de l'imprimante $Model_Name"
	{
		echo " - Ajout de l'imprimante $Model_Name"
		echo " - Backup du fichier /etc/cups/printers.conf.O"
		cp /etc/cups/printers.conf.O "$Dir"
		echo " - Arret du service CUPS"
		echo " - Restauration du fichier printers.conf"
		systemctl stop cups
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf
		echo " - Redémarrage du service CUPS"
		systemctl restart cups
	} &>> "$Logfile"
	case "$Connection" in
	"USB")
		sleep 1 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
	;;
	"Réseau")
		sleep 1 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
	;;
	esac
	log_action_end_msg $?
	{
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O
		echo " - Restauration du fichier printers.conf.O"
		echo ""
	} &>> "$Logfile"
}

############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
	echo -e "$Blue Configuration du scanner $Resetcolor"
	echo "# Configuration du scanner" &>> "$Logfile"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log_action_begin_msg "Configuration du scanner USB"
			echo " - Configuration du scanner USB" &>> "$Logfile"
			# 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
				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"
				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_action_begin_msg "Configuration du scanner réseau"
			echo " - Configuration du scanner réseau" &>> "$Logfile"
			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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
				echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
				echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
				echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
				echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
				echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
				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
				echo -e "$Red No config binary found. $Resetcolor"
			fi
		fi
	fi
	echo " " &>> "$Logfile"
}

#################
# FIN DU SCRIPT #
#################
do_clean() {
	echo -e "$Blue Configuration de votre imprimante Brother $Model_Name terminée. Bye :D $Resetcolor"
	echo "# Configuration imprimante terminée" &>> "$Logfile"
	cd || exit
	# On supprime le fichier printers.conf.O
	if [[ -e "$Dir"/printers.conf.O ]]; then
		rm "$Dir"/printers.conf.O &>> "$Logfile"
	fi
	# On réattribue les droits des dossiers/fichiers crées à l'utilisateur
	chown -R "$User": "$Temp_Dir" "$Logfile"
	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 (Le 07/08/2025, à 20:54)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#84 Le 07/08/2025, à 20:52

Watael

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

plutôt que de télécharger 3 fois les mêmes infos sur la sortie standard ?
je le téléchargerais une seule fois dans un fichier, et puis je "grep"erais le fichier.

je ne comprends pas : plusieurs index différents contiennent la même info ($url_inf)

d'ailleurs, si tous les indices ont une partie de leur nom en commun, c'est peut-être le nom que devrait porter le tableau anonyme tabA. big_smile

Dernière modification par Watael (Le 07/08/2025, à 21:19)


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

Hors ligne

#85 Le 07/08/2025, à 20:58

iznobe

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

la partie concernant le telechargement des pilotes ne me plait pas .
le fait que des paquets ne soient pas sur la meme base url , comme udev_rules par exemple .

j ' essayais d ' harmoniser en " creant " un couple : nom_paquet => url_base .
Mais y a toujours un truc qui ne va pas tongue et là j ' ai plus le temps ce soir ...

le code qui a disparu etait une " transition " d ' une partie de mes essais ( non finalisée ) . j ' ai remis comme avant ...

Dernière modification par iznobe (Le 07/08/2025, à 21:01)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#86 Le 07/08/2025, à 21:59

Watael

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

?
pour te donner une idée de ce que je décrivais plus haut

do_download_drivers() {
    declare -A printer # déclaration du tableau associatif, crénom !

    # On crée le dossier de téléchargement des paquets si il n' existe pas deja
    verif_rep "$Temp_Dir"

    echo -e "$Blue Recherche des pilotes $Resetcolor"
    echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
    log_action_begin_msg "Recherche des pilotes pour l' imprimante"

    prnInfo='/tmp/printerInfo.html'
    wget -q "$Printer_Info" -O "$prnInfo"
    printer=(
        [prn_lpd]=$(grep PRN_LPD_DEB "$prnInfo"  | cut -d= -f2)
        [prn_cups]=$(grep PRN_CUP_DEB "$prnInfo" | cut -d= -f2)
        [prn_drv]=$(grep PRN_DRV_DEB "$prnInfo"  | cut -d= -f2)
    )
    log_action_end_msg 0

    Scanner_Deb=$(grep SCANNER_DRV "$prnInfo" | cut -d= -f2)
    if test -n "$Scanner_Deb"
    then
        echo "# Recherche des pilotes du scanner" &>> "$Logfile"
        log_action_begin_msg "Recherche des pilotes pour le scanner"

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

        Scanner_Info="$Url_Inf/$Scanner_Deb.lnk"
        Scankey_Info="$Url_Inf/$Scankey_Deb.lnk"
        echo "Scanner infos : $Scanner_Info , $Scankey_Info" &>> "$Logfile"
        scanInfo=/tmp/scannerInfo.html
        wget -q "$Scanner_Info" -O "$scanInfo"

        # 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=(
                    [scanDrv]=$(grep DEB32 "$scanInfo" | cut -d= -f2)
                    [scanKey]=$(grep DEB32 "$scaninfo" | cut -d= -f2)
                )
                echo " - Architecture : $Arch" &>> "$Logfile"
                log_action_end_msg 0
                ;;
            x86_64)
                printer=(
                    [scanDrv]=$(grep DEB64 "$scanInfo" | cut -d= -f2)
                    [scanKey]=$(grep DEB64 "$scanInfo" | cut -d= -f2)
                )
                # pour ubuntu 24.04 et superieurs
                if test "${printer[scanKey]}" = "brscan-skey-0.3.2-0.amd64.deb"
                then
                    printer[scanKey]="brscan-skey-0.3.4-0.amd64.deb"
                fi
                echo " - Architecture : $Arch" &>> "$Logfile"
                log_action_end_msg 0
                ;;
            *)
                echo "Architecture inconnue: $Arch" &>> "$Logfile"
                log_action_end_msg 1
                ;;
        esac
    else
        echo "$Red Pas de scanner détecté $Resetcolor"
        echo " - Pas de scanner détecté" &>> "$Logfile"
        log_action_end_msg 1
    fi

    echo -e "$Blue Téléchargement des pilotes $Resetcolor"
    for pkg in "${printer[@]}" "$Udev_Deb_Name"; 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 ! test -f "$Temp_Dir"/"$pkg"
            then
                Url_Deb="$Url_Pkg"/"$pkg"
                # le paquet 'udev-rules' et 'brscan-skey' sont situés a un autre emplacement
                if test -n "${printer[scanDrv]}"
                then # on ne le telecharge qu ' en cas d ' install du scanner
                    if test "$pkg" == "$Udev_Deb_Name"
                    then
                        Url_Deb="$Udev_Deb_Url"
                    fi
                fi
                echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
                log_action_begin_msg "Téléchargement du paquet : $pkg"
                wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
                log_action_end_msg $?
            else
                log_action_begin_msg "Le paquet : $pkg a deja été telechargé"
                log_action_end_msg 0
            fi
        fi
    done
    echo " " &>> "$Logfile"
}

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


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

Hors ligne

#87 Hier à 00:13

iznobe

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

c' est ce que j' ai essayer de faire en deuxieme choix , en cherchant sur le net avec " tuple " avec le code decrit sur cette page " cleanest.sh  " : https://gist.github.com/victorwyee/d543 … 721526c0ce
Mais il ne m' est pas venue à l' idée de faire :

for pkg in "${printer[@]}" "$Udev_Deb_Name"; do

roll

De plus , je n' arrive pas à me faire à l' idée qu ' une " association " , ca ne correspond pas a un index numerique mad
j ' y etais presque dommage , mais apres y avoir passé 2 heures , ca m' a saoulé tongue

Merci pour le code , je verrais demain ce que ça donne .

l ' idée de l' association : nom_paquet => url_paquet , c ' etait avant tout pour enlever cette partie là :

                if test -n "${printer[scanDrv]}"
                then # on ne le telecharge qu ' en cas d ' install du scanner
                    if test "$pkg" == "$Udev_Deb_Name"
                    then
                        Url_Deb="$Udev_Deb_Url"
                    fi
                fi

Mais je pense que je vais y arriver sans trop de soucis maintenant , merci .

Dernière modification par iznobe (Hier à 00:15)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#88 Hier à 00:20

Watael

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

ah !!! j'ai oublié de déclarer le tableau associatif !!!

declare -A printer

roll

je l'ajoute supra.

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


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

Hors ligne

#89 Hier à 02:03

iznobe

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

Watael a écrit :

ah !!! j'ai oublié de déclarer le tableau associatif !!!

declare -A printer

roll

Personne n' est parfait tongue

j ' avais remarqué .
j ' ai modifié 2 3 autres bricoles au passage , histoire de rendre ça un peu plus logique avec les noms de variables et dans la globalité .
j ' ai toujours ca au milieu

               # le paquet 'udev-rules' est situé a un autre emplacement
                if test "$pkg" == "$Udev_Deb_Name"; then Url_Deb="$Udev_Deb_Url"; fi

sinon voici la fonction au complet ( qui fonctionne ) :

do_download_drivers() {
    # On crée le dossier de téléchargement des paquets si il n' existe pas deja
    verif_rep "$Temp_Dir"
	declare -A printer
    echo -e "$Blue Recherche des pilotes $Resetcolor"
    echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
    log_action_begin_msg "Recherche des pilotes pour l' imprimante"

    Printer_Info="$Temp_Dir/Printer_Info.html"
    wget -q "$Printer_Url_Info" -O "$Printer_Info"
    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 0

    Scanner_Deb=$(grep SCANNER_DRV "$Printer_Info" | cut -d= -f2)
    if test -n "$Scanner_Deb"; then
    	printer+=(
    		[udev_rules]=$Udev_Deb_Name
    	)
        echo "# Recherche des pilotes du scanner" &>> "$Logfile"
        log_action_begin_msg "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+=(
                    [scanDrv]="$(grep DEB64 "$Scanner_Info" | cut -d= -f2)"
                    [scanKey]="$(grep DEB64 "$Scankey_Info" | cut -d= -f2)"
                )
                # pour ubuntu 24.04 et superieurs
                if test "${printer[scanKey]}" = "brscan-skey-0.3.2-0.amd64.deb"; then printer[scanKey]="brscan-skey-0.3.4-0.amd64.deb";fi
                log_action_end_msg 0
                ;;
            *)
                log_action_end_msg 1
                ;;
        esac
        echo " - Architecture : $Arch" &>> "$Logfile"
    else
        echo "$Red Pas de scanner détecté $Resetcolor"
        echo " - Pas de scanner détecté" &>> "$Logfile"
        log_action_end_msg 1
    fi

    echo -e "$Blue Téléchargement des pilotes $Resetcolor"
    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" == "$Udev_Deb_Name"; then Url_Deb="$Udev_Deb_Url"; fi
                echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
                log_action_begin_msg "Téléchargement du paquet : $pkg"
                wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
                log_action_end_msg $?
            else
                log_action_begin_msg "Le paquet : $pkg a deja été telechargé"
                log_action_end_msg 0
            fi
        fi
    done
    echo " " &>> "$Logfile"
}

Mais il ne m' est pas venue à l' idée de faire :

for pkg in "${printer[@]}" "$Udev_Deb_Name"; do

shellcheck n' aime pas du tout l ' idée de boucler sur des index et une chaine de caracteres big_smile


Et le script remanié avec le tableau au complet :

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

. /lib/lsb/init-functions

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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log_action_begin_msg "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

	# ln -s /datas/$USER/{Bureau,Documents,Images,Scripts,Ressources,Photos,Musique,Téléchargements,Vidéos_famille}  /home/$USER/
	# ln -s cible    lien
	lien=$1
	cible=$2

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

Model_Name="$1"
if [ -n "$2" ]; then
	if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Dir="$(pwd)"/"$(dirname "$0")"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Info="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
# https://download.brother.com/pub/com/linux/linux/packages/
Url_Pkg="http://www.brother.com/pub/bsc/linux/packages"

Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"

Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"

declare -A printer

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	# On vérifie qu'on lance le script en root
	if ((EUID)); then
		echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"
		exit 0
	fi
	# Si un log existe déjà on le renomme
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; 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"
				echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
				echo -e "$Red 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 $Resetcolor"
			;;
		esac
	done

	# Si le 3eme argument est vide on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then control_ip "$IP";
		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"
	# On vérifie l'URL
	Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=""$Printer_Name""_us_eu_as"

	if ! wget -q --spider "$Printer_Url_Info"; then
		log_action_end_msg 1
		echo " - Aucun pilote trouvé" &>> "$Logfile"
		echo -e "$Red Aucun pilote trouvé. Veuillez verifier votre connexion internet .
		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. $Resetcolor"
		exit 1
	fi
	# On vérifie que le fichier fournit les informations
	# ???????? pas compris a quoi sert ce controle , ni quelles infos il est censé recuperé
	Lnk=$(wget -q "$Printer_Url_Info" -O - | grep LNK - | cut -d= -f2)
	if [[ "$Lnk" ]]; then Printer_Url_Info="$Url_Info/$Lnk"; fi

	echo "                              $date
			# Ubuntu Codename : $Codename
			# Architecture : $Arch
			# Modèle de l'imprimante : $Model_Name
			# Type de connexion : $Connection
			# Adresse IP : $IP
			# Repertoire courant : $Dir
			# Repertoire de telechargement des pilotes : $Temp_Dir
			# Fichier d'informations : $Printer_Url_Info
			# page de telechargement des pilotes : $Printer_dl_url
			" &>> "$Logfile"
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	echo -e "$Blue Vérification des pré-requis $Resetcolor"
	echo "# Vérification des pré-requis" &>> "$Logfile"
	log_action_begin_msg "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
	install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget"

	# 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 /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() {
    # On crée le dossier de téléchargement des paquets si il n' existe pas deja
    verif_rep "$Temp_Dir"

    echo -e "$Blue Recherche des pilotes $Resetcolor"
    echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
    log_action_begin_msg "Recherche des pilotes pour l' imprimante"

    Printer_Info="$Temp_Dir/Printer_Info.html"
    wget -q "$Printer_Url_Info" -O "$Printer_Info"
    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 0

    Scanner_Deb=$(grep SCANNER_DRV "$Printer_Info" | cut -d= -f2)
    if test -n "$Scanner_Deb"; then
    	printer+=(
    		[udev_rules]="$Udev_Deb_Name"
    	)
        echo "# Recherche des pilotes du scanner" &>> "$Logfile"
        log_action_begin_msg "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 test "${printer[scanKey_drv]}" = "brscan-skey-0.3.2-0.amd64.deb"; then printer[scanKey_drv]="$Scankey_Drv_Deb_Name";fi
                log_action_end_msg 0
                ;;
            *)
                log_action_end_msg 1
                ;;
        esac
        echo " - Architecture : $Arch" &>> "$Logfile"
    else
        echo "$Red Pas de scanner détecté $Resetcolor"
        echo " - Pas de scanner détecté" &>> "$Logfile"
        log_action_end_msg 1
    fi

    echo -e "$Blue Téléchargement des pilotes $Resetcolor"
    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" == "$Udev_Deb_Name"; then Url_Deb="$Udev_Deb_Url"/"$Udev_Deb_Name"; fi
                echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
                log_action_begin_msg "Téléchargement du paquet : $pkg"
                wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
                log_action_end_msg $?
            else
                log_action_begin_msg "Le paquet : $pkg a deja été telechargé"
                log_action_end_msg 0
            fi
        fi
    done
    echo " " &>> "$Logfile"
}
############################
# INSTALLATION DES PILOTES #
############################
do_install_drivers() {
	echo -e "$Blue Installation des pilotes $Resetcolor"
	echo "# Installation des pilotes" &>> "$Logfile"
	for pkg in "${printer[@]}"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			log_action_begin_msg "Installation du paquet : $pkg"
			echo " - Installation par 'dpkg' du paquet : $pkg" &>> "$Logfile"
			dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
	echo " " &>> "$Logfile"
}

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	echo "${printer[*]} TEST : ${printer[prn_cups]}" ,"${printer[prn_drv]}"
	echo -e "$Blue Configuration de l'imprimante $Resetcolor"
	echo "# Configuration de l'imprimante" &>> "$Logfile"
	log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
	echo " - Recherche d'un fichier PPD" &>> "$Logfile"
	#for pkg in "$Printer_Cups_Deb" "$Printer_Drv_Deb"; do
	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" | grep ppd | awk '{print $6}' | sed 's/^.//g')
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		for file in $(find /usr/share/cups/model -type f); do
			if grep -qi Brother "$file" | grep -E "$Model_Name|$Printer_Name"; then
				Ppd_File="$file"
				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 une nouvelle imprimante
	log_action_begin_msg "Ajout de l'imprimante $Model_Name"
	{
		echo " - Ajout de l'imprimante $Model_Name"
		echo " - Backup du fichier /etc/cups/printers.conf.O"
		cp /etc/cups/printers.conf.O "$Dir"
		echo " - Arret du service CUPS"
		echo " - Restauration du fichier printers.conf"
		systemctl stop cups
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf
		echo " - Redémarrage du service CUPS"
		systemctl restart cups
	} &>> "$Logfile"
	case "$Connection" in
	"USB")
		sleep 1 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
	;;
	"Réseau")
		sleep 1 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
	;;
	esac
	log_action_end_msg $?
	{
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O
		echo " - Restauration du fichier printers.conf.O"
		echo ""
	} &>> "$Logfile"
}

############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
	echo -e "$Blue Configuration du scanner $Resetcolor"
	echo "# Configuration du scanner" &>> "$Logfile"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log_action_begin_msg "Configuration du scanner USB"
			echo " - Configuration du scanner USB" &>> "$Logfile"
			# 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
				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"
				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_action_begin_msg "Configuration du scanner réseau"
			echo " - Configuration du scanner réseau" &>> "$Logfile"
			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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
				echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
				echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
				echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
				echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
				echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
				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
				echo -e "$Red No config binary found. $Resetcolor"
			fi
		fi
	fi
	echo " " &>> "$Logfile"
}

#################
# FIN DU SCRIPT #
#################
do_clean() {
	echo -e "$Blue Configuration de votre imprimante Brother $Model_Name terminée. Bye :D $Resetcolor"
	echo "# Configuration imprimante terminée" &>> "$Logfile"
	cd || exit
	# On supprime le fichier printers.conf.O
	if [[ -e "$Dir"/printers.conf.O ]]; then
		rm "$Dir"/printers.conf.O &>> "$Logfile"
	fi
	# On réattribue les droits des dossiers/fichiers crées à l'utilisateur
	chown -R "$User": "$Temp_Dir" "$Logfile"
	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 (Hier à 03:58)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#90 Hier à 03:47

Watael

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

Et le script remanié avec le tableau au complet ne fonctionne plus ...

il se plaint ? de quoi ?
y a-t-il des variables de l'ancienne version qui étaient réutilisées dans le reste du script ?

shellcheck n' aime pas du tout l ' idée de boucler sur des index et une chaine de caracteres

en fait, on ne boucle pas sur des index et une chaîne, on boucle uniquement sur des valeurs contenues dans des variables; certaines d'entres elles sont des éléments d'un tableau.
mais ça ne changerait rien : les indices sont des chaînes.

$ declare -A aAr=( [foo]=FOO [bar]=BAR )
$ for i in "${aAr[@]}" fooBar; do echo $i; done #là, on boucle sur les valeurs
FOO
BAR
fooBar
$ for i in "${!aAr[@]}" fooBar; do echo $i; done #là, on boucle sur les indices
foo
bar
fooBar
printer+=(
    		[udev_rules]=$Udev_Deb_Name

printer+= n'est pas utile, parce qu'on n'ajoute pas qu'une valeur à la fin d'un tableau : on ajoute une valeur à un indice, explicitement.


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

Hors ligne

#91 Hier à 04:17

iznobe

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

printer+=(
    		[udev_rules]=$Udev_Deb_Name

printer+= n'est pas utile, parce qu'on n'ajoute pas qu'une valeur à la fin d'un tableau : on ajoute une valeur à un indice, explicitement.

je ne sais pas pourquoi , mais si , il le faut à celui-là justement .

cette fois , je pense avoir fait le tour des erreurs et etre revenu à la normale :

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

. /lib/lsb/init-functions

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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log_action_begin_msg "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

	# ln -s /datas/$USER/{Bureau,Documents,Images,Scripts,Ressources,Photos,Musique,Téléchargements,Vidéos_famille}  /home/$USER/
	# ln -s cible    lien
	lien=$1
	cible=$2

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

Model_Name="$1"
if [ -n "$2" ]; then
	if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Dir="$(pwd)"/"$(dirname "$0")"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Info="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
# https://download.brother.com/pub/com/linux/linux/packages/
Url_Pkg="http://www.brother.com/pub/bsc/linux/packages"

Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"

Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"

declare -A printer

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	# On vérifie qu'on lance le script en root
	if ((EUID)); then
		echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"
		exit 0
	fi
	# Si un log existe déjà on le renomme
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; 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"
				echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
				echo -e "$Red 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 $Resetcolor"
			;;
		esac
	done

	# Si le 3eme argument est vide on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then control_ip "$IP";
		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"
	# On vérifie l'URL
	Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=""$Printer_Name""_us_eu_as"

	if ! wget -q --spider "$Printer_Url_Info"; then
		log_action_end_msg 1
		echo " - Aucun pilote trouvé" &>> "$Logfile"
		echo -e "$Red Aucun pilote trouvé. Veuillez verifier votre connexion internet .
		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. $Resetcolor"
		exit 1
	fi
	# On vérifie que le fichier fournit les informations
	# ???????? pas compris a quoi sert ce controle , ni quelles infos il est censé recuperé
	Lnk=$(wget -q "$Printer_Url_Info" -O - | grep LNK - | cut -d= -f2)
	if [[ "$Lnk" ]]; then Printer_Url_Info="$Url_Info/$Lnk"; fi

	echo "                              $date
			# Ubuntu Codename : $Codename
			# Architecture : $Arch
			# Modèle de l'imprimante : $Model_Name
			# Type de connexion : $Connection
			# Adresse IP : $IP
			# Repertoire courant : $Dir
			# Repertoire de telechargement des pilotes : $Temp_Dir
			# Fichier d'informations : $Printer_Url_Info
			# page de telechargement des pilotes : $Printer_dl_url
			" &>> "$Logfile"
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	echo -e "$Blue Vérification des pré-requis $Resetcolor"
	echo "# Vérification des pré-requis" &>> "$Logfile"
	log_action_begin_msg "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
	install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget"

	# 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 /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() {
    # On crée le dossier de téléchargement des paquets si il n' existe pas deja
    verif_rep "$Temp_Dir"

    echo -e "$Blue Recherche des pilotes $Resetcolor"
    echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
    log_action_begin_msg "Recherche des pilotes pour l' imprimante"

    Printer_Info="$Temp_Dir/Printer_Info.html"
    wget -q "$Printer_Url_Info" -O "$Printer_Info"
    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 0

    Scanner_Deb=$(grep SCANNER_DRV "$Printer_Info" | cut -d= -f2)
    if test -n "$Scanner_Deb"; then
    	printer+=(
    		[udev_rules]="$Udev_Deb_Name"
    	)
        echo "# Recherche des pilotes du scanner" &>> "$Logfile"
        log_action_begin_msg "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 test "${printer[scanKey_drv]}" = "brscan-skey-0.3.2-0.amd64.deb"; then printer[scanKey_drv]="$Scankey_Drv_Deb_Name";fi
                log_action_end_msg 0
                ;;
            *)
                Arch="inconnue !"
                log_action_end_msg 1
                ;;
        esac
        echo " - Architecture : $Arch" &>> "$Logfile"
    else
        echo "$Red Pas de scanner détecté $Resetcolor"
        echo " - Pas de scanner détecté" &>> "$Logfile"
        log_action_end_msg 1
    fi

    echo -e "$Blue Téléchargement des pilotes $Resetcolor"
    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" == "$Udev_Deb_Name"; then Url_Deb="$Udev_Deb_Url"/"$Udev_Deb_Name"; fi
                echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
                log_action_begin_msg "Téléchargement du paquet : $pkg"
                wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
                log_action_end_msg $?
            else
                log_action_begin_msg "Le paquet : $pkg a deja été telechargé"
                log_action_end_msg 0
            fi
        fi
    done
    echo " " &>> "$Logfile"
}
############################
# INSTALLATION DES PILOTES #
############################
do_install_drivers() {
	echo -e "$Blue Installation des pilotes $Resetcolor"
	echo "# Installation des pilotes" &>> "$Logfile"
	for pkg in "${printer[@]}"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			log_action_begin_msg "Installation du paquet : $pkg"
			echo " - Installation par 'dpkg' du paquet : $pkg" &>> "$Logfile"
			dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
			log_action_end_msg $?
		fi
	done
	echo " " &>> "$Logfile"
}

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	echo -e "$Blue Configuration de l'imprimante $Resetcolor"
	echo "# Configuration de l'imprimante" &>> "$Logfile"
	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" | grep ppd | awk '{print $6}' | sed 's/^.//g')
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		for file in $(find /usr/share/cups/model -type f); do
			if grep -qi Brother "$file" | grep -E "$Model_Name|$Printer_Name"; then
				Ppd_File="$file"
			fi
		done
	fi
	log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
	echo " - Recherche d'un fichier PPD" &>> "$Logfile"
	if [[ -n "$Ppd_File" ]]; then
		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
	# On ajoute la nouvelle imprimante
	log_action_begin_msg "Ajout de l'imprimante $Model_Name"
	{
		echo " - Ajout de l'imprimante $Model_Name"
		echo " - Backup du fichier /etc/cups/printers.conf.O"
		cp /etc/cups/printers.conf.O "$Dir"
		echo " - Arret du service CUPS"
		echo " - Restauration du fichier printers.conf"
		systemctl stop cups
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf
		echo " - Redémarrage du service CUPS"
		systemctl restart cups
	} &>> "$Logfile"
	case "$Connection" in
	"USB")
		sleep 1 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
	;;
	"Réseau")
		sleep 1 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
	;;
	esac
	log_action_end_msg $?
	{
		cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O
		echo " - Restauration du fichier printers.conf.O"
		echo ""
	} &>> "$Logfile"
}

############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
	echo -e "$Blue Configuration du scanner $Resetcolor"
	echo "# Configuration du scanner" &>> "$Logfile"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log_action_begin_msg "Configuration du scanner USB"
			echo " - Configuration du scanner USB" &>> "$Logfile"
			# 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
				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"
				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_action_begin_msg "Configuration du scanner réseau"
			echo " - Configuration du scanner réseau" &>> "$Logfile"
			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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
				echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
				echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
				echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
				echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
				echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
				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
				echo -e "$Red No config binary found. $Resetcolor"
			fi
		fi
	fi
	echo " " &>> "$Logfile"
}

#################
# FIN DU SCRIPT #
#################
do_clean() {
	echo -e "$Blue Configuration de votre imprimante Brother $Model_Name terminée. Bye :D $Resetcolor"
	echo "# Configuration imprimante terminée" &>> "$Logfile"
	cd || exit
	# On supprime le fichier printers.conf.O
	if [[ -e "$Dir"/printers.conf.O ]]; then
		rm "$Dir"/printers.conf.O &>> "$Logfile"
	fi
	# On réattribue les droits des dossiers/fichiers crées à l'utilisateur
	chown -R "$User": "$Temp_Dir" "$Logfile"
	exit 0
}

do_init_script
do_check_prerequisites
do_download_drivers
do_install_drivers
do_configure_printer
do_configure_scanner
do_clean

retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#92 Hier à 04:33

Watael

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

d'accord, non, c'est inutile :

printer[udev_rules]="$Udev_Deb_Name"

sinon, sans le +, ça "réintialise" le tableau.

+1


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

Hors ligne

#93 Hier à 10:33

iznobe

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

Salut , par contre , la creation du tableau n ' apporte pas ce que j' aurais aimé : supprimer la partie specifique au paquet qui n ' a pas la meme base url .
n ' est il pas possible de creer un tableau qui prendrait comme index le nom du paquet , et en valeur l ' url du paquet a telecharger ( ou l ' inverse d' ailleurs , OSEF ) ?
du genre :

printer+=(
    		["$udev_rules_name"]=$Udev_rules_Url

Puis de se servir dans le code de l' index et de la valeur ?

ou encore mettre en valeur du tableau l ' url complete du paquet, du genre :

printer+=(
            [udev_rules]=$Udev_rules_Url/$Udev_Deb_Name

Mais dans ce dernier cas , je ne pourrais pas me reservir de ce tableau pour l ' installation , à moins d' extraire uniquement le nom pour verifier si il a deja été telechargé ...

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#94 Hier à 12:17

iznobe

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

+ ajout d ' un arret du script en cas d ' architecture non supportée .
+ ajout d ' une 2eme adresse de telechargement pour les paquets ( au cas ou echec avec la 1ere )
+ correction d ' un bug dans la derniere modification de fonction .
+ correction bug d' affichage des messages
+ suppression de la variable " Dir " , utilisation de $Temp_Dir à la place.
+ simplification de la dernier fonction : " do_clean " , meme si je trouve qu ' elle ne sert à rien , et termine le script en bonne et due forme .
+ controle de l' existence du fichier avant de le sourcer pour l' affichage des messages .

#!/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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log_action_begin_msg "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_action_begin_msg "Recherche du lien ' $lien ' sur votre système"
	if ! test -L "$lien"; then
		log_action_end_msg 1
		log_action_begin_msg "Creation du lien ' $lien '"
		ln -s "$cible" "$lien" &>> "$Logfile"
		log_action_end_msg $?
	else log_action_end_msg $?;
	fi
}

Model_Name="$1"
if [ -n "$2" ]; then
	if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Info="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
Url_Pkg="https://download.brother.com/pub/com/linux/linux/packages/"
Url_Pkg2="http://www.brother.com/pub/bsc/linux/packages"

Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"

Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"

declare -A printer

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	# On vérifie qu'on lance le script en root
	if ((EUID)); then
		echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"; exit 0;fi
	if [[ $Arch != "i386" ]] && [[ $Arch != "i686" ]] && [[ $Arch != "x86_64" ]]; then #  && [[ $Arch != "armv7l" ]]
		echo " - Architecture : $Arch" &>> "$Logfile"
		echo -e "$Red Achitecture $Arch non prise en charge ! script interrompu. $Resetcolor"
		log_action_end_msg 1
		exit 1
	fi
	# Si un log existe déjà on le renomme
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; 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"
				echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
				echo -e "$Red 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 $Resetcolor"
			;;
		esac
	done

	# Si le 3eme argument est vide on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then control_ip "$IP";
		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"
	# On vérifie l'URL
	Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=""$Printer_Name""_us_eu_as"

	if ! wget -q --spider "$Printer_Url_Info"; then
		log_action_end_msg 1
		echo " - Aucun pilote trouvé" &>> "$Logfile"
		echo -e "$Red Aucun pilote trouvé. Veuillez verifier votre connexion internet .
		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. $Resetcolor"
		exit 2
	fi
	# On vérifie que le fichier fournit les informations
	# ???????? pas compris a quoi sert ce controle , ni quelles infos il est censé recuperé
	Lnk=$(wget -q "$Printer_Url_Info" -O - | grep LNK - | cut -d= -f2)
	if [[ "$Lnk" ]]; then Printer_Url_Info="$Url_Info/$Lnk"; fi

	echo "                              $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
			" &>> "$Logfile"
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	echo -e "$Blue Vérification des pré-requis $Resetcolor"
	echo "# Vérification des pré-requis" &>> "$Logfile"
	log_action_begin_msg "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
	install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget"

	# 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 /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() {
    # On crée le dossier de téléchargement des paquets si il n' existe pas deja
    verif_rep "$Temp_Dir"

    echo -e "$Blue Recherche des pilotes $Resetcolor"
    echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
    log_action_begin_msg "Recherche des pilotes pour l' imprimante"

    Printer_Info="$Temp_Dir/Printer_Info.html"
    wget -q "$Printer_Url_Info" -O "$Printer_Info"
    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 0

    Scanner_Deb=$(grep SCANNER_DRV "$Printer_Info" | cut -d= -f2)
    if test -n "$Scanner_Deb"; then
    	printer+=(
    		[udev_rules]="$Udev_Deb_Name"
    	)
        echo "# Recherche des pilotes du scanner" &>> "$Logfile"
        log_action_begin_msg "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"
		log_action_end_msg $?

        # 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
                ;;
                *)
					echo "Architecture inconnue: $Arch" &>> "$Logfile"
				;;
        esac
    else
        echo "$Red Pas de scanner détecté $Resetcolor"
        echo " - Pas de scanner détecté" &>> "$Logfile"
        log_action_end_msg 1
    fi

    echo -e "$Blue Téléchargement des pilotes $Resetcolor"
    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
                echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
                log_action_begin_msg "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_action_begin_msg "Le paquet : $pkg a deja été telechargé"
                log_action_end_msg 0
            fi
        fi
    done
    echo "" &>> "$Logfile"
}

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

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	echo -e "$Blue Configuration de l'imprimante $Resetcolor"
	echo "# Configuration de l'imprimante" &>> "$Logfile"
	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" | grep ppd | awk '{print $6}' | sed 's/^.//g')
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		for file in $(find /usr/share/cups/model -type f); do
			if grep -qi Brother "$file" | grep -E "$Model_Name|$Printer_Name"; then
				Ppd_File="$file"
			fi
		done
	fi
	log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
	echo " - Recherche d'un fichier PPD" &>> "$Logfile"
	if [[ -n "$Ppd_File" ]]; then
		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
	# On ajoute la nouvelle imprimante
	log_action_begin_msg "Ajout de l'imprimante $Model_Name"
	{
		echo " - 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() {
	echo -e "$Blue Configuration du scanner $Resetcolor"
	echo "# Configuration du scanner" &>> "$Logfile"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log_action_begin_msg "Configuration du scanner USB"
			echo " - Configuration du scanner USB" &>> "$Logfile"
			# 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
				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"
				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_action_begin_msg "Configuration du scanner réseau"
			echo " - Configuration du scanner réseau" &>> "$Logfile"
			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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
				echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
				echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
				echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
				echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
				echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
				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
				echo -e "$Red No config binary found. $Resetcolor"
			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 -Rv "$User": "$Temp_Dir" "$Logfile"
	echo -e "$Blue Configuration de votre imprimante Brother $Model_Name terminée. Bye :D $Resetcolor
  Vous pouvez supprimer le dossier $Temp_Dir avec la commande suivante :  rm -r $Temp_Dir"
  echo "# Configuration imprimante terminée" &>> "$Logfile"
	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 (Hier à 17:05)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#95 Hier à 17:16

Watael

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

#93: j'ai du mal à visualiser ton problème. hmm

printer[udevRules_name]="$Udev_rules_name"
printer[udevRules_url]="$Udev_rules_Url"

?
mais, ça ne résoud pas l'exception (SI $pkg == $udev_rules). Or, s'il y a exception c'est qu'il faut le traiter différemment (exceptionnellement smile ), c'est-à-dire en dehors de la boucle et donc ne pas l'insérer dans le tableau.

en attendant, parce que ça m'est désagréable de voir des lignes avec les mêmes commandes :

do_download_drivers() {
    # On crée le dossier de téléchargement des paquets si il n' existe pas deja
    verif_rep "$Temp_Dir"

    echo -e "$Blue Recherche des pilotes $Resetcolor"
    echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
    log_action_begin_msg "Recherche des pilotes pour l' imprimante"

prnData=( LPD CUP DRV )
Printer_Info="$Temp_Dir/Printer_Info.html"
wget -q "$Printer_Url_Info" -O "$Printer_Info"
for dat in "${prnData[@]}"
do
    printer[$dat]=$(grep PRN_${dat}_DEB "$printer_Info" | cut -d '=' -f 2)
done

#    Printer_Info="$Temp_Dir/Printer_Info.html"
#    wget -q "$Printer_Url_Info" -O "$Printer_Info"
#    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 0

/!\ttention, les noms des indices du tableau printer ont changés, mais ce n'est rien ça s'adapte facilement. wink

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


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

Hors ligne

#96 Hier à 17:46

iznobe

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

#93: j'ai du mal à visualiser ton problème. hmm

c' est juste que ca m' enerve que celui-là sorte du lot tongue .
il n' y a pas de probleme , que des solutions big_smile

baa non , je le laisse dans le tableau , sinon il faut doubler les commandes pour le DL , mais aussi pour l' installer , pas cool tongue

en attendant, parce que ça m'est désagréable de voir des lignes avec les mêmes commandes :

code

ha ce point là ???  lol

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#97 Hier à 18:10

iznobe

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

vu que tu fais une boucle , tu as ( encore ? ) oublié le " += " pour les elements du tableau non ?

for dat in "${prnData[@]}"
do
    printer[$dat]+=$(grep PRN_${dat}_DEB "$printer_Info" | cut -d '=' -f 2)
done

pas encore testé ...

ca donnerait ça :

#!/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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "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_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
		if [[ -d "$dir" ]]; then log_action_end_msg 0;
		else
			log_action_end_msg 1
			log_action_begin_msg "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_action_begin_msg "Recherche du lien ' $lien ' sur votre système"
	if ! test -L "$lien"; then
		log_action_end_msg 1
		log_action_begin_msg "Creation du lien ' $lien '"
		ln -s "$cible" "$lien" &>> "$Logfile"
		log_action_end_msg $?
	else log_action_end_msg $?;
	fi
}

Model_Name="$1"
if [ -n "$2" ]; then
	if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Info="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
Url_Pkg="https://download.brother.com/pub/com/linux/linux/packages/"
Url_Pkg2="http://www.brother.com/pub/bsc/linux/packages"

Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"

Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"

declare -A printer

#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
	# On vérifie qu'on lance le script en root
	if ((EUID)); then
		echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"; exit 0;fi
	if [[ $Arch != "i386" ]] && [[ $Arch != "i686" ]] && [[ $Arch != "x86_64" ]]; then #  && [[ $Arch != "armv7l" ]]
		echo " - Architecture : $Arch" &>> "$Logfile"
		echo -e "$Red Achitecture $Arch non prise en charge ! script interrompu. $Resetcolor"
		log_action_end_msg 1
		exit 1
	fi
	# Si un log existe déjà on le renomme
	if [[ -f $Logfile ]]; then mv "$Logfile" "$Logfile".old; 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"
				echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
				echo -e "$Red 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 $Resetcolor"
			;;
		esac
	done

	# Si le 3eme argument est vide on demande l' IP de l'imprimante
	if [[ "$Connection" == "Réseau" ]]; then control_ip "$IP";
		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"
	# On vérifie l'URL
	Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=""$Printer_Name""_us_eu_as"

	if ! wget -q --spider "$Printer_Url_Info"; then
		log_action_end_msg 1
		echo " - Aucun pilote trouvé" &>> "$Logfile"
		echo -e "$Red Aucun pilote trouvé. Veuillez verifier votre connexion internet .
		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. $Resetcolor"
		exit 2
	fi
	# On vérifie que le fichier fournit les informations
	# ???????? pas compris a quoi sert ce controle , ni quelles infos il est censé recuperé
	Lnk=$(wget -q "$Printer_Url_Info" -O - | grep LNK - | cut -d= -f2)
	if [[ "$Lnk" ]]; then Printer_Url_Info="$Url_Info/$Lnk"; fi

	echo "                              $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
			" &>> "$Logfile"
}

###############################
# VERIFICATION DES PRÉ-REQUIS #
###############################
do_check_prerequisites() {
	echo -e "$Blue Vérification des pré-requis $Resetcolor"
	echo "# Vérification des pré-requis" &>> "$Logfile"
	log_action_begin_msg "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
	install_pkg "multiarch-support" "lib32stdc++6" "cups" "curl" "wget"

	# 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 /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() {
    # On crée le dossier de téléchargement des paquets si il n' existe pas deja
    verif_rep "$Temp_Dir"

    echo -e "$Blue Recherche des pilotes $Resetcolor"
    echo "# Recherche des pilotes de l'imprimante" &>> "$Logfile"
    log_action_begin_msg "Recherche des pilotes pour l' imprimante"

    Printer_Info="$Temp_Dir/Printer_Info.html"
    wget -q "$Printer_Url_Info" -O "$Printer_Info"
    
    # 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)"
    # )
    
    prnData=( LPD CUP DRV )
    for dat in "${prnData[@]}"; do
        printer[$dat]+=$(grep PRN_${dat}_DEB "$printer_Info" | cut -d '=' -f 2)
    done
    
    log_action_end_msg 0

    Scanner_Deb=$(grep SCANNER_DRV "$Printer_Info" | cut -d= -f2)
    if test -n "$Scanner_Deb"; then
    	printer+=(
    		[udev_rules]="$Udev_Deb_Name"
    	)
        echo "# Recherche des pilotes du scanner" &>> "$Logfile"
        log_action_begin_msg "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"
		log_action_end_msg $?

        # On récupère les pilotes du scanner en fonction 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
                ;;
                *)
					echo "Architecture inconnue: $Arch" &>> "$Logfile"
				;;
        esac
    else
        echo "$Red Pas de scanner détecté $Resetcolor"
        echo " - Pas de scanner détecté" &>> "$Logfile"
        log_action_end_msg 1
    fi

    echo -e "$Blue Téléchargement des pilotes $Resetcolor"
    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
                echo " - Téléchargement du paquet : $pkg" &>> "$Logfile"
                log_action_begin_msg "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_action_begin_msg "Le paquet : $pkg a deja été telechargé"
                log_action_end_msg 0
            fi
        fi
    done
    echo "" &>> "$Logfile"
}

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

#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
	echo -e "$Blue Configuration de l'imprimante $Resetcolor"
	echo "# Configuration de l'imprimante" &>> "$Logfile"
	for pkg in "${printer[CUP]}" "${printer[DRV]}"; do
		if [[ -n "$pkg" ]] && [[ -f "$Temp_Dir/$pkg" ]]; then
			Ppd_File=$(dpkg --contents "$Temp_Dir/$pkg" | grep ppd | awk '{print $6}' | sed 's/^.//g')
		fi
	done
	if [[ -z "$Ppd_File" ]]; then
		for file in $(find /usr/share/cups/model -type f); do
			if grep -qi Brother "$file" | grep -E "$Model_Name|$Printer_Name"; then
				Ppd_File="$file"
			fi
		done
	fi
	log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
	echo " - Recherche d'un fichier PPD" &>> "$Logfile"
	if [[ -n "$Ppd_File" ]]; then
		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
	# On ajoute la nouvelle imprimante
	log_action_begin_msg "Ajout de l'imprimante $Model_Name"
	{
		echo " - 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() {
	echo -e "$Blue Configuration du scanner $Resetcolor"
	echo "# Configuration du scanner" &>> "$Logfile"
	if [[ -n "$Scanner_Deb" ]]; then
		if [[ $Connection == "USB" ]]; then
			log_action_begin_msg "Configuration du scanner USB"
			echo " - Configuration du scanner USB" &>> "$Logfile"
			# 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
				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"
				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_action_begin_msg "Configuration du scanner réseau"
			echo " - Configuration du scanner réseau" &>> "$Logfile"
			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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
				echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
				echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
				echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
				echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
				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_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
				echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
				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
				echo -e "$Red No config binary found. $Resetcolor"
			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 -Rv "$User": "$Temp_Dir" "$Logfile"
	echo -e "$Blue Configuration de votre imprimante Brother $Model_Name terminée. Bye :D $Resetcolor
  Vous pouvez supprimer le dossier $Temp_Dir avec la commande suivante :  rm -r $Temp_Dir"
  echo "# Configuration imprimante terminée" &>> "$Logfile"
	exit 0
}

do_init_script
do_check_prerequisites
do_download_drivers
do_install_drivers
do_configure printer
do_configure_scanner
do_clean

je ne peux pas testé là , mais je trouve que ca induit un peu plus de complexité pour rien .

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


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#98 Hier à 19:05

Watael

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

cette fois, non, parce que là il n'y a pas les parenthèses.

un poil de complexité très relative pour simplifier la maintenance : quand la commande devra être adaptée, elle n'aura à l'être qu'une seule fois.

non, pas "à ce point là", c'est bien pire, mais je doit rester poli. big_smile


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

Hors ligne

#99 Hier à 23:36

Watael

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

t'as du Citrate de Bétaïne ? gare à l'indigestion lol

je n'ai pas testé, j'ai peut-être oublié des trucs importants pour le script...
les logs "m'importunent", alors je les ai virés; ça prend de la place, et ça n'aide pas au débuggage. fired!

do_download_drivers() {
    verif_rep "$Temp_Dir"

    . <(wget -qO - "$Printer_Url_Info" | sed '/\(]\|rpm\)$/d')
    # pour une DCP1610W, les variables dispos sont : PRN_CUP_DEB, PRN_LPD_DEB, PRINTERNAME, SCANNER_DRV, et SCANKEY_DRV
    Printer=(
        [cup]=$PRN_CUP_DEB
        [lpd]=$PRN_LPD_DEB
    )
    test -v PRN_DRV_DEB && Printer[drv]=$PRN_DRV_DEB

    if ! test -v SCANNER_DRV
    then
        echo "Pas de scanner connu pour cette imprimante"
    else
        printer[udev_rules]="$Udev_Deb_Name"

        Scanner_Url_Info="$Url_Info/$SCANNER_DRV.lnk" #on peut se passer de cette variable intermédiaire
        . <(wget -qO- "$Scanner_Url_Info" | sed -n '/^DEB/s/^/scan_/p')

        Scankey_Url_Info="$Url_Info/$SCANKEY_DRV.lnk" #on peut se passer de cette variable intermédiaire
        . <(wget -qO- "$Scankey_Url_Info" | sed -n '/^DEB/s/^/scanKey_/p')

        case $Arch in
            i[36]86)
                printer[scanner_drv]="$scan_DEB32"
                printer[scanKey_drv]="$scanKey_DEB32"
                ;;
            x86_64)
                printer[scanner_drv]="$scan_DEB64"
                printer[scanKey_drv]="$scanKey_DEB64"

                . /etc/lsb-release #TODO: test file exists
                if [[ $DISTRIB_RELEASE ~= ^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
    fi

    for pkg in "${printer[@]}"; do
#        if test -n "$pkg" #à moins que le téléchargement se soit mal passé (alors on peut le savoir avant) c'est pas utile.
#        then
            if ! test -f "$Temp_Dir/$pkg"
            then
                test "$pkg" = "${printer[udev_rules]}" && URL="$Udev_Deb_Url" || URL="$Url_Pkg"
                Url_Deb=$URL/$pkg
                wget -cP "$Temp_Dir" "$Url_Deb" &>> "$Logfile"
            fi
#        fi
    done
}

ouaip, j'aimerais bien un truc un peu comme en Python :

URL={{ test "$pkg" = "${printer[udev_rules]}" && "$Udev_Deb_Url" || "$Url_Pkg" }}

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


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

Hors ligne