#26 Le 03/08/2025, à 00:30
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
essai de la 4ème mouture
pas de choix usb ou réseau ??
erreurConfiguration de l'imprimante * Recherche d'un fichier PPD sur votre système... dpkg-deb: erreur: erreur de lecture de numéro magique de version de l'archive depuis le fichier /tmp/packages/: Is a directory /home/kubu/script_iznobe.sh: line 318: MFCJ4510DW: command not found
" erreur " corrigée .
tu devrais avoir le choix entre USB ou Réseau dans la 4eme mouture et celle-ci :
#!/bin/bash
# Script d'installation pour imprimantes Brother
. /lib/lsb/init-functions
Model_Name="$1"
Con_Typ="$2"
if ((Con_Typ)); then Connection="Réseau"; #else Connection="USB"
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="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" "$(date +"$Logfile.%F_%T")"
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^^}
# 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"
#read -rp "Entrez l'adresse IP de votre imprimante : " IP
# On valide le format de l'adresse IP de l'imprimante
#IP=$(echo "$IP" | awk -F'[.]' '{w=$1+0; x=$2+0; y=$3+0; z=$4+0; print w"."x"."y"."z}')
;;
esac
done
echo "# Ubuntu Codename : $Codename" &>> "$Logfile"
echo "# Architecture : $Arch" &>> "$Logfile"
echo "# Modèle de l'imprimante : $Model_Name" &>> "$Logfile"
echo "# Type de connexion : $Connection" &>> "$Logfile"
echo "# Repertoire courant : $Dir" &>> "$Logfile"
RegIP="^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"
if [[ "$Connection" == "Réseau" ]]; then
while [[ -z "$IP" ]]; do
read -rp "Entrez l'adresse IP de votre imprimante : " IP
if [[ $IP =~ $RegIP ]]; then
echo "# Adresse IP : $IP" &>> "$Logfile"
else
unset IP
fi
done
fi
echo "# Repertoire courant : $Dir" &>> "$Logfile"
}
##############################
# TÉLÉCHARGEMENT DES PILOTES #
##############################
do_download_drivers() {
echo -e "$Blue Téléchargement des pilotes de l'imprimante $Resetcolor"
echo "# Vérification des pré-requis" &>> "$Logfile"
# On crée le dossier de téléchargement des paquets
if [[ ! -d "$Temp_Dir" ]]; then
mkdir "$Temp_Dir"
fi
# On transforme le nom de l'imprimante
log_action_begin_msg "Recherche des pilotes"
Printer_Name=$(echo "$Model_Name" | sed -e 's/-//')
# 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
Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
if [[ "$Lnk" ]]; then
Printer_Info="$Url_Inf/$Lnk"
echo "# Link to : $Printer_Info" &>> "$Logfile"
fi
echo "# Fichier d'informations : $Printer_Info" &>> "$Logfile"
# 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)
;;
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 inconnue: $Arch" &>> "$Logfile"
;;
esac
if [[ -n "$Scanner_Drv_Deb" ]]; then
echo "# Téléchargement du paquet : $Udev_Deb" &>> "$Logfile"
log_action_begin_msg "Téléchargement du paquet : $Udev_Deb"
wget -cP "$Temp_Dir" "$Udev_Deb_Url" &>> "$Logfile"
log_action_end_msg $?
fi
for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb"; do
# On ajoute la liste des pilotes trouvés au fichier de journalisation
if [[ -n "$pkg" ]]; then
echo " - Paquet trouvé : $pkg" &>> "$Logfile"
log_action_end_msg 0
# On télécharge les pilotes trouvés
Url_Deb="$Url_Pkg"/"$pkg"
echo &>> "$Logfile"
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 $?
fi
done
}
###############################
# 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 le paquet multiarch-support est installé et on l'installe le cas échéant (Ubuntu 64-bits seulement)
if [[ "$Arch" == "x86_64" ]]; then
log_action_begin_msg "Recherche du paquet 'multiarch-support' sur votre système"
if dpkg -s multiarch-support &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'multiarch-support' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
echo " - Paquet 'multiarch-support' non installé" &>> "$Logfile"
apt-get install -qq multiarch-support &>> "$Logfile"
log_action_end_msg $?
fi
log_action_begin_msg "Recherche du paquet 'lib32stdc++6' sur votre système"
if dpkg -s lib32stdc++6 &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'lib32stdc++6' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
echo " - Paquet 'lib32stdc++6' non installé" &>> "$Logfile"
apt-get install -qq lib32stdc++6 &>> "$Logfile"
log_action_end_msg $?
fi
fi
# On vérifie que le paquet cups est installé et on l'installe le cas échéant
log_action_begin_msg "Recherche du paquet 'cups' sur votre système"
if dpkg -s cups &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'cups' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
apt-get install -qq cups &>> "$Logfile"
log_action_end_msg $?
fi
# Si un pilote pour le scanner a été trouvé on vérifie que sane-utils est installé
if [[ -n $Scanner_Deb ]]; then
log_action_begin_msg "Recherche du paquet 'sane-utils' sur votre système"
if dpkg -s sane-utils &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'sane-utils' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
echo " - Paquet 'sane-utils' non installé" &>> "$Logfile"
apt-get install -qq sane-utils &>> "$Logfile"
log_action_end_msg $?
fi
# On vérifie que libusb-0.1-4:i386 est installé
if [[ $Connection == "USB" ]]; then
log_action_begin_msg "Recherche du paquet 'libusb-0.1-4' sur votre système"
if dpkg -s libusb-0.1-4 &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'libusb-0.1-4' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
echo " - Paquet 'libusb-0.1-4' non installé" &>> "$Logfile"
apt-get install -qq libusb-0.1-4 &>> "$Logfile"
log_action_end_msg $?
fi
fi
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
log_action_begin_msg "Recherche du paquet 'csh' sur votre système"
if [[ ! -x /bin/csh ]]; then
log_action_end_msg 1
apt-get install -qq csh &>> "$Logfile"
log_action_end_msg "$?"
else
echo " - Paquet 'csh' deja installé" &>> "$Logfile"
fi
fi
done
# On vérifie que le dossier /usr/share/cups/model existe et on le crée le cas échéant
log_action_begin_msg "Recherche du dossier '/usr/share/cups/model' sur votre système"
if [[ -d /usr/share/cups/model ]]; then
log_action_begin_msg "Le dossier '/usr/share/cups/model' existe deja"
log_action_end_msg $?
else
log_action_end_msg 1
log_action_begin_msg "Creation du dossier '/usr/share/cups/model'"
mkdir -pv /usr/share/cups/model &>> "$Logfile"
log_action_end_msg $?
fi
# On vérifie que le dossier /var/spool/lpd existe et on le crée le cas échéant
log_action_begin_msg "Recherche du dossier '/var/spool/lpd' sur votre système"
if [[ -d /var/spool/lpd ]]; then
log_action_begin_msg "Le dossier '/var/spool/lpd' existe deja"
log_action_end_msg $?
else
log_action_end_msg 1
log_action_begin_msg "Creation du dossier '/var/spool/lpd'"
mkdir -pv /var/spool/lpd &>> "$Logfile"
log_action_end_msg $?
fi
# 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
log_action_begin_msg "Recherche du lien symbolique '/etc/init.d/lpd ~> /etc/init.d/cups' sur votre système"
if [[ -L /etc/init.d/lpd ]]; then
log_action_end_msg 0
else
log_action_end_msg 1
log_action_begin_msg "Creation du lien symbolique '/etc/init.d/lpd ~> /etc/init.d/cups'"
ln -s /etc/init.d/cups /etc/init.d/lpd
# On crée un lien symbolique vers cups.service si systemd est utilisé
if [[ -L /sbin/init ]]; then
ln -s /lib/systemd/system/cups.service /lib/systemd/system/lpd.service
systemd-daemon reload
fi
log_action_end_msg $?
fi
fi
done
}
############################
# INSTALLATION DES PAQUETS #
############################
do_install_drivers() {
echo -e "$Blue Installation des pilotes $Resetcolor"
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 &>> "$Logfile"
echo "# Installation par 'dpkg' du paquet : $pkg" &>> "$Logfile"
dpkg -i --force-all "$Temp_Dir/$pkg" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
#################################
# CONFIGURATION DE L'IMPRIMANTE #
#################################
do_configure_printer() {
echo -e "$Blue Configuration de l'imprimante $Resetcolor"
# On recherche un fichier ppd
log_action_begin_msg "Recherche d'un fichier PPD sur votre système"
echo &>> "$Logfile"
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"
fi
done
fi
echo " - Fichier PPD : $Ppd_File" &>> "$Logfile"
log_action_end_msg 0
# On ajoute une nouvelle imprimante
log_action_begin_msg "Ajout de l'imprimante $Model_Name"
echo &>> "$Logfile"
echo "# Ajout de l'imprimante $Model_Name" &>> "$Logfile"
echo " - Backup du fichier /etc/cups/printers.conf.O" &>> "$Logfile"
cp /etc/cups/printers.conf.O "$Dir" &>> "$Logfile"
echo " - Arret du service CUPS" &>> "$Logfile"
systemctl stop cups &>> "$Logfile"
echo " - Restauration du fichier printers.conf" &>> "$Logfile"
cp "$Dir"/printers.conf.O /etc/cups/printers.conf &>> "$Logfile"
echo " - Redémarrage du service CUPS" &>> "$Logfile"
systemctl restart cups &>> "$Logfile"
case "$Connection" in
"USB")
sleep 2 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
;;
"Réseau")
sleep 2 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
;;
esac
log_action_end_msg $?
echo " - Restauration du fichier printers.conf.O" &>> "$Logfile"
cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O &>> "$Logfile"
}
############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
if [[ -n "$Scanner_Deb" ]]; then
echo -e "$Blue Configuration du scanner $Resetcolor"
echo &>> "$Logfile"
echo "# Configuration du scanner" &>> "$Logfile"
if [[ $Connection == "USB" ]]; then
# On ajoute une entrée au fichier udev
if [[ ! $(grep "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules") ]]; then
echo "Adding ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" to "$Udev_Rules" &>> "$Logfile"
sed -i "/LABEL=\"libsane_usb_rules_begin\"/a\
\n# Brother\nATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
else
echo "Règle udev trouvée dans le fichier $Udev_Rules" &>> "$Logfile"
fi
# On recharge les règles udev
udevadm control --reload
elif [[ $Connection == "Réseau" ]]; then
log_action_begin_msg "Configuration du scanner réseau"
if [[ -x /usr/bin/brsaneconfig ]]; then
brsaneconfig -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
elif [[ -x /usr/bin/brsaneconfig2 ]]; then
brsaneconfig2 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
elif [[ -x /usr/bin/brsaneconfig3 ]]; then
brsaneconfig3 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
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"
fi
log_action_end_msg $?
fi
# On copie les bibliotheques
if [[ "$Arch" == "x86_64" ]] && [[ -d $Lib_Dir ]]; then
log_action_begin_msg "Copie des bibliotheques nécessaires"
if [[ -e /usr/bin/brsaneconfig ]]; then
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$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
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
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
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
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
else
log_action_end_msg 1
echo -e "$Red No config binary found. $Resetcolor"
fi
fi
fi
}
#################
# FIN DU SCRIPT #
#################
do_clean() {
# 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_download_drivers
do_check_prerequisites
do_install_drivers
do_configure_printer
do_configure_scanner
do_clean
Dernière modification par iznobe (Le 03/08/2025, à 00:31)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#27 Le 03/08/2025, à 01:16
- eric63
Re : remise au gout du jour du script de demonipuch imprimante brother
ok plus de problème et choix accessible pour usb et reseau
Kubuntu 25.04 wayland Plasma 6.4.3 KDE Qt 6.8.3 noyau 6.14.0-24 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script demonipuch
J’utilise le clavier LDLC AFNOR
Hors ligne
#28 Le 03/08/2025, à 01:42
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
select connection in USB Réseau
do
if (( connection == 2 )) #dans tout le reste du script il faudra tester 1=USB et 2=reseau
then
echo "warning IP fixe"
read IP
fi
break
done
?
éventuellement
connections=( [1]=USB [2]=Réseau )
connection=${connections[connection]} # pour ne pas avoir à tester 1 ou 2
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#29 Le 03/08/2025, à 05:11
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
tiens !
dans l'actualité, pense
« sous-marin caché »
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#30 Le 03/08/2025, à 09:16
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Ajout d' une fonction de vérification de la validité de l' adresse IP entrée .
pour le type de connexion de l' imprimante , je ne sais pas trop encore comment mettre ça en place .
Après il me semble qu ' en l' état actuel , ce n' est pas si mal :
par défaut , c' est vide , il demande type de connexion .
si on met "1" en 2eme paramètre à la commande , alors il demande l' IP et considère ( normal puisque prévu pour ) que c' est une connexion reseau .
si on met un 3eme paramètre à la commande , alors il ne demande rien ( tant que l' IP est valide ) .
#!/bin/bash
# Script d'installation pour imprimantes Brother
. /lib/lsb/init-functions
valid_ip() {
local ip=$1
local retour=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[ "${ip[0]}" -le 255 ] && [ "${ip[1]}" -le 255 ] && [ "${ip[2]}" -le 255 ] && [ "${ip[3]}" -le 255 ]
retour=$?
fi
return $retour
}
control_ip() {
if ( (valid_ip "$IP") ); then
if ping -c2 "$IP"; then
echo "# Adresse IP : $IP" &>> "$Logfile"
else
unset IP
fi
else
unset IP
fi
}
Model_Name="$1"
if [ -n "$2" ] && [ "$2" = "1" ]; then
Connection="Réseau"
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="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^^}
# 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
echo "# Ubuntu Codename : $Codename" &>> "$Logfile"
echo "# Architecture : $Arch" &>> "$Logfile"
echo "# Modèle de l'imprimante : $Model_Name" &>> "$Logfile"
echo "# Type de connexion : $Connection" &>> "$Logfile"
echo "# Repertoire courant : $Dir" &>> "$Logfile"
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
Printer_Name=$(echo "$Model_Name" | sed -e 's/-//')
# 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
Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
if [[ "$Lnk" ]]; then
Printer_Info="$Url_Inf/$Lnk"
echo "# Link to : $Printer_Info" &>> "$Logfile"
fi
echo "# Fichier d'informations : $Printer_Info" &>> "$Logfile"
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
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)
;;
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 inconnue: $Arch" &>> "$Logfile"
;;
esac
if [[ -n "$Scanner_Drv_Deb" ]]; then
echo "# Téléchargement du paquet : $Udev_Deb" &>> "$Logfile"
log_action_begin_msg "Téléchargement du paquet : $Udev_Deb"
wget -cP "$Temp_Dir" "$Udev_Deb_Url" &>> "$Logfile"
log_action_end_msg $?
fi
for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_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
Url_Deb="$Url_Pkg"/"$pkg"
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 $?
fi
done
echo " " &>> "$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 le paquet multiarch-support est installé et on l'installe le cas échéant (Ubuntu 64-bits seulement)
if [[ "$Arch" == "x86_64" ]]; then
log_action_begin_msg "Recherche du paquet 'multiarch-support' sur votre système"
if dpkg -s multiarch-support &>/dev/null; then
echo " - Paquet 'multiarch-support' deja installé" &>> "$Logfile"
log_action_end_msg $?
else
echo " - Paquet 'multiarch-support' non installé" &>> "$Logfile"
apt-get install -qq multiarch-support &>> "$Logfile"
log_action_end_msg $?
fi
log_action_begin_msg "Recherche du paquet 'lib32stdc++6' sur votre système"
if dpkg -s lib32stdc++6 &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'lib32stdc++6' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
echo " - Paquet 'lib32stdc++6' non installé" &>> "$Logfile"
apt-get install -qq lib32stdc++6 &>> "$Logfile"
log_action_end_msg $?
fi
fi
# On vérifie que le paquet cups est installé et on l'installe le cas échéant
log_action_begin_msg "Recherche du paquet 'cups' sur votre système"
if dpkg -s cups &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'cups' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
apt-get install -qq cups &>> "$Logfile"
log_action_end_msg $?
fi
# Si un pilote pour le scanner a été trouvé on vérifie que sane-utils est installé
if [[ -n $Scanner_Deb ]]; then
log_action_begin_msg "Recherche du paquet 'sane-utils' sur votre système"
if dpkg -s sane-utils &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'sane-utils' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
echo " - Paquet 'sane-utils' non installé" &>> "$Logfile"
apt-get install -qq sane-utils &>> "$Logfile"
log_action_end_msg $?
fi
# On vérifie que libusb-0.1-4:i386 est installé
if [[ $Connection == "USB" ]]; then
log_action_begin_msg "Recherche du paquet 'libusb-0.1-4' sur votre système"
if dpkg -s libusb-0.1-4 &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'libusb-0.1-4' deja installé" &>> "$Logfile"
else
log_action_end_msg 1
echo " - Paquet 'libusb-0.1-4' non installé" &>> "$Logfile"
apt-get install -qq libusb-0.1-4 &>> "$Logfile"
log_action_end_msg $?
fi
fi
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
log_action_begin_msg "Recherche du paquet 'csh' sur votre système"
if [[ ! -x /bin/csh ]]; then
log_action_end_msg 1
apt-get install -qq csh &>> "$Logfile"
log_action_end_msg "$?"
else
echo " - Paquet 'csh' deja installé" &>> "$Logfile"
fi
fi
done
# On vérifie que le dossier /usr/share/cups/model existe et on le crée le cas échéant
log_action_begin_msg "Recherche du dossier '/usr/share/cups/model' sur votre système"
if [[ -d /usr/share/cups/model ]]; then
log_action_begin_msg "Le dossier '/usr/share/cups/model' existe deja"
log_action_end_msg $?
else
log_action_end_msg 1
log_action_begin_msg "Creation du dossier '/usr/share/cups/model'"
mkdir -pv /usr/share/cups/model &>> "$Logfile"
log_action_end_msg $?
fi
# On vérifie que le dossier /var/spool/lpd existe et on le crée le cas échéant
log_action_begin_msg "Recherche du dossier '/var/spool/lpd' sur votre système"
if [[ -d /var/spool/lpd ]]; then
log_action_begin_msg "Le dossier '/var/spool/lpd' existe deja"
log_action_end_msg $?
else
log_action_end_msg 1
log_action_begin_msg "Creation du dossier '/var/spool/lpd'"
mkdir -pv /var/spool/lpd &>> "$Logfile"
log_action_end_msg $?
fi
# 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
log_action_begin_msg "Recherche du lien symbolique '/etc/init.d/lpd ~> /etc/init.d/cups' sur votre système"
if [[ -L /etc/init.d/lpd ]]; then
log_action_end_msg 0
else
log_action_end_msg 1
log_action_begin_msg "Creation du lien symbolique '/etc/init.d/lpd ~> /etc/init.d/cups'"
echo "Creation du lien symbolique '/etc/init.d/lpd ~> /etc/init.d/cups'" &>> "$Logfile"
ln -s /etc/init.d/cups /etc/init.d/lpd
# On crée un lien symbolique vers cups.service si systemd est utilisé
if [[ -L /sbin/init ]]; then
ln -s /lib/systemd/system/cups.service /lib/systemd/system/lpd.service
systemd-daemon reload
fi
log_action_end_msg $?
fi
fi
done
echo " " &>> "$Logfile"
}
############################
# INSTALLATION DES PAQUETS #
############################
do_install_drivers() {
echo -e "$Blue Installation des pilotes $Resetcolor"
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"
# 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" &>> "$Logfile"
echo " - Backup du fichier /etc/cups/printers.conf.O" &>> "$Logfile"
cp /etc/cups/printers.conf.O "$Dir" &>> "$Logfile"
echo " - Arret du service CUPS" &>> "$Logfile"
systemctl stop cups &>> "$Logfile"
echo " - Restauration du fichier printers.conf" &>> "$Logfile"
cp "$Dir"/printers.conf.O /etc/cups/printers.conf &>> "$Logfile"
echo " - Redémarrage du service CUPS" &>> "$Logfile"
systemctl restart cups &>> "$Logfile"
case "$Connection" in
"USB")
sleep 2 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
;;
"Réseau")
sleep 2 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
;;
esac
log_action_end_msg $?
echo " - Restauration du fichier printers.conf.O" &>> "$Logfile"
cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O &>> "$Logfile"
echo " " &>> "$Logfile"
}
############################
# CONFIGURATION DU SCANNER #
############################
do_configure_scanner() {
#echo " " &>> "$Logfile"
echo -e "$Blue Configuration du scanner $Resetcolor"
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 udev
if [[ ! $(grep "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules") ]]; then
echo "Adding ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" to "$Udev_Rules" &>> "$Logfile"
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
else
echo " - Règle udev trouvée dans le fichier $Udev_Rules" &>> "$Logfile"
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"
elif [[ -x /usr/bin/brsaneconfig2 ]]; then
brsaneconfig2 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
elif [[ -x /usr/bin/brsaneconfig3 ]]; then
brsaneconfig3 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
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"
elif [[ -x /usr/bin/brsaneconfig5 ]]; then
# ??????????????
echo
fi
log_action_end_msg $?
fi
# On copie les bibliotheques
if [[ "$Arch" == "x86_64" ]] && [[ -d $Lib_Dir ]]; then
if [[ -e /usr/bin/brsaneconfig ]]; then
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
ln -sf libbrscandec2.so.1 libbrscandec2.so
cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
ln -sf libbrcolm2.so.1 libbrcolm2.so
cd "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
ln -sf libbrscandec3.so.1 libbrscandec3.so
cd "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
cd "$Lib_Dir"/sane || exit
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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
cd "$Lib_Dir"/sane || exit
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
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
# 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_download_drivers
do_check_prerequisites
do_install_drivers
do_configure_printer
do_configure_scanner
do_clean
ce n' est certes pas parfait , mais c' est tout de meme largement mieux que ce que c' etait au depart .
Reste à tester à " grande echelle " .
PS : pour des raisons de test , j ' ai remis les logs en version originale , cela permet d ' avoir le log toujours dans le meme fichier , plus pratique pour les tests .
je remodifierai pour avoir un log " temporel " en version finale .
Dernière modification par iznobe (Le 03/08/2025, à 11:56)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#31 Le 03/08/2025, à 10:48
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
par défaut , c' est vide
select ne devrait pas permettre ça.
ce n'est pas si simple de tester une IP; le mieux c'est de vérifier que l'IP est joignable.
-le 255, alors -1 est valide, mais pas dans une IP.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#32 Le 03/08/2025, à 11:49
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
par défaut , c' est vide
select ne devrait pas permettre ça.
ce n'est pas si simple de tester une IP; le mieux c'est de vérifier que l'IP est joignable.
-le 255, alors -1 est valide, mais pas dans une IP.
par defaut , c' est le comportement voulu , de façon a proposer a l' utilisateur d' entrer son choix .
ping permet de verfier si une ip est joignable .
pour ta derniere remarque je vois sur le net que :
INT1 -le INT2 Vrai si INT1 est inférieur ou égal à INT2 (<=)
la regex de la fonction , elimine de toute maniere les nombres autres que 0 à 9 , donc aucun soucis ...
PS : j ' ai modifié le code du message precedent pour y ajouter une autre fonction qui controle que l' ip est joignable .
Dernière modification par iznobe (Le 03/08/2025, à 11:57)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#33 Le 03/08/2025, à 12:22
- eric63
Re : remise au gout du jour du script de demonipuch imprimante brother
j’ai utilisé la version 5 en usb et réseau aucun problème
Kubuntu 25.04 wayland Plasma 6.4.3 KDE Qt 6.8.3 noyau 6.14.0-24 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script demonipuch
J’utilise le clavier LDLC AFNOR
Hors ligne
#34 Le 03/08/2025, à 12:33
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
par defaut , c' est le comportement voulu , de façon a proposer a l' utilisateur d' entrer son choix .
alors pas de problème.
"par défaut", signifie "défini sans intervention", c'est à dire «a une valeur» avant d'être modifié par l'utilisteur.
ping permet de verfier si une ip est joignable .
non. ce n'est pas aussi facile. sftw. il vaut mieux tester que le serveur est en ligne.
cf. ton edit : pas vu.
sois sûr de ce que tu testes : des nombres, des regex, du texte... une variable définie( ou pas) vide...ou pas...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#35 Le 03/08/2025, à 14:19
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Bien que le code ait l' air pas trop mal , il doit rester des améliorations possible .
Cependant , il me reste un soucis , je ne sais pas quoi mettre dans le " elif " de la ligne 427 ... alors que pour celui de la ligne 484 j ' ai pu trouver facilement .
reste a voir pour le problème soulevé par @eric63 , ainsi que pour libsane/libsane1 ... pour ce dernier , peut etre en ajoutant un lien supplémentaire ?
Dernière modification par iznobe (Le 03/08/2025, à 14:21)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#36 Le 03/08/2025, à 15:18
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
ping permet de verfier si une ip est joignable .
il y a des faux négatifs, parce que un serveur peut refuser les pings; renseigne-toi encore : un ping n'est pas suffisant.
il doit rester des améliorations possible
je confirme.
mais tu progresses*, c'est bien.
--
* en m'écoutant, continue
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#37 Le 03/08/2025, à 16:19
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
il y a des faux négatifs, parce que un serveur peut refuser les pings; renseigne-toi encore : un ping n'est pas suffisant.
oui , d' accord , mais là on est sur une imprimante ( censée etre en reseau local ) , le script n' a pas vocation a faire du pro / distant ( et n ' est pas fait pour gerer des serveurs dont le ping serait désactivé ! ) , dans le cas basique ennoncé , cela me semble pas si mal comme mesure de validation d' IP / accessibilité .
quelques modifications / ajouts mineurs / harmonisation sortie terminal et fichier log :
#!/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() {
local ip=$1
local retour=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[ "${ip[0]}" -le 255 ] && [ "${ip[1]}" -le 255 ] && [ "${ip[2]}" -le 255 ] && [ "${ip[3]}" -le 255 ]
retour=$?
fi
return $retour
}
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
}
Model_Name="$1"
if [ -n "$2" ] && [ "$2" = "1" ]; then
Connection="Réseau"
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="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^^}
# 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
echo "# Ubuntu Codename : $Codename" &>> "$Logfile"
echo "# Architecture : $Arch" &>> "$Logfile"
echo "# Modèle de l'imprimante : $Model_Name" &>> "$Logfile"
echo "# Type de connexion : $Connection" &>> "$Logfile"
echo "# Repertoire courant : $Dir" &>> "$Logfile"
echo "# Repertoire de telechargement des pilotes : $Temp_Dir" &>> "$Logfile"
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
Printer_Name=$(echo "$Model_Name" | sed -e 's/-//')
# 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
Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
if [[ "$Lnk" ]]; then
Printer_Info="$Url_Inf/$Lnk"
echo "# Link to : $Printer_Info" &>> "$Logfile"
fi
echo "# Fichier d'informations : $Printer_Info" &>> "$Logfile"
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"; 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
if [[ ! -f "$Temp_Dir"/"$pkg" ]]; then
Url_Deb="$Url_Pkg"/"$pkg"
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
if [[ -n "$Scanner_Drv_Deb" ]]; then
if [[ ! -f "$Temp_Dir"/"$Udev_Deb" ]]; then
echo "# Téléchargement du paquet : $Udev_Deb" &>> "$Logfile"
log_action_begin_msg "Téléchargement du paquet : $Udev_Deb"
wget -cP "$Temp_Dir" "$Udev_Deb_Url" &>> "$Logfile"
log_action_end_msg $?
else
log_action_begin_msg "Le paquet : $Udev_Deb a deja été telechargé"
log_action_end_msg 0
fi
fi
echo " " &>> "$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 le paquet multiarch-support est installé et on l'installe le cas échéant (Ubuntu 64-bits seulement)
if [[ "$Arch" == "x86_64" ]]; then
log_action_begin_msg "Recherche du paquet 'multiarch-support' sur votre système"
if dpkg -s multiarch-support &>/dev/null; then
echo " - Paquet 'multiarch-support' deja installé" &>> "$Logfile"
log_action_end_msg 0
else
echo " - Paquet 'multiarch-support' non installé" &>> "$Logfile"
apt-get install -qq multiarch-support &>> "$Logfile"
log_action_end_msg 1
fi
log_action_begin_msg "Recherche du paquet 'lib32stdc++6' sur votre système"
if dpkg -s lib32stdc++6 &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'lib32stdc++6' deja installé" &>> "$Logfile"
else
echo " - Paquet 'lib32stdc++6' non installé" &>> "$Logfile"
apt-get install -qq lib32stdc++6 &>> "$Logfile"
log_action_end_msg $?
fi
fi
# On vérifie que le paquet cups est installé et on l'installe le cas échéant
log_action_begin_msg "Recherche du paquet 'cups' sur votre système"
if dpkg -s cups &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'cups' deja installé" &>> "$Logfile"
else
apt-get install -qq cups &>> "$Logfile"
log_action_end_msg $?
fi
# Si un pilote pour le scanner a été trouvé on vérifie que sane-utils est installé
if [[ -n $Scanner_Deb ]]; then
log_action_begin_msg "Recherche du paquet 'sane-utils' sur votre système"
if dpkg -s sane-utils &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'sane-utils' deja installé" &>> "$Logfile"
else
echo " - Paquet 'sane-utils' non installé" &>> "$Logfile"
apt-get install -qq sane-utils &>> "$Logfile"
log_action_end_msg $?
fi
# On vérifie que libusb-0.1-4:i386 est installé
if [[ $Connection == "USB" ]]; then
log_action_begin_msg "Recherche du paquet 'libusb-0.1-4' sur votre système"
if dpkg -s libusb-0.1-4 &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'libusb-0.1-4' deja installé" &>> "$Logfile"
else
echo " - Paquet 'libusb-0.1-4' non installé" &>> "$Logfile"
apt-get install -qq libusb-0.1-4 &>> "$Logfile"
log_action_end_msg $?
fi
fi
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
log_action_begin_msg "Recherche du paquet 'csh' sur votre système"
if dpkg -s csh &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'csh' deja installé" &>> "$Logfile"
else
echo " - Paquet 'csh' non installé" &>> "$Logfile"
apt-get install -qq csh &>> "$Logfile"
log_action_end_msg $?
fi
fi
done
# On vérifie que le dossier /usr/share/cups/model existe et on le crée le cas échéant
log_action_begin_msg "Recherche du dossier '/usr/share/cups/model' sur votre système"
if [[ -d /usr/share/cups/model ]]; then
log_action_end_msg 0
else
log_action_begin_msg "Creation du dossier '/usr/share/cups/model'"
mkdir -pv /usr/share/cups/model &>> "$Logfile"
log_action_end_msg $?
fi
# On vérifie que le dossier /var/spool/lpd existe et on le crée le cas échéant
log_action_begin_msg "Recherche du dossier '/var/spool/lpd' sur votre système"
if [[ -d /var/spool/lpd ]]; then
log_action_end_msg 0
else
log_action_begin_msg "Creation du dossier '/var/spool/lpd'"
mkdir -pv /var/spool/lpd &>> "$Logfile"
log_action_end_msg $?
fi
# 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
log_action_begin_msg "Recherche du lien symbolique '/etc/init.d/lpd ~> /etc/init.d/cups' sur votre système"
if [[ -L /etc/init.d/lpd ]]; then
log_action_end_msg 0
else
log_action_begin_msg "Creation du lien symbolique '/etc/init.d/lpd ~> /etc/init.d/cups'"
ln -sfv /etc/init.d/cups /etc/init.d/lpd &>> "$Logfile"
log_action_end_msg $?
# On crée un lien symbolique vers cups.service si systemd est utilisé
if [[ -L /sbin/init ]]; then
ln -sfv /lib/systemd/system/cups.service /lib/systemd/system/lpd.service &>> "$Logfile"
log_action_end_msg $?
#systemd-daemon reload &>> "$Logfile"
systemctl daemon-reload &>> "$Logfile"
fi
fi
fi
done
echo " " &>> "$Logfile"
}
############################
# INSTALLATION DES PAQUETS #
############################
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" &>> "$Logfile"
echo " - Backup du fichier /etc/cups/printers.conf.O" &>> "$Logfile"
cp /etc/cups/printers.conf.O "$Dir" &>> "$Logfile"
echo " - Arret du service CUPS" &>> "$Logfile"
systemctl stop cups &>> "$Logfile"
echo " - Restauration du fichier printers.conf" &>> "$Logfile"
cp "$Dir"/printers.conf.O /etc/cups/printers.conf &>> "$Logfile"
echo " - Redémarrage du service CUPS" &>> "$Logfile"
systemctl restart cups &>> "$Logfile"
case "$Connection" in
"USB")
sleep 2 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
;;
"Réseau")
sleep 2 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
;;
esac
log_action_end_msg $?
echo " - Restauration du fichier printers.conf.O" &>> "$Logfile"
cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O &>> "$Logfile"
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 udev
if [[ ! $(grep "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules") ]]; then
echo "Adding ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" to "$Udev_Rules" &>> "$Logfile"
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
else
echo " - Règle udev trouvée dans le fichier $Udev_Rules" &>> "$Logfile"
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"
elif [[ -x /usr/bin/brsaneconfig2 ]]; then
brsaneconfig2 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
elif [[ -x /usr/bin/brsaneconfig3 ]]; then
brsaneconfig3 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
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"
elif [[ -x /usr/bin/brsaneconfig5 ]]; then
# ??????????????
brsaneconfig5 -a name=SCANNER model= "$Model_Name" ip="$IP" &>> "$Logfile"
fi
log_action_end_msg $?
fi
# On copie les bibliotheques
if [[ "$Arch" == "x86_64" ]] && [[ -d $Lib_Dir ]]; then
if [[ -e /usr/bin/brsaneconfig ]]; then
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
ln -sf libbrscandec2.so.1 libbrscandec2.so
cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
ln -sf libbrcolm2.so.1 libbrcolm2.so
cd "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
ln -sf libbrscandec3.so.1 libbrscandec3.so
cd "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
cd "$Lib_Dir"/sane || exit
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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
cd "$Lib_Dir"/sane || exit
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
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_download_drivers
do_check_prerequisites
do_install_drivers
do_configure_printer
do_configure_scanner
do_clean
je pense avoir fait le tour " rapidement " de ce que j' ai vu de flagrant de façon a obtenir un truc a peu pres fiable .
j ' attends les remontées des intervenants / utilisateurs quelques jours , et je mettrai a disposition en lien sur le github plus tard ?
Dernière modification par iznobe (Le 03/08/2025, à 23:54)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#38 Le 03/08/2025, à 21:54
- eric63
Re : remise au gout du jour du script de demonipuch imprimante brother
@boursicot avait justement ce problème avant de lui faire installer cette lib
oups je me suis trompé c’est smooth la bonne personne, je l’ai contacté on va voir s’il répond
Kubuntu 25.04 wayland Plasma 6.4.3 KDE Qt 6.8.3 noyau 6.14.0-24 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script demonipuch
J’utilise le clavier LDLC AFNOR
Hors ligne
#39 Le 03/08/2025, à 23:43
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
As tu le lien de la discussion ?
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#40 Hier à 08:35
- eric63
Re : remise au gout du jour du script de demonipuch imprimante brother
oui c’est là
Kubuntu 25.04 wayland Plasma 6.4.3 KDE Qt 6.8.3 noyau 6.14.0-24 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script demonipuch
J’utilise le clavier LDLC AFNOR
Hors ligne
#41 Hier à 12:32
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Salut , ok et merci .
je viens de verifier sur ma 24.04 , la libusb n ' est installé que pour x64 :
iznobe@iznobe-pc:~$ apt policy libusb-0.1-4:i386
libusb-0.1-4:i386:
Installé : (aucun)
Candidat : 2:0.1.12-35build1
Table de version :
2:0.1.12-35build1 500
500 http://fr.archive.ubuntu.com/ubuntu noble/main i386 Packages
iznobe@iznobe-pc:~$ apt policy libusb-0.1-4
libusb-0.1-4:
Installé : 2:0.1.12-35build1
Candidat : 2:0.1.12-35build1
Table de version :
*** 2:0.1.12-35build1 500
500 http://fr.archive.ubuntu.com/ubuntu noble/main amd64 Packages
100 /var/lib/dpkg/status
iznobe@iznobe-pc:~$
je vais modifier le script en consequence .
Par contre , dans quel cas faut il l ' installer ?
tous les cas ?
seulement pour un scanner en USB dont les paquets pilotes sont eux aussi en :i386 ?
autre ?
PS : actuellement ( par demonipuch , bien que bugué ... ) , c' est prévu de l' installer uniquement dans le cas ou un scanner en connextion de type USB sera installé .
Dernière modification par iznobe (Hier à 12:38)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#42 Hier à 13:22
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Bon , j ' ai modifié pour une meilleure évolution du code et simplification . cette fois , cela fonctionne correctement .
Dernière modification par iznobe (Hier à 14:25)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#43 Hier à 13:28
- eric63
Re : remise au gout du jour du script de demonipuch imprimante brother
Par contre , dans quel cas faut il l ' installer ?
tous les cas ?
seulement pour un scanner en USB dont les paquets pilotes sont eux aussi en :i386 ?
autre ?
Ça je ne sais pas trop, n’ayant jamais pu savoir d’où venait le problème réellement
cela tient parfois aux paquets disponibles suivant l’imprimante; normalement il y a une version 32 et 64bits pour chaque type de paquets mais c’est pas systématique.
j’avais pas fait attention que le script de demonipuch le prévoyait uniquement pour l’usb mais j’avais envoyé une demande pour qu’il prenne en compte la libusb:i386 à un moment parce que ce n’étais pas prévu du tout au départ cette lib en 32bits
Dans la plupart des cas que j’ai croisé, avoir les 2 versions de la lib résolvait le problème (les cas les plus problématiques se posaient avec le paquet brscan3 . Pas eut affaire avec les brscan1 et 2)
Donc je dirais que de mettre les deux versions 32 et 64 bits est plus crade mais plus efficace sans se prendre la tête (je peux me tromper sur les effets que ça entraîne) .
Usb et réseau peuvent cohabiter pour une même machine et même session suivant l’humeur de l’utilisateur, juste les pilotes ou l’imprimante à changer
Avant le driverless c’est ce que j‘utilisais: une imprimante par pilote.
Kubuntu 25.04 wayland Plasma 6.4.3 KDE Qt 6.8.3 noyau 6.14.0-24 Asus B760+D4 i5-12400F 4.4Ghz DDR4 32Go nvidia RTX 3060 12GB
Utilisez les drivers libres avant d’ installer une brother avec le script demonipuch
J’utilise le clavier LDLC AFNOR
Hors ligne
#44 Hier à 14:05
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ok , je verrais donc à l ' usage , merci @eric63 .
@watael : je viens de creer une fonction " simple " qui permet d' eclaircir le script , afin d' installer les paquets .
dejà , elle n ' est pas " conforme " , un coup de main serait grandement approprié pour la rendre conforme :
install_pkg() {
if [[ -n "$1" ]]; then local pkg1="$1"; else unset pkg1; fi
if [[ -n "$2" ]]; then local pkg2="$2"; else unset pkg2; fi
if [[ -n "$3" ]]; then local pkg3="$3"; else unset pkg3; fi
if [[ -n "$4" ]]; then local pkg4="$4"; else unset pkg4; fi
if [[ -n "$5" ]]; then local pkg5="$5"; else unset pkg5; fi
for pkg in "$pkg1" "$pkg2" "$pkg3" "$pkg4" "$pkg5"; 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
}
ce qui produit dans le cas ou les variables ne sont pas au nombre de 5 des :
* Installation du paquet : ' ' sur votre système...
je me demandais , si en ajoutant un dernier ( ou 1er paramètre plutôt , puisqu ' on ne connaît pas le nombre de paramètres total au départ ) on pourrait l' étendre de façon a installer aussi les pilotes .
Actuellement le code pour installer les pilotes est celui-ci :
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"
}
grosso modo , la principale différence est l ' utilisation de " dpkg --force " à la place de " apt " .
pour le reste , je m' arrangerais .
on pourrait utiliser " dpkg --force " partout , et finir par un " apt install -f " ? moins " propre " certes , mais plus simple et plus rapide non ?
Dernière modification par iznobe (Hier à 14:10)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#45 Hier à 14:19
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ok , j ' ai trouve :
install_pkg() {
declare -a tab=($1 $2 $3 $4 $5 $6 $7 $8 $9 $10)
#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
}
reste plus qu ' a voir si on peut " étendre " la fonction à l ' installation des pilotes , j ' avoue que pour mla part je ne vois pas trop comment m ' y prendre pour le moment .
voir fin message précédent . Apres ce n' est pas indispensable
Dernière modification par iznobe (Hier à 14:22)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#46 Hier à 14:45
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
shellcheck me dit :
Line 8:
. /lib/lsb/init-functions
^-- SC1091 (info): Not following: /lib/lsb/init-functions was not specified as input (see shellcheck -x).
Line 75:
date=$(date +%F_%T)
^-- SC2034 (warning): date appears unused. Verify use (or export if used externally).
Line 126:
echo "# Ubuntu Codename : $Codename" &>> "$Logfile"
^-- SC2129 (style): Consider using { cmd1; cmd2; } >> file instead of individual redirects.
Line 141:
Printer_Name=$(echo "$Model_Name" | sed -e 's/-//')
^-- SC2001 (style): See if you can use ${variable//search/replace} instead.
Line 324:
for file in $(find /usr/share/cups/model -type f); do
^-- SC2044 (warning): For loops over find output are fragile. Use find -exec or a while read loop.
Line 340:
echo " - Ajout de l'imprimante $Model_Name" &>> "$Logfile"
^-- SC2129 (style): Consider using { cmd1; cmd2; } >> file instead of individual redirects.
Line 358:
echo " - Restauration du fichier printers.conf.O" &>> "$Logfile"
^-- SC2129 (style): Consider using { cmd1; cmd2; } >> file instead of individual redirects.
Line 374:
if [[ ! $(grep "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules") ]]; then
^-- SC2143 (style): Use grep -q instead of comparing output with [ -n .. ].
Y a t il moyen de " corriger les dernieres erreurs que mentionne shellcheck ?
Dernière modification par iznobe (Hier à 21:30)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#47 Hier à 21:29
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
j ' ai corrigé quelques alertes supplémentaires :
#!/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
}
Model_Name="$1"
if [ -n "$2" ] && [ "$2" = "1" ]; then
Connection="Réseau"
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="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^^}
# 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
echo "# 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" &>> "$Logfile"
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
Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
if [[ "$Lnk" ]]; then
Printer_Info="$Url_Inf/$Lnk"
echo "# Link to : $Printer_Info" &>> "$Logfile"
fi
echo "# Fichier d'informations : $Printer_Info" &>> "$Logfile"
echo " " &>> "$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
log_action_begin_msg "Recherche du paquet 'csh' sur votre système"
if dpkg -s csh &>/dev/null; then
log_action_end_msg $?
echo " - Paquet 'csh' deja installé" &>> "$Logfile"
else
echo " - Paquet 'csh' non installé" &>> "$Logfile"
log_action_end_msg 1
log_action_begin_msg "Installation du paquet : ' csh ' sur votre système"
apt-get install -qq csh &>> "$Logfile"
log_action_end_msg $?
fi
fi
done
# On vérifie que le dossier /usr/share/cups/model existe et on le crée le cas échéant
log_action_begin_msg "Recherche du dossier '/usr/share/cups/model' sur votre système"
if [[ -d /usr/share/cups/model ]]; then
log_action_end_msg 0
else
log_action_begin_msg "Creation du dossier '/usr/share/cups/model'"
mkdir -pv /usr/share/cups/model &>> "$Logfile"
log_action_end_msg $?
fi
# On vérifie que le dossier /var/spool/lpd existe et on le crée le cas échéant
log_action_begin_msg "Recherche du dossier '/var/spool/lpd' sur votre système"
if [[ -d /var/spool/lpd ]]; then
log_action_end_msg 0
else
log_action_begin_msg "Creation du dossier '/var/spool/lpd'"
mkdir -pv /var/spool/lpd &>> "$Logfile"
log_action_end_msg $?
fi
# 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
install_pkg "csh"
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"; 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
if [[ ! -f "$Temp_Dir"/"$pkg" ]]; then
Url_Deb="$Url_Pkg"/"$pkg"
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
if [[ -n "$Scanner_Drv_Deb" ]]; then
if [[ ! -f "$Temp_Dir"/"$Udev_Deb" ]]; then
echo "# Téléchargement du paquet : $Udev_Deb" &>> "$Logfile"
log_action_begin_msg "Téléchargement du paquet : $Udev_Deb"
wget -cP "$Temp_Dir" "$Udev_Deb_Url" &>> "$Logfile"
log_action_end_msg $?
else
log_action_begin_msg "Le paquet : $Udev_Deb a deja été telechargé"
log_action_end_msg 0
fi
fi
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" &>> "$Logfile"
echo " - Backup du fichier /etc/cups/printers.conf.O" &>> "$Logfile"
cp /etc/cups/printers.conf.O "$Dir" &>> "$Logfile"
echo " - Arret du service CUPS" &>> "$Logfile"
systemctl stop cups &>> "$Logfile"
echo " - Restauration du fichier printers.conf" &>> "$Logfile"
cp "$Dir"/printers.conf.O /etc/cups/printers.conf &>> "$Logfile"
echo " - Redémarrage du service CUPS" &>> "$Logfile"
systemctl restart cups &>> "$Logfile"
case "$Connection" in
"USB")
sleep 2 && lpadmin -p "$Model_Name" -E -v usb://dev/usb/lp0 -P "$Ppd_File"
;;
"Réseau")
sleep 2 && lpadmin -p "$Model_Name" -E -v lpd://"$IP"/binary_p1 -P "$Ppd_File"
;;
esac
log_action_end_msg $?
echo " - Restauration du fichier printers.conf.O" &>> "$Logfile"
cp "$Dir"/printers.conf.O /etc/cups/printers.conf.O &>> "$Logfile"
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"
elif [[ -x /usr/bin/brsaneconfig2 ]]; then
brsaneconfig2 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
elif [[ -x /usr/bin/brsaneconfig3 ]]; then
brsaneconfig3 -a name="SCANNER" model="$Model_Name" ip="$IP" &>> "$Logfile"
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"
elif [[ -x /usr/bin/brsaneconfig5 ]]; then
# ??????????????
brsaneconfig5 -a name=SCANNER model="$Model_Name" ip="$IP" &>> "$Logfile"
fi
log_action_end_msg $?
fi
# On copie les bibliotheques
if [[ "$Arch" == "x86_64" ]] && [[ -d $Lib_Dir ]]; then
if [[ -e /usr/bin/brsaneconfig ]]; then
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig"
echo " - Copie des bibliotheques nécessaires brsaneconfig" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig2"
echo " - Copie des bibliotheques nécessaires brsaneconfig2" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
ln -sf libbrscandec2.so.1 libbrscandec2.so
cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
ln -sf libbrcolm2.so.1 libbrcolm2.so
cd "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig3"
echo " - Copie des bibliotheques nécessaires brsaneconfig3" &>> "$Logfile"
cd "$Lib_Dir" || exit
cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
ln -sf libbrscandec3.so.1 libbrscandec3.so
cd "$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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig4"
echo " - Copie des bibliotheques nécessaires brsaneconfig4" &>> "$Logfile"
cd "$Lib_Dir"/sane || exit
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
log_action_begin_msg "Copie des bibliotheques nécessaires brsaneconfig5"
echo " - Copie des bibliotheques nécessaires brsaneconfig5" &>> "$Logfile"
cd "$Lib_Dir"/sane || exit
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
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
il en reste 2 a corriger :
$ shellcheck myscript
Line 8:
. /lib/lsb/init-functions
^-- SC1091 (info): Not following: /lib/lsb/init-functions was not specified as input (see shellcheck -x).
Line 325:
for file in $(find /usr/share/cups/model -type f); do
^-- SC2044 (warning): For loops over find output are fragile. Use find -exec or a while read loop.
PS : j ' ai scanné avec xsane sur mon raspberry pi en utilisant ce script ( configuration : brsaneconfig5 ) et mon imprimante DCP-L3560CDW , ca a fonctionné , deja un bon point
j ' ai ajouté un " todo " en debut de script et des commentaires " # ??????? " au milieu pour ceux / celles qui voudrait se pencher sur la question et m ' aider a finaliser ce script .
je n' ai pas trouvé comment faire pour eviter de casser les dependances avec le manque de " libsane " vu que ce paquet en 24.04 et versions superieures se nomme maintenant " libsane1 " que de supprimer le paquet brscan-skey apres coup .
je suis ouvert aux propositions / tests , modifications bien entendu
Dernière modification par iznobe (Aujourd'hui à 01:13)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#48 Hier à 21:59
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
^[0-9]{1,3}
0.1.2.3 va être validée, alors que ce n'est pas une IP possible
${ip[0]} -le 255 #${ip[X]} sont des nombres (normalement), les guillemets sont inutiles.
-12.1.2.3 va être validée, alors que ce n'est pas une IP possible.
je laisserais tomber la regex*, et simplement :
$ ip=0.456.789.123
$ IFS=. read -ra IP <<<$ip
$ for i in ${IP[@]}; do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || >&2 echo error $i; done
error 0
error 456
error 789
$ unset n
--
* j'ai déjà eu l'ocassion de faire des recherches à ce sujet, et une regex de validation d'IP est beaucoup plus compliquée que ça
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#49 Hier à 22:21
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
-12.1.2.3 va être validée, alors que ce n'est pas une IP possible.
tu as testé pour dire ?
d' apres mon test , ce n' est pas le cas :
#!/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() {
local ip=$1
local retour=1
if [[ $ip =~ ^[0-9]\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
#ip=($ip)
read -r -a ip <<< "$ip"
IFS=$OIFS
[ ${ip[0]} -le 255 ] && [ ${ip[1]} -le 255 ] && [ ${ip[2]} -le 255 ] && [ ${ip[3]} -le 255 ]
retour=$?
fi
return $retour
}
while [[ -z "$IP" ]]; do
read -rp "Entrez l'adresse IP de votre imprimante : " IP
valid_ip "$IP"
echo " IP valide = 0 , IP non valide = 1 , retour = $? "
done
echo $IP
iznobe@iznobe-pc:~$ bash ~/Scripts/testip.sh
Entrez l'adresse IP de votre imprimante : -12.1.2.3
IP valide = 0 , IP non valide = 1 , retour = 1
-12.1.2.3
iznobe@iznobe-pc:~$
Quant à :
0.1.2.3 va être validée, alors que ce n'est pas une IP possible
voilà la solution simpliste :
valid_ip() {
local ip=$1
local retour=1
if [[ $ip =~ ^[0-9]\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
#ip=($ip)
read -r -a ip <<< "$ip"
IFS=$OIFS
[ ${ip[0]} -le 255 ] && [ ${ip[0]} -ne 0 ] && [ ${ip[1]} -le 255 ] && [ ${ip[2]} -le 255 ] && [ ${ip[3]} -le 255 ]
retour=$?
fi
return $retour
}
resultat :
iznobe@iznobe-pc:~$ bash ~/Scripts/testip.sh
Entrez l'adresse IP de votre imprimante : 0.1.2.3
IP valide = 0 , IP non valide = 1 , retour = 1
0.1.2.3
iznobe@iznobe-pc:~$ bash ~/Scripts/testip.sh
Entrez l'adresse IP de votre imprimante : 1.0.0.0
IP valide = 0 , IP non valide = 1 , retour = 0
1.0.0.0
iznobe@iznobe-pc:~$
* j'ai déjà eu l'ocassion de faire des recherches à ce sujet, et une regex de validation d'IP est beaucoup plus compliquée que ça
je ne sais pas pourquoi tu focalises sur " regex " .
Dans le cas present il s' agit d ' une fonction , pas d' une regex .
Cette fonction combine une regex et des tests comparatifs . isoler la regex n ' a pas de sens vu que j' utilise la fonction , et pas la regex seule .
Sur le fond tu as tout à fait raison , et c' est bien pour cela que j' ai choisi une fonction de validation et pas un simple regex
En tout cas je te remercie d' avoir porter mon attention sur mon oublie pour le 1er bit a 0 de l ' IP .
je corrige
Dernière modification par iznobe (Hier à 22:34)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#50 Hier à 22:49
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
tu utilises une regex ET un test numérique (parce que la regex est incomplète), alors qu'un "simple" test numérique (comme celui que je montre) dans une boucle fait parfaitement le boulot tout seul.
Dernière modification par Watael (Hier à 22:49)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne