From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wout Mertens Date: Wed, 10 Dec 2003 19:29:58 +0000 Subject: Re: Working on a usb-storage hotplug script Message-Id: List-Id: References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-hotplug@vger.kernel.org Yesterday at 17:09, Olaf Hering ponderously produced: > On Tue, Dec 09, Wout Mertens wrote: > > > Comments? > > forget 2.4, work on 2.6. 2.6 will give you a block event if there is > something of interrest. Well, you're right. I just created a hotplug script that will automount all block devices that get attached. I use this behaviour to use a USB key as a token for connecting to a VNC session from a thin client. It's way cleaner than the 2.4 version... Here's the script, comments? =====================#!/bin/sh # # Automount hotplugged block devices, by Wout Mertens. # # Linux v2.6 version # This script is released under version 2 of the GPL. # To install this, either make it /sbin/hotplug, or, if you have # linux-hotplug installed, make it /etc/hotplug.d/block/automount.hotplug . # It needs to be executable. I tested it with busybox's ash. # # The devices will be mounted for the console user if applicable. # # To work, this needs: # - v2.6 kernel support: # - hotplugging, /proc mounted, /sys mounted # - filesystems that will be mounted, like vfat # - sh, echo, tr, stat or ls, getent or grep passwd, # mount, umount, mkdir, rmdir. logger is used if there. # # Possible improvements: # - Create a desktop entry for the device. # - Call a notifier script when mounting/unmounting. This could create the # desktop entry by itself. # - Mount as supermount if available. This will improve behaviour for # synchronous writes and hanging mounts, although umount -lf already # does a good job. # - Detect filesystem on device, so filesystems that don't need a mounting # user can skip user detection. # Debugging # set -xv # exec > /tmp/hotplug.$$ 2>&1 PATH="/bin:/sbin:/usr/bin:/usr/sbin" export PATH # We only handle block device messages [ "$1" != "block" ] && exit 0 # Proclaim stuff to the world mesg () { logger -t $0 "$*" } # Is path already mounted? is_path_mounted () { while read dev path rest do if [ "$path" = "$1" ] then return 0 fi done < /proc/mounts return 1 } # Get mounted path for a device get_mounted_path () { while read dev path rest do if [ "$dev" = "$1" ] then echo "$path" return 0 fi done < /proc/mounts return 1 } # Wait for a file to appear wait_for () { local count=0 while [ $count -lt 10 ] && [ ! -e "$1" ] do sleep 1 done [ $count -eq 10 ] && return 1 return 0 } # Remove strange characters from a filename clean_filename () { echo $1 | tr " /?*\"<>" "_______" } # Figure out the device to mount set `echo $DEVPATH | tr / " "` [ $# -ne 3 ] && exit 0 DEVICE=/dev/$3 if [ "$ACTION" = "remove" ] then # Unmount it dir=`get_mounted_path $DEVICE` [ -d "$dir" ] || exit 1 umount -lf "$dir" rmdir "$dir" exit 1 fi if [ "$ACTION" = "add" ] then # Mount it # Make sure we have support for vfat modprobe -q vfat wait_for /sys/$1/$2/device/vendor || exit 1 # Find the name PRODUCT=`cat /sys/$1/$2/device/model` if [ -z "$PRODUCT" ] then PRODUCT=generic fi # Find out where we mount it MOUNTPATH=/mnt/usb/`clean_filename "$PRODUCT"` if is_path_mounted "$MOUNTPATH" then count=1 while is_path_mounted "${MOUNTPATH}_${count}" do count=$(( $count + 1 )) done MOUNTPATH="${MOUNTPATH}_${count}" fi # Make sure it's a directory if [ -e "$MOUNTPATH" ] then if [ ! -d "$MOUNTPATH" ] then mesg "$MOUNTPATH exists but is not a directory" exit 1 fi else mkdir -p "$MOUNTPATH" if [ $? -ne 0 ] then mesg "Could not create mountpoint $MOUNTPATH" exit 1 fi fi # Find out who we are going to mount it as CONSOLEUSER=`stat -c%U /dev/console 2>/dev/null` if [ -z "$CONSOLEUSER" ] then set `ls -l /dev/console` CONSOLEUSER=$3 fi [ -n "$CONSOLEUSER" ] || CONSOLEUSER=root PASSWD=`getent passwd $CONSOLEUSER 2>/dev/null` if [ -z "$PASSWD" ] then PASSWD=`grep "$CONSOLEUSER" /etc/passwd||grep root /etc/passwd` fi if [ -z "$PASSWD" ] then mesg "Could not get password entry for $CONSOLEUSER" exit 1 fi set `echo $PASSWD | tr : " "` if [ $# -lt 4 ] then mesg "Bad password entry for $CONSOLEUSER" exit 1 fi # These options should prevent abuse and make it writeable for the # console user. MOUNTOPTS="-s -osync,nosuid,umask7,uid=$3,gid=$4" mesg Mounting $DEVICE on $MOUNTPATH, options $MOUNTOPTS mount $MOUNTOPTS $DEVICE $MOUNTPATH fi ===================== ------------------------------------------------------- This SF.net email is sponsored by: IBM Linux Tutorials. Become an expert in LINUX or just sharpen your skills. Sign up for IBM's Free Linux Tutorials. Learn everything from the bash shell to sys admin. Click now! http://ads.osdn.com/?ad_id78&alloc_id371&op=click _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel