X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_status.c;h=81bf553ade9cacbd30cd0532f9bbbb89ec3b5d6c;hb=495460e08127544c76c0037fe252c40308dbab15;hp=2b5a12216980d57a7707d337889c31c9221eee90;hpb=33515837ee3f80f157ee04c423020b2de8827782;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_status.c b/bacula/src/dird/ua_status.c index 2b5a122169..81bf553ade 100644 --- a/bacula/src/dird/ua_status.c +++ b/bacula/src/dird/ua_status.c @@ -43,10 +43,11 @@ extern void *start_heap; static void list_scheduled_jobs(UAContext *ua); static void list_running_jobs(UAContext *ua); static void list_terminated_jobs(UAContext *ua); -static void do_storage_status(UAContext *ua, STORE *store); -static void do_client_status(UAContext *ua, CLIENT *client); +static void do_storage_status(UAContext *ua, STORE *store, char *cmd); +static void do_client_status(UAContext *ua, CLIENT *client, char *cmd); static void do_director_status(UAContext *ua); static void do_all_status(UAContext *ua); +void status_slots(UAContext *ua, STORE *store); static char OKqstatus[] = "1000 OK .status\n"; static char DotStatusJob[] = "JobId=%s JobStatus=%c JobErrors=%d\n"; @@ -57,43 +58,61 @@ static char DotStatusJob[] = "JobId=%s JobStatus=%c JobErrors=%d\n"; bool dot_status_cmd(UAContext *ua, const char *cmd) { + STORE *store; + CLIENT *client; JCR* njcr = NULL; s_last_job* job; char ed1[50]; - Dmsg1(20, "status:%s:\n", cmd); + Dmsg2(20, "status=\"%s\" argc=%d\n", cmd, ua->argc); - if ((ua->argc != 3) || (strcasecmp(ua->argk[1], "dir"))) { + if (ua->argc < 3) { ua->send_msg("1900 Bad .status command, missing arguments.\n"); return false; } - if (strcasecmp(ua->argk[2], "current") == 0) { - ua->send_msg(OKqstatus, ua->argk[2]); - foreach_jcr(njcr) { - if (njcr->JobId != 0 && acl_access_ok(ua, Job_ACL, njcr->job->name())) { - ua->send_msg(DotStatusJob, edit_int64(njcr->JobId, ed1), - njcr->JobStatus, njcr->JobErrors); + if (strcasecmp(ua->argk[1], "dir") == 0) { + if (strcasecmp(ua->argk[2], "current") == 0) { + ua->send_msg(OKqstatus, ua->argk[2]); + foreach_jcr(njcr) { + if (njcr->JobId != 0 && acl_access_ok(ua, Job_ACL, njcr->job->name())) { + ua->send_msg(DotStatusJob, edit_int64(njcr->JobId, ed1), + njcr->JobStatus, njcr->JobErrors); + } } - } - endeach_jcr(njcr); - } else if (strcasecmp(ua->argk[2], "last") == 0) { - ua->send_msg(OKqstatus, ua->argk[2]); - if ((last_jobs) && (last_jobs->size() > 0)) { - job = (s_last_job*)last_jobs->last(); - if (acl_access_ok(ua, Job_ACL, job->Job)) { - ua->send_msg(DotStatusJob, edit_int64(job->JobId, ed1), - job->JobStatus, job->Errors); + endeach_jcr(njcr); + } else if (strcasecmp(ua->argk[2], "last") == 0) { + ua->send_msg(OKqstatus, ua->argk[2]); + if ((last_jobs) && (last_jobs->size() > 0)) { + job = (s_last_job*)last_jobs->last(); + if (acl_access_ok(ua, Job_ACL, job->Job)) { + ua->send_msg(DotStatusJob, edit_int64(job->JobId, ed1), + job->JobStatus, job->Errors); + } } + } else if (strcasecmp(ua->argk[2], "header") == 0) { + list_dir_status_header(ua); + } else if (strcasecmp(ua->argk[2], "scheduled") == 0) { + list_scheduled_jobs(ua); + } else if (strcasecmp(ua->argk[2], "running") == 0) { + list_running_jobs(ua); + } else if (strcasecmp(ua->argk[2], "terminated") == 0) { + list_terminated_jobs(ua); + } else { + ua->send_msg("1900 Bad .status command, wrong argument.\n"); + return false; + } + } else if (strcasecmp(ua->argk[1], "client") == 0) { + client = get_client_resource(ua); + if (client) { + Dmsg2(200, "Client=%s arg=%s\n", client->name(), NPRT(ua->argk[2])); + do_client_status(ua, client, ua->argk[2]); + } + } else if (strcasecmp(ua->argk[1], "storage") == 0) { + store = get_storage_resource(ua, false /*no default*/); + if (store) { + do_storage_status(ua, store, ua->argk[2]); } - } else if (strcasecmp(ua->argk[2], "header") == 0) { - list_dir_status_header(ua); - } else if (strcasecmp(ua->argk[2], "scheduled") == 0) { - list_scheduled_jobs(ua); - } else if (strcasecmp(ua->argk[2], "running") == 0) { - list_running_jobs(ua); - } else if (strcasecmp(ua->argk[2], "terminated") == 0) { - list_terminated_jobs(ua); } else { ua->send_msg("1900 Bad .status command, wrong argument.\n"); return false; @@ -133,13 +152,17 @@ int status_cmd(UAContext *ua, const char *cmd) } else if (strcasecmp(ua->argk[i], NT_("client")) == 0) { client = get_client_resource(ua); if (client) { - do_client_status(ua, client); + do_client_status(ua, client, NULL); } return 1; } else { store = get_storage_resource(ua, false/*no default*/); if (store) { - do_storage_status(ua, store); + if (find_arg(ua, NT_("slots")) > 0) { + status_slots(ua, store); + } else { + do_storage_status(ua, store, NULL); + } } return 1; } @@ -165,13 +188,13 @@ int status_cmd(UAContext *ua, const char *cmd) case 1: store = select_storage_resource(ua); if (store) { - do_storage_status(ua, store); + do_storage_status(ua, store, NULL); } break; case 2: client = select_client_resource(ua); if (client) { - do_client_status(ua, client); + do_client_status(ua, client, NULL); } break; case 3: @@ -223,7 +246,7 @@ static void do_all_status(UAContext *ua) /* Call each unique Storage daemon */ for (j=0; jsend_msg("====\n"); } -static void do_storage_status(UAContext *ua, STORE *store) +static void do_storage_status(UAContext *ua, STORE *store, char *cmd) { BSOCK *sd; USTORE lstore; @@ -316,7 +339,7 @@ static void do_storage_status(UAContext *ua, STORE *store) pm_strcpy(lstore.store_source, _("unknown source")); set_wstorage(ua->jcr, &lstore); /* Try connecting for up to 15 seconds */ - ua->send_msg(_("Connecting to Storage daemon %s at %s:%d\n"), + if (!ua->api) ua->send_msg(_("Connecting to Storage daemon %s at %s:%d\n"), store->name(), store->address, store->SDport); if (!connect_to_storage_daemon(ua->jcr, 1, 15, 0)) { ua->send_msg(_("\nFailed to connect to Storage daemon %s.\n====\n"), @@ -329,17 +352,21 @@ static void do_storage_status(UAContext *ua, STORE *store) } Dmsg0(20, _("Connected to storage daemon\n")); sd = ua->jcr->store_bsock; - bnet_fsend(sd, "status"); - while (bnet_recv(sd) >= 0) { + if (cmd) { + sd->fsend(".status %s", cmd); + } else { + sd->fsend("status"); + } + while (sd->recv() >= 0) { ua->send_msg("%s", sd->msg); } - bnet_sig(sd, BNET_TERMINATE); - bnet_close(sd); + sd->signal( BNET_TERMINATE); + sd->close(); ua->jcr->store_bsock = NULL; return; } -static void do_client_status(UAContext *ua, CLIENT *client) +static void do_client_status(UAContext *ua, CLIENT *client, char *cmd) { BSOCK *fd; @@ -354,7 +381,7 @@ static void do_client_status(UAContext *ua, CLIENT *client) ua->jcr->sd_auth_key = bstrdup("dummy"); /* Try to connect for 15 seconds */ - ua->send_msg(_("Connecting to Client %s at %s:%d\n"), + if (!ua->api) ua->send_msg(_("Connecting to Client %s at %s:%d\n"), client->name(), client->address, client->FDport); if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { ua->send_msg(_("Failed to connect to Client %s.\n====\n"), @@ -367,7 +394,11 @@ static void do_client_status(UAContext *ua, CLIENT *client) } Dmsg0(20, _("Connected to file daemon\n")); fd = ua->jcr->file_bsock; - fd->fsend("status"); + if (cmd) { + fd->fsend(".status %s", cmd); + } else { + fd->fsend("status"); + } while (fd->recv() >= 0) { ua->send_msg("%s", fd->msg); } @@ -406,7 +437,9 @@ static void prt_runtime(UAContext *ua, sched_pkt *sp) bool close_db = false; JCR *jcr = ua->jcr; MEDIA_DBR mr; + int orig_jobtype; + orig_jobtype = jcr->JobType; memset(&mr, 0, sizeof(mr)); if (sp->job->JobType == JT_BACKUP) { jcr->db = NULL; @@ -449,6 +482,7 @@ static void prt_runtime(UAContext *ua, sched_pkt *sp) db_close_database(jcr, jcr->db); } jcr->db = ua->db; /* restore ua db to jcr */ + jcr->JobType = orig_jobtype; } /*