#51 Le 04/08/2025, à 22:55
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ba on pourrait faire :
valid_ip() {
local ip=$1
local retour=1
OIFS=$IFS
IFS='.'
read -r -a ip <<< "$ip"
IFS=$OIFS
[ ${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 ]
retour=$?
return $retour
}
pourquoi pas si c' est mieux ?
de cette maniere ca ne m' oblige pas à re ecrire le code , alors qu ' avec ta fonction je serais obligé de re ecrire d' autre partie du code .
Dernière modification par iznobe (Le 04/08/2025, à 23:02)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#52 Le 04/08/2025, à 22:57
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
ma boucle tient sur une ligne.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#53 Le 04/08/2025, à 23:03
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ba montre la fonction exacte
ma boucle tient sur une ligne.
ma fonction ne comporte pas de boucle => plus performant
Dernière modification par iznobe (Le 04/08/2025, à 23:07)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#54 Le 04/08/2025, à 23:20
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
ça
OIFS=$IFS
IFS='.'
read -r -a ip <<< "$ip"
IFS=$OIFS
c'est mal.
validIP()
{
local -i nbErr
IFS='.' read -ra IP <<<$1 # comme ça, c'est bien. ;)
for i in ${IP[@]}; do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || { >&2 echo error $i; nbErr+=1;}; done
return $nbErr
}
quatre itérations de la boucle, ta machine va supporter la charge ?
edit : return $nbErr
Dernière modification par Watael (Le 04/08/2025, à 23:35)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#55 Le 04/08/2025, à 23:26
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
validIP() { local -i nbErr IFS='.' read -ra IP <<<$1 # comme ça, c'est bien. ;) for i in ${IP[@]}; do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || { >&2 echo error $i; nbErr+=1;}; done return nbErr }
peut etre , mais la variable IFS , tu ne la remet pas comme à l' origine ?
shellcheck =>
$ shellcheck myscript
Line 6:
IFS='.' read -ra IP <<<$1 # comme ça, c'est bien. ;)
^-- SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean: (apply this, apply all SC2086)
IFS='.' read -ra IP <<<"$1" # comme ça, c'est bien. ;)
Line 7:
for i in ${IP[@]}; do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || { >&2 echo error $i; nbErr+=1;}; done
^-- SC2068 (error): Double quote array expansions to avoid re-splitting elements.
>> ^-- SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean: (apply this, apply all SC2086)
for i in ${IP[@]}; do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || { >&2 echo error "$i"; nbErr+=1;}; done
Line 8:
return nbErr
^-- SC2152 (error): Can only return 0-255. Other data should be written to stdout.
$
.
Dernière modification par iznobe (Le 04/08/2025, à 23:31)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#56 Le 04/08/2025, à 23:34
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
peut etre , mais la variable IFS , tu ne la remet pas comme à l' origine ?
non, parce qu'elle n'est pas modifiée dans l'environnement, mais uniquement localement pour la commande read.
$1 est réputée être une IP, soit un seul mot; alors, je me dispense de guillemets
${IP[@]} est un tablea de nombres (qui sont insécables); alors, je me dispense de guillemets.
ah, j'ai oublié un $; je corrige.
Dernière modification par Watael (Le 04/08/2025, à 23:36)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#57 Le 04/08/2025, à 23:42
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
y a ca aussi :
while [[ -z "$IP" ]]; do
^-- SC2128 (warning): Expanding an array without an index only gives the first element.
vu que tu met IP en tableau dans la fonction .
Aprés , heureusement , y a des " unset IP " dans la fonction control_ip , mais c' est tordu ton truc
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#58 Le 04/08/2025, à 23:46
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
sans parler de ta boucle ( encore plus tordue ) en rapport au comparaisons numériques , je trouve ça plus propre pour le coup :
valid_ip() {
local ip=$1
local retour=1
IFS='.' read -ra ip <<< "$ip"
[ ${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 ]
retour=$?
return $retour
}
au moins les variables IP des autres fonctions et ip de celle-là sont bien distinctes .
Dernière modification par iznobe (Le 04/08/2025, à 23:48)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#59 Le 04/08/2025, à 23:56
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
on peut ajouter IP au local -i nbErr
local -i nbErr IP
comme ça, pas d'interférence avec une variable du script.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#60 Le 05/08/2025, à 00:00
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
tiens justement , c' est quoi : " local -i " ?
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#61 Le 05/08/2025, à 00:06
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
for i in ${IP[@]}; do ((n++ ? i >=0 && i<=255 : i>0 && i<=255))
pour chaque index du tableau ;
si n est incrementé , alors i peut etre compris entre 0 et 255 , sinon , i est compris entre 1 et 255 .
si je traduis bien ton code , tu as fait une bourde , puisque c' est le contraire que l' on veut : i peut etre compris entre 1 et 255 ( quand n est pas incementé ) , sinon , i est compris entre 0 et 255 pour les 3 bits suivants .
me trompe je ?
a moins que ce ne soit justement l' inverse
Dernière modification par iznobe (Le 05/08/2025, à 00:28)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#62 Le 05/08/2025, à 00:06
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
c'est la définition d'une variable locale numérique (-i pour integer).
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#63 Le 05/08/2025, à 00:10
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ok , merci .
mais le " . " ne fait pas parti des entiers ?
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#64 Le 05/08/2025, à 00:49
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
quel point ?
n++ ? # n a-t-il une valeur
#alors
i >=0 && i<=255 #c'est le cas à partir du deuxième tour de la boucle
#sinon :
i>0 && i<=255 #c'est le cas lors du premier tour
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#65 Le 05/08/2025, à 00:54
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Allez , juste pour le fun
#!/bin/bash
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 ]]
}
while [[ -z "$IP" ]]
do
read -rp "Entrez l'adresse IP de votre imprimante : " IP
if valid_ip "$IP"; then echo "$IP : IP valide"; else echo "$IP : IP non valide"; fi
done
iznobe@iznobe-pc:~$ bash ~/Scripts/testip.sh
Entrez l'adresse IP de votre imprimante : 1.0.0.0
1.0.0.0 : IP valide
iznobe@iznobe-pc:~$ bash ~/Scripts/testip.sh
Entrez l'adresse IP de votre imprimante : 0.1.1.1
0.1.1.1 : IP non valide
iznobe@iznobe-pc:~$
quel point ?
ceux qui arrivent dans l' IP donné en argument / parametre à la fonction au depart .
Dernière modification par iznobe (Le 05/08/2025, à 00:58)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#66 Le 05/08/2025, à 01:07
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
le point est le séparateur (défini dans l'IFS), il n'apparaît plus dans le tableau.
un peu comme ça:
$ v=abc.def.hij
$ echo $(IFS='.'; echo $v)
abc def hij
Dernière modification par Watael (Le 05/08/2025, à 01:12)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#67 Le 05/08/2025, à 01:18
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
on peut ajouter IP au local -i nbErr
local -i nbErr IP
comme ça, pas d'interférence avec une variable du script.
tiens justement , c' est quoi : " local -i " ?
c'est la définition d'une variable locale numérique (-i pour integer).
ok , merci .
mais le " . " ne fait pas parti des entiers ?
quel point ?
ceux qui arrivent dans l' IP donné en argument / parametre à la fonction au depart .
et qui si on indique en debut de fonction :
valid_ip() {
local -i ip nbError
....
la variable locale de type entier de la fonction contiendra des points ...
Dernière modification par iznobe (Le 05/08/2025, à 01:23)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#68 Le 05/08/2025, à 01:22
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
l'IP est dans $1; je ne fais pas ip=$1
je fais
IFS=. read -ra ip <<<$1
come ça, ip est un tableau d'entiers.
Dernière modification par Watael (Le 05/08/2025, à 01:24)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#69 Le 05/08/2025, à 01:29
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
une variable locale tableau dans une variable de type entier , ca passe ?
validIP() { local -i nbErr IFS='.' read -ra IP <<<$1 # comme ça, c'est bien. ;) for i in ${IP[@]}; do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || { >&2 echo error $i; nbErr+=1;}; done return nbErr }
ca donnerait ça non :
validIP()
{
local -i nbErr IP
IFS='.' read -ra IP <<<$1 # comme ça, c'est bien. ;)
for i in ${IP[@]}; do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || { >&2 echo error $i; nbErr+=1;}; done
return nbErr
}
++++++++++++++++++++++++++++++++++++++++++++
2 lignes ! pas mieux ? comme dans des chiffres et des lettres ( a l' envers , le moins de ligne possible )
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 ]]
}
ba on peut toujours faire une ligne avec les 2 instructions :
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 ]]
}
Dernière modification par iznobe (Le 05/08/2025, à 01:32)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#70 Le 05/08/2025, à 01:51
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
2 lignes ! pas mieux ? comme dans des chiffres et des lettres ( a l' envers , le moins de ligne possible ) big_smile
ça a un nom, c'est le bashgolf
ba on peut toujours faire une ligne avec les 2 instructions
mouais, il faut que ce soit lisible, quand même.
et le return !?
=> 3 lignes.
+ la déclaration des variables locales
=> 4 lignes
--
de la mauvaise foi ? oh, si peu.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#71 Le 05/08/2025, à 09:50
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Bonjour , pas besoin du " return " en vrai , puisque automatiquement , ca renvoie deja 0 quand vrai et autre nombre quand faux : $?
et du coup pas besoin de declarer une variable locale non plus .
Dernière modification par iznobe (Le 05/08/2025, à 09:59)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#72 Le 05/08/2025, à 14:46
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Bonjour , j 'essaie de creer une fonction pour controler / creer un lien symbolique afin d ' epurer le script .
en parametre , je vais donc passer : " le_lien:la_cible " , et je pense utiliser IFS pour separer les 2 champs .
ca se complique vu que je dois partir de base dejà sur un tableau dont je dois dispatcher la donnée en 2 champs séparés
voilà un brouillon vite fait :
verif_lien() {
read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
#echo ${tab[@]}
for lien in "${tab[@]}"; do
IFS=':' read -ra Double_Tab <<< ${tab[@]}
log_action_begin_msg "Recherche du lien ' ${Double_Tab[0]} ' sur votre système"
if [[ -L "${Double_Tab[0]}" ]]; then
log_action_end_msg 0
else
log_action_end_msg 1
log_action_begin_msg "Creation du lien ' $lien '"
ln -sv "${Double_Tab[0]}" "${Double_Tab[1]}" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
ca a l' air de fonctionner , mais ca me parait pas trop terrible ...
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#73 Le 05/08/2025, à 15:08
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
voici le dernier script en date :
#!/bin/bash
# Script d'installation pour imprimantes Brother
# todo :
# verification de l' installation des dependances / paquets sur version ubuntu 24.04 et superieures
# multiarch-support , libsane etc ...
. /lib/lsb/init-functions
valid_ip() {
IFS='.' read -ra ip <<< "$1"
[[ ${ip[0]} -gt 0 ]] && [[ ${ip[0]} -le 255 ]] && [[ ${ip[1]} -ge 0 ]] && [[ ${ip[1]} -le 255 ]] && [[ ${ip[2]} -ge 0 ]] && [[ ${ip[2]} -le 255 ]] && [[ ${ip[3]} -ge 0 ]] && [[ ${ip[3]} -le 255 ]]
}
control_ip() {
if [[ -n "$IP" ]]; then
if ( (valid_ip "$IP") ); then
if ping -c2 "$IP"; then
echo "# Adresse IP : $IP" &>> "$Logfile"
log_action_end_msg 0
else
log_action_begin_msg "Votre IP ne permet pas de joindre l ' hote. Eclairer votre imprimante si celle-ci est eteinte , ou bien , corriger votre adresse IP."
unset IP
log_action_end_msg 1
fi
else
log_action_begin_msg "L ' adresse IP que vous avez entrée est incorrecte"
unset IP
log_action_end_msg 1
fi
fi
}
install_pkg() {
read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
#echo ${tab[@]}
for pkg in "${tab[@]}"; do
log_action_begin_msg "Recherche du paquet : ' $pkg ' sur votre système"
if dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null; then
echo " - Paquet ' $pkg ' deja installé" &>> "$Logfile"
log_action_end_msg 0
else
echo " - Paquet ' $pkg ' non installé" &>> "$Logfile"
log_action_end_msg 1
log_action_begin_msg "Installation du paquet : ' $pkg ' sur votre système"
apt-get install -qq "$pkg" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
verif_rep() {
read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
#echo ${tab[@]}
for dir in "${tab[@]}"; do
log_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
if [[ -d "$dir" ]]; then
log_action_end_msg 0
else
log_action_end_msg 1
log_action_begin_msg "Creation du dossier ' $dir '"
mkdir -pv "$dir" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
verif_lien() {
read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
#echo ${tab[@]}
for lien in "${tab[@]}"; do
IFS=':' read -ra Double_Tab <<< "${tab[@]}"
log_action_begin_msg "Recherche du lien ' ${Double_Tab[0]} ' sur votre système"
if [[ -L "${Double_Tab[0]}" ]]; then
log_action_end_msg 0
else
log_action_end_msg 1
log_action_begin_msg "Creation du lien ' $lien '"
ln -sv "${Double_Tab[0]}" "${Double_Tab[1]}" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
Model_Name="$1"
if [ -n "$2" ]; then
if [ "$2" = "1" ]; then
Connection="Réseau"
elif [ "$2" = "0" ]; then
Connection="USB"
fi
fi
IP="$3"
User="$SUDO_USER"
Dir="$(pwd)"/"$(dirname "$0")"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Inf="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
# https://download.brother.com/pub/com/linux/linux/packages/
Url_Pkg="http://www.brother.com/pub/bsc/linux/packages"
Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/$Udev_Deb"
Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"
#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
# On vérifie qu'on lance le script en root
if ((EUID)); then
echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"
exit 0
fi
# Si un log existe déjà on le renomme
if [[ -f $Logfile ]]; then
mv "$Logfile" "$Logfile".old
fi
# Si le premier argument est vide on demande le modèle de l'imprimante
while [[ -z "$Model_Name" ]]; do
read -rp "Entrez votre modèle d' imprimante : " Model_Name
done
Model_Name=${Model_Name^^}
# Si le 2eme argument est vide on demande comment est connectée l'imprimante
while [[ -z "$Connection" ]]; do
read -rp "Sélectionner le type de connectivité : [0] USB - [1] Réseau , votre choix : "
case $REPLY in
0)
Connection="USB"
;;
1)
Connection="Réseau"
echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
echo -e "$Red Veuillez consulter le manuel de votre imprimante pour plus de détails : http://support.brother.com/g/b/productsearch.aspx?c=fr&lang=fr&content=ml $Resetcolor"
;;
esac
done
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"
# Si le 3eme argument est vide on demande le ' IP de l'imprimante
if [[ "$Connection" == "Réseau" ]]; then
control_ip "$IP"
while [[ -z "$IP" ]]; do
read -rp "Entrez l'adresse IP de votre imprimante : " IP
control_ip "$IP"
done
fi
# On transforme le nom de l'imprimante ( enleve le " - " )
Printer_Name="${Model_Name//-/}"
# On construit l'URL du fichier contenant les informations
Printer_Info="$Url_Inf/$Printer_Name"
# On vérifie l'URL
if ! wget -q --spider "$Printer_Info"; then
log_action_end_msg 1
echo " - Aucun pilote trouvé" &>> "$Logfile"
echo -e "$Red Aucun pilote trouvé. Veuillez vérifier le modèle de votre imprimante ou visitez la page suivante http://support.brother.com/g/b/productsearch.aspx?c=us&lang=en&content=dl afin de télécharger les pilotes et les installer manuellement. $Resetcolor"
exit 1
fi
# On vérifie que le fichier fournit les informations
# ???????? pas compris a quoi sert ce controle , ni quelles info il est censé recuperé
Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
if [[ "$Lnk" ]]; then
Printer_Info="$Url_Inf/$Lnk"
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
install_pkg "csh"
fi
done
# On vérifie que le dossier /usr/share/cups/model et /var/spool/lpd existent et on les crée le cas échéant
verif_rep "/usr/share/cups/model" "/var/spool/lpd"
# On vérifie que le lien symbolique /etc/init.d/lpd existe et on le crée le cas échéant (uniquement pour certaines imprimantes)
for i in MFC-J4510DW 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
# log_action_end_msg $?
verif_lien "/etc/init.d/lpd:/etc/init.d/cups"
# On crée un lien symbolique vers cups.service si systemd est utilisé : ln -s /lib/systemd/system/cups.service /lib/systemd/system/lpd.service
if [[ -L /sbin/init ]]; then
echo "verification lien /lib/systemd/system/cups.service"
# log_action_begin_msg "Recherche du lien symbolique '/lib/systemd/system/cups.service ~> /lib/systemd/system/lpd.service' sur votre système"
# if [[ -L /lib/systemd/system/cups.service ]]; then
# log_action_end_msg 0
# else
# log_action_end_msg 1
# log_action_begin_msg "Creation du lien symbolique '/lib/systemd/system/cups.service ~> /lib/systemd/system/lpd.service'"
# ln -s /lib/systemd/system/cups.service /lib/systemd/system/lpd.service
# log_action_end_msg $?
# systemd daemon-reload
# fi
verif_lien "/lib/systemd/system/cups.service:/lib/systemd/system/lpd.service"
systemd daemon-reload
fi
#fi
fi
done
echo " " &>> "$Logfile"
}
##############################
# TÉLÉCHARGEMENT DES PILOTES #
##############################
do_download_drivers() {
echo -e "$Blue Téléchargement des pilotes de l'imprimante $Resetcolor"
echo "# Téléchargement des pilotes de l'imprimante" &>> "$Logfile"
# On crée le dossier de téléchargement des paquets si il n' existe pas deja
if [[ ! -d "$Temp_Dir" ]]; then
mkdir "$Temp_Dir"
fi
log_action_begin_msg "Recherche des pilotes"
# On récupère le nom des paquets disponibles
Printer_Lpd_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_LPD_DEB - | cut -d= -f2)
Printer_Cups_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_CUP_DEB - | cut -d= -f2)
Printer_Drv_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_DRV_DEB - | cut -d= -f2)
Scanner_Deb=$(wget -q "$Printer_Info" -O - | grep SCANNER_DRV - | cut -d= -f2)
Scankey_Deb=$(wget -q "$Printer_Info" -O - | grep SCANKEY_DRV - | cut -d= -f2)
Scanner_Info="$Url_Inf/$Scanner_Deb.lnk"
Scankey_Info="$Url_Inf/$Scankey_Deb.lnk"
# On récupère les pilotes du scanner en fonctionnement de l'architecture du système (32-bits ou 64-bits)
case "$Arch" in
i*86)
Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB32 | cut -d= -f2)
Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB32 | cut -d= -f2)
echo "Architecture : $Arch" &>> "$Logfile"
;;
x86_64)
Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB64 | cut -d= -f2)
Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB64 | cut -d= -f2)
echo "Architecture : $Arch" &>> "$Logfile"
;;
*)
echo "Architecture inconnue: $Arch" &>> "$Logfile"
;;
esac
for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb"; 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
apres nettoyage des comm inutiles et mise enpage plus propre ainsi que quelques modifs , a utiliser de préférence ! :
#!/bin/bash
# Script d'installation pour imprimantes Brother
# todo :
# verification de l' installation des dependances / paquets sur version ubuntu 24.04 et superieures
# multiarch-support , libsane etc ...
. /lib/lsb/init-functions
valid_ip() {
IFS='.' read -ra ip <<< "$1"
[[ ${ip[0]} -gt 0 ]] && [[ ${ip[0]} -le 255 ]] && [[ ${ip[1]} -ge 0 ]] && [[ ${ip[1]} -le 255 ]] && [[ ${ip[2]} -ge 0 ]] && [[ ${ip[2]} -le 255 ]] && [[ ${ip[3]} -ge 0 ]] && [[ ${ip[3]} -le 255 ]]
}
control_ip() {
if [[ -n "$IP" ]]; then
if ( (valid_ip "$IP") ); then
if ping -c2 "$IP"; then
echo "# Adresse IP : $IP" &>> "$Logfile"
log_action_end_msg 0
else
log_action_begin_msg "Votre IP ne permet pas de joindre l ' hote. Eclairer votre imprimante si celle-ci est eteinte , ou bien , corriger votre adresse IP."
unset IP
log_action_end_msg 1
fi
else
log_action_begin_msg "L ' adresse IP que vous avez entrée est incorrecte"
unset IP
log_action_end_msg 1
fi
fi
}
install_pkg() {
read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
#echo ${tab[@]}
for pkg in "${tab[@]}"; do
log_action_begin_msg "Recherche du paquet : ' $pkg ' sur votre système"
if dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null; then
echo " - Paquet ' $pkg ' deja installé" &>> "$Logfile"
log_action_end_msg 0
else
echo " - Paquet ' $pkg ' non installé" &>> "$Logfile"
log_action_end_msg 1
log_action_begin_msg "Installation du paquet : ' $pkg ' sur votre système"
apt-get install -qq "$pkg" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
verif_rep() {
read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
for dir in "${tab[@]}"; do
log_action_begin_msg "Recherche du dossier ' $dir ' sur votre système"
if [[ -d "$dir" ]]; then
log_action_end_msg 0
else
log_action_end_msg 1
log_action_begin_msg "Creation du dossier ' $dir '"
mkdir -pv "$dir" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
verif_lien() {
read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
for lien in "${tab[@]}"; do
IFS=':' read -ra Double_Tab <<< "${tab[@]}"
log_action_begin_msg "Recherche du lien ' ${Double_Tab[0]} ' sur votre système"
if [[ -L "${Double_Tab[0]}" ]]; then
log_action_end_msg 0
else
log_action_end_msg 1
log_action_begin_msg "Creation du lien ' $lien '"
ln -sv "${Double_Tab[0]}" "${Double_Tab[1]}" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
Model_Name="$1"
if [ -n "$2" ]; then
if [ "$2" = "1" ]; then Connection="Réseau"; elif [ "$2" = "0" ]; then Connection="USB"; fi
fi
IP="$3"
User="$SUDO_USER"
Dir="$(pwd)"/"$(dirname "$0")"
Temp_Dir="/tmp/packages"
Codename="$(lsb_release -cs)"
Arch="$(uname -m)"
date=$(date +%F_%T)
Logfile="/home/$User/brprinter-installer.log"
#Logfile="/home/$User/brprinter-installer.$date.log"
Lib_Dir="/usr/lib/$Arch-linux-gnu"
Url_Inf="http://www.brother.com/pub/bsc/linux/infs"
# Packages :
# https://download.brother.com/pub/com/linux/linux/packages/
Url_Pkg="http://www.brother.com/pub/bsc/linux/packages"
Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654/$Udev_Deb"
Blue="\\033[1;34m"
Red="\\033[1;31m"
Resetcolor="\\033[0;0m"
#########################
# PRÉPARATION DU SCRIPT #
#########################
do_init_script() {
# On vérifie qu'on lance le script en root
if ((EUID)); then
echo -e "$Red Vous devez lancer ce script en tant que root : sudo bash $0 $Resetcolor"
exit 0
fi
# Si un log existe déjà on le renomme
if [[ -f $Logfile ]]; then
mv "$Logfile" "$Logfile".old
fi
# Si le premier argument est vide on demande le modèle de l'imprimante
while [[ -z "$Model_Name" ]]; do
read -rp "Entrez votre modèle d' imprimante : " Model_Name
done
Model_Name=${Model_Name^^}
# Si le 2eme argument est vide on demande comment est connectée l'imprimante
while [[ -z "$Connection" ]]; do
read -rp "Sélectionner le type de connectivité : [0] USB - [1] Réseau , votre choix : "
case $REPLY in
0)
Connection="USB"
;;
1)
Connection="Réseau"
echo -e "$Red Vous devez d' abord vous assurer que votre imprimante possède une adresse IP fixe. $Resetcolor"
echo -e "$Red Veuillez consulter le manuel de votre imprimante pour plus de détails : http://support.brother.com/g/b/productsearch.aspx?c=fr&lang=fr&content=ml $Resetcolor"
;;
esac
done
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"
# Si le 3eme argument est vide on demande le ' IP de l'imprimante
if [[ "$Connection" == "Réseau" ]]; then
control_ip "$IP"
while [[ -z "$IP" ]]; do
read -rp "Entrez l'adresse IP de votre imprimante : " IP
control_ip "$IP"
done
fi
# On transforme le nom de l'imprimante ( enleve le " - " )
Printer_Name="${Model_Name//-/}"
# On construit l'URL du fichier contenant les informations
Printer_Info="$Url_Inf/$Printer_Name"
# On vérifie l'URL
if ! wget -q --spider "$Printer_Info"; then
log_action_end_msg 1
echo " - Aucun pilote trouvé" &>> "$Logfile"
echo -e "$Red Aucun pilote trouvé. Veuillez vérifier le modèle de votre imprimante ou visitez la page suivante http://support.brother.com/g/b/productsearch.aspx?c=us&lang=en&content=dl afin de télécharger les pilotes et les installer manuellement. $Resetcolor"
exit 1
fi
# On vérifie que le fichier fournit les informations
# ???????? pas compris a quoi sert ce controle , ni quelles info il est censé recuperé
Lnk=$(wget -q "$Printer_Info" -O - | grep LNK - | cut -d= -f2)
if [[ "$Lnk" ]]; then
Printer_Info="$Url_Inf/$Lnk"
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
install_pkg "csh"
fi
done
# On vérifie que le dossier /usr/share/cups/model et /var/spool/lpd existent et on les crée le cas échéant
verif_rep "/usr/share/cups/model" "/var/spool/lpd"
# On vérifie que le lien symbolique /etc/init.d/lpd existe et on le crée le cas échéant (uniquement pour certaines imprimantes)
for i in DCP-1000 DCP-1400 DCP-8020 DCP-8025D DCP-8040 DCP-8045D DCP-8060 DCP-8065DN FAX-2850 FAX-2900 FAX-3800 FAX-4100 FAX-4750e FAX-5750e HL-1030 HL-1230 HL-1240 HL-1250 HL-1270N HL-1430 HL-1440 HL-1450 HL-1470N HL-1650 HL-1670N HL-1850 HL-1870N HL-5030 HL-5040 HL-5050 HL-5070N HL-5130 HL-5140 HL-5150D HL-5170DN HL-5240 HL-5250DN HL-5270DN HL-5280DW HL-6050 HL-6050D MFC-4800 MFC-6800 MFC-8420 MFC-8440 MFC-8460N MFC-8500 MFC-8660DN MFC-8820D MFC-8840D MFC-8860DN MFC-8870DW MFC-9030 MFC-9070 MFC-9160 MFC-9180 MFC-9420CN MFC-9660 MFC-9700 MFC-9760 MFC-9800 MFC-9860 MFC-9880; do
if [[ "$Model_Name" == "$i" ]]; then
verif_lien "/etc/init.d/lpd:/etc/init.d/cups"
# On crée un lien symbolique vers cups.service si systemd est utilisé : ln -s /lib/systemd/system/cups.service /lib/systemd/system/lpd.service
if [[ -L /sbin/init ]]; then
verif_lien "/lib/systemd/system/cups.service:/lib/systemd/system/lpd.service"
systemd daemon-reload
fi
fi
done
echo " " &>> "$Logfile"
}
##############################
# TÉLÉCHARGEMENT DES PILOTES #
##############################
do_download_drivers() {
echo -e "$Blue Téléchargement des pilotes de l'imprimante $Resetcolor"
echo "# Téléchargement des pilotes de l'imprimante" &>> "$Logfile"
# On crée le dossier de téléchargement des paquets si il n' existe pas deja
if [[ ! -d "$Temp_Dir" ]]; then
mkdir "$Temp_Dir"
fi
log_action_begin_msg "Recherche des pilotes"
# On récupère le nom des paquets disponibles
Printer_Lpd_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_LPD_DEB - | cut -d= -f2)
Printer_Cups_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_CUP_DEB - | cut -d= -f2)
Printer_Drv_Deb=$(wget -q "$Printer_Info" -O - | grep PRN_DRV_DEB - | cut -d= -f2)
Scanner_Deb=$(wget -q "$Printer_Info" -O - | grep SCANNER_DRV - | cut -d= -f2)
Scankey_Deb=$(wget -q "$Printer_Info" -O - | grep SCANKEY_DRV - | cut -d= -f2)
Scanner_Info="$Url_Inf/$Scanner_Deb.lnk"
Scankey_Info="$Url_Inf/$Scankey_Deb.lnk"
# On récupère les pilotes du scanner en fonctionnement de l'architecture du système (32-bits ou 64-bits)
case "$Arch" in
i*86)
Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB32 | cut -d= -f2)
Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB32 | cut -d= -f2)
echo "Architecture : $Arch" &>> "$Logfile"
;;
x86_64)
Scanner_Drv_Deb=$(wget -q "$Scanner_Info" -O - | grep DEB64 | cut -d= -f2)
Scankey_Drv_Deb=$(wget -q "$Scankey_Info" -O - | grep DEB64 | cut -d= -f2)
echo "Architecture : $Arch" &>> "$Logfile"
;;
*)
echo "Architecture inconnue: $Arch" &>> "$Logfile"
;;
esac
for pkg in "$Printer_Lpd_Deb" "$Printer_Cups_Deb" "$Printer_Drv_Deb" "$Scanner_Drv_Deb" "$Scankey_Drv_Deb"; 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
Dernière modification par iznobe (Le 05/08/2025, à 15:20)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#74 Le 05/08/2025, à 15:58
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
je ne comprends pas pourquoi tu te fais des nœuds comme ça...
admettons que tu exécutes la fonction ainsi :
verif_lien "/etc/init.d/lpd" "/etc/init.d/cups"
tout devient très simple :
verif_lien()
{
lien=$1
cible=$2
if ! test -L "$lien"; then ln -s "$cible" "$lien"; fi
}
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#75 Le 05/08/2025, à 16:26
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ro ba c ' est tout de meme pas si compliqué que ça
faut juste peit etre mettre des noms plus parlant , mais ca ne change pas grand chose :
verif_lien() {
read -ra tab <<< "$1 $2 $3 $4 $5 $6 $7 $8 $9"
#echo ${tab[@]}
for link in "${tab[@]}"; do
IFS=':' read -ra split_link_target <<< ${tab[@]}
local lien="${split_link_target[0]}" cible="${split_link_target[1]}"
log_action_begin_msg "Recherche du lien ' $lien ' sur votre système"
if [[ -L "$lien" ]]; then
log_action_end_msg 0
else
log_action_end_msg 1
log_action_begin_msg "Creation du lien ' $link '"
ln -sv "lien" "cible" &>> "$Logfile"
log_action_end_msg $?
fi
done
}
Dernière modification par iznobe (Le 05/08/2025, à 16:36)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne