Hi all,
I send an implementation of nfsserver to the user list a while ago.
As there's no interests show around, I resend it here as a patch.
Please consider it for upstream. Thanks.
# HG changeset patch
# User [EMAIL PROTECTED]
# Date 1222583225 -28800
# Node ID e6f8dd8207e33bedc0d8e382be518613c01a939f
# Parent 3127c6aa43a22db99d6ad2da9667c303613f55d9
Add resource agent for nfs server
diff -r 3127c6aa43a2 -r e6f8dd8207e3 resources/OCF/Makefile.am
--- a/resources/OCF/Makefile.am Fri Sep 26 16:45:51 2008 +0200
+++ b/resources/OCF/Makefile.am Sun Sep 28 14:27:05 2008 +0800
@@ -66,6 +66,7 @@
ManageRAID \
ManageVE \
mysql \
+ nfsserver \
o2cb \
oracle \
oralsnr \
diff -r 3127c6aa43a2 -r e6f8dd8207e3 resources/OCF/nfsserver
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/resources/OCF/nfsserver Sun Sep 28 14:27:05 2008 +0800
@@ -0,0 +1,224 @@
+#!/bin/sh
+# nfsserver
+# Description: Manages nfs server as OCF resource
+# by [EMAIL PROTECTED]
+# License: GNU General Public License 2 (GPL2)
+
+#set -x
+
+if [ -n "$OCF_DEBUG_LIBRARY" ]; then
+ . $OCF_DEBUG_LIBRARY
+else
+ . ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
+fi
+
+nfsserver_meta_data() {
+ cat <<END
+<?xml version="1.0"?>
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
+<resource-agent name="nfsserver">
+<version>1.0</version>
+
+<longdesc lang="en">
+Nfsserver represent the nfsserver in the system.
+</longdesc>
+
+<shortdesc lang="en">
+Nfsserver represent the nfsserver in the system.
+</shortdesc>
+
+<parameters>
+
+<parameter name="nfs_shared_path" unique="0" required="1">
+<longdesc lang="en">
+The directory which physically shared among all servers. Typically, it's a filesystem on a shared storage.
+</longdesc>
+<shortdesc lang="en">
+Path shared among servers.
+</shortdesc>
+<content type="string" default="" />
+</parameter>
+
+<parameter name="nfs_info_path" unique="0" required="1">
+<longdesc lang="en">
+The relative directory where to store nfs related information. It defaults to .nfsserver.
+</longdesc>
+<shortdesc lang="en">
+The directory to store nfs information.
+</shortdesc>
+<content type="string" default=".nfsserver" />
+</parameter>
+
+<parameter name="sharedip" unique="0" required="1">
+<longdesc lang="en">
+The IP address to access the nfs service
+</longdesc>
+<shortdesc lang="en">
+IP address.
+</shortdesc>
+<content type="string" default="*" />
+</parameter>
+
+</parameters>
+
+<actions>
+<action name="start" timeout="40" />
+<action name="stop" timeout="10" />
+<action name="status" timeout="90" />
+<action name="monitor" depth="0" timeout="20" interval="10" start-delay="1m"/>
+<action name="meta-data" timeout="5" />
+<action name="validate-all" timeout="30" />
+</actions>
+</resource-agent>
+END
+
+return $OCF_SUCCESS
+}
+
+nfsserver_usage() {
+ cat <<END
+ usage: $0 {start|stop|monitor|status|validate-all|meta-data}
+END
+}
+
+
+if [ $# -ne 1 ]; then
+ nfsserver_usage
+ exit $OCF_ERR_ARGS
+fi
+
+case $__OCF_ACTION in
+ meta-data) nfsserver_meta_data
+ exit $OCF_SUCCESS
+ ;;
+ usage|help) nfsserver_usage
+ exit $OCF_SUCCESS
+ ;;
+ *)
+ ;;
+esac
+
+nfsserver_monitor ()
+{
+ /etc/init.d/nfsserver status
+ rc=$?
+ if [ $rc == 0 ]; then
+ return $OCF_SUCCESS
+ fi
+ return $OCF_NOT_RUNNING
+}
+
+nfsserver_daemon_start ()
+{
+ ocf_log info "Starting NFS Server via init script"
+ /etc/init.d/nfsserver start
+ if [ $? -ne 0 ]; then
+ ocf_log err "Failed to start NFS Server via init script"
+ return 1
+ fi
+ ocf_log info "NFS Server started via init script"
+ return 0
+}
+
+nfsserver_daemon_stop ()
+{
+ ocf_log info "Stopping NFS Server via init script"
+ /etc/init.d/nfsserver stop
+ if [ $? -ne 0 ]; then
+ ocf_log err "Failed to stop NFS Server via init script"
+ return 1
+ fi
+ ocf_log info "NFS Server stopped via init script"
+ return 0
+}
+
+prepare_directory ()
+{
+ declare fp="$OCF_RESKEY_nfs_shared_path/$OCF_RESKEY_nfs_info_path"
+
+ [ -d "$fp" ] || mkdir -p fp
+ [ -d "$fp/rpc_pipefs" ] || mkdir -p $fp/rpc_pipefs
+ [ -d "$fp/sm" ] || mkdir -p $fp/sm
+ [ -d "$fp/sm.ha" ] || mkdir -p $fp/sm.ha
+ [ -d "$fp/sm.bak" ] || mkdir -p $fp/sm.bak
+ [ -d "$fp/v4recovery" ] || mkdir -p $fp/v4recovery
+}
+
+is_bound ()
+{
+ mount | grep -q "$1 on $2 type none (.*bind)"
+ return $?
+}
+
+prepare_tree ()
+{
+ declare fp="$OCF_RESKEY_nfs_shared_path/$OCF_RESKEY_nfs_info_path"
+ if is_bound $fp /var/lib/nfs; then
+ ocf_log debug "$fp is already bound to /var/lib/nfs"
+ return 0
+ fi
+ mount --bind $fp /var/lib/nfs
+}
+
+unprepare_tree ()
+{
+ declare fp="$OCF_RESKEY_nfs_shared_path/$OCF_RESKEY_nfs_info_path"
+ if is_bound $fp /var/lib/nfs; then
+ umount /var/lib/nfs
+ fi
+}
+
+nfsserver_start ()
+{
+ prepare_direcotry
+ prepare_tree
+
+ cp -f /var/lib/nfs/sm/* /var/lib/nfs/sm.ha 2> /dev/null
+ nfsserver_daemon_start
+ rc=$?
+
+ #Notify the nfs server has been moved or rebooted
+ #The init script do that once, and we do it again with the sharedip anyway
+ sm-notify -v $OCF_RESKEY_sharedip -P /var/lib/nfs/sm.ha
+ rm -f /var/lib/nfs/sm.ha/* 2> /dev/null
+
+ if [ $rc == 0 ]; then
+ return $OCF_SUCCESS
+ fi
+ return $OCF_ERR_GENERIC
+}
+
+nfsserver_stop ()
+{
+ nfsserver_daemon_stop
+ rc=$?
+ if [ $rc == 0 ]; then
+ unprepare_tree
+ return $OCF_SUCCESS
+ fi
+ return $OCF_ERR_GENERIC
+}
+
+nfsserver_validate ()
+{
+ if [ -x /etc/init.d/nfsserver && -x /usr/sbin/sm-notify ]; then
+ return $OCF_SUCCESS
+ else
+ return $OCF_ERR_INSTALLED
+ fi
+}
+
+case $__OCF_ACTION in
+ start) nfsserver_start
+ ;;
+ stop) nfsserver_stop
+ ;;
+ monitor) nfsserver_monitor
+ ;;
+ validate-all) nfsserver_validate
+ ;;
+ *) nfsserver_usage
+ exit $OCF_ERR_UNIMPLEMENTED
+ ;;
+esac
+
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/