13aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#!/bin/bash
23aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
33aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevINSTALL="@INSTALL@"
43aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevHOTPLUGPATH=/etc/hotplug
53aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevSCRIPTNAME=libmtp.sh
63aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevUSERMAP=libmtp.usermap
73aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevUDEVPATH=/etc/udev/rules.d
83aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevUDEVRULES=libmtp.rules
93aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevHALBASEPATH=/usr/share/hal/fdi/information
103aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevHALPATH=/usr/share/hal/fdi/information/20thirdparty
113aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevHALRULES=libmtp.fdi
123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# See if the parameter script ($2), device ($3) and productid ($4)
143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# are already defined in the usermap ($1)
153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfunction inmap {
163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    while read LINE; do
173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if [ "x${LINE}" != "x" ]; then
183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    firstword=`echo ${LINE} | awk '{ print $1 }'`
193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    if [ ${firstword} != "#" ]; then
203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	        # This is a device line entry
213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		script=${firstword}
223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		manid=`echo ${LINE} | awk '{ print $3 }'`
233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		productid=`echo ${LINE} | awk '{ print $4 }'`
243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		# Skip blank products...
253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if [ "x${script}" = "x$2" ]; then 
263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		    if [ "x${manid}" = "x$3" ]; then 
273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			if [ "x${productid}" = "x$4" ]; then
283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			    echo "yes"
293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			    return 0
303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			fi
313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		    fi
323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		fi
333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    fi
343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	fi
353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    done < $1
363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "no"
373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    return 0
383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Scan the usermap $2 for all devices in $1 to see if they are already
413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# there, else patch the usermap.
423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfunction patchusermap {
433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    # Nullify comment
443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    comment=""
453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    while read LINE; do
463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if [ "x$LINE" != "x" ]; then
473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    firstword=`echo ${LINE} | awk '{ print $1 }'`
483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    if [ ${firstword} = "#" ]; then
493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    # This is a comment line, save it.
503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		comment=${LINE}
513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    else
523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	        # This is a device line entry
533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		script=${firstword}
543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		manid=`echo ${LINE} | awk '{ print $3 }'`
553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		productid=`echo ${LINE} | awk '{ print $4 }'`
563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		# Skip blank products...
573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		if [ "x${manid}" != "x" ]; then
583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	            # See if this product is already in the usermap
593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		    echo "Checking for product ${productid} in $2..."
603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		    if [ `inmap $2 ${script} ${manid} ${productid}` = "no" ]; then
613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			echo "Not present, adding to hotplug map."
623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			echo ${comment} >> $2
633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			echo ${LINE} >> $2
643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			comment=""
653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		    else
663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev			echo "Already installed."
673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		    fi
683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		fi
693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    fi
703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	fi
713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    done < $1
723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Check for udev first
753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif test -d ${UDEVPATH} ; then
763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "You seem to have udev on your system. Installing udev rules..."
773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    ${INSTALL} ${UDEVRULES} ${UDEVPATH}
783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "You may need additional setup to get correct permissions on your device."
793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "See the INSTALL file for information."
803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "Do you also want to install HAL support or the old hotplug support (y/n)?"
813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    read IN
823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    if [ "$IN" = "y" ] || [ "$IN" = "Y" ]; then
833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	echo "Continuing..."
843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    else
853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	exit 0
863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    fi
873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Check for HAL next
903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif test -d ${HALBASEPATH} ; then
913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "You seem to have HAL on your system. Installing HAL rules..."
923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    mkdir -p ${HALPATH}
933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    ${INSTALL} ${HALRULES} ${HALPATH}
943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "Do you also want to install the old hotplug support (y/n)?"
953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    read IN
963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    if [ "$IN" = "y" ] || [ "$IN" = "Y" ]; then
973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	echo "Continuing..."
983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    else
993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	exit 0
1003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    fi
1013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
1023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Check prerequisites
1053aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevCOMMAND=`which grep 2> /dev/null`
1063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif [ "x${COMMAND}" = "x" ];
1073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevthen
1083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "Missing grep program. Fatal error."
1093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    exit 1
1103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
1113aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevCOMMAND=`which awk 2> /dev/null`
1123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif [ "x${COMMAND}" = "x" ];
1133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevthen
1143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "Missing awk program. Fatal error."
1153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    exit 1
1163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
1173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif [ "x${USER}" != "xroot" ];
1183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "WARNING: this program should be run as root!"
1193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
1203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# This script locates the hotplug distribution on a certain host
1233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# and sets up userland hotplugging scripts according to rules. 
1243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# The in-parameters are the hotplug directory and the name of a
1253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# file of hotplug device entries and a script to be executed for 
1263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# these deviced.
1273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif test -d ${HOTPLUGPATH}
1293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevthen
1303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "Hotplug in ${HOTPLUGPATH}"
1313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevelse
1323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "Hotplug missing on this system. Cannot install."
1333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    exit 1
1343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
1353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif test -d ${HOTPLUGPATH}/usb 
1373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevthen
1383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "Has usb subdirectory."
1393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevelse
1403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    mkdir ${HOTPLUGPATH}/usb
1413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
1423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevecho "Installing script."
1443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev${INSTALL} libmtp.sh ${HOTPLUGPATH}/usb
1453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevecho "Installing usermap."
1463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev${INSTALL} -m 644 ${USERMAP} ${HOTPLUGPATH}/usb
1473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# If we find a usb.usermap file, and we see that this distribution
1483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# of hotplug does not support private usermaps, then we need to
1493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# patch the usb.usermap file.
1503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#
1513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Create a merged file, diff the files to each other, and if there
1523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# were mismatches, then patch the installed file.
1533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevecho "Checking hotplugging CVS version..."
1543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevecho "/etc/hotplug/usb/*.usermap support was added in august 2002"
1553aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevEDITMAP="yes"
1563aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevCVSTAG=`grep '\$Id:' /etc/hotplug/usb.agent`
1573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif [ "x${CVSTAG}" != "x" ]; then
1583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    DATE=`echo ${CVSTAG} | awk '{ print $5 }'`
1593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "Hotplug version seems to be from ${DATE}"
1603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    YEAR=`echo ${DATE} | awk 'BEGIN { FS="/"} {print $1; }'`
1613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    MONTH=`echo ${DATE} | awk 'BEGIN { FS="/"} {print $2; }'`
1623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    DAY=`echo ${DATE} | awk 'BEGIN { FS="/"} {print $3; }'`
1633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    if [ "${YEAR}" -gt "2002" ]; then
1643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	EDITMAP="no"
1653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    else
1663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	if [ "${YEAR}" -eq "2002" ]; then
1673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    if [ "${MONTH}" -ge "08" ]; then
1683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev		EDITMAP="no"
1693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	    fi
1703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	fi
1713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    fi
1723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
1733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif [ "x${EDITMAP}" == "xyes" ]; then
1743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    echo "We need to edit the ${HOTPLUGPATH}/usb.usermap if it exists..."
1753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    if test -f ${HOTPLUGPATH}/usb.usermap
1763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    then
1773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	echo "We have a usb.usermap..."
1783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	patchusermap ${USERMAP} /etc/hotplug/usb.usermap
1793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    fi
1803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi
1813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevecho "Hotplugging successfully installed."
1833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevexit 0
1853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
186