Tự tạo backend cupsFAX cho CUPS

CUPS có nhiều bộ lọc dùng để thay đổi định dạng của tài liệu, cuối cùng cho ra dạng PS phù hợp với máy in. Backend là bộ lọc sau cùng và người dùng có thể can thiệp vào. Đầu vào dữ liệu của backend có thể là /dev/input hoặc file (trong tham đối thứ 6), dữ liệu truyền cho backend có thể đã ở định dạng PS nên giả định là không đọc được phần text ascii.

CUPS truyền cho backend 5 hay 6 tham đối

jobId  user  title  copies  options  [filename]

Chúng ta thiết kế backend là một bash script cupsFAX  như sau

#!/bin/bash
# cupsFAX là một backend cho CUPS, dùng để print to fax
# Copyright (C) 2018 LNT <lnt@ly-le.info>
# Script này là miễn phí. Bản quyền theo GNU General Public License
# -----------------------------------------------------------------
if [ $# -eq 0 ]; then
   echo "direct cupsFAX:/IPP \"Unknown\" \"cupsFAX server\""
   exit 0
fi

Backend khi được gọi mà không có tham đối thì phải trả lại câu tương tự như trên, trong đó cupsFAX:/IPP là uri của backend, có thể là nhóm text tùy ý, ở đây chúng ta ghi IPP để hàm ý có thể in từ internet.

Tiếp theo là lưu tạm dữ liệu fax, $6 có thể là null string, khi đó nó có nghĩa là /dev/input

faxFile=$(mktemp /tmp/fx-XXXXXXXX)
cat $6 > $faxFile

Phần quan trọng nhất là tìm xem số fax được truyền đến bằng cách nào?

usr="$2"
NUMBER=`echo "$5" |grep -iPo 'phone=(?:(?:\+\d{1,3}[-.])?\d{1,3}[-.])?\d{8}'|sed 's/phone=//'`
if [ -z "$NUMBER" ];then
   NUMBER=`echo "$3" |grep -iPo '^(?:(?:\+\d{1,3}[-.])?\d{1,3}[-.])?\d{8}$'`
fi
if [ -z "$NUMBER" ];then
   NUMBER=`echo "$3" |grep -iPo 'Fax-To\s+(?:(?:\+\d{1,3}[-.])?\d{1,3}[-.])?\d{8}'|sed -r  's/Fax-To\s+//'`
fi
if [ -z "$NUMBER" ];then
   mail $usr "Fax Report from cupsFAX" "Không tìm thấy số fax nhận!"
   exit 1
fi

Đầu tiên tìm trong options xem có phone=xxxxxxxx không (trường hợp -o phone=số_fax), nếu không có thì tìm trong title (trường hợp -t số_fax), nếu không có thì tìm trong tên file, nếu không có nữa thì báo lỗi qua email và thoát.

Đến đây chúng ta đã có đủ tham số để gọi sendfax

sendfax -n -D -T 6 -A -R -o $usr -f $usr -d $NUMBER $faxFile

Tham số -T 6 để hylafax chỉ thử lại 6 lần nếu không fax được, -R để hylafax thông báo qua email cho usr mỗi lần sendfax thành công hay requeue hay thất bại.

Cài đặt máy in cho cupsFAX

Để thêm một máy in vào CUPS, chúng ta cần backend và driver máy in .ppd

File ppd là một file text mô tả các kiểu giấy, độ phân giải in, lệnh in… Chúng ta chọn một driver ps bất kỳ rồi chỉnh sửa chỉ để lại phần kiểu giấy và độ phân giải in (như hylafax.ppd)

Câu lệnh tạo máy in như sau

cp -f ./cupsFAX /usr/lib/cups/backend/
cp -f ./cupsFAX.ppd /usr/share/cups/model/
lpadmin -p cupsFAX -E -v cupsFAX:/IPP -m cupsFAX.ppd -D 'cupsFAX shared printer'

Có thể đưa tất cả vào một file Bash

#!/bin/bash
if [ $# -eq 0 ]; then
   cp -f ${PWD}/cupsFAX /usr/lib/cups/backend/
   cp -f ${PWD}/cupsFAX.ppd /usr/share/cups/model/
else
   ln -s ${PWD}/cupsFAX /usr/lib/cups/backend/
   ln -s ${PWD}/cupsFAX.ppd /usr/share/cups/model/
fi
lpadmin -p cupsFAX -E -v cupsFAX:/IPP -m cupsFAX.ppd -D 'cupsFAX shared printer'

Chạy file bash này là có máy in cupsFAX

Chú thích

  • cupsFAX có thể in từ internet với giải pháp tạm thời là thêm số fax vào tên file
  • Cần phải thêm giải pháp bảo mật vào cupsFAX
  • Trong quá trình cài đặt máy in trên Windows, có thể có cổng máy in bị chiếm dụng mặc dù máy in đã bị xóa, khiến cho không thể cài đặt lại máy in. Vào đây xóa các port không cần
    HKEY_LOCAL_MACHINE\SYSTEM\Currentcontrolset\Control\Print\Monitors\Standard TCP/IP Ports
    Sau đó restart lại Print Spooler.

Download

Comments Off on Tự tạo backend cupsFAX cho CUPS

Filed under Software

Comments are closed.