Add print server for label printer to have it easily usable via SSH
Add and configure a print server for the Brother P-touch QL 500 label printer, so that it can be easily used via SSH. Do the following to make that work: - Configure the print server host. - Package printer-driver-ptouch to have a working driver for the label printer. - Configure CUPS. - Add a script "forcecommand-lpr-wrapper", which works together with the ForceCommand sshd_config option and wraps lpr to provide an easy interface to use the Brother QL 500 label printer via SSH. - Add a print user and configure SSH to have the "forcecommand-lpr-wrapper" script accessible without a password using the print user via SSH.
This commit is contained in:
		
					parent
					
						
							
								6a0218c132
							
						
					
				
			
			
				commit
				
					
						c97f169b77
					
				
			
		
					 7 changed files with 248 additions and 0 deletions
				
			
		|  | @ -0,0 +1,84 @@ | |||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| # A script for usage with the ForceCommand sshd_config option. | ||||
| # It calls lpr with some standard arguments, but also parses | ||||
| # SSH_ORIGINAL_COMMAND to potentially provide a different set of arguments to | ||||
| # lpr. | ||||
| # | ||||
| # This wrapper is written for interacting with the Brother QL 500 label printer. | ||||
| # | ||||
| # The following options can be provided as an SSH command and this script will | ||||
| # then pass them to the lpr call: <MediaType> <PageSize> | ||||
| # - MediaType can be one of: | ||||
| #   - Labels | ||||
| #   - Tape (this is the default) | ||||
| # - PageSize can be one of: | ||||
| #   - 12mm | ||||
| #   - 12mm-circular | ||||
| #   - 17x54mm | ||||
| #   - 17x87mm | ||||
| #   - 23x23mm | ||||
| #   - 24mm-circular | ||||
| #   - 29mm | ||||
| #   - 29x90mm | ||||
| #   - 38mm | ||||
| #   - 38x90mm | ||||
| #   - 50mm | ||||
| #   - 54mm | ||||
| #   - 58mm-circular | ||||
| #   - 62mm | ||||
| #   - 62x29mm | ||||
| #   - 62x100mm | ||||
| #   - Custom.WIDTHxHEIGHT (with WIDTH and HEIGHT needing to be either one to | ||||
| #     three digits) | ||||
| #   - label-wide (this being a convenience alias for Custom.62x35mm and it also | ||||
| #     being the default) | ||||
| #   - label-item (this being a convenience alias for 38x90mm) | ||||
| #  | ||||
| # So using these options in a complete setup would look like this for example: | ||||
| # cat label-item.pdf | ssh print@ptouch-print-server.z9.ccchh.net labels label-item | ||||
| # This being equivalent to: | ||||
| # cat label-item.pdf | ssh print@ptouch-print-server.z9.ccchh.net Labels 38x90mm | ||||
| # | ||||
| # The options are case-insensitive. | ||||
| # | ||||
| # The options are derived from: lpoptions -p Brother-QL-500 -l | ||||
| 
 | ||||
| import os, re, subprocess | ||||
| 
 | ||||
| mediaType = "Tape" | ||||
| pageSize = "Custom.62x35mm" | ||||
| 
 | ||||
| def parseGivenOptions(): | ||||
|     givenOptionsString = os.environ["SSH_ORIGINAL_COMMAND"] | ||||
|     givenOptionsIterator = iter(givenOptionsString.split(" ")) | ||||
| 
 | ||||
|     givenMediaType = next(givenOptionsIterator, "") | ||||
|     givenPageSize = next(givenOptionsIterator, "") | ||||
| 
 | ||||
|     global mediaType | ||||
|     if givenMediaType.lower() == "labels": | ||||
|         mediaType = "Labels" | ||||
|     elif givenMediaType.lower() == "tape": | ||||
|         mediaType = "Tape" | ||||
| 
 | ||||
|     global pageSize | ||||
|     pageSizeRegex = re.compile(r"^((12mm(-circular)?)|(24mm-circular)|(58mm-circular)|(((17x(54|87))|(23x23)|((29|38)(x90)?)|(62x(29|100))|50|54|62)mm))$", re.ASCII | re.IGNORECASE) | ||||
|     pageSizeMatch = pageSizeRegex.match(givenPageSize) | ||||
|     pageSizeCustomRegex = re.compile(r"^custom\.(\d{1,3})x(\d{1,3})$", re.ASCII | re.IGNORECASE) | ||||
|     pageSizeCustomMatch = pageSizeCustomRegex.match(givenPageSize) | ||||
|     if givenPageSize.lower() == "label-wide": | ||||
|         pageSize = "Custom.62x35mm" | ||||
|     elif givenPageSize.lower() == "label-item": | ||||
|         pageSize = "38x90mm" | ||||
|     elif pageSizeMatch: | ||||
|         pageSize = givenPageSize.lower() | ||||
|     elif pageSizeCustomMatch: | ||||
|         width = pageSizeCustomMatch.group(1) | ||||
|         height = pageSizeCustomMatch.group(2) | ||||
|         pageSize = "Custom.{}x{}".format(width, height) | ||||
| 
 | ||||
| if "SSH_ORIGINAL_COMMAND" in os.environ: | ||||
|     parseGivenOptions() | ||||
| 
 | ||||
| subprocess.run(["lpr", "-P", "Brother-QL-500", "-o", "MediaType={}".format(mediaType), "-o", "PageSize={}".format(pageSize)]) | ||||
|  | @ -0,0 +1,7 @@ | |||
| from distutils.core import setup | ||||
| 
 | ||||
| setup( | ||||
|     name = "forcecommand-lpr-wrapper", | ||||
|     version = "0.0.1", | ||||
|     scripts = ["./forcecommand-lpr-wrapper.py"] | ||||
| ) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue