#!/bin/bash # /usr/sbin/do-hotmnt LOG_FILE=/tmp/usbwatch.log BASE_MOUNT_POINT=/mnt/usbwatch GRID_INTERVAL=64 echo "We've made it to do-hotmnt!" >> /var/log/messages rm -f /etc/X11/usbwatch/usbwatch.lnk cp /etc/X11/usbwatch/links/usbwatch-on.lnk /etc/X11/usbwatch/usbwatch.lnk usbwatch.restart echo -en "" > $LOG_FILE getparam(){ case "$PARSE_LINE" in *\ $1=*) ;; *) return 1; ;; esac result="${PARSE_LINE##*$1=}" result="${result%%[ ]*}" echo "$result" return 0 } checkparam(){ case "$PARSE_LINE" in *\ $1*) return 0;; esac return 1 } if [[ "`echo $INTERFACE |grep "8/*"`" != "" ]] && [[ "`echo $TYPE|grep "0/*"`" != "" ]] ; then if [[ $ACTION = "add" ]] ; then # modprobe usb-storage &> /dev/null sleep 3 if [[ `lsmod | grep usb-storage &> /dev/null` = "" ]] ; then modprobe usb-storage >> $LOG_FILE sleep 2 fi echo "Waiting 7 seconds for devices to register" >> /var/log/messages sleep 7 # SCSI_DEVICES=`blkid 2> /dev/null|grep /dev/sd |cut -f1 -d:` #SCSI_DEVICES=`cat /proc/partitions |grep sd |rev | cut -f1 -d' ' |rev` #echo SCSI_DEVICES=$SCSI_DEVICES >> /var/log/messages if [[ `dmesg | tail -n 10 | grep "USB Mass Storage device found"` != "" ]] ; then DMESG_DEVICE=`dmesg | tail -n 10 | grep "USB Mass Storage device found" |tail -n 1 |rev |cut -f1 -d' ' |rev` fi if [[ "$DMESG_DEVICE" = "" ]] ; then sleep 5 DMESG_DEVICE=`dmesg | tail -n 10 | grep "USB Mass Storage device found" |tail -n 1 |rev |cut -f1 -d' ' |rev` fi echo DMESG_DEVICE=$DMESG_DEVICE >> /var/log/messages # DMESG_DEVICE=`echo $DMESG_DEVICE |rev |cut -f1 -d' ' |rev` if [[ `echo $DEVICE |grep $DMESG_DEVICE` ]] ; then echo "Found a match between $DEVICE and $DMESG_DEVICE" >> /var/log/messages fi if [[ `dmesg | tail -n 20 | grep "SCSI device"` != "" ]] ; then MAIN_DEVICE=`dmesg | tail -n 20 | grep "SCSI device" |tail -n 1 |cut -f1 -d: |rev |cut -f1 -d' ' |rev` fi if [ "$MAIN_DEVICE" = "" ] ; then sleep 5 MAIN_DEVICE=`dmesg | tail -n 20 | grep "SCSI device" |tail -n 1 |cut -f1 -d: |rev |cut -f1 -d' ' |rev` fi if [[ "$MAIN_DEVICE" = "" ]] ; then MAIN_DEVICE=`cat /proc/partitions | grep sd |rev |cut -f1 -d' ' |rev |grep -v [0-9]` fi if [ "$MAIN_DEVICE" = "" ] ; then sleep 5 MAIN_DEVICE=`cat /proc/partitions | grep sd |rev |cut -f1 -d' ' |rev |grep -v [0-9]` #echo MAIN_DEVICE=$MAIN_DEVICE fi echo MAIN_DEVICE=$MAIN_DEVICE >> /var/log/messages if [[ `blkid | grep $MAIN_DEVICE` != "" ]] ; then SCSI_DEVICES=`blkid | grep $MAIN_DEVICE |cut -f1 -d:` fi #while [ "$SCSI_DEVICES" = "" ] ; do #sleep 2 #SCSI_DEVICES=`blkid | grep sd |cut -f1 -d:` #done # SCSI_DEVICES=`blkid | grep sd |cut -f1 -d:` SCSI_DEVICES=`fdisk -l | grep /dev/sd |grep -v Disk |cut -f1 -d' '` echo SCSI_DEVICES=$SCSI_DEVICES >> /var/log/messages X_COUNTER=0 Y_COUNTER=1 for disk in $SCSI_DEVICES ; do part=`echo $disk |rev |cut -f1 -d/ |rev` PARSE_LINE=`blkid $disk` PART_TYPE=`getparam TYPE 2> /dev/null |tr -d '"'` if [[ "$PART_TYPE" = "reiserfs" ]] ; then MOUNT_OPTIONS="users,exec,rw" elif [[ "$PART_TYPE" = "ext2" ]] || [[ "$PART_TYPE" = "ext3" ]] ; then MOUNT_OPTIONS="users,dev,exec,suid,rw" elif [[ "$PART_TYPE" = "vfat" ]] || [[ "$PART_TYPE" = "msdos" ]] ; then MOUNT_OPTIONS="umask=000,users,noexec,rw" elif [[ "$PART_TYPE" = "ntfs" ]] ; then MOUNT_OPTIONS="umask=000,users,noexec,rw" fi echo "Checking $disk..." >> /var/log/messages if [[ "$PART_TYPE" = "swap" ]] ; then echo "Skipping swap partition." >> /var/log/messages elif [[ `cat /proc/mounts |grep $disk` != "" ]] ; then echo "Partition $part is already mounted" >> /var/log/messages #elif [[ `fdisk -l |grep sd$disk$part` != "" ]] ; then #echo "Found partition sd$disk$part already mounted?" >> /var/log/messages else echo "Partition $part is not mounted." >> /var/log/messages PRODUCT_LABEL=`echo "$PRODUCT" | sed -e 's;/;_;g'` MOUNT_LABEL=$PRODUCT_LABEL/$part if [[ `cat /etc/fstab |grep $disk |grep -v '#'` = "" ]] ; then if [[ `blkid |grep $disk` ]] ; then echo "No entry found in /etc/fstab for $part " >> /var/log/messages if [[ ! -d $BASE_MOUNT_POINT/$MOUNT_LABEL ]] ; then echo "No mount-point found for $MOUNT_LABEL in $BASE_MOUNT_POINT" >> /var/log/messages echo "Creating mount-point: $BASE_MOUNT_POINT/$MOUNT_LABEL" >> /var/log/messages mkdir -p $BASE_MOUNT_POINT/$MOUNT_LABEL else echo "Mount-point already exists: $BASE_MOUNT_POINT/$MOUNT_LABEL" >> /var/log/messages fi fi else echo "Found an entry already in /etc/fstab for $part " >> /var/log/messages # mount the device simply without args? Better still check it against blkid fi # mount -t $PART_TYPE -o users,exec,sync,rw,umask=000 $disk $BASE_MOUNT_POINT/$MOUNT_LABEL >> $LOG_FILE 2>&1 if [[ "$PART_TYPE" = "reiserfs" ]] ;then true else mount -t $PART_TYPE -o $MOUNT_OPTIONS $disk $BASE_MOUNT_POINT/$MOUNT_LABEL >> /var/log/messages fi NOT_MOUNTED=$? while [ $NOT_MOUNTED -ne 0] ; do sleep 1 echo "Waiting for mount to finish " >> /var/log/messages [[ `mount |grep $disk` != "" ]] && NOT_MOUNTED=0 done if [ $NOT_MOUNTED -ne 0 ]; then mount -t auto -o users,exec,rw $disk $BASE_MOUNT_POINT/$MOUNT_LABEL NOT_MOUNTED=$? fi if [ $NOT_MOUNTED -eq 0 ]; then echo "xtdesk.restart" >> $LOG_FILE echo "Mount successful!" >> /var/log/messages # sync REMOVER=/var/run/usb/$(echo "$DEVICE" | sed -e 's;/;_;g')_$part HANDLER=/var/run/usb/$(echo "$DEVICE" | sed -e 's;/;_;g')_$part.menu echo "REMOVER is: $REMOVER" >> /var/log/messages #cp /etc/X11/usbwatch/usbmedia.lnk.hide /etc/X11/usbwatch/usbmedia.lnk #ln -sf /etc/hotplug.d/usb/usbwatch.off $REMOVER let "X_POS=$X_COUNTER * $GRID_INTERVAL" let "Y_POS=$Y_COUNTER * $GRID_INTERVAL" echo "COUNTERS: $X_COUNTER $Y_COUNTER" >> /var/log/messages DEVICE_NAME=$(echo "$DEVICE" | sed -e 's;/;_;g') if [[ "$PART_TYPE" = "reiserfs" ]] ; then START_STATUS=unmounted else START_STATUS=mounted fi export disk part BASE_MOUNT_POINT MOUNT_LABEL X_POS Y_POS REMOVER \ DEVICE_NAME PRODUCT_LABEL PART_TYPE START_STATUS HANDLER CAPTION sed \ -e "s:@CAPTION\@:$part:" \ -e "s'@disk\@'$disk'g" \ -e "s'@PART_TYPE\@'$PART_TYPE'g" \ -e "s'@MOUNT_OPTIONS\@'$MOUNT_OPTIONS'g" \ -e "s'@BASE_MOUNT_POINT\@'$BASE_MOUNT_POINT'g" \ -e "s'@MOUNT_LABEL\@'$MOUNT_LABEL'g" \ -e "s:@X_POS\@:$X_POS:" \ -e "s:@Y_POS\@:$Y_POS:" \ -e "s'@HANDLER\@'$HANDLER'g" \ /etc/X11/usbwatch/links/$PART_TYPE-mounted.lnk > /var/run/usb/$part-mounted.lnk sed \ -e "s:@CAPTION\@:$part:" \ -e "s'@disk\@'$disk'g" \ -e "s'@PART_TYPE\@'$PART_TYPE'g" \ -e "s'@MOUNT_OPTIONS\@'$MOUNT_OPTIONS'g" \ -e "s'@BASE_MOUNT_POINT\@'$BASE_MOUNT_POINT'g" \ -e "s'@MOUNT_LABEL\@'$MOUNT_LABEL'g" \ -e "s:@X_POS\@:$X_POS:" \ -e "s:@Y_POS\@:$Y_POS:" \ -e "s'@HANDLER\@'$HANDLER'g" \ /etc/X11/usbwatch/links/$PART_TYPE-unmounted.lnk > /var/run/usb/$part-unmounted.lnk cp /var/run/usb/$part-$START_STATUS.lnk /etc/X11/usbwatch/$part.lnk sed \ -e "s'@part\@'$part'g" \ -e "s'@BASE_MOUNT_POINT\@'$BASE_MOUNT_POINT'g" \ -e "s'@MOUNT_LABEL\@'$MOUNT_LABEL'g" \ -e "s'@LOG_FILE\@'$LOG_FILE'" \ -e "s'@DESKTOP_LINK\@'/etc/X11/usbwatch/$(echo "$DEVICE" | sed -e 's;/;_;g')_$PRODUCT_LABEL_$part.lnk'" \ /etc/X11/usbwatch/removers/$PART_TYPE.remover > $REMOVER chmod 755 $REMOVER # usbwatch.restart sed \ -e "s'@disk\@'$disk'g" \ -e "s'@part\@'$part'g" \ -e "s'@DEVICE_NAME\@'$DEVICE_NAME'g" \ -e "s'@PART_TYPE\@'$PART_TYPE'g" \ -e "s'@MOUNT_OPTIONS\@'$MOUNT_OPTIONS'g" \ -e "s'@BASE_MOUNT_POINT\@'$BASE_MOUNT_POINT'g" \ -e "s'@MOUNT_LABEL\@'$MOUNT_LABEL'g" \ /etc/X11/usbwatch/handlers/$PART_TYPE.handler > $HANDLER chmod 755 $HANDLER usbwatch.restart let "Y_COUNTER=$Y_COUNTER + 1" if [ $Y_COUNTER -gt 9 ] ; then X_COUNTER=`expr ${X_COUNTER} + 1` Y_COUNTER=1 fi sleep .5 # ln -sf /etc/hotplug.d/usb/usb-storage.off "$REMOVER" #mesg REMOVER Created for $SUB_DEVICE # echo make REMOVER in $REMOVER else echo "Failed to mount partition: $part" >> $LOG_FILE sleep 1 fi fi done else if [[ $ACTION = "remove" ]] ; then echo "Remove device?" >> /var/log/messages HANDLERS=/var/run/usb/$(echo "$DEVICE" | sed -e 's;/;_;g')_*.menu REMOVERS=`ls /var/run/usb/$(echo "$DEVICE" | sed -e 's;/;_;g')* |sort -r` for rem in $REMOVERS ; do [[ -x $rem ]] && $rem && rm $rem # rm -f /etc/X11/usbwatch/$part.lnk done for handler in $HANDLERS ; do rm $handler done # rmmod usb-storage # change the icon back to inactive rm -f /etc/X11/usbwatch/usbwatch.lnk cp /etc/X11/usbwatch/links/usbwatch-off.lnk /etc/X11/usbwatch/usbwatch.lnk rmdir $BASE_MOUNT_POINT/`echo "$PRODUCT" | sed -e 's;/;_;g'` echo "Removed directory $BASE_MOUNT_POINT/`echo "$PRODUCT" | sed -e 's;/;_;g'`" >> /var/log/messages sleep 1 usbwatch.restart fi fi fi echo "exiting do-hotmnt" >> /var/log/messages exit 0