======= =========
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;
}
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.