mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-28 22:57:37 +00:00
315 lines
6.4 KiB
Bash
315 lines
6.4 KiB
Bash
#!/bin/bash
|
|
|
|
daemon_name=nfs-common
|
|
|
|
NEED_STATD=
|
|
STATD_OPTS=
|
|
NEED_IDMAPD=
|
|
IDMAPD_OPTS=
|
|
NEED_GSSD=
|
|
GSSD_OPTS=
|
|
PIPEFS_MOUNTPOINT=
|
|
PIPEFS_MOUNTOPTS=
|
|
|
|
# rpc.statd daemon & binary location
|
|
STATD_DAEMON_NAME=rpc.statd
|
|
STATD="/usr/sbin/rpc.statd"
|
|
|
|
# rpc.idmapd daemon & binary location
|
|
IDMAPD_DAEMON_NAME=rpc.idmapd
|
|
IDMAPD="/usr/sbin/rpc.idmapd"
|
|
|
|
# rpc.gssd daemon & binary location
|
|
GSSD_DAEMON_NAME=rpc.gssd
|
|
GSSD="/usr/sbin/rpc.gssd"
|
|
|
|
. /etc/rc.conf
|
|
. /etc/rc.d/functions
|
|
. /etc/conf.d/$daemon_name.conf
|
|
|
|
# Default mountpoint and options for rpc_pipefs filesystem
|
|
[ -z "$PIPEFS_MOUNTPOINT" ] && PIPEFS_MOUNTPOINT="/var/lib/nfs/rpc_pipefs"
|
|
[ -z "$PIPEFS_MOUNTOPTS" ] && PIPEFS_MOUNTOPTS="defaults"
|
|
|
|
# Parse the fstab file, and determine whether we need idmapd and gssd. (The
|
|
# /etc/conf.d/nfs-common settings, if any, will override our autodetection.)
|
|
AUTO_NEED_IDMAPD=no
|
|
AUTO_NEED_GSSD=no
|
|
|
|
if [ -f /etc/fstab ]; then
|
|
exec 9<&0 </etc/fstab
|
|
|
|
while read DEV MTPT FSTYPE OPTS REST; do
|
|
if [ "$FSTYPE" = "nfs4" ]; then
|
|
AUTO_NEED_IDMAPD=yes
|
|
fi
|
|
case "$OPTS" in
|
|
sec=krb5|*,sec=krb5|sec=krb5,*|*,sec=krb5i,*|sec=krb5i|*,sec=krb5i|sec=krb5i,*|*,sec=krb5i,*|sec=krb5p|*,sec=krb5p|sec=krb5p,*|*,sec=krb5p,*)
|
|
AUTO_NEED_GSSD=yes
|
|
;;
|
|
esac
|
|
done
|
|
|
|
exec 0<&9 9<&-
|
|
fi
|
|
|
|
# We also need idmapd if we run an NFSv4 server. It's fairly difficult
|
|
# to autodetect whether there are NFSv4 exports or not, and idmapd is not a
|
|
# particularily heavy daemon, so we auto-enable it if we find an /etc/exports
|
|
# file. This does not mean that there are NFSv4 or other mounts active (or
|
|
# even that nfs-kernel-server is installed), but it matches what the "start"
|
|
# condition in nfs-kernel-server's init script does, which has a value in
|
|
# itself.
|
|
if [ -f /etc/exports ] && grep -q '^[[:space:]]*[^#]*/' /etc/exports; then
|
|
AUTO_NEED_IDMAPD=yes
|
|
fi
|
|
|
|
case "$NEED_STATD" in
|
|
yes|no)
|
|
;;
|
|
*)
|
|
NEED_STATD=yes
|
|
;;
|
|
esac
|
|
|
|
case "$NEED_IDMAPD" in
|
|
yes|no)
|
|
;;
|
|
*)
|
|
NEED_IDMAPD=$AUTO_NEED_IDMAPD
|
|
;;
|
|
esac
|
|
|
|
case "$NEED_GSSD" in
|
|
yes|no)
|
|
;;
|
|
*)
|
|
NEED_GSSD=$AUTO_NEED_GSSD
|
|
;;
|
|
esac
|
|
|
|
do_modprobe() {
|
|
if [ -x /sbin/modprobe -a -f /proc/modules ]; then
|
|
modprobe -q "$1" || true
|
|
fi
|
|
}
|
|
|
|
do_mount() {
|
|
if ! grep -E "$1\$" /proc/filesystems &> /dev/null ; then
|
|
return 1
|
|
fi
|
|
|
|
if grep -vw "$1" /proc/mounts &> /dev/null ; then
|
|
if ! mountpoint -q "$2" ; then
|
|
mount -t "$1" "$1" "$2" -o "$3"
|
|
return
|
|
fi
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
do_umount() {
|
|
if mountpoint -q "$1" ; then
|
|
umount "$1"
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
get_pid() {
|
|
pidof -o %PPID "$1"
|
|
}
|
|
|
|
case "$1" in
|
|
start)
|
|
ck_daemon rpcbind && { echo -n "Start rpcbind first." >&2; stat_die; }
|
|
rc=0
|
|
if [ "$NEED_STATD" = yes ]; then
|
|
stat_busy "Starting $STATD_DAEMON_NAME daemon"
|
|
PID=$(get_pid $STATD)
|
|
if [ -z "$PID" ]; then
|
|
[ -f /var/run/$STATD_DAEMON_NAME.pid ] && rm -f /var/run/$STATD_DAEMON_NAME.pid
|
|
# RUN
|
|
$STATD $STATD_OPTS
|
|
#
|
|
rc=$(($rc+$?))
|
|
if [ $rc -gt 0 ]; then
|
|
stat_fail
|
|
exit $rc
|
|
else
|
|
echo $(get_pid $STATD) > /var/run/$STATD_DAEMON_NAME.pid
|
|
stat_done
|
|
fi
|
|
else
|
|
stat_fail
|
|
exit 1
|
|
fi
|
|
# Run sm-notify
|
|
/usr/sbin/sm-notify $SMNOTIFY_OPTS
|
|
fi
|
|
|
|
if [ "$NEED_IDMAPD" = yes ] || [ "$NEED_GSSD" = yes ]; then
|
|
stat_busy "Mounting pipefs filesystem"
|
|
do_modprobe sunrpc
|
|
do_modprobe nfs
|
|
do_modprobe nfsd
|
|
do_mount rpc_pipefs "$PIPEFS_MOUNTPOINT" "$PIPEFS_MOUNTOPTS"
|
|
rc=$(($rc+$?))
|
|
if [ $rc -gt 0 ]; then
|
|
stat_fail
|
|
exit $rc
|
|
else
|
|
stat_done
|
|
fi
|
|
|
|
if [ "$NEED_IDMAPD" = yes ]; then
|
|
stat_busy "Starting $IDMAPD_DAEMON_NAME daemon"
|
|
PID=$(get_pid $IDMAPD)
|
|
if [ -z "$PID" ]; then
|
|
[ -f /var/run/$IDMAPD_DAEMON_NAME.pid ] && rm -f /var/run/$IDMAPD_DAEMON_NAME.pid
|
|
# RUN
|
|
$IDMAPD $IDMAPD_OPTS
|
|
#
|
|
rc=$(($rc+$?))
|
|
if [ $rc -gt 0 ]; then
|
|
stat_fail
|
|
exit $rc
|
|
else
|
|
echo $(get_pid $IDMAPD) > /var/run/$IDMAPD_DAEMON_NAME.pid
|
|
stat_done
|
|
fi
|
|
else
|
|
stat_fail
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ "$NEED_GSSD" = yes ]; then
|
|
do_modprobe rpcsec_gss_krb5
|
|
stat_busy "Starting $GSSD_DAEMON_NAME daemon"
|
|
PID=$(get_pid $GSSD)
|
|
if [ -z "$PID" ]; then
|
|
[ -f /var/run/$GSSD_DAEMON_NAME.pid ] && rm -f /var/run/$GSSD_DAEMON_NAME.pid
|
|
# RUN
|
|
$GSSD $GSSD_OPTS
|
|
#
|
|
rc=$(($rc+$?))
|
|
if [ $rc -gt 0 ]; then
|
|
stat_fail
|
|
exit $rc
|
|
else
|
|
echo $(get_pid $GSSD) > /var/run/$GSSD_DAEMON_NAME.pid
|
|
stat_done
|
|
fi
|
|
else
|
|
stat_fail
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
add_daemon $daemon_name
|
|
;;
|
|
|
|
stop)
|
|
rc=0
|
|
if [ "$NEED_IDMAPD" = yes ] || [ "$NEED_GSSD" = yes ]; then
|
|
|
|
if [ "$NEED_GSSD" = yes ]; then
|
|
stat_busy "Stopping $GSSD_DAEMON_NAME daemon"
|
|
PID=$(get_pid $GSSD)
|
|
# KILL
|
|
[ ! -z "$PID" ] && kill $PID &> /dev/null
|
|
#
|
|
rc=$(($rc+$?))
|
|
if [ $rc -gt 0 ]; then
|
|
stat_fail
|
|
exit $rc
|
|
else
|
|
rm -f /var/run/$GSSD_DAEMON_NAME.pid &> /dev/null
|
|
stat_done
|
|
fi
|
|
fi
|
|
|
|
if [ "$NEED_IDMAPD" = yes ]; then
|
|
stat_busy "Stopping $IDMAPD_DAEMON_NAME daemon"
|
|
PID=$(get_pid $IDMAPD)
|
|
# KILL
|
|
[ ! -z "$PID" ] && kill $PID &> /dev/null
|
|
#
|
|
rc=$(($rc+$?))
|
|
if [ $rc -gt 0 ]; then
|
|
stat_fail
|
|
exit $rc
|
|
else
|
|
rm -f /var/run/$IDMAPD_DAEMON_NAME.pid &> /dev/null
|
|
stat_done
|
|
fi
|
|
fi
|
|
do_umount "$PIPEFS_MOUNTPOINT" 2>/dev/null || true
|
|
fi
|
|
|
|
if [ "$NEED_STATD" = yes ]; then
|
|
stat_busy "Stopping $STATD_DAEMON_NAME daemon"
|
|
PID=$(get_pid $STATD)
|
|
# KILL
|
|
[ ! -z "$PID" ] && kill $PID &> /dev/null
|
|
#
|
|
rc=$(($rc+$?))
|
|
if [ $rc -gt 0 ]; then
|
|
stat_fail
|
|
exit $rc
|
|
else
|
|
rm -f /var/run/$STATD_DAEMON_NAME.pid &> /dev/null
|
|
stat_done
|
|
fi
|
|
fi
|
|
|
|
rm_daemon $daemon_name
|
|
;;
|
|
|
|
status)
|
|
stat_busy "Checking $daemon_name status";
|
|
ck_status $daemon_name
|
|
|
|
if [ "$NEED_STATD" = yes ]; then
|
|
stat_busy "Daemon $STATD_DAEMON_NAME running"
|
|
PID=$(get_pid $STATD)
|
|
if [ -z "$PID" ]; then
|
|
stat_fail
|
|
else
|
|
stat_done
|
|
fi
|
|
fi
|
|
|
|
if [ "$NEED_GSSD" = yes ]; then
|
|
stat_busy "Daemon $GSSD_DAEMON_NAME running"
|
|
PID=$(get_pid $GSSD)
|
|
if [ -z "$PID" ]; then
|
|
stat_fail
|
|
else
|
|
stat_done
|
|
fi
|
|
fi
|
|
|
|
if [ "$NEED_IDMAPD" = yes ]; then
|
|
stat_busy "Daemon $IDMAPD_DAEMON_NAME running"
|
|
PID=$(get_pid $IDMAPD)
|
|
if [ -z "$PID" ]; then
|
|
stat_fail
|
|
else
|
|
stat_done
|
|
fi
|
|
fi
|
|
echo
|
|
;;
|
|
|
|
restart)
|
|
$0 stop
|
|
sleep 3
|
|
$0 start
|
|
;;
|
|
*)
|
|
echo "usage: $0 {start|stop|status|restart}"
|
|
esac
|
|
exit 0
|
|
|