]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_cmds.c
Fix automatic labeling of File volumes, which was broken by new
[bacula/bacula] / bacula / src / dird / ua_cmds.c
index c66a86f3b166cd18895d576054d88a02a438891c..f7e50f03935c4979b72c2461f1627708f47c1257 100644 (file)
@@ -7,19 +7,32 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   Bacula® - The Network Backup Solution
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License
-   version 2 as amended with additional clauses defined in the
-   file LICENSE in the main source directory.
+   Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
 
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
-   the file LICENSE for additional details.
+   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
+   License as published by the Free Software Foundation plus additions
+   that are listed in the file LICENSE.
 
- */
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   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
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Bacula® is a registered trademark of John Walker.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+   Switzerland, email:ftf@fsfeurope.org.
+*/
 
 #include "bacula.h"
 #include "dird.h"
@@ -30,8 +43,7 @@
 extern int r_first;
 extern int r_last;
 extern struct s_res resources[];
-extern char my_name[];
-extern jobq_t job_queue;             /* job queue */
+extern jobq_t job_queue;              /* job queue */
 
 
 /* Imported functions */
@@ -56,6 +68,8 @@ extern int update_cmd(UAContext *ua, const char *cmd);
 static int add_cmd(UAContext *ua, const char *cmd);
 static int create_cmd(UAContext *ua, const char *cmd);
 static int cancel_cmd(UAContext *ua, const char *cmd);
+static int enable_cmd(UAContext *ua, const char *cmd);
+static int disable_cmd(UAContext *ua, const char *cmd);
 static int setdebug_cmd(UAContext *ua, const char *cmd);
 static int trace_cmd(UAContext *ua, const char *cmd);
 static int var_cmd(UAContext *ua, const char *cmd);
@@ -85,46 +99,48 @@ int quit_cmd(UAContext *ua, const char *cmd);
 
 struct cmdstruct { const char *key; int (*func)(UAContext *ua, const char *cmd); const char *help; };
 static struct cmdstruct commands[] = {
- { N_("add"),        add_cmd,         _("add media to a pool")},
- { N_("autodisplay"), autodisplay_cmd, _("autodisplay [on|off] -- console messages")},
- { N_("automount"),   automount_cmd,  _("automount [on|off] -- after label")},
- { N_("cancel"),     cancel_cmd,    _("cancel [<jobid=nnn> | <job=name>] -- cancel a job")},
- { N_("create"),     create_cmd,    _("create DB Pool from resource")},
- { N_("delete"),     delete_cmd,    _("delete [pool=<pool-name> | media volume=<volume-name>]")},
- { N_("estimate"),   estimate_cmd,  _("performs FileSet estimate, listing gives full listing")},
- { N_("exit"),       quit_cmd,      _("exit = quit")},
- { N_("gui"),        gui_cmd,       _("gui [on|off] -- non-interactive gui mode")},
- { N_("help"),       help_cmd,      _("print this command")},
- { N_("list"),       list_cmd,      _("list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn>]; from catalog")},
- { N_("label"),      label_cmd,     _("label a tape")},
- { N_("llist"),      llist_cmd,     _("full or long list like list command")},
- { N_("messages"),   messagescmd,   _("messages")},
- { N_("mount"),      mount_cmd,     _("mount <storage-name>")},
- { N_("prune"),      prunecmd,      _("prune expired records from catalog")},
- { N_("purge"),      purgecmd,      _("purge records from catalog")},
- { N_("python"),     python_cmd,    _("python control commands")},
- { N_("quit"),       quit_cmd,      _("quit")},
- { N_("query"),      querycmd,      _("query catalog")},
- { N_("restore"),    restore_cmd,   _("restore files")},
- { N_("relabel"),    relabel_cmd,   _("relabel a tape")},
- { N_("release"),    release_cmd,   _("release <storage-name>")},
- { N_("reload"),     reload_cmd,    _("reload conf file")},
- { N_("run"),        run_cmd,       _("run <job-name>")},
- { N_("status"),     status_cmd,    _("status [storage | client]=<name>")},
- { N_("setdebug"),   setdebug_cmd,  _("sets debug level")},
- { N_("setip"),      setip_cmd,     _("sets new client address -- if authorized")},
- { N_("show"),       show_cmd,      _("show (resource records) [jobs | pools | ... | all]")},
- { N_("sqlquery"),   sqlquerycmd,   _("use SQL to query catalog")},
- { N_("time"),       time_cmd,      _("print current time")},
- { N_("trace"),      trace_cmd,     _("turn on/off trace to file")},
- { N_("unmount"),    unmount_cmd,   _("unmount <storage-name>")},
- { N_("umount"),     unmount_cmd,   _("umount <storage-name> for old-time Unix guys")},
- { N_("update"),     update_cmd,    _("update Volume, Pool or slots")},
- { N_("use"),        use_cmd,       _("use catalog xxx")},
- { N_("var"),        var_cmd,       _("does variable expansion")},
- { N_("version"),    version_cmd,   _("print Director version")},
- { N_("wait"),       wait_cmd,      _("wait until no jobs are running")},
-            };
+ { NT_("add"),        add_cmd,         _("add media to a pool")},
+ { NT_("autodisplay"), autodisplay_cmd, _("autodisplay [on|off] -- console messages")},
+ { NT_("automount"),   automount_cmd,  _("automount [on|off] -- after label")},
+ { NT_("cancel"),     cancel_cmd,    _("cancel [<jobid=nnn> | <job=name>] -- cancel a job")},
+ { NT_("create"),     create_cmd,    _("create DB Pool from resource")},
+ { NT_("delete"),     delete_cmd,    _("delete [pool=<pool-name> | media volume=<volume-name>]")},
+ { NT_("disable"),    disable_cmd,   _("disable <job=name> -- disable a job")},
+ { NT_("enable"),     enable_cmd,    _("enable <job=name> -- enable a job")},
+ { NT_("estimate"),   estimate_cmd,  _("performs FileSet estimate, listing gives full listing")},
+ { NT_("exit"),       quit_cmd,      _("exit = quit")},
+ { NT_("gui"),        gui_cmd,       _("gui [on|off] -- non-interactive gui mode")},
+ { NT_("help"),       help_cmd,      _("print this command")},
+ { NT_("list"),       list_cmd,      _("list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn>]; from catalog")},
+ { NT_("label"),      label_cmd,     _("label a tape")},
+ { NT_("llist"),      llist_cmd,     _("full or long list like list command")},
+ { NT_("messages"),   messagescmd,   _("messages")},
+ { NT_("mount"),      mount_cmd,     _("mount <storage-name>")},
+ { NT_("prune"),      prunecmd,      _("prune expired records from catalog")},
+ { NT_("purge"),      purgecmd,      _("purge records from catalog")},
+ { NT_("python"),     python_cmd,    _("python control commands")},
+ { NT_("quit"),       quit_cmd,      _("quit")},
+ { NT_("query"),      querycmd,      _("query catalog")},
+ { NT_("restore"),    restore_cmd,   _("restore files")},
+ { NT_("relabel"),    relabel_cmd,   _("relabel a tape")},
+ { NT_("release"),    release_cmd,   _("release <storage-name>")},
+ { NT_("reload"),     reload_cmd,    _("reload conf file")},
+ { NT_("run"),        run_cmd,       _("run <job-name>")},
+ { NT_("status"),     status_cmd,    _("status [storage | client]=<name>")},
+ { NT_("setdebug"),   setdebug_cmd,  _("sets debug level")},
+ { NT_("setip"),      setip_cmd,     _("sets new client address -- if authorized")},
+ { NT_("show"),       show_cmd,      _("show (resource records) [jobs | pools | ... | all]")},
+ { NT_("sqlquery"),   sqlquerycmd,   _("use SQL to query catalog")},
+ { NT_("time"),       time_cmd,      _("print current time")},
+ { NT_("trace"),      trace_cmd,     _("turn on/off trace to file")},
+ { NT_("unmount"),    unmount_cmd,   _("unmount <storage-name>")},
+ { NT_("umount"),     unmount_cmd,   _("umount <storage-name> for old-time Unix guys")},
+ { NT_("update"),     update_cmd,    _("update Volume, Pool or slots")},
+ { NT_("use"),        use_cmd,       _("use catalog xxx")},
+ { NT_("var"),        var_cmd,       _("does variable expansion")},
+ { NT_("version"),    version_cmd,   _("print Director version")},
+ { NT_("wait"),       wait_cmd,      _("wait until no jobs are running [<jobname=name> | <jobid=nnn> | <ujobid=complete_name>]")},
+             };
 #define comsize (sizeof(commands)/sizeof(struct cmdstruct))
 
 /*
@@ -143,19 +159,25 @@ int do_a_command(UAContext *ua, const char *cmd)
       return 1;
    }
 
+   while (ua->jcr->wstorage->size()) {
+      ua->jcr->wstorage->remove(0);
+   }
+
    len = strlen(ua->argk[0]);
-   for (i=0; i<comsize; i++) {    /* search for command */
-      if (strncasecmp(ua->argk[0],  _(commands[i].key), len) == 0) {
-        if (!acl_access_ok(ua, Command_ACL, ua->argk[0], len)) {
-           break;
-        }
-        stat = (*commands[i].func)(ua, cmd);   /* go execute command */
-        found = true;
-        break;
+   for (i=0; i<comsize; i++) {     /* search for command */
+      if (strncasecmp(ua->argk[0],  commands[i].key, len) == 0) {
+         /* Check if command permitted, but "quit" is always OK */
+         if (strcmp(ua->argk[0], NT_("quit")) != 0 &&
+             !acl_access_ok(ua, Command_ACL, ua->argk[0], len)) {
+            break;
+         }
+         stat = (*commands[i].func)(ua, cmd);   /* go execute command */
+         found = true;
+         break;
       }
    }
    if (!found) {
-      bnet_fsend(ua->UA_sock, _("%s: is an illegal command.\n"), ua->argk[0]);
+      bnet_fsend(ua->UA_sock, _("%s: is an invalid command.\n"), ua->argk[0]);
    }
    return stat;
 }
@@ -168,7 +190,7 @@ int do_a_command(UAContext *ua, const char *cmd)
 void set_pool_dbr_defaults_in_media_dbr(MEDIA_DBR *mr, POOL_DBR *pr)
 {
    mr->PoolId = pr->PoolId;
-   bstrncpy(mr->VolStatus, "Append", sizeof(mr->VolStatus));
+   bstrncpy(mr->VolStatus, NT_("Append"), sizeof(mr->VolStatus));
    mr->Recycle = pr->Recycle;
    mr->VolRetention = pr->VolRetention;
    mr->VolUseDuration = pr->VolUseDuration;
@@ -176,6 +198,7 @@ void set_pool_dbr_defaults_in_media_dbr(MEDIA_DBR *mr, POOL_DBR *pr)
    mr->MaxVolFiles = pr->MaxVolFiles;
    mr->MaxVolBytes = pr->MaxVolBytes;
    mr->LabelType = pr->LabelType;
+   mr->Enabled = 1;
 }
 
 
@@ -212,12 +235,12 @@ static int add_cmd(UAContext *ua, const char *cmd)
       pr.MaxVols, pr.PoolType);
 
    while (pr.MaxVols > 0 && pr.NumVols >= pr.MaxVols) {
-      bsendmsg(ua, _("Pool already has maximum volumes = %d\n"), pr.MaxVols);
+      bsendmsg(ua, _("Pool already has maximum volumes=%d\n"), pr.MaxVols);
       for (;;) {
          if (!get_pint(ua, _("Enter new maximum (zero for unlimited): "))) {
-           return 1;
-        }
-        pr.MaxVols = ua->pint32_val;
+            return 1;
+         }
+         pr.MaxVols = ua->pint32_val;
       }
    }
 
@@ -237,23 +260,23 @@ static int add_cmd(UAContext *ua, const char *cmd)
       char buf[100];
       bsnprintf(buf, sizeof(buf), _("Enter number of Volumes to create. 0=>fixed name. Max=%d: "), max);
       if (!get_pint(ua, buf)) {
-        return 1;
+         return 1;
       }
       num = ua->pint32_val;
       if (num < 0 || num > max) {
          bsendmsg(ua, _("The number must be between 0 and %d\n"), max);
-        continue;
+         continue;
       }
       break;
    }
 getVolName:
    if (num == 0) {
       if (!get_cmd(ua, _("Enter Volume name: "))) {
-        return 1;
+         return 1;
       }
    } else {
       if (!get_cmd(ua, _("Enter base volume name: "))) {
-        return 1;
+         return 1;
       }
    }
    /* Don't allow | in Volume name because it is the volume separator character */
