#!/bin/bash # ============================================================================== # Скрипт автоматической настройки USB-принтера Ricoh в ALT Linux # Поддерживает модели Ricoh SP 212Nw, SP 212w, SP 213Nw и совместимые # ============================================================================== set -o pipefail RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m' NC='\033[0m' PRINTER_QUEUE_NAME="RICOH_SP_212Nw" DEFAULT_PAGE_SIZE="A4" log_info() { echo -e "${BLUE}[ИНФО]${NC} $1" } log_ok() { echo -e "${GREEN}[УСПЕХ]${NC} $1" } log_warn() { echo -e "${YELLOW}[ВНИМАНИЕ]${NC} $1" } log_error() { echo -e "${RED}[ОШИБКА]${NC} $1" } header() { echo -e "\n${BOLD}${CYAN}=== $1 ===${NC}\n" } # 1. Проверка прав суперпользователя (root) check_root() { if [ "$EUID" -ne 0 ]; then log_error "Данный скрипт должен быть запущен с правами суперпользователя (root)." echo "Запустите: su - или sudo $0" exit 1 fi } # 2. Проверка и запуск службы CUPS check_cups_service() { header "1. Проверка службы печати CUPS" if ! systemctl is-active --quiet cups; then log_info "Запуск службы CUPS..." systemctl start cups || { log_error "Не удалось запустить CUPS. Проверьте: systemctl status cups" exit 1 } fi systemctl enable cups >/dev/null 2>&1 log_ok "Служба CUPS активна." } # 3. Поиск физически подключенного USB-принтера Ricoh detect_usb_printer() { header "2. Поиск подключенного USB-принтера Ricoh" local lsusb_match lsusb_match=$(lsusb 2>/dev/null | grep -i "Ricoh" || true) if [ -n "$lsusb_match" ]; then log_ok "Найдено USB-устройство Ricoh:" echo " $lsusb_match" fi local backend_output backend_output=$(/usr/lib/cups/backend/usb 2>/dev/null || true) DEVICE_URI="" MODEL_DETECTED="" while IFS= read -r line; do if echo "$line" | grep -iq "RICOH"; then DEVICE_URI=$(echo "$line" | awk '{print $2}') MODEL_DETECTED=$(echo "$line" | sed -n 's/.*"\(RICOH[^"]*\)".*/\1/p' | head -n1) break fi done <<< "$backend_output" if [ -z "$DEVICE_URI" ]; then local lpinfo_output lpinfo_output=$(lpinfo -v 2>/dev/null | grep -i "usb://RICOH" | head -n1 || true) if [ -n "$lpinfo_output" ]; then DEVICE_URI=$(echo "$lpinfo_output" | awk '{print $2}') fi fi if [ -z "$DEVICE_URI" ]; then log_error "USB-принтер Ricoh не найден в системе." echo -e "Рекомендации:\n - Проверьте питание принтера;\n - Проверьте подключение USB-кабеля к компьютеру." exit 1 fi log_ok "Принтер обнаружен:" echo " Модель: ${MODEL_DETECTED:-Ricoh USB Printer}" echo " URI: $DEVICE_URI" } # 4. Проверка системных пакетов check_dependencies() { header "3. Проверка компонентов печати" local missing_pkg=0 for cmd in gs foomatic-rip python3; do if ! command -v "$cmd" >/dev/null 2>&1; then log_error "Не найдена утилита: $cmd" missing_pkg=1 fi done if [ "$missing_pkg" -eq 1 ]; then log_info "Установка необходимых пакетов..." apt-get update && apt-get install -y cups cups-filters foomatic-db-engine ghostscript python3 || { log_error "Ошибка при установке пакетов." exit 1 } else log_ok "Все необходимые системные компоненты установлены." fi } # 5. Настройка прав доступа к USB-устройству fix_quirks() { header "4. Настройка прав доступа USB" local udev_file="/etc/udev/rules.d/99-ricoh-printer.rules" if [ ! -f "$udev_file" ]; then cat << 'QUIRK_EOF' > "$udev_file" # udev rule for RICOH USB Printers SUBSYSTEM=="usb", ATTR{idVendor}=="05ca", ATTR{idProduct}=="0450", MODE="0664", GROUP="lp" QUIRK_EOF udevadm control --reload-rules 2>/dev/null || true udevadm trigger 2>/dev/null || true log_ok "Правило udev создано: $udev_file" else log_ok "Правило udev настроено." fi } # 6. Подготовка PPD-драйвера PCL 5e (полностью автономный, встроен в скрипт) prepare_pcl5_ppd() { header "5. Подготовка PPD-драйвера PCL 5e" PCL5_PPD_DIR="/etc/cups/custom-ppd" PCL5_PPD_FILE="$PCL5_PPD_DIR/Ricoh-SP_212Nw_PCL5e.ppd" mkdir -p "$PCL5_PPD_DIR" python3 - << 'PY_EOF' import base64, zlib b64_data = """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""" ppd_data = zlib.decompress(base64.b64decode(b64_data)) with open('/etc/cups/custom-ppd/Ricoh-SP_212Nw_PCL5e.ppd', 'wb') as f: f.write(ppd_data) PY_EOF if [ $? -eq 0 ] && [ -f "$PCL5_PPD_FILE" ]; then log_ok "Драйвер подготовлен: $PCL5_PPD_FILE" else log_error "Не удалось сформировать PPD-файл." exit 1 fi } # 7. Настройка очереди печати в CUPS setup_printer_queue() { header "6. Настройка очереди печати CUPS" log_info "Регистрация принтера '$PRINTER_QUEUE_NAME'..." lpadmin -p "$PRINTER_QUEUE_NAME" -E \ -v "$DEVICE_URI" \ -P "$PCL5_PPD_FILE" \ -D "RICOH SP 212Nw Laser Printer" \ -L "USB Local" || { log_error "Ошибка выполнения lpadmin." exit 1 } # Включение принтера и разрешение приема заданий cupsenable "$PRINTER_QUEUE_NAME" 2>/dev/null || true cupsaccept "$PRINTER_QUEUE_NAME" 2>/dev/null || true # Назначение принтером по умолчанию lpadmin -d "$PRINTER_QUEUE_NAME" log_ok "Принтер '$PRINTER_QUEUE_NAME' назначен принтером по умолчанию." # Установка формата бумаги A4 и разрешения 600x600 dpi lpadmin -p "$PRINTER_QUEUE_NAME" -o PageSize="$DEFAULT_PAGE_SIZE" -o Resolution="600x600dpi" log_ok "Установлены параметры: формат $DEFAULT_PAGE_SIZE, разрешение 600x600 DPI." systemctl restart cups } # 8. Проверка состояния принтера verify_status() { header "7. Проверка состояния принтера" local printer_status printer_status=$(lpstat -p "$PRINTER_QUEUE_NAME" 2>&1) echo "Статус очереди:" echo " $printer_status" local default_dest default_dest=$(lpstat -d 2>&1) echo " $default_dest" if echo "$printer_status" | grep -q "idle\|printing"; then log_ok "Принтер готов к работе." else log_warn "Принтер настроен, статус: $printer_status" fi } # 9. Инструкция пользователю show_completion() { echo -e "\n${BOLD}${GREEN}================================================================${NC}" echo -e "${BOLD}${GREEN} НАСТРОЙКА ПРИНТЕРА RICOH ЗАВЕРШЕНА ${NC}" echo -e "${BOLD}${GREEN}================================================================${NC}" echo -e "Имя принтера: ${BOLD}$PRINTER_QUEUE_NAME${NC}" echo -e "Драйвер: ${BOLD}PCL 5e (ljet4)${NC}" echo -e "Формат бумаги: ${BOLD}$DEFAULT_PAGE_SIZE (600x600 DPI)${NC}" echo -e "Команда печати: ${CYAN}lp -d $PRINTER_QUEUE_NAME <файл>${NC}" echo -e "Тестовая печать: ${CYAN}echo 'Проверка печати' | lp${NC}" echo -e "Web-интерфейс CUPS: ${CYAN}http://localhost:631/printers/$PRINTER_QUEUE_NAME${NC}" echo -e "================================================================\n" } # Основной поток выполнения check_root check_cups_service detect_usb_printer check_dependencies fix_quirks prepare_pcl5_ppd setup_printer_queue verify_status show_completion