From bdc2bbbbc402a76744ff8960842bd150e25e1bdc Mon Sep 17 00:00:00 2001 From: Cecil Hugh Watson Date: Sat, 28 Mar 2009 21:17:30 -0700 Subject: Initial inclusion of autofs. --- abs/extra-testing/autofs/PKGBUILD | 48 ++++ abs/extra-testing/autofs/auto.master | 7 + abs/extra-testing/autofs/auto.misc | 9 + abs/extra-testing/autofs/auto.net | 29 +++ abs/extra-testing/autofs/autofs | 389 +++++++++++++++++++++++++++++++++ abs/extra-testing/autofs/autofs.conf.d | 5 + 6 files changed, 487 insertions(+) create mode 100644 abs/extra-testing/autofs/PKGBUILD create mode 100644 abs/extra-testing/autofs/auto.master create mode 100644 abs/extra-testing/autofs/auto.misc create mode 100644 abs/extra-testing/autofs/auto.net create mode 100644 abs/extra-testing/autofs/autofs create mode 100644 abs/extra-testing/autofs/autofs.conf.d diff --git a/abs/extra-testing/autofs/PKGBUILD b/abs/extra-testing/autofs/PKGBUILD new file mode 100644 index 0000000..1bc5435 --- /dev/null +++ b/abs/extra-testing/autofs/PKGBUILD @@ -0,0 +1,48 @@ +# $Id: PKGBUILD 356 2008-04-18 22:56:27Z aaron $ +# Maintainer: Dale Blount +# Contributor: Manolis Tzanidakis + +pkgname=autofs +pkgver=4.1.4 +pkgrel=4 +pkgdesc="A kernel-based automounter for Linux." +arch=(i686 x86_64) +url="ftp://ftp.kernel.org/pub/linux/daemons/autofs" +depends=('libldap') +backup=(etc/autofs/auto.master etc/conf.d/autofs) +source=($url/v4/${pkgname}-${pkgver}.tar.bz2 + ${pkgname} + ${pkgname}.conf.d + auto.master + auto.misc + auto.net) +md5sums=('7e3949114c00665b4636f0c318179657' '80b77182aa957646a2074433d3890518'\ + 'ddd69346754419faee15fc4c7edeb8b8' '0543a0d172eaec300e8d08708440dd4b'\ + '0be409ef0cdf0255ce701ed4ba9e46b5' 'e4d945d63abc0488a47a5e2a750e8c3b') + +build() { + export MAKEFLAGS="-j1" + cd ${startdir}/src/${pkgname}-${pkgver} + /bin/sed -i "s:-O3 -fomit-frame-pointer -Wall:${CFLAGS}:" \ + Makefile.rules + /bin/sed -i "s:SUBDIRS = lib daemon modules man samples:SUBDIRS = lib daemon modules man:" \ + Makefile.rules + ./configure --prefix=/usr --sysconfdir=/etc/autofs + /usr/bin/make || return 1 + /usr/bin/make INSTALLROOT=${startdir}/pkg install + + local conf_file + for conf_file in auto.{master,misc}; do + /bin/install -D -m 644 ${startdir}/$conf_file \ + ${startdir}/pkg/etc/autofs/$conf_file + done + + /bin/install -m 755 ${startdir}/auto.net \ + ${startdir}/pkg/etc/autofs/auto.net + /bin/sed -i "s:/etc:/etc/autofs:g" \ + ${startdir}/pkg/usr/man/man5/auto.master.5 + /bin/install -D -m 755 ${startdir}/autofs ${startdir}/pkg/etc/rc.d/autofs + /bin/install -D -m 644 ${startdir}/autofs.conf.d \ + ${startdir}/pkg/etc/conf.d/autofs +} +# vim: ts=2 sw=2 et ft=sh diff --git a/abs/extra-testing/autofs/auto.master b/abs/extra-testing/autofs/auto.master new file mode 100644 index 0000000..faa42c9 --- /dev/null +++ b/abs/extra-testing/autofs/auto.master @@ -0,0 +1,7 @@ +# Sample auto.master file +# Format of this file: +# mountpoint map options +# For details of the format look at autofs(5). + +/var/autofs/misc /etc/autofs/auto.misc +/var/autofs/net /etc/autofs/auto.net diff --git a/abs/extra-testing/autofs/auto.misc b/abs/extra-testing/autofs/auto.misc new file mode 100644 index 0000000..e7714bd --- /dev/null +++ b/abs/extra-testing/autofs/auto.misc @@ -0,0 +1,9 @@ +# This is an automounter map and it has the following format +# key [ -mount-options-separated-by-comma ] location +# Details may be found in the autofs(5) manpage + +kernel -ro ftp.kernel.org:/pub/linux +boot -fstype=ext2 :/dev/hda1 +removable -fstype=ext2 :/dev/hdd +cd -fstype=iso9660,ro :/dev/hdc +floppy -fstype=auto :/dev/fd0 diff --git a/abs/extra-testing/autofs/auto.net b/abs/extra-testing/autofs/auto.net new file mode 100644 index 0000000..20861d1 --- /dev/null +++ b/abs/extra-testing/autofs/auto.net @@ -0,0 +1,29 @@ +#!/bin/sh + +# $Id: auto.net,v 1.1 2003/11/15 15:40:14 manolis Exp $ + +# Look at what a host is exporting to determine what we can mount. +# This is very simple, but it appears to work surprisingly well + +key="$1" + +# add "nosymlink" here if you want to suppress symlinking local filesystems +# Note: "nonstrict" is now set by default, remove it if you don't want it. +opts="-fstype=nfs,hard,intr,nodev,nosuid,nonstrict" + +# Showmount comes in a number of names and varieties. "showmount" is +# typically an older version which accepts the '--no-headers' flag +# but ignores it. "kshowmount" is the newer version installed with knfsd, +# which both accepts and acts on the '--no-headers' flag. +#SHOWMOUNT="kshowmount --no-headers -e $key" +#SHOWMOUNT="showmount -e $key | tail +2" + +# Newer distributions get this right +SHOWMOUNT="/usr/sbin/showmount --no-headers -e $key" + +$SHOWMOUNT | LC_ALL=C sort +0 | \ + awk -v key="$key" -v opts="$opts" -- ' + BEGIN { ORS=""; first=1 } + { if (first) { print opts; first=0 }; print " \\\n\t" $1, key ":" $1 } + END { if (!first) print "\n"; else exit 1 } + ' diff --git a/abs/extra-testing/autofs/autofs b/abs/extra-testing/autofs/autofs new file mode 100644 index 0000000..83b0303 --- /dev/null +++ b/abs/extra-testing/autofs/autofs @@ -0,0 +1,389 @@ +#!/bin/bash + +. /etc/rc.conf +. /etc/rc.d/functions + +# 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 ' 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 : + type=$maptype + map=`echo $map | cut -f2- -d:` + else + # special handling of maps + case "$map" in + hesiod|userhome) + type=$map + map="" + ;; + ldap) + # / ldap + 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` +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 + if [ $? -gt 0 ]; then + stat_fail + else + add_daemon autofs + stat_done + fi + ;; + stop) + 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 diff --git a/abs/extra-testing/autofs/autofs.conf.d b/abs/extra-testing/autofs/autofs.conf.d new file mode 100644 index 0000000..435665d --- /dev/null +++ b/abs/extra-testing/autofs/autofs.conf.d @@ -0,0 +1,5 @@ +# e.g. localoptions='rsize=8192,wsize=8192' +localoptions='' + +# e.g. --timeout=60 +daemonoptions='' -- cgit v0.12