@@ -275,14 +298,14 @@ getVolName:
 
       for (;;) {
          if (!get_pint(ua, _("Enter the starting number: "))) {
-           return 1;
-        }
-        startnum = ua->pint32_val;
-        if (startnum < 1) {
+            return 1;
+         }
+         startnum = ua->pint32_val;
+         if (startnum < 1) {
             bsendmsg(ua, _("Start number must be greater than zero.\n"));
-           continue;
-        }
-        break;
+            continue;
+         }
+         break;
       }
    } else {
       startnum = 1;
@@ -291,11 +314,11 @@ getVolName:
 
    if (store && store->autochanger) {
       if (!get_pint(ua, _("Enter slot (0 for none): "))) {
-        return 1;
+         return 1;
       }
       Slot = ua->pint32_val;
       if (!get_yesno(ua, _("InChanger? yes/no: "))) {
-        return 1;
+         return 1;
       }
       InChanger = ua->pint32_val;
    }
@@ -306,13 +329,14 @@ getVolName:
       mr.Slot = Slot++;
       mr.InChanger = InChanger;
       mr.StorageId = store->StorageId;
+      mr.Enabled = 1;
       Dmsg1(200, "Create Volume %s\n", mr.VolumeName);
       if (!db_create_media_record(ua->jcr, ua->db, &mr)) {
          bsendmsg(ua, "%s", db_strerror(ua->db));
-        return 1;
+         return 1;
       }
       if (i == startnum) {
-        first_id = mr.PoolId;
+         first_id = mr.PoolId;
       }
    }
    pr.NumVols += num;
@@ -338,14 +362,14 @@ int automount_cmd(UAContext *ua, const char *cmd)
 
    if (ua->argc != 2) {
       if (!get_cmd(ua, _("Turn on or off? "))) {
-           return 1;
+            return 1;
       }
       onoff = ua->cmd;
    } else {
       onoff = ua->argk[1];
    }
 
-   ua->automount = (strcasecmp(onoff, _("off")) == 0) ? 0 : 1;
+   ua->automount = (strcasecmp(onoff, NT_("off")) == 0) ? 0 : 1;
    return 1;
 }
 
@@ -365,74 +389,82 @@ static int cancel_cmd(UAContext *ua, const char *cmd)
    }
 
    for (i=1; i<ua->argc; i++) {
-      if (strcasecmp(ua->argk[i], _("jobid")) == 0) {
-        uint32_t JobId;
-        if (!ua->argv[i]) {
-           break;
-        }
-        JobId = str_to_int64(ua->argv[i]);
-        if (!(jcr=get_jcr_by_id(JobId))) {
+      if (strcasecmp(ua->argk[i], NT_("jobid")) == 0) {
+         uint32_t JobId;
+         if (!ua->argv[i]) {
+            break;
+         }
+         JobId = str_to_int64(ua->argv[i]);
+         if (!(jcr=get_jcr_by_id(JobId))) {
             bsendmsg(ua, _("JobId %s is not running. Use Job name to cancel inactive jobs.\n"),  ua->argv[i]);
-           return 1;
-        }
-        break;
-      } else if (strcasecmp(ua->argk[i], _("job")) == 0) {
-        if (!ua->argv[i]) {
-           break;
-        }
-        if (!(jcr=get_jcr_by_partial_name(ua->argv[i]))) {
+            return 1;
+         }
+         break;
+      } else if (strcasecmp(ua->argk[i], NT_("job")) == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         if (!(jcr=get_jcr_by_partial_name(ua->argv[i]))) {
+            bsendmsg(ua, _("Warning Job %s is not running. Continuing anyway ...\n"), ua->argv[i]);
+            jcr = new_jcr(sizeof(JCR), dird_free_jcr);
+            bstrncpy(jcr->Job, ua->argv[i], sizeof(jcr->Job));
+         }
+         break;
+      } else if (strcasecmp(ua->argk[i], NT_("ujobid")) == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         if (!(jcr=get_jcr_by_full_name(ua->argv[i]))) {
             bsendmsg(ua, _("Warning Job %s is not running. Continuing anyway ...\n"), ua->argv[i]);
-           jcr = new_jcr(sizeof(JCR), dird_free_jcr);
-           bstrncpy(jcr->Job, ua->argv[i], sizeof(jcr->Job));
-        }
-        break;
+            jcr = new_jcr(sizeof(JCR), dird_free_jcr);
+            bstrncpy(jcr->Job, ua->argv[i], sizeof(jcr->Job));
+         }
+         break;
       }
+
    }
    /* If we still do not have a jcr,
-    *  throw up a list and ask the user to select one.
+    *   throw up a list and ask the user to select one.
     */
    if (!jcr) {
       char buf[1000];
       /* Count Jobs running */
       foreach_jcr(jcr) {
-        if (jcr->JobId == 0) {      /* this is us */
-           free_jcr(jcr);
-           continue;
-        }
-        free_jcr(jcr);
-        njobs++;
+         if (jcr->JobId == 0) {      /* this is us */
+            continue;
+         }
+         njobs++;
       }
+      endeach_jcr(jcr);
 
       if (njobs == 0) {
          bsendmsg(ua, _("No Jobs running.\n"));
-        return 1;
+         return 1;
       }
       start_prompt(ua, _("Select Job:\n"));
       foreach_jcr(jcr) {
-        char ed1[50];
-        if (jcr->JobId == 0) {      /* this is us */
-           free_jcr(jcr);
-           continue;
-        }
+         char ed1[50];
+         if (jcr->JobId == 0) {      /* this is us */
+            continue;
+         }
          bsnprintf(buf, sizeof(buf), _("JobId=%s Job=%s"), edit_int64(jcr->JobId, ed1), jcr->Job);
-        add_prompt(ua, buf);
-        free_jcr(jcr);
+         add_prompt(ua, buf);
       }
+      endeach_jcr(jcr);
 
       if (do_prompt(ua, _("Job"),  _("Choose Job to cancel"), buf, sizeof(buf)) < 0) {
-        return 1;
+         return 1;
       }
       if (njobs == 1) {
          if (!get_yesno(ua, _("Confirm cancel (yes/no): ")) || ua->pint32_val == 0) {
-           return 1;
-        }
+            return 1;
+         }
       }
-      /* NOTE! This increments the ref_count */
       sscanf(buf, "JobId=%d Job=%127s", &njobs, JobName);
       jcr = get_jcr_by_full_name(JobName);
       if (!jcr) {
          bsendmsg(ua, _("Job %s not found.\n"), JobName);
-        return 1;
+         return 1;
       }
    }
 
