Compare commits

..

No commits in common. "master" and "1.5.9" have entirely different histories.

19 changed files with 667 additions and 919 deletions

302
README
View File

@ -1,178 +1,48 @@
___ /\ ___
__/ /_ / \ _\ \__
____ _____/_ __/__ / _/\ ___ ___ ____ ______ __\__ _\
/ \ / / // // \ /\_/ \ / / \ / \\ \ \ / \\ \
/ / // / // // / // \\ \ \ \\ \ \\ \ \\ \ \\ \_
\_____\\____/ \__\\____//__________\\__\__\__\\____/ \_____\\__\__\\___\
The 'automount' is a devd(8) based automounter for FreeBSD. The 'automount' is a devd(8) based automounter for FreeBSD.
It supports most popular file systems: It supports most popular file systems:
NTFS/MSDOS/exFAT/EXT2/EXT3/EXT4/UFS/XFS/HFS/MTP/ISO9660 NTFS/MSDOS/exFAT/EXT2/EXT3/EXT4/UFS
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
I N S T A L L I N S T A L L
=================== ===================
Use provided FreeBSD Ports/packages from here: # cp automount /usr/local/sbin/automount
* sysutils/automount
.. or make manual unstallation:
# cp automount.conf /usr/local/etc/automount.conf # cp automount.conf /usr/local/etc/automount.conf
# cp automount_devd.conf /usr/local/etc/devd/automount_devd.conf # cp automount_devd.conf /usr/local/etc/devd/automount_devd.conf
# cp automount /usr/local/sbin/automount
# chmod +x /usr/local/sbin/automount
# /etc/rc.d/devd restart # /etc/rc.d/devd restart
Now plugin Your USB thumb drive and have fun ;) Now plugin Your USB thumb drive and have fun ;)
These ports/packages are needed for all filesystems: ... or just install these FreeBSD Ports/Packages:
* sysutils/e2fsprogs // EXT2/EXT3/EXT4 fsck(8) * sysutils/automount
* sysutils/xfsprogs // XFS fsck(8) * sysutils/exfat-utils
* sysutils/exfat-utils // exFAT exfatfsck(8) * sysutils/fusefs-exfat
* sysutils/fusefs-exfat // exFAT * sysutils/fusefs-ntfs
* sysutils/fusefs-ntfs // NTFS (read write support) * sysutils/fusefs-ext4fuse
* sysutils/fusefs-hfsfuse // HFS * sysutils/fusefs-simple-mtpfs
* sysutils/fusefs-lkl // XFS/EXT2/EXT3/EXT4 * sysutils/fusefs-hfsfuse
* sysutils/fusefs-simple-mtpfs // MTP * sysutils/fusefs-lkl
All of the above are available as pkg(8) packages. Regards,
vermaden
Shortcut:
# pkg install -y \
sysutils/e2fsprogs \
sysutils/xfsprogs \
sysutils/exfat-utils \
sysutils/fusefs-exfat \
sysutils/fusefs-ntfs \
sysutils/fusefs-hfsfuse \
sysutils/fusefs-lkl \
sysutils/fusefs-simple-mtpfs
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
C H A N G E L O G C H A N G E L O G
========================= =========================
VERSION 1.7.9 (CURRENT)
Fix XORG detection.
Implement proposed BLACKLIST_REGEX option.
Use 'sysutils/fusefs-lkl' for all ext2/ext3/ext4 mounts.
Fix exFAT detection.
Fix small problem with checking the mount state.
Implement better old directory cleanup.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
VERSION 1.7.8 VERSION 1.5.9 (CURRENT)
Fix harmless gpart(8) rant about ugen(4) devices. Decreese DELAY for sleep from '1' to '0.1' for faster monting.
-------------------------------------------------------------------------------
VERSION 1.7.7
Add option to ignore system partitions like EFI or MSR.
Fix removal of dirs from unmounted filesystems.
Fix mount permissions for FAT filesystems.
Add spaces and comments in the code.
-------------------------------------------------------------------------------
VERSION 1.7.6
Added UZIP images support.
Added another try to mount device in read only mode.
Added optional ada(4) disks support.
Added optional md(4) devices support.
Added automatic kernel modules loading.
-------------------------------------------------------------------------------
VERSION 1.7.5
Add REMOVEDIRS option as default.
Add NICENAMES option to use labels instead of device names.
Use procstat(1) for faster DISPLAY environemnt searching.
-------------------------------------------------------------------------------
VERSION 1.7.4
Add new logo.
-------------------------------------------------------------------------------
VERSION 1.7.3
Use 755 permissions for FAT mounts.
-------------------------------------------------------------------------------
VERSION 1.7.2
Phase out support for sysutils/fusefs-ext4fuse port.
Fix UMASK for exFAT filesystems.
Fix ISO9660 mount options.
-------------------------------------------------------------------------------
VERSION 1.7.1
Fix exFAT mount rights.
Use USER option in config file.
Make MTP detection and mount better.
-------------------------------------------------------------------------------
VERSION 1.7.0
The automount has now a new co-author - Rozhuk Ivan.
New options available in automount.conf config file.
Filesystem detection/mounting reworked totally with file(1)/dd(1)/fstyp(8) as backends.
Notifications are now possible with libnotify.
Automatic detection of DISPLAY variable.
New automatic wait for device appearance.
New detection if device is a block device.
Introduction of CD-ROM support.
Automatic detection of File Manager with exo-open(1).
Option REMOVEDIRS is deprecated now.
Handle '-o large' option for FAT under FreeBSD 11.x and 12.x versions.
-------------------------------------------------------------------------------
VERSION 1.6.1
Fix MBR/msdosfs partition unmount issue.
-------------------------------------------------------------------------------
VERSION 1.6.0
Fix long boot with devd(8) because of ugen(4) devices.
Add fsck.exfat to the exFAT filesystem.
Set fsck.ext2 instead of e2fsck to the ext2 filesystem.
Set fsck.ext3 instead of e2fsck to the ext3 filesystem.
Set fsck.ext4 instead of e2fsck to the ext4 filesystem.
-------------------------------------------------------------------------------
VERSION 1.5.9
Decrease DELAY for sleep from '1' to '0.1' for faster mounting.
Remove __random_wait() at 'attach'. Remove __random_wait() at 'attach'.
Implement MTP mounting. Implement MTP mounting.
Added XFS and HFS support. Added XFS and HFS support.
Various fixes and cleanups. Various fixes and cleanups.
Remove '-o large' option for FAT (not supported on FreeBSD 12).
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -190,7 +60,7 @@ VERSION 1.5.7
Fix FAT32 mount. Fix FAT32 mount.
Add extended options for EXFAT mounts. Add extended options for EXFAT mounts.
Add -version option. Add -version option.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -202,15 +72,15 @@ Implement --version option.
VERSION 1.5.5 VERSION 1.5.5
Rework NTFS/MSDOS/FAT detection. Rework NTFS/MSDOS/FAT detection.
Check for NTFS before FAT. Check for NTFS before FAT.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
VERSION 1.5.4 VERSION 1.5.4
Added notification via notify-send/libnotify and wall(1). Minor bug fix. Added notification via notify-send/libnotify and wall(1). Minor bug fix.
Change 'boot sector' detection. Change 'boot sector' detection.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -229,7 +99,7 @@ Introduce smarter fstype() function to better determine filesystem.
VERSION 1.5.1 VERSION 1.5.1
Add -k flag to file(1) command. Add -k flag to file(1) command.
Set new --version and date(1). Set new --version and date(1).
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -239,11 +109,11 @@ Add new NTFS options.
Add nested NTFS mount attempt. Add nested NTFS mount attempt.
Fix devd(8) config. Fix devd(8) config.
Improve log messages. Improve log messages.
Use random wait only on ATTACH action, not needed on DETACH action. Use random wait only on ATTACH action, not needed on DETACH action.
Implement random wait to eliminate race. Implement random wait to eliminate race.
Implement BOOTDELAY option to wait for boot process to complete. Implement BOOTDELAY option to wait for boot process to complete.
Fix devd(8) config (LARKIND) to match all needed devices and their partitions. Fix devd(8) config (LARKIND) to match all needed devices and their partitions.
Fix typo in NTFS error message. Fix typo in NTFS error message.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -251,10 +121,10 @@ VERSION 1.4.3
Only style(9) changes. Only style(9) changes.
Force longnames option for msdosfs. Force longnames option for msdosfs.
Remove -u option for debug. Remove -u option for debug.
Fix a bug when ATIME is enabled. Fix a bug when ATIME is enabled.
Add -o remove_hiberfile to NTFS-3G mount options. Add -o remove_hiberfile to NTFS-3G mount options.
Fix typo at /var/log/automount.log error message. Fix typo at /var/log/automount.log error message.
Use /sbin/e2fsck from FreeBSD base system. Use /sbin/e2fsck from FreeBSD base system.
Fix typo at /var/log/automount.log error message. Fix typo at /var/log/automount.log error message.
Force longnames option for msdosfs. Force longnames option for msdosfs.
@ -308,19 +178,18 @@ Added the --help page.
Removed some small bugs. Removed some small bugs.
Added more options to configure features. Added more options to configure features.
% /usr/local/sbin/automount --help
% automount --help
AUTOMOUNT is a devd(8) based automounter for FreeBSD. AUTOMOUNT is a devd(8) based automounter for FreeBSD.
It supports following file systems: It supports following file systems:
UFS/FAT/exFAT/NTFS/EXT2/EXT3/EXT4/MTP/HFS/ISO9660 UFS/FAT/exFAT/NTFS/EXT2/EXT3/EXT4
Add these to mount NTFS/exFAT/EXT4/HFS/XFS/MTP respectively: It needs these ports to mount NTFS/exFAT/EXT4 respectively:
o sysutils/fusefs-ntfs o sysutils/fusefs-ntfs
o sysutils/fusefs-exfat o sysutils/fusefs-exfat
o sysutils/fusefs-ext4fuse o sysutils/fusefs-ext4fuse
o sysutils/fusefs-hfsfuse
o sysutils/fusefs-lkl
o sysutils/fusefs-simple-mtpfs
By default it mounts/unmounts all removable media but By default it mounts/unmounts all removable media but
it is possible to set some additional options at the it is possible to set some additional options at the
@ -328,86 +197,26 @@ it is possible to set some additional options at the
Below is a list of possible options with description. Below is a list of possible options with description.
MNT_PREFIX (set to /media by default) MNTPREFIX (set to /media by default)
With this options You can alter the default root With this options You can alter the default root
for mounting the removable media, for example to for mounting the removable media, for example to
the /mnt directory. the /mnt directory.
example: MNT_PREFIX='/media' example: MNTPREFIX="/media"
MNT_GROUP (wheel by default) ENCODING (set to en_US.ISO8859-1 by default)
If set to some group name, the mount command will
chown(1) the mount directory with the group.
example: group='operator'
MNT_MODE (set to 775 by default)
Value for chmod on mount point.
FAT_ENCODING (set to en_US.UTF-8 by default)
Only used with FAT32 mounts, specifies which Only used with FAT32 mounts, specifies which
encoding to use at the mount. encoding to use at the mount.
example: FAT_ENCODING='en_US.ISO8859-1' example: ENCODING="pl_PL.ISO8859-2"
FAT_CODEPAGE (set to CP866 by default) CODEPAGE (set to cp437 by default)
Only used with FAT32 mounts, specifies which Only used with FAT32 mounts, specifies which
code page to use at the mount. code page to use at the mount.
example: FAT_CODEPAGE='cp437' example: CODEPAGE="cp852"
ISO9660_CODEPAGE (set to UTF-8 by default) USER (unset by default)
Only used with cd9660 mounts, specifies which
code page to use at the mount.
ATIME (set to NO by default)
When set to NO it will mount filesystems with
noatime option when possible.
example: ATIME='YES'
RETRY_COUNT (set to 3 by default)
How many times try to get file system type or try to mount.
example: RETRY_COUNT='1'
RETRY_DELAY (set to 1 second by default)
Delay beetwin retry attempt.
example: RETRY_DELAY='2.5'
USERUMOUNT (set to NO by default)
When set to YES it will 'chmod +s /sbin/umount'
which would allow an USER to unmount the file
system with their selected file manager.
example: USERUMOUNT='YES'
NOTIFY (set to NO by default)
Use 'notify-send' and 'libnotify' to show notifications
of mounting and unmounting devices on the desktop.
example: NOTIFY='YES'
WALL (set to NO by default)
Use wall(1) to show notifications of mounting and
unmounting devices on terminals of logged in users.
example: WALL='YES'
FM ('exo-open --launch FileManager' by default)
If set to file manager command, the mount will
launch the specified command after successful
mount. Works only if USER parameter is also set.
example: FM='nautilus --browser --no-desktop'
BLACKLIST (unset by default)
The automount will ignore devices defined here.
example: BLACKLIST='da0 da3s1a'
USER (root by default)
If set to some username, the mount command will If set to some username, the mount command will
chown(1) the mount directory with the user and chown(1) the mount directory with the user and
its primary user group. If used with FM option its primary user group. If used with FM option
@ -416,6 +225,32 @@ USER (root by default)
example: USER="vermaden" example: USER="vermaden"
FM (unset by default)
If set to file manager command, the mount will
launch the specified command after successful
mount. Works only if USER parameter is also set.
example: FM="nautilus --browser --no-desktop"
USERUMOUNT (set to NO by default)
When set to YES it will 'chmod +s /sbin/umount'
which would allow an USER to unmount the file
system with their selected file manager.
example: USERUMOUNT="YES"
ATIME (set to YES by default)
When set to NO it will mount filesystems with
noatime options when possible.
example: ATIME="NO"
REMOVEDIRS (set to NO by default)
When set to YES it will remove empty directories
under the used after device detach.
example: REMOVEDIRS="YES"
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
VERSION 1.2 VERSION 1.2
@ -489,11 +324,6 @@ The only additional configuration it requires is to add these lines as
Remember to restart /etc/rc.d/devd daemon after adding Remember to restart /etc/rc.d/devd daemon after adding
/usr/local/etc/devd/automount_devd.conf file. /usr/local/etc/devd/automount_devd.conf file.
------------------------------------------------------------------------------
Have Fun ;) Have Fun ;)
vermaden vermaden

