]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/python.c
- Integrated TLS network encryption
[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, 
40          const char *name);
41
42 static PyObject *jcr_get(PyObject *self, PyObject *args);
43 static PyObject *jcr_write(PyObject *self, PyObject *args);
44 static PyObject *jcr_set(PyObject *self, PyObject *args, PyObject *keyw);
45 static PyObject *set_jcr_events(PyObject *self, PyObject *args);
46
47
48 /* Define Job entry points */
49 PyMethodDef JobMethods[] = {
50     {"get", jcr_get, METH_VARARGS, "Get Job variables."},
51     {"set", (PyCFunction)jcr_set, METH_VARARGS|METH_KEYWORDS,
52         "Set Job variables."},
53     {"set_events", set_jcr_events, METH_VARARGS, "Define Job events."},
54     {"write", jcr_write, METH_VARARGS, "Write output."},
55     {NULL, NULL, 0, NULL}             /* last item */
56 };
57
58
59 struct s_vars {
60    const char *name;
61    char *fmt;
62 };
63
64 static struct s_vars vars[] = {
65    { N_("Job"),        "s"},          /* 0 */
66    { N_("SDName"),     "s"},          /* 1 */
67    { N_("Level"),      "s"},          /* 2 */
68    { N_("Type"),       "s"},          /* 3 */
69    { N_("JobId"),      "i"},          /* 4 */
70    { N_("Client"),     "s"},          /* 5 */
71    { N_("Pool"),       "s"},          /* 6 */
72    { N_("MediaType"),  "s"},          /* 7 */
73    { N_("JobName"),    "s"},          /* 8 */
74    { N_("JobStatus"),  "s"},          /* 9 */
75    { N_("VolumeName"), "s"},          /* 10 */
76    { N_("Device"),     "s"},          /* 11 */
77
78    { NULL,             NULL}
79 };
80
81 /* Return Job variables */
82 PyObject *jcr_get(PyObject *self, PyObject *args)
83 {
84    JCR *jcr;
85    char *item;
86    bool found = false;
87    int i;
88    char buf[10];
89    
90    if (!PyArg_ParseTuple(args, "s:get", &item)) {
91       return NULL;
92    }
93    jcr = get_jcr_from_PyObject(self);
94
95    for (i=0; vars[i].name; i++) {
96       if (strcmp(vars[i].name, item) == 0) {
97          found = true;
98          break;
99       }
100    }
101    if (!found) {
102       return NULL;
103    }
104    switch (i) {
105    case 0:                            /* Job */
106       return Py_BuildValue(vars[i].fmt, jcr->job_name);    /* Non-unique name */
107    case 1:                            /* SD's name */
108       return Py_BuildValue(vars[i].fmt, my_name);
109    case 2:                            /* level */
110       return Py_BuildValue(vars[i].fmt, job_level_to_str(jcr->JobLevel));
111    case 3:                            /* type */
112       return Py_BuildValue(vars[i].fmt, job_type_to_str(jcr->JobType));
113    case 4:                            /* JobId */
114       return Py_BuildValue(vars[i].fmt, jcr->JobId);
115    case 5:                            /* Client */
116       return Py_BuildValue(vars[i].fmt, jcr->client_name);
117    case 6:                            /* Pool */
118       return Py_BuildValue(vars[i].fmt, jcr->dcr->pool_name);
119    case 7:                            /* MediaType */
120       return Py_BuildValue(vars[i].fmt, jcr->dcr->media_type);
121    case 8:                            /* JobName */
122       return Py_BuildValue(vars[i].fmt, jcr->Job);
123    case 9:                            /* JobStatus */
124       buf[1] = 0;
125       buf[0] = jcr->JobStatus;
126       return Py_BuildValue(vars[i].fmt, buf);
127    case 10:
128       return Py_BuildValue(vars[i].fmt, jcr->dcr->VolumeName);
129    case 11:
130       return Py_BuildValue(vars[i].fmt, jcr->dcr->dev_name);
131    }
132    return NULL;
133 }
134
135 /* Set Job variables */
136 PyObject *jcr_set(PyObject *self, PyObject *args, PyObject *keyw)
137 {
138    JCR *jcr;
139    char *msg = NULL;
140    static char *kwlist[] = {"JobReport", NULL};
141    
142    if (!PyArg_ParseTupleAndKeywords(args, keyw, "|s:set", kwlist,
143         &msg)) {
144       return NULL;
145    }
146    jcr = get_jcr_from_PyObject(self);
147
148    if (msg) {
149       Jmsg(jcr, M_INFO, 0, "%s", msg);
150    }
151    return Py_BuildValue("i", 1);
152 }
153
154 static PyObject *set_jcr_events(PyObject *self, PyObject *args)
155 {
156    PyObject *eObject;
157    JCR *jcr;
158    if (!PyArg_ParseTuple(args, "O:set_events_hook", &eObject)) {
159       return NULL;
160    }
161    Py_XINCREF(eObject);
162    jcr = get_jcr_from_PyObject(self);
163 // jcr->ff->bfd.pio.fc = find_method(eObject, close_method, "close");
164    Py_INCREF(Py_None);
165    return Py_None;
166 }
167
168 /* Write text to job output */
169 static PyObject *jcr_write(PyObject *self, PyObject *args)
170 {
171    char *text;
172    if (!PyArg_ParseTuple(args, "s:write", &text)) {
173       return NULL;
174    }
175    if (text) {
176       JCR *jcr = get_jcr_from_PyObject(self);
177       Jmsg(jcr, M_INFO, 0, "%s", text);
178    }
179         
180    Py_INCREF(Py_None);
181    return Py_None;
182 }
183
184 int generate_job_event(JCR *jcr, const char *event)
185 {
186 #ifdef implemented
187    PyEval_AcquireLock();
188
189    PyObject *result = PyObject_CallFunction(open_method, "s", "m.py");
190    if (result == NULL) {
191       PyErr_Print();
192       PyErr_Clear();
193    }
194    Py_XDECREF(result);
195
196    PyEval_ReleaseLock();
197 #endif
198    return 1;
199 }
200
201 bool python_set_prog(JCR*, char const*) { return false; }
202
203 #else
204
205 /* Dummy if Python not configured */
206 int generate_job_event(JCR *jcr, const char *event)
207 { return 1; }
208
209
210 #endif /* HAVE_PYTHON */