]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_cmds.c
Fix bconsole bug with new BNET signals
[bacula/bacula] / bacula / src / dird / ua_cmds.c
index 0d970b9741f6aa9d0f1bcd1818dca952b61e7aba..8f99ee8b934b92342e3ef93fb087387f16e0aa6b 100644 (file)
@@ -6,7 +6,7 @@
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
+   modify it under the terms of version three of the GNU Affero General Public
    License as published by the Free Software Foundation and included
    in the file LICENSE.
 
@@ -15,7 +15,7 @@
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Affero General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
@@ -100,7 +100,7 @@ static int version_cmd(UAContext *ua, const char *cmd);
 static int wait_cmd(UAContext *ua, const char *cmd);
 
 static void do_job_delete(UAContext *ua, JobId_t JobId);
-static void delete_job_id_range(UAContext *ua, char *tok);
+static bool delete_job_id_range(UAContext *ua, char *tok);
 static int delete_volume(UAContext *ua);
 static int delete_pool(UAContext *ua);
 static void delete_job(UAContext *ua);
@@ -127,14 +127,18 @@ static struct cmdstruct commands[] = {                                      /* C
  { NT_("disable"),    disable_cmd,   _("Disable a job"), NT_("job=<name>"),        true},
  { NT_("enable"),     enable_cmd,    _("Enable a job"), NT_("job=<name>"),          true},
  { NT_("estimate"),   estimate_cmd,  _("Performs FileSet estimate, listing gives full listing"), 
-   NT_("fileset=<fs> client=<cli> accurate=<yes/no> job=<job> listing"), true},
+   NT_("fileset=<fs> client=<cli> level=<level> accurate=<yes/no> job=<job> listing"), true},
 
  { NT_("exit"),       quit_cmd,      _("Terminate Bconsole session"), NT_(""),         false},
  { NT_("gui"),        gui_cmd,       _("Non-interactive gui mode"),   NT_("on | off"), false},
- { NT_("help"),       help_cmd,      _("Print this command"),         NT_(""),         false},
+ { NT_("help"),       help_cmd,      _("Print help on specific command"),  
+   NT_("add autodisplay automount cancel create delete disable\n\tenable estimate exit gui label list llist"
+       "\n\tmessages memory mount prune purge python quit query\n\trestore relabel release reload run status"
+       "\n\tsetdebug setip show sqlquery time trace unmount umount\n\tupdate use var version wait"),         false},
+
  { NT_("label"),      label_cmd,     _("Label a tape"), NT_("storage=<storage> volume=<vol> pool=<pool>"), false},
  { NT_("list"),       list_cmd,      _("List objects from catalog"), 
-   NT_("pools | jobs | jobtotals | media <pool=pool-name> | files jobid=<nn> | copies jobid=<nn>"), true},
+   NT_("pools | jobs | jobtotals | volume | media <pool=pool-name> | files jobid=<nn> | copies jobid=<nn>"), true},
 
  { NT_("llist"),      llist_cmd,     _("Full or long list like list command"),
    NT_("pools | jobs | jobtotals | media <pool=pool-name> | files jobid=<nn> | copies jobid=<nn>"), true},
@@ -145,33 +149,34 @@ static struct cmdstruct commands[] = {                                      /* C
    NT_("storage=<storage-name> slot=<num> drive=<num> [ jobid=<id> | job=<job-name> ]"), false},
 
  { NT_("prune"),      prunecmd,      _("Prune expired records from catalog"), 
-   NT_("files | jobs | client=<client-name> | volume=<volume-name> "), true},
+   NT_("files | jobs | pool=<pool> | client=<client-name> | volume=<volume-name> "), true},
 
- { NT_("purge"),      purgecmd,      _("Purge records from catalog"), NT_("volume=<vol>"),  true},
+ { NT_("purge"),      purgecmd,      _("Purge records from catalog"), NT_("files jobs volume=<vol> [action=<action> devicetype=<type> pool=<pool> allpools storage=<st> drive=<num>]"),  true},
  { NT_("python"),     python_cmd,    _("Python control commands"),    NT_(""),              false},
  { NT_("quit"),       quit_cmd,      _("Terminate Bconsole session"), NT_(""),              false},
  { NT_("query"),      querycmd,      _("Query catalog"),              NT_(""),              false},
  { NT_("restore"),    restore_cmd,   _("Restore files"), 
-   NT_("where=/path client=<client> storage=<storage> bootstrap=<file> jobid=<jobid> done select all"), false},
+   NT_("where=</path> client=<client> storage=<storage> bootstrap=<file>"
+       "\n\tcomment=<text> jobid=<jobid> done select all"), false},
 
  { NT_("relabel"),    relabel_cmd,   _("Relabel a tape"), 
-   NT_("storage=<storage-name> oldvolume=<old-volume-name>  volume=<newvolume-name>"), false},
+   NT_("storage=<storage-name> oldvolume=<old-volume-name>\n\tvolume=<newvolume-name> pool=<pool>"), false},
 
  { NT_("release"),    release_cmd,   _("Release storage"),  NT_("storage-name"),      false},
  { NT_("reload"),     reload_cmd,    _("Reload conf file"), NT_(""),                  true},
  { NT_("run"),        run_cmd,       _("Run a job"), 
-   NT_("job=<job-name> client=<client-name> fileset=<FileSet-name> level=<level-keyword> storage=<storage-name> where=<directory-prefix> "
-       "when=<universal-time-specification> yes"), false}, /* need to be check */
+   NT_("job=<job-name> client=<client-name>\n\tfileset=<FileSet-name> level=<level-keyword>\n\tstorage=<storage-name>"
+       "where=<directory-prefix>\n\twhen=<universal-time-specification>\n\tcomment=<text> yes"), false}, 
 
  { NT_("status"),     status_cmd,    _("Report status"), 
    NT_("all | dir=<dir-name> | director | client=<client-name> | storage=<storage-name> slots | days=nnn"), true},
 
  { NT_("setdebug"),   setdebug_cmd,  _("Sets debug level"), 
-   NT_("level=nn trace=0/1 client=<client-name> | dir | storage=<storage-name> | all"), true},
+   NT_("level=<nn> trace=0/1 client=<client-name> | dir | storage=<storage-name> | all"), true},
 
  { NT_("setip"),      setip_cmd,     _("Sets new client address -- if authorized"), NT_(""),   false},
  { NT_("show"),       show_cmd,      _("Show resource records"), 
-   NT_("job=<xxx> |  pool=<yyy> | fileset=<aaa> schedule=<sss> | client=<zzz> | all"), true},
+   NT_("job=<xxx> |  pool=<yyy> | fileset=<aaa> schedule=<sss> | client=<zzz> | disabled | all"), true},
 
  { NT_("sqlquery"),   sqlquerycmd,   _("Use SQL to query catalog"), NT_(""),          false},
  { NT_("time"),       time_cmd,      _("Print current time"),       NT_(""),          true},
