summaryrefslogtreecommitdiffstats
path: root/plugins/volcap/volCap.c
blob: 5eb61db1417816730761b2f09b63d858c4ac84e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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.");
}