From e27cb1525abe8163f0ef1290395c73bbe2ddb78e Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Thu, 6 Oct 2005 07:03:52 +0000 Subject: [PATCH] - Add VolumePurged method to Python JobEvents class. Fixes bug #428 (I think). - Add JobId index to File table for MySQL. - Correct tray-monitor crash of bacula-dir. qstatus_cmd() code referenced the wrong pointer. Fixes bug #438. - Add bacualnovss.mak file from Martin. - Remove Pool from restore string in wbrestorepanel.cpp. Patch from user for bug #433. - Correct code in wbrestorpanel.cpp with misplaced parens. Patch from user for bug #431 - Correct printing filenames/date/times in wbrestorepanel.cpp due to bad column alignment. Patch from user for bug #432. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@2418 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/examples/python/DirStartUp.py | 2 + bacula/kernstodo | 1 + bacula/kes-1.37 | 16 ++ bacula/src/cats/make_mysql_tables.in | 2 +- bacula/src/dird/ua_status.c | 350 +++++++++++++-------------- bacula/src/filed/status.c | 6 +- bacula/src/stored/status.c | 6 +- bacula/src/version.h | 6 +- 8 files changed, 202 insertions(+), 187 deletions(-) diff --git a/bacula/examples/python/DirStartUp.py b/bacula/examples/python/DirStartUp.py index 00cedc1b05..b9d695fdd9 100644 --- a/bacula/examples/python/DirStartUp.py +++ b/bacula/examples/python/DirStartUp.py @@ -72,6 +72,8 @@ class JobEvents: job.JobReport="Python after New Volume set for Job.\n" return 1 + def VolumePurged(self, job): + noop = 1 # Pass output back to Bacula def write(self, text): diff --git a/bacula/kernstodo b/bacula/kernstodo index 17ea279f2b..8ecfaa3ac1 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -65,6 +65,7 @@ Document: - Does WildFile match against full name? Doc. For 1.39: +- Add ACL to restore only to original location. - Add a recursive mark command (rmark) to restore. - "Minimum Job Interval = nnn" sets minimum interval between Jobs of the same level and does not permit multiple simultaneous diff --git a/bacula/kes-1.37 b/bacula/kes-1.37 index 7bdde8dab2..c8873bd5ad 100644 --- a/bacula/kes-1.37 +++ b/bacula/kes-1.37 @@ -3,6 +3,21 @@ General: +Changes to 1.37.41: +05Oct05 +- Add VolumePurged method to Python JobEvents class. Fixes + bug #428 (I think). +- Add JobId index to File table for MySQL. +- Correct tray-monitor crash of bacula-dir. qstatus_cmd() + code referenced the wrong pointer. Fixes bug #438. +- Add bacualnovss.mak file from Martin. +- Remove Pool from restore string in wbrestorepanel.cpp. Patch + from user for bug #433. +- Correct code in wbrestorpanel.cpp with misplaced parens. Patch + from user for bug #431 +- Correct printing filenames/date/times in wbrestorepanel.cpp due to bad + column alignment. Patch from user for bug #432. + Changes to 1.37.40: 01Oct05 - Add fix to compat.h supplied by Martin Simmons that permits @@ -15,6 +30,7 @@ Changes to 1.37.40: also fix bug 423. - Clean up patches directory for next release. - Add PS variable in bacula.in script as recommended by a user. + "Tom Boyda" - Correct mtx-changer.in so it only creates a temp file when actually needed. - Add patch supplied by user in a bug report to fix gnome2 diff --git a/bacula/src/cats/make_mysql_tables.in b/bacula/src/cats/make_mysql_tables.in index fc4361db65..ca4fb29f96 100644 --- a/bacula/src/cats/make_mysql_tables.in +++ b/bacula/src/cats/make_mysql_tables.in @@ -27,7 +27,6 @@ CREATE TABLE Path ( ); -# ****FIXME**** make FileId BIGINT someday when MySQL works ***** CREATE TABLE File ( FileId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, FileIndex INTEGER UNSIGNED NOT NULL DEFAULT 0, @@ -38,6 +37,7 @@ CREATE TABLE File ( LStat TINYBLOB NOT NULL, MD5 TINYBLOB NOT NULL, PRIMARY KEY(FileId), + INDEX (JobId), INDEX (JobId, PathId, FilenameId) ); diff --git a/bacula/src/dird/ua_status.c b/bacula/src/dird/ua_status.c index f19591406d..2e24753f34 100644 --- a/bacula/src/dird/ua_status.c +++ b/bacula/src/dird/ua_status.c @@ -62,18 +62,18 @@ int qstatus_cmd(UAContext *ua, const char *cmd) if (strcasecmp(ua->argk[2], "current") == 0) { bsendmsg(ua, OKqstatus, ua->argk[2]); foreach_jcr(njcr) { - if (njcr->JobId != 0) { - bsendmsg(ua, DotStatusJob, edit_int64(njcr->JobId, ed1), - njcr->JobStatus, njcr->JobErrors); - } - free_jcr(njcr); + if (njcr->JobId != 0) { + bsendmsg(ua, DotStatusJob, edit_int64(njcr->JobId, ed1), + njcr->JobStatus, njcr->JobErrors); + } + free_jcr(njcr); } } else if (strcasecmp(ua->argk[2], "last") == 0) { bsendmsg(ua, OKqstatus, ua->argk[2]); if ((last_jobs) && (last_jobs->size() > 0)) { - job = (s_last_job*)last_jobs->last(); - bsendmsg(ua, DotStatusJob, edit_int64(njcr->JobId, ed1), - njcr->JobStatus, njcr->JobErrors); + job = (s_last_job*)last_jobs->last(); + bsendmsg(ua, DotStatusJob, edit_int64(job->JobId, ed1), + job->JobStatus, job->Errors); } } else { bsendmsg(ua, "1900 Bad .status command, wrong argument.\n"); @@ -99,24 +99,24 @@ int status_cmd(UAContext *ua, const char *cmd) for (i=1; iargc; i++) { if (strcasecmp(ua->argk[i], N_("all")) == 0) { - do_all_status(ua); - return 1; + do_all_status(ua); + return 1; } else if (strcasecmp(ua->argk[i], N_("dir")) == 0 || strcasecmp(ua->argk[i], N_("director")) == 0) { - do_director_status(ua); - return 1; + do_director_status(ua); + return 1; } else if (strcasecmp(ua->argk[i], N_("client")) == 0) { - client = get_client_resource(ua); - if (client) { - do_client_status(ua, client); - } - return 1; + client = get_client_resource(ua); + if (client) { + do_client_status(ua, client); + } + return 1; } else { - store = get_storage_resource(ua, false/*no default*/); - if (store) { - do_storage_status(ua, store); - } - return 1; + store = get_storage_resource(ua, false/*no default*/); + if (store) { + do_storage_status(ua, store); + } + return 1; } } /* If no args, ask for status type */ @@ -130,30 +130,30 @@ int status_cmd(UAContext *ua, const char *cmd) add_prompt(ua, N_("All")); Dmsg0(20, "do_prompt: select daemon\n"); if ((item=do_prompt(ua, "", _("Select daemon type for status"), prmt, sizeof(prmt))) < 0) { - return 1; + return 1; } Dmsg1(20, "item=%d\n", item); switch (item) { - case 0: /* Director */ - do_director_status(ua); - break; + case 0: /* Director */ + do_director_status(ua); + break; case 1: - store = select_storage_resource(ua); - if (store) { - do_storage_status(ua, store); - } - break; + store = select_storage_resource(ua); + if (store) { + do_storage_status(ua, store); + } + break; case 2: - client = select_client_resource(ua); - if (client) { - do_client_status(ua, client); - } - break; + client = select_client_resource(ua); + if (client) { + do_client_status(ua, client); + } + break; case 3: - do_all_status(ua); - break; + do_all_status(ua); + break; default: - break; + break; } } return 1; @@ -180,17 +180,17 @@ static void do_all_status(UAContext *ua) foreach_res(store, R_STORAGE) { found = false; if (!acl_access_ok(ua, Storage_ACL, store->hdr.name)) { - continue; + continue; } for (j=0; jaddress, store->address) == 0 && - unique_store[j]->SDport == store->SDport) { - found = true; - break; - } + if (strcmp(unique_store[j]->address, store->address) == 0 && + unique_store[j]->SDport == store->SDport) { + found = true; + break; + } } if (!found) { - unique_store[i++] = store; + unique_store[i++] = store; Dmsg2(40, "Stuffing: %s:%d\n", store->address, store->SDport); } } @@ -214,17 +214,17 @@ static void do_all_status(UAContext *ua) foreach_res(client, R_CLIENT) { found = false; if (!acl_access_ok(ua, Client_ACL, client->hdr.name)) { - continue; + continue; } for (j=0; jaddress, client->address) == 0 && - unique_client[j]->FDport == client->FDport) { - found = true; - break; - } + if (strcmp(unique_client[j]->address, client->address) == 0 && + unique_client[j]->FDport == client->FDport) { + found = true; + break; + } } if (!found) { - unique_client[i++] = client; + unique_client[i++] = client; Dmsg2(40, "Stuffing: %s:%d\n", client->address, client->FDport); } } @@ -243,22 +243,22 @@ static void do_director_status(UAContext *ua) char dt[MAX_TIME_LENGTH]; bsendmsg(ua, _("%s Version: %s (%s) %s %s %s\n"), my_name, VERSION, BDATE, - HOST_OS, DISTNAME, DISTVER); + HOST_OS, DISTNAME, DISTVER); bstrftime_nc(dt, sizeof(dt), daemon_start_time); if (num_jobs_run == 1) { bsendmsg(ua, _("Daemon started %s, 1 Job run since started.\n"), dt); } else { bsendmsg(ua, _("Daemon started %s, %d Jobs run since started.\n"), - dt, num_jobs_run); + dt, num_jobs_run); } if (debug_level > 0) { char b1[35], b2[35], b3[35], b4[35]; bsendmsg(ua, _(" Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), - edit_uint64_with_commas(sm_bytes, b1), - edit_uint64_with_commas(sm_max_bytes, b2), - edit_uint64_with_commas(sm_buffers, b3), - edit_uint64_with_commas(sm_max_buffers, b4)); + edit_uint64_with_commas(sm_bytes, b1), + edit_uint64_with_commas(sm_max_bytes, b2), + edit_uint64_with_commas(sm_buffers, b3), + edit_uint64_with_commas(sm_max_buffers, b4)); } /* * List scheduled Jobs @@ -287,10 +287,10 @@ static void do_storage_status(UAContext *ua, STORE *store) store->hdr.name, store->address, store->SDport); if (!connect_to_storage_daemon(ua->jcr, 1, 15, 0)) { bsendmsg(ua, _("\nFailed to connect to Storage daemon %s.\n====\n"), - store->hdr.name); + store->hdr.name); if (ua->jcr->store_bsock) { - bnet_close(ua->jcr->store_bsock); - ua->jcr->store_bsock = NULL; + bnet_close(ua->jcr->store_bsock); + ua->jcr->store_bsock = NULL; } return; } @@ -325,10 +325,10 @@ static void do_client_status(UAContext *ua, CLIENT *client) client->hdr.name, client->address, client->FDport); if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) { bsendmsg(ua, _("Failed to connect to Client %s.\n====\n"), - client->hdr.name); + client->hdr.name); if (ua->jcr->file_bsock) { - bnet_close(ua->jcr->file_bsock); - ua->jcr->file_bsock = NULL; + bnet_close(ua->jcr->file_bsock); + ua->jcr->file_bsock = NULL; } return; } @@ -354,7 +354,7 @@ static void prt_runhdr(UAContext *ua) /* Scheduling packet */ struct sched_pkt { - dlink link; /* keep this as first item!!! */ + dlink link; /* keep this as first item!!! */ JOB *job; int level; int priority; @@ -376,11 +376,11 @@ static void prt_runtime(UAContext *ua, sched_pkt *sp) jcr->db = NULL; ok = complete_jcr_for_job(jcr, sp->job, sp->pool); if (jcr->db) { - close_db = true; /* new db opened, remember to close it */ + close_db = true; /* new db opened, remember to close it */ } if (ok) { - mr.PoolId = jcr->PoolId; - ok = find_next_volume_for_append(jcr, &mr, 0); + mr.PoolId = jcr->PoolId; + ok = find_next_volume_for_append(jcr, &mr, 0); } if (!ok) { bstrncpy(mr.VolumeName, "*unknown*", sizeof(mr.VolumeName)); @@ -402,7 +402,7 @@ static void prt_runtime(UAContext *ua, sched_pkt *sp) if (close_db) { db_close_database(jcr, jcr->db); } - jcr->db = ua->db; /* restore ua db to jcr */ + jcr->db = ua->db; /* restore ua db to jcr */ } @@ -447,29 +447,29 @@ static void list_scheduled_jobs(UAContext *ua) LockRes(); foreach_res(job, R_JOB) { if (!acl_access_ok(ua, Job_ACL, job->hdr.name)) { - continue; + continue; } for (run=NULL; (run = find_next_run(run, job, runtime)); ) { - level = job->JobLevel; - if (run->level) { - level = run->level; - } - priority = job->Priority; - if (run->Priority) { - priority = run->Priority; - } - if (!hdr_printed) { - prt_runhdr(ua); - hdr_printed = true; - } - sp = (sched_pkt *)malloc(sizeof(sched_pkt)); - sp->job = job; - sp->level = level; - sp->priority = priority; - sp->runtime = runtime; - sp->pool = run->pool; - sched.binary_insert_multiple(sp, my_compare); - num_jobs++; + level = job->JobLevel; + if (run->level) { + level = run->level; + } + priority = job->Priority; + if (run->Priority) { + priority = run->Priority; + } + if (!hdr_printed) { + prt_runhdr(ua); + hdr_printed = true; + } + sp = (sched_pkt *)malloc(sizeof(sched_pkt)); + sp->job = job; + sp->level = level; + sp->priority = priority; + sp->runtime = runtime; + sp->pool = run->pool; + sched.binary_insert_multiple(sp, my_compare); + num_jobs++; } } /* end for loop over resources */ UnlockRes(); @@ -488,7 +488,7 @@ static void list_running_jobs(UAContext *ua) JCR *jcr; int njobs = 0; const char *msg; - char *emsg; /* edited message */ + char *emsg; /* edited message */ char dt[MAX_TIME_LENGTH]; char level[10]; bool pool_mem = false; @@ -497,15 +497,15 @@ static void list_running_jobs(UAContext *ua) bsendmsg(ua, _("\nRunning Jobs:\n")); foreach_jcr(jcr) { njobs++; - if (jcr->JobId == 0) { /* this is us */ - /* this is a console or other control job. We only show console - * jobs in the status output. - */ - if (jcr->JobType == JT_CONSOLE) { - bstrftime_nc(dt, sizeof(dt), jcr->start_time); + if (jcr->JobId == 0) { /* this is us */ + /* this is a console or other control job. We only show console + * jobs in the status output. + */ + if (jcr->JobType == JT_CONSOLE) { + bstrftime_nc(dt, sizeof(dt), jcr->start_time); bsendmsg(ua, _("Console connected at %s\n"), dt); - } - njobs--; + } + njobs--; } free_jcr(jcr); } @@ -520,124 +520,124 @@ static void list_running_jobs(UAContext *ua) bsendmsg(ua, _("======================================================================\n")); foreach_jcr(jcr) { if (jcr->JobId == 0 || !acl_access_ok(ua, Job_ACL, jcr->job->hdr.name)) { - free_jcr(jcr); - continue; + free_jcr(jcr); + continue; } njobs++; switch (jcr->JobStatus) { case JS_Created: msg = _("is waiting execution"); - break; + break; case JS_Running: msg = _("is running"); - break; + break; case JS_Blocked: msg = _("is blocked"); - break; + break; case JS_Terminated: msg = _("has terminated"); - break; + break; case JS_ErrorTerminated: msg = _("has erred"); - break; + break; case JS_Error: msg = _("has errors"); - break; + break; case JS_FatalError: msg = _("has a fatal error"); - break; + break; case JS_Differences: msg = _("has verify differences"); - break; + break; case JS_Canceled: msg = _("has been canceled"); - break; + break; case JS_WaitFD: - emsg = (char *) get_pool_memory(PM_FNAME); + emsg = (char *) get_pool_memory(PM_FNAME); Mmsg(emsg, _("is waiting on Client %s"), jcr->client->hdr.name); - pool_mem = true; - msg = emsg; - break; + pool_mem = true; + msg = emsg; + break; case JS_WaitSD: - emsg = (char *) get_pool_memory(PM_FNAME); + emsg = (char *) get_pool_memory(PM_FNAME); Mmsg(emsg, _("is waiting on Storage %s"), jcr->store->hdr.name); - pool_mem = true; - msg = emsg; - break; + pool_mem = true; + msg = emsg; + break; case JS_WaitStoreRes: msg = _("is waiting on max Storage jobs"); - break; + break; case JS_WaitClientRes: msg = _("is waiting on max Client jobs"); - break; + break; case JS_WaitJobRes: msg = _("is waiting on max Job jobs"); - break; + break; case JS_WaitMaxJobs: msg = _("is waiting on max total jobs"); - break; + break; case JS_WaitStartTime: msg = _("is waiting for its start time"); - break; + break; case JS_WaitPriority: msg = _("is waiting for higher priority jobs to finish"); - break; + break; default: - emsg = (char *) get_pool_memory(PM_FNAME); + emsg = (char *) get_pool_memory(PM_FNAME); Mmsg(emsg, _("is in unknown state %c"), jcr->JobStatus); - pool_mem = true; - msg = emsg; - break; + pool_mem = true; + msg = emsg; + break; } /* * Now report Storage daemon status code */ switch (jcr->SDJobStatus) { case JS_WaitMount: - if (pool_mem) { - free_pool_memory(emsg); - pool_mem = false; - } + if (pool_mem) { + free_pool_memory(emsg); + pool_mem = false; + } msg = _("is waiting for a mount request"); - break; + break; case JS_WaitMedia: - if (pool_mem) { - free_pool_memory(emsg); - pool_mem = false; - } + if (pool_mem) { + free_pool_memory(emsg); + pool_mem = false; + } msg = _("is waiting for an appendable Volume"); - break; + break; case JS_WaitFD: - if (!pool_mem) { - emsg = (char *) get_pool_memory(PM_FNAME); - pool_mem = true; - } + if (!pool_mem) { + emsg = (char *) get_pool_memory(PM_FNAME); + pool_mem = true; + } Mmsg(emsg, _("is waiting for Client %s to connect to Storage %s"), - jcr->client->hdr.name, jcr->store->hdr.name); - msg = emsg; - break; + jcr->client->hdr.name, jcr->store->hdr.name); + msg = emsg; + break; } switch (jcr->JobType) { case JT_ADMIN: case JT_RESTORE: bstrncpy(level, " ", sizeof(level)); - break; + break; default: - bstrncpy(level, level_to_str(jcr->JobLevel), sizeof(level)); - level[7] = 0; - break; + bstrncpy(level, level_to_str(jcr->JobLevel), sizeof(level)); + level[7] = 0; + break; } bsendmsg(ua, _("%6d %-6s %-20s %s\n"), - jcr->JobId, - level, - jcr->Job, - msg); + jcr->JobId, + level, + jcr->Job, + msg); if (pool_mem) { - free_pool_memory(emsg); - pool_mem = false; + free_pool_memory(emsg); + pool_mem = false; } free_jcr(jcr); } @@ -668,12 +668,12 @@ static void list_terminated_jobs(UAContext *ua) char *p; for (int i=0; i<3; i++) { if ((p=strrchr(JobName, '.')) != NULL) { - *p = 0; - } + *p = 0; + } } if (!acl_access_ok(ua, Job_ACL, JobName)) { - continue; + continue; } bstrftime_nc(dt, sizeof(dt), je->end_time); @@ -681,40 +681,40 @@ static void list_terminated_jobs(UAContext *ua) case JT_ADMIN: case JT_RESTORE: bstrncpy(level, " ", sizeof(level)); - break; + break; default: - bstrncpy(level, level_to_str(je->JobLevel), sizeof(level)); - level[4] = 0; - break; + bstrncpy(level, level_to_str(je->JobLevel), sizeof(level)); + level[4] = 0; + break; } switch (je->JobStatus) { case JS_Created: termstat = _("Created"); - break; + break; case JS_FatalError: case JS_ErrorTerminated: termstat = _("Error"); - break; + break; case JS_Differences: termstat = _("Diffs"); - break; + break; case JS_Canceled: termstat = _("Cancel"); - break; + break; case JS_Terminated: termstat = _("OK"); - break; + break; default: termstat = _("Other"); - break; + break; } bsendmsg(ua, _("%6d %-6s %8s %14s %-7s %-8s %s\n"), - je->JobId, - level, - edit_uint64_with_commas(je->JobFiles, b1), - edit_uint64_with_commas(je->JobBytes, b2), - termstat, - dt, JobName); + je->JobId, + level, + edit_uint64_with_commas(je->JobFiles, b1), + edit_uint64_with_commas(je->JobBytes, b2), + termstat, + dt, JobName); } bsendmsg(ua, _("\n")); unlock_last_jobs_list(); diff --git a/bacula/src/filed/status.c b/bacula/src/filed/status.c index 755fe7254d..01327e441d 100755 --- a/bacula/src/filed/status.c +++ b/bacula/src/filed/status.c @@ -336,15 +336,13 @@ int qstatus_cmd(JCR *jcr) } free_jcr(njcr); } - } - else if (strcmp(time, "last") == 0) { + } 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 { + } 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")); diff --git a/bacula/src/stored/status.c b/bacula/src/stored/status.c index ed9cf4bcca..9ea2d3a41d 100644 --- a/bacula/src/stored/status.c +++ b/bacula/src/stored/status.c @@ -481,15 +481,13 @@ bool qstatus_cmd(JCR *jcr) } free_jcr(njcr); } - } - else if (strcmp(time.c_str(), "last") == 0) { + } else if (strcmp(time.c_str(), "last") == 0) { bnet_fsend(dir, OKqstatus, time.c_str()); 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 { + } else { pm_strcpy(jcr->errmsg, dir->msg); Jmsg1(jcr, M_FATAL, 0, _("Bad .status command: %s\n"), jcr->errmsg); bnet_fsend(dir, _("3900 Bad .status command, wrong argument.\n")); diff --git a/bacula/src/version.h b/bacula/src/version.h index 878faa8d46..509f0c684e 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -3,9 +3,9 @@ */ #undef VERSION -#define VERSION "1.37.40" -#define BDATE "01 October 2005" -#define LSMDATE "01Oct05" +#define VERSION "1.37.41" +#define BDATE "05 October 2005" +#define LSMDATE "05Oct05" /* Debug flags */ #undef DEBUG -- 2.39.2