X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_output.c;h=55c308966a248eb8b62d1ced01e628b5b7e7eb65;hb=f1810901d8f179b90b31964664e73ae5f983d513;hp=9679a7d82fe560f631afc1b0a1f924d2ba971a75;hpb=fa93071721d8546d6e8599f906fbc3717516be45;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index 9679a7d82f..55c308966a 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2008 Free Software Foundation Europe e.V. + Copyright (C) 2000-2009 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. @@ -96,7 +96,29 @@ int gui_cmd(UAContext *ua, const char *cmd) return 1; } - +/* + * Enter with Resources locked + */ +static void show_disabled_jobs(UAContext *ua) +{ + JOB *job; + bool first = true; + foreach_res(job, R_JOB) { + if (!acl_access_ok(ua, Job_ACL, job->name())) { + continue; + } + if (!job->enabled) { + if (first) { + first = false; + ua->send_msg(_("Disabled Jobs:\n")); + } + ua->send_msg(" %s\n", job->name()); + } + } + if (first) { + ua->send_msg(_("No disabled Jobs.\n")); + } +} struct showstruct {const char *res_name; int type;}; static struct showstruct reses[] = { @@ -123,6 +145,7 @@ static struct showstruct reses[] = { * show all * show e.g. show directors * show = e.g. show director=HeadMan + * show disabled shows disabled jobs * */ int show_cmd(UAContext *ua, const char *cmd) @@ -137,6 +160,10 @@ int show_cmd(UAContext *ua, const char *cmd) LockRes(); for (i=1; iargc; i++) { + if (strcasecmp(ua->argk[i], _("disabled")) == 0) { + show_disabled_jobs(ua); + goto bail_out; + } type = 0; res_name = ua->argk[i]; if (!ua->argv[i]) { /* was a name given? */ @@ -212,6 +239,8 @@ bail_out: * list jobname=name - same as above * list jobmedia jobid= * list jobmedia job=name + * list joblog jobid= + * list joblog job=name * list files jobid= - list files saved for job nn * list files job=name * list pools - list pool records @@ -221,6 +250,7 @@ bail_out: * list clients - list clients * list nextvol job=xx - list the next vol to be used by job * list nextvolume job=xx - same as above. + * list copies jobid=x,y,z * */ @@ -317,7 +347,7 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) /* List JOBMEDIA */ } else if (strcasecmp(ua->argk[i], NT_("jobmedia")) == 0) { - int done = FALSE; + bool done = false; for (j=i+1; jargc; j++) { if (strcasecmp(ua->argk[j], NT_("ujobid")) == 0 && ua->argv[j]) { bstrncpy(jr.Job, ua->argv[j], MAX_NAME_LENGTH); @@ -330,13 +360,36 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) continue; } db_list_jobmedia_records(ua->jcr, ua->db, jobid, prtit, ua, llist); - done = TRUE; + done = true; } if (!done) { /* List for all jobs (jobid=0) */ db_list_jobmedia_records(ua->jcr, ua->db, 0, prtit, ua, llist); } + /* List JOBLOG */ + } else if (strcasecmp(ua->argk[i], NT_("joblog")) == 0) { + bool done = false; + for (j=i+1; jargc; j++) { + if (strcasecmp(ua->argk[j], NT_("ujobid")) == 0 && ua->argv[j]) { + bstrncpy(jr.Job, ua->argv[j], MAX_NAME_LENGTH); + jr.JobId = 0; + db_get_job_record(ua->jcr, ua->db, &jr); + jobid = jr.JobId; + } else if (strcasecmp(ua->argk[j], NT_("jobid")) == 0 && ua->argv[j]) { + jobid = str_to_int64(ua->argv[j]); + } else { + continue; + } + db_list_joblog_records(ua->jcr, ua->db, jobid, prtit, ua, llist); + done = true; + } + if (!done) { + /* List for all jobs (jobid=0) */ + db_list_joblog_records(ua->jcr, ua->db, 0, prtit, ua, llist); + } + + /* List POOLS */ } else if (strcasecmp(ua->argk[i], NT_("pool")) == 0 || strcasecmp(ua->argk[i], NT_("pools")) == 0) { @@ -429,6 +482,19 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) } } list_nextvol(ua, n); + } else if (strcasecmp(ua->argk[i], NT_("copies")) == 0) { + char *jobids = NULL; + uint32_t limit=0; + for (j=i+1; jargc; j++) { + if (strcasecmp(ua->argk[j], NT_("jobid")) == 0 && ua->argv[j]) { + if (is_a_number_list(ua->argv[j])) { + jobids = ua->argv[j]; + } + } else if (strcasecmp(ua->argk[j], NT_("limit")) == 0 && ua->argv[j]) { + limit = atoi(ua->argv[j]); + } + } + db_list_copies_records(ua->jcr,ua->db,limit,jobids,prtit,ua,llist); } else if (strcasecmp(ua->argk[i], NT_("limit")) == 0 || strcasecmp(ua->argk[i], NT_("days")) == 0) { /* Ignore it */ @@ -484,6 +550,7 @@ static bool list_nextvol(UAContext *ua, int ndays) mr.PoolId = jcr->jr.PoolId; get_job_storage(&store, job, run); mr.StorageId = store.store->StorageId; + /* no need to set ScratchPoolId, since we use fnv_no_create_vol */ if (!find_next_volume_for_append(jcr, &mr, 1, fnv_no_create_vol, fnv_prune)) { ua->error_msg(_("Could not find next Volume for Job %s (Pool=%s, Level=%s).\n"), job->name(), pr.Name, level_to_str(run->level));