#!/bin/sh

#	hplj1000:
#	hplj1005:
#	hplj1020:
#
#	Hotplug script for HP1000/1005 USB laser printers.  The model number
#	that this script deals with is determined from the script name.
#
#	Used to download firmware automatically into the printer when it
#	is powered up or plugged into the USB port.
#
#	Also, run this script once with the magic argument "install-usermap"
#	to create the proper entry in the /etc/hotplug/usb.usermap file.
#
#	The inspiration fo this script is from:
#		Oscar Santacreu. Alicante-Spain (2002)
#		Mike Morgan (2004)
#

# udev calls us twice on FC4! Just want /dev/usb/lp<N>
case "$DEVNAME" in
/dev/usb/usb*)	exit;;
esac

PROGNAME="$0"

#
# Set $DEV to, e.g. /dev/usb/lp0, to force the device you want
# Else, leave it null to automatically detect the device
#
DEV=/dev/usb/lp0
DEV=""

#
# Directory to find downloadable HP firmware files sihpMMMM.dl
#
FWDIR=/usr/share/foo2zjs/firmware

#
# Program used to determine USB printer id information
#
# NOTE: /usr/bin is NOT mounted at this point
#
# e.g. /etc/rc.sysinit:
#    /sbin/start_udev
#    [snip]
#    # Mount all other filesystems (except for NFS and /proc, which is already
#
PRINTERID=/bin/usb_printerid

#
#	Figure out how to log our messages
#
if [ -t 1 ]; then
    # Running from a tty...
    log() {
	echo "$PROGNAME: foo2zjs: $@"
    }
elif [ -x /usr/bin/logger ]; then
    # Have logger...
    log() {
	logger -t "$PROGNAME" -- "foo2zjs: $@"
    }
else
    # No logger...
    log() {
	echo "$PROGNAME: foo2zjs: $@" >> /var/log/messages
    }
fi

#
#	Figure out the model number from the name of this script
#
case "$0" in
*P1005)
    MODEL=P1005
    USB1=0x03f0	#Vendor
    USB2=0x3d17	#Model
    FWDIR=/usr/share/foo2xqx/firmware
    ;;
*P1006)
    MODEL=P1006
    USB1=0x03f0	#Vendor
    USB2=0x3e17	#Model
    FWDIR=/usr/share/foo2xqx/firmware
    ;;
*P1007)
    MODEL=P1007
    USB1=0x03f0	#Vendor
    USB2=0x4817	#Model
    FWDIR=/usr/share/foo2xqx/firmware
    ;;
*P1008)
    MODEL=P1008
    USB1=0x03f0	#Vendor
    USB2=0x4917	#Model
    FWDIR=/usr/share/foo2xqx/firmware
    ;;
*P1505)
    MODEL=P1505
    USB1=0x03f0	#Vendor
    USB2=0x3f17	#Model
    FWDIR=/usr/share/foo2xqx/firmware
    ;;
*P1505n)
    MODEL=P1505n
    USB1=0x03f0	#Vendor
    USB2=0x4017	#Model
    FWDIR=/usr/share/foo2xqx/firmware
    ;;
*1000)
    MODEL=1000
    USB1=0x03f0	#Vendor
    USB2=0x0517	#Model
    ;;
*1005)
    MODEL=1005
    USB1=0x03f0	#Vendor
    USB2=0x1317	#Model
    ;;
*1018)
    MODEL=1018
    USB1=0x03f0 #Vendor
    USB2=0x4117 #Model
    ;;
*1020)
    MODEL=1020
    USB1=0x03f0 #Vendor
    USB2=0x2b17 #Model
    ;;
*)
    log "Only HP LaserJet 1000/1005/1018/1020/P1005/P1006/P1505 are supported"
    exit
    ;;
esac

#
#	The special command line argument "install-usermap" will install
#	the proper entry into the /etc/hotplug/usb.usermap file
#
case "$1" in
install-usermap)
    if [ "$USB2" != "" ]; then
	if [ -w /etc/hotplug/usb.usermap ]; then
		USERMAP=/etc/hotplug/usb.usermap
	elif [ -d /etc/hotplug/usb/ ]; then
		USERMAP=/etc/hotplug/usb/foo2zjs.usermap
		if [ ! -s $USERMAP ]; then
			echo > $USERMAP
		fi
	else
		log "No /etc/hotplug usermap!"
		exit
	fi
	chmod 664 $USERMAP
	ex - $USERMAP <<-EOF
	g/^hplj$MODEL/d
	\$a
	hplj$MODEL 0x0003 $USB1 $USB2 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
	.
	w
	q
	EOF
    else
	log "I don't know the USB info for this model yet.  Please run"
	log "usb_printerid on the usb device and send the output to:"
	log "rick.richardson@comcast.net"
    fi
    exit 0
    ;;
esac
 
#
#	Procedure to load a single device with firmware
#
load1() {
    _dev="$1"
    fw="$FWDIR/sihp$MODEL.dl"
    if [ ! -f "$fw" ]; then
	log "Missing HP LaserJet $MODEL firmware file $fw"
	log "...read foo2zjs installation instructions and run ./getweb $MODEL"
	return 1
    fi

    log "loading HP LaserJet $MODEL firmware $fw to $_dev ..."
    # There is a timeout problem with udev and FC4, so spin it off.
    (
	if cat $fw > $_dev; then
	    log "... download successful."
	else
	    log "... download failed."
	fi
    ) &
    return 0
}

#
#	OK, now download firmware to any printers that need it
#
if [ "$DEV" != "" ]; then
    #
    # force downloading to a specific device
    #
    load1 "$DEV"
elif [ -x $PRINTERID ]; then
    #
    # Sniff around for printers that need a firmware download
    #
    usblps=`find /dev/usb -name lp*`" "`find /dev -name usblp*`
    for dev in $usblps; do
	status=`$PRINTERID $dev 2>/dev/null | grep -y "hp LaserJet $MODEL"`
	if [ "$status" != "" ]; then
	    # This is a LaserJet 100x
	    chmod 0666 $dev
	    status=`$PRINTERID $dev | grep 'FWVER'`
	    if [ "$status" = "" ]; then
		# Firmware is not yet loaded
		load1 "$dev"
	    else
		log "HP LaserJet $MODEL firmware already loaded into $dev"
	    fi
	fi
    done
else
    log "HP LaserJet $MODEL firmware was not downloaded..."
    log "...couldn't find $PRINTERID and DEV is not set"
fi
