X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fpythondir.c;h=5893be1d784425f1e7b7bdd31ebf02ed4ab8065a;hb=fce6a648a27ee86f6941a5085ec7909f6d43e725;hp=a3452fd1159475e3e44230e2cf852f4c67053b05;hpb=057b39a9f57bdc65a6d6f6f84cf3d56fe5ec03ca;p=bacula%2Fbacula diff --git a/bacula/src/dird/pythondir.c b/bacula/src/dird/pythondir.c index a3452fd115..5893be1d78 100644 --- a/bacula/src/dird/pythondir.c +++ b/bacula/src/dird/pythondir.c @@ -7,24 +7,18 @@ * 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 as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. + 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 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., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + the file LICENSE for additional details. */ @@ -35,6 +29,7 @@ #undef _POSIX_C_SOURCE #include +extern char *configfile; extern JCR *get_jcr_from_PyObject(PyObject *self); extern PyObject *find_method(PyObject *eventsObject, PyObject *method, const char *name); @@ -43,11 +38,15 @@ extern PyObject *find_method(PyObject *eventsObject, PyObject *method, static PyObject *set_job_events(PyObject *self, PyObject *arg); static PyObject *job_run(PyObject *self, PyObject *arg); static PyObject *job_write(PyObject *self, PyObject *arg); +static PyObject *job_cancel(PyObject *self, PyObject *arg); +static PyObject *job_does_vol_exist(PyObject *self, PyObject *arg); PyMethodDef JobMethods[] = { {"set_events", set_job_events, METH_VARARGS, "Set Job events"}, {"run", job_run, METH_VARARGS, "Run a Job"}, {"write", job_write, METH_VARARGS, "Write to output"}, + {"cancel", job_cancel, METH_VARARGS, "Cancel a Job"}, + {"DoesVolumeExist", job_does_vol_exist, METH_VARARGS, "Does Volume Exist"}, {NULL, NULL, 0, NULL} /* last item */ }; @@ -60,7 +59,6 @@ struct s_vars { /* Read-only variables */ static struct s_vars getvars[] = { { N_("Job"), "s"}, - { N_("DirName"), "s"}, { N_("Level"), "s"}, { N_("Type"), "s"}, { N_("JobId"), "i"}, @@ -73,6 +71,7 @@ static struct s_vars getvars[] = { { N_("JobName"), "s"}, { N_("JobStatus"), "s"}, { N_("Priority"), "i"}, + { N_("CatalogRes"), "(sssssis)"}, { NULL, NULL} }; @@ -102,7 +101,7 @@ PyObject *job_getattr(PyObject *self, char *attrname) Dmsg0(100, "In job_getattr.\n"); jcr = get_jcr_from_PyObject(self); if (!jcr) { - bstrncpy(errmsg, "Job pointer not found.", sizeof(errmsg)); + bstrncpy(errmsg, _("Job pointer not found."), sizeof(errmsg)); goto bail_out; } for (i=0; getvars[i].name; i++) { @@ -118,36 +117,50 @@ PyObject *job_getattr(PyObject *self, char *attrname) switch (i) { case 0: /* Job */ return Py_BuildValue(getvars[i].fmt, jcr->job->hdr.name); - case 1: /* Director's name */ - return Py_BuildValue(getvars[i].fmt, my_name); - case 2: /* level */ + case 1: /* level */ return Py_BuildValue(getvars[i].fmt, job_level_to_str(jcr->JobLevel)); - case 3: /* type */ + case 2: /* type */ return Py_BuildValue(getvars[i].fmt, job_type_to_str(jcr->JobType)); - case 4: /* JobId */ + case 3: /* JobId */ return Py_BuildValue(getvars[i].fmt, jcr->JobId); - case 5: /* Client */ + case 4: /* Client */ return Py_BuildValue(getvars[i].fmt, jcr->client->hdr.name); - case 6: /* NumVols */ - return Py_BuildValue(getvars[i].fmt, jcr->NumVols); - case 7: /* Pool */ + 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); + } 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); - case 8: /* Storage */ + case 7: /* Storage */ return Py_BuildValue(getvars[i].fmt, jcr->store->hdr.name); - case 9: + case 8: return Py_BuildValue(getvars[i].fmt, jcr->catalog->hdr.name); - case 10: /* MediaType */ + case 9: /* MediaType */ return Py_BuildValue(getvars[i].fmt, jcr->store->media_type); - case 11: /* JobName */ + case 10: /* JobName */ return Py_BuildValue(getvars[i].fmt, jcr->Job); - case 12: /* JobStatus */ + case 11: /* JobStatus */ buf[1] = 0; buf[0] = jcr->JobStatus; return Py_BuildValue(getvars[i].fmt, buf); - case 13: /* Priority */ + case 12: /* Priority */ return Py_BuildValue(getvars[i].fmt, jcr->JobPriority); + case 13: /* CatalogRes */ + return Py_BuildValue(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); + } - bsnprintf(errmsg, sizeof(errmsg), "Attribute %s not found.", attrname); + bsnprintf(errmsg, sizeof(errmsg), _("Attribute %s not found."), attrname); bail_out: PyErr_SetString(PyExc_AttributeError, errmsg); return NULL; @@ -190,13 +203,13 @@ int job_setattr(PyObject *self, char *attrname, PyObject *value) switch (setvars[i].fmt[0]) { case 's': if (!PyArg_Parse(value, setvars[i].fmt, &strval)) { - PyErr_SetString(PyExc_TypeError, "Read-only attribute"); + PyErr_SetString(PyExc_TypeError, _("Read-only attribute")); return -1; } break; case 'i': if (!PyArg_Parse(value, setvars[i].fmt, &intval)) { - PyErr_SetString(PyExc_TypeError, "Read-only attribute"); + PyErr_SetString(PyExc_TypeError, _("Read-only attribute")); return -1; } break; @@ -278,13 +291,73 @@ static PyObject *job_write(PyObject *self, PyObject *args) return NULL; } if (text) { - Jmsg(NULL, M_INFO, 0, "%s", text); + JCR *jcr = get_jcr_from_PyObject(self); + Jmsg(jcr, M_INFO, 0, "%s", text); + } + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject *job_does_vol_exist(PyObject *self, PyObject *args) +{ + char *VolName = NULL; + + if (!PyArg_ParseTuple(args, "s:does_volume_exist", &VolName)) { + Dmsg0(000, "Parse tuple error in job_does_vol_exist\n"); + return NULL; + } + if (VolName) { + MEDIA_DBR mr; + int ok; + JCR *jcr = get_jcr_from_PyObject(self); + memset(&mr, 0, sizeof(mr)); + bstrncpy(mr.VolumeName, VolName, sizeof(mr.VolumeName)); + ok = db_get_media_record(jcr, jcr->db, &mr); + return Py_BuildValue("i", ok); } Py_INCREF(Py_None); return Py_None; } +static PyObject *job_cancel(PyObject *self, PyObject *args) +{ + JobId_t JobId = 0; + JCR *jcr; + bool found = false; + + if (!PyArg_ParseTuple(args, "i:cancel", &JobId)) { + Dmsg0(000, "Parse tuple error in job_write\n"); + return NULL; + } + foreach_jcr(jcr) { + if (jcr->JobId == 0) { + free_jcr(jcr); + continue; + } + if (jcr->JobId == JobId) { + found = true; + break; + } + } + if (!found) { + /* ***FIXME*** raise exception */ + return NULL; + } + PyEval_ReleaseLock(); + UAContext *ua = new_ua_context(jcr); + ua->batch = true; + if (!cancel_job(ua, jcr)) { + /* ***FIXME*** raise exception */ + return NULL; + } + free_ua_context(ua); + free_jcr(jcr); + PyEval_AcquireLock(); + Py_INCREF(Py_None); + return Py_None; +} + /* * Generate a Job event, which means look up the event * method defined by the user, and if it exists,