#!/bin/bash ################################################## #версия 0.3 от 05 октября 2019 года. С правками от 26 августа 2024 года #http://wiki.rosalab.ru/ru/index.php/Установка_принтеров_Canon_LBP ################################################## #проверка на суперпользователя [ $USER != 'root' ] && exec sudo "$0" #пользователь под которым мы вошли в ситему LOGIN_USER=$(logname) [ -z "$LOGIN_USER" ] && LOGIN_USER=$(who | head -1 | awk '{print $1}') #версия драйвера DRIVER_VERSION='2.71-1' DRIVER_VERSION_COMMON='3.21-1' #ссылки на пакеты драйвера declare -A URL_DRIVER=([x86_64_common]='https://drive.google.com/uc?export=download&confirm=no_antivirus&id=1rF7n-L6l6ZEQfqWZn62oB8xXZkF7C8vP' \ [x86_64_capt]='https://drive.google.com/uc?export=download&confirm=no_antivirus&id=1o7RqQnQwAXW8fb636mpiZrvc0PafJpYZ' \ [i386_common]='https://drive.google.com/uc?export=download&confirm=no_antivirus&id=1BYgQlYOT7LKKuvcncbxViimb00OFfrgG' \ [i386_capt]='https://drive.google.com/uc?export=download&confirm=no_antivirus&id=1hi95gV_WeH_NXaum5K-NEn5JdAPqas2r') #соостветствие ppd файлов и моделей принтеров declare -A LASERSHOT=([LBP-810]=1120 [LBP-1120]=1120 [LBP-1210]=1210 \ [LBP2900]=2900 [LBP3000]=3000 [LBP3010]=3050 [LBP3018]=3050 [LBP3050]=3050 \ [LBP3100]=3150 [LBP3108]=3150 [LBP3150]=3150 [LBP3200]=3200 [LBP3210]=3210 \ [LBP3250]=3250 [LBP3300]=3300 [LBP3310]=3310 [LBP3500]=3500 [LBP5000]=5000 \ [LBP5050]=5050 [LBP5100]=5100 [LBP5300]=5300 [LBP6000]=6018 [LBP6018]=6018 \ [LBP6020]=6020 [LBP6020B]=6020 [LBP6200]=6200 [LBP6300n]=6300n [LBP6300]=6300 \ [LBP6310]=6310 [LBP7010C]=7018C [LBP7018C]=7018C [LBP7200C]=7200C [LBP7210C]=7210C \ [LBP9100C]=9100C [LBP9200C]=9200C) #отсортированные имена принтеров NAMESPRINTERS=$(echo "${!LASERSHOT[@]}" | tr ' ' '\n' | sort -n -k1.4) #список моделей, которые поддерживаются утилитой автоотключения declare -A ASDT_SUPPORTED_MODELS=([LBP6020]='MTNA002001 MTNA999999' \ [LBP6020B]='MTMA002001 MTMA999999' [LBP6200]='MTPA00001 MTPA99999' \ [LBP6310]='MTLA002001 MTLA999999' [LBP7010C]='MTQA00001 MTQA99999' \ [LBP7018C]='MTRA00001 MTRA99999' [LBP7210C]='MTKA002001 MTKA999999') #архитектура операционной системы if [ "$(uname -m)" == 'x86_64' ]; then ARCH='x86_64' else ARCH='i386' fi #делаем рабочим каталог, в котором находится этот скрипт cd "$(dirname "$0")" function valid_ip() { local ip=$1 local stat=1 if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then ip=($(echo "$ip" | tr '.' ' ')) [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] stat=$? fi return $stat } function check_error() { if [ $2 -ne 0 ]; then case $1 in 'WGET') echo "Ошибка при скачивании файла $3" [ -n "$3" ] && [ -f "$3" ] && rm "$3";; 'PACKAGE') echo "Ошибка при установке пакета $3";; *) echo 'Ошибка';; esac echo 'Нажмите любую клавишу для выхода' read -s -n1 exit 1 fi } function canon_unistall() { if [ -f /usr/sbin/ccpdadmin ]; then installed_model=$(ccpdadmin | grep LBP | awk '{print $3}') if [ -n "$installed_model" ]; then echo "Найден принтер $installed_model" echo 'Остановка демона ccpd' systemctl stop ccpd echo 'Удаление принтера из файла настройки ccpd демона' ccpdadmin -x $installed_model echo 'Удаление принтера из CUPS' lpadmin -x $installed_model fi fi echo 'Удаление пакетов драйвера' dnf remove cndrvcups-capt --assumeyes dnf remove cndrvcups-common --assumeyes echo 'Удаление неиспользуемых библиотек и пакетов' dnf autoremove --assumeyes echo 'Удаление правила' [ -f /etc/udev/rules.d/85-canon-capt.rules ] && rm /etc/udev/rules.d/85-canon-capt.rules echo 'Удаление завершено' echo 'Снятие запрета на обновление модуля CUPS COMMON и CAPT' sed -i "/exclude=cndrvcups-common cndrvcups-capt/d" /etc/dnf/dnf.conf echo 'Нажмите любую клавишу для выхода' read -s -n1 return 0 } function canon_install() { echo PS3='Выбор принтера. Введите нужную цифру и нажмите Enter: ' select NAMEPRINTER in $NAMESPRINTERS do [ -n "$NAMEPRINTER" ] && break done echo "Выбран принтер: $NAMEPRINTER" echo PS3='Как принтер подключен к комьютеру? Введите нужную цифру и нажмите Enter: ' select CONECTION in 'Через разъем порта USB' 'Через разъем локальной сети (LAN, NET)' do if [ "$REPLY" == "1" ]; then CONECTION="usb" while true do #ищем подключенное к порту USB устройство NODE_DEVICE=$(ls -1t /dev/usb/lp* 2> /dev/null | head -1) if [ -n "$NODE_DEVICE" ]; then #определяем серийный номер принтера PRINTER_SERIAL=$(udevadm info --attribute-walk --name=$NODE_DEVICE | sed '/./{H;$!d;};x;/ATTRS{product}=="Canon CAPT USB \(Device\|Printer\)"/!d;' | awk -F'==' '/ATTRS{serial}/{print $2}') #если серийный номер найден, значит найденное устройство принтер Canon [ -n "$PRINTER_SERIAL" ] && break fi echo -ne "Включите принтер\r" sleep 2 done PATH_DEVICE="/dev/canon$NAMEPRINTER" break elif [ "$REPLY" == "2" ]; then CONECTION="lan" read -p 'Введите IP-адрес принтера: ' IP_ADDRES until valid_ip "$IP_ADDRES" do echo 'Неверный формат IP-адреса, введите четыре десятичных числа значением' echo -n 'от 0 до 255, разделённых точками: ' read IP_ADDRES done PATH_DEVICE="net:$IP_ADDRES" echo 'Включите принтер и нажмите любую клавишу' read -s -n1 sleep 5 break fi done echo 'Установка драйвера' COMMON_FILE=cndrvcups-common-${DRIVER_VERSION_COMMON}.${ARCH}.rpm CAPT_FILE=cndrvcups-capt-${DRIVER_VERSION}.${ARCH}.rpm if [ ! -f $COMMON_FILE ]; then sudo -u $LOGIN_USER wget -O $COMMON_FILE ${URL_DRIVER[${ARCH}_common]} check_error WGET $? $COMMON_FILE fi if [ ! -f $CAPT_FILE ]; then sudo -u $LOGIN_USER wget -O $CAPT_FILE ${URL_DRIVER[${ARCH}_capt]} check_error WGET $? $CAPT_FILE fi echo 'Установка общего модуля для драйвера CUPS' dnf install ./$COMMON_FILE --assumeyes check_error PACKAGE $? $COMMON_FILE echo 'Установка модуля драйвера принтера CAPT' dnf install ./$CAPT_FILE --assumeyes check_error PACKAGE $? $CAPT_FILE echo 'Установка запрета на обновление модуля CUPS COMMON и CAPT' sed -i "$ a exclude=cndrvcups-common cndrvcups-capt" /etc/dnf/dnf.conf #замена содержимого файла /etc/systemd/system/ccpd.service echo '[Unit] Description=CCPD Printing Daemon Requires=cups.service After=cups.service [Service] Type=forking ExecStart=/usr/sbin/ccpd TimeoutSec=5 [Install] WantedBy=multi-user.target' > /etc/systemd/system/ccpd.service echo 'Перезапуск CUPS' systemctl restart cups echo 'Установка принтера в CUPS' /usr/sbin/lpadmin -p $NAMEPRINTER -P /usr/share/cups/model/CNCUPSLBP${LASERSHOT[$NAMEPRINTER]}CAPTK.ppd -v ccp://localhost:59687 -E echo "Установка принтера $NAMEPRINTER, принтером, используемым по умолчанию" /usr/sbin/lpadmin -d $NAMEPRINTER echo 'Регистрация принтера в файле настройки ccpd демона' /usr/sbin/ccpdadmin -p $NAMEPRINTER -o $PATH_DEVICE #проверка установки принтера installed_printer=$(ccpdadmin | grep $NAMEPRINTER | awk '{print $3}') if [ -n "$installed_printer" ]; then if [ "$CONECTION" == "usb" ]; then echo 'Создание правила для принтера' #составлем правило, которое обеспечит альтернативное имя (символическую ссылку) нашему принтеру, чтобы не зависить от меняющихся значений lp0,lp1, ... echo 'KERNEL=="lp[0-9]*", SUBSYSTEMS=="usb", ATTRS{serial}=='$PRINTER_SERIAL', SYMLINK+="canon'$NAMEPRINTER'"' > /etc/udev/rules.d/85-canon-capt.rules #обновляем правила udevadm control --reload-rules #проверка созданного правила until [ -e $PATH_DEVICE ] do echo -ne "Выключите принтер, подождите 2 секунды, затем включите принтер\r" sleep 2 done fi rm -f /etc/rc.d/init.d/ccpd echo -e "\e[2KЗапуск ccpd" systemctl daemon-reload systemctl restart ccpd #автозагрузка ccpd systemctl enable ccpd echo 'Установка завершена. Нажмите любую клавишу для выхода' read -s -n1 exit 0 else echo "Принтер $NAMEPRINTER не установлен" echo 'Нажмите любую клавишу для выхода' read -s -n1 exit 1 fi } function canon_help { clear echo 'Замечания по установке Если вы уже делали какие-либо действия по установке принтера этой серии, в текущей системе, то перед началом установки, следует отменить эти действия. При отсутствии пакетов драйвера в папке скрипта они будут закачены автоматически. Принтеры LBP-810, LBP-1210 подключайте через разъем порта USB Для обновления драйвера сначала удаляете старую версию через скрипт, затем устанавливаете новую также через скрипт. Замечания и ошибки пишите на почту krylov__a@mail.ru Для логирования процесса установки запускайте скрипт так: logsave log.txt ./canon_lbp_setup.sh Напомню: 1-установка; 2-удаление; 4-выход ' } clear echo 'Установка драйвера Linux CAPT Printer Driver v'${DRIVER_VERSION}' для принтеров Canon LBP на Rosa Desktop Fresh 32-битной и 64-битной архитектуры Поддерживаемые принтеры:' echo "$NAMESPRINTERS" | sed ':a; /$/N; s/\n/, /; ta' | fold -s PS3='Выбор действия. Введите нужную цифру и нажмите Enter: ' select opt in 'Установка' 'Удаление' 'Справка' 'Выход' do if [ "$opt" == 'Установка' ]; then canon_install break elif [ "$opt" == 'Удаление' ]; then canon_unistall break elif [ "$opt" == 'Справка' ]; then canon_help elif [ "$opt" == 'Выход' ]; then break fi done