summaryrefslogtreecommitdiffstats
path: root/plugins/volcap
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/volcap')
-rw-r--r--plugins/volcap/Makefile.am22
-rw-r--r--plugins/volcap/__init__.py0
-rw-r--r--plugins/volcap/setup.py11
-rw-r--r--plugins/volcap/tests.py0
-rw-r--r--plugins/volcap/volCap.c143
5 files changed, 176 insertions, 0 deletions
diff --git a/plugins/volcap/Makefile.am b/plugins/volcap/Makefile.am
new file mode 100644
index 0000000..6365336
--- /dev/null
+++ b/plugins/volcap/Makefile.am
@@ -0,0 +1,22 @@
+
+dist_glusternagiosplugins_PYTHON = \
+ volcap.so \
+ $(NULL)
+
+volcap.so: volCap.c setup.py
+ (cd $(srcdir); $(PYTHON) setup.py build \
+ --build-temp $(abs_builddir) --build-lib $(abs_builddir))
+all-local: volcap.so
+
+EXTRA_DIST = \
+ $(NULL)
+
+EXTRA_DIST = \
+ __init__.py \
+ volCap.c \
+ tests.py \
+ setup.py
+
+CLEANFILES = \
+ volcap.o \
+ volcap.so
diff --git a/plugins/volcap/__init__.py b/plugins/volcap/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/volcap/__init__.py
diff --git a/plugins/volcap/setup.py b/plugins/volcap/setup.py
new file mode 100644
index 0000000..b37e090
--- /dev/null
+++ b/plugins/volcap/setup.py
@@ -0,0 +1,11 @@
+from distutils.core import setup, Extension
+
+module1 = Extension('capacity',
+ sources=['volCap.c'], libraries=['gfapi'])
+
+setup(name='capacity',
+ version='1.0',
+ description='Gets the volume capcity Utilization',
+ py_modules=['__init__'],
+ url='redhat.com',
+ ext_modules=[module1])
diff --git a/plugins/volcap/tests.py b/plugins/volcap/tests.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/volcap/tests.py
diff --git a/plugins/volcap/volCap.c b/plugins/volcap/volCap.c
new file mode 100644
index 0000000..5eb61db
--- /dev/null
+++ b/plugins/volcap/volCap.c
@@ -0,0 +1,143 @@
+#include <Python.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/statvfs.h>
+#include "/usr/include/glusterfs/api/glfs.h"
+#include "/usr/include/glusterfs/api/glfs-handles.h"
+#include <syslog.h>
+
+#define USAGE_ERROR -1
+#define GLFS_NEW_FAILURE -2
+#define GLFS_INIT_FAILURE -3
+#define GLFS_STATVFS_FAILURE -4
+#define GLFS_FINI_FAILURE -5
+#define DEFAULT_TRANSPORT "tcp"
+#define DEFAULT_SERVER "127.0.0.1"
+#define DEFAULT_SERVER_PORT 24007
+
+static PyObject *StatvfsError;
+
+int get_volume_statvfs (const char *volume_name, const char *server_name, struct statvfs *buf)
+{
+ glfs_t *fs = NULL;
+ int ret = 0;
+ struct statvfs statvfsinfo = {0, };
+ int rv = 0;
+
+ if (!(volume_name && buf))
+ {
+ return USAGE_ERROR;
+ }
+
+ fs = glfs_new (volume_name);
+ if (!fs)
+ {
+ //fprintf (stderr, "glfs_new: returned NULL\n");
+ syslog (LOG_ERR, "glfs_new: returned NULL");
+ return GLFS_NEW_FAILURE;
+ }
+
+ if (server_name)
+ {
+ ret = glfs_set_volfile_server(fs, DEFAULT_TRANSPORT, server_name, DEFAULT_SERVER_PORT);
+ }
+ else
+ {
+ ret = glfs_set_volfile_server(fs, DEFAULT_TRANSPORT, DEFAULT_SERVER, DEFAULT_SERVER_PORT);
+ }
+
+ ret = glfs_set_logging (fs, "/tmp/libg.txt", 2);
+
+ ret = glfs_init (fs);
+ if (ret != 0)
+ {
+ //fprintf (stderr, "glfs_init() failed with code %d\n", ret);
+ syslog (LOG_ERR, "glfs_init() failed with code %d",ret);
+ rv = GLFS_INIT_FAILURE;
+ goto out;
+ }
+
+ /*fprintf (stdout, "waiting for 3 seconds to initialize\n");*/
+ sleep (3);
+
+ ret = glfs_statvfs (fs, "/", &statvfsinfo);
+ if (ret == 0)
+ {
+ *buf = statvfsinfo;
+ }
+ else
+ {
+ //fprintf (stderr, "glfs_statvfs() failed with [%d:%s] for \"/\"\n", ret, strerror (errno));
+ syslog (LOG_ERR, "glfs_statvfs() failed with [%d:%s] for \"/\"\n", ret, strerror (errno));
+ rv = GLFS_STATVFS_FAILURE;
+ }
+
+ out:
+ ret = glfs_fini (fs);
+ if (ret != 0)
+ {
+ //fprintf (stderr, "glfs_fini() failed with code %d\n", ret);
+ syslog (LOG_ERR, "glfs_fini() failed with code %d\n", ret);
+ }
+
+ return rv;
+}
+
+static PyObject *glfspy_statvfs (PyObject *self, PyObject *args)
+{
+ char *volume_name = NULL;
+ char *server_name = NULL;
+ int port = 0;
+ char *transport = NULL;
+ struct statvfs buf = {0, };
+ int rv = 0;
+#define USAGE_ERROR -1
+#define GLFS_NEW_FAILURE -2
+#define GLFS_INIT_FAILURE -3
+#define GLFS_STATVFS_FAILURE -4
+#define GLFS_FINI_FAILURE -5
+
+ StatvfsError = PyErr_NewException("statvfs.error", NULL, NULL);
+ setlogmask (LOG_UPTO (LOG_DEBUG));
+ openlog ("statvfs", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
+ syslog (LOG_INFO, "Invoking glfspy_statvfs to get the volume utlization");
+ if (!PyArg_ParseTuple (args, "s|ziz", &volume_name, &server_name, &port, &transport))
+ {
+ PyErr_SetString(StatvfsError, "Argument parsing failed");
+ return NULL;
+ }
+
+ rv = get_volume_statvfs (volume_name, server_name, &buf);
+ closelog ();
+ //return Py_BuildValue("i", rv);
+ if(rv == 0)
+ return Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i}","f_bsize",buf.f_bsize,"f_frsize",buf.f_frsize,"f_blocks",buf.f_blocks,"f_bfree",buf.f_bfree,"f_bavail",buf.f_bavail,"f_files",buf.f_files,"f_ffree",buf.f_ffree,"f_favail",buf.f_favail,"f_fsid",buf.f_fsid,"f_flag",buf.f_flag,"f_namemax",buf.f_namemax);
+ else {
+ if(rv == USAGE_ERROR)
+ PyErr_SetString(StatvfsError, "Usage error");
+ if(rv == GLFS_NEW_FAILURE)
+ PyErr_SetString(StatvfsError, "glfs_new() failed");
+ if(rv == GLFS_INIT_FAILURE)
+ PyErr_SetString(StatvfsError, "glfs_init() failed");
+ if(rv == GLFS_STATVFS_FAILURE)
+ PyErr_SetString(StatvfsError, "glfs_statvfs() failed");
+ //return Py_BuildValue("i", rv);
+ return NULL;
+ }
+}
+
+
+static PyMethodDef glfspy_methods[] = {
+ { "statvfs", (PyCFunction)glfspy_statvfs, METH_VARARGS, NULL },
+ { NULL, NULL, 0, NULL }
+};
+
+
+PyMODINIT_FUNC initcapacity ()
+{
+ Py_InitModule3 ("capacity", glfspy_methods, "gluster gfapi top level extension module.");
+}