X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=bacula%2Fsrc%2Fdird%2Fpythondir.c;h=a6c517662957cb1b9828fab09f42ebc680db0916;hb=4945ff13c438769e0f6a2b97a9d5c6467d696374;hp=c47ba6a464478cb3b29ef0141c7e42a7bdc10215;hpb=5ce94febc8de1443c5f1ec11f6551e5a764286b7;p=bacula%2Fbacula diff --git a/bacula/src/dird/pythondir.c b/bacula/src/dird/pythondir.c index c47ba6a464..a6c5176629 100644 --- a/bacula/src/dird/pythondir.c +++ b/bacula/src/dird/pythondir.c @@ -1,3 +1,30 @@ +/* + Bacula® - The Network Backup Solution + + Copyright (C) 2004-2008 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ /* * * Bacula interface to Python for the Director @@ -7,20 +34,6 @@ * Version $Id$ * */ -/* - Copyright (C) 2004-2005 Kern Sibbald - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as amended with additional clauses defined in the - file LICENSE in the main source directory. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - the file LICENSE for additional details. - - */ #include "bacula.h" #include "dird.h" @@ -30,6 +43,7 @@ #include extern char *configfile; +extern struct s_jl joblevels[]; extern JCR *get_jcr_from_PyObject(PyObject *self); extern PyObject *find_method(PyObject *eventsObject, PyObject *method, const char *name); @@ -53,7 +67,7 @@ PyMethodDef JobMethods[] = { struct s_vars { const char *name; - char *fmt; + const char *fmt; }; /* Read-only variables */ @@ -73,6 +87,12 @@ static struct s_vars getvars[] = { { "Priority", "i"}, { "VolumeName", "s"}, { "CatalogRes", "(sssssis)"}, + { "JobErrors", "i"}, + { "JobFiles", "i"}, + { "SDJobFiles", "i"}, + { "SDErrors", "i"}, + { "FDJobStatus","s"}, + { "SDJobStatus","s"}, { NULL, NULL} }; @@ -82,6 +102,7 @@ static struct s_vars setvars[] = { { "JobReport", "s"}, { "VolumeName", "s"}, { "Priority", "i"}, + { "JobLevel", "s"}, { NULL, NULL} }; @@ -117,51 +138,78 @@ PyObject *job_getattr(PyObject *self, char *attrname) } switch (i) { case 0: /* Job */ - return Py_BuildValue(getvars[i].fmt, jcr->job->hdr.name); + return Py_BuildValue((char *)getvars[i].fmt, jcr->job->hdr.name); case 1: /* level */ - return Py_BuildValue(getvars[i].fmt, job_level_to_str(jcr->JobLevel)); + return Py_BuildValue((char *)getvars[i].fmt, job_level_to_str(jcr->get_JobLevel())); case 2: /* type */ - return Py_BuildValue(getvars[i].fmt, job_type_to_str(jcr->JobType)); + return Py_BuildValue((char *)getvars[i].fmt, job_type_to_str(jcr->get_JobType())); case 3: /* JobId */ - return Py_BuildValue(getvars[i].fmt, jcr->JobId); + return Py_BuildValue((char *)getvars[i].fmt, jcr->JobId); case 4: /* Client */ - return Py_BuildValue(getvars[i].fmt, jcr->client->hdr.name); + return Py_BuildValue((char *)getvars[i].fmt, jcr->client->hdr.name); case 5: /* NumVols */ POOL_DBR pr; memset(&pr, 0, sizeof(pr)); bstrncpy(pr.Name, jcr->pool->hdr.name, sizeof(pr.Name)); if (db_get_pool_record(jcr, jcr->db, &pr)) { jcr->NumVols = pr.NumVols; - return Py_BuildValue(getvars[i].fmt, jcr->NumVols); + return Py_BuildValue((char *)getvars[i].fmt, jcr->NumVols); } else { bsnprintf(errmsg, sizeof(errmsg), _("Pool record not found.")); goto bail_out; } case 6: /* Pool */ - return Py_BuildValue(getvars[i].fmt, jcr->pool->hdr.name); + return Py_BuildValue((char *)getvars[i].fmt, jcr->pool->name()); case 7: /* Storage */ - return Py_BuildValue(getvars[i].fmt, jcr->store->hdr.name); + if (jcr->wstore) { + return Py_BuildValue((char *)getvars[i].fmt, jcr->wstore->name()); + } else if (jcr->rstore) { + return Py_BuildValue((char *)getvars[i].fmt, jcr->rstore->name()); + } else { + goto bail_out; + } case 8: - return Py_BuildValue(getvars[i].fmt, jcr->catalog->hdr.name); + return Py_BuildValue((char *)getvars[i].fmt, jcr->catalog->name()); case 9: /* MediaType */ - return Py_BuildValue(getvars[i].fmt, jcr->store->media_type); + if (jcr->wstore) { + return Py_BuildValue((char *)getvars[i].fmt, jcr->wstore->media_type); + } else if (jcr->rstore) { + return Py_BuildValue((char *)getvars[i].fmt, jcr->rstore->media_type); + } else { + goto bail_out; + } case 10: /* JobName */ - return Py_BuildValue(getvars[i].fmt, jcr->Job); + return Py_BuildValue((char *)getvars[i].fmt, jcr->Job); case 11: /* JobStatus */ buf[1] = 0; buf[0] = jcr->JobStatus; - return Py_BuildValue(getvars[i].fmt, buf); + return Py_BuildValue((char *)getvars[i].fmt, buf); case 12: /* Priority */ - return Py_BuildValue(getvars[i].fmt, jcr->JobPriority); + return Py_BuildValue((char *)getvars[i].fmt, jcr->JobPriority); case 13: - return Py_BuildValue(getvars[i].fmt, jcr->VolumeName); + return Py_BuildValue((char *)getvars[i].fmt, jcr->VolumeName); case 14: /* CatalogRes */ - return Py_BuildValue(getvars[i].fmt, + return Py_BuildValue((char *)getvars[i].fmt, jcr->catalog->db_name, jcr->catalog->db_address, jcr->catalog->db_user, jcr->catalog->db_password, jcr->catalog->db_socket, jcr->catalog->db_port, - catalog_db); - + db_get_type()); + case 15: /* JobErrors */ + return Py_BuildValue((char *)getvars[i].fmt, jcr->JobErrors); + case 16: /* JobFiles */ + return Py_BuildValue((char *)getvars[i].fmt, jcr->JobFiles); + case 17: /* SDJobFiles */ + return Py_BuildValue((char *)getvars[i].fmt, jcr->SDJobFiles); + case 18: /* SDErrors */ + return Py_BuildValue((char *)getvars[i].fmt, jcr->SDErrors); + case 19: /* FDJobStatus */ + buf[1] = 0; + buf[0] = jcr->FDJobStatus; + return Py_BuildValue((char *)getvars[i].fmt, buf); + case 29: /* SDJobStatus */ + buf[1] = 0; + buf[0] = jcr->SDJobStatus; + return Py_BuildValue((char *)getvars[i].fmt, buf); } bsnprintf(errmsg, sizeof(errmsg), _("Attribute %s not found."), attrname); bail_out: @@ -205,13 +253,13 @@ int job_setattr(PyObject *self, char *attrname, PyObject *value) if (setvars[i].fmt != NULL) { switch (setvars[i].fmt[0]) { case 's': - if (!PyArg_Parse(value, setvars[i].fmt, &strval)) { + if (!PyArg_Parse(value, (char *)setvars[i].fmt, &strval)) { PyErr_SetString(PyExc_TypeError, _("Read-only attribute")); return -1; } break; case 'i': - if (!PyArg_Parse(value, setvars[i].fmt, &intval)) { + if (!PyArg_Parse(value, (char *)setvars[i].fmt, &intval)) { PyErr_SetString(PyExc_TypeError, _("Read-only attribute")); return -1; } @@ -235,7 +283,28 @@ int job_setattr(PyObject *self, char *attrname, PyObject *value) break; case 2: /* Priority */ Dmsg1(000, "Set priority=%d\n", intval); - return 0; + if (intval >= 1 && intval <= 100) { + jcr->JobPriority = intval; + } else { + PyErr_SetString(PyExc_ValueError, _("Priority must be 1-100")); + return -1; + } + case 3: /* Job Level */ + if (strcmp("JobInit", jcr->event) != 0) { + PyErr_SetString(PyExc_RuntimeError, _("Job Level can be set only during JobInit")); + return -1; + } + for (i=0; joblevels[i].level_name; i++) { + if (strcmp(strval, joblevels[i].level_name) == 0) { + if (joblevels[i].job_type == jcr->get_JobType()) { + jcr->set_JobLevel(joblevels[i].level); + jcr->jr.JobLevel = jcr->get_JobLevel(); + return 0; + } + } + } + PyErr_SetString(PyExc_ValueError, _("Bad JobLevel string")); + return -1; } bail_out: PyErr_SetString(PyExc_AttributeError, attrname); @@ -275,7 +344,7 @@ static PyObject *job_run(PyObject *self, PyObject *arg) return NULL; } /* Release lock due to recursion */ - PyEval_ReleaseLock(); +// PyEval_ReleaseLock(); jcr = get_jcr_from_PyObject(self); UAContext *ua = new_ua_context(jcr); ua->batch = true; @@ -283,7 +352,7 @@ static PyObject *job_run(PyObject *self, PyObject *arg) parse_ua_args(ua); /* parse command */ stat = run_cmd(ua, ua->cmd); free_ua_context(ua); - PyEval_AcquireLock(); +// PyEval_AcquireLock(); return PyInt_FromLong((long)stat); } @@ -337,7 +406,6 @@ static PyObject *job_cancel(PyObject *self, PyObject *args) } foreach_jcr(jcr) { if (jcr->JobId == 0) { - free_jcr(jcr); continue; } if (jcr->JobId == JobId) { @@ -345,11 +413,13 @@ static PyObject *job_cancel(PyObject *self, PyObject *args) break; } } + /* endeach_jcr(jcr) not needed because freed below */ + if (!found) { /* ***FIXME*** raise exception */ return NULL; } - PyEval_ReleaseLock(); +// PyEval_ReleaseLock(); UAContext *ua = new_ua_context(jcr); ua->batch = true; if (!cancel_job(ua, jcr)) { @@ -358,7 +428,7 @@ static PyObject *job_cancel(PyObject *self, PyObject *args) } free_ua_context(ua); free_jcr(jcr); - PyEval_AcquireLock(); +// PyEval_AcquireLock(); Py_INCREF(Py_None); return Py_None; } @@ -380,7 +450,8 @@ int generate_job_event(JCR *jcr, const char *event) return 0; } - PyEval_AcquireLock(); + lock_python(); +// PyEval_AcquireLock(); method = find_method(events, method, event); if (!method) { @@ -388,7 +459,7 @@ int generate_job_event(JCR *jcr, const char *event) } bstrncpy(jcr->event, event, sizeof(jcr->event)); - result = PyObject_CallFunction(method, "O", Job); + result = PyObject_CallFunction(method, (char *)"O", Job); jcr->event[0] = 0; /* no event in progress */ if (result == NULL) { if (PyErr_Occurred()) { @@ -401,7 +472,8 @@ int generate_job_event(JCR *jcr, const char *event) Py_XDECREF(result); bail_out: - PyEval_ReleaseLock(); + unlock_python(); +// PyEval_ReleaseLock(); return stat; }