As an extra wrinkle to the previous post, the new Lexmark is on an UPS. Yes, I can hear you screaming "NEVER PUT A LASER PRINTER ON AN UPS" but I'm a professional, I know what I'm doing. Specifically, I over-engineered my solution.
The problem with a laser printer on a UPS is you might be tempted to print something during a black out. And your UPSes battery will never supply the current your fuser needs. My solution is to build a plug with relays connected to an arduino connected to a computer connected to the UPS. When power goes out, apcupsd on the computer runs a small script that sends a command to the arduino via USB to turn off the relays. The arduino also has a momentary switch. When I push the switch, the arduino turns the relays on. I also have small script that sends the command to turn the relays on.
I probably could have avoided the arduino and used a transistor latch. Power off turns the latch and relays off. Only a button press turns the latch and relays on. But then I couldn't do the following.
One annoying """feature""" of the Lexmark is that it has AirPrint and Wi-fi. I have yet to find out how to turn these off. So the printer spends most of its time turned off. So I wrote a CUPS backend that checks if the printer is on, sends the arduino the "turn on" command if it isn't, then chains to the normal socket backend to actually send the data to the printer.
#!/bin/bash
HWEL=10.0.0.68
LOG=/tmp/hwel-driver.log
if [[ $# == 1 ]] ; then
exec /usr/lib/cups/backend/socket "$@"
fi
function aping () {
local host=$1
if ping -c 1 -q $host >/dev/null ; then
return 0
fi
return 1
}
function ping_wait () {
local host=$1
while true ; do
if ping -c 1 -q $host >/dev/null ; then
return
fi
sleep 2
done
}
status=$(/sbin/apcaccess status localhost:3552 | grep STATUS | cut -d: -f 2)
if [[ $status =~ ONLINE ]] ; then
echo "INFO: hwel battery status=$status" | tee -a $LOG >&2
else
echo "ERROR: hwel battery status=$status" | tee -a $LOG >&2
exit 17
fi
aping $HWEL || sudo /home/fil/bin/hwel-on
ping_wait $HWEL
export DEVICE_URI=socket://$HWEL:9100
exec /usr/lib/cups/backend/socket "$@"
I put this script in /usr/lib/cups/backend/hwel and tell CUPS to use a new URL.
lpadmin -p hwelraw -v hwel://hwel.localdomain:9100
Yes, my printer is called Hwel. Yes, I name all my printers after Discworld dwarfs.