@@ -454,18 +486,17 @@ void set_pooldbr_from_poolres(POOL_DBR *pr, POOL *pool, e_pool_op op)
    if (op == POOL_OP_CREATE) {
       pr->MaxVols = pool->max_volumes;
       pr->NumVols = 0;
-   } else {         /* update pool */
+   } else {          /* update pool */
       if (pr->MaxVols != pool->max_volumes) {
-        pr->MaxVols = pool->max_volumes;
+         pr->MaxVols = pool->max_volumes;
       }
       if (pr->MaxVols != 0 && pr->MaxVols < pr->NumVols) {
-        pr->MaxVols = pr->NumVols;
+         pr->MaxVols = pr->NumVols;
       }
    }
    pr->LabelType = pool->LabelType;
    pr->UseOnce = pool->use_volume_once;
    pr->UseCatalog = pool->use_catalog;
-   pr->AcceptAnyVolume = pool->accept_any_volume;
    pr->Recycle = pool->Recycle;
    pr->VolRetention = pool->VolRetention;
    pr->VolUseDuration = pool->VolUseDuration;
@@ -485,9 +516,9 @@ void set_pooldbr_from_poolres(POOL_DBR *pr, POOL *pool, e_pool_op op)
 /*
  * Create a pool record from a given Pool resource
  *   Also called from backup.c
- * Returns: -1 on error
- *          0  record already exists
- *          1  record created
+ * Returns: -1  on error
+ *           0  record already exists
+ *           1  record created
  */
 
 int create_pool(JCR *jcr, B_DB *db, POOL *pool, e_pool_op op)
@@ -501,16 +532,16 @@ int create_pool(JCR *jcr, B_DB *db, POOL *pool, e_pool_op op)
    if (db_get_pool_record(jcr, db, &pr)) {
       /* Pool Exists */
       if (op == POOL_OP_UPDATE) {  /* update request */
-        set_pooldbr_from_poolres(&pr, pool, op);
-        db_update_pool_record(jcr, db, &pr);
+         set_pooldbr_from_poolres(&pr, pool, op);
+         db_update_pool_record(jcr, db, &pr);
       }
-      return 0;                      /* exists */
+      return 0;                       /* exists */
    }
 
    set_pooldbr_from_poolres(&pr, pool, op);
 
    if (!db_create_pool_record(jcr, db, &pr)) {
-      return -1;                     /* error */
+      return -1;                      /* error */
    }
    return 1;
 }
