linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* My first usb storage automount script :)
@ 2002-12-11 16:22 Wout Mertens
  2003-01-03 23:27 ` Eddie Shi
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Wout Mertens @ 2002-12-11 16:22 UTC (permalink / raw)
  To: linux-hotplug

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1612 bytes --]

Hi there,

I just wanted to share what I hacked up through some frustration. It's a
script that will automatically mount usb devices that are attached.

It ties in to the hotplug architecture as closely as possible, without
changing anything. So then I subscribed to this list to announce it.

Of course, that's when I discovered
http://users.actrix.co.nz/michael/usbmount.html by Michael Hamilton.

So I'll first give a rundown of differences:
My solution:
- only mounts the device that was just inserted (with some luck)
- is called automount_usb, so that, by changing the usb.usermap, it gets
  called every time a device is inserted and not just the first time
- creates remover scripts that have /bin/sh as the only dependency
- creates nicely readable names as mount points
- supports devices with multiple partitions
- is really small

But Michael's solution:
- makes KDE icons
- is easier to read

So, please have a look at the attached code, and tell me what you think
about the device detection code. Michael, if you read this, we could
perhaps merge the two efforts and get all the features.

Also, let's start a thread on making a gui.agent script that gets called
by the hotplug scripts. It would notify the user of hotplug events.
I feel that it should be called with the same environment as the other
agents, with an extra HOTPLUG_PATH variable indicating the path on which
the device is available, if applicable.

This could then be used by KDE, Gnome etc to notify the user.

Cheers,

Wout.

PS: /Please/ change usb.agent so that it creates /var/run/usb/ before
pointing remover scripts there...

[-- Attachment #2: Type: TEXT/PLAIN, Size: 2996 bytes --]

#!/bin/sh
# Automount hotplugged usb storage devices. Copyright (c) 2002, Wout Mertens
# This script is released under the GPL.

# The usb devices will be mounted for the console user.
# To work, this needs:
# - kernel support:
#   - hotplugging, /proc, usbdevfs and devfs
#   - as modules: usb-storage, sd_mod, scsi_mod
#   - filesystems that will be mounted, like vfat
# - ls, tr, echo, awk, basename, stat, grep, mount, umount, mkdir, rm, sed

# TODO Fix usb.agent so that /var/run/usb gets created if missing
# TODO Some rigid way of getting this run. Currently, I do
#  grep usb-storage /lib/modules/*/modules.usbmap|sed 's/usb-storage/automount_usb/' >> /etc/hotplug/usb.usermap
# TODO Lots of testing
# TODO nice way of setting options
# TODO Also, the error checking should probably be more robust
# TODO Some clean way of handling disconnects while writing.
# TODO Make a generic event system for GUIs that shows that something was
#   mounted for the user. Proposal: /etc/hotplug/gui.agent gets
#   called with ACTION=add/remove, NAME=nice_name, PATH=new_path, etc.
#   Not just for new storage, scanners and so on are useful too...

# Dump debug
mesg () {
	#return
	/usr/bin/logger -t $0 "$*"
}

# Figure out the device to mount
NUM=`basename $DEVICE|sed 's/^0*//'`
SERIAL=`awk -F= '/^T:.*/{if($0~/Dev#= *'$NUM' /){t=1}else{t=0}}t==1&&/SerialNumber/{print $2;exit}' /proc/bus/usb/devices`
PRODUCT=`awk -F= '/^T:.*/{if($0~/Dev#= *'$NUM' /){t=1}else{t=0}}t==1&&/Product/{print $2;exit}' /proc/bus/usb/devices`
# Use the serial or the product name to find which scsi host was just created
if [ -n "$SERIAL" ]; then
	SCSI=`grep -l $SERIAL /proc/scsi/usb-storage-*/*|tail -1`
elif [ -n "$PRODUCT" ]; then
	SCSI=`grep -l $PRODUCT /proc/scsi/usb-storage-*/*|tail -1`
fi

mesg Device No. $NUM, serial $SERIAL, name $PRODUCT, path $SCSI

# Mount it
if [ -n "$SCSI" ]; then
	# The name of the file is the number of the SCSI host
	SCSI=`basename $SCSI`
	PARTS=`ls /dev/scsi/host$SCSI/*/*/*/part*`
	MOUNTPATH=/mnt/usb/`echo $PRODUCT|tr '[ /?*"]' _`
	if [ -e "$MOUNTPATH" ]; then
		if mount|grep "$MOUNTPATH">/dev/null; then
			# TODO I'm too lazy to write proper collision avoidance code
			MOUNTPATH="$MOUNTPATH".$$
		fi
	fi
	# I'm hoping that mount ignores options that don't apply to the fs
	# These options should prevent abuse and make it writeable for the
	# console user.
	MOUNTOPTS='-osync,nosuid'`stat -c',uid=%u,gid=%g' /dev/console`
	mesg Mounting $PARTS on $MOUNTPATH, options $MOUNTOPTS

	[ `echo $PARTS|wc -w` -eq 1 ] && MOUNTDIRECT=1
	REMOVE=
	for i in $PARTS; do
		if [ -n "$MOUNTDIRECT" ]; then
			T=$MOUNTPATH
		else
			T=$MOUNTPATH/`basename $i`
		fi
		mkdir -p $T
		if mount $MOUNTOPTS $i $T; then
			REMOVE="umount $T;$REMOVE;rmdir $T"
		else
			rmdir $T
		fi
	done

	# Create remover
	echo "#!/bin/sh" > $REMOVER
	echo $REMOVE | sed 's/;;/;/g' >> $REMOVER
	chmod +x $REMOVER
else
	exit 1
fi

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2003-01-07 22:07 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-12-11 16:22 My first usb storage automount script :) Wout Mertens
2003-01-03 23:27 ` Eddie Shi
2003-01-07 12:37 ` Wout Mertens
2003-01-07 14:56 ` Tom Clark
2003-01-07 19:13 ` Eddie Shi
2003-01-07 20:37 ` Wout Mertens
2003-01-07 22:07 ` Tom Clark

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).