[sisyphus] hotplug

Mike Andreev =?iso-8859-1?q?andreev_=CE=C1_d902=2Eiki=2Erssi=2Eru?=
Чт Дек 9 20:57:16 MSK 2004


Здравствуйте,

Мои письма почему-то до community на altlinux.ru не доходят. так что шлю сюда.

вот решил поделиться, может кому-то будет полезно...
[ все ниже описанное было сделано для решения моих личных задач и у меня 
работает. Your Mileage May Vary.
конструктивная критика и замечания приветствуются
]

У меня есть Flash'ка и фотоаппарат, который подключаются по USB (как диск не 
мантируется, но gphoto2 его поддерживает). Оба устройства опознаются, и при 
подключении флэшки в fstab добавляется mount-point.
[ ALT Linux Sisyphus (20041111), hotplug-2004_03_29-alt7, kudzu-1.1.13-alt8 ]

задача состояла в том, что бы изменить параметры mount-point. и, при наличии 
залогинившигося в консоль пользователя запускать от его имени необходимые 
комманды (mount -- для флешки, скрипт для скачивания фоток -- для 
фотоаппарата).

как я понял updfstab не имеет возможности изменения опций монтирования, а в 
hotplug не предусмотрено возможности добавления "пользовательских" скриптов, 
поэтому было сделано следующее:

в конец /sbin/hotplug добавлен вызов /etc/hotplug.d/local.hotplug
этот скрипт выполняет соответствующие обнаруженному устройству файлы 
из /etc/hotplug.d/local/ (от root) и из $HOME/.hotplug/ (от имени  
пользователя консоли)
соответствие скриптов устройствам проверяется по $PRODUCT 
(передается /sbin/hotplug, как переменная окружения).

теперь при в подключении флэшки она у меня автоматически мантируется в нужное 
место с нужными параметрами, а при подключении фотоаппарата автоматически 
запускается xterm с мои скриптом.

[ "лучше день потерять, потом за час долететь" (С) ;-) ]
=============================================================================
/etc/hotplug.d/local.hotplug
#!/bin/bash

LOG_FILE=/var/log/hotplug/local
 DEBUG=yes export DEBUG

HOTPLUG_TYPE=$1 export HOTPLUG_TYPE
shift

LOGGER="logger -t $(basename $0)"

log_mesg () {
        $LOGGER "$@"
}


if [ -z "$HOTPLUG_TYPE" -o -z "$PRODUCT" ]; then exit 1; fi

[ -z "$DEBUG" -o "$DEBUG" == "no" ] || \
log_mesg "type: '$HOTPLUG_TYPE'; env: `env`"

#code to detect console user from /etc/hotplug/usb/usbcam
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

#user's home directory
if [ -n "$CONSOLEOWNER" ]; then
        CONSOLEOWNER_HOME=`awk -F: \
 "/^$CONSOLEOWNER/ { print \\\$6 }" /etc/passwd`
fi;

#run scripts if $PRODUCT in known
PRODUCT_ID=`echo $PRODUCT | sed -e 's;/;-;g'`

log_mesg "ID: $PRODUCT_ID; CONSOLEOWNER: $CONSOLEOWNER / $CONSOLEOWNER_HOME"

[ -f /etc/hotplug.d/local/$PRODUCT_ID ] && . /etc/hotplug.d/local/$PRODUCT_ID
[ -x /usr/bin/sudo -a -n "$CONSOLEOWNER_HOME" -a \
-f "$CONSOLEOWNER_HOME/.hotplug/$PRODUCT_ID" ] && \
  sudo -u $CONSOLEOWNER $CONSOLEOWNER_HOME/.hotplug/$PRODUCT_ID
=============================================================================

=============================================================================
/etc/hotplug.d/local/c76-5-100
#!/bin/bash
# JetFlash 512M

LOGGER="logger -t $(basename $0)"

log_mesg () {
        $LOGGER "$@"
}

case $ACTION in
add)
        HOTLPUGED_DEV=`awk '!/^#/ && /,kudzu,/ { dev=$1 } END{ print 
dev; }' /etc/fstab`
        if [ -z "$HOTLPUGED_DEV" ]; then exit 1; fi

        MOUNT_DIR=/mnt/jetflash
        MOUNT_OPT=noauto,user,kudzu,sync,dirsync,exec,nodev,nosuid,iocharset=cp1251,codepage=866,shortname=winnt

        export HOTLPUGED_DEV
        export MOUNT_DIR

        log_mesg "Known hardware ($PRODUCT) connected as $HOTLPUGED_DEV"

        # check if MOUNT_DIR exists
        [ -d $MOUNT_DIR ] || mkdir $MOUNT_DIR

        # change fstab
        TMP=`mktemp /etc/fstab-XXXXX` || ( log_mesg "Can not create tmp file"  
&& exit 1 )
        awk -v dev=$HOTLPUGED_DEV -v dir=$MOUNT_DIR -v opt=$MOUNT_OPT -- \
                '/^\/dev/ { if($1==dev){ $2=dir; $4=opt; } } {print; } 
' /etc/fstab  > $TMP
        [ -s $TMP ] && cat $TMP > /etc/fstab
        rm -f $TMP
        ;;

remove)
        log_mesg "JetFlash was unpluged..."
        # may be later here will be some actions
        ;;
esac

=============================================================================
/home/mike/.hotplug/c76-5-100
#!/bin/bash
# JetFlash 512M
if [ "$ACTION" == "add" -a -n "$MOUNT_DIR" ]; then
   mount $MOUNT_DIR && logger -t $(basename $0) "JetFlash was mounted at 
$MOUNT_DIR by `whoami`"
fi

=============================================================================
/home/mike/.hotplug/4a9-3077-1
#!/bin/bash
# Cannon PowerShot S50
if [ "$ACTION" == "add" ]; then
   logger -t $(basename $0) "Start to download images "
   DISPLAY=":0" export DISPLAY
   XAUTHORITY=/home/mike/.Xauthority export XAUTHORITY
   xterm -e "/home/mike/bin/camera_downloader.sh" &
fi;


-- 
 Mike Andreev


Подробная информация о списке рассылки Sisyphus