Compare commits
49 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
cfd6d1a17c | |
|
|
3f9b41940e | |
|
|
6cecb3de81 | |
|
|
539a0ac32b | |
|
|
ce51525a2f | |
|
|
6886a7d75a | |
|
|
a7fbeeb2c7 | |
|
|
bbaba0538e | |
|
|
da4bec4327 | |
|
|
453b42bc88 | |
|
|
ae6cd2ef44 | |
|
|
1dff7fd13f | |
|
|
048d1e57bf | |
|
|
4277af47de | |
|
|
2dc511276d | |
|
|
466712252a | |
|
|
1b69cda21f | |
|
|
3dacc13068 | |
|
|
30fc238feb | |
|
|
c51f0be657 | |
|
|
e6e701bb49 | |
|
|
a164c8f444 | |
|
|
2a1f2a2972 | |
|
|
777603a18e | |
|
|
f501189202 | |
|
|
3a1b772274 | |
|
|
9017446d44 | |
|
|
c08900fb22 | |
|
|
bf899bcbd5 | |
|
|
752a1b6594 | |
|
|
acf0784447 | |
|
|
fef1358c2a | |
|
|
c5077f57c3 | |
|
|
225e3f8bec | |
|
|
33d7d28bf0 | |
|
|
3121643225 | |
|
|
72eeeff0f1 | |
|
|
6ad9b18041 | |
|
|
8ced675ae6 | |
|
|
2fca632b1c | |
|
|
ada4b0cec1 | |
|
|
cf10b9627d | |
|
|
ee8ef522e7 | |
|
|
1f8a1cb18e | |
|
|
d24e6d44dc | |
|
|
0d7c2eb916 | |
|
|
c4bed9c2d1 | |
|
|
53a1f9764b | |
|
|
e10933181b |
276
README
276
README
|
|
@ -1,48 +1,178 @@
|
||||||
|
|
||||||
|
___ /\ ___
|
||||||
|
__/ /_ / \ _\ \__
|
||||||
|
____ _____/_ __/__ / _/\ ___ ___ ____ ______ __\__ _\
|
||||||
|
/ \ / / // // \ /\_/ \ / / \ / \\ \ \ / \\ \
|
||||||
|
/ / // / // // / // \\ \ \ \\ \ \\ \ \\ \ \\ \_
|
||||||
|
\_____\\____/ \__\\____//__________\\__\__\__\\____/ \_____\\__\__\\___\
|
||||||
|
|
||||||
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
|
NTFS/MSDOS/exFAT/EXT2/EXT3/EXT4/UFS/XFS/HFS/MTP/ISO9660
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
I N S T A L L
|
I N S T A L L
|
||||||
===================
|
===================
|
||||||
|
|
||||||
# cp automount /usr/local/sbin/automount
|
Use provided FreeBSD Ports/packages from here:
|
||||||
|
* 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 ;)
|
||||||
|
|
||||||
... or just install these FreeBSD Ports/Packages:
|
These ports/packages are needed for all filesystems:
|
||||||
|
|
||||||
* sysutils/automount
|
* sysutils/e2fsprogs // EXT2/EXT3/EXT4 fsck(8)
|
||||||
* sysutils/exfat-utils
|
* sysutils/xfsprogs // XFS fsck(8)
|
||||||
* sysutils/fusefs-exfat
|
* sysutils/exfat-utils // exFAT exfatfsck(8)
|
||||||
* sysutils/fusefs-ntfs
|
* sysutils/fusefs-exfat // exFAT
|
||||||
* sysutils/fusefs-ext4fuse
|
* sysutils/fusefs-ntfs // NTFS (read write support)
|
||||||
* sysutils/fusefs-simple-mtpfs
|
* sysutils/fusefs-hfsfuse // HFS
|
||||||
* sysutils/fusefs-hfsfuse
|
* sysutils/fusefs-lkl // XFS/EXT2/EXT3/EXT4
|
||||||
* sysutils/fusefs-lkl
|
* sysutils/fusefs-simple-mtpfs // MTP
|
||||||
|
|
||||||
Regards,
|
All of the above are available as pkg(8) packages.
|
||||||
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.5.9 (CURRENT)
|
VERSION 1.7.8
|
||||||
|
|
||||||
Decreese DELAY for sleep from '1' to '0.1' for faster monting.
|
Fix harmless gpart(8) rant about ugen(4) devices.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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).
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -178,18 +308,19 @@ 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
|
UFS/FAT/exFAT/NTFS/EXT2/EXT3/EXT4/MTP/HFS/ISO9660
|
||||||
|
|
||||||
It needs these ports to mount NTFS/exFAT/EXT4 respectively:
|
Add these to mount NTFS/exFAT/EXT4/HFS/XFS/MTP 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
|
||||||
|
|
@ -197,26 +328,86 @@ 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.
|
||||||
|
|
||||||
MNTPREFIX (set to /media by default)
|
MNT_PREFIX (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: MNTPREFIX="/media"
|
example: MNT_PREFIX='/media'
|
||||||
|
|
||||||
ENCODING (set to en_US.ISO8859-1 by default)
|
MNT_GROUP (wheel 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: ENCODING="pl_PL.ISO8859-2"
|
example: FAT_ENCODING='en_US.ISO8859-1'
|
||||||
|
|
||||||
CODEPAGE (set to cp437 by default)
|
FAT_CODEPAGE (set to CP866 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: CODEPAGE="cp852"
|
example: FAT_CODEPAGE='cp437'
|
||||||
|
|
||||||
USER (unset by default)
|
ISO9660_CODEPAGE (set to UTF-8 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
|
||||||
|
|
@ -225,32 +416,6 @@ USER (unset 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
|
||||||
|
|
@ -324,6 +489,11 @@ 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#! /bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# Copyright (c) 2012-2015 Slawomir Wojciech Wojtczak (vermaden)
|
# Copyright (c) 2012-2024 Slawomir Wojciech Wojtczak <vermaden@interia.pl>
|
||||||
|
# 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
|
||||||
|
|
@ -25,19 +26,18 @@
|
||||||
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
|
UFS/FAT/exFAT/NTFS/EXT2/EXT3/EXT4/MTP/HFS/ISO9660
|
||||||
|
|
||||||
Add these to mount NTFS/exFAT/EXT4/MTP/HFS/XFS respectively:
|
Add these to mount NTFS/exFAT/EXT4/HFS/XFS/MTP 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,26 +45,95 @@ 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.
|
||||||
|
|
||||||
MNTPREFIX (set to /media by default)
|
MNT_PREFIX (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: MNTPREFIX="/media"
|
example: MNT_PREFIX='/media'
|
||||||
|
|
||||||
ENCODING (set to en_US.ISO8859-1 by default)
|
MNT_GROUP (wheel 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: ENCODING="pl_PL.ISO8859-2"
|
example: FAT_ENCODING='en_US.ISO8859-1'
|
||||||
|
|
||||||
CODEPAGE (set to cp437 by default)
|
FAT_CODEPAGE (set to CP866 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: CODEPAGE="cp852"
|
example: FAT_CODEPAGE='cp437'
|
||||||
|
|
||||||
USER (unset by default)
|
ISO9660_CODEPAGE (set to UTF-8 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
|
||||||
|
|
@ -73,125 +142,159 @@ USER (unset by default)
|
||||||
|
|
||||||
example: USER="vermaden"
|
example: USER="vermaden"
|
||||||
|
|
||||||
FM (unset by default)
|
REMOVEDIRS (set to YES by default)
|
||||||
If set to file manager command, the mount will
|
If set to YES the automount(8) will remove /media dir after unmount.
|
||||||
launch the specified command after successful
|
|
||||||
mount. Works only if USER parameter is also set.
|
|
||||||
|
|
||||||
example: FM="nautilus --browser --no-desktop"
|
example: REMOVEDIRS=NO
|
||||||
|
|
||||||
USERUMOUNT (set to NO by default)
|
NICENAMES (set to NO by default)
|
||||||
When set to YES it will 'chmod +s /sbin/umount'
|
If set to YES the device/filesystem label will be used for /media dir name.
|
||||||
which would allow an USER to unmount the file
|
|
||||||
system with their selected file manager.
|
|
||||||
|
|
||||||
example: USERUMOUNT="YES"
|
example: NICENAMES=YES
|
||||||
|
|
||||||
ATIME (set to YES by default)
|
IGNORE_SYS_PARTS (set to NO by default)
|
||||||
When set to NO it will mount filesystems with
|
If set to YES automount(8) will ignore system partitions like EFI or MSR.
|
||||||
noatime options when possible.
|
|
||||||
|
|
||||||
example: ATIME="NO"
|
example: IGNORE_SYS_PARTS=YES
|
||||||
|
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ "${1}" = "--version" -o "${1}" = "-version" -o "${1}" = "version" ]
|
# display version if needed
|
||||||
|
if [ "${1}" = '--version' -o \
|
||||||
|
"${1}" = '-version' -o \
|
||||||
|
"${1}" = 'version' -o \
|
||||||
|
"${1}" = '-v' ]
|
||||||
then
|
then
|
||||||
echo "automount 1.5.9 2018/12/08"
|
echo
|
||||||
|
echo " ___ /\ ___ "
|
||||||
|
echo " __/ /_ / \ _\ \__ "
|
||||||
|
echo " ____ _____/_ __/__ / _/\ ___ ___ ____ ______ __\__ _\ "
|
||||||
|
echo " / \ / / // // \ /\_/ \ / / \ / \\\ \ \ / \\\ \ "
|
||||||
|
echo " / / // / // // / // \\\ \ \ \\\ \ \\\ \ \\\ \ \\\ \_ "
|
||||||
|
echo " \_____\\\____/ \__\\\____//__________\\\__\__\__\\\____/ \_____\\\__\__\\\___\ "
|
||||||
|
echo
|
||||||
|
echo "automount 1.8.0 2024/03/05"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${1}" = "-h" -o "${1}" = "--help" -o ${#} -eq 0 -o ${#} -eq 1 ]
|
# display help if needed
|
||||||
|
if [ "${1}" = "-h" -o \
|
||||||
|
"${1}" = "--h" -o \
|
||||||
|
"${1}" = "-help" -o \
|
||||||
|
"${1}" = "--help" -o \
|
||||||
|
"${#}" -eq "0" -o \
|
||||||
|
"${#}" -eq "1" ]
|
||||||
then
|
then
|
||||||
__usage
|
__usage
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f /usr/local/etc/automount.conf ]
|
# read configuration file
|
||||||
then
|
if [ -f /usr/local/etc/automount.conf ] ; then
|
||||||
. /usr/local/etc/automount.conf
|
. /usr/local/etc/automount.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
: ${MNTPREFIX="/media"} # mount prefix
|
# default values for global variables
|
||||||
: ${LOG="/var/log/automount.log"} # log file
|
: ${MNT_PREFIX='/media'} # mount prefix
|
||||||
: ${STATE="/var/run/automount.state"} # current state file
|
: ${MNT_GROUP='wheel'} # use WHEEL group for popup
|
||||||
: ${ENCODING="en_US.ISO8859-1"} # US/Canada
|
: ${MNT_MODE='775'} # mount point mode
|
||||||
: ${CODEPAGE="cp437"} # US/Canada
|
: ${FAT_ENCODING='en_US.UTF-8'} # US/Canada
|
||||||
: ${DATEFMT="%Y-%m-%d %H:%M:%S"} # 2012-02-20 07:49:09
|
: ${FAT_CODEPAGE='cp437'} # US/Canada
|
||||||
: ${USERUMOUNT="NO"} # when YES add suid bit to umount(8)
|
: ${ISO9660_CODEPAGE='UTF-8'} # UTF-8
|
||||||
: ${ATIME="YES"} # when NO mount with noatime
|
: ${ATIME='NO'} # when NO mount with noatime
|
||||||
: ${REMOVEDIRS="NO"} # remove empty dirs under ${MNTPREFIX}
|
: ${RETRY_COUNT='5'} # retry count
|
||||||
: ${USER="0"} # which user to use for popup
|
: ${RETRY_DELAY='2'} # retry delay time
|
||||||
: ${FM="0"} # which file manager to use
|
: ${USERUMOUNT='NO'} # when YES add suid bit to umount(8)
|
||||||
: ${TIMEOUT="8"} # stop waiting for device after that time
|
: ${NOTIFY='NO'} # use notify-send(1) (devel/libnotify)
|
||||||
: ${DELAY="0.1"} # check for the device node that often
|
: ${WALL='NO'} # use wall(1)
|
||||||
: ${BOOTDELAY="45"} # wait for boot process to complete
|
: ${FM='exo-open --launch FileManager'} # which file manager to use
|
||||||
: ${NOTIFY="NO"} # use 'notify-send' and 'libnotify'
|
: ${LOG_FILE='/var/log/automount.log'} # log file
|
||||||
: ${WALL="NO"} # use 'wall(1)'
|
: ${LOG_DATEFMT='%Y-%m-%d %H:%M:%S'} # 2012-02-20 07:49:09
|
||||||
|
: ${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
|
||||||
|
|
||||||
if [ "${USERUMOUNT}" = YES ]
|
# init of main variables
|
||||||
|
DEV="/dev/${1}"
|
||||||
|
UID=$( id -u ${USER} )
|
||||||
|
GID=$( pw group show -n ${MNT_GROUP} | awk -F':' '{print $3}' )
|
||||||
|
if [ ${?} -ne 0 ]
|
||||||
then
|
then
|
||||||
chmod u+s /sbin/umount 1> /dev/null 2> /dev/null # WHEEL group member
|
__log "${MNT_GROUP}: invalid group"
|
||||||
chmod u+s /sbin/mount* 1> /dev/null 2> /dev/null # WHEEL group member
|
exit 1
|
||||||
sysctl vfs.usermount=1 1> /dev/null 2> /dev/null # allow USER to mount
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
__create_mount_point() { # 1=DEV
|
# process ${USERUMOUNT} option
|
||||||
local DEVICE=${1##*/}
|
case ${USERUMOUNT} in
|
||||||
mkdir -p ${MNTPREFIX}/${DEVICE}
|
([Yy][Ee][Ss])
|
||||||
if [ "${USER}" != 0 ]
|
chmod u+s /sbin/umount 1> /dev/null 2>&1 # WHEEL group member
|
||||||
then
|
chmod u+s /sbin/mount* 1> /dev/null 2>&1 # WHEEL group member
|
||||||
chown ${USER}:$( id -g -n ${USER} ) ${MNTPREFIX}/${DEVICE}
|
sysctl -q vfs.usermount=1 1> /dev/null 2>&1 # allow user to mount
|
||||||
UID=$( id -u ${USER} )
|
;;
|
||||||
GID=$( id -g ${USER} )
|
esac
|
||||||
else
|
|
||||||
UID=0
|
# read only filesystem types for __guess_fs_type() function
|
||||||
GID=0
|
readonly FS_TYPE_UNKNOWN=0
|
||||||
fi
|
readonly FS_TYPE_ISO9660=1
|
||||||
|
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
|
||||||
|
|
@ -204,7 +307,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
|
||||||
env DISPLAY=:0 notify-send automount "Device '${1}' mounted on '${3}' directory."
|
__show_message "Device '${1}' mounted on '${3}' directory."
|
||||||
fi
|
fi
|
||||||
if [ "${WALL}" = YES ]
|
if [ "${WALL}" = YES ]
|
||||||
then
|
then
|
||||||
|
|
@ -212,14 +315,16 @@ __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
|
||||||
BSMNT=$( echo ${1} | sed 's/\//\\\//g' ) # backslash the slashes ;)
|
# 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
|
||||||
env DISPLAY=:0 notify-send automount "Device '${1}' unmounted from '${3}' directory."
|
__show_message "Device '${1}' unmounted from '${3}' directory."
|
||||||
fi
|
fi
|
||||||
if [ "${WALL}" = YES ]
|
if [ "${WALL}" = YES ]
|
||||||
then
|
then
|
||||||
|
|
@ -228,531 +333,447 @@ __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
|
||||||
find "${1}" -type d -empty -maxdepth 1 -exec rm -r {} '+' 2> /dev/null
|
if [ -d "${1}" ]
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
__log() { # @=MESSAGE
|
# FUNCTION: display wall(1) and/or notify-send(1) message
|
||||||
echo $( date +"${DATEFMT}" ) "${@}" >> ${LOG}
|
__show_message() { # 1=MESSAGE
|
||||||
}
|
case ${WALL} in
|
||||||
|
([Yy][Ee][Ss])
|
||||||
__check_already_mounted() { # 1=(-d|-m) 2=(DEV|MNT)
|
echo "automount: ${1}" | wall
|
||||||
local MOUNT="$( mount )"
|
|
||||||
case ${1} in
|
|
||||||
(-d)
|
|
||||||
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)
|
esac
|
||||||
if echo "${MOUNT}" | grep -q " on ${2} "
|
case ${NOTIFY} in
|
||||||
then
|
([Yy][Ee][Ss])
|
||||||
local DEVICE="$( echo "${MOUNT}" | grep " on ${2} " | awk '{print $1}' )"
|
local __DISPLAY_IDS=$( ps aew | sed -n 's|.*DISPLAY=\([-_a-zA-Z0-9:.]*\).*|\1|p' | sort -u | tr '\n' ' ' )
|
||||||
__log "${DEVICE}: already mounted on '${2}' mount point"
|
for __DISPLAY_ID in ${__DISPLAY_IDS}
|
||||||
exit 0
|
do
|
||||||
fi
|
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
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# FUNCTION: check if device or mountpoint not already mounted
|
||||||
|
__check_already_mounted() { # 1=DEV 2=MNT
|
||||||
|
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
|
__wait_for_device() { # 1=DEV
|
||||||
|
# do not wait for MTP and CD-ROM devices
|
||||||
|
case ${1} in
|
||||||
|
(*ugen*|iso9660*)
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# try to read from device to ensure that it alive
|
||||||
local COUNT=0
|
local COUNT=0
|
||||||
while ! head -c 1 ${1} 1> /dev/null 2> /dev/null
|
while ! dd if="${1}" of=/dev/null conv=sync count=1 bs=8k 1> /dev/null 2>&1
|
||||||
do
|
do
|
||||||
sleep ${DELAY}
|
if [ ! -e "${1}" ]
|
||||||
local COUNT=$( echo ${COUNT} + ${DELAY} | bc -l )
|
|
||||||
if ! echo ${COUNT} | grep -q -E '^[0-9]'
|
|
||||||
then
|
then
|
||||||
local COUNT=0${COUNT}
|
__log "${1}: device gone"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
local COUNT_INT=$( echo ${COUNT} | cut -d '.' -f 1 )
|
COUNT=$(( ${COUNT} + 1 ))
|
||||||
if [ ${COUNT_INT} -gt ${TIMEOUT} ]
|
if [ ${COUNT} -ge ${RETRY_COUNT} ]
|
||||||
then
|
then
|
||||||
__log "${DEV}: device node not available"
|
return
|
||||||
exit 0
|
|
||||||
fi
|
fi
|
||||||
|
sleep "${RETRY_DELAY}"
|
||||||
|
__log "${1}: wait for device retry ${COUNT}/${RETRY_COUNT}"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
__wait_for_boot() {
|
# FUNCTION: check if device is a block device
|
||||||
local BOOTTIME=$( sysctl -n kern.boottime | awk -F',' '{print $1}' | awk '{print $NF }' )
|
__check_block_device() { # 1=DEV
|
||||||
local CURRTIME=$( date +%s )
|
# first check if its block device
|
||||||
local UPTIME=$(( ${CURRTIME} - ${BOOTTIME} ))
|
if ! fstyp ${1} 1> /dev/null 2>&1
|
||||||
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}: done waiting '${BOOTDELAY}' seconds for boot process to complete"
|
__log "${DEV}: not a block device"
|
||||||
|
exit 0
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# __random_wait() {
|
# main ATTACH/DETACH block
|
||||||
# RANDOM=$( head -c 256 /dev/urandom | env LC_ALL=C tr -c -d '1-9' )
|
case ${2} in
|
||||||
# MODULO=$(( ${RANDOM} % 24 ))
|
(attach)
|
||||||
# WAIT=$( echo ${MODULO} / 10 | bc -l )
|
# check if device still exists
|
||||||
# WAIT_TEST=$( echo ${WAIT} | awk -F'.' '{print $1}' )
|
if [ ! -e "${DEV}" ]
|
||||||
# if [ "${WAIT_TEST}" = "" ]
|
then
|
||||||
# then
|
__log "${DEV}: device does not exist"
|
||||||
# WAIT="0${WAIT}"
|
exit 1
|
||||||
# fi
|
fi
|
||||||
# WAIT=$( printf "%.1f" ${WAIT} )
|
__log "${DEV}: attach"
|
||||||
# sleep ${WAIT}
|
|
||||||
# __log "${DEV}: random wait for '${WAIT}' seconds before 'attach' action"
|
|
||||||
# }
|
|
||||||
|
|
||||||
__fstype() { # 1=DEV
|
# ignore system partitions like EFI or MSR
|
||||||
TYPE=$( dd < ${DEV} count=1 2> /dev/null | strings | head -1 )
|
if [ "${IGNORE_SYS_PARTS}" = 'YES' ]
|
||||||
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
|
||||||
TYPE=UFS
|
SYS_DEV=$( echo ${1} | grep -E -o '^[a-z]+[0-9]+' )
|
||||||
return
|
SYS_GPART=$( gpart show -p -r ${SYS_DEV} 2> /dev/null | sed 's@=>@@g' | grep " ${1} " | awk '{print $4}' )
|
||||||
|
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'
|
|
||||||
then
|
|
||||||
TYPE=NTFS
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
if echo "${TYPE}" | grep -q 'MSDOS'
|
|
||||||
then
|
|
||||||
TYPE=FAT
|
|
||||||
return
|
|
||||||
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}
|
# code for NICENAMES mounting instead of the /dev/${DEV} default
|
||||||
__wait_for_boot
|
MNT_CANDIDATE=$( fstyp -l "/dev/${1}" 2> /dev/null | cut -d " " -f 2-99 | tr ' ' '-' )
|
||||||
case ${1} in
|
if [ "${NICENAMES}" = "YES" -a -n "${MNT_CANDIDATE}" ]
|
||||||
|
then
|
||||||
(ugen*)
|
# check if dir exists
|
||||||
case ${2} in
|
if [ -e "${MNT_PREFIX}/${MNT_CANDIDATE}" ]
|
||||||
|
then
|
||||||
(attach)
|
# check if something is already mounted there and increment if it is
|
||||||
# __random_wait
|
if mount | grep -q " ${MNT_PREFIX}/${MNT_CANDIDATE} "
|
||||||
__log "${DEV}: attach"
|
then
|
||||||
if [ "${BLACKLIST}" != "" ]
|
COUNT=1
|
||||||
then
|
while true
|
||||||
__log "${DEV}: using BLACKLIST='${BLACKLIST}'"
|
|
||||||
for I in ${BLACKLIST}
|
|
||||||
do
|
do
|
||||||
if [ ${1} = "${I}" ]
|
COUNT=$(( ${COUNT} + 1 ))
|
||||||
then
|
[ ! -e "${MNT_PREFIX}/${MNT_CANDIDATE}-${COUNT}" ] && break
|
||||||
__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
|
||||||
ADD=0
|
else
|
||||||
MNT="${MNTPREFIX}/${1}"
|
# dir does not exist
|
||||||
__check_already_mounted -d ${DEV}
|
MNT="${MNT_PREFIX}/${MNT_CANDIDATE}"
|
||||||
__check_already_mounted -m ${MNT}
|
fi
|
||||||
__wait_for_device ${DEV}
|
else
|
||||||
PHONEDEV=$( simple-mtpfs --list-devices -d ${DEV} 2>&1 )
|
# device/filesystem without label
|
||||||
|
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
|
||||||
__create_mount_point ${DEV}
|
PHONEDEV=$( echo "${PHONEDEV}" | awk '{print $1}' | tr -d ':' )
|
||||||
simple-mtpfs --device ${PHONEDEV} ${MNT} -o uid=${UID} -o gid=${GID} -o allow_other
|
if [ ! ${PHONEDEV} ]
|
||||||
if [ ${?} -ne 0 ]
|
|
||||||
then
|
then
|
||||||
su - ${USER} -c "env DISPLAY=:0 zenity --info --text 'Allow on the Phone.\n\nThen click OK.' --no-wrap"
|
__log "${DEV}: no MTP devices found"
|
||||||
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}"
|
||||||
;;
|
;;
|
||||||
|
(*)
|
||||||
(detach)
|
__log "${DEV}: filesystem not supported or no filesystem"
|
||||||
__log "${DEV}: detach"
|
exit 0
|
||||||
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
|
||||||
|
|
||||||
|
# create mount point
|
||||||
|
mkdir -m "${MNT_MODE}" -p "${MNT}"
|
||||||
|
__log "${DEV}: create '${MNT}' dir"
|
||||||
|
|
||||||
|
# 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
|
||||||
|
__log "${DEV}: mount OK: '${FS_MOUNT_CMD} ${FS_MOUNT_ARGS}'"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
# END | try to mount read only
|
||||||
|
|
||||||
|
__log "${DEV}: mount FAIL: '${FS_MOUNT_CMD} ${FS_MOUNT_ARGS}'"
|
||||||
|
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
|
||||||
;;
|
;;
|
||||||
|
|
||||||
(da*|mmcsd*)
|
(detach)
|
||||||
case ${2} in
|
__log "${DEV}: detach"
|
||||||
|
if [ -f ${STATE} ]
|
||||||
(attach)
|
then
|
||||||
# __random_wait
|
grep -E "^/dev/${1} " ${STATE} \
|
||||||
__log "${DEV}: attach"
|
| while read DEV PROVIDER MNT
|
||||||
if [ "${BLACKLIST}" != "" ]
|
|
||||||
then
|
|
||||||
__log "${DEV}: using BLACKLIST='${BLACKLIST}'"
|
|
||||||
for I in ${BLACKLIST}
|
|
||||||
do
|
do
|
||||||
if [ ${1} = "${I}" ]
|
TARGET=$( mount | grep -v \.gvfs | grep -m 1 -E "^${PROVIDER} " | awk '{print $3}' )
|
||||||
|
__state_remove ${MNT}
|
||||||
|
if [ -z ${TARGET} ]
|
||||||
then
|
then
|
||||||
__log "${DEV}: device blocked by BLACKLIST option"
|
continue
|
||||||
exit 0
|
|
||||||
fi
|
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
|
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)
|
# code for NICENAMES mounting instead of the /dev/${DEV} default
|
||||||
__create_mount_point ${DEV}
|
if [ "${NICENAMES}" != YES ]
|
||||||
__wait_for_device ${DEV}
|
then
|
||||||
fsck_ufs -C -y ${DEV} \
|
# umount(8) two times to make sure its unmounted
|
||||||
| while read LINE
|
umount -f "${MNT_PREFIX}/${1}" 1> /dev/null 2>&1
|
||||||
do
|
umount -f "${MNT_PREFIX}/${1}" 1> /dev/null 2>&1
|
||||||
__log "${DEV}: fsck_ufs ${LINE}"
|
__log "${DEV}: (direct) umount '${MNT_PREFIX}/${1}'"
|
||||||
done
|
__remove_dir "${MNT_PREFIX}/${1}" &
|
||||||
__wait_for_device ${DEV}
|
__log "${DEV}: (direct) mount point '${MNT_PREFIX}/${1}' removed"
|
||||||
if mount -t ufs ${OPTS} ${DEV} ${MNT}
|
fi
|
||||||
then
|
__show_message "Device '${DEV}' unmounted from '${MNT}' directory."
|
||||||
ADD=1
|
fi
|
||||||
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
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,7 +1,3 @@
|
||||||
USERUMOUNT=YES
|
USERUMOUNT=YES
|
||||||
ATIME=NO
|
|
||||||
REMOVEDIRS=YES
|
|
||||||
FM="caja --browser --no-desktop"
|
|
||||||
USER=vermaden
|
|
||||||
ENCODING=pl_PL.ISO8859-2
|
|
||||||
CODEPAGE=cp852
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,45 @@
|
||||||
|
|
||||||
|
# PENDRIVE/PHONE/SDCARD insert
|
||||||
notify 100 {
|
notify 100 {
|
||||||
match "system" "DEVFS";
|
match "system" "DEVFS";
|
||||||
match "type" "CREATE";
|
match "type" "CREATE";
|
||||||
match "cdev" "(ugen|da|mmcsd)[0-9]+.*";
|
match "cdev" "(da|mmcsd|ugen)[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" "(ugen|da|mmcsd)[0-9]+.*";
|
match "cdev" "(da|mmcsd|ugen)[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 &";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
# 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 &";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
|
||||||
|
# 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 &";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue