/*
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.
* Now send JobId and authorization key
*/
fd->fsend(jobcmd, edit_int64(jcr->JobId, ed1), jcr->Job, jcr->VolSessionId,
- jcr->VolSessionTime, jcr->sd_auth_key);
- if (strcmp(jcr->sd_auth_key, "dummy") != 0) {
+ jcr->VolSessionTime, jcr->sd_auth_key);
+ if (!jcr->keep_sd_auth_key && strcmp(jcr->sd_auth_key, "dummy")) {
memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key));
}
Dmsg1(100, ">filed: %s", fd->msg);
bool do_full = false;
bool do_diff = false;
utime_t now;
- utime_t last_full_time;
+ utime_t last_full_time = 0;
utime_t last_diff_time;
since[0] = 0;
/* Look up start time of last Full job */
now = (utime_t)time(NULL);
jcr->jr.JobId = 0; /* flag to return since time */
- have_full = db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime);
- /* If there was a successful job, make sure it is recent enough */
- if (jcr->get_JobLevel() == L_INCREMENTAL && have_full && jcr->job->MaxDiffInterval > 0) {
+ /*
+ * This is probably redundant, but some of the code below
+ * uses jcr->stime, so don't remove unless you are sure.
+ */
+ if (!db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime)) {
+ do_full = true;
+ }
+ have_full = db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_FULL);
+ if (have_full) {
+ last_full_time = str_to_utime(stime);
+ } else {
+ do_full = true; /* No full, upgrade to one */
+ }
+ Dmsg4(50, "have_full=%d do_full=%d now=%lld full_time=%lld\n", have_full,
+ do_full, now, last_full_time);
+ /* Make sure the last diff is recent enough */
+ if (have_full && jcr->get_JobLevel() == L_INCREMENTAL && jcr->job->MaxDiffInterval > 0) {
/* Lookup last diff job */
if (db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_DIFFERENTIAL)) {
last_diff_time = str_to_utime(stime);
- do_diff = ((now - last_diff_time) >= jcr->job->MaxDiffInterval);
+ /* If no Diff since Full, use Full time */
+ if (last_diff_time < last_full_time) {
+ last_diff_time = last_full_time;
+ }
+ Dmsg2(50, "last_diff_time=%lld last_full_time=%lld\n", last_diff_time,
+ last_full_time);
+ } else {
+ /* No last differential, so use last full time */
+ last_diff_time = last_full_time;
+ Dmsg1(50, "No last_diff_time setting to full_time=%lld\n", last_full_time);
}
+ do_diff = ((now - last_diff_time) >= jcr->job->MaxDiffInterval);
+ Dmsg2(50, "do_diff=%d diffInter=%lld\n", do_diff, jcr->job->MaxDiffInterval);
}
- if (have_full && jcr->job->MaxFullInterval > 0 &&
- db_find_last_job_start_time(jcr, jcr->db, &jcr->jr, &stime, L_FULL)) {
- last_full_time = str_to_utime(stime);
+ /* Note, do_full takes precedence over do_diff */
+ if (have_full && jcr->job->MaxFullInterval > 0) {
do_full = ((now - last_full_time) >= jcr->job->MaxFullInterval);
}
free_pool_memory(stime);
- if (!have_full || do_full) {
+ if (do_full) {
/* No recent Full job found, so upgrade this one to Full */
Jmsg(jcr, M_INFO, 0, "%s", db_strerror(jcr->db));
Jmsg(jcr, M_INFO, 0, _("No prior or suitable Full backup found in catalog. Doing FULL backup.\n"));
level_to_str(jcr->get_JobLevel()));
jcr->set_JobLevel(jcr->jr.JobLevel = L_FULL);
} else if (do_diff) {
- /* No recent diff job found, so upgrade this one to Full */
+ /* No recent diff job found, so upgrade this one to Diff */
Jmsg(jcr, M_INFO, 0, _("No prior or suitable Differential backup found in catalog. Doing Differential backup.\n"));
bsnprintf(since, since_len, _(" (upgraded from %s)"),
level_to_str(jcr->get_JobLevel()));
bool send_level_command(JCR *jcr)
{
BSOCK *fd = jcr->file_bsock;
- const char *accurate = jcr->job->accurate?"accurate_":"";
+ const char *accurate = jcr->accurate?"accurate_":"";
const char *not_accurate = "";
/*
* Send Level command to File daemon
ie = fileset->exclude_items[i];
fd->fsend("E\n");
}
+ if (ie->ignoredir) {
+ bnet_fsend(fd, "Z %s\n", ie->ignoredir);
+ }
for (j=0; j<ie->num_opts; j++) {
FOPTS *fo = ie->opts_list[j];
fd->fsend("O %s\n", fo->opts);
if (fo->plugin) {
fd->fsend("G %s\n", fo->plugin);
}
- if (fo->ignoredir) {
- bnet_fsend(fd, "Z %s\n", fo->ignoredir);
- }
if (fo->reader) {
fd->fsend("D %s\n", fo->reader);
}
return true;
}
-
-/*
- * Send bootstrap file if any to the socket given (FD or SD).
- * This is used for restore, verify VolumeToCatalog, and
- * for migration.
- */
-bool send_bootstrap_file(JCR *jcr, BSOCK *sock)
-{
- FILE *bs;
- char buf[1000];
- const char *bootstrap = "bootstrap\n";
-
- Dmsg1(400, "send_bootstrap_file: %s\n", jcr->RestoreBootstrap);
- if (!jcr->RestoreBootstrap) {
- return true;
- }
- bs = fopen(jcr->RestoreBootstrap, "rb");
- if (!bs) {
- berrno be;
- Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"),
- jcr->RestoreBootstrap, be.bstrerror());
- set_jcr_job_status(jcr, JS_ErrorTerminated);
- return false;
- }
- sock->fsend(bootstrap);
- while (fgets(buf, sizeof(buf), bs)) {
- sock->fsend("%s", buf);
- }
- sock->signal(BNET_EOD);
- fclose(bs);
- if (jcr->unlink_bsr) {
- unlink(jcr->RestoreBootstrap);
- jcr->unlink_bsr = false;
- }
- return true;
-}
-
/* TODO: drop this with runscript.old_proto in bacula 1.42 */
static char runbefore[] = "RunBeforeJob %s\n";
static char runafter[] = "RunAfterJob %s\n";