diff options
Diffstat (limited to 'abs/extra-testing/autofs/autofs')
-rw-r--r-- | abs/extra-testing/autofs/autofs | 364 |
1 files changed, 9 insertions, 355 deletions
diff --git a/abs/extra-testing/autofs/autofs b/abs/extra-testing/autofs/autofs index 83b0303..59ea4f5 100644 --- a/abs/extra-testing/autofs/autofs +++ b/abs/extra-testing/autofs/autofs @@ -6,384 +6,38 @@ # source application-specific settings [ -f /etc/conf.d/autofs ] && . /etc/conf.d/autofs -DAEMON=/usr/sbin/automount - if [ ! -z "$TIMEOUT" ]; then daemonoptions="--timeout=$TIMEOUT $daemonoptions" fi -# Extract the schemes from /etc/nsswitch.conf -# (function derived from RedHat) -function getschemes() -{ - grep ^automount: /etc/nsswitch.conf | sed -e 's/^.*://' -e 's/\[.*\]/ /g' -} - -# Process the schemes found in /etc/nsswitch.conf -# (function derived from RedHat, with some modifications) -function getrawmounts() -{ - for scheme in `getschemes` ; do - case "$scheme" in - files) - if [ -z "$filescheme" ] ; then - if getmounts_file /etc/autofs/auto.master; then - filescheme=1 # success - else - filescheme=0 # failure - fi - export filescheme - fi - ;; - nis) - if [ -z "$nisscheme" ] ; then - if getnismounts auto.master; then - nisscheme=1 # success - else - nisscheme=0 # failure - fi - export nisscheme - fi - ;; - ldap*) - if [ -z "$ldapscheme" ] ; then - if getldapmounts; then - ldapscheme=1 # success - else - ldapscheme=0 # failure - fi - export ldapscheme - fi - ;; - esac - done - - if [ -z "$filescheme" -a -z "$nisscheme" -a -z "$ldapscheme" ]; then - # nothing configured in /etc/nsswitch.conf, fall back to old behaviour - if ! getmounts_file /etc/autofs/auto.master; then - if ! getnismounts auto.master; then - if ! getldapmounts; then - echo "no autofs mounts configured!" 1>&2 - fi - fi - fi - else - if [ ! \( "$filescheme" == "1" -o "$nisscheme" == "1" -o "$ldapscheme" == "1" \) ]; then - # all schemes found in /etc/nsswitch.conf have failed - echo "no autofs mounts configured!" 1>&2 - fi - fi -} - -# This function will build a list of automount commands to execute in -# order to activate all the mount points. It is used to figure out -# the difference of automount points in case of a reload -function getmounts() -{ - getrawmounts -} - -function getmounts_file() -{ - # Check for local maps to be loaded - local map="$1" - shift - if [ -f "$map" ]; then - cat "$map" | sed -e '/^#/d' -e '/^$/d' | process_master_file - else - return 1 - fi -} - -function process_master_file() -{ - local line_options - local daemon_options - line_options="$@" # from `+auto.master <line_options>' in /etc/autofs/auto.master - - while read dir map first_option options; do - all_options="$first_option $options" - - case "$dir" in - +*) - # note: $map contains options instead of a map - getnismounts "${dir/+/}" "$line_options" "$map" "$all_options" - continue; - ;; - '/-') - # ignore (not supported) direct maps - continue; - ;; - esac - - if [ ! -z "$dir" -a ! -z "$map" -a x`echo "$map" | cut -c1` != 'x-' ]; then - type="" - # Break up the maptype and map, if the map type is specified - maptype=`echo $map | cut -f1 -d:` - if [ "$maptype" != "$map" ]; then - # map has form <maptype>:<map> - type=$maptype - map=`echo $map | cut -f2- -d:` - else - # special handling of maps - case "$map" in - hesiod|userhome) - type=$map - map="" - ;; - ldap) - # /<mountpoint> ldap <ldap data> <options> - type=ldap - - # extract LDAP data - map="$first_option" - all_options=$options - ;; - /*) - # map is absolute path - if [ -x $map ]; then - type=program - elif [ -f $map ]; then - type=file - else - # invalid absolute path, ignoring - type="" - fi - ;; - !*) - # map is executable file - type=program - map="${map/!/}" - ;; - *) - # map is relative path or empty - if [ ! -z "$map" ]; then - # map is relative path - if [ -x /etc/autofs/$map ]; then - type=program - map=/etc/autofs/$map - elif [ -f /etc/autofs/$map ]; then - type=file - map=/etc/autofs/$map - else - type=yp - fi - else - # map is empty, ignoring - type="" - fi - ;; - esac - fi - - if [ "$type" ]; then - options="$line_options $all_options" - - daemon_options=`munge_options daemon $daemonoptions $options` - options=`munge_options mount $options` - - echo "$DAEMON $daemon_options -- $dir $type $map $localoptions $options" | sed -e 's/ */ /g' - fi - fi - done -} - -function getnismounts() -{ - # Check for YellowPage maps to be loaded - local map="$1" - shift - if [ -e /usr/bin/ypcat ] && [ `ypcat -k "$map" 2>/dev/null | wc -l` -gt 0 ]; then - # exclude references to other nis maps (avoid self-references -> inf. loop) - # - e.g. a map may look like: - # $ ypcat -k auto.master - # +auto_master # <- = auto.master = erk! - # /net -hosts -nosuid,nobrowse - # /home auto_home -nobrowse - ypcat -k "$map" | grep -v '^+' | process_master_file "$@" - else - return 1 - fi -} - -function getldapmounts() { - if [ ! -x /usr/bin/ldapsearch -o -z "$LDAPURI" -o -z "$LDAPBASE" ]; then - return 1 - fi - - # TODO: Doesn't yet work for LDIF output where lines are continued on the - # next line (starting with space or tab). (See ldif(5)) - - ldapsearch -LLL -H $LDAPURI -b $LDAPBASE -x \ - '(objectClass=automount)' cn automountInformation 2>/dev/null \ - | while read attr val; do - case "$attr" in - dn:) - node="" - args="" - ;; - cn:) - node=$val - ;; - automountInformation:) - args=$val - ;; - *) - ;; - esac - if [ -n "$node" -a -n "$args" ]; then - echo "$node $args" | process_master_file "$@" - node="" - args="" - fi - done -} - -# List active mounts -function active() -{ - ps ax|grep "[0-9]:[0-9][0-9] $DAEMON " | - while read pid tt stat time command; do - echo $command - done -} - -# Status lister. -function status() -{ - echo "Configured Mount Points:" - echo "------------------------" - getmounts | sed 's/ -- / /' - echo "" - echo "Active Mount Points:" - echo "--------------------" - active -} - -function munge_options() -{ - local which="$1" - shift - - o="$@" - # bring `timeout' option in suitable format - o=`echo "$o" | sed -e 's/\(\(-\|, *\)t\(imeout\)\?\) \+/\1=/g'` - # remove dashes in front of options - o=`echo "$o" | sed -e 's/^-\+//' -e 's/ -\+/ /' -e 's/,-\+/,/g'` - - echo "$o" | awk -v which="$which" ' -BEGIN { - RS="[, \n]" - FS="=" - daemon_opts[ "timeout" ] = "timeout" - daemon_opts[ "t" ] = "timeout" -} -{ - if ( $0 ~ /^$/ ) - next - if ( $1 in daemon_opts ) { - daemon[ daemon_opts[ $1 ] ] = $2 - } else if ($1 ~ /^D.+/) { - defines[ $1 ] = $2 - } else { - mount[NR] = $0 - } -} -END { - if ( which ~ "^daemon$" ) { - if ( "timeout" in daemon ) { - printf "--timeout=%s\n", daemon["timeout"] - } - } else { - for ( a in defines ) { - printf "-%s=%s ", a, defines[a] - } - for ( a in mount ) { - if ( length( out ) ) - out=out "," mount[a] - else - out=mount[a] - } - printf "%s\n", out - } -} -' -} - -function get_command_from_pid() -{ - ps ax | grep "[0-9]:[0-9][0-9] $DAEMON " | ( - while read pid tt stat time command; do - if [ "$pid" = "$1" ] ; then - echo `echo "$command" | sed 's/--pid-file.*\.pid/ /'` - return 0 - fi - done - ) - - return 0 -} - -# return true if at least one pid is alive -function alive() -{ - if [ -z "$*" ]; then - return 1 - fi - for i in $*; do - if kill -0 $i 2> /dev/null; then - return 0 - fi - done - - return 1 -} - -# Start the fun :) -PID=`pidof -o %PPID /usr/sbin/automount` +PID=`cat /var/run/autofs-running 2> /dev/null` case "$1" in start) - stat_busy "Starting automounter" - getmounts | while read cmd args; do - opt=${args%%-- *} - rest=${args#*-- } - mnt=${rest%% *} - rest=${rest#* } - echo -n " $mnt" - if [ ! -d /var/run/autofs ]; then - mkdir /var/run/autofs - fi - pidfile=/var/run/autofs/`echo $mnt | sed 's,_,__,g;s,/,_:,g'`.pid - $DAEMON $daemonoptions --pid-file=$pidfile $opt $mnt $rest - done + stat_busy "Starting Automounter" + [ -z "$PID" ] && /usr/sbin/automount $daemonoptions &> /dev/null if [ $? -gt 0 ]; then stat_fail else add_daemon autofs stat_done fi - ;; + ;; stop) - stat_busy "Stopping automounter" - [ ! -z "$PID" ] && kill $PID &> /dev/null + stat_busy "Stopping Automounter" + [ ! -z "$PID" ] && kill $PID &> /dev/null if [ $? -gt 0 ]; then stat_fail else rm_daemon autofs stat_done fi - ;; + ;; restart) $0 stop sleep 1 $0 start - ;; - status) - status - ;; + ;; *) echo "usage: $0 {start|stop|restart}" - ;; esac - -exit 0 +exit 0 |