@@ -560,7 +591,7 @@ extern DIRRES *director;
  */
 static int python_cmd(UAContext *ua, const char *cmd)
 {
-   if (ua->argc >= 1 && strcasecmp(ua->argk[1], _("restart")) == 0) {
+   if (ua->argc >= 2 && strcasecmp(ua->argk[1], NT_("restart")) == 0) {
       term_python_interpreter();
       init_python_interpreter(director->hdr.name, 
          director->scripts_directory, "DirStartUp");
@@ -582,7 +613,7 @@ static int setip_cmd(UAContext *ua, const char *cmd)
    CLIENT *client;
    char buf[1024];
    if (!ua->cons || !acl_access_ok(ua, Client_ACL, ua->cons->hdr.name)) {
-      bsendmsg(ua, _("Illegal command from this console.\n"));
+      bsendmsg(ua, _("Unauthorized command from this console.\n"));
       return 1;
    }
    LockRes();
@@ -599,22 +630,68 @@ static int setip_cmd(UAContext *ua, const char *cmd)
    sockaddr_to_ascii(&(ua->UA_sock->client_addr), buf, sizeof(buf));
    client->address = bstrdup(buf);
    bsendmsg(ua, _("Client \"%s\" address set to %s\n"),
-           client->hdr.name, client->address);
+            client->hdr.name, client->address);
 get_out:
    UnlockRes();
    return 1;
 }
 
 
+static void do_en_disable_cmd(UAContext *ua, bool setting)
+{
+   JOB *job;
+   int i;
+
+   i = find_arg_with_value(ua, NT_("job")); 
+   if (i < 0) { 
+      job = select_job_resource(ua);
+      if (!job) {
+         return;
+      }
+   } else {
+      LockRes();
+      job = (JOB *)GetResWithName(R_JOB, ua->argv[i]);
+      UnlockRes();
+   } 
+   if (!job) {
+      bsendmsg(ua, _("Job \"%s\" not found.\n"), ua->argv[i]);
+      return;
+   }
+
+   if (!acl_access_ok(ua, Job_ACL, job->hdr.name)) {
+      bsendmsg(ua, _("Unauthorized command from this console.\n"));
+      return;
+   }
+   job->enabled = setting;
+   bsendmsg(ua, _("Job \"%s\" %sabled\n"), job->hdr.name, setting?"en":"dis");
+   return;
+}
+
+static int enable_cmd(UAContext *ua, const char *cmd)
+{
+   do_en_disable_cmd(ua, true);
+   return 1;
+}
+
+static int disable_cmd(UAContext *ua, const char *cmd)
+{
+   do_en_disable_cmd(ua, false);
+   return 1;
+}
+
+
 static void do_storage_setdebug(UAContext *ua, STORE *store, int level, int trace_flag)
 {
    BSOCK *sd;
    JCR *jcr = ua->jcr;
-
-   set_storage(jcr, store);
+   USTORE lstore;
+   
+   lstore.store = store;
+   pm_strcpy(lstore.store_source, _("unknown source"));
+   set_wstorage(jcr, &lstore);
    /* Try connecting for up to 15 seconds */
    bsendmsg(ua, _("Connecting to Storage daemon %s at %s:%d\n"),
-      store->hdr.name, store->address, store->SDport);
+      store->name(), store->address, store->SDport);
    if (!connect_to_storage_daemon(jcr, 1, 15, 0)) {
       bsendmsg(ua, _("Failed to connect to Storage daemon.\n"));
       return;
@@ -682,14 +759,14 @@ static void do_all_setdebug(UAContext *ua, int level, int trace_flag)
    while ((store = (STORE *)GetNextRes(R_STORAGE, (RES *)store))) {
       found = 0;
       for (j=0; j<i; j++) {
-        if (strcmp(unique_store[j]->address, store->address) == 0 &&
-            unique_store[j]->SDport == store->SDport) {
-           found = 1;
-           break;
-        }
+         if (strcmp(unique_store[j]->address, store->address) == 0 &&
+             unique_store[j]->SDport == store->SDport) {
+            found = 1;
+            break;
+         }
       }
       if (!found) {
-        unique_store[i++] = store;
+         unique_store[i++] = store;
          Dmsg2(140, "Stuffing: %s:%d\n", store->address, store->SDport);
       }
    }
@@ -716,14 +793,14 @@ static void do_all_setdebug(UAContext *ua, int level, int trace_flag)
    while ((client = (CLIENT *)GetNextRes(R_CLIENT, (RES *)client))) {
       found = 0;
       for (j=0; j<i; j++) {
-        if (strcmp(unique_client[j]->address, client->address) == 0 &&
-            unique_client[j]->FDport == client->FDport) {
-           found = 1;
-           break;
-        }
+         if (strcmp(unique_client[j]->address, client->address) == 0 &&
+             unique_client[j]->FDport == client->FDport) {
+            found = 1;
+            break;
+         }
       }
       if (!found) {
-        unique_client[i++] = client;
+         unique_client[i++] = client;
          Dmsg2(140, "Stuffing: %s:%d\n", client->address, client->FDport);
       }
    }
@@ -759,7 +836,7 @@ static int setdebug_cmd(UAContext *ua, const char *cmd)
    }
    if (level < 0) {
       if (!get_pint(ua, _("Enter new debug level: "))) {
-        return 1;
+         return 1;
       }
       level = ua->pint32_val;
    }
@@ -769,55 +846,55 @@ static int setdebug_cmd(UAContext *ua, const char *cmd)
    if (i >= 0) {
       trace_flag = atoi(ua->argv[i]);
       if (trace_flag > 0) {
-        trace_flag = 1;
+         trace_flag = 1;
       }
    }
 
    /* General debug? */
    for (i=1; i<ua->argc; i++) {
       if (strcasecmp(ua->argk[i], "all") == 0) {
-        do_all_setdebug(ua, level, trace_flag);
-        return 1;
+         do_all_setdebug(ua, level, trace_flag);
+         return 1;
       }
       if (strcasecmp(ua->argk[i], "dir") == 0 ||
           strcasecmp(ua->argk[i], "director") == 0) {
-        debug_level = level;
-        set_trace(trace_flag);
-        return 1;
+         debug_level = level;
+         set_trace(trace_flag);
+         return 1;
       }
       if (strcasecmp(ua->argk[i], "client") == 0 ||
           strcasecmp(ua->argk[i], "fd") == 0) {
-        client = NULL;
-        if (ua->argv[i]) {
-           client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[i]);
-           if (client) {
-              do_client_setdebug(ua, client, level, trace_flag);
-              return 1;
-           }
-        }
-        client = select_client_resource(ua);
-        if (client) {
-           do_client_setdebug(ua, client, level, trace_flag);
-           return 1;
-        }
+         client = NULL;
+         if (ua->argv[i]) {
+            client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[i]);
+            if (client) {
+               do_client_setdebug(ua, client, level, trace_flag);
+               return 1;
+            }
+         }
+         client = select_client_resource(ua);
+         if (client) {
+            do_client_setdebug(ua, client, level, trace_flag);
+            return 1;
+         }
       }
 
-      if (strcasecmp(ua->argk[i], "store") == 0 ||
-          strcasecmp(ua->argk[i], "storage") == 0 ||
-          strcasecmp(ua->argk[i], "sd") == 0) {
-        store = NULL;
-        if (ua->argv[i]) {
-           store = (STORE *)GetResWithName(R_STORAGE, ua->argv[i]);
-           if (store) {
-              do_storage_setdebug(ua, store, level, trace_flag);
-              return 1;
-           }
-        }
-        store = get_storage_resource(ua, false/*no default*/);
-        if (store) {
-           do_storage_setdebug(ua, store, level, trace_flag);
-           return 1;
-        }
+      if (strcasecmp(ua->argk[i], NT_("store")) == 0 ||
+          strcasecmp(ua->argk[i], NT_("storage")) == 0 ||
+          strcasecmp(ua->argk[i], NT_("sd")) == 0) {
+         store = NULL;
+         if (ua->argv[i]) {
+            store = (STORE *)GetResWithName(R_STORAGE, ua->argv[i]);
+            if (store) {
+               do_storage_setdebug(ua, store, level, trace_flag);
+               return 1;
+            }
+         }
+         store = get_storage_resource(ua, false/*no default*/);
+         if (store) {
+            do_storage_setdebug(ua, store, level, trace_flag);
+            return 1;
+         }
       }
    }
    /*
@@ -825,25 +902,25 @@ static int setdebug_cmd(UAContext *ua, const char *cmd)
     * prompt the user.
     */
    start_prompt(ua, _("Available daemons are: \n"));
-   add_prompt(ua, "Director");
-   add_prompt(ua, "Storage");
-   add_prompt(ua, "Client");
-   add_prompt(ua, "All");
+   add_prompt(ua, _("Director"));
+   add_prompt(ua, _("Storage"));
+   add_prompt(ua, _("Client"));
+   add_prompt(ua, _("All"));
    switch(do_prompt(ua, "", _("Select daemon type to set debug level"), NULL, 0)) {
-   case 0:                        /* Director */
+   case 0:                         /* Director */
       debug_level = level;
       set_trace(trace_flag);
       break;
    case 1:
       store = get_storage_resource(ua, false/*no default*/);
       if (store) {
-        do_storage_setdebug(ua, store, level, trace_flag);
+         do_storage_setdebug(ua, store, level, trace_flag);
       }
       break;
    case 2:
       client = select_client_resource(ua);
       if (client) {
-        do_client_setdebug(ua, client, level, trace_flag);
+         do_client_setdebug(ua, client, level, trace_flag);
       }
       break;
    case 3:
@@ -864,14 +941,14 @@ static int trace_cmd(UAContext *ua, const char *cmd)
 
    if (ua->argc != 2) {
       if (!get_cmd(ua, _("Turn on or off? "))) {
-           return 1;
+            return 1;
       }
       onoff = ua->cmd;
    } else {
       onoff = ua->argk[1];
    }
 
-   set_trace((strcasecmp(onoff, _("off")) == 0) ? false : true);
+   set_trace((strcasecmp(onoff, NT_("off")) == 0) ? false : true);
    return 1;
 
 }
