]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/python.c
Cleanup Python build so that Python is not dragged
[bacula/bacula] / bacula / src / stored / python.c
1 /*
2  *
3  * Bacula interface to Python for the Storage Daemon
4  *
5  * Kern Sibbald, January MMV
6  *
7  *   Version $Id$
8  *
9  */
10
11 /*
12    Copyright (C) 2005 Kern Sibbald
13
14    This program is free software; you can redistribute it and/or
15    modify it under the terms of the GNU General Public License as
16    published by the Free Software Foundation; either version 2 of
17    the License, or (at your option) any later version.
18
19    This program is distributed in the hope that it will be useful,
20    but WITHOUT ANY WARRANTY; without even the implied warranty of
21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22    General Public License for more details.
23
24    You should have received a copy of the GNU General Public
25    License along with this program; if not, write to the Free
26    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
27    MA 02111-1307, USA.
28
29  */
30
31 #include "bacula.h"
32 #include "stored.h"
33
34 #ifdef HAVE_PYTHON
35 #undef _POSIX_C_SOURCE
36 #include <Python.h>
37
38 extern JCR *get_jcr_from_PyObject(PyObject *self);
39 extern PyObject *find_method(PyObject *eventsObject, PyObject *method, char *name);
40
41 static PyObject *jcr_get(PyObject *self, PyObject *args);
42 static PyObject *jcr_write(PyObject *self, PyObject *args);
43 static PyObject *jcr_set(PyObject *self, PyObject *args, PyObject *keyw);
44 static PyObject *set_jcr_events(PyObject *self, PyObject *args);
45
46
47 /* Define Job entry points */
48 PyMethodDef JobMethods[] = {
49     {"get", jcr_get, METH_VARARGS, "Get Job variables."},
50     {"set", (PyCFunction)jcr_set, METH_VARARGS|METH_KEYWORDS,
51         "Set Job variables."},
52     {"set_events", set_jcr_events, METH_VARARGS, "Define Job events."},
53     {"write", jcr_write, METH_VARARGS, "Write output."},
54     {NULL, NULL, 0, NULL}             /* last item */
55 };
56
57
58 struct s_vars {
59    const char *name;
60    char *fmt;
61 };
62
63 static struct s_vars vars[] = {
64    { N_("Job"),        "s"},          /* 0 */
65    { N_("SDName"),     "s"},          /* 1 */
66    { N_("Level"),      "s"},          /* 2 */
67    { N_("Type"),       "s"},          /* 3 */
68    { N_("JobId"),      "i"},          /* 4 */
69    { N_("Client"),     "s"},          /* 5 */
70    { N_("Pool"),       "s"},          /* 6 */
71    { N_("MediaType"),  "s"},          /* 7 */
72    { N_("JobName"),    "s"},          /* 8 */
73    { N_("JobStatus"),  "s"},          /* 9 */
74    { N_("VolumeName"), "s"},          /* 10 */
75    { N_("Device"),     "s"},          /* 11 */
76
77    { NULL,             NULL}
78 };
79
80 /* Return Job variables */
81 PyObject *jcr_get(PyObject *self, PyObject *args)
82 {
83    JCR *jcr;
84    char *item;
85    bool found = false;
86    int i;
87    char buf[10];
88    
89    if (!PyArg_ParseTuple(args, "s:get", &item)) {
90       return NULL;
91    }
92    jcr = get_jcr_from_PyObject(self);
93
94    for (i=0; vars[i].name; i++) {
95       if (strcmp(vars[i].name, item) == 0) {
96          found = true;
97          break;
98       }
99    }
100    if (!found) {
101       return NULL;
102    }
103    switch (i) {
104    case 0:                            /* Job */
105       return Py_BuildValue(vars[i].fmt, jcr->job_name);    /* Non-unique name */
106    case 1:                            /* SD's name */
107       return Py_BuildValue(vars[i].fmt, my_name);
108    case 2:                            /* level */
109       return Py_BuildValue(vars[i].fmt, job_level_to_str(jcr->JobLevel));
110    case 3:                            /* type */
111       return Py_BuildValue(vars[i].fmt, job_type_to_str(jcr->JobType));
112    case 4:                            /* JobId */
113       return Py_BuildValue(vars[i].fmt, jcr->JobId);
114    case 5:                            /* Client */
115       return Py_BuildValue(vars[i].fmt, jcr->client_name);
116    case 6:                            /* Pool */
117       return Py_BuildValue(vars[i].fmt, jcr->dcr->pool_name);
118    case 7:                            /* MediaType */
119       return Py_BuildValue(vars[i].fmt, jcr->dcr->media_type);
120    case 8:                            /* JobName */
121       return Py_BuildValue(vars[i].fmt, jcr->Job);
122    case 9:                            /* JobStatus */
123       buf[1] = 0;
124       buf[0] = jcr->JobStatus;
125       return Py_BuildValue(vars[i].fmt, buf);
126    case 10:
127       return Py_BuildValue(vars[i].fmt, jcr->dcr->VolumeName);
128    case 11:
129       return Py_BuildValue(vars[i].fmt, jcr->dcr->dev_name);
130    }
131    return NULL;
132 }
133
134 /* Set Job variables */
135 PyObject *jcr_set(PyObject *self, PyObject *args, PyObject *keyw)
136 {
137    JCR *jcr;
138    char *msg = NULL;
139    static char *kwlist[] = {"JobReport", NULL};
140    
141    if (!PyArg_ParseTupleAndKeywords(args, keyw, "|s:set", kwlist,
142         &msg)) {
143       return NULL;
144    }
145    jcr = get_jcr_from_PyObject(self);
146
147    if (msg) {
148       Jmsg(jcr, M_INFO, 0, "%s", msg);
149    }
150    return Py_BuildValue("i", 1);
151 }
152
153 static PyObject *set_jcr_events(PyObject *self, PyObject *args)
154 {
155    PyObject *eObject;
156    JCR *jcr;
157    if (!PyArg_ParseTuple(args, "O:set_events_hook", &eObject)) {
158       return NULL;
159    }
160    Py_XINCREF(eObject);
161    jcr = get_jcr_from_PyObject(self);
162 // jcr->ff->bfd.pio.fc = find_method(eObject, close_method, "close");
163    Py_INCREF(Py_None);
164    return Py_None;
165 }
166
167 /* Write text to job output */
168 static PyObject *jcr_write(PyObject *self, PyObject *args)
169 {
170    char *text;
171    if (!PyArg_ParseTuple(args, "s:write", &text)) {
172       return NULL;
173    }
174    if (text) {
175       JCR *jcr = get_jcr_from_PyObject(self);
176       Jmsg(jcr, M_INFO, 0, "%s", text);
177    }
178         
179    Py_INCREF(Py_None);
180    return Py_None;
181 }
182
183 int generate_job_event(JCR *jcr, const char *event)
184 {
185 #ifdef implemented
186    PyEval_AcquireLock();
187
188    PyObject *result = PyObject_CallFunction(open_method, "s", "m.py");
189    if (result == NULL) {
190       PyErr_Print();
191       PyErr_Clear();
192    }
193    Py_XDECREF(result);
194
195    PyEval_ReleaseLock();
196 #endif
197    return 1;
198 }
199
200 #else
201
202 /* Dummy if Python not configured */
203 int generate_job_event(JCR *jcr, const char *event)
204 { return 1; }
205
206
207 #endif /* HAVE_PYTHON */