Skip to main content

CUPS + HL-2140 (USB printer) + WZR-HP-G300NH + OpenWRT

Why running CUPS on the router?

I've had a small home server running Ubuntu to server the whole house, but it seems I'm the only one using it fully. I had my Brother HL-2140 connected to the server but since I've some spare room left in the router, why not run the print server on the router?

But why CUPS?

The other option I've is running non-spooling server, p910nd, but I believe I should make full use of the free space/memory on the router. If the router overloaded, I'll consider using p910nd later on.

What needs to be done to get CUPS running?

You need a capable router, WZR-HP-G300NH is one. It has 32MB flash ROM and 64MB RAM. I'm currently running OpenWrt Backfire 10.03.1-RC6 on it.

To install CUPS, just use LUCI to install the cups package.

How about getting the HL-2140 USB printer to work along?

There is nothing special, cups seems to have supported USB printer, so we shouldn't need to install the kmod-usb-printer package. It seems that the CUP's backend needs libusb, so, please install the libusb package.

just install the kmod-usb-printer package from LUCI, this will also install all the required packages such as kmod-usb-core, kmod-usb-ohci and kmod-usb2. If everything working, you'll see the following messages from dmesg or system log:

usblp0: USB Bidirectional printer dev 9 if 0 alt 0 proto 2 vid 0x04F9 pid 0x0033
usbcore: registered new interface driver usblp

There should be new device available: /dev/lp0

If everything works, you'll see your printer when you issue the following command:
root@OpenWrt:/mnt/share# /usr/lib/cups/backend/usb
DEBUG: list_devices
DEBUG: usb_find_busses=1
DEBUG: usb_find_devices=5
direct usb://Brother/HL-2140%20series?serial=F9J555425 "Brother HL-2140 series" "Brother HL-2140 series" "MFG:Brother;CMD:PJL,HBP;MDL:HL-2140 series;CLS:PRINTER;" ""

That is it?

Not so fast young man, there are few more things need to be done especially spooling. Since we've pretty much limited space, adding external USB storage is recommended. I've few USB sticks that I don't really use. So, I got myself a 4-port hub. Stick the 4GB USB stick, format it with ext4 and mount it. To get the USB storage working, I've installed kmod-usb-storage (I believe this will install few other packages too), kmod-fs-ext4 and e2fsprogs (to prepare the USB stick). Format the stick and mount it to /mnt/share and using LUCI, configure to make this mounted during bootup time.

The standard configuration file for CUPS has the USB pointing to /dev/usb/lp0 but OpenWRT has instead created /dev/lp0. So, edit /etc/cups/printers.conf and change that. Otherwise CUPS won't find the USB printer.

Here is my /etc/cups/cupsd.conf configuration file:
AccessLog syslog
ErrorLog syslog
LogLevel info
PageLog syslog
PreserveJobHistory No
PreserveJobFiles No
AutoPurgeJobs Yes
MaxJobs 25
MaxPrinterHistory 10
User root
Group root
RIPCache 512k
TempDir /mnt/share/cups
RequestRoot /mnt/share/cups
# Allow remote access
Port 631
Listen /var/run/cups/cups.sock
HostNameLookups Off
KeepAlive On
# Share local printers on the local network.
Browsing On
BrowseOrder allow,deny
BrowseAddress @LOCAL
BrowseLocalProtocols CUPS
BrowseProtocols cups
< Location />
# Allow shared printing and remote administration...
Order allow,deny
Allow all
< /Location>
< Location /admin>
AuthType Basic
AuthClass System
# Allow remote administration...
Order allow,deny
Allow all
< /Location>
< Location /admin/conf>
AuthType Default
Require user @SYSTEM
# Allow remote access to the configuration files...
Order allow,deny
Allow all
< /Location>

NOTE: The code above won't allow me to have '< >' so, I put a space after the '<' .. So, edit and remove the space if you want to cut and paste my configuration. Yes, I'm allowing everyone to get access to CUPS configuration interface. You're free to edit it for sure. To add the printer, just go to http://your-router-ip-address:631 Go to administration, add printer, select the AppSocket/HP JetDirect option. Remember the output from /usr/lib/cups/backend/usb? Use the URI there and paste it into the "Connection" field. Example, for my printer, the URI returned by the backend command is: usb://Brother/HL-2140%20series?serial=F9J555425

Cut and paste the above into "Connection" field.

Somehow, we're not allowed by cups to have both User and Group to be the same, so to force the the backend to run as root, change the permission for /usr/lib/cups/backend/usb to 700.

Make sure cupsd running, so, fire it up in LUCI under System -> Startup, enable it and click start.

What else need to be done?

I had a problem when trying to print from my Mac, I'm getting an authentication error. Checking the syslog, there is this error: "Returning IPP client-error-not-authorized for Print-Job" and from my Mac, I'm getting "Authentication Required to Print" error. I didn't realised that I did not click on the "Share" option for the printer. So, if you're getting this error.. check if the printer has "Share This Printer" option ticked.

That is all .. have fun to get your printer + CUPS running on your router.

Thanks for the Openwrt wiki, somehow, my previous setup was working great until suddenly it won't print anything after I upgraded my router to the latest 10.03.01 backfire. So, please check for updated guide here:


This comment has been removed by a blog administrator.

Popular posts from this blog

Raspberry Pi + svxlink = Low power echolink node

What is the easiest way to get echolink node up and running on raspberry pi? Surely, get a premade image which has everything inside. I've created one image which can fit into 2GB SD card for this, just follow the following steps to get it up and running:

For hardware, you need to have the following:
Raspberry Pi for sure, with a minimum 4GB SD cardA USB echolink interface, can be commercially sourced or DIY. There are many DIY schematics out there that you could follow.  Here is the configuration on how to get the things working together, courtesy of website:

For software:
Download the following prepared image from google drive, it is based on raspbian-2015-02-16 image and has pre-installed svxlink-14.08. raspi-wheezy-svxlink.img.zipUnzip the file and copy it to your SD card using the following instructions that can be found here.Boot up the RasPi, if you do not have an HDMI monitor, you may want to access the RasPi from your terminal emulator (putty or the like), connec…

Configuring TechniColor TG784N V3 (Maxis issued broadband router) to use different DNS servers

Previous write up deleted. It seems to change the DNS servers in as shown on the status, but it does not really work.

Check the following website, this seems to work:

This can be done from the WEB GUI too, go into the following configuration path:

In my example above, I'm using paid service unblock-us instead of google public DNS servers.

Debugging DMEE

I've come across many posting on the Internet (via google search), people asking on how to debug a DMEE for payment program. One of the few suggestion was to create a user exit just before the node that we would like to debug and put our breakpoint there. It seems that SAP has built-in this feature without needing us to create a user exit (available in ECC 6, have no idea if this is available on prior releases). Here is how you can put your breakpoint without any coding.

1. Display your DMEE tree using transaction: DMEE_DEBUG.

2. Click on the node that you would like to debug.
3. Go to conditions tab, you could see the Set Breakpoint button. Click to set.

4. Run the SAPFPAYM and specified the payment run date/id, payment format etc. SAP will stop at the node which you point your breakpoint at, as in 2.
5. To remove your breakpoint, just run the DMEE_DEBUG again, there is an option to delete all own breakpoints or all.