/* Imported functions */
extern int status_cmd(JCR *jcr);
extern int qstatus_cmd(JCR *jcr);
+extern int accurate_cmd(JCR *jcr);
/* Forward referenced functions */
static int backup_cmd(JCR *jcr);
{"RunBeforeJob", runbefore_cmd, 0},
{"RunAfterJob", runafter_cmd, 0},
{"Run", runscript_cmd, 0},
+ {"accurate", accurate_cmd, 0},
{NULL, NULL} /* list terminator */
};
jcr->last_fname = get_pool_memory(PM_FNAME);
jcr->last_fname[0] = 0;
jcr->client_name = get_memory(strlen(my_name) + 1);
+ new_plugins(jcr); /* instantiate plugins for this jcr */
pm_strcpy(jcr->client_name, my_name);
- jcr->pki_sign = me->pki_sign;
- jcr->pki_encrypt = me->pki_encrypt;
- jcr->pki_keypair = me->pki_keypair;
- jcr->pki_signers = me->pki_signers;
- jcr->pki_recipients = me->pki_recipients;
+ jcr->crypto.pki_sign = me->pki_sign;
+ jcr->crypto.pki_encrypt = me->pki_encrypt;
+ jcr->crypto.pki_keypair = me->pki_keypair;
+ jcr->crypto.pki_signers = me->pki_signers;
+ jcr->crypto.pki_recipients = me->pki_recipients;
dir->set_jcr(jcr);
enable_backup_privileges(NULL, 1 /* ignore_errors */);
bnet_fsend(dir, EndJob, jcr->JobStatus, jcr->JobFiles,
edit_uint64(jcr->ReadBytes, ed1),
edit_uint64(jcr->JobBytes, ed2), jcr->Errors, jcr->VSS,
- jcr->pki_encrypt);
+ jcr->crypto.pki_encrypt);
Dmsg1(110, "End FD msg: %s\n", dir->msg);
}
generate_daemon_event(jcr, "JobEnd");
+ generate_plugin_event(jcr, bEventJobEnd);
dequeue_messages(jcr); /* send any queued messages */
/* Inform Director that we are done */
- bnet_sig(dir, BNET_TERMINATE);
+ dir->signal(BNET_TERMINATE);
+
+ free_plugins(jcr); /* release instantiated plugins */
/* Clean up fileset */
FF_PKT *ff = jcr->ff;
fo->base.destroy();
fo->fstype.destroy();
fo->drivetype.destroy();
- if (fo->reader) {
- free(fo->reader);
- }
- if (fo->writer) {
- free(fo->writer);
- }
}
incexe->opts_list.destroy();
incexe->name_list.destroy();
+ incexe->plugin_list.destroy();
}
fileset->include_list.destroy();
}
incexe->opts_list.destroy();
incexe->name_list.destroy();
+ incexe->plugin_list.destroy();
}
fileset->exclude_list.destroy();
free(fileset);
jcr->sd_auth_key = bstrdup(sd_auth_key);
free_pool_memory(sd_auth_key);
Dmsg2(120, "JobId=%d Auth=%s\n", jcr->JobId, jcr->sd_auth_key);
+ Mmsg(jcr->errmsg, "JobId=%d Job=%s", jcr->JobId, jcr->Job);
+ generate_plugin_event(jcr, bEventJobStart, (void *)jcr->errmsg);
return dir->fsend(OKjob, VERSION, LSMDATE, HOST_OS, DISTNAME, DISTVER);
}
* Add fname to include/exclude fileset list. First check for
* | and < and if necessary perform command.
*/
-static void add_file_to_fileset(JCR *jcr, const char *fname, findFILESET *fileset)
+static void add_file_to_fileset(JCR *jcr, const char *fname, findFILESET *fileset,
+ bool is_file)
{
char *p;
BPIPE *bpipe;
free_pool_memory(fn);
while (fgets(buf, sizeof(buf), bpipe->rfd)) {
strip_trailing_junk(buf);
- fileset->incexe->name_list.append(new_dlistString(buf));
+ if (is_file) {
+ fileset->incexe->name_list.append(new_dlistString(buf));
+ } else {
+ fileset->incexe->plugin_list.append(new_dlistString(buf));
+ }
}
if ((stat=close_bpipe(bpipe)) != 0) {
berrno be;
while (fgets(buf, sizeof(buf), ffd)) {
strip_trailing_junk(buf);
Dmsg1(100, "%s\n", buf);
- fileset->incexe->name_list.append(new_dlistString(buf));
+ if (is_file) {
+ fileset->incexe->name_list.append(new_dlistString(buf));
+ } else {
+ fileset->incexe->plugin_list.append(new_dlistString(buf));
+ }
}
fclose(ffd);
break;
default:
- fileset->incexe->name_list.append(new_dlistString(fname));
+ if (is_file) {
+ fileset->incexe->name_list.append(new_dlistString(fname));
+ } else {
+ fileset->incexe->plugin_list.append(new_dlistString(fname));
+ }
break;
}
}
memset(fileset->incexe, 0, sizeof(findINCEXE));
fileset->incexe->opts_list.init(1, true);
fileset->incexe->name_list.init(); /* for dlist; was 1,true for alist */
+ fileset->incexe->plugin_list.init();
fileset->include_list.append(fileset->incexe);
break;
case 'E':
memset(fileset->incexe, 0, sizeof(findINCEXE));
fileset->incexe->opts_list.init(1, true);
fileset->incexe->name_list.init();
+ fileset->incexe->plugin_list.init();
fileset->exclude_list.append(fileset->incexe);
break;
case 'N':
state = state_none;
break;
case 'F':
- /* File item to either include/include list */
+ /* File item to include or exclude list */
state = state_include;
- add_file_to_fileset(jcr, item, fileset);
+ add_file_to_fileset(jcr, item, fileset, true);
+ break;
+ case 'P':
+ /* Plugin item to include list */
+ state = state_include;
+ add_file_to_fileset(jcr, item, fileset, false);
break;
case 'R':
current_opts = start_options(ff);
break;
case 'D':
current_opts = start_options(ff);
- current_opts->reader = bstrdup(item);
+// current_opts->reader = bstrdup(item);
state = state_options;
break;
case 'T':
current_opts = start_options(ff);
- current_opts->writer = bstrdup(item);
+// current_opts->writer = bstrdup(item);
state = state_options;
break;
default:
for (k=0; k<fo->drivetype.size(); k++) {
Dmsg1(400, "XD %s\n", (char *)fo->drivetype.get(k));
}
- if (fo->reader) {
- Dmsg1(400, "D %s\n", fo->reader);
- }
- if (fo->writer) {
- Dmsg1(400, "T %s\n", fo->writer);
- }
}
dlistString *node;
foreach_dlist(node, &incexe->name_list) {
Dmsg1(400, "F %s\n", node->c_str());
}
+ foreach_dlist(node, &incexe->plugin_list) {
+ Dmsg1(400, "P %s\n", node->c_str());
+ }
}
for (i=0; i<fileset->exclude_list.size(); i++) {
findINCEXE *incexe = (findINCEXE *)fileset->exclude_list.get(i);
foreach_dlist(node, incexe->name_list) {
Dmsg1(400, "F %s\n", node->c_str());
}
+ foreach_dlist(node, &incexe->plugin_list) {
+ Dmsg1(400, "P %s\n", node->c_str());
+ }
}
#endif
return ff->fileset->state != state_error;
}
fo->VerifyOpts[j] = 0;
break;
+ case 'C': /* accurate options */
+ /* Copy Accurate Options */
+ for (j=0; *p && *p != ':'; p++) {
+ fo->AccurateOpts[j] = *p;
+ if (j < (int)sizeof(fo->AccurateOpts) - 1) {
+ j++;
+ }
+ }
+ fo->AccurateOpts[j] = 0;
+ break;
case 'P': /* strip path */
/* Get integer */
p++; /* skip P */
if (!term_fileset(jcr)) {
return 0;
}
- return bnet_fsend(dir, OKinc);
+ return dir->fsend(OKinc);
}
static void free_bootstrap(JCR *jcr)
level = get_memory(dir->msglen+1);
Dmsg1(110, "level_cmd: %s", dir->msg);
+ if (strstr(dir->msg, "accurate")) {
+ jcr->accurate = true;
+ }
if (sscanf(dir->msg, "level = %s ", level) != 1) {
goto bail_out;
}
/* Full backup requested? */
} else if (strcmp(level, "full") == 0) {
jcr->JobLevel = L_FULL;
- } else if (strcmp(level, "differential") == 0) {
+ } else if (strstr(level, "differential")) {
jcr->JobLevel = L_DIFFERENTIAL;
free_memory(level);
return 1;
- } else if (strcmp(level, "incremental") == 0) {
+ } else if (strstr(level, "incremental")) {
jcr->JobLevel = L_INCREMENTAL;
free_memory(level);
- return 1;
+ return 1;
/*
* We get his UTC since time, then sync the clocks and correct it
* to agree with our clock.
Dmsg2(100, "adj = %d since_time=%d\n", (int)adj, (int)since_time);
jcr->incremental = 1; /* set incremental or decremental backup */
jcr->mtime = (time_t)since_time; /* set since time */
+ generate_plugin_event(jcr, bEventSince, (void *)jcr->mtime);
} else {
Jmsg1(jcr, M_FATAL, 0, _("Unknown backup level: %s\n"), level);
free_memory(level);
if (buf) {
free_memory(buf);
}
+ generate_plugin_event(jcr, bEventLevel, (void *)jcr->JobLevel);
return dir->fsend(OKlevel);
bail_out:
}
generate_daemon_event(jcr, "JobStart");
+ generate_plugin_event(jcr, bEventStartBackupJob);
#if defined(WIN32_VSS)
- /* START VSS ON WIN 32 */
+ /* START VSS ON WIN32 */
if (jcr->VSS) {
if (g_pVSSClient->InitializeForBackup()) {
/* tell vss which drives to snapshot */
cleanup:
#if defined(WIN32_VSS)
- /* STOP VSS ON WIN 32 */
+ /* STOP VSS ON WIN32 */
/* tell vss to close the backup session */
if (jcr->VSS) {
if (g_pVSSClient->CloseBackup()) {
}
#endif
+ generate_plugin_event(jcr, bEventEndBackupJob);
return 0; /* return and stop command loop */
}
dir->fsend(OKverify);
generate_daemon_event(jcr, "JobStart");
+ generate_plugin_event(jcr, bEventLevel, (void *)jcr->JobLevel);
+ generate_plugin_event(jcr, bEventStartVerifyJob);
Dmsg1(110, "bfiled>dird: %s", dir->msg);
}
dir->signal(BNET_EOD);
-
+ generate_plugin_event(jcr, bEventEndVerifyJob);
return 0; /* return and terminate command loop */
}
jcr->replace = replace;
jcr->prefix_links = prefix_links;
- bnet_fsend(dir, OKrestore);
+ dir->fsend(OKrestore);
Dmsg1(110, "bfiled>dird: %s", dir->msg);
jcr->JobType = JT_RESTORE;
*/
start_dir_heartbeat(jcr);
generate_daemon_event(jcr, "JobStart");
+ generate_plugin_event(jcr, bEventStartRestoreJob);
do_restore(jcr);
stop_dir_heartbeat(jcr);
/*
* Send Close session command to Storage daemon
*/
- bnet_fsend(sd, read_close, jcr->Ticket);
+ sd->fsend(read_close, jcr->Ticket);
Dmsg1(130, "bfiled>stored: %s", sd->msg);
bget_msg(sd); /* get OK */
/* Inform Storage daemon that we are done */
- bnet_sig(sd, BNET_TERMINATE);
+ sd->signal(BNET_TERMINATE);
bail_out:
}
Dmsg0(130, "Done in job.c\n");
+ generate_plugin_event(jcr, bEventEndRestoreJob);
return 0; /* return and terminate command loop */
}
free_runscripts(jcr->RunScripts);
delete jcr->RunScripts;
+ if (jcr->JobId != 0)
+ write_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
+
return;
}