1195
automount Executable file → Normal file
View File

@ -1,7 +1,6 @@
#!/bin/sh #! /bin/sh
# Copyright (c) 2012-2024 Slawomir Wojciech Wojtczak <vermaden@interia.pl> # Copyright (c) 2012-2015 Slawomir Wojciech Wojtczak (vermaden)
# Copyright (c) 2019 Rozhuk Ivan <rozhuk.im@gmail.com>
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
@ -26,18 +25,19 @@
PATH=${PATH}:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin PATH=${PATH}:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
__usage() { __usage() {
cat << EOF cat << EOF
AUTOMOUNT is a devd(8) based automounter for FreeBSD. AUTOMOUNT is a devd(8) based automounter for FreeBSD.
It supports following file systems: It supports following file systems:
UFS/FAT/exFAT/NTFS/EXT2/EXT3/EXT4/MTP/HFS/ISO9660 UFS/FAT/exFAT/NTFS/EXT2/EXT3/EXT4/MTP/HFS
Add these to mount NTFS/exFAT/EXT4/HFS/XFS/MTP respectively: Add these to mount NTFS/exFAT/EXT4/MTP/HFS/XFS respectively:
o sysutils/fusefs-ntfs o sysutils/fusefs-ntfs
o sysutils/fusefs-exfat o sysutils/fusefs-exfat
o sysutils/fusefs-ext4fuse
o sysutils/fusefs-simple-mtpfs
o sysutils/fusefs-hfsfuse o sysutils/fusefs-hfsfuse
o sysutils/fusefs-lkl o sysutils/fusefs-lkl
o sysutils/fusefs-simple-mtpfs
By default it mounts/unmounts all removable media but By default it mounts/unmounts all removable media but
it is possible to set some additional options at the it is possible to set some additional options at the
@ -45,95 +45,26 @@ it is possible to set some additional options at the
Below is a list of possible options with description. Below is a list of possible options with description.
MNT_PREFIX (set to /media by default) MNTPREFIX (set to /media by default)
With this options You can alter the default root With this options You can alter the default root
for mounting the removable media, for example to for mounting the removable media, for example to
the /mnt directory. the /mnt directory.
example: MNT_PREFIX='/media' example: MNTPREFIX="/media"
MNT_GROUP (wheel by default) ENCODING (set to en_US.ISO8859-1 by default)
If set to some group name, the mount command will
chown(1) the mount directory with the group.
example: group='operator'
MNT_MODE (set to 775 by default)
Value for chmod on mount point.
FAT_ENCODING (set to en_US.UTF-8 by default)
Only used with FAT32 mounts, specifies which Only used with FAT32 mounts, specifies which
encoding to use at the mount. encoding to use at the mount.
example: FAT_ENCODING='en_US.ISO8859-1' example: ENCODING="pl_PL.ISO8859-2"
FAT_CODEPAGE (set to CP866 by default) CODEPAGE (set to cp437 by default)
Only used with FAT32 mounts, specifies which Only used with FAT32 mounts, specifies which
code page to use at the mount. code page to use at the mount.
example: FAT_CODEPAGE='cp437' example: CODEPAGE="cp852"
ISO9660_CODEPAGE (set to UTF-8 by default) USER (unset by default)
Only used with cd9660 mounts, specifies which
code page to use at the mount.
ATIME (set to NO by default)
When set to NO it will mount filesystems with
noatime option when possible.
example: ATIME='YES'
RETRY_COUNT (set to 3 by default)
How many times try to get file system type or try to mount.
example: RETRY_COUNT='1'
RETRY_DELAY (set to 1 second by default)
Delay beetwin retry attempt.
example: RETRY_DELAY='2.5'
USERUMOUNT (set to NO by default)
When set to YES it will 'chmod +s /sbin/umount'
which would allow an USER to unmount the file
system with their selected file manager.
example: USERUMOUNT='YES'
NOTIFY (set to NO by default)
Use 'notify-send' and 'libnotify' to show notifications
of mounting and unmounting devices on the desktop.
example: NOTIFY='YES'
WALL (set to NO by default)
Use wall(1) to show notifications of mounting and
unmounting devices on terminals of logged in users.
example: WALL='YES'
FM ('exo-open --launch FileManager' by default)
If set to file manager command, the mount will
launch the specified command after successful
mount. Works only if USER parameter is also set.
example: FM='nautilus --browser --no-desktop'
BLACKLIST (unset by default)
The automount will ignore devices defined here.
example: BLACKLIST='da0 da3s1a'
BLACKLIST_REGEX (unset by default)
The boolean flag option complements the above BLACKLIST option
if one wants regex match instead of exact match for ignoring devices.
Below will ignore all partitions ada0p1/ada0p2/... of ada0 device.
example: BLACKLIST='ada0'
BLACKLIST_REGEX=true
USER (root by default)
If set to some username, the mount command will If set to some username, the mount command will
chown(1) the mount directory with the user and chown(1) the mount directory with the user and
its primary user group. If used with FM option its primary user group. If used with FM option
@ -142,159 +73,125 @@ USER (root by default)
example: USER="vermaden" example: USER="vermaden"
REMOVEDIRS (set to YES by default) FM (unset by default)
If set to YES the automount(8) will remove /media dir after unmount. If set to file manager command, the mount will
launch the specified command after successful
mount. Works only if USER parameter is also set.
example: REMOVEDIRS=NO example: FM="nautilus --browser --no-desktop"
NICENAMES (set to NO by default) USERUMOUNT (set to NO by default)
If set to YES the device/filesystem label will be used for /media dir name. When set to YES it will 'chmod +s /sbin/umount'
which would allow an USER to unmount the file
system with their selected file manager.
example: NICENAMES=YES example: USERUMOUNT="YES"
IGNORE_SYS_PARTS (set to NO by default) ATIME (set to YES by default)
If set to YES automount(8) will ignore system partitions like EFI or MSR. When set to NO it will mount filesystems with
noatime options when possible.
example: IGNORE_SYS_PARTS=YES example: ATIME="NO"
REMOVEDIRS (set to NO by default)
When set to YES it will remove empty directories
under the used ${MNTPREFIX} after device detach.
example: REMOVEDIRS="YES"
BLACKLIST (unset by default)
The automount will ignore devices defined here.
example: BLACKLIST="da0 da3s1a"
TIMEOUT (set to 8 by default)
Do not wait longer then the specified timeout for
the device node to appear in /dev and be accessible.
example: TIMEOUT="8"
DELAY (set to 1 second by default)
How often to check for device availability.
example: DELAY="2.5"
BOOTDELAY (set to 45 seconds by default)
How long to wait for boot process to complete.
example: BOOTDELAY="30"
NOTIFY (set to NO by default)
Use 'notify-send' and 'libnotify' to show notifications
of mounting and unmounting devices on the desktop.
Note that you have to call 'xhost +local:' command in
your '~/.xinitrc' file for this to work.
example: NOTIFY="YES"
WALL (set to NO by default)
Use wall(1) to show notifications of mounting and
unmounting devices on terminals of logged in users.
example: WALL="YES"
EOF EOF
exit 0 exit 0
} }
# display version if needed if [ "${1}" = "--version" -o "${1}" = "-version" -o "${1}" = "version" ]
if [ "${1}" = '--version' -o \
"${1}" = '-version' -o \
"${1}" = 'version' -o \
"${1}" = '-v' ]
then then
echo echo "automount 1.5.9 2018/12/08"
echo " ___ /\ ___ "
echo " __/ /_ / \ _\ \__ "
echo " ____ _____/_ __/__ / _/\ ___ ___ ____ ______ __\__ _\ "
echo " / \ / / // // \ /\_/ \ / / \ / \\\ \ \ / \\\ \ "
echo " / / // / // // / // \\\ \ \ \\\ \ \\\ \ \\\ \ \\\ \_ "
echo " \_____\\\____/ \__\\\____//__________\\\__\__\__\\\____/ \_____\\\__\__\\\___\ "
echo
echo "automount 1.8.0 2024/03/05"
exit 0 exit 0
fi fi
# display help if needed if [ "${1}" = "-h" -o "${1}" = "--help" -o ${#} -eq 0 -o ${#} -eq 1 ]
if [ "${1}" = "-h" -o \
"${1}" = "--h" -o \
"${1}" = "-help" -o \
"${1}" = "--help" -o \
"${#}" -eq "0" -o \
"${#}" -eq "1" ]
then then
__usage __usage
fi fi
# read configuration file if [ -f /usr/local/etc/automount.conf ]
if [ -f /usr/local/etc/automount.conf ] ; then then
. /usr/local/etc/automount.conf . /usr/local/etc/automount.conf
fi fi
# default values for global variables : ${MNTPREFIX="/media"} # mount prefix
: ${MNT_PREFIX='/media'} # mount prefix : ${LOG="/var/log/automount.log"} # log file
: ${MNT_GROUP='wheel'} # use WHEEL group for popup : ${STATE="/var/run/automount.state"} # current state file
: ${MNT_MODE='775'} # mount point mode : ${ENCODING="en_US.ISO8859-1"} # US/Canada
: ${FAT_ENCODING='en_US.UTF-8'} # US/Canada : ${CODEPAGE="cp437"} # US/Canada
: ${FAT_CODEPAGE='cp437'} # US/Canada : ${DATEFMT="%Y-%m-%d %H:%M:%S"} # 2012-02-20 07:49:09
: ${ISO9660_CODEPAGE='UTF-8'} # UTF-8 : ${USERUMOUNT="NO"} # when YES add suid bit to umount(8)
: ${ATIME='NO'} # when NO mount with noatime : ${ATIME="YES"} # when NO mount with noatime
: ${RETRY_COUNT='5'} # retry count : ${REMOVEDIRS="NO"} # remove empty dirs under ${MNTPREFIX}
: ${RETRY_DELAY='2'} # retry delay time : ${USER="0"} # which user to use for popup
: ${USERUMOUNT='NO'} # when YES add suid bit to umount(8) : ${FM="0"} # which file manager to use
: ${NOTIFY='NO'} # use notify-send(1) (devel/libnotify) : ${TIMEOUT="8"} # stop waiting for device after that time
: ${WALL='NO'} # use wall(1) : ${DELAY="0.1"} # check for the device node that often
: ${FM='exo-open --launch FileManager'} # which file manager to use : ${BOOTDELAY="45"} # wait for boot process to complete
: ${LOG_FILE='/var/log/automount.log'} # log file : ${NOTIFY="NO"} # use 'notify-send' and 'libnotify'
: ${LOG_DATEFMT='%Y-%m-%d %H:%M:%S'} # 2012-02-20 07:49:09 : ${WALL="NO"} # use 'wall(1)'
: ${STATE="/var/run/automount.state"} # current state file
: ${USER="root"} # which user to use for popup
: ${REMOVEDIRS='YES'} # remove /media dir after unmount
: ${NICENAMES='NO'} # use device label for /media dir name
: ${IGNORE_SYS_PARTS='NO'} # ignore system partitions like EFI or MSR
# init of main variables if [ "${USERUMOUNT}" = YES ]
DEV="/dev/${1}"
UID=$( id -u ${USER} )
GID=$( pw group show -n ${MNT_GROUP} | awk -F':' '{print $3}' )
if [ ${?} -ne 0 ]
then then
__log "${MNT_GROUP}: invalid group" chmod u+s /sbin/umount 1> /dev/null 2> /dev/null # WHEEL group member
exit 1 chmod u+s /sbin/mount* 1> /dev/null 2> /dev/null # WHEEL group member
sysctl vfs.usermount=1 1> /dev/null 2> /dev/null # allow USER to mount
fi fi
# process ${USERUMOUNT} option __create_mount_point() { # 1=DEV
case ${USERUMOUNT} in local DEVICE=${1##*/}
([Yy][Ee][Ss]) mkdir -p ${MNTPREFIX}/${DEVICE}
chmod u+s /sbin/umount 1> /dev/null 2>&1 # WHEEL group member if [ "${USER}" != 0 ]
chmod u+s /sbin/mount* 1> /dev/null 2>&1 # WHEEL group member then
sysctl -q vfs.usermount=1 1> /dev/null 2>&1 # allow user to mount chown ${USER}:$( id -g -n ${USER} ) ${MNTPREFIX}/${DEVICE}
;; UID=$( id -u ${USER} )
esac GID=$( id -g ${USER} )
else
# read only filesystem types for __guess_fs_type() function UID=0
readonly FS_TYPE_UNKNOWN=0 GID=0
readonly FS_TYPE_ISO9660=1 fi
readonly FS_TYPE_UFS=8
readonly FS_TYPE_EXT2=9
readonly FS_TYPE_EXT3=10
readonly FS_TYPE_EXT4=11
readonly FS_TYPE_XFS=12
readonly FS_TYPE_HFS=13
readonly FS_TYPE_FAT=32
readonly FS_TYPE_EXFAT=33
readonly FS_TYPE_NTFS=34
readonly FS_TYPE_MTP=128
# FUNCTION: guess filesystem type from device
__guess_fs_type() { # 1=DEV
# first time guess with file(1) tool
unset FS_TYPE
local FS_TYPE=$( file -r -b -L -s ${1} 2> /dev/null | sed -E 's/label:\ \".*\"//g' )
case ${FS_TYPE} in
(*ISO\ 9660*) return ${FS_TYPE_ISO9660} ;;
(*Unix\ Fast\ File*) return ${FS_TYPE_UFS} ;;
(*ext2*) return ${FS_TYPE_EXT2} ;;
(*ext3*) return ${FS_TYPE_EXT3} ;;
(*ext4*) return ${FS_TYPE_EXT4} ;;
(*SGI\ XFS*) return ${FS_TYPE_XFS} ;;
(*Macintosh\ HFS*) return ${FS_TYPE_HFS} ;;
esac
# second time guess with file(1) tool with -k option
# (do not stop at the first match and keep going)
unset FS_TYPE
local FS_TYPE=$( file -k -r -b -L -s ${1} 2> /dev/null | tr '\n' ' ' | sed -E 's/label:\ \".*\"//g' )
case ${FS_TYPE} in
(*Unix\ Fast\ File*) return ${FS_TYPE_UFS} ;;
(*NTFS*) return ${FS_TYPE_NTFS} ;;
(*ExFAT*) return ${FS_TYPE_EXFAT} ;;
(*\ FAT\ *|*MSDOS*) return ${FS_TYPE_FAT} ;;
esac
# try with fstyp(8) last (exFAT on UFS issue)
unset FS_TYPE
local FS_TYPE=$( fstyp ${1} 2> /dev/null )
case ${FS_TYPE} in
(cd9660) return ${FS_TYPE_ISO9660} ;;
(ufs) return ${FS_TYPE_UFS} ;;
(ext2fs) return ${FS_TYPE_EXT2} ;;
(msdosfs) return ${FS_TYPE_FAT} ;;
(exfat) return ${FS_TYPE_EXFAT} ;;
(ntfs) return ${FS_TYPE_NTFS} ;;
esac
# magic detection code with dd(8)
unset FS_TYPE
local FS_TYPE=$( dd if="${1}" conv=sync count=1 bs=1k 2> /dev/null | strings | head -1 )
case ${FS_TYPE} in
(*EXFAT*) return ${FS_TYPE_EXFAT} ;;
esac
return ${FS_TYPE_UNKNOWN}
} }
# FUNCTION: add state to the ${STATE} file
__state_add() { # 1=DEV 2=PROVIDER 3=MNT __state_add() { # 1=DEV 2=PROVIDER 3=MNT
if [ -f ${STATE} ] if [ -f ${STATE} ]
then then
@ -307,7 +204,7 @@ __state_add() { # 1=DEV 2=PROVIDER 3=MNT
echo "${1} ${2} ${3}" >> ${STATE} echo "${1} ${2} ${3}" >> ${STATE}
if [ "${NOTIFY}" = YES ] if [ "${NOTIFY}" = YES ]
then then
__show_message "Device '${1}' mounted on '${3}' directory." env DISPLAY=:0 notify-send automount "Device '${1}' mounted on '${3}' directory."
fi fi
if [ "${WALL}" = YES ] if [ "${WALL}" = YES ]
then then
@ -315,16 +212,14 @@ __state_add() { # 1=DEV 2=PROVIDER 3=MNT
fi fi
} }
# FUNCTION: remove state from the ${STATE} file
__state_remove() { # 1=MNT __state_remove() { # 1=MNT
if [ -f ${STATE} ] if [ -f ${STATE} ]
then then
# backslash the slashes ;) BSMNT=$( echo ${1} | sed 's/\//\\\//g' ) # backslash the slashes ;)
BSMNT=$( echo ${1} | sed 's/\//\\\//g' )
sed -i '' "/${BSMNT}\$/d" ${STATE} sed -i '' "/${BSMNT}\$/d" ${STATE}
if [ "${NOTIFY}" = YES ] if [ "${NOTIFY}" = YES ]
then then
__show_message "Device '${1}' unmounted from '${3}' directory." env DISPLAY=:0 notify-send automount "Device '${1}' unmounted from '${3}' directory."
fi fi
if [ "${WALL}" = YES ] if [ "${WALL}" = YES ]
then then
@ -333,447 +228,531 @@ __state_remove() { # 1=MNT
fi fi
} }
# FUNCTION: add message to the ${LOG_FILE} file
__log() { # @=MESSAGE
echo $( date +"${LOG_DATEFMT}" ) "${@}" >> "${LOG_FILE}"
}
# FUNCTION: remove temp mount dir from ${MNT_PREFIX} path (like /media/da0 dir)
__remove_dir() { # 1=TARGET __remove_dir() { # 1=TARGET
if [ "${REMOVEDIRS}" = YES ] if [ "${REMOVEDIRS}" = YES ]
then then
if [ -d "${1}" ] find "${1}" -type d -empty -maxdepth 1 -exec rm -r {} '+' 2> /dev/null
then
sleep 1
# find "${1}" -type d -empty -maxdepth 1 -exec rm -r {} '+' 2> /dev/null
find "${MNT_PREFIX}" -depth 1 -empty -prune -delete 2> /dev/null
fi
fi fi
} }
# FUNCTION: display wall(1) and/or notify-send(1) message __log() { # @=MESSAGE
__show_message() { # 1=MESSAGE echo $( date +"${DATEFMT}" ) "${@}" >> ${LOG}
case ${WALL} in
([Yy][Ee][Ss])
echo "automount: ${1}" | wall
;;
esac
case ${NOTIFY} in
([Yy][Ee][Ss])
local __DISPLAY_IDS=$( ps aew | sed -n 's|.*DISPLAY=\([-_a-zA-Z0-9:.]*\).*|\1|p' | sort -u | tr '\n' ' ' )
for __DISPLAY_ID in ${__DISPLAY_IDS}
do
local __USER=$( ps aewj | grep "DISPLAY=${__DISPLAY_ID}" | awk '{print $1;}' | sort -u | tr -cd '[:print:]' )
if [ -z "${__USER}" ]
then
continue
fi
su -l "${__USER}" -c "env DISPLAY=${__DISPLAY_ID} notify-send automount '${1}' &" 1> /dev/null 2>&1
done
;;
esac
} }
# FUNCTION: check if device or mountpoint not already mounted __check_already_mounted() { # 1=(-d|-m) 2=(DEV|MNT)
__check_already_mounted() { # 1=DEV 2=MNT local MOUNT="$( mount )"
local MOUNT=$( mount )
if echo "${MOUNT}" | grep -q "^${1} on "
then
local MOUNT_POINT=$( echo "${MOUNT}" | grep "^${1} on " | cut -d ' ' -f 3-255 | cut -d '(' -f 1 | sed s/.$// )
__log "${DEV}: already mounted on '${MOUNT_POINT}' mount point"
exit 1
fi
if echo "${MOUNT}" | grep -q " on ${2} "
then
local DEVICE=$( echo "${MOUNT}" | grep " on ${2} " | awk '{print $1}' )
__log "${DEVICE}: already mounted on '${2}' mount point"
exit 1
fi
}
# FUNCTION: wait for device to appear (sometimes needed)
__wait_for_device() { # 1=DEV
# do not wait for MTP and CD-ROM devices
case ${1} in case ${1} in
(*ugen*|iso9660*) (-d)
return if echo "${MOUNT}" | grep -q "^${2} on "
then
local MOUNT="$( echo "${MOUNT}" | grep "^${2} on " | cut -d ' ' -f 3-255 | cut -d '(' -f 1 | sed s/.$// )"
__log "${DEV}: already mounted on '${MOUNT}' mount point"
exit 0
fi
;;
(-m)
if echo "${MOUNT}" | grep -q " on ${2} "
then
local DEVICE="$( echo "${MOUNT}" | grep " on ${2} " | awk '{print $1}' )"
__log "${DEVICE}: already mounted on '${2}' mount point"
exit 0
fi
;; ;;
esac esac
# try to read from device to ensure that it alive }
__wait_for_device() { # 1=DEV
local COUNT=0 local COUNT=0
while ! dd if="${1}" of=/dev/null conv=sync count=1 bs=8k 1> /dev/null 2>&1 while ! head -c 1 ${1} 1> /dev/null 2> /dev/null
do do
if [ ! -e "${1}" ] sleep ${DELAY}
local COUNT=$( echo ${COUNT} + ${DELAY} | bc -l )
if ! echo ${COUNT} | grep -q -E '^[0-9]'
then then
__log "${1}: device gone" local COUNT=0${COUNT}
exit 1
fi fi
COUNT=$(( ${COUNT} + 1 )) local COUNT_INT=$( echo ${COUNT} | cut -d '.' -f 1 )
if [ ${COUNT} -ge ${RETRY_COUNT} ] if [ ${COUNT_INT} -gt ${TIMEOUT} ]
then then
return __log "${DEV}: device node not available"
exit 0
fi fi
sleep "${RETRY_DELAY}"
__log "${1}: wait for device retry ${COUNT}/${RETRY_COUNT}"
done done
} }
# FUNCTION: check if device is a block device __wait_for_boot() {
__check_block_device() { # 1=DEV local BOOTTIME=$( sysctl -n kern.boottime | awk -F',' '{print $1}' | awk '{print $NF }' )
# first check if its block device local CURRTIME=$( date +%s )
if ! fstyp ${1} 1> /dev/null 2>&1 local UPTIME=$(( ${CURRTIME} - ${BOOTTIME} ))
local WAIT=0
while [ ${UPTIME} -lt ${BOOTDELAY} ]
do
sleep 1
local WAIT=1
local CURRTIME=$( date +%s )
local UPTIME=$(( ${CURRTIME} - ${BOOTTIME} ))
done
if [ ${WAIT} -eq 1 ]
then then
__log "${DEV}: not a block device" __log "${DEV}: done waiting '${BOOTDELAY}' seconds for boot process to complete"
exit 0
fi fi
} }
# main ATTACH/DETACH block # __random_wait() {
case ${2} in # RANDOM=$( head -c 256 /dev/urandom | env LC_ALL=C tr -c -d '1-9' )
(attach) # MODULO=$(( ${RANDOM} % 24 ))
# check if device still exists # WAIT=$( echo ${MODULO} / 10 | bc -l )
if [ ! -e "${DEV}" ] # WAIT_TEST=$( echo ${WAIT} | awk -F'.' '{print $1}' )
then # if [ "${WAIT_TEST}" = "" ]
__log "${DEV}: device does not exist" # then
exit 1 # WAIT="0${WAIT}"
fi # fi
__log "${DEV}: attach" # WAIT=$( printf "%.1f" ${WAIT} )
# sleep ${WAIT}
# __log "${DEV}: random wait for '${WAIT}' seconds before 'attach' action"
# }
# ignore system partitions like EFI or MSR __fstype() { # 1=DEV
if [ "${IGNORE_SYS_PARTS}" = 'YES' ] TYPE=$( dd < ${DEV} count=1 2> /dev/null | strings | head -1 )
if echo "${TYPE}" | grep -q 'EXFAT'
then
TYPE=EXFAT
return
fi
TYPE=''
TYPE=$( file -r -b -L -s ${DEV} | sed -E 's/label:\ \".*\"//g' )
if echo "${TYPE}" | grep -q 'Unix Fast File'
then
TYPE=UFS
return
fi
if echo "${TYPE}" | grep -q 'ext2'
then
TYPE=EXT2
return
fi
if echo "${TYPE}" | grep -q 'ext3'
then
TYPE=EXT3
return
fi
if echo "${TYPE}" | grep -q 'ext4'
then
TYPE=EXT4
return
fi
if echo "${TYPE}" | grep -q 'SGI XFS'
then
TYPE=XFS
return
fi
if echo "${TYPE}" | grep -q 'Macintosh HFS'
then
TYPE=HFS
return
fi
if echo "${TYPE}" | grep -q 'boot sector'
then
TYPE=$( file -r -k -b -L -s ${DEV} | sed -E 's/label:\ \".*\"//g' )
if echo "${TYPE}" | grep -q 'Unix Fast File'
then then
SYS_DEV=$( echo ${1} | grep -E -o '^[a-z]+[0-9]+' ) TYPE=UFS
SYS_GPART=$( gpart show -p -r ${SYS_DEV} 2> /dev/null | sed 's@=>@@g' | grep " ${1} " | awk '{print $4}' ) return
case ${SYS_GPART} in
(c12a7328-f81f-11d2-ba4b-00a0c93ec93b) exit 0 ;;
(e3c9e316-0b5c-4db8-817d-f92df00215ae) exit 0 ;;
esac
fi fi
if echo "${TYPE}" | grep -q 'NTFS'
# code for NICENAMES mounting instead of the /dev/${DEV} default
MNT_CANDIDATE=$( fstyp -l "/dev/${1}" 2> /dev/null | cut -d " " -f 2-99 | tr ' ' '-' )
if [ "${NICENAMES}" = "YES" -a -n "${MNT_CANDIDATE}" ]
then then
# check if dir exists TYPE=NTFS
if [ -e "${MNT_PREFIX}/${MNT_CANDIDATE}" ] return
then fi
# check if something is already mounted there and increment if it is if echo "${TYPE}" | grep -q 'MSDOS'
if mount | grep -q " ${MNT_PREFIX}/${MNT_CANDIDATE} " then
then TYPE=FAT
COUNT=1 return
while true fi
if echo "${TYPE}" | grep -q 'FAT (32 bit)'
then
TYPE=FAT
return
fi
if echo "${TYPE}" | grep -q 'FAT'
then
TYPE=FAT
return
fi
fi
TYPE=-1
return
}
DEV=/dev/${1}
__wait_for_boot
case ${1} in
(ugen*)
case ${2} in
(attach)
# __random_wait
__log "${DEV}: attach"
if [ "${BLACKLIST}" != "" ]
then
__log "${DEV}: using BLACKLIST='${BLACKLIST}'"
for I in ${BLACKLIST}
do do
COUNT=$(( ${COUNT} + 1 )) if [ ${1} = "${I}" ]
[ ! -e "${MNT_PREFIX}/${MNT_CANDIDATE}-${COUNT}" ] && break then
__log "${DEV}: device blocked by BLACKLIST option"
exit 0
fi
done done
MNT="${MNT_PREFIX}/${MNT_CANDIDATE}-${COUNT}"
else
# dir exists but its not mounted
MNT="${MNT_PREFIX}/${MNT_CANDIDATE}"
fi fi
else ADD=0
# dir does not exist MNT="${MNTPREFIX}/${1}"
MNT="${MNT_PREFIX}/${MNT_CANDIDATE}" __check_already_mounted -d ${DEV}
fi __check_already_mounted -m ${MNT}
else __wait_for_device ${DEV}
# device/filesystem without label PHONEDEV=$( simple-mtpfs --list-devices -d ${DEV} 2>&1 )
MNT="${MNT_PREFIX}/${1}"
fi
# blacklist check
if [ -n "${BLACKLIST}" ]
then
for I in ${BLACKLIST}
do
if [ "${1}" = "${I}" ]
then
__log "${DEV}: device blocked by BLACKLIST option"
exit 0
elif [ -n "${BLACKLIST_REGEX}" ] && echo ${DEV} | grep -q "${I}" 1> /dev/null 2> /dev/null
then
__log "${DEV}: device blocked by BLACKLIST_REGEX option"
exit 0
fi
done
fi
# check is device already mounted
__check_already_mounted "${DEV}" "${MNT}"
# make sure that data can be read from device
__wait_for_device "${DEV}"
# load needed kernel modules
kldload fusefs 1> /dev/null 2> /dev/null
kldload geom_uzip 1> /dev/null 2> /dev/null
# detect filesysytem type
case ${1} in
(iso9660*)
FS_TYPE=${FS_TYPE_ISO9660}
;;
(ugen*)
FS_TYPE=${FS_TYPE_MTP}
;;
(cd*)
__guess_fs_type "${DEV}"
FS_TYPE=${?}
;;
(md*.uzip|md*|ada*|da*|mmcsd*)
__check_block_device "${DEV}"
__guess_fs_type "${DEV}"
FS_TYPE=${?}
;;
esac
# process ATIME option
case ${ATIME} in
([Nn][Oo]) OPTS="-o noatime" ;;
esac
# filesystem options abstraction layer
case ${FS_TYPE} in
(${FS_TYPE_ISO9660})
FS_CHECK_CMD=''
FS_CHECK_ARGS=''
FS_MOUNT_CMD='mount'
FS_MOUNT_ARGS="-t cd9660 -o -e,-C=${ISO9660_CODEPAGE} ${DEV} ${MNT}"
;;
(${FS_TYPE_UFS})
FS_CHECK_CMD='fsck_ufs'
FS_CHECK_ARGS="-C -y"
FS_MOUNT_CMD='mount'
FS_MOUNT_ARGS="-t ufs ${OPTS} ${DEV} ${MNT}"
;;
(${FS_TYPE_EXT2})
FS_CHECK_PORT='sysutils/e2fsprogs'
FS_CHECK_CMD='fsck.ext2'
FS_CHECK_ARGS="-y"
FS_MOUNT_PORT='sysutils/fusefs-lkl'
FS_MOUNT_CMD='lklfuse'
FS_MOUNT_ARGS="-o type=ext2 -o allow_other -o intr -o uid=${UID} -o gid=${GID} -o umask=002 ${DEV} ${MNT}"
;;
(${FS_TYPE_EXT3})
FS_CHECK_PORT='sysutils/e2fsprogs'
FS_CHECK_CMD='fsck.ext3'
FS_CHECK_ARGS="-y"
FS_MOUNT_PORT='sysutils/fusefs-lkl'
FS_MOUNT_CMD='lklfuse'
FS_MOUNT_ARGS="-o type=ext3 -o allow_other -o intr -o uid=${UID} -o gid=${GID} -o umask=002 ${DEV} ${MNT}"
;;
(${FS_TYPE_EXT4})
FS_CHECK_PORT='sysutils/e2fsprogs'
FS_CHECK_CMD='fsck.ext4'
FS_CHECK_ARGS="-y"
FS_MOUNT_PORT='sysutils/fusefs-lkl'
FS_MOUNT_CMD='lklfuse'
FS_MOUNT_ARGS="-o type=ext4 -o allow_other -o intr -o uid=${UID} -o gid=${GID} -o umask=002 ${DEV} ${MNT}"
;;
(${FS_TYPE_XFS})
FS_CHECK_PORT='sysutils/xfsprogs'
FS_CHECK_CMD='xfs_repair'
FS_CHECK_ARGS="-d"
FS_MOUNT_CMD='lklfuse'
FS_MOUNT_ARGS="-o type=xfs -o allow_other -o uid=${UID} -o gid=${GID} ${DEV} ${MNT}"
FS_MOUNT_PORT='sysutils/fusefs-lkl'
;;
(${FS_TYPE_HFS})
FS_CHECK_CMD=''
FS_CHECK_ARGS=''
FS_MOUNT_CMD='hfsfuse'
FS_MOUNT_ARGS="--force ${OPTS} ${DEV} ${MNT}"
FS_MOUNT_PORT='sysutils/fusefs-hfsfuse'
;;
(${FS_TYPE_FAT})
# FreeBSD 12.x and later does not support/need '-o large' option
case $( sysctl -n kern.osrelease ) in
(10*) LARGE="-o large" ;;
(11*) LARGE="-o large" ;;
(*) LARGE="" ;;
esac
FS_CHECK_CMD='fsck_msdosfs'
FS_CHECK_ARGS="-C -y"
FS_MOUNT_CMD='mount_msdosfs'
FS_MOUNT_ARGS="-o longnames -m ${MNT_MODE} -M ${MNT_MODE} -D ${FAT_CODEPAGE} -L ${FAT_ENCODING} -u ${UID} -g ${GID} ${OPTS} ${LARGE} ${DEV} ${MNT}"
;;
(${FS_TYPE_EXFAT})
FS_CHECK_PORT='sysutils/exfat-utils'
FS_CHECK_CMD='fsck.exfat'
FS_CHECK_ARGS="-y"
FS_MOUNT_CMD='mount.exfat'
FS_MOUNT_UMASK=$( printf "%03o" $((~0775&0777)) )
FS_MOUNT_ARGS="-o uid=${UID} -o gid=${GID} -o umask=${FS_MOUNT_UMASK} ${OPTS} ${DEV} ${MNT}"
FS_MOUNT_PORT='sysutils/fusefs-exfat'
;;
(${FS_TYPE_NTFS})
FS_CHECK_CMD=''
FS_CHECK_ARGS=''
if /usr/bin/which -s ntfs-3g
then
FS_MOUNT_CMD='ntfs-3g'
FS_MOUNT_ARGS="-o recover ${OPTS} ${DEV} ${MNT}"
FS_MOUNT_PORT='sysutils/fusefs-ntfs'
else
FS_MOUNT_CMD='mount_ntfs'
FS_MOUNT_ARGS="-u root -g ${MNT_GROUP} ${OPTS} ${DEV} ${MNT}"
fi
;;
(${FS_TYPE_MTP})
FS_PORT='sysutils/fusefs-simple-mtpfs'
FS_CHECK_CMD=''
FS_CHECK_ARGS=''
FS_MOUNT_CMD='simple-mtpfs'
if ! /usr/bin/which -s "${FS_MOUNT_CMD}"
then
__log "command '${FS_MOUNT_CMD}' not found"
exit 1
fi
PHONEDEV=$( simple-mtpfs --list-devices -d ${DEV} 2> /dev/null )
if [ "${PHONEDEV}" = "No raw devices found." ] if [ "${PHONEDEV}" = "No raw devices found." ]
then then
__log "${DEV}: no raw devices found" __log "${DEV}: no raw devices found"
exit 0 exit 0
else
PHONEDEV=$( echo "${PHONEDEV}" | awk '{print $1}' | tr -d ':' )
fi fi
PHONEDEV=$( echo "${PHONEDEV}" | awk '{print $1}' | tr -d ':' ) __create_mount_point ${DEV}
if [ ! ${PHONEDEV} ] simple-mtpfs --device ${PHONEDEV} ${MNT} -o uid=${UID} -o gid=${GID} -o allow_other
if [ ${?} -ne 0 ]
then then
__log "${DEV}: no MTP devices found" su - ${USER} -c "env DISPLAY=:0 zenity --info --text 'Allow on the Phone.\n\nThen click OK.' --no-wrap"
exit 0 exit 0
else
# simple-mtpfs --device ${PHONEDEV} ${MNT} -o uid=${UID} -o gid=${GID} -o allow_other
PROVIDER=$( mount | grep -m 1 " ${MNT} " | awk '{printf $1}' )
__state_add ${DEV} ${PROVIDER} ${MNT}
if [ "${USER}" != 0 -a "${FM}" != 0 ]
then
su - ${USER} -c "env DISPLAY=:0 ${FM} ${MNT} &"
fi
fi fi
FS_MOUNT_ARGS="--device ${PHONEDEV} ${MNT} -o allow_other -o uid=${UID} -o gid=${GID}"
;; ;;
(*)
__log "${DEV}: filesystem not supported or no filesystem"
exit 0
;;
esac
# create mount point (detach)
mkdir -m "${MNT_MODE}" -p "${MNT}" __log "${DEV}: detach"
__log "${DEV}: create '${MNT}' dir" if [ -f ${STATE} ]
# check file system before mount
if [ -n "${FS_CHECK_CMD}" ]
then
if ! /usr/bin/which -s "${FS_CHECK_CMD}"
then
__log "command '${FS_CHECK_CMD}' not found"
__log "please install '${FS_CHECK_PORT}' port or package"
exit 1
fi
${FS_CHECK_CMD} ${FS_CHECK_ARGS} ${DEV} \
| while read LINE
do
__log "${DEV}: ${FS_CHECK_CMD} ${LINE}"
done
fi
# check is device already mounted
__check_already_mounted "${DEV}" "${MNT}"
# try to mount
if ! /usr/bin/which -s "${FS_MOUNT_CMD}"
then
__log "command '${FS_MOUNT_CMD}' not found"
__log "please install '${FS_MOUNT_PORT}' port or package"
exit 1
fi
__wait_for_device "${DEV}"
# execute appropriate mount(8) command
COUNT=0
while ! ${FS_MOUNT_CMD} ${FS_MOUNT_ARGS} 2> /dev/null
do
if [ ! -e "${DEV}" ]
then
__log "${DEV}: device gone"
exit 1
fi
COUNT=$(( ${COUNT} + 1 ))
if [ ${COUNT} -gt ${RETRY_COUNT} ]
then
# BEGIN | try to mount read only
FS_MOUNT_ARGS="-o ro ${FS_MOUNT_ARGS}"
${FS_MOUNT_CMD} ${FS_MOUNT_ARGS}
if [ ${?} -eq 0 ]
then then
__log "${DEV}: mount OK: '${FS_MOUNT_CMD} ${FS_MOUNT_ARGS}'" grep -E "${MNTPREFIX}/${1}$" ${STATE} \
break | while read DEV PROVIDER MNT
do
TARGET=$( mount | grep -v \.gvfs | grep -m 1 -E "^${PROVIDER} " | awk '{print $3}' )
__state_remove ${MNT}
if [ -z ${TARGET} ]
then
continue
fi
( # put entire umount/find/rm block into background
umount -f ${TARGET}
__remove_dir "${TARGET}"
__log "${DEV}: removed '${TARGET}'"
) &
unset TARGET
__log "${DEV}: umount"
done
__remove_dir "${MNTPREFIX}/${1}"
__log "${DEV}: mount point '${MNTPREFIX}/${1}' removed"
fi fi
# END | try to mount read only ;;
__log "${DEV}: mount FAIL: '${FS_MOUNT_CMD} ${FS_MOUNT_ARGS}'" esac
exit 1
fi
sleep "${RETRY_DELAY}"
__log "${DEV}: filesystem mount retry: ${COUNT}/${RETRY_COUNT}"
done
__log "${DEV}: mount OK: '${FS_MOUNT_CMD} ${FS_MOUNT_ARGS}'"
# add needed rights
chown "${USER}:${MNT_GROUP}" "${MNT}"
__log "${DEV}: chown '${MNT}' dir with '${USER}:${MNT_GROUP}' rights"
# add state
PROVIDER=$( mount | grep -m 1 " ${MNT} " | awk '{printf $1}' )
__state_add ${DEV} ${PROVIDER} ${MNT}
# open file manager and display message
__show_message "Device '${DEV}' mounted on '${MNT}' directory."
if [ -n "${FM}" ]
then
GROUP_USERS=$( pw group show ${MNT_GROUP} | sed -e 's|.*:||' -e 's|,| |g' )
for I in ${GROUP_USERS}
do
[ "${I}" = "root" ] && continue
XORG_PID=$( pgrep Xorg )
[ "${XORG_PID}" = "" ] && continue
DISPLAY_ID=$( procstat pargs ${XORG_PID} | grep "^argv\[1\]:" | awk '{print $NF}' )
[ -z "${DISPLAY_ID}" ] && continue
__log "${DEV}: starting '${FM}' file manager"
su -l "${I}" -c "env DISPLAY=${DISPLAY_ID} ${FM} ${MNT} &" 1> /dev/null 2>&1
done
fi
;; ;;
(detach) (da*|mmcsd*)
__log "${DEV}: detach" case ${2} in
if [ -f ${STATE} ]
then
grep -E "^/dev/${1} " ${STATE} \
| while read DEV PROVIDER MNT
do
TARGET=$( mount | grep -v \.gvfs | grep -m 1 -E "^${PROVIDER} " | awk '{print $3}' )
__state_remove ${MNT}
if [ -z ${TARGET} ]
then
continue
fi
( # put entire umount/find/rm block into background
# umount(8) two times to make sure its unmounted
umount -f "${TARGET}" 1> /dev/null 2>&1
umount -f "${TARGET}" 1> /dev/null 2>&1
__log "${DEV}: (state) umount '${TARGET}'"
__remove_dir "${TARGET}" &
__log "${DEV}: (state) mount point '${TARGET}' removed"
) &
unset TARGET
done
# code for NICENAMES mounting instead of the /dev/${DEV} default (attach)
if [ "${NICENAMES}" != YES ] # __random_wait
then __log "${DEV}: attach"
# umount(8) two times to make sure its unmounted if [ "${BLACKLIST}" != "" ]
umount -f "${MNT_PREFIX}/${1}" 1> /dev/null 2>&1 then
umount -f "${MNT_PREFIX}/${1}" 1> /dev/null 2>&1 __log "${DEV}: using BLACKLIST='${BLACKLIST}'"
__log "${DEV}: (direct) umount '${MNT_PREFIX}/${1}'" for I in ${BLACKLIST}
__remove_dir "${MNT_PREFIX}/${1}" & do
__log "${DEV}: (direct) mount point '${MNT_PREFIX}/${1}' removed" if [ ${1} = "${I}" ]
fi then
__show_message "Device '${DEV}' unmounted from '${MNT}' directory." __log "${DEV}: device blocked by BLACKLIST option"
fi exit 0
fi
done
fi
ADD=0
MNT="${MNTPREFIX}/${1}"
__check_already_mounted -d ${DEV}
__check_already_mounted -m ${MNT}
if [ "${ATIME}" = NO ]
then
OPTS="-o noatime"
fi
__wait_for_device ${DEV}
__fstype ${DEV}
case ${TYPE} in
(UFS)
__create_mount_point ${DEV}
__wait_for_device ${DEV}
fsck_ufs -C -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck_ufs ${LINE}"
done
__wait_for_device ${DEV}
if mount -t ufs ${OPTS} ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (ufs) 'mount -t ufs ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (ufs) 'mount -t ufs ${OPTS} ${DEV} ${MNT}'"
;;
(FAT) # must be before NTFS section because: newfs_msdos -O NTFS -L NTFS
__create_mount_point ${DEV}
__wait_for_device ${DEV}
fsck_msdosfs -C -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck_msdosfs ${LINE}"
done
__wait_for_device ${DEV}
if [ "${USER}" != 0 ]
then
USEROPTS="-u ${UID} -g ${GID}"
else
USEROPTS=""
fi
FATCMD="mount_msdosfs ${OPTS} -o longnames -m 644 -M 755 -D ${CODEPAGE} -L ${ENCODING} ${USEROPTS} ${DEV} ${MNT}"
if ${FATCMD}
then
ADD=1
else
FATOUT=16
FATCUR=0
while sleep 1
do
FATCUR=$(( ${FATCUR} + 1 ))
if [ ${FATCUR} -gt ${FATOUT} ]
then
__log "${DEV}: mount failed (fat) '${FATCMD}'"
break
fi
${FATCMD}
if [ ${?} -eq 0 ]
then
ADD=1
break
else
continue
fi
done
exit 1
fi
if [ ${ADD} -eq 1 ]
then
__log "${DEV}: mount (fat) '${FATCMD}'"
else
__log "${DEV}: mount failed (fat) '${FATCMD}'"
fi
;;
(NTFS) # must be after FAT section: newfs_msdos -O NTFS -L NTFS
__create_mount_point ${DEV}
__wait_for_device ${DEV}
if which ntfs-3g 1> /dev/null 2> /dev/null # sysutils/fusefs-ntfs
then
__wait_for_device ${DEV}
if ntfs-3g -o recover -o remove_hiberfile ${OPTS} ${DEV} ${MNT}
then
ADD=1
else
# make nested mount try because sometimes second mount works
if ntfs-3g -o recover -o remove_hiberfile ${OPTS} ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (ntfs) 'ntfs-3g ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
fi
else
if ! [ "${USER}" = 0 ]
then
OPTS="${OPTS} -u ${USER} -g $( id -g -n ${USER} )"
fi
if mount_ntfs ${OPTS} ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (ntfs) 'mount_ntfs ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
fi
__log "${DEV}: mount (ntfs) 'mount_ntfs ${OPTS} ${DEV} ${MNT}'"
;;
(EXT2)
__create_mount_point ${DEV}
__wait_for_device ${DEV}
e2fsck -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck.ext2 ${LINE}"
done
__wait_for_device ${DEV}
if mount -t ext2fs ${OPTS} ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (ext2) 'mount -t ext2fs ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (ext2) 'mount -t ext2fs ${OPTS} ${DEV} ${MNT}'"
;;
(EXT3)
__create_mount_point ${DEV}
__wait_for_device ${DEV}
e2fsck -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck.ext3 ${LINE}"
done
__wait_for_device ${DEV}
if mount -t ext2fs ${OPTS} ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (ext3) 'mount -t ext2fs ${OPTS} ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (ext3) 'mount -t ext2fs ${OPTS} ${DEV} ${MNT}'"
;;
(EXT4)
__create_mount_point ${DEV}
__wait_for_device ${DEV}
e2fsck -y ${DEV} \
| while read LINE
do
__log "${DEV}: fsck.ext4 ${LINE}"
done
__wait_for_device ${DEV}
if ext4fuse ${DEV} ${MNT} # sysutils/fusefs-ext4fuse
then
ADD=1
else
__log "${DEV}: mount failed (ext4) 'ext4fuse ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (ext4) 'ext4fuse ${DEV} ${MNT}'"
;;
(EXFAT)
__create_mount_point ${DEV}
__wait_for_device ${DEV}
if [ "${USER}" != 0 ]
then
USEROPTS="-o uid=${UID} -o gid=${GID}"
else
USEROPTS=""
fi
# sysutils/fusefs-exfat
if mount.exfat ${OPTS} ${USEROPTS} -o dmask=022 -o fmask=133 \
-o noatime ${DEV} ${MNT}
then
ADD=1
else
__log "${DEV}: mount failed (exfat) 'mount.exfat ${OPTS} ${USEROPTS} -o dmask=022 -o fmask=133 -o noatime ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (exfat) 'mount.exfat ${OPTS} ${USEROPTS} -o dmask=022 -o fmask=133 -o noatime ${DEV} ${MNT}'"
;;
(XFS)
__create_mount_point ${DEV}
__wait_for_device ${DEV}
xfs_repair -d ${DEV} \
| while read LINE
do
__log "${DEV}: xfs_repair ${LINE}"
done
__wait_for_device ${DEV}
if lklfuse -o type=xfs -o allow_other -o uid=${UID} -o gid=${GID} ${DEV} ${MNT} # sysutils/fusefs-lkl
then
ADD=1
else
__log "${DEV}: mount failed (xfs) 'lklfuse -o type=xfs -o allow_other -o uid=${UID} -o gid=${GID} ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (xfs) 'lklfuse -o type=xfs -o allow_other -o uid=${UID} -o gid=${GID} ${DEV} ${MNT}'"
;;
(HFS)
__create_mount_point ${DEV}
__wait_for_device ${DEV}
if hfsfuse --force -o noatime ${DEV} ${MNT} # sysutils/fusefs-hfsfuse
then
ADD=1
else
__log "${DEV}: mount failed (hfs) 'hfsfuse --force -o noatime ${DEV} ${MNT}'"
exit 1
fi
__log "${DEV}: mount (hfs) 'hfsfuse --force -o noatime ${DEV} ${MNT}'"
;;
(*)
__log "${DEV}: filesystem not supported or no filesystem"
exit 0
;;
esac
if [ ${ADD} -eq 1 ]
then
ADD=0
PROVIDER=$( mount | grep -m 1 " ${MNT} " | awk '{printf $1}' )
__state_add ${DEV} ${PROVIDER} ${MNT}
if [ "${USER}" != 0 -a "${FM}" != 0 ]
then
su - ${USER} -c "env DISPLAY=:0 ${FM} ${MNT} &"
fi
fi
;;
(detach)
__log "${DEV}: detach"
if [ -f ${STATE} ]
then
grep -E "${MNTPREFIX}/${1}$" ${STATE} \
| while read DEV PROVIDER MNT
do
TARGET=$( mount | grep -v \.gvfs | grep -m 1 -E "^${PROVIDER} " | awk '{print $3}' )
__state_remove ${MNT}
if [ -z ${TARGET} ]
then
continue
fi
( # put entire umount/find/rm block into background
umount -f ${TARGET}
__remove_dir "${TARGET}"
__log "${DEV}: removed '${TARGET}'"
) &
unset TARGET
__log "${DEV}: umount"
done
__remove_dir "${MNTPREFIX}/${1}"
__log "${DEV}: mount point '${MNTPREFIX}/${1}' removed"
fi
;;
esac
;; ;;
esac esac

