From: Wout Mertens <wmertens.spm@advalvas.be>
To: linux-hotplug@vger.kernel.org
Subject: My first usb storage automount script :)
Date: Wed, 11 Dec 2002 16:22:08 +0000 [thread overview]
Message-ID: <marc-linux-hotplug-103962396823038@msgid-missing> (raw)
[-- 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
next reply other threads:[~2002-12-11 16:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-12-11 16:22 Wout Mertens [this message]
2003-01-03 23:27 ` My first usb storage automount script :) 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=marc-linux-hotplug-103962396823038@msgid-missing \
--to=wmertens.spm@advalvas.be \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).