@@ -908,46 +985,46 @@ static int estimate_cmd(UAContext *ua, const char *cmd)
 
    jcr->JobLevel = L_FULL;
    for (int i=1; i<ua->argc; i++) {
-      if (strcasecmp(ua->argk[i], "client") == 0 ||
-          strcasecmp(ua->argk[i], "fd") == 0) {
-        if (ua->argv[i]) {
-           client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[i]);
-           continue;
-        }
+      if (strcasecmp(ua->argk[i], NT_("client")) == 0 ||
+          strcasecmp(ua->argk[i], NT_("fd")) == 0) {
+         if (ua->argv[i]) {
+            client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[i]);
+            continue;
+         }
       }
-      if (strcasecmp(ua->argk[i], "job") == 0) {
-        if (ua->argv[i]) {
-           job = (JOB *)GetResWithName(R_JOB, ua->argv[i]);
-           continue;
-        }
+      if (strcasecmp(ua->argk[i], NT_("job")) == 0) {
+         if (ua->argv[i]) {
+            job = (JOB *)GetResWithName(R_JOB, ua->argv[i]);
+            continue;
+         }
       }
-      if (strcasecmp(ua->argk[i], "fileset") == 0) {
-        if (ua->argv[i]) {
-           fileset = (FILESET *)GetResWithName(R_FILESET, ua->argv[i]);
-           continue;
-        }
+      if (strcasecmp(ua->argk[i], NT_("fileset")) == 0) {
+         if (ua->argv[i]) {
+            fileset = (FILESET *)GetResWithName(R_FILESET, ua->argv[i]);
+            continue;
+         }
       }
-      if (strcasecmp(ua->argk[i], "listing") == 0) {
-        listing = 1;
-        continue;
+      if (strcasecmp(ua->argk[i], NT_("listing")) == 0) {
+         listing = 1;
+         continue;
       }
-      if (strcasecmp(ua->argk[i], "level") == 0) {
-        if (!get_level_from_name(ua->jcr, ua->argv[i])) {
+      if (strcasecmp(ua->argk[i], NT_("level")) == 0) {
+         if (!get_level_from_name(ua->jcr, ua->argv[i])) {
             bsendmsg(ua, _("Level %s not valid.\n"), ua->argv[i]);
-        }
-        continue;
+         }
+         continue;
       }
    }
    if (!job && !(client && fileset)) {
       if (!(job = select_job_resource(ua))) {
-        return 1;
+         return 1;
       }
    }
    if (!job) {
       job = (JOB *)GetResWithName(R_JOB, ua->argk[1]);
       if (!job) {
          bsendmsg(ua, _("No job specified.\n"));
-        return 1;
+         return 1;
       }
    }
    if (!client) {
@@ -1022,7 +1099,7 @@ static int time_cmd(UAContext *ua, const char *cmd)
    char sdt[50];
    time_t ttime = time(NULL);
    struct tm tm;
-   localtime_r(&ttime, &tm);
+   (void)localtime_r(&ttime, &tm);
    strftime(sdt, sizeof(sdt), "%d-%b-%Y %H:%M:%S", &tm);
    bsendmsg(ua, "%s\n", sdt);
    return 1;
@@ -1049,9 +1126,9 @@ static int reload_cmd(UAContext *ua, const char *cmd)
 static int delete_cmd(UAContext *ua, const char *cmd)
 {
    static const char *keywords[] = {
-      N_("volume"),
-      N_("pool"),
-      N_("jobid"),
+      NT_("volume"),
+      NT_("pool"),
+      NT_("jobid"),
       NULL};
 
    if (!open_db(ua)) {
@@ -1068,8 +1145,8 @@ static int delete_cmd(UAContext *ua, const char *cmd)
    case 2:
       int i;
       while ((i=find_arg(ua, "jobid")) > 0) {
-        delete_job(ua);
-        *ua->argk[i] = 0;         /* zap keyword already visited */
+         delete_job(ua);
+         *ua->argk[i] = 0;         /* zap keyword already visited */
       }
       return 1;
    default:
@@ -1111,42 +1188,42 @@ static void delete_job(UAContext *ua)
    JobId_t JobId;
    char *s,*sep,*tok;
 
-   int i = find_arg_with_value(ua, N_("jobid"));
+   int i = find_arg_with_value(ua, NT_("jobid"));
    if (i >= 0) {
       if (strchr(ua->argv[i], ',') != NULL || strchr(ua->argv[i], '-') != NULL) {
-       s = bstrdup(ua->argv[i]);
-       tok = s;
-       /*
+        s = bstrdup(ua->argv[i]);
+        tok = s;
+        /*
          * We could use strtok() here.  But we're not going to, because:
-        * (a) strtok() is deprecated, having been replaced by strsep();
-        * (b) strtok() is broken in significant ways.
+         * (a) strtok() is deprecated, having been replaced by strsep();
+         * (b) strtok() is broken in significant ways.
          * we could use strsep() instead, but it's not universally available.
-        * so we grow our own using strchr().
-        */
+         * so we grow our own using strchr().
+         */
         sep = strchr(tok, ',');
-       while (sep != NULL) {
+        while (sep != NULL) {
            *sep = '\0';
            if (strchr(tok, '-')) {
-              delete_job_id_range(ua, tok);
-          } else {
-             JobId = str_to_int64(tok);
-             do_job_delete(ua, JobId);
-          }
-          tok = ++sep;
+               delete_job_id_range(ua, tok);
+           } else {
+              JobId = str_to_int64(tok);
+              do_job_delete(ua, JobId);
+           }
+           tok = ++sep;
            sep = strchr(tok, ',');
-       }
-       /* pick up the last token */
+        }
+        /* pick up the last token */
         if (strchr(tok, '-')) {
-           delete_job_id_range(ua, tok);
-       } else {
-           JobId = str_to_int64(tok);
-           do_job_delete(ua, JobId);
-       }
+            delete_job_id_range(ua, tok);
+        } else {
+            JobId = str_to_int64(tok);
+            do_job_delete(ua, JobId);
+        }
 
-        free(s);
+         free(s);
       } else {
-        JobId = str_to_int64(ua->argv[i]);
-       do_job_delete(ua, JobId);
+         JobId = str_to_int64(ua->argv[i]);
+        do_job_delete(ua, JobId);
       }
    } else if (!get_pint(ua, _("Enter JobId to delete: "))) {
       return;
@@ -1176,21 +1253,15 @@ static void delete_job_id_range(UAContext *ua, char *tok)
 
 /*
  * do_job_delete now performs the actual delete operation atomically
- * we always return 1 because C++ is pissy about void functions
  */
 
 static void do_job_delete(UAContext *ua, JobId_t JobId)
 {
-   POOLMEM *query = get_pool_memory(PM_MESSAGE);
+   POOL_MEM query(PM_MESSAGE);
    char ed1[50];
 
-   Mmsg(query, "DELETE FROM Job WHERE JobId=%s", edit_int64(JobId, ed1));
-   db_sql_query(ua->db, query, NULL, (void *)NULL);
-   Mmsg(query, "DELETE FROM File WHERE JobId=%s", edit_int64(JobId, ed1));
-   db_sql_query(ua->db, query, NULL, (void *)NULL);
-   Mmsg(query, "DELETE FROM JobMedia WHERE JobId=%s", edit_int64(JobId, ed1));
-   db_sql_query(ua->db, query, NULL, (void *)NULL);
-   free_pool_memory(query);
+   purge_files_from_job(ua, JobId);
+   purge_job_from_catalog(ua, JobId);
    bsendmsg(ua, _("Job %s and associated records deleted from the catalog.\n"), edit_int64(JobId, ed1));
 }
 
@@ -1241,35 +1312,44 @@ static int delete_pool(UAContext *ua)
 
 static void do_mount_cmd(UAContext *ua, const char *command)
 {
-   STORE *store;
+   USTORE store;
    BSOCK *sd;
    JCR *jcr = ua->jcr;
    char dev_name[MAX_NAME_LENGTH];
    int drive;
+   int slot = -1;
 
    if (!open_db(ua)) {
       return;
    }
    Dmsg2(120, "%s: %s\n", command, ua->UA_sock->msg);
 
-   store = get_storage_resource(ua, true/*use default*/);
-   if (!store) {
+   store.store = get_storage_resource(ua, true/*arg is storage*/);
+   pm_strcpy(store.store_source, _("unknown source"));
+   if (!store.store) {
       return;
    }
-   drive = get_storage_drive(ua, store);
+   set_wstorage(jcr, &store);
+   drive = get_storage_drive(ua, store.store);
+   if (strcmp(command, "mount") == 0) {
+      slot = get_storage_slot(ua, store.store);
+   }
 
    Dmsg3(120, "Found storage, MediaType=%s DevName=%s drive=%d\n",
-      store->media_type, store->dev_name(), drive);
+      store.store->media_type, store.store->dev_name(), drive);
 
-   set_storage(jcr, store);
    if (!connect_to_storage_daemon(jcr, 10, SDConnectTimeout, 1)) {
       bsendmsg(ua, _("Failed to connect to Storage daemon.\n"));
       return;
    }
    sd = jcr->store_bsock;
-   bstrncpy(dev_name, store->dev_name(), sizeof(dev_name));
+   bstrncpy(dev_name, store.store->dev_name(), sizeof(dev_name));
    bash_spaces(dev_name);
-   bnet_fsend(sd, "%s %s drive=%d", command, dev_name, drive);
+   if (slot > 0) {
+      bnet_fsend(sd, "%s %s drive=%d slot=%d", command, dev_name, drive, slot);
+   } else {
+      bnet_fsend(sd, "%s %s drive=%d", command, dev_name, drive);
+   }
    while (bnet_recv(sd) >= 0) {
       bsendmsg(ua, "%s", sd->msg);
    }
@@ -1279,7 +1359,7 @@ static void do_mount_cmd(UAContext *ua, const char *command)
 }
 
 /*
- * mount [storage=<name>] [drive=nn]
+ * mount [storage=<name>] [drive=nn] [slot=mm]
  */
 static int mount_cmd(UAContext *ua, const char *cmd)
 {
@@ -1317,7 +1397,7 @@ static int use_cmd(UAContext *ua, const char *cmd)
    CAT *oldcatalog, *catalog;
 
 
-   close_db(ua);                     /* close any previously open db */
+   close_db(ua);                      /* close any previously open db */
    oldcatalog = ua->catalog;
 
    if (!(catalog = get_catalog_resource(ua))) {
@@ -1327,7 +1407,7 @@ static int use_cmd(UAContext *ua, const char *cmd)
    }
    if (open_db(ua)) {
       bsendmsg(ua, _("Using Catalog name=%s DB=%s\n"),
-        ua->catalog->hdr.name, ua->catalog->db_name);
+         ua->catalog->hdr.name, ua->catalog->db_name);
    }
    return 1;
 }
@@ -1338,27 +1418,158 @@ int quit_cmd(UAContext *ua, const char *cmd)
    return 1;
 }
 
+/* Handler to get job status */
+static int status_handler(void *ctx, int num_fields, char **row)
+{
+   char *val = (char *)ctx;
+
+   if (row[0]) {
+      *val = row[0][0];
+   } else {
+      *val = '?';               /* Unknown by default */
+   }
+
+   return 0;
+}
+
 /*
  * Wait until no job is running
  */
 int wait_cmd(UAContext *ua, const char *cmd)
 {
    JCR *jcr;
-   bmicrosleep(0, 200000);           /* let job actually start */
+
+   /* no args
+    * Wait until no job is running
+    */
+   if (ua->argc == 1) {
+      bmicrosleep(0, 200000);            /* let job actually start */
+      for (bool running=true; running; ) {
+         running = false;
+         foreach_jcr(jcr) {
+            if (jcr->JobId != 0) {
+               running = true;
+               break;
+            }
+         }
+         endeach_jcr(jcr);
+
+         if (running) {
+            bmicrosleep(1, 0);
+         }
+      }
+      return 1;
+   }
+
+   /* we have jobid, jobname or ujobid argument */
+
+   uint32_t jobid = 0 ;
+
+   if (!open_db(ua)) {
+      bsendmsg(ua, _("ERR: Can't open db\n")) ;
+      return 1;
+   }
+
+   for (int i=1; i<ua->argc; i++) {
+      if (strcasecmp(ua->argk[i], "jobid") == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         jobid = str_to_int64(ua->argv[i]);
+         break;
+      } else if (strcasecmp(ua->argk[i], "jobname") == 0 ||
+                 strcasecmp(ua->argk[i], "job") == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         jcr=get_jcr_by_partial_name(ua->argv[i]) ;
+         if (jcr) {
+            jobid = jcr->JobId ;
+            free_jcr(jcr);
+         }
+         break;
+      } else if (strcasecmp(ua->argk[i], "ujobid") == 0) {
+         if (!ua->argv[i]) {
+            break;
+         }
+         jcr=get_jcr_by_full_name(ua->argv[i]) ;
+         if (jcr) {
+            jobid = jcr->JobId ;
+            free_jcr(jcr);
+         }
+         break;
+      }
+   }
+
+   if (jobid == 0) {
+      bsendmsg(ua, _("ERR: Job was not found\n"));
+      return 1 ;
+   }
+
+   /*
+    * We wait the end of job
+    */
+
+   bmicrosleep(0, 200000);            /* let job actually start */
    for (bool running=true; running; ) {
       running = false;
-      foreach_jcr(jcr) {
-        if (jcr->JobId != 0) {
-           running = true;
-           free_jcr(jcr);
-           break;
-        }
-        free_jcr(jcr);
+
+      jcr=get_jcr_by_id(jobid) ;
+
+      if (jcr) {
+         running = true ;
+         free_jcr(jcr);
       }
+
       if (running) {
-        bmicrosleep(1, 0);
+         bmicrosleep(1, 0);
       }
    }
+
+   /*
+    * We have to get JobStatus
+    */
+
+   int status ;
+   char jobstatus = '?';        /* Unknown by default */
+   char buf[256] ;
+
+   bsnprintf(buf, sizeof(buf),
+             "SELECT JobStatus FROM Job WHERE JobId='%i'", jobid);
+
+
+   db_sql_query(ua->db, buf,
+                status_handler, (void *)&jobstatus);
+
+   switch (jobstatus) {
+   case JS_Error:
+      status = 1 ;         /* Warning */
+      break;
+
+   case JS_FatalError:
+   case JS_ErrorTerminated:
+   case JS_Canceled:
+      status = 2 ;         /* Critical */
+      break;
+
+   case JS_Terminated:
+      status = 0 ;         /* Ok */
+      break;
+
+   default:
+      status = 3 ;         /* Unknown */
+      break;
+   }
+
+   bsendmsg(ua, "JobId=%i\n", jobid) ;
+   bsendmsg(ua, "JobStatus=%s (%c)\n", 
+            job_status_to_str(jobstatus), 
+            jobstatus) ;
+
+   if (ua->gui) {
+      bsendmsg(ua, "ExitStatus=%i\n", status) ;
+   }
+
    return 1;
 }
 
@@ -1380,7 +1591,7 @@ int qhelp_cmd(UAContext *ua, const char *cmd)
    unsigned int i;
 
    for (i=0; i<comsize; i++) {
-      bsendmsg(ua, "%s %s\n", _(commands[i].key), _(commands[i].help));
+      bsendmsg(ua, "%s %s\n", commands[i].key, _(commands[i].help));
    }
    return 1;
 }
@@ -1392,25 +1603,19 @@ static int version_cmd(UAContext *ua, const char *cmd)
 }
 
 
-/* A bit brain damaged in that if the user has not done
- * a "use catalog xxx" command, we simply find the first
- * catalog resource and open it.
+/*
+ * Open the catalog database.
  */
-int open_db(UAContext *ua)
+bool open_db(UAContext *ua)
 {
    if (ua->db) {
-      return 1;
+      return true;
    }
    if (!ua->catalog) {
-      LockRes();
-      ua->catalog = (CAT *)GetNextRes(R_CATALOG, NULL);
-      UnlockRes();
+      ua->catalog = get_catalog_resource(ua);
       if (!ua->catalog) {
          bsendmsg(ua, _("Could not find a Catalog resource\n"));
-        return 0;
-      } else {
-         bsendmsg(ua, _("Using default Catalog name=%s DB=%s\n"),
-           ua->catalog->hdr.name, ua->catalog->db_name);
+         return false;
       }
    }
 
@@ -1418,21 +1623,21 @@ int open_db(UAContext *ua)
 
    Dmsg0(150, "Open database\n");
    ua->db = db_init_database(ua->jcr, ua->catalog->db_name, 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);
+                             ua->catalog->db_password, ua->catalog->db_address,
+                             ua->catalog->db_port, ua->catalog->db_socket,
+                             ua->catalog->mult_db_connections);
    if (!ua->db || !db_open_database(ua->jcr, ua->db)) {
-      bsendmsg(ua, _("Could not open database \"%s\".\n"),
-                ua->catalog->db_name);
+      bsendmsg(ua, _("Could not open catalog database \"%s\".\n"),
+                 ua->catalog->db_name);
       if (ua->db) {
          bsendmsg(ua, "%s", db_strerror(ua->db));
       }
       close_db(ua);
-      return 0;
+      return false;
    }
    ua->jcr->db = ua->db;
    Dmsg1(150, "DB %s opened\n", ua->catalog->db_name);
-   return 1;
+   return true;
 }
 
 void close_db(UAContext *ua)
@@ -1441,7 +1646,7 @@ void close_db(UAContext *ua)
       db_close_database(ua->jcr, ua->db);
       ua->db = NULL;
       if (ua->jcr) {
-        ua->jcr->db = NULL;
+         ua->jcr->db = NULL;
       }
    }
 }