General TC > Programming & Scripting - Unofficial

Mount drives from desktop icons via iDesk

(1/2) > >>

Misalf:
This script creates desktop icon files for use with iDesk to (u)mount drives listed in /mnt.

If such a desktop icon is clicked to mount/unmount a drive, the script will be executed too, rebuilds the icon files and kills/starts (kinda restarts) idesk.
I haven't looked into udev rules to automatically run the script upon inserting a usb stick. Might do so at some point.

NOTE: The script has to be edited manually with proper png images for Floppy, CD, and HDD because there are no default ones that would fit.
(I copied some from gnome-icon-theme and have them backed up in my  ~/.local/share/icons  folder)

(idesk.tcz from 5.x repo seems to work in 6.x - needs confirmation though)

I have  idesk.tcz  loaded OnBoot and the script starts via  ~/.X.d/01-idesk-mount .

--- Code: ---[ $(which idesk) ] && idesk-mount.sh >/dev/null 2>&1 &

--- End code ---

idesk-mount.sh  resides in  ~/.local/bin .

--- Code: ---#!/bin/sh
# idesk-mount.sh for Tiny Core Linux
# Creates desktop icon files for use with iDesk to u/mount devices listed in /mnt.
# (c) Misalf 2015
#

WIDTH=32
HEIGHT=32
GAP=48
X_POS=16
Y_POS=64

TCUSER=`cat /etc/sysconfig/tcuser`
ICON_PATH="/home/$TCUSER/.local/share/icons"
ICON_CD="$ICON_PATH/optical-unmounted.png"
ICON_CD_MNT="$ICON_PATH/optical.png"
ICON_FD="$ICON_PATH/floppy.png"
ICON_FD_MNT="$ICON_PATH/floppy-unmounted.png"
ICON_USB="$ICON_PATH/removable.png"
ICON_USB_MNT="$ICON_PATH/removable-unmounted.png"
ICON_HDD="$ICON_PATH/hdd-unmounted.png"
ICON_HDD_MNT="$ICON_PATH/hdd.png"
ICON_HDD_LINUX="$ICON_HDD"
ICON_HDD_LINUX_MNT="$ICON_HDD_MNT"
ICON_HDD_WIN="$ICON_HDD"
ICON_HDD_WIN_MNT="$ICON_HDD_MNT"

[ -z "$FILEMGR" ] && FILEMGR=xfe # See ~/.profile

for i in `ls /mnt`
do
ICONFILE="/home/$TCUSER/.idesktop/$i.lnk"

FSTYPE_TAB=`cat /etc/fstab | grep $i | awk '{printf "%s\n", $3}'`
if [ -z "$FSTYPE_TAB" ]; then
[ -e "$ICONFILE" ] && rm "$ICONFILE" && echo -e "$i \t-REMOVED-"
continue
fi

FSTYPE_MNT=`df -T | grep $i | awk '{printf "%s\n", $2}'`
if [ -n "$FSTYPE_MNT" ]; then
MOUNTCMD=umount
case $i in
sr*) ICON="$ICON_CD_MNT" ;;
fd*) ICON="$ICON_FD_MNT" ;;
*)
case $FSTYPE_MNT in
ext*) ICON="$ICON_HDD_LINUX_MNT" ;;
*fat|ntfs*) ICON="$ICON_HDD_WIN_MNT" ;;
fuseblk)
ICON="$ICON_HDD_WIN_MNT"
[ -n "$FSTYPE_TAB" ] && FSTYPE_MNT="$FSTYPE_TAB"
;;
*) ICON="$ICON_HDD_MNT" ;;
esac
;;
esac
FSTYPE=" - $FSTYPE_MNT"
else
MOUNTCMD=mount
case $i in
sr*) ICON="$ICON_CD" ;;
fd*) ICON="$ICON_FD" ;;
*)
case $FSTYPE_TAB in
ext*) ICON="$ICON_HDD_LINUX" ;;
*fat|ntfs*) ICON="$ICON_HDD_WIN" ;;
*) ICON="$ICON_HDD" ;;
esac
;;
esac
[ "$FSTYPE_TAB" == "auto" ] && FSTYPE="" || FSTYPE=" - $FSTYPE_TAB"
fi

echo "table Icon" > "$ICONFILE"
FSSIZE_FULL=`df -h | grep $i | awk '{printf "%s", $2}'`
FSSIZE_USED=`df -h | grep $i | awk '{printf "%s", $3}'`
if [ "$MOUNTCMD" == "umount" ]; then
echo "  Caption: [$i]" >> "$ICONFILE"
if [ "$FSSIZE_FULL" == "$FSSIZE_USED" ]; then
FSSIZE=" - ${FSSIZE_FULL}"
else
FSSIZE=" - ${FSSIZE_USED}/${FSSIZE_FULL}"
fi
else
echo "  Caption:  $i " >> "$ICONFILE"
FSSIZE=""
fi
echo "  ToolTip.Caption:  /mnt/$i${FSSIZE}${FSTYPE}" >> "$ICONFILE"
echo "  Icon: $ICON" >> "$ICONFILE"
echo "  Width: $WIDTH" >> "$ICONFILE"
echo "  Height: $HEIGHT" >> "$ICONFILE"
echo "  X: $X_POS" >> "$ICONFILE"
echo "  Y: $Y_POS" >> "$ICONFILE"
echo "  Command[0]: sudo $MOUNTCMD /dev/$i ; `basename $0`" >> "$ICONFILE"
[ -n "$FILEMGR" ] && echo "  Command[1]: $FILEMGR /mnt/$i" >> "$ICONFILE"
echo "end" >> "$ICONFILE"

X_POS=$((X_POS+$GAP))
done


killall idesk >/dev/null 2>&1
idesk >/dev/null 2>&1 &


--- End code ---


The script is quite basic currently as my coding skills are not the greatest. But it certainly fits my own needs and reminds me a lot of Puppy Linux. (: However, I wrote it from scratch so don't expect anything too fancy.

This is my ~/.ideskrc (but you can safely use your own).

--- Code: ---table Config
  FontName: terminus
  FontSize: 9
  FontColor: #615E5B
  ToolTip.FontSize: 10
  ToolTip.FontName: terminus
  ToolTip.ForeColor: #FFB000
  ToolTip.BackColor: #262624
  ToolTip.CaptionOnHover: true
  ToolTip.CaptionPlacement: Right
  Locked: true
  Transparency: 50
  Shadow: true
  ShadowColor: #0D0D0C
  ShadowX: 1
  ShadowY: 1
  Bold: false
  ClickDelay: 400
  IconSnap: false
  SnapWidth: 16
  SnapHeight: 16
  SnapOrigin: center
  SnapShadow: true
  SnapShadowTrans: 160
  CaptionOnHover: false
  CaptionPlacement: bottom
  FillStyle: FillInvert
  Background.Delay: 0
  Background.Source: None
  Background.File: None
  Background.Mode: Stretch
  Background.Color: #262624
  CursorOver: ul_angle
end

table Actions
  Lock: control middle singleClk
  Reload: middle doubleClk
  Drag: left hold
  EndDrag: left singleClk
  Execute[0]: left doubleClk
  Execute[1]: right doubleClk
end



--- End code ---

Any recommendation very welcome.

Misalf:
As for the udev rules, got it working partially. The script will run for any USB device connected though (mouse etc). KERNEL=="sd*" doesn't seem to be used as I thought.

/etc/udev/rules.d/99-idesk-mount.rules

--- Code: ---SUBSYSTEM=="usb", ACTION=="add", \
ENV{DEVTYPE}=="usb_device", RUN+="/lib/udev/idesk-tcuser add &"

SUBSYSTEM=="usb", ACTION=="remove", \
ENV{DEVTYPE}=="usb_device", RUN+="/lib/udev/idesk-tcuser remove &"


--- End code ---

/lib/udev/idesk-tcuser

--- Code: ---#!/bin/sh
export DISPLAY=:0.0
TCUSER=`cat /etc/sysconfig/tcuser`
[ "$1" == "add" ] && SLEEP="5" || SLEEP="0.1"
/bin/su -c "sleep $SLEEP; /home/$TCUSER/.local/bin/idesk-mount.sh" "$TCUSER" &


--- End code ---

Rich:
Hi Misalf
Go to the search page and search for  subsystem , you'll get about 30 results. Check the results that list  subsystem== , they
may provide some useful information about  udev  usage.

Misalf:
Thanks Rich.
subsystem==block  works better than  subsystem==usb .

Also, when idesk was executed via udev, it was running as root I think. Icons were not click-able.

This should work:

/etc/udev/rules.d/99-idesk-mount.rules

--- Code: ---ACTION=="add|remove", SUBSYSTEM=="block", KERNEL=="sd[a-z]", \
RUN+="/bin/su -c '/lib/udev/idesk-tcuser &'"


--- End code ---

/lib/udev/idesk-tcuser

--- Code: ---#!/bin/sh
TCUSER=`/bin/cat /etc/sysconfig/tcuser`
/bin/su -c "/bin/sleep 1 ; DISPLAY=:0.0 /home/$TCUSER/.local/bin/idesk-mount.sh" - "$TCUSER" &


--- End code ---

Misalf:
I made a mistake in above script ; corrected.

Navigation

[0] Message Index

[#] Next page

Go to full version