/* 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; }
/* * We are called here for each record that matches the above * SQL query -- that is for each file contained in the Catalog * that was not marked earlier. This means that the file in * question is a missing file (in the Catalog but not on Disk). */ static int missing_handler(void *ctx, int num_fields, char **row) { JCR *jcr = (JCR *)ctx; if (job_canceled(jcr)) { return 1; } if (!jcr->fn_printed) { Qmsg(jcr, M_WARNING, 0, _("The following files are in the Catalog but not on %s:\n"), jcr->get_JobLevel() == L_VERIFY_VOLUME_TO_CATALOG ? "the Volume(s)" : "disk"); jcr->fn_printed = true; } Qmsg(jcr, M_INFO, 0, " %s%s\n", row[0]?row[0]:"", row[1]?row[1]:""); return 0; }
/* * !!! WARNING !!! * * This function should be used ONLY after a fatal signal. We walk through the * JCR chain without doing any lock, bacula should not be running. */ void _dbg_print_jcr(FILE *fp) { char buf1[128], buf2[128], buf3[128], buf4[128]; if (!jcrs) { return; } fprintf(fp, "Attempt to dump current JCRs\n"); for (JCR *jcr = (JCR *)jcrs->first(); jcr ; jcr = (JCR *)jcrs->next(jcr)) { if (!jcr) { /* protect us against something ? */ continue; } fprintf(fp, "JCR=%p JobId=%i name=%s JobStatus=%c\n", jcr, jcr->JobId, jcr->Job, jcr->JobStatus); #ifdef HAVE_WIN32 fprintf(fp, "\tuse_count=%i\n", jcr->use_count()); #else fprintf(fp, "\tuse_count=%i threadid=0x%x\n", jcr->use_count(), (int)jcr->my_thread_id); #endif fprintf(fp, "\tJobType=%c JobLevel=%c\n", jcr->get_JobType(), jcr->get_JobLevel()); bstrftime(buf1, sizeof(buf1), jcr->sched_time); bstrftime(buf2, sizeof(buf2), jcr->start_time); bstrftime(buf3, sizeof(buf3), jcr->end_time); bstrftime(buf4, sizeof(buf4), jcr->wait_time); fprintf(fp, "\tsched_time=%s start_time=%s\n\tend_time=%s wait_time=%s\n", buf1, buf2, buf3, buf4); fprintf(fp, "\tdequeing=%i\n", jcr->dequeuing); fprintf(fp, "\tdb=%p db_batch=%p batch_started=%i\n", jcr->db, jcr->db_batch, jcr->batch_started); for(int i=0; i < dbg_jcr_handler_count; i++) { dbg_jcr_hook_t *fct = dbg_jcr_hooks[i]; fct(jcr, fp); } } }
/* 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->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); 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->get_JobLevel())); case 2: /* type */ return Py_BuildValue((char *)getvars[i].fmt, job_type_to_str(jcr->get_JobType())); 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()); 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: PyErr_SetString(PyExc_AttributeError, errmsg); return NULL; }