123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- # -*- coding: utf-8 -*-
- from comar.service import *
- from pardus import fstabutils
- import signal
- import os
- serviceType = "server"
- serviceDesc = _({"en": "NFS Server",
- "tr": "NFS Sunucusu"})
- serviceConf = "nfs"
- ERR_INSMOD = _({"en": "Failed probing module %s",
- "tr": "%s modülü yüklenemedi",
- })
- PROCNFSD_MOUNTPOINT = "/proc/fs/nfsd"
- RQUOTAD_PATH = "/usr/sbin/rpc.rquotad"
- IDMAPD_PIDFILE = "/run/rpc.idmapd.pid"
- SVCGSSD_PIDFILE = "/run/rpc.svcgssd.pid"
- RQUOTAD_PIDFILE = "/run/rpc.rquotad.pid"
- MOUNTD_PIDFILE = "/run/rpc.mountd.pid"
- # Parse the fstab file and determine whether we need quotad or not by searching
- # mount option quota in any mount entry.
- # If none, nfs conf.d file decides if it's needed.
- def need_quotad():
- fstab = fstabutils.Fstab()
- for entry in fstab.get_entries():
- if "quota" in entry.get_fs_mntopts():
- return True
- @synchronized
- def start():
- startDependencies("nfs_common")
- if run("/sbin/modprobe -q nfsd"):
- fail(ERR_INSMOD % "nfsd")
- # Check if PROCNFSD_MOUNTPOINT is mounted
- if run("/bin/mountpoint -q %s" % PROCNFSD_MOUNTPOINT):
- run("/bin/mount -t nfsd nfsd %s" % PROCNFSD_MOUNTPOINT)
- run("/usr/sbin/exportfs -r")
- # If RPCNFSDCOUNT is not explicitly defined in confd, use default one, 8 threads.
- startService(command="/usr/sbin/rpc.nfsd",
- args="%s %s" % (config.get("RPCNFSD_OPTIONS", ""), config.get("RPCNFSDCOUNT", "8")),
- donotify=True)
- if config.get("NEED_SVCGSSD", "no") == "yes":
- startService(command="/usr/sbin/rpc.svcgssd",
- args="-f %s" % config.get("RPCSVCGSSD_OPTIONS", ""),
- donotify=True,
- detach=True,
- makepid=True,
- pidfile=SVCGSSD_PIDFILE)
- # Start rpc.rquotad daemon here if its available
- if (config.get("NEED_QUOTAD", "no") == "yes" or need_quotad()) and os.path.exists(RQUOTAD_PATH):
- RPCRQUOTAD_OPTIONS = config.get("RPCRQUOTAD_OPTIONS", "")
- RQUOTAD_PORT = config.get("RQUOTAD_PORT")
- if RQUOTAD_PORT:
- RPCRQUOTAD_OPTIONS += " -p %s" % RQUOTAD_PORT
- startService(command=RQUOTAD_PATH,
- args="-F %s" % RPCRQUOTAD_OPTIONS,
- donotify=True,
- detach=True,
- makepid=True,
- pidfile=RQUOTAD_PIDFILE)
- # Reload rpc.idmapd
- if os.path.exists(IDMAPD_PIDFILE):
- os.kill(int(file(IDMAPD_PIDFILE).read().strip()), signal.SIGHUP)
- RPCMOUNTD_OPTIONS = config.get("RPCMOUNTD_OPTIONS", "")
- MOUNTD_PORT = config.get("MOUNTD_PORT")
- if MOUNTD_PORT:
- RPCMOUNTD_OPTIONS += " -p %s" % MOUNTD_PORT
- startService(command="/usr/sbin/rpc.mountd",
- args="-F %s" % RPCMOUNTD_OPTIONS,
- donotify=True,
- detach=True,
- makepid=True,
- pidfile=MOUNTD_PIDFILE)
- @synchronized
- def stop():
- stopService(pidfile=MOUNTD_PIDFILE,
- donotify=True)
- if os.path.exists(MOUNTD_PIDFILE):
- os.unlink(MOUNTD_PIDFILE)
- stopService(pidfile=SVCGSSD_PIDFILE,
- donotify=True)
- if os.path.exists(SVCGSSD_PIDFILE):
- os.unlink(SVCGSSD_PIDFILE)
- stopService(pidfile=RQUOTAD_PIDFILE,
- donotify=True)
- if os.path.exists(RQUOTAD_PIDFILE):
- os.unlink(RQUOTAD_PIDFILE)
- stopService(command="/usr/sbin/rpc.nfsd",
- args="0",
- donotify=True)
- # Unexport all exported directories
- run("/usr/sbin/exportfs -au")
- if not run("/bin/mountpoint -q %s" % PROCNFSD_MOUNTPOINT):
- run("/usr/sbin/exportfs -f %s" % PROCNFSD_MOUNTPOINT)
- def reload():
- # Re-export all exported directories
- run("/usr/sbin/exportfs -r")
- def status():
- # ugly way of learning if the daemon is up and running.
- result = not run("/sbin/pidof nfsd") and isServiceRunning(MOUNTD_PIDFILE)
- if config.get("NEED_SVCGSSD", "no") == "yes":
- result = result and isServiceRunning(SVCGSSD_PIDFILE)
- if (config.get("NEED_QUOTAD", "no") == "yes" or need_quotad()) and os.path.exists(RQUOTAD_PATH):
- result = result and isServiceRunning(RQUOTAD_PIDFILE)
- return result
|