summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/glustermg.spec14
-rwxr-xr-xsrc/com.gluster.storage.management.gateway.scripts/src/backend/gluster-volume-settings.init.d20
-rw-r--r--src/com.gluster.storage.management.gateway.scripts/src/backend/gluster_cifs_volume_startup.py122
3 files changed, 156 insertions, 0 deletions
diff --git a/build/glustermg.spec b/build/glustermg.spec
index 1c34c7ef..0a8cc202 100644
--- a/build/glustermg.spec
+++ b/build/glustermg.spec
@@ -66,6 +66,9 @@ cp -pa gmg-scripts/* $RPM_BUILD_ROOT/opt/glustermg/%{release_version}/backend
%{__install} -d -m0755 %{buildroot}%{_initrddir}
ln -sf /opt/glustermg/%{release_version}/backend/multicast-discoverd.py %{buildroot}%{_sbindir}/multicast-discoverd
%{__install} -p -m0755 gmg-scripts/multicast-discoverd.init.d %{buildroot}%{_initrddir}/multicast-discoverd
+ln -sf /opt/glustermg/%{release_version}/backend/gluster_cifs_volume_startup.py %{buildroot}%{_sbindir}/gluster_cifs_volume_startup
+%{__install} -p -m0755 gmg-scripts/gluster-volume-settings.init.d %{buildroot}%{_initrddir}/gluster-volume-settings
+
%post
if [ -f /usr/share/tomcat5/webapps/glustermg ]; then
@@ -111,6 +114,13 @@ fi
%preun
rm -f /usr/share/tomcat5/webapps/glustermg
+%pre backend
+modprobe -q fuse
+if ! lsmod | grep -qw fuse; then
+ echo "FATAL: fuse kernel module is not found."
+ false
+fi
+
%post backend
if [ -f /etc/sudoers ]; then
chmod 644 /etc/sudoers
@@ -135,10 +145,12 @@ else
fi
/etc/init.d/crond reload
/sbin/chkconfig smb on
+/sbin/chkconfig --add gluster-volume-settings
%preun backend
if [ "$1" = 0 ] ; then
/sbin/chkconfig --del multicast-discoverd
+ /sbin/chkconfig --del gluster-volume-settings
fi
@@ -151,6 +163,8 @@ rm -rf $RPM_BUILD_ROOT
/var/lib/rrd
%{_sbindir}/multicast-discoverd
%{_initrddir}/multicast-discoverd
+%{_sbindir}/gluster_cifs_volume_startup
+%{_initrddir}/gluster-volume-settings
%files
%defattr(-,root,root,0755)
diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/gluster-volume-settings.init.d b/src/com.gluster.storage.management.gateway.scripts/src/backend/gluster-volume-settings.init.d
new file mode 100755
index 00000000..97bc01ee
--- /dev/null
+++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/gluster-volume-settings.init.d
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# chkconfig: - 90 10
+### BEGIN INIT INFO
+# Required-Start: $network syslog glusterd
+# Default-Start: 3 5
+# Description: Setup/cleanup CIFS settings of Gluster volumes
+### END INIT INFO
+
+case "$1" in
+ start)
+ modprobe -q fuse
+ sleep 3
+ if ! lsmod | grep -qw fuse; then
+ echo "FATAL: fuse kernel module is not found. Gluster CIFS volume access will not work" >&2
+ exit 1
+ fi
+ /usr/sbin/gluster_cifs_volume_startup
+ ;;
+esac
diff --git a/src/com.gluster.storage.management.gateway.scripts/src/backend/gluster_cifs_volume_startup.py b/src/com.gluster.storage.management.gateway.scripts/src/backend/gluster_cifs_volume_startup.py
new file mode 100644
index 00000000..cc4c394d
--- /dev/null
+++ b/src/com.gluster.storage.management.gateway.scripts/src/backend/gluster_cifs_volume_startup.py
@@ -0,0 +1,122 @@
+#!/usr/bin/python
+# Copyright (C) 2011 Gluster, Inc. <http://www.gluster.com>
+# This file is part of Gluster Management Gateway.
+#
+
+import os
+import sys
+import glob
+p1 = os.path.abspath(os.path.dirname(sys.argv[0]))
+p2 = "%s/common" % os.path.dirname(p1)
+if not p1 in sys.path:
+ sys.path.append(p1)
+if not p2 in sys.path:
+ sys.path.append(p2)
+import Globals
+import Utils
+import VolumeUtils
+
+def getGlusterVolumeInfo(volumeName=None):
+ volumeNameList = None
+ if Utils.isString(volumeName):
+ volumeNameList = [volumeName]
+ if type(volumeName) == type([]):
+ volumeNameList = volumeName
+
+ status = Utils.runCommand("gluster volume info", output=True, root=True)
+ if status["Status"] != 0:
+ Utils.log("Failed to execute 'gluster volume info' command")
+ return None
+
+ volumeInfoDict = {}
+ volumeInfo = {}
+ volumeName = None
+ brickList = []
+ for line in status['Stdout'].split("\n"):
+ if not line:
+ if volumeName and volumeInfo:
+ volumeInfo["Bricks"] = brickList
+ volumeInfoDict[volumeName] = volumeInfo
+ volumeInfo = {}
+ volumeName = None
+ brickList = []
+ continue
+
+ tokens = line.split(":")
+ if tokens[0].strip().upper() == "BRICKS":
+ continue
+ elif tokens[0].strip().upper() == "VOLUME NAME":
+ volumeName = tokens[1].strip()
+ volumeInfo["VolumeName"] = volumeName
+ elif tokens[0].strip().upper() == "TYPE":
+ volumeInfo["VolumeType"] = tokens[1].strip()
+ elif tokens[0].strip().upper() == "STATUS":
+ volumeInfo["VolumeStatus"] = tokens[1].strip()
+ elif tokens[0].strip().upper() == "TRANSPORT-TYPE":
+ volumeInfo["TransportType"] = tokens[1].strip()
+ elif tokens[0].strip().upper().startswith("BRICK"):
+ brickList.append(":".join(tokens[1:]).strip())
+
+ if volumeName and volumeInfo:
+ volumeInfoDict[volumeName] = volumeInfo
+
+ if not volumeNameList:
+ return volumeInfoDict
+
+ # remove unwanted volume info
+ for volumeName in list(set(volumeInfoDict.keys()) - set(volumeNameList)):
+ del volumeInfoDict[volumeName]
+
+ return volumeInfoDict
+
+
+def main():
+ volumeInfo = getGlusterVolumeInfo()
+ if not volumeInfo:
+ print "No volume present. Removing CIFS volume configuration if any"
+ Utils.runCommand("rm -fr %s/*" % Globals.VOLUME_CONF_DIR, root=True, shell=True)
+ Utils.runCommand("rm -fr %s/*" % Globals.REEXPORT_DIR, root=True, shell=True)
+ Utils.runCommand("rm -fr %s/*" % Globals.CIFS_EXPORT_DIR, root=True, shell=True)
+ sys.exit(0)
+
+ try:
+ fp = open(Globals.VOLUME_SMBCONF_FILE)
+ lines = fp.readlines()
+ fp.close()
+ except IOError, e:
+ Utils.log("Failed to samba volume configuration file %s: %s" % (Globals.VOLUME_SMBCONF_FILE, str(e)))
+ sys.stderr.write("Failed to samba volume configuration file %s: %s\n" % (Globals.VOLUME_SMBCONF_FILE, str(e)))
+ sys.exit(1)
+
+ volumeSmbConfList = [line.strip() for line in lines]
+ for volumeName in volumeInfo.keys():
+ if not "include = %s/%s.smbconf" % (Globals.VOLUME_CONF_DIR, volumeName) in volumeSmbConfList:
+ continue
+ if 'STOPPED' == volumeInfo[volumeName]['VolumeStatus'].upper():
+ Utils.runCommand("rmdir %s/%s" % (Globals.CIFS_EXPORT_DIR, volumeName), root=True)
+ if not VolumeUtils.excludeVolume(volumeName):
+ Utils.log("Failed to exclude %s volume for CIFS reexport" % volumeName)
+ continue
+ if 'STARTED' == volumeInfo[volumeName]['VolumeStatus'].upper():
+ volumeMountDirName = "%s/%s" % (Globals.REEXPORT_DIR, volumeName)
+ if Utils.runCommand("mount -t glusterfs 127.0.0.1:%s %s" % (volumeName, volumeMountDirName)) != 0:
+ Utils.log("Failed to mount volume %s" % (volumeName))
+
+ smbConfFileList = glob.glob("%s/*.smbconf" % Globals.VOLUME_CONF_DIR)
+ volumeList = [smbConfFileName.split(".smbconf")[0].split("/")[-1] for smbConfFileName in smbConfFileList]
+ danglingVolumeList = list(set(volumeList).difference(set(volumeInfo.keys())))
+ if not danglingVolumeList:
+ sys.exit(0)
+
+ print "Cleaning up dangling volume(s):", danglingVolumeList
+ for volumeName in danglingVolumeList:
+ Utils.runCommand("rmdir %s/%s" % (Globals.REEXPORT_DIR, volumeName), root=True)
+ Utils.runCommand("rm -f %s/%s" % (Globals.CIFS_EXPORT_DIR, volumeName), root=True)
+ if not VolumeUtils.excludeVolume(volumeName):
+ Utils.log("Failed to exclude volume %s for CIFS reexport" % volumeName)
+ Utils.runCommand("rm -f %s/%s.smbconf" % (Globals.VOLUME_CONF_DIR, volumeName), root=True)
+
+ sys.exit(0)
+
+if __name__ == "__main__":
+ main()