#!/bin/bash export LC_CTYPE=en_US.UTF-8 NAME=${DEVNAME#/dev/} DESC="`echo "${ID_MODEL} (${ID_FS_LABEL})" | iconv -f utf8 -t ascii//TRANSLIT`" SIZE=$[ $(cat /sys/$DEVPATH/size) * 512 ] MODE=w QDB_KEY="/qubes-block-devices/$NAME" xs_remove() { if [ "$QUBES_EXPOSED" == "1" ]; then qubesdb-rm "$QDB_KEY" qubesdb-write /qubes-block-devices '' fi echo QUBES_EXPOSED=0 } # Ignore mounted... if fgrep -q $DEVNAME /proc/mounts; then xs_remove exit 0 fi # ... and used by device-mapper if [ -n "`ls -A /sys/$DEVPATH/holders 2> /dev/null`" ]; then xs_remove exit 0 fi # ... and used device-mapper devices if [ -n "$DM_NAME" ] && /sbin/dmsetup info "$DM_NAME" | grep -q "^Open count:.*[1-9]"; then xs_remove exit 0 fi # ... and "empty" loop devices if [ "$MAJOR" -eq 7 -a ! -d /sys/$DEVPATH/loop ]; then xs_remove exit 0 fi # ... and temporary device-mapper devices used during VM startup if [[ "$DM_NAME" = 'loop'* ] && \ [[ "`cat /sys/block/${DM_NAME%p*}/loop/backing_file`" = \ '/var/lib/qubes/'*'/volatile.img' ]]; then xs_remove exit 0 fi # Check if device is read-only if [ "`cat /sys/$DEVPATH/ro`" -eq 1 ]; then MODE=r fi # Special case for CD if [ "$ID_TYPE" = "cd" ]; then if [ "$ID_CDROM_MEDIA" != "1" ]; then # Hide empty cdrom drive xs_remove exit 0 fi MODE=r fi # Special description for loop devices if [ -d /sys/$DEVPATH/loop ]; then DESC=$(cat /sys/$DEVPATH/loop/backing_file) fi # and for device-mapper if [ -n "$DM_NAME" ]; then DESC="$DM_NAME" fi # The last one is meant to trigger watches qubesdb-write \ "$QDB_KEY/desc" "$DESC" \ "$QDB_KEY/size" "$SIZE" \ "$QDB_KEY/mode" "$MODE" \ /qubes-block-devices '' echo QUBES_EXPOSED=1 # Make sure that block backend is loaded /sbin/modprobe xen-blkback 2> /dev/null || /sbin/modprobe blkbk