-/*
- *
- * Bacula Director -- User Agent Output Commands
- * I.e. messages, listing database, showing resources, ...
- *
- * Kern Sibbald, September MM
- *
- * Version $Id$
- */
/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2007 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.
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
*/
+/*
+ *
+ * Bacula Director -- User Agent Output Commands
+ * I.e. messages, listing database, showing resources, ...
+ *
+ * Kern Sibbald, September MM
+ *
+ * Version $Id$
+ */
#include "bacula.h"
#include "dird.h"
POOL_DBR pr;
MEDIA_DBR mr;
- if (!open_db(ua))
+ if (!open_client_db(ua))
return 1;
memset(&jr, 0, sizeof(jr));
if (j >= 0) {
n = atoi(ua->argv[j]);
if ((n < 0) || (n > 50)) {
- bsendmsg(ua, _("Ignoring illegal value for days.\n"));
+ bsendmsg(ua, _("Ignoring invalid value for days. Max is 50.\n"));
n = 1;
}
}
{
JOB *job;
JCR *jcr = ua->jcr;
- POOL *pool;
+ USTORE store;
RUN *run;
time_t runtime;
bool found = false;
}
}
for (run=NULL; (run = find_next_run(run, job, runtime, ndays)); ) {
- pool = run->pool ? run->pool : NULL;
- if (!complete_jcr_for_job(jcr, job, pool)) {
+ if (!complete_jcr_for_job(jcr, job, run->pool)) {
return false;
}
memset(&pr, 0, sizeof(pr));
pr.PoolId = jcr->jr.PoolId;
- if (! db_get_pool_record(ua->jcr, ua->db, &pr)) {
+ if (!db_get_pool_record(ua->jcr, ua->db, &pr)) {
bstrncpy(pr.Name, "*UnknownPool*", sizeof(pr.Name));
}
mr.PoolId = jcr->jr.PoolId;
- if (run->storage) {
- jcr->wstore = run->storage;
- } else {
- jcr->wstore = (STORE *)job->storage->first();
- }
- mr.StorageId = jcr->wstore->StorageId;
- if (!find_next_volume_for_append(jcr, &mr, 1, false/*no create*/)) {
+ get_job_storage(&store, job, run);
+ mr.StorageId = store.store->StorageId;
+ if (!find_next_volume_for_append(jcr, &mr, 1, fnv_no_create_vol, fnv_prune)) {
bsendmsg(ua, _("Could not find next Volume for Job %s (%s, %s).\n"),
job->hdr.name, pr.Name, level_to_str(run->level));
} else {
* Fill in the remaining fields of the jcr as if it
* is going to run the job.
*/
-int complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool)
+bool complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool)
{
POOL_DBR pr;
if (pool) {
jcr->pool = pool; /* override */
}
+ if (jcr->db) {
+ db_close_database(jcr, jcr->db);
+ jcr->db = NULL;
+ }
jcr->db = jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user,
jcr->catalog->db_password, jcr->catalog->db_address,
jcr->catalog->db_port, jcr->catalog->db_socket,
jcr->catalog->db_name);
if (jcr->db) {
Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
+ db_close_database(jcr, jcr->db);
+ jcr->db = NULL;
}
- return 0;
+ return false;
}
- bstrncpy(pr.Name, jcr->pool->hdr.name, sizeof(pr.Name));
+ bstrncpy(pr.Name, jcr->pool->name(), sizeof(pr.Name));
while (!db_get_pool_record(jcr, jcr->db, &pr)) { /* get by Name */
/* Try to create the pool */
if (create_pool(jcr, jcr->db, jcr->pool, POOL_OP_CREATE) < 0) {
db_close_database(jcr, jcr->db);
jcr->db = NULL;
}
- return 0;
+ return false;
} else {
Jmsg(jcr, M_INFO, 0, _("Pool %s created in database.\n"), pr.Name);
}
}
jcr->jr.PoolId = pr.PoolId;
- return 1;
+ return true;
}
* agent, so we are being called from Bacula core. In
* that case direct the messages to the Job.
*/
-void bsendmsg(void *ctx, const char *fmt, ...)
+void bmsg(UAContext *ua, const char *fmt, va_list arg_ptr)
{
- va_list arg_ptr;
- UAContext *ua = (UAContext *)ctx;
BSOCK *bs = ua->UA_sock;
int maxlen, len;
POOLMEM *msg;
again:
maxlen = sizeof_pool_memory(msg) - 1;
- va_start(arg_ptr, fmt);
len = bvsnprintf(msg, maxlen, fmt, arg_ptr);
- va_end(arg_ptr);
if (len < 0 || len >= maxlen) {
msg = realloc_pool_memory(msg, maxlen + maxlen/2);
goto again;
}
}
+
+void bsendmsg(void *ctx, const char *fmt, ...)
+{
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ bmsg((UAContext *)ctx, fmt, arg_ptr);
+ va_end(arg_ptr);
+}
+
+/*
+ * The following UA methods are mainly intended for GUI
+ * programs
+ */
+/*
+ * This is a message that should be displayed on the user's
+ * console.
+ */
+void UAContext::send_msg(const char *fmt, ...)
+{
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ bmsg(this, fmt, arg_ptr);
+ va_end(arg_ptr);
+}
+
+
+/*
+ * This is an error condition with a command. The gui should put
+ * up an error or critical dialog box. The command is aborted.
+ */
+void UAContext::error_msg(const char *fmt, ...)
+{
+ BSOCK *bs = UA_sock;
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ if (bs && api) bs->signal(BNET_ERROR_MSG);
+ bmsg(this, fmt, arg_ptr);
+ va_end(arg_ptr);
+}
+
+/*
+ * This is a warning message, that should bring up a warning
+ * dialog box on the GUI. The command is not aborted, but something
+ * went wrong.
+ */
+void UAContext::warning_msg(const char *fmt, ...)
+{
+ BSOCK *bs = UA_sock;
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ if (bs && api) bs->signal(BNET_WARNING_MSG);
+ bmsg(this, fmt, arg_ptr);
+ va_end(arg_ptr);
+}
+
+/*
+ * This is an information message that should probably be put
+ * into the status line of a GUI program.
+ */
+void UAContext::info_msg(const char *fmt, ...)
+{
+ BSOCK *bs = UA_sock;
+ va_list arg_ptr;
+ va_start(arg_ptr, fmt);
+ if (bs && api) bs->signal(BNET_INFO_MSG);
+ bmsg(this, fmt, arg_ptr);
+ va_end(arg_ptr);
+}