]> git.sur5r.net Git - bacula/bacula/commitdiff
- Add .status [current|last] command to filed and stored
authorNicolas Boichat <nicolas@boichat.ch>
Thu, 19 Aug 2004 20:18:50 +0000 (20:18 +0000)
committerNicolas Boichat <nicolas@boichat.ch>
Thu, 19 Aug 2004 20:18:50 +0000 (20:18 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1546 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/filed/job.c
bacula/src/filed/status.c
bacula/src/stored/dircmd.c
bacula/src/stored/status.c

index 84f602dc6588efe81dc8d5c0a0764aa00a0c8648..86bdfab4bc818c0b10b265bf8877f414b537a5cb 100644 (file)
@@ -34,7 +34,8 @@ extern CLIENT *me;                  /* our client resource */
                        
 /* Imported functions */
 extern int status_cmd(JCR *jcr);
-                                  
+extern int qstatus_cmd(JCR *jcr);
+
 /* Forward referenced functions */
 static int backup_cmd(JCR *jcr);
 static int bootstrap_cmd(JCR *jcr);
@@ -85,6 +86,7 @@ static struct s_cmds cmds[] = {
    {"restore",      restore_cmd},
    {"session",      session_cmd},
    {"status",       status_cmd},
+   {".status",      qstatus_cmd},
    {"storage ",     storage_cmd},
    {"verify",       verify_cmd},
    {"bootstrap",    bootstrap_cmd},
index 1ff65244cb9f1671b1fdc60bf4fcca1c7ff78015..557d0c718de2ac491d4e54746d36d75cedead0cd 100755 (executable)
@@ -38,6 +38,11 @@ static void  list_terminated_jobs(void sendit(const char *msg, int len, void *sa
 static void bsock_sendit(const char *msg, int len, void *arg);
 static const char *level_to_str(int level);
 
+/* Static variables */
+static char qstatus[] = ".status %s\n";
+
+static char OKqstatus[]   = "2000 OK .status\n";
+static char DotStatusJob[] = "JobId=%d JobStatus=%c JobErrors=%d\n";
 
 #if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
 static int privs = 0;
@@ -267,6 +272,54 @@ int status_cmd(JCR *jcr)
    return 1;
 }
 
+/*
+ * .status command from Director
+ */
+int qstatus_cmd(JCR *jcr)
+{
+   BSOCK *dir = jcr->dir_bsock;
+   char time[dir->msglen+1];
+   JCR *njcr;
+   s_last_job* job;
+      
+   if (sscanf(dir->msg, qstatus, time) != 1) {
+      pm_strcpy(&jcr->errmsg, dir->msg);
+      Jmsg1(jcr, M_FATAL, 0, _("Bad .status command: %s\n"), jcr->errmsg);
+      bnet_fsend(dir, "2900 Bad .status command, missing argument.\n");
+      bnet_sig(dir, BNET_EOD);
+      return 0;
+   }
+   unbash_spaces(time);
+   
+   if (strcmp(time, "current") == 0) {
+      bnet_fsend(dir, OKqstatus, time);
+      lock_jcr_chain();
+      foreach_jcr(njcr) {
+         if (njcr->JobId != 0) {
+            bnet_fsend(dir, DotStatusJob, njcr->JobId, njcr->JobStatus, njcr->JobErrors);
+         }
+         free_locked_jcr(njcr);
+      }
+      unlock_jcr_chain();
+   }
+   else if (strcmp(time, "last") == 0) {
+      bnet_fsend(dir, OKqstatus, time);
+      if ((last_jobs) && (last_jobs->size() > 0)) {
+         job = (s_last_job*)last_jobs->last();
+         bnet_fsend(dir, DotStatusJob, job->JobId, job->JobStatus, job->Errors);
+      }
+   }
+   else {
+      pm_strcpy(&jcr->errmsg, dir->msg);
+      Jmsg1(jcr, M_FATAL, 0, _("Bad .status command: %s\n"), jcr->errmsg);
+      bnet_fsend(dir, "2900 Bad .status command, wrong argument.\n");
+      bnet_sig(dir, BNET_EOD);
+      return 0;
+   }
+   
+   bnet_sig(dir, BNET_EOD);
+   return 1;
+}
 
 /*
  * Convert Job Level into a string
index 045add3b5afc5278ba2893602637b91681c4ae8d..40c43f1648bb751d9bfb571913309b0d11601833 100644 (file)
@@ -60,6 +60,7 @@ static char OKsetdebug[]   = "3000 OK setdebug=%d\n";
 extern void terminate_child();
 extern int job_cmd(JCR *jcr);
 extern int status_cmd(JCR *sjcr);
+extern int qstatus_cmd(JCR *jcr);
 
 /* Forward referenced functions */
 static int label_cmd(JCR *jcr);
@@ -95,6 +96,7 @@ static struct s_cmds cmds[] = {
    {"mount",     mount_cmd},
    {"unmount",   unmount_cmd},
    {"status",    status_cmd},
+   {".status",   qstatus_cmd},
    {"autochanger", autochanger_cmd},
    {"release",   release_cmd},
    {"readlabel", readlabel_cmd},
index d07c43029d6174a159ac1828f2065f892e1c1152..5ae33f1dc0aee5fc0c52820d89768c10d87234c5 100644 (file)
@@ -41,6 +41,10 @@ extern int num_jobs_run;
 
 
 /* Static variables */
+static char qstatus[] = ".status %s\n";
+
+static char OKqstatus[]   = "2000 OK .status\n";
+static char DotStatusJob[] = "JobId=%d JobStatus=%c JobErrors=%d\n";
 
 
 /* Forward referenced functions */
@@ -414,3 +418,52 @@ static void sendit(const char *msg, int len, void *arg)
    user->msglen = len+1;
    bnet_send(user);
 }
+
+/*
+ * .status command from Director
+ */
+int qstatus_cmd(JCR *jcr)
+{
+   BSOCK *dir = jcr->dir_bsock;
+   char time[dir->msglen+1];
+   JCR *njcr;
+   s_last_job* job;
+      
+   if (sscanf(dir->msg, qstatus, time) != 1) {
+      pm_strcpy(&jcr->errmsg, dir->msg);
+      Jmsg1(jcr, M_FATAL, 0, _("Bad .status command: %s\n"), jcr->errmsg);
+      bnet_fsend(dir, "2900 Bad .status command, missing argument.\n");
+      bnet_sig(dir, BNET_EOD);
+      return 0;
+   }
+   unbash_spaces(time);
+   
+   if (strcmp(time, "current") == 0) {
+      bnet_fsend(dir, OKqstatus, time);
+      lock_jcr_chain();
+      foreach_jcr(njcr) {
+         if (njcr->JobId != 0) {
+            bnet_fsend(dir, DotStatusJob, njcr->JobId, njcr->JobStatus, njcr->JobErrors);
+         }
+         free_locked_jcr(njcr);
+      }
+      unlock_jcr_chain();
+   }
+   else if (strcmp(time, "last") == 0) {
+      bnet_fsend(dir, OKqstatus, time);
+      if ((last_jobs) && (last_jobs->size() > 0)) {
+         job = (s_last_job*)last_jobs->last();
+         bnet_fsend(dir, DotStatusJob, job->JobId, job->JobStatus, job->Errors);
+      }
+   }
+   else {
+      pm_strcpy(&jcr->errmsg, dir->msg);
+      Jmsg1(jcr, M_FATAL, 0, _("Bad .status command: %s\n"), jcr->errmsg);
+      bnet_fsend(dir, "2900 Bad .status command, wrong argument.\n");
+      bnet_sig(dir, BNET_EOD);
+      return 0;
+   }
+   
+   bnet_sig(dir, BNET_EOD);
+   return 1;
+}