Печать этикеток

Основная задача

Основная задача упростить себе жизнь и сделать печать этикеток по шаблону под разные нужды

  1. Имеется принтер доставшийся с производства Intermec PC43d
  2. Принтер подключен по сети
  3. Сервер с установленным nginx. На данный момент там уже есть nextcloud
  4. На сервере система Debian GNU/Linux 9.6 (stretch)

Реализация

  1. Ставим CUPS
  2. Ставим драйвера и принтер
  3. Пишем скрипты печати этикеток
  4. Пишем к скриптам WEB интерфейс

Ставим CUPS

Так как настроен UFW, то разрешаем попутно доступ по порту 631
Если у вас не стоит ufw то это делать не нужно.

apt install cups -y
ufw allow 631

Разрешаем доступ к серверу CUPS из сети
В сумме делаем так чтобы cups слушал сетевой интерфейс, и разрешал доступ к администрированию. Разрешал только с одного IP, компьютер с которого я буду заходить.
В принципе это нужно только на момент настройки, можно добавить принтер и в консоли, но тут кому как удобнее.
IP сервера : 192.168.16.13
IP ПК : 192.168.16.6

nano /etc/cups/cupsd.conf
...............
# Listen localhost:631
Listen 192.168.16.13:631
...............
# Restrict access to the server...
<Location />
  Order allow,deny
  Allow from 192.168.16.6
</Location>

# Restrict access to the admin pages...
<Location /admin>
  Order allow,deny
  Allow from 192.168.16.6
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
</Location>
...............

Перезапускаем

service cups restart

Проверяем
http://192.168.116.138:631

Ставим драйвер принтера

Идем на официальный сайт, вдумчиво читаем статью. Качаем и ставим драйвер
https://support.honeywellaidc.com/s/article/How-to-install-the-Honeywell-InterDriver-package-for-CUPS-to-our-REL-Server?

apt install make automake autoconf gcc -y
tar -xvzf CUPS-driver_v1.2-56.tgz
cd cupsdriver-1.2-56/
./build.sh
service cups restart

Теперь можно добавлять принтер уже из интерфейс CUPS. Входим под учетной записью root
https://192.168.116.138:631/admin/
Добавляем принтер. Настраиваем размер этикетки. Так как принтер сетевой то в подключении будет

socket://ИП_ПРИНТЕРА:9100

Имя принтера PC43d
После установки его можно будет увидеть в консоли

lpstat -a
PC43d принимает запросы с момента Пн 12 ноя 2018 12:41:17

Пишем скрипты печати этикеток

Изначально думал писать на bash, но входе эксперимента оказалось что bash не умеет в форматирование русских букв, а именно printf.
Или дело не в bash, так как в консоли отображается как надо, а при вызове скрипта из php все съезжает
Как выяснилось позже – это проблема локали, но к тому моменту я уже написал скрипты на python, и проверять не было никакого желания

Скрипты
На данный момент будет 2 скрипта. Один для печати этикетки на карточку и второй для этикетки тонкого клиента на производство. Остальные уже можно будет добавлять по аналогии.
Печать карточки

nano prohod.py
#!/usr/bin/python3.5
import sys

param_iname = sys.argv[1]
param_fname = sys.argv[2]
param_sname = sys.argv[3]

print("{:1s}{:═^28s}{:1s}".format("╔","","╗"))
print("{:1s} {:26s} {:1s}".format("║","ООО \"Вопа-Супафирма\"","║"))
print("{:1s}{:═^28s}{:1s}".format("╠","","╣"))
print("{:1s} {:22s} {:1s}".format("║ Ф :",param_iname,"║"))
print("{:1s} {:22s} {:1s}".format("║ И :",param_fname,"║"))
print("{:1s} {:22s} {:1s}".format("║ О :",param_sname,"║"))
print("{:1s}{:═^28s}{:1s}".format("╚","","╝"))

Печать этикетки арма

nano arm.py
#!/usr/bin/python3.5
import sys

param_iname = sys.argv[1]
param_fname = sys.argv[2]
param_sname = sys.argv[3]