BIN
automount-1.3.1.tar.gz Normal file

Binary file not shown.

BIN
automount-1.4.1.tar.gz Normal file

Binary file not shown.

BIN
automount-1.4.2.tar.gz Normal file

Binary file not shown.

BIN
automount-1.4.3.tar.gz Normal file

Binary file not shown.

BIN
automount-1.5.1.tar.gz Normal file

Binary file not shown.

BIN
automount-1.5.2.tar.gz Normal file

Binary file not shown.

BIN
automount-1.5.3.tar.gz Normal file

Binary file not shown.

BIN
automount-1.5.4.tar.gz Normal file

Binary file not shown.

BIN
automount-1.5.5.tar.gz Normal file

Binary file not shown.

BIN
automount-1.5.7.tar.gz Normal file

Binary file not shown.

BIN
automount-1.5.8.tar.gz Normal file

Binary file not shown.

BIN
automount-1.5.9.tar.gz Normal file

Binary file not shown.

Binary file not shown.

View File

@ -1,3 +1,7 @@
USERUMOUNT=YES USERUMOUNT=YES
ATIME=NO
REMOVEDIRS=YES
FM="caja --browser --no-desktop"
USER=vermaden
ENCODING=pl_PL.ISO8859-2
CODEPAGE=cp852

View File