@@ -183,13 +188,16 @@ static struct cmdstruct commands[] = {                                      /* C
    NT_("storage=<storage-name> [ drive=<num> ] | jobid=<id> | job=<job-name>"), false},
 
  { NT_("update"),     update_cmd,    _("Update volume, pool or stats"), 
-   NT_("pool=<poolname> | slots | stats | volume=<volname> volstatus=<status> volretention=<time-def> "
-       "pool=<pool> recycle=<yes/no> slot=<number> inchanger=<yes/no>"),true},
+   NT_("stats\n\tpool=<poolname>\n\tslots storage=<storage> scan"
+       "\n\tvolume=<volname> volstatus=<status> volretention=<time-def>"
+       "\n\t pool=<pool> recycle=<yes/no> slot=<number>\n\t inchanger=<yes/no>"
+       "\n\t maxvolbytes=<size> maxvolfiles=<nb> maxvoljobs=<nb>"
+       "\n\t enable=<yes/no> recyclepool=<pool> actiononpurge=<action>"),true},
  { NT_("use"),        use_cmd,       _("Use catalog xxx"), NT_(""),     false},
  { NT_("var"),        var_cmd,       _("Does variable expansion"), NT_(""),  false},
  { NT_("version"),    version_cmd,   _("Print Director version"),  NT_(""),  true},
  { NT_("wait"),       wait_cmd,      _("Wait until no jobs are running"), 
-   NT_("<jobname=name> | <jobid=nnn> | <ujobid=complete_name>"), false}
+   NT_("jobname=<name> | jobid=<nnn> | ujobid=<complete_name>"), false}
 };
 
 #define comsize ((int)(sizeof(commands)/sizeof(struct cmdstruct)))
@@ -450,10 +458,10 @@ static int cancel_cmd(UAContext *ua, const char *cmd)
    for (i=1; i<ua->argc; i++) {
       if (strcasecmp(ua->argk[i], NT_("jobid")) == 0) {
          uint32_t JobId;
-         if (!ua->argv[i]) {
+         JobId = str_to_int64(ua->argv[i]);
+         if (!JobId) {
             break;
          }
-         JobId = str_to_int64(ua->argv[i]);
          if (!(jcr=get_jcr_by_id(JobId))) {
             ua->error_msg(_("JobId %s is not running. Use Job name to cancel inactive jobs.\n"),  ua->argv[i]);
             return 1;
@@ -1334,8 +1342,8 @@ static int estimate_cmd(UAContext *ua, const char *cmd)
 
 bail_out:
    if (jcr->file_bsock) {
-      bnet_sig(jcr->file_bsock, BNET_TERMINATE);
-      bnet_close(jcr->file_bsock);
+      jcr->file_bsock->signal(BNET_TERMINATE);
+      jcr->file_bsock->close();
       jcr->file_bsock = NULL;
    }
    return 1;
@@ -1454,9 +1462,7 @@ static void delete_job(UAContext *ua)
         sep = strchr(tok, ',');
         while (sep != NULL) {
            *sep = '\0';
-           if (strchr(tok, '-')) {
-               delete_job_id_range(ua, tok);
-           } else {
+           if (!delete_job_id_range(ua, tok)) {
               JobId = str_to_int64(tok);
               do_job_delete(ua, JobId);
            }
@@ -1464,9 +1470,7 @@ static void delete_job(UAContext *ua)
            sep = strchr(tok, ',');
         }
         /* pick up the last token */
-        if (strchr(tok, '-')) {
-            delete_job_id_range(ua, tok);
-        } else {
+        if (!delete_job_id_range(ua, tok)) {
             JobId = str_to_int64(tok);
             do_job_delete(ua, JobId);
         }
@@ -1487,12 +1491,15 @@ static void delete_job(UAContext *ua)
 /*
  * we call delete_job_id_range to parse range tokens and iterate over ranges
  */
-static void delete_job_id_range(UAContext *ua, char *tok)
+static bool delete_job_id_range(UAContext *ua, char *tok)
 {
    char *tok2;
    JobId_t j,j1,j2;
 
    tok2 = strchr(tok, '-');
+   if (!tok2) {
+      return false;
+   }
    *tok2 = '\0';
    tok2++;
    j1 = str_to_int64(tok);
@@ -1500,6 +1507,7 @@ static void delete_job_id_range(UAContext *ua, char *tok)
    for (j=j1; j<=j2; j++) {
       do_job_delete(ua, j);
    }
+   return true;
 }
 
 /*
@@ -1872,12 +1880,12 @@ int wait_cmd(UAContext *ua, const char *cmd)
 static int help_cmd(UAContext *ua, const char *cmd)
 {
    int i;
-
    ua->send_msg(_("  Command       Description\n  =======       ===========\n"));
    for (i=0; i<comsize; i++) {
       if (ua->argc == 2) {
          if (!strcasecmp(ua->argk[1], commands[i].key)) {
-            ua->send_msg(_("  %-13s %s\n  %s\n"), commands[i].key, commands[i].help, commands[i].usage);
+            ua->send_msg(_("  %-13s %s\n\nArguments:\n\t%s\n"), commands[i].key, 
+                         commands[i].help, commands[i].usage);
             break;
          }
       } else {
@@ -1947,6 +1955,22 @@ static int version_cmd(UAContext *ua, const char *cmd)
 }
 #endif
 
+/* 
+ * This call uses open_client_db() and force a
+ * new dedicated connection to the catalog
+ */
+bool open_new_client_db(UAContext *ua)
+{   
+   bool ret;
+
+   /* Force a new dedicated connection */
+   close_db(ua);
+   ua->force_mult_db_connections = true;
+   ret = open_client_db(ua);
+   ua->force_mult_db_connections = false;
+   return ret;
+}
+
 /* 
  * This call explicitly checks for a catalog=xxx and
  *  if given, opens that catalog.  It also checks for
@@ -2032,6 +2056,8 @@ bool open_client_db(UAContext *ua)
  */
 bool open_db(UAContext *ua)
 {
+   bool mult_db_conn;
+
    if (ua->db) {
       return true;
    }
@@ -2043,6 +2069,12 @@ bool open_db(UAContext *ua)
       }
    }
 
+   /* Some modules like bvfs need their own catalog connection */
+   mult_db_conn = ua->catalog->mult_db_connections;
+   if (ua->force_mult_db_connections) {
+      mult_db_conn = true;
+   }
+
    ua->jcr->catalog = ua->catalog;
 
    Dmsg0(100, "UA Open database\n");
@@ -2050,7 +2082,7 @@ bool open_db(UAContext *ua)
                              ua->catalog->db_user,
                              ua->catalog->db_password, ua->catalog->db_address,
                              ua->catalog->db_port, ua->catalog->db_socket,
-                             ua->catalog->mult_db_connections);
+                             mult_db_conn);
    if (!ua->db || !db_open_database(ua->jcr, ua->db)) {
       ua->error_msg(_("Could not open catalog database \"%s\".\n"),
                  ua->catalog->db_name);