LINUX.ORG.RU

[Велосипед][Быдлокод] Скрипт для отмонтирования носителей через меню

 ,


0

1

Subj. Скрипт при помощи dmenu отображает список съемных устройств в виде «точка монтирования (файл устройства)», пытается отмонтировать посредством udisks выбранное пользователем устройство и выдает через notify-send сообщение об успехе либо возвращенную udisks причину неуспеха. Сообщение автоматически исчезает через 10 секунд.

Как пользоваться: положить куда-нибудь в PATH (к примеру, ~/bin/umgui или /usr/local/bin/umgui) и назначить средствами WM/DE вызов на горячую клавишу.

Скрипт написан на shell (проверялось на bash, но, думаю, заработает на любом POSIX-совместимом shell), помимо udisks, dmenu и notify-send требует awk. Проверен на Russian Fedora Remix 14.

Собственно umgui:

#!/bin/sh
# vi:noet:ts=2:sw=2:ft=sh:sta:si:tw=80

# Assume a device to be user-unmountable if a corresponding line in mount(8)
# contains a $UM_MARKER substring
UM_MARKER="uhelper=udisks"
# A command to actually unmount the device. Currently only udisks(1) is
# supported
UM_UNMOUNT_CMD=udisks
UM_UNMOUNT_CMD_ARGS=--unmount
# A command to display the menu with. Must be compatible with dmenu(1) i. e.
# take menu items from STDIN and output a selection to STDOUT
UM_MENU_CMD=dmenu
# TODO: l18n (gettext?) for notifies
# Notify displayed after successful unmount, %s is for device file (e. .g
# /dev/sda1)
UM_NOTIFY_OK="Now device %s can be safely removed"
# Notify displayed if there is nothing to unmount
UM_NOTIFY_NORD="No removable devices found"
UM_NOTIFY_CMD=notify-send
UM_NOTIFY_ARGS="-t 10000"
UM_NOTIFY_ARGS_CRIT="$UM_NOTIFY_ARGS -u critical"

# Echoes $1 (optional) and exits with status $2 (optional)
_exit () {
	[ $# -eq 0 ] && exit
	[ $# -eq 1 ] && {
		echo $1
		exit
	}
	[ $# -eq 2 ] && {
		echo $1 >&2
		exit $2
	}
}

# Graphically echoes $1 (optional) and exits with status $2 (optional)
_exit_gui () {
	[ $# -eq 0 ] && exit
	[ $# -eq 1 ] && {
		"$UM_NOTIFY_CMD" $UM_NOTIFY_ARGS "$1"
		exit
	}
	[ $# -eq 2 ] && {
		"$UM_NOTIFY_CMD" $UM_NOTIFY_ARGS_CRIT "$1"
		exit $2
	}
}

for CMD in "$UM_UNMOUNT_CMD" "$UM_MENU_CMD" "$UM_NOTIFY_CMD" ; do
	which "$CMD" > /dev/null 2>&1 || _exit "$CMD: command not found" 1
done

MOUNTPOINTS=$(mount | awk '/'"$UM_MARKER"'/ { print $3,"("$1")" }')
[ -z "$MOUNTPOINTS" ] && _exit_gui "$UM_NOTIFY_NORD" 2
DEVICE=$(echo "$MOUNTPOINTS" | "$UM_MENU_CMD" | awk '{ print $2 }' | tr -d ')(')
[ -z "$DEVICE" ] && _exit
# TODO: rewrite the code below when (and if) someone rewrites udisks to exit
# with non-zero status on error
UM_UNMOUNT_CMD_ARGS="$UM_UNMOUNT_CMD_ARGS $DEVICE"
UM_UMNOUNT_CMD_MSG=$("$UM_UNMOUNT_CMD" $UM_UNMOUNT_CMD_ARGS 2>&1)
[ -z "$UM_UMNOUNT_CMD_MSG" ] || _exit_gui "$UM_UMNOUNT_CMD_MSG" 3
_exit_gui "$(printf "$UM_NOTIFY_OK" "$DEVICE")"

★★★★★
Ответ на: комментарий от lazyklimm

Для монтирования необходимо знание о том, какие устройства можно смонтировать. В связи с этим вопрос — откуда можно взять информацию о том, какие из подключенных устройств могут быть смонтированы? Насколько корректно брать ее из /dev/disk/by-label/?

dexpl ★★★★★
() автор топика
Ответ на: комментарий от lazyklimm

Меток может и не быть, не поспоришь. С другой стороны, с UUID'ами смущает то, что у себя в /dev/disk/by-uuid наблюдаю такое:

┌[ dexpl@dexpl:~ 22:48:15 ]
└► ll /dev/disk/by-uuid/
итого 0
lrwxrwxrwx 1 root root 10 Дек  8 18:10 49EC-8D74 -> ../../sda1
lrwxrwxrwx 1 root root 10 Дек  8 18:09 6ea06441-611a-45ff-a125-b403e097a40d -> ../../dm-1
lrwxrwxrwx 1 root root 10 Дек  8 18:09 72c264e5-8da7-4836-b2d8-234c5f4a6035 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Дек  8 18:09 80135380-eff7-4d8e-aa0b-0cfb65d9f695 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Дек  8 18:10 f2cc6a7c-3af7-4bd1-9e01-dcce9552c449 -> ../../sda2
, где dm-? суть таковы:
┌[ dexpl@dexpl:~ 22:58:33 ]
└► ll /dev/mapper/
итого 0
crw------- 1 root root 10, 62 Дек  8 21:09 control
lrwxrwxrwx 1 root root      7 Дек  8 18:09 vg_srv1-lv_root -> ../dm-0
lrwxrwxrwx 1 root root      7 Дек  8 18:09 vg_srv1-lv_swap -> ../dm-1
Понятно, что пытаться отмонтировать корень ни к чему, следовательно, отображать его в меню бессмысленно. С другой стороны, идея втупую отфильтровывать dm-? из содержимого by-uuid представляется слишком уж топорной, тогда уж и /dev/sdb1 (мой /boot) показывать не следует. Вообще есть ли какой-нибудь более-менее стандартизированный способ получения из командной строки списка съемных блочных устройств при наличии в системе udisks, udev и прочего device-mapper? Какие маны читать и что у гугла спрашивать?

dexpl ★★★★★
() автор топика
Ответ на: комментарий от dexpl
udisks --show-info /dev/disk/by-id/ata-ST3750330AS_9QK1A12P-part8 | grep internal

system internal:             1
 udisks --show-info /dev/disk/by-id/usb-Rutoken_MassStorage_00000000000087-0:0-part5 | grep internal                           

  system internal:             0

суть, думаю, ясна

права монтирования прописаны в /usr/share/polkit-1/actions/org.freedesktop.udisks.policy, но думаю это не понадобится

lazyklimm ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.