#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
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 )
#!/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
#!/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.
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 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
De plus , je n' arrive pas à me faire à l' idée qu ' une " association " , ca ne correspond pas a un index numerique
j ' y etais presque dommage , mais apres y avoir passé 2 heures , ca m' a saoulé
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
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
ah !!! j'ai oublié de déclarer le tableau associatif !!!
declare -A printer
Personne n' est parfait
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
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.
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 ), 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.
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 .
il n' y a pas de probleme , que des solutions
baa non , je le laisse dans le tableau , sinon il faut doubler les commandes pour le DL , mais aussi pour l' installer , pas cool
en attendant, parce que ça m'est désagréable de voir des lignes avec les mêmes commandes :
code
ha ce point là ???
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.
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
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