diff options
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() |