/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
int qhelp_cmd(UAContext *ua, const char *cmd);
int quit_cmd(UAContext *ua, const char *cmd);
-
+/* not all in alphabetical order. New commands are added after existing commands with similar letters
+ to prevent breakage of existing user scripts. */
struct cmdstruct { const char *key; int (*func)(UAContext *ua, const char *cmd); const char *help; const bool use_in_rs;};
static struct cmdstruct commands[] = { /* Can use it in Console RunScript*/
- { NT_("add"), add_cmd, _("[pool=<pool-name> storage=<storage> jobid=<JobId>] -- add media to a pool"), false},
+ { NT_("add"), add_cmd, _("add [pool=<pool-name> storage=<storage> jobid=<JobId>] -- "
+ "\n add media to a pool"), false},
{ NT_("autodisplay"), autodisplay_cmd, _("autodisplay [on|off] -- console messages"),false},
{ NT_("automount"), automount_cmd, _("automount [on|off] -- after label"), false},
- { NT_("cancel"), cancel_cmd, _("cancel [jobid=<number> job=<job-name> ujobid=<unique-jobid>] -- cancel a job"), false},
+ { NT_("cancel"), cancel_cmd, _("cancel [jobid=<number> job=<job-name> ujobid=<unique-jobid>] -- "
+ "\n cancel a job"), false},
{ NT_("create"), create_cmd, _("create [pool=<pool-name>] -- create DB Pool from resource"), false},
{ NT_("delete"), delete_cmd, _("delete [volume=<vol-name> pool=<pool-name> job jobid=<id>]"), true},
{ NT_("disable"), disable_cmd, _("disable <job=name> -- disable a job"), true},
{ NT_("gui"), gui_cmd, _("gui [on|off] -- non-interactive gui mode"), false},
{ NT_("help"), help_cmd, _("print this command"), false},
{ NT_("label"), label_cmd, _("label a tape"), false},
- { NT_("list"), list_cmd, _("list [pools | jobs | jobtotals | media <pool=pool-name> | files <jobid=nn> | copies <jobid=nn>]; from catalog"), true},
+ { NT_("list"), list_cmd, _("list [pools | jobs | jobtotals | media <pool=pool-name> | "
+ "\n files <jobid=nn> | copies <jobid=nn>]; from catalog"), true},
{ NT_("llist"), llist_cmd, _("full or long list like list command"), true},
- { NT_("memory"), memory_cmd, _("print current memory usage"), true},
{ NT_("messages"), messagescmd, _("messages"), false},
- { NT_("mount"), mount_cmd, _("mount storage=<storage-name> [ slot=<num> ] [ drive=<num> ] or mount [ jobid=<id> | job=<job-name> ]"), false},
- { NT_("prune"), prunecmd, _("files|jobs|volume client=<client-name> volume=<volume-name> prune expired records from catalog"), true},
+ { NT_("memory"), memory_cmd, _("print current memory usage"), true},
+ { NT_("mount"), mount_cmd, _("mount storage=<storage-name> [ slot=<num> ] [ drive=<num> ] "
+ "\n or mount [ jobid=<id> | job=<job-name> ]"), false},
+ { NT_("prune"), prunecmd, _("prune files|jobs|volume client=<client-name> volume=<volume-name> "
+ "\n prune expired records from catalog"), true},
{ NT_("purge"), purgecmd, _("purge records from catalog"), true},
{ NT_("python"), python_cmd, _("python control commands"), false},
{ NT_("quit"), quit_cmd, _("quit"), false},
{ NT_("query"), querycmd, _("query catalog"), false},
{ NT_("restore"), restore_cmd, _("restore files"), false},
- { NT_("relabel"), relabel_cmd, _("relabel storage=<storage-name> oldvolume=<old-volume-name> volume=<newvolume-name> -- relabel a tape"), false},
+ { NT_("relabel"), relabel_cmd, _("relabel storage=<storage-name> oldvolume=<old-volume-name> "
+ "\n volume=<newvolume-name> -- relabel a tape"), false},
{ NT_("release"), release_cmd, _("release <storage-name>"), false},
{ NT_("reload"), reload_cmd, _("reload conf file"), true},
- { NT_("run"), run_cmd, _("run 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_("setdebug"), setdebug_cmd, _("setdebug level=nn [trace=0/1 client=<client-name> | dir | director | storage=<storage-name> | all] -- sets debug level"), true},
+ { NT_("run"), run_cmd, _("run job=<job-name> client=<client-name> fileset=<FileSet-name> "
+ "\n level=<level-keyword> storage=<storage-name> where=<directory-prefix> "
+ "\n when=<universal-time-specification> yes"), false}, /* need to be check */
+ { NT_("status"), status_cmd, _("status [all | dir=<dir-name> | director | client=<client-name> |"
+ "\n storage=<storage-name> | days=nnn]"), true},
+ { NT_("setdebug"), setdebug_cmd, _("setdebug level=nn [trace=0/1 client=<client-name> |"
+ "\n dir | director | storage=<storage-name> | all] -- sets debug level"), true},
{ NT_("setip"), setip_cmd, _("sets new client address -- if authorized"), false},
{ NT_("show"), show_cmd, _("show (resource records) [jobs | pools | ... | all]"), true},
- { NT_("status"), status_cmd, _("status [all | dir=<dir-name> | director | client=<client-name> | storage=<storage-name> | days=nnn]"), true},
{ NT_("sqlquery"), sqlquerycmd, _("use SQL to query catalog"), false},
{ NT_("time"), time_cmd, _("print current time"), true},
{ NT_("trace"), trace_cmd, _("turn on/off trace to file"), true},
- { NT_("unmount"), unmount_cmd, _("unmount storage=<storage-name> [ drive=<num> ] or unmount [ jobid=<id> | job=<job-name> ]"), false},
+ { NT_("unmount"), unmount_cmd, _("unmount storage=<storage-name> [ drive=<num> ] "
+ "\n or unmount [ jobid=<id> | job=<job-name> ]"), false},
{ NT_("umount"), unmount_cmd, _("umount - for old-time Unix guys, see unmount"),false},
{ NT_("update"), update_cmd, _("update Volume, Pool or slots"), true},
{ NT_("use"), use_cmd, _("use <database-name> -- catalog xxx"), false},
{ NT_("var"), var_cmd, _("does variable expansion"), false},
{ NT_("version"), version_cmd, _("print Director version"), true},
- { NT_("wait"), wait_cmd, _("wait [<jobname=name> | <jobid=nnn> | <ujobid=complete_name>] -- wait until no jobs are running"), false},
- };
-#define comsize (sizeof(commands)/sizeof(struct cmdstruct))
+ { NT_("wait"), wait_cmd, _("wait [<jobname=name> | <jobid=nnn> | <ujobid=complete_name>] -- "
+ "\n wait until no jobs are running"), false}
+};
+
+#define comsize ((int)(sizeof(commands)/sizeof(struct cmdstruct)))
/*
* Execute a command from the UA
*/
bool do_a_command(UAContext *ua)
{
- unsigned int i;
+ int i;
int len;
bool ok = false;
bool found = false;
}
if (ua->api) user->signal(BNET_CMD_BEGIN);
ok = (*commands[i].func)(ua, ua->cmd); /* go execute command */
+ if (ua->api) user->signal(ok?BNET_CMD_OK:BNET_CMD_FAILED);
found = true;
break;
}
ua->error_msg(_("%s: is an invalid command.\n"), ua->argk[0]);
ok = false;
}
- if (ua->api) user->signal(ok?BNET_CMD_OK:BNET_CMD_FAILED);
return ok;
}
}
}
-/* set/update Pool.RecyclePoolId in Catalog */
-int update_pool_recyclepool(JCR *jcr, B_DB *db, POOL *pool)
+/* set/update Pool.RecyclePoolId and Pool.ScratchPoolId in Catalog */
+int update_pool_references(JCR *jcr, B_DB *db, POOL *pool)
{
POOL_DBR pr;
- if (!pool->RecyclePool) {
+ if (!pool->RecyclePool && !pool->ScratchPool) {
return 1;
}
set_pooldbr_from_poolres(&pr, pool, POOL_OP_UPDATE);
- if (!set_pooldbr_recyclepoolid(jcr, db, &pr, pool)) {
+ if (!set_pooldbr_references(jcr, db, &pr, pool)) {
return -1; /* error */
}
return 1;
}
-/* set POOL_DBR.RecyclePoolId from Pool resource
+/* set POOL_DBR.RecyclePoolId and POOL_DBR.ScratchPoolId from Pool resource
* works with set_pooldbr_from_poolres
*/
-bool set_pooldbr_recyclepoolid(JCR *jcr, B_DB *db, POOL_DBR *pr, POOL *pool)
+bool set_pooldbr_references(JCR *jcr, B_DB *db, POOL_DBR *pr, POOL *pool)
{
POOL_DBR rpool;
bool ret = true;
} else { /* no RecyclePool used, set it to 0 */
pr->RecyclePoolId = 0;
}
+
+ if (pool->ScratchPool) {
+ memset(&rpool, 0, sizeof(POOL_DBR));
+
+ bstrncpy(rpool.Name, pool->ScratchPool->name(), sizeof(rpool.Name));
+ if (db_get_pool_record(jcr, db, &rpool)) {
+ pr->ScratchPoolId = rpool.PoolId;
+ } else {
+ Jmsg(jcr, M_WARNING, 0,
+ _("Can't set %s ScratchPool to %s, %s is not in database.\n" \
+ "Try to update it with 'update pool=%s'\n"),
+ pool->name(), rpool.Name, rpool.Name,pool->name());
+ ret = false;
+ }
+ } else { /* no ScratchPool used, set it to 0 */
+ pr->ScratchPoolId = 0;
+ }
+
return ret;
}
/* Pool Exists */
if (op == POOL_OP_UPDATE) { /* update request */
set_pooldbr_from_poolres(&pr, pool, op);
+ set_pooldbr_references(jcr, db, &pr, pool);
db_update_pool_record(jcr, db, &pr);
}
return 0; /* exists */
}
set_pooldbr_from_poolres(&pr, pool, op);
+ set_pooldbr_references(jcr, db, &pr, pool);
if (!db_create_pool_record(jcr, db, &pr)) {
return -1; /* error */
status = 2 ; /* Critical */
break;
+ case JS_Warnings:
case JS_Terminated:
status = 0 ; /* Ok */
break;
static int help_cmd(UAContext *ua, const char *cmd)
{
- unsigned int i;
+ int i;
ua->send_msg(_(" Command Description\n ======= ===========\n"));
for (i=0; i<comsize; i++) {
int qhelp_cmd(UAContext *ua, const char *cmd)
{
- unsigned int i;
+ int i;
for (i=0; i<comsize; i++) {
ua->send_msg("%s %s\n", commands[i].key, _(commands[i].help));
static int version_cmd(UAContext *ua, const char *cmd)
{
ua->send_msg(_("%s Version: %s (%s) %s %s %s %s\n"), my_name, VERSION, BDATE,
- NPRTB(director->verid), HOST_OS, DISTNAME, DISTVER);
+ HOST_OS, DISTNAME, DISTVER, NPRTB(director->verid));
return 1;
}
#else