]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_status.c
kes Apply Eric's patch to ensure that autoprune does not return
[bacula/bacula] / bacula / src / dird / ua_status.c
index 2b5a12216980d57a7707d337889c31c9221eee90..81bf553ade9cacbd30cd0532f9bbbb89ec3b5d6c 100644 (file)
@@ -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; j<i; j++) {
-      do_storage_status(ua, unique_store[j]);
+      do_storage_status(ua, unique_store[j], NULL);
    }
    free(unique_store);
 
@@ -257,7 +280,7 @@ static void do_all_status(UAContext *ua)
 
    /* Call each unique File daemon */
    for (j=0; j<i; j++) {
-      do_client_status(ua, unique_client[j]);
+      do_client_status(ua, unique_client[j], NULL);
    }
    free(unique_client);
 
@@ -307,7 +330,7 @@ static void do_director_status(UAContext *ua)
    ua->send_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;
 }
 
 /*