@ -1,45 +1,14 @@
# PENDRIVE/PHONE/SDCARD insert
notify 100 { notify 100 {
match "system" "DEVFS"; match "system" "DEVFS";
match "type" "CREATE"; match "type" "CREATE";
match "cdev" "(da|mmcsd|ugen)[0-9]+.*"; match "cdev" "(ugen|da|mmcsd)[0-9]+.*";
action "/usr/local/sbin/automount $cdev attach &"; action "/usr/local/sbin/automount $cdev attach";
}; };
# PENDRIVE/PHONE/SDCARD remove
notify 100 { notify 100 {
match "system" "DEVFS"; match "system" "DEVFS";
match "type" "DESTROY"; match "type" "DESTROY";
match "cdev" "(da|mmcsd|ugen)[0-9]+.*"; match "cdev" "(ugen|da|mmcsd)[0-9]+.*";
action "/usr/local/sbin/automount $cdev detach &"; action "/usr/local/sbin/automount $cdev detach";
};
# CD-ROM media inject
notify 100 {
match "system" "DEVFS";
match "type" "CREATE|MEDIACHANGE";
match "cdev" "(cd)[0-9]+.*";
action "/usr/local/sbin/automount $cdev attach &";
};
# CD-ROM media eject
notify 100 {
match "system" "DEVFS";
match "type" "DESTROY";
match "cdev" "(cd)[0-9]+.*";
action "/usr/local/sbin/automount $cdev detach &";
};
# CD-ROM no media
notify 100 {
match "system" "CAM";
match "subsystem" "periph";
match "type" "error";
match "cam_status" "0xcc";
match "scsi_status" "2";
match "scsi_sense" "70 02 3a 02";
match "device" "(cd)[0-9]+.*";
action "/usr/local/sbin/automount $device detach &";
}; };

View File

@ -1,16 +0,0 @@
# SUPPORT md(4) IMAGES/DISKS attach
notify 100 {
match "system" "DEVFS";
match "type" "CREATE";
match "cdev" "(md)[0-9]+.*";
action "/usr/local/sbin/automount $cdev attach &";
};
# SUPPORT md(4) IMAGES/DISKS detach
notify 100 {
match "system" "DEVFS";
match "type" "DESTROY";
match "cdev" "(md)[0-9]+.*";
action "/usr/local/sbin/automount $cdev detach &";
};

View File

@ -1,18 +0,0 @@
# LOCAL DISKS attach
notify 100 {
match "system" "DEVFS";
match "type" "CREATE";
match "cdev" "(ada)[0-9]+.*";
action "/usr/local/sbin/automount $cdev attach &";
};
# LOCAL DISKS remove
notify 100 {
match "system" "DEVFS";
match "type" "DESTROY";
match "cdev" "(ada)[0-9]+.*";
action "/usr/local/sbin/automount $cdev detach &";
};