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.