| w00zy |
|
|
Темы:
20
Сообщения:
336
Участник с: 09 декабря 2008
|
Это как-бы в догонку к теме блога http://archlinux.org.ru/node/150. Вобщем понадобилось (попросили) сделать автомонтирование. Сделал тогда товарищу по принципу как в вышеупомянутой статье. Но. Через некоторое время он поинтересовался, почему допустим файловый менеджер или программа не может отмонтировать его съемный диск. Мелочь, жить не мешающая но всё-же… Решил я сделать это методами hal. И наступил на граблю. Несколько часов переписывал скрипт то с прямыми вызовами свойств через dbus-send, то с обёртками типа hal-get-property… От пользователя пожалуйста - монтирует-размонтирует, монтирует и дает размонтировать другим программам, но при вызове из dbus конфигов напрочь отказывается это делать. Вобшем наконец (после вдумчивого чтения) нашел строчку, в которой было написано, что при обработке правила, (допустим при вставке флешки) , RUN+=“program” udev ждёт от “program” кода завершения. А в это время блокирует любые попытки достучаться до устройства через шину. А хал в это время не может получить свойств устройства, а я не могу их обработать, а udev ждёт. И сделать RUN+=“program %k &” не прокатило. Короче в лучших традициях сделал подпорку. program теперь просто отдельный скрипт в три строки, вызывает сам монтировщик в бэкграунде и передает ему аргументы от удава. Удев спокойно завершает свои дела, освобождая доступ к устройству. А сам скрипт в фоне делает своё дело. Вот интересно, что-б не плодить сущностей может скрипт просто форкнуть себя. Но что-то быстрый поиск bash fork не впечатлил. На питоне реализовать подобное интересней и удобней, но задача была bash+hal+udev. Да и на питоне полно реализаций автомаунта как демона, а на “просто скриптик” “многа букаф”… Вобщем пусть подпорка пока у сарая постоит. Решил её покрасить - у человека фотик, плеер… Потом всё ему через подпорку (жопу?) на свои скрипты заведём ;D Да, чуть не забыл. Может кому пригодится. Сам скриптик монтирования. #!/bin/sh
PATH=/bin:/sbin:/usr/bin:usr/sbin:$PATH
OPT_NTFS='locale=ru_RU.utf8,dmask=000,fmask=111,exec'
OPT_VFAT='uid=%s,iocharset=utf8,codepage=1251,showexec,umask=0,flush'
OPT_EXT='noatime,nodiratime,sync,dirsync,defaults'
#########################
USERID=`id -u`
ACTION=$1
DEVICE=$2
if [ -z "$DEVICE" ] || [ -z "$ACTION" ] ; then
logger "$0: Wrong option!"
exit 2
fi
DEVICE='/dev/'$(echo $1 | sed -n '/^sd[a-z][1-9]\?/p')
sleep 4
function find_by_property {
UDI=$(hal-find-by-property --key block.device --string $DEVICE)
if [ -z $UDI ]; then
logger "$0: Wrong storage udi, device=${DEVICE}"
exit 2
fi
}
function get_hal_label {
LO_UDI=$1
COUNTER=0;
LABEL=$(hal-get-property --key volume.label --udi $LO_UDI 2>/dev/null)
while [ -z "$LABEL" -a $COUNTER -lt 4 ]; do
LO_UDI=$(hal-get-property --key info.parent --udi $LO_UDI 2>/dev/null)
LABEL=$(hal-get-property --key storage.model --udi $LO_UDI 2>/dev/null)
COUNTER=$(expr $COUNTER + 1)
done
LABEL=$(echo $LABEL | sed 's/[ ]/_/g'| sed 's/[^_a-zA-Z0-9\.]//g' \
| sed 's/[^a-zA-Z0-9]$//g')
if [ -z $LABEL ]; then
LABEL=${DEVICE##/dev/}
fi
}
function get_hal_fsoption {
LO_UDI=$1
FSTYPE=$(hal-get-property --key volume.policy.mount_filesystem --udi $LO_UDI 2>/dev/null)
if [ -z $FSTYPE ]; then
FSTYPE=$(hal-get-property --key volume.fstype --udi $LO_UDI 2>/dev/null)
fi
case $FSTYPE in
'ntfs'|'ntfs-3g') OPTIONS=$OPT_NTFS;;
'vfat'|'fat'|'mvfat') OPTIONS=$(printf $OPT_VFAT $USERID);;
'ext2'|'ext3') OPTIONS=$OPT_EXT;;
*) OPTIONS='';;
esac
}
case $ACTION in
'a'|'add')
find_by_property "$DEVICE"
get_hal_label $UDI
get_hal_fsoption $UDI
dbus-send --system --print-reply --dest=org.freedesktop.Hal $UDI \
org.freedesktop.Hal.Device.Volume.Mount string:$LABEL \
string: array:string:"$OPTIONS" 2>/dev/null
logger "$0: device=${DEVICE} , mount point=${LABEL}"
logger "$0: fs=${FSTYPE} , mount option=${OPTIONS}"
;;
'r'|'remove')
find_by_property "$DEVICE"
/usr/bin/dbus-send --system --print-reply --dest=org.freedesktop.Hal $UDI \
org.freedesktop.Hal.Device.Volume.Unmount array:string:'' 2>/dev/null
logger "$0: ${DEVICE} remove."
;;
*) logger "$0: Wrong action ${ACTION}"
exit 2
;;
esac
exit 0 |
| Nebulosa |
|
Темы:
10
Сообщения:
831
Участник с: 05 марта 2009
|
Решал точно такую же проблему (через udev также не работало отмонтирование), но без всяких скриптов. Для Gnome достаточно запущенного HAL и gnome-volume-manager, который прописан в Сессиях и стартует при запуске Gnome. Затем поправим опции монтирования (чтобы не было проблем с файлами названными по-русски): /system/storage/default_options/vfat/mount_options = Вуаля! Все работает, как нужно. |
| w00zy |
|
|
Темы:
20
Сообщения:
336
Участник с: 09 декабря 2008
|
Gnom не нужен ;D Шутка. Ни гнома, ни gnome-volume-manager, ни gconf. Работать должно что в init3, голой консоли, что в иксах *box. Не нужно пользователям DE. Не нужно пользователям *box сверху гнома-кед. |