/* Return Job variables */ PyObject *job_getattr(PyObject *self, char *attrname) { JCR *jcr; bool found = false; int i; char buf[10]; char errmsg[200]; Dmsg1(100, "In job_getattr=%s\n", attrname); jcr = get_jcr_from_PyObject(self); if (!jcr) { bstrncpy(errmsg, _("Job pointer not found."), sizeof(errmsg)); goto bail_out; } for (i=0; getvars[i].name; i++) { if (strcmp(getvars[i].name, attrname) == 0) { found = true; break; } } if (!found) { /* Try our methods */ return Py_FindMethod(JobMethods, self, attrname); } switch (i) { case 0: /* Job */ return Py_BuildValue((char *)getvars[i].fmt, jcr->job_name); /* Non-unique name */ case 1: /* SD's name */ return Py_BuildValue((char *)getvars[i].fmt, my_name); case 2: /* level */ return Py_BuildValue((char *)getvars[i].fmt, job_level_to_str(jcr->get_JobLevel())); case 3: /* type */ return Py_BuildValue((char *)getvars[i].fmt, job_type_to_str(jcr->get_JobType())); case 4: /* JobId */ return Py_BuildValue((char *)getvars[i].fmt, jcr->JobId); case 5: /* Client */ return Py_BuildValue((char *)getvars[i].fmt, jcr->client_name); case 6: /* Pool */ return Py_BuildValue((char *)getvars[i].fmt, jcr->dcr->pool_name); case 7: /* MediaType */ return Py_BuildValue((char *)getvars[i].fmt, jcr->dcr->media_type); case 8: /* JobName */ return Py_BuildValue((char *)getvars[i].fmt, jcr->Job); case 9: /* JobStatus */ buf[1] = 0; buf[0] = jcr->JobStatus; return Py_BuildValue((char *)getvars[i].fmt, buf); case 10: return Py_BuildValue((char *)getvars[i].fmt, jcr->dcr->VolumeName); case 11: return Py_BuildValue((char *)getvars[i].fmt, jcr->dcr->dev_name); } bsnprintf(errmsg, sizeof(errmsg), _("Attribute %s not found."), attrname); bail_out: PyErr_SetString(PyExc_AttributeError, errmsg); return NULL; }
int job_setattr(PyObject *self, char *attrname, PyObject *value) { JCR *jcr; bool found = false; char *strval = NULL; char buf[200]; char *errmsg; int i; Dmsg2(100, "In job_setattr=%s val=%p.\n", attrname, value); if (value == NULL) { /* Cannot delete variables */ bsnprintf(buf, sizeof(buf), _("Cannot delete attribute %s"), attrname); errmsg = buf; goto bail_out; } jcr = get_jcr_from_PyObject(self); if (!jcr) { errmsg = _("Job pointer not found."); goto bail_out; } /* Find attribute name in list */ for (i=0; setvars[i].name; i++) { if (strcmp(setvars[i].name, attrname) == 0) { found = true; break; } } if (!found) { goto not_found; } /* Get argument value ***FIXME*** handle other formats */ if (setvars[i].fmt != NULL) { if (!PyArg_Parse(value, (char *)setvars[i].fmt, &strval)) { PyErr_SetString(PyExc_TypeError, _("Read-only attribute")); return -1; } } switch (i) { case 0: /* JobReport */ Jmsg(jcr, M_INFO, 0, "%s", strval); return 0; } not_found: bsnprintf(buf, sizeof(buf), _("Cannot find attribute %s"), attrname); errmsg = buf; bail_out: PyErr_SetString(PyExc_AttributeError, errmsg); return -1; }
static PyObject *job_write(PyObject *self, PyObject *args) { char *text = NULL; if (!PyArg_ParseTuple(args, "s:write", &text)) { Dmsg0(000, "Parse tuple error in job_write\n"); return NULL; } if (text) { JCR *jcr = get_jcr_from_PyObject(self); Jmsg(jcr, M_INFO, 0, "%s", text); } Py_INCREF(Py_None); return Py_None; }
/* * Set pointer to instantiated events class */ static PyObject *set_job_events(PyObject *self, PyObject *arg) { PyObject *eObject; JCR *jcr; Dmsg0(100, "In set_job_events.\n"); if (!PyArg_ParseTuple(arg, "O:set_events", &eObject)) { Dmsg0(000, "Error in ParseTuple\n"); return NULL; } jcr = get_jcr_from_PyObject(self); Py_XDECREF((PyObject *)jcr->Python_events); Py_INCREF(eObject); jcr->Python_events = (void *)eObject; 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; }
/* Run a Bacula job */ static PyObject *job_run(PyObject *self, PyObject *arg) { JCR *jcr; char *item; int stat; if (!PyArg_ParseTuple(arg, "s:run", &item)) { Dmsg0(000, "Error in ParseTuple\n"); return NULL; } /* Release lock due to recursion */ // PyEval_ReleaseLock(); jcr = get_jcr_from_PyObject(self); UAContext *ua = new_ua_context(jcr); ua->batch = true; pm_strcpy(ua->cmd, item); /* copy command */ parse_ua_args(ua); /* parse command */ stat = run_cmd(ua, ua->cmd); free_ua_context(ua); // PyEval_AcquireLock(); return PyInt_FromLong((long)stat); }
/* Returns: 0 for OK * -1 for error */ int job_setattr(PyObject *self, char *attrname, PyObject *value) { JCR *jcr; bool found = false; char *strval = NULL; int intval = 0; int i; Dmsg2(100, "In job_setattr=%s val=%p.\n", attrname, value); if (value == NULL) { /* Cannot delete variables */ goto bail_out; } jcr = get_jcr_from_PyObject(self); if (!jcr) { goto bail_out; } /* Find attribute name in list */ for (i=0; setvars[i].name; i++) { if (strcmp(setvars[i].name, attrname) == 0) { found = true; break; } } if (!found) { goto bail_out; } /* Get argument value */ if (setvars[i].fmt != NULL) { switch (setvars[i].fmt[0]) { case 's': 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, (char *)setvars[i].fmt, &intval)) { PyErr_SetString(PyExc_TypeError, _("Read-only attribute")); return -1; } break; } } switch (i) { case 0: /* JobReport */ Jmsg(jcr, M_INFO, 0, "%s", strval); return 0; case 1: /* VolumeName */ /* Make sure VolumeName is valid and we are in VolumeName event */ if (strcmp("NewVolume", jcr->event) == 0 && is_volume_name_legal(NULL, strval)) { pm_strcpy(jcr->VolumeName, strval); Dmsg1(100, "Set Vol=%s\n", strval); return 0; } else { jcr->VolumeName[0] = 0; } break; case 2: /* Priority */ Dmsg1(000, "Set priority=%d\n", intval); 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; } if (strval != NULL) { for (i=0; joblevels[i].level_name; i++) { if (strcmp(strval, joblevels[i].level_name) == 0) { if (joblevels[i].job_type == jcr->getJobType()) { jcr->setJobLevel(joblevels[i].level); jcr->jr.JobLevel = jcr->getJobLevel(); return 0; } } } } PyErr_SetString(PyExc_ValueError, _("Bad JobLevel string")); return -1; } bail_out: PyErr_SetString(PyExc_AttributeError, attrname); return -1; }
/* Returns: NULL if error * PyObject * return value if OK */ PyObject *job_getattr(PyObject *self, char *attrname) { JCR *jcr; bool found = false; int i; char buf[10]; char errmsg[200]; Dmsg0(100, "In job_getattr.\n"); jcr = get_jcr_from_PyObject(self); if (!jcr) { bstrncpy(errmsg, _("Job pointer not found."), sizeof(errmsg)); goto bail_out; } for (i=0; getvars[i].name; i++) { if (strcmp(getvars[i].name, attrname) == 0) { found = true; break; } } if (!found) { /* Try our methods */ return Py_FindMethod(JobMethods, self, attrname); } switch (i) { case 0: /* Job */ return Py_BuildValue((char *)getvars[i].fmt, jcr->job->hdr.name); case 1: /* level */ return Py_BuildValue((char *)getvars[i].fmt, job_level_to_str(jcr->getJobLevel())); case 2: /* type */ return Py_BuildValue((char *)getvars[i].fmt, job_type_to_str(jcr->getJobType())); case 3: /* JobId */ return Py_BuildValue((char *)getvars[i].fmt, jcr->JobId); case 4: /* Client */ 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((char *)getvars[i].fmt, jcr->NumVols); } else { bsnprintf(errmsg, sizeof(errmsg), _("Pool record not found.")); goto bail_out; } case 6: /* Pool */ return Py_BuildValue((char *)getvars[i].fmt, jcr->pool->name()); case 7: /* Storage */ 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((char *)getvars[i].fmt, jcr->catalog->name()); case 9: /* MediaType */ 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((char *)getvars[i].fmt, jcr->Job); case 11: /* JobStatus */ buf[1] = 0; buf[0] = jcr->JobStatus; return Py_BuildValue((char *)getvars[i].fmt, buf); case 12: /* Priority */ return Py_BuildValue((char *)getvars[i].fmt, jcr->JobPriority); case 13: return Py_BuildValue((char *)getvars[i].fmt, jcr->VolumeName); case 14: /* CatalogRes */ 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, db_get_type(jcr->db)); 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 20: /* 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: PyErr_SetString(PyExc_AttributeError, errmsg); return NULL; }