rosa-canon-lbp/rosa_canon_lbp.sh

266 lines
14 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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