#!/bin/sh

#	foo2zjs-loadfw:
#
#	Hotplug script for HP1000/1005/1020 USB laser printers. The model number
#	that this script deals with is determined from the udev env.
#
#	Used to download firmware automatically into the printer when it
#	is powered up or plugged into the USB port.
#
#	The inspiration fo this script is from:
#		Oscar Santacreu. Alicante-Spain (2002)
#		Mike Morgan (2004)
#	Modified by Stefan Schweizer (2005) to work as a udev-RUN-script

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

#
# Program used to determine USB id information
#
USBID=/usr/bin/usb_printerid

#
# Timeout to load firmware
#
TIMEOUT=6

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

#
#	Figure out the model number from the name of this script
#
case "$1" in
P1005)
    MODEL=P1005; FWMODEL=$MODEL
    MODELNAME="HP LaserJet $MODEL"
    FWDIR=$XQXFW
    ;;
P1006)
    MODEL=P1006; FWMODEL=$MODEL
    MODELNAME="HP LaserJet $MODEL"
    FWDIR=$XQXFW
    ;;
P1007)
    MODEL=P1007; FWMODEL=P1005		# Alias
    MODELNAME="HP LaserJet $MODEL"
    FWDIR=$XQXFW
    ;;
P1008)
    MODEL=P1008; FWMODEL=P1006		# Alias
    MODELNAME="HP LaserJet $MODEL"
    FWDIR=$XQXFW
    ;;
P1505)
    MODEL=P1505; FWMODEL=$MODEL
    MODELNAME="HP LaserJet $MODEL"
    FWDIR=$XQXFW
    ;;
P1505n)
    MODEL=P1505n; FWMODEL=$MODEL
    MODELNAME="HP LaserJet $MODEL"
    FWDIR=$XQXFW
    ;;
1000)
    MODEL=1000; FWMODEL=$MODEL
    MODELNAME="hp LaserJet $MODEL"
    FWDIR=$ZJSFW
    ;;
1005)
    MODEL=1005; FWMODEL=$MODEL
    MODELNAME="hp LaserJet $MODEL"
    FWDIR=$ZJSFW
    ;;
1018)
    MODEL=1018; FWMODEL=$MODEL
    MODELNAME="HP LaserJet $MODEL"
    FWDIR=$ZJSFW
    ;;
1020)
    MODEL=1020; FWMODEL=$MODEL
    MODELNAME="HP LaserJet $MODEL"
    FWDIR=$ZJSFW
    ;;
*)
    log "Only HP LaserJet 1000, 1005, 1018 and 1020 are supported"
    log "You need to supply one of these on the cmdline: $0 10**"
    exit
    ;;
esac

if [ -n "$2" ]; then
    DEVNAME=$2
elif [ -n "$DEVNAME" ]; then
    log 'using $DEVNAME'
else
    log "You need to either have $DEVNAME set in the environment or supply it on the cmdline, like:"
    log "$0 10** /dev/usb/lp0"
    exit 1
fi

#
#	Procedure to load a single device with firmware
#
load1() {
    fw="$FWDIR/sihp$FWMODEL.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 $DEVNAME ..."
    if cat $fw > $DEVNAME; then
	sleep $TIMEOUT
	log "... download successful."
    else
	log "... download failed."
    fi
    return 0
}

#
#	OK, now download firmware to any printers that need it
#
if [ -x $USBID ]; then
	if $USBID $DEVNAME | grep "$MODELNAME" 2> /dev/null; then
	    # This is a LaserJet 100x
	    if $USBID $DEVNAME | grep 'FWVER' 2> /dev/null; then
		log "HP LaserJet $MODEL firmware already loaded into $DEVNAME"
	    else
		# Firmware is not yet loaded
		load1 "$DEVNAME"
	    fi
	else
	    log "No supported printer found."
	fi
else
    log "HP LaserJet $MODEL firmware was not downloaded..."
    log "...couldn't find $USBID"
fi
