label-printer: webserver works, test script works, tested with two printers

This commit is contained in:
Jed Reynolds
2020-10-05 13:38:34 -07:00
parent 86b5fb89b4
commit a78171f6e8
2 changed files with 215 additions and 43 deletions

View File

@@ -4,15 +4,30 @@ This is a small python webserver intended to run on a testing network resource
where the lf_kinstall.pl script can post build machine information to. A useful where the lf_kinstall.pl script can post build machine information to. A useful
place to install this script would be on an APU2 being used as a VPN gateway. place to install this script would be on an APU2 being used as a VPN gateway.
Use these commands to install LaTeX and html2ps
apt install perlmagick libwww-perl libhtml-parser-perl libpaper-utils ghostscript weblint-perl texlive-base postscript-viewer xhtml2ps html2ps
Consider these commands to install printer drivers:
Dymo LabelWriter-450:
apt install printer-driver-dymo
Brother QL-800:
# apt install brother-cups-wrapper-common brother-cups-wrapper-extra brother-lpr-drivers-common brother-lpr-drivers-extra
Download drivers here:
https://support.brother.com/g/b/downloadtop.aspx?c=us&lang=en&prod=lpql800eus
* download driver
* install driver using
$ sudo dpkg -i dymo*.dpkg
Use these commands to install the script: Use these commands to install the script:
$ sudo cp label-printer.py /usr/local/bin $ sudo cp label-printer.py /usr/local/bin
$ sudo chmod a+x /usr/local/bin/label-printer.py $ sudo chmod a+x /usr/local/bin/label-printer.py
$ sudo cp label-printer.service /lib/systemd/system $ sudo cp label-printer.service /lib/systemd/system
$ sudo systemctl add-wants multi-user.target label-printer.service $ sudo systemctl add-wants multi-user.target label-printer.service
$ sudo systemctl daemon-reload $ sudo systemctl daemon-reload
$ sudo systemctl restart label-printer.service $ sudo systemctl restart label-printer.service
At this point, if you use `ss -ntlp` you should see this script listening on port 8082. At this point, if you use `ss -ntlp` you should see this script listening on port 8082.
@@ -22,12 +37,18 @@ $ sudo ufw allow 8082/tcp
$ sudo ufw reload $ sudo ufw reload
Using kinstall to print labels: Using kinstall to print labels:
Dymo LabelWriter:
$ ./lf_kinstall.pl --print-label http://192.168.9.1:8082/ --printer LabelWriter-450
$ ./lf_kinstall.pl --print-label http://192.168.9.1:8082/ Brother QL-800:
$ ./lf_kinstall.pl --print-label http://192.168.9.1:8082/ --printer QL800
""" """
import os
import logging import logging
import math
from datetime import datetime
from http import server from http import server
from http.server import HTTPServer, BaseHTTPRequestHandler from http.server import HTTPServer, BaseHTTPRequestHandler
from ssl import wrap_socket from ssl import wrap_socket
@@ -46,64 +67,209 @@ class LabelPrinterRequestHandler(BaseHTTPRequestHandler):
self.send_header("Content-type", "text/html") self.send_header("Content-type", "text/html")
self.end_headers() self.end_headers()
def popstr(self, param):
#print ("""TYPE : "%s" """%type(param))
#print ("""TYPE0: "%s" """%type(param[0]))
if type(param) is list:
#print("""LIST: "%s", """%param[0])
return str(param[0])
return str(param)
def do_POST(self): def do_POST(self):
html_filename = "/tmp/label.html"
printer = ""
hostname = ""; hostname = "";
mac_address = ""; mac_address = "";
model = ""; model = "";
serial = ""; serial = "";
length = int(self.headers['Content-Length']) length = int(self.headers['Content-Length'])
field_data = self.rfile.read(length) field_data = self.rfile.read(length).decode("utf-8")
print("Field_data: %s\n"%field_data); print("Field_data: %s\n"%field_data);
fields = parse_qs(field_data) fields = parse_qs(field_data)
pprint(fields) #pprint(fields)
for name in fields: #for name in fields:
print("key %s"%name) # print("""key %s: "%s" %s""" % (name, self.popstr(fields[name]), type(fields[name])))
if "printer" in fields:
if "mac" in fields: printer = self.popstr(fields["printer"])
mac_address = fields["mac"] if (printer is None) or ("" == printer):
err_msg = "printer empty or unset"
self.send_resonse(400)
self.send_header("X-Error", err_msg)
self.end_headers()
self.wfile.write(b"<html><body><li> %s\n"%err_msg)
return
else: else:
err_msg = "printer not submitted"
self.send_response(400) self.send_response(400)
self.send_header("X-Error", "mac address not submitted") self.send_header("X-Error", err_msg)
self.end_headers(); self.end_headers();
self.wfile.write(b"Bullshit\n"); self.wfile.write(b"<html><body><li>%s\n" % err_msg);
return
if "mac" in fields:
mac_address = self.popstr(fields["mac"])
if (mac_address is None) or ("" == mac_address):
err_msg = "mac address empty or unset"
self.send_resonse(400)
self.send_header("X-Error", err_msg)
self.end_headers()
self.wfile.write(b"<html><body><li> %s\n"%err_msg)
return
else:
err_msg = "mac address not submitted"
self.send_response(400)
self.send_header("X-Error", err_msg)
self.end_headers();
self.wfile.write(b"<html><body><li>%s\n" % err_msg);
return return
if "model" in fields: if "model" in fields:
model = fields["model"] model = self.popstr(fields["model"])
if (model is None) or (model == ""):
err_msg = "model name not submitted"
self.send_reponse(400)
self.send_header("X-Error", err_msg)
self.end_headers()
self.wfile.write(b"<html><body><li> %s\n"%err_msg)
return
else: else:
err_msg = "model name not submitted"
self.send_response(400) self.send_response(400)
self.send_header("X-Error", "missing model name") self.send_header("X-Error", err_msg)
self.wfile.write(b"Bullshit\n"); self.wfile.write(b"<html><body><li>%s\n" % err_msg);
return return
if (mac_address is None) or ("" == mac_address): if "hostname" in fields:
self.send_resonse(400) hostname = self.popstr(fields["hostname"])
self.send_header("X-Error", "mac address empty or unset")
self.end_headers()
self.wfile.write(b"missing mac address")
self.wfile.write(b"Bullshit\n");
return
if (model is None) or (model == ""):
self.send_reponse(400)
self.send_header("X-Error", "missing model name")
self.end_headers()
self.wfile.write(b"missing model name")
return
if fields[hostname] is None:
hostname = "%s-%s"%(model, mac.substr(-5).replace(":", ""))
else: else:
hostname = fields[hostname] suffix = mac_address[-5:].replace(":", "")
hostname = "%s-%s"%(model, suffix)
print("HOSTNAME "+hostname)
if "serial" in fields:
serial = self.popstr(fields["serial"])
else:
serial = hostname
now = datetime.now()
datestr = now.strftime("%Y-%m")
self.send_response(200); self.send_response(200);
self.send_header("Content-type", "text/html") self.send_header("Content-type", "text/html")
self.end_headers() self.end_headers()
print("I'm in POST") label_html = self.html_template(model_=model, mac_=mac_address, hostname_=hostname, serial_=serial, datestr_=datestr)
if os.path.exists(html_filename):
try:
os.remove(html_filename)
except:
err_msg = "unable to remove html file"
self.send_response(400)
self.send_header("X-Error", err_msg)
self.wfile.write(b"<html><body><li>%s\n" % err_msg);
return
try:
file = open(html_filename, "w")
file.write(label_html)
file.close()
except:
err_msg = "unable to write html file"
self.send_response(400)
self.send_header("X-Error", err_msg)
self.wfile.write(b"<html><body><li>%s\n" % err_msg);
return
self.print_pdf(printer=printer, html=html_filename)
self.wfile.write(b"<html><body>Success\n")
def html_template(self, model_="unset", mac_="unset", hostname_="unset", serial_="unset", datestr_="unset"):
template = """<html><head></head><body style='margin:0;padding:0;'>
<table border='1' cellpadding='2' cellspacing='0' height="90" style="margin:0;padding:0;float:left;clear:none;">
<tr>
<td width="1in" style="font-size: 5pt;">Model:</td>
<td width="2in" style="font-family: 'Courier New',Courier; font-size: 8pt;"><b><tt>%s</tt></b> <small>(%s)</small></td>
</tr>
<tr>
<td style="font-size: 5pt;">MAC:</td>
<td style="font-family: 'Courier New',Courier; font-size: 8pt;"><b><tt>%s</tt></b></td>
<tr>
<td style="font-size: 5pt;">Hostname:</td>
<td style="font-family: 'Courier New',Courier; font-size: 8pt;"><b><tt>%s</tt></b></td>
<tr>
<td style="font-size: 5pt;">Serial:</td>
<td style="font-family: 'Courier New',Courier; font-size: 8pt;"><b><tt>#%s</tt></b></td>
</tr>
</table></body></html>""" % (model_, datestr_, mac_, hostname_, serial_)
return template
def print_pdf(self, printer, html ):
"""
:param printer:
:param html:
:return:
"""
""" Below is shell script that worked:
w_inches="3.45"
h_inches="1.125"
w_points=`echo "scale=0; ($w_inches * 72)/1" | bc -l`
w_px=`echo "scale=0; ($w_inches * 720)/1" | bc -l`
h_points=`echo "scale=0; ($h_inches * 72)/1" | bc -l`
h_px=`echo "scale=0; ($h_inches * 720)/1" | bc -l`
echo "Page size in Points: $w_points x $h_points"
echo "Page size in pixels: $w_px x $h_px"
rm -f label.pdf
set -x
html2ps -L label.html \
| gs -o label.pdf \
-g${h_px}x${w_px} \
-sDEVICE=pdfwrite \
-dFIXEDMEDIA \
-dPDFFitPage \
-dFitPage \
-c '<</PageOffset [-80 -44]>> setpagedevice' \
-f -
"""
w_inches = 3.45
h_inches = 1.125
w_points = math.floor(w_inches * 72)
w_px = math.floor(w_inches * 720)
h_points = math.floor(h_inches * 72)
h_px = math.floor(h_inches * 720)
pdf_file = "/tmp/label.pdf"
pageoffset = "<</PageOffset [-80 -44]>> setpagedevice"
geometry = "-g{}x{}".format(h_px, w_px)
if os.path.exists(pdf_file):
try:
os.remove(pdf_file)
except:
err_msg = "unable to remove html file"
self.send_response(400)
self.send_header("X-Error", err_msg)
self.wfile.write(b"<html><body><li>%s\n" % err_msg);
return
cmd = """html2ps -L "%s" | gs -o "%s" %s -sDEVICE=pdfwrite -dFIXEDMEDIA -dPDFFitPage -dFitPage -c '%s' -f -""" \
% (html, pdf_file, geometry, pageoffset)
print("CMD: "+cmd)
try:
os.system(cmd)
os.system("""lp -d "%s" -- "%s" """%(printer, pdf_file))
except:
err_msg = "trouble printing pdf"
self.send_response(500)
self.send_header("X-Error", err_msg)
self.wfile.write(b"<html><body><li>%s\n" % err_msg);
return
def __main__(): def __main__():

10
label-printer/test.bash Normal file → Executable file
View File

@@ -1,4 +1,10 @@
#!/bin/bash #!/bin/bash
curl -d 'model=lf0350&mac=00:0e:84:33:44:55:66&hostname=&serial=' -X POST http://localhost:8082/ #printer="LabelWriter-450"
curl -d 'model=lf0350&mac=00:00' -X POST http://localhost:8082/ printer="QL-800"
curl -v -d "printer=${printer}&model=lf0350&mac=00:0e:84:33:44:55:66&hostname=vm-atlas20&serial=zoso1234" http://localhost:8082/
sleep 4
curl -v -d "printer=${printer}&model=lf0350&mac=00:0e:84:33:44:55:66&hostname=&serial=" http://localhost:8082/
sleep 4
curl -v -d "printer=${printer}&model=lf0350&mac=00:0e:84:33:44:55:66" http://localhost:8082/