1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#!/bin/bash
# ==> usb.sh
# ==> Script for mounting and installing pen/keychain USB storage devices.
# ==> Runs as root at system startup (see below).
# ==>
# ==> Newer Linux distros (2004 or later) autodetect
# ==> and install USB pen drives, and therefore don't need this script.
# ==> But, it's still instructive.
# This code is free software covered by GNU GPL license version 2 or above.
# Please refer to http://www.gnu.org/ for the full license text.
#
# Some code lifted from usb-mount by Michael Hamilton's usb-mount (LGPL)
#+ see http://users.actrix.co.nz/michael/usbmount.html
#
# INSTALL
# -------
# Put this in /etc/hotplug/usb/diskonkey.
# Then look in /etc/hotplug/usb.distmap, and copy all usb-storage entries
#+ into /etc/hotplug/usb.usermap, substituting "usb-storage" for "diskonkey".
# Otherwise this code is only run during the kernel module invocation/removal
#+ (at least in my tests), which defeats the purpose.
#
# TODO
# ----
# Handle more than one diskonkey device at one time (e.g. /dev/diskonkey1
#+ and /mnt/diskonkey1), etc. The biggest problem here is the handling in
#+ devlabel, which I haven't yet tried.
#
# AUTHOR and SUPPORT
# ------------------
# Konstantin Riabitsev, <icon linux duke edu>.
# Send any problem reports to my email address at the moment.
#
# ==> Comments added by ABS Guide author.
SYMLINKDEV=/dev/diskonkey
MOUNTPOINT=/mnt/diskonkey
DEVLABEL=/sbin/devlabel
DEVLABELCONFIG=/etc/sysconfig/devlabel
IAM=$0
##
# Functions lifted near-verbatim from usb-mount code.
#
function allAttachedScsiUsb {
find /proc/scsi/ -path '/proc/scsi/usb-storage*' -type f |
xargs grep -l 'Attached: Yes'
}
function scsiDevFromScsiUsb {
echo $1 | awk -F"[-/]" '{ n=$(NF-1);
print "/dev/sd" substr("abcdefghijklmnopqrstuvwxyz", n+1, 1) }'
}
if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]; then
##
# lifted from usbcam code.
#
if [ -f /var/run/console.lock ]; then
CONSOLEOWNER=`cat /var/run/console.lock`
elif [ -f /var/lock/console.lock ]; then
CONSOLEOWNER=`cat /var/lock/console.lock`
else
CONSOLEOWNER=
fi
for procEntry in $(allAttachedScsiUsb); do
scsiDev=$(scsiDevFromScsiUsb $procEntry)
# Some bug with usb-storage?
# Partitions are not in /proc/partitions until they are accessed
#+ somehow.
/sbin/fdisk -l $scsiDev >/dev/null
##
# Most devices have partitioning info, so the data would be on
#+ /dev/sd?1. However, some stupider ones don't have any partitioning
#+ and use the entire device for data storage. This tries to
#+ guess semi-intelligently if we have a /dev/sd?1 and if not, then
#+ it uses the entire device and hopes for the better.
#
if grep -q `basename $scsiDev`1 /proc/partitions; then
part="$scsiDev""1"
else
part=$scsiDev
fi
##
# Change ownership of the partition to the console user so they can
#+ mount it.
#
if [ ! -z "$CONSOLEOWNER" ]; then
chown $CONSOLEOWNER:disk $part
fi
##
# This checks if we already have this UUID defined with devlabel.
# If not, it then adds the device to the list.
#
prodid=`$DEVLABEL printid -d $part`
if ! grep -q $prodid $DEVLABELCONFIG; then
# cross our fingers and hope it works
$DEVLABEL add -d $part -s $SYMLINKDEV 2>/dev/null
fi
##
# Check if the mount point exists and create if it doesn't.
#
if [ ! -e $MOUNTPOINT ]; then
mkdir -p $MOUNTPOINT
fi
##
# Take care of /etc/fstab so mounting is easy.
#
if ! grep -q "^$SYMLINKDEV" /etc/fstab; then
# Add an fstab entry
echo -e \
"$SYMLINKDEV\t\t$MOUNTPOINT\t\tauto\tnoauto,owner,kudzu 0 0" \
>> /etc/fstab
fi
done
if [ ! -z "$REMOVER" ]; then
##
# Make sure this script is triggered on device removal.
#
mkdir -p `dirname $REMOVER`
ln -s $IAM $REMOVER
fi
elif [ "${ACTION}" = "remove" ]; then
##
# If the device is mounted, unmount it cleanly.
#
if grep -q "$MOUNTPOINT" /etc/mtab; then
# unmount cleanly
umount -l $MOUNTPOINT
fi
##
# Remove it from /etc/fstab if it's there.
#
if grep -q "^$SYMLINKDEV" /etc/fstab; then
grep -v "^$SYMLINKDEV" /etc/fstab > /etc/.fstab.new
mv -f /etc/.fstab.new /etc/fstab
fi
fi
exit 0
|