======= =========
Document:
+- !!! Cannot restore two jobs a the same time that were
+ written simultaneously unless they were totally spooled.
- Document cleaning up the spool files:
db, pid, state, bsr, mail, conmsg, spool
- Document the multiple-drive-changer.txt script.
Priority:
+- Look at sg_logs -a /dev/sg0 for getting soft errors.
- btape "test" command with Offline on Unmount = yes
This test is essential to Bacula.
-/*
- *
- * Bacula Director -- User Agent Database prune Command
- * Applies retention periods
- *
- * Kern Sibbald, February MMII
- *
- * Version $Id$
- */
/*
Bacula® - The Network Backup Solution
- Copyright (C) 2002-2006 Free Software Foundation Europe e.V.
+ Copyright (C) 2002-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 Database prune Command
+ * Applies retention periods
+ *
+ * Kern Sibbald, February MMII
+ *
+ * Version $Id$
+ */
#include "bacula.h"
#include "dird.h"
db_sql_query(ua->db, query, file_delete_handler, (void *)&del);
for (i=0; i < del.num_ids; i++) {
- purge_files_from_job(ua, del.JobId[i]);
+ /* Don't prune current job */
+ if (ua->jcr->JobId != del.JobId[i]) {
+ purge_files_from_job(ua, del.JobId[i]);
+ del.num_del++;
+ }
}
- edit_uint64_with_commas(del.num_ids, ed1);
+ edit_uint64_with_commas(del.num_del, ed1);
bsendmsg(ua, _("Pruned Files from %s Jobs for client %s from catalog.\n"),
- ed1, client->hdr.name);
+ ed1, client->name());
bail_out:
db_unlock(ua->db);
* Then delete the Job entry, and finally and JobMedia records.
*/
for (i=0; i < del.num_ids; i++) {
- if (!del.PurgedFiles[i]) {
- purge_files_from_job(ua, del.JobId[i]);
+ /* Don't prune current job */
+ if (ua->jcr->JobId != del.JobId[i]) {
+ if (!del.PurgedFiles[i]) {
+ purge_files_from_job(ua, del.JobId[i]);
+ }
+ purge_job_from_catalog(ua, del.JobId[i]);
+ del.num_del++;
}
- purge_job_from_catalog(ua, del.JobId[i]);
}
- bsendmsg(ua, _("Pruned %d %s for client %s from catalog.\n"), del.num_ids,
- del.num_ids==1?_("Job"):_("Jobs"), client->hdr.name);
+ bsendmsg(ua, _("Pruned %d %s for client %s from catalog.\n"), del.num_del,
+ del.num_del==1?_("Job"):_("Jobs"), client->name());
bail_out:
drop_temp_tables(ua);
continue;
}
Dmsg2(200, "Looking at %s JobTdate=%d\n", jr.Job, (int)jr.JobTDate);
- if (jr.JobTDate >= (now - period)) {
+ if (jr.JobTDate >= (now - period) || ua->jcr->JobId == del.JobId[i]) {
continue;
}
purge_files_from_job(ua, del.JobId[i]);
}
}
- if (*rx->JobIds == 0) {
- bsendmsg(ua, _("No Jobs selected.\n"));
- return 0;
- }
- if (strchr(rx->JobIds,',')) {
- bsendmsg(ua, _("You have selected the following JobIds: %s\n"), rx->JobIds);
- }
- else {
- bsendmsg(ua, _("You have selected the following JobId: %s\n"), rx->JobIds);
- }
-
-
+ POOLMEM *JobIds = get_pool_memory(PM_FNAME);
+ *JobIds = 0;
rx->TotalFiles = 0;
+ /*
+ * Find total number of files to be restored, and filter the JobId
+ * list to contain only ones permitted by the ACL conditions.
+ */
for (p=rx->JobIds; ; ) {
+ char ed1[50];
int stat = get_next_jobid_from_list(&p, &JobId);
if (stat < 0) {
bsendmsg(ua, _("Invalid JobId in list.\n"));
+ free_pool_memory(JobIds);
return 0;
}
if (stat == 0) {
memset(&jr, 0, sizeof(JOB_DBR));
jr.JobId = JobId;
if (!db_get_job_record(ua->jcr, ua->db, &jr)) {
- char ed1[50];
bsendmsg(ua, _("Unable to get Job record for JobId=%s: ERR=%s\n"),
edit_int64(JobId, ed1), db_strerror(ua->db));
+ free_pool_memory(JobIds);
return 0;
}
if (!acl_access_ok(ua, Job_ACL, jr.Name)) {
- bsendmsg(ua, _("No authorization. Job \"%s\" not selected.\n"),
- jr.Name);
+ bsendmsg(ua, _("No authorization for JobId=%s (Job \"%s\"). Not selected.\n"),
+ edit_int64(JobId, ed1), jr.Name);
continue;
}
+ if (*JobIds != 0) {
+ pm_strcat(JobIds, ",");
+ }
+ pm_strcat(JobIds, edit_int64(JobId, ed1));
rx->TotalFiles += jr.JobFiles;
}
+ free_pool_memory(rx->JobIds);
+ rx->JobIds = JobIds; /* Set ACL filtered list */
+ if (*rx->JobIds == 0) {
+ bsendmsg(ua, _("No Jobs selected.\n"));
+ return 0;
+ }
+ if (strchr(rx->JobIds,',')) {
+ bsendmsg(ua, _("You have selected the following JobIds: %s\n"), rx->JobIds);
+ } else {
+ bsendmsg(ua, _("You have selected the following JobId: %s\n"), rx->JobIds);
+ }
return 1;
}
rc = VAR_ERR_INCOMPLETE_VARIABLE_SPEC;
goto error_return;
}
- inc = (*p == '+'); /* increment variable */
- p++;
+ if ((inc = (*p++ == '+'))) {
+ p++; /* skip the + */
+ }
/* lookup the variable value now */
if (failed) {
return dev->Slot;
}
/* Virtual disk autochanger */
- if (dcr->device->changer_command[0]) {
+ if (dcr->device->changer_command[0] ==0) {
return 1;
}
One-time Setup
==============
-If you're reading this file you've probably already enlisted in the CVS tree or
+If you're reading this file you've probably already enlisted in the SVN tree or
extracted the contents of the source tar. If not you need to do that first.
You also need to download one of the doc tar balls and extract to your
Technical notes on version 2.1
General:
+29Feb07
+kes Correct virtual changer check which was backwards. This caused
+ volumes to be unloaded into slots already occupied.
+28Feb07
+kes Apply Command ACL filter to JobId list in restore command.
+kes Correct typeo in var.c patch.
+27Feb07
+kes Don't let Bacula prune File or Job records for the current Job.
+kes Fix variable substitution pad + inc bug reported (with patch)
+ in bug #791.
26Feb07
kes Correct SQLite log table index as reported by Luca Berra.
24Feb07
Fixes bug #771.
kes Remove rl_catch_signal from console.c as it conflicted
with the header definition. Fixes bug #765.
-ebl Fixes bug #766 about RunsOnClient = Yes
+ebl Fixes bug #766 about RunsOnClient = Yes (case sensitive)
04Feb07
kes Clarify some stored/acquire messages to indicate if the
problem is with read or append.