* Version $Id$
*/
/*
- Copyright (C) 2000-2005 Kern Sibbald
+ Copyright (C) 2000-2006 Kern Sibbald
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
/* Responses received from File daemon */
static char OKverify[] = "2000 OK verify\n";
static char OKstore[] = "2000 OK storage\n";
+static char OKbootstrap[] = "2000 OK bootstrap\n";
/* Forward referenced functions */
static void prt_fname(JCR *jcr);
* File daemon but not used).
*/
if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
- RBSR *bsr = new_bsr();
- UAContext *ua;
- bsr->JobId = jcr->target_jr.JobId;
- ua = new_ua_context(jcr);
- complete_bsr(ua, bsr);
- bsr->fi = new_findex();
- bsr->fi->findex = 1;
- bsr->fi->findex2 = jcr->target_jr.JobFiles;
- jcr->ExpectedFiles = write_bsr_file(ua, bsr);
- if (jcr->ExpectedFiles == 0) {
- free_ua_context(ua);
- free_bsr(bsr);
+ if (!create_restore_bootstrap_file(jcr)) {
return false;
}
- if (jcr->RestoreBootstrap) {
- free(jcr->RestoreBootstrap);
- }
- POOLMEM *fname = get_pool_memory(PM_MESSAGE);
- make_unique_restore_filename(ua, &fname);
- jcr->RestoreBootstrap = bstrdup(fname);
- free_ua_context(ua);
- free_bsr(bsr);
- free_pool_memory(fname);
- jcr->needs_sd = true;
-
} else {
jcr->sd_auth_key = bstrdup("dummy"); /* dummy Storage daemon key */
}
const char *level;
BSOCK *fd;
int stat;
+ char ed1[100];
if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
}
/* Print Job Start message */
- Jmsg(jcr, M_INFO, 0, _("Start Verify JobId=%d Level=%s Job=%s\n"),
- jcr->JobId, level_to_str(jcr->JobLevel), jcr->Job);
+ Jmsg(jcr, M_INFO, 0, _("Start Verify JobId=%s Level=%s Job=%s\n"),
+ edit_uint64(jcr->JobId, ed1), level_to_str(jcr->JobLevel), jcr->Job);
if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
/*
/*
* Now start a job with the Storage daemon
*/
- if (!start_storage_daemon_job(jcr, jcr->storage, SD_READ)) {
+ if (!start_storage_daemon_job(jcr, jcr->storage, NULL)) {
return false;
}
/*
return false;
}
Dmsg0(50, "Storage daemon connection OK\n");
+
+ if (!bnet_fsend(jcr->store_bsock, "run")) {
+ return false;
+ }
}
/*
* OK, now connect to the File daemon
/*
* Send the bootstrap file -- what Volumes/files to restore
*/
- if (!send_bootstrap_file(jcr)) {
+ if (!send_bootstrap_file(jcr, fd) ||
+ !response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
return false;
}
jobstatus_to_ascii(jcr->FDJobStatus, fd_term_msg, sizeof(fd_term_msg));
if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));
- Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n"
+ Jmsg(jcr, msg_type, 0, _("Bacula %s (%s): %s\n"
" JobId: %d\n"
" Job: %s\n"
" FileSet: %s\n"
" FD termination status: %s\n"
" SD termination status: %s\n"
" Termination: %s\n\n"),
+ VERSION,
+ LSMDATE,
edt,
jcr->jr.JobId,
jcr->jr.Job,
sd_term_msg,
term_msg);
} else {
- Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n"
+ Jmsg(jcr, msg_type, 0, _("Bacula %s (%s): %s\n"
" JobId: %d\n"
" Job: %s\n"
" FileSet: %s\n"
" Non-fatal FD errors: %d\n"
" FD termination status: %s\n"
" Termination: %s\n\n"),
+ VERSION,
+ LSMDATE,
edt,
jcr->jr.JobId,
jcr->jr.Job,
int stat = JS_Terminated;
char buf[MAXSTRING];
POOLMEM *fname = get_pool_memory(PM_MESSAGE);
- int do_SIG = NO_SIG;
+ int do_Digest = CRYPTO_DIGEST_NONE;
int32_t file_index = 0;
memset(&fdbr, 0, sizeof(FILE_DBR));
* We expect:
* FileIndex
* Stream
- * Options or SIG (MD5/SHA1)
+ * Options or Digest (MD5/SHA1)
* Filename
* Attributes
* Link name ???
while ((n=bget_dirmsg(fd)) >= 0 && !job_canceled(jcr)) {
int stream;
char *attr, *p, *fn;
- char Opts_SIG[MAXSTRING]; /* Verify Opts or MD5/SHA1 signature */
+ char Opts_Digest[MAXSTRING]; /* Verify Opts or MD5/SHA1 digest */
fname = check_pool_memory_size(fname, fd->msglen);
jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
- Dmsg1(200, "Atts+SIG=%s\n", fd->msg);
+ Dmsg1(200, "Atts+Digest=%s\n", fd->msg);
if ((len = sscanf(fd->msg, "%ld %d %100s", &file_index, &stream,
fname)) != 3) {
Jmsg3(jcr, M_FATAL, 0, _("bird<filed: bad attributes, expected 3 fields got %d\n"
* We read the Options or Signature into fname
* to prevent overrun, now copy it to proper location.
*/
- bstrncpy(Opts_SIG, fname, sizeof(Opts_SIG));
+ bstrncpy(Opts_Digest, fname, sizeof(Opts_Digest));
p = fd->msg;
skip_nonspaces(&p); /* skip FileIndex */
skip_spaces(&p);
skip_nonspaces(&p); /* skip Stream */
skip_spaces(&p);
- skip_nonspaces(&p); /* skip Opts_SIG */
+ skip_nonspaces(&p); /* skip Opts_Digest */
p++; /* skip space */
fn = fname;
while (*p != 0) {
jcr->JobFiles++;
jcr->FileIndex = file_index; /* remember attribute file_index */
decode_stat(attr, &statf, &LinkFIf); /* decode file stat packet */
- do_SIG = NO_SIG;
+ do_Digest = CRYPTO_DIGEST_NONE;
jcr->fn_printed = false;
pm_strcpy(jcr->fname, fname); /* move filename into JCR */
}
Dmsg3(400, "Found %s in catalog. inx=%d Opts=%s\n", jcr->fname,
- file_index, Opts_SIG);
+ file_index, Opts_Digest);
decode_stat(fdbr.LStat, &statc, &LinkFIc); /* decode catalog stat */
/*
* Loop over options supplied by user and verify the
* fields he requests.
*/
- for (p=Opts_SIG; *p; p++) {
+ for (p=Opts_Digest; *p; p++) {
char ed1[30], ed2[30];
switch (*p) {
case 'i': /* compare INODEs */
break;
case '5': /* compare MD5 */
Dmsg1(500, "set Do_MD5 for %s\n", jcr->fname);
- do_SIG = MD5_SIG;
+ do_Digest = CRYPTO_DIGEST_MD5;
break;
case '1': /* compare SHA1 */
- do_SIG = SHA1_SIG;
+ do_Digest = CRYPTO_DIGEST_SHA1;
break;
case ':':
case 'V':
}
}
/*
- * Got SIG Signature from Storage daemon
- * It came across in the Opts_SIG field.
+ * Got Digest Signature from Storage daemon
+ * It came across in the Opts_Digest field.
*/
- } else if (stream == STREAM_MD5_SIGNATURE || stream == STREAM_SHA1_SIGNATURE) {
- Dmsg2(400, "stream=SIG inx=%d SIG=%s\n", file_index, Opts_SIG);
+ } else if (crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
+ Dmsg2(400, "stream=Digest inx=%d Digest=%s\n", file_index, Opts_Digest);
/*
- * When ever we get a signature is MUST have been
+ * When ever we get a digest is MUST have been
* preceded by an attributes record, which sets attr_file_index
*/
if (jcr->FileIndex != (uint32_t)file_index) {
file_index, jcr->FileIndex);
return false;
}
- if (do_SIG) {
- db_escape_string(buf, Opts_SIG, strlen(Opts_SIG));
- if (strcmp(buf, fdbr.SIG) != 0) {
+ if (do_Digest != CRYPTO_DIGEST_NONE) {
+ db_escape_string(buf, Opts_Digest, strlen(Opts_Digest));
+ if (strcmp(buf, fdbr.Digest) != 0) {
prt_fname(jcr);
if (debug_level >= 10) {
Jmsg(jcr, M_INFO, 0, _(" %s not same. File=%s Cat=%s\n"),
- stream==STREAM_MD5_SIGNATURE?"MD5":"SHA1", buf, fdbr.SIG);
+ stream_to_ascii(stream), buf, fdbr.Digest);
} else {
Jmsg(jcr, M_INFO, 0, _(" %s differs.\n"),
- stream==STREAM_MD5_SIGNATURE?"MD5":"SHA1");
+ stream_to_ascii(stream));
}
stat = JS_Differences;
}
- do_SIG = FALSE;
+ do_Digest = CRYPTO_DIGEST_NONE;
}
}
jcr->JobFiles = file_index;