print("{:1s}{:═^36s}{:1s}".format("╔","","╗"))
print("{:1s} {:34s} {:1s}".format("║","ООО \"Вопа-Супафирма\"","║"))
print("{:1s}{:═^36s}{:1s}".format("╠","","╣"))
print("{:1s} {:28s} {:1s}".format("║ ID  :",param_iname,"║"))
print("{:1s} {:28s} {:1s}".format("║ IP  :",param_fname,"║"))
print("{:1s} {:28s} {:1s}".format("║ MAC :",param_sname,"║"))
print("{:1s}{:═^36s}{:1s}".format("╚","","╝"))

Делаем скрипты исполняемыми

chmod +x arm.py 
chmod +x prohod.py 

Проверяем работу
Наибольшую проблему составляли двойные части ФИО, и она была решена
автоформатирование python

Выводим на печать

./prohod.py "Проверочный" "Тестов" "Шабулды Ибн Питон" | lp -d PC43d
./arm.py PK-ARM-01 192.168.1.1 123456789 | lp -d PC43d

Пишем к скриптам WEB интерфейс

Создадим папку с сайтом

mkdir /var/www/html/etiket/

Создадим виртуальный хост в nginx

nano /etc/nginx/sites-enabled/etiket
server {
    listen 80;
    server_name etiket etiket.ima.domena;

    root /var/www/html/etiket/;
    index index.php;
   
    location / {
	try_files $uri $uri/ =404;
        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }

    location ~ \.php$ {
         include snippets/fastcgi-php.conf;
         fastcgi_pass 127.0.0.1:9000;
    }
 
    location ~ /\.ht {
         deny all;
    }
}
nginx -t
service nginx restart

Чтобы сайт откликался по имени, необходимо прописать имя сервера и сайта или в файл host, или глобально в DNS

Переходи в папку сайта. Копируем туда скрипты. И создаем файл index.php
Должно выйти 3 файла

arm.py
index.php
prohod.py

Содержимое файла index.php

nano index.php
<html lang="ru">
<head>
        <title>Печать этикеток</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

<h1>Печать карточки</h1>
<form method = "post">
<input type="text" name="field1" placeholder="Фамилия" /><input type="text" name="field2" placeholder="Имя" />
<input type="text" name="field3" placeholder="Отчество" />
<input type="submit" name="but1" value="Печать" />
</form>

<h1>Печать этикетки арма</h1>
<form method = "post">
<input type="text" name="field1" placeholder="Имя ПК" />
<input type="text" name="field2" placeholder="IP Адрес" />
<input type="text" name="field3" placeholder="MAC Адрес" />
<input type="submit" name="but2" value="Печать" />
</form>

<?php

if($_POST['but1']){
        $inam = $_POST['field1'];
        $fama = $_POST['field2'];
        $otch = $_POST['field3'];

        $inam = escapeshellarg($inam);
        $fama = escapeshellarg($fama);
        $otch = escapeshellarg($otch);

        $output1 = shell_exec("LANG=ru_RU.UTF-8 ./prohod.py $inam $fama $otch | lp -d PC43d");
        echo "<br><h2>Напечатана этикетка для карточки</h2>";
        echo $output1;
}

if($_POST['but2']){
        $id  = $_POST['field1'];
        $ip  = $_POST['field2'];
        $mac = $_POST['field3'];

        $id  = escapeshellarg($id);
        $ip  = escapeshellarg($ip);
        $mac = escapeshellarg($mac);

        $output1 = shell_exec("LANG=ru_RU.UTF-8 ./arm.py $id $ip $mac | lp -n 3 -d PC43d");

        echo "<br><h2>Напечатана этикетка для арма</h2>";
        echo "<pre>$output1</pre>";

}

?>

</body>
</html>

Переходим на наш сайт и проверяем печать
http://etiket.ima.domena
печать этикеток

Защита паролем

Добавим пароль через файл .htaccess

Создадим пароль nginx для пользователя admin

htpasswd -c /etc/nginx/.htpasswd admin

Создадим файл .htaccess для сайта

nano /var/www/html/etiket/.htaccess
AuthType Basic
AuthName admin
require valid-user

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *