Tags
Tags
Mounting usb drives using mountbar of TuyCommander.
I'm using TuxCommander and I like it. That is why I've worked some time to be able to mount usb drives using the mountbar of it. And here is the result of my work. It was a bit tricky because I had to change the source code of TuxCommander. But don't be afraid I'll release here all you need to get it working.
First apply the patch to the sources of TuxCommander.
git clone git://git.bzatek.net/tuxcmd
patch -Ni <path-to>mounter.patch
make && make install
If you are using ArchLinux you can use tuxcmd-git in my repository
diff --git a/UConfig.pas b/UConfig.pas index 9ee6f16..a878bb9 100644 --- a/UConfig.pas +++ b/UConfig.pas @@ -800,6 +800,9 @@ end; (********************************************************************************************************************************) procedure ReadMounter; var s: string; + MountDir: string; + Handle: PDIR; + DirEnt: PDirent64; IniFile: TMyIniFile; Sections: TStringList; i: integer; @@ -847,6 +850,38 @@ begin InternalMounterConfmtime := GetFileTime(IncludeTrailingPathDelimiter(s) + 'mounter'); end; except end; + MountDir := IncludeTrailingPathDelimiter(s) + 'mounters'; + if DirectoryExists(MountDir) then begin + Handle := opendir(PChar(MountDir)); + repeat + DirEnt := readdir64(Handle); + if not (DirEnt = nil) then begin + IniFile := TMyIniFile.Create(IncludeTrailingPathDelimiter(MountDir) + string(PChar(@DirEnt^.d_name[0])), True); + try + Sections := TStringList.Create; + IniFile.ReadSections(Sections); + if Sections.Count > 0 then + for i := 0 to Sections.Count - 1 do + begin + Item := TMounterItem.Create; + with Item do + begin + Device := Sections[i]; + DisplayText := IniFile.ReadString(Sections[i], 'DisplayText', ''); + MountPath := IniFile.ReadString(Sections[i], 'MountPath', ''); + IconPath := IniFile.ReadString(Sections[i], 'IconPath', ''); + MountCommand := IniFile.ReadString(Sections[i], 'MountCommand', ''); + UmountCommand := IniFile.ReadString(Sections[i], 'UmountCommand', ''); + DeviceType := IniFile.ReadInteger(Sections[i], 'DeviceType', 0); + end; + MounterList.Add(Item); + end; + Sections.Free; + except end; + end; + until DirEnt = nil; + closedir(Handle); + end; end; procedure WriteMounter;
Download this script and change the variables „mounter“ and „sudocmd“ in it. „mounter“ has to be the directory $HOME/.tuxcmd/mounters which you may have to create first. „sudocmd“ is the command to run some commands in the script as root. It produces the needed files for each usb drive for TuxCommander.
#!/bin/bash mounter="/home/alw/.tuxcmd/mounters" sudocmd="sudo" option=${4} dev=${2} dir=${3} case ${1} in a) /bin/echo -e "[${dev}]\nDisplayText=$(basename ${dir})\nMountPath=${dir}\nMountCommand=${sudocmd} /scripts/media-mount.sh m %dev %dir ${option} ${5}\nUmountCommand=${sudocmd} /scripts/media-mount.sh u ${dev} ${dir}\nDeviceType=1\n" >> ${mounter}/$(basename ${dev}) touch ${mounter}/../mounter ;; m) [ "${5}" != "" ] && xterm -e "${sudocmd} cryptsetup luksOpen ${5} ${6} && ${sudocmd} mkdir -p ${dir} && §{sudocmd} mount -o ${option} ${dev} ${dir}" [ "${5}" == "" ] && ${sudocmd} mkdir -p ${dir} && ${sudocmd} mount -o ${option} ${dev} ${dir} ;; u) while [ "$(mount | grep ${dev})" != "" ] do [ "$(mount | grep ${dev})" != "" ] && ${sudocmd} umount ${dev} done [[ "${dev}" =~ ".*\/mapper\/.*" ]] && ${sudocmd} cryptsetup luksClose $(basename ${dev}) rm -r ${dir} ;; r) while [ "$(mount | grep ${dev})" != "" ] do [ "$(mount | grep ${dev})" != "" ] && umount ${dev} done cryptsetup luksClose $(basename ${dev}) rm ${mounter}/$(basename ${dev}) rm -r ${dir} touch ${mounter}/../mounter ;; esac
The last file you need is the udev rule. Download this file and save it to /etc/udev/rules.d/11-media-by-label-auto-mount.rules. Then change the pathes for the script in the lines 24 and 26 (replace /scripts/ with your path).
KERNEL!="sd[a-z]*", GOTO="media_by_label_auto_mount_end" ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="media_by_label_auto_mount_end" # Do not mount devices on boot because otherwise fsck may fail ACTION=="add", PROGRAM!="/bin/grep ' / / rw[, ]' /proc/self/mountinfo", GOTO="media_by_label_auto_mount_end" # Open LUKS partition if necessary PROGRAM=="/sbin/blkid -o value -s TYPE %N", RESULT=="crypto_LUKS", ENV{crypto}="mapper/", ENV{device}="/dev/mapper/%k" ENV{crypto}=="", ENV{device}="%N" ACTION=="add", ENV{crypto}!="", ENV{mount}="%N %k " # Global mount options ACTION=="add", ENV{mount_options}="noatime" # Filesystem-specific mount options ACTION=="add", PROGRAM=="/sbin/blkid -o value -s TYPE %E{device}", RESULT=="vfat|ntfs", ENV{mount_options}="%E{mount_options},utf8,gid=100,umask=002" # Get label if present, otherwise assign one PROGRAM=="/sbin/blkid -o value -s LABEL %E{device}", ENV{dir_name}="%c" # Use basename to correctly handle labels such as ../mnt/foo PROGRAM=="/usr/bin/basename '%E{dir_name}'", ENV{dir_name}="%c" ENV{dir_name}=="", ENV{dir_name}="usbhd-%k" # Mount the device ACTION=="add", ENV{dir_name}!="", RUN+="/scripts/media-mount.sh a '/dev/%E{crypto}%k' '/media/%E{dir_name}' '%E{mount_options}' '%E{mount}'" ACTION=="remove", ENV{dir_name}!="", RUN+="/scripts/media-mount.sh r '/dev/%E{crypto}%k' '/media/%E{dir_name}'" # Exit LABEL="media_by_label_auto_mount_end"
Now run
udevadm control restart
as root and now you should get a request by TuxCommander after pluging in a usb drive whether he should reload the config. After reloading a button should appear in the mountbar with the name of the usb drive label or something like usb-.