X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fverify.c;h=a4075474467879e12c2df4c6f7ca48ef4f545ed3;hb=44566f589dd96e4414e38ec4bf7d76b22fbcd9aa;hp=20261083c8391cffeea641ef482a3a2774b231c4;hpb=fce6a648a27ee86f6941a5085ec7909f6d43e725;p=bacula%2Fbacula diff --git a/bacula/src/dird/verify.c b/bacula/src/dird/verify.c index 20261083c8..a407547446 100644 --- a/bacula/src/dird/verify.c +++ b/bacula/src/dird/verify.c @@ -14,7 +14,7 @@ * 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 @@ -33,9 +33,6 @@ #include "dird.h" #include "findlib/find.h" -/* Imported Global Variables */ -extern int debug_level; - /* Commands sent to File daemon */ static char verifycmd[] = "verify level=%s\n"; static char storaddr[] = "storage address=%s port=%d ssl=0\n"; @@ -43,6 +40,7 @@ static char storaddr[] = "storage address=%s port=%d ssl=0\n"; /* 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); @@ -59,7 +57,9 @@ bool do_verify_init(JCR *jcr) JobId_t verify_jobid = 0; const char *Name; - memset(&jcr->target_jr, 0, sizeof(jcr->target_jr)); + free_wstorage(jcr); /* we don't write */ + + memset(&jcr->previous_jr, 0, sizeof(jcr->previous_jr)); Dmsg1(9, "bdird: created client %s record\n", jcr->client->hdr.name); @@ -103,19 +103,19 @@ bool do_verify_init(JCR *jcr) if (jcr->JobLevel == L_VERIFY_CATALOG || jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG || jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG) { - jcr->target_jr.JobId = verify_jobid; - if (!db_get_job_record(jcr, jcr->db, &jcr->target_jr)) { + jcr->previous_jr.JobId = verify_jobid; + if (!db_get_job_record(jcr, jcr->db, &jcr->previous_jr)) { Jmsg(jcr, M_FATAL, 0, _("Could not get job record for previous Job. ERR=%s"), db_strerror(jcr->db)); return false; } - if (jcr->target_jr.JobStatus != 'T') { + if (jcr->previous_jr.JobStatus != 'T') { Jmsg(jcr, M_FATAL, 0, _("Last Job %d did not terminate normally. JobStatus=%c\n"), - verify_jobid, jcr->target_jr.JobStatus); + verify_jobid, jcr->previous_jr.JobStatus); return false; } Jmsg(jcr, M_INFO, 0, _("Verifying against JobId=%d Job=%s\n"), - jcr->target_jr.JobId, jcr->target_jr.Job); + jcr->previous_jr.JobId, jcr->previous_jr.Job); } /* @@ -125,31 +125,9 @@ bool do_verify_init(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 */ } @@ -157,7 +135,7 @@ bool do_verify_init(JCR *jcr) if (jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG && jcr->verify_job) { jcr->fileset = jcr->verify_job->fileset; } - Dmsg2(100, "ClientId=%u JobLevel=%c\n", jcr->target_jr.ClientId, jcr->JobLevel); + Dmsg2(100, "ClientId=%u JobLevel=%c\n", jcr->previous_jr.ClientId, jcr->JobLevel); return true; } @@ -173,6 +151,7 @@ bool do_verify(JCR *jcr) 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)); @@ -180,8 +159,8 @@ bool do_verify(JCR *jcr) } /* 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) { /* @@ -194,7 +173,10 @@ bool do_verify(JCR *jcr) /* * 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->rstorage, NULL)) { + return false; + } + if (!bnet_fsend(jcr->store_bsock, "run")) { return false; } /* @@ -204,6 +186,7 @@ bool do_verify(JCR *jcr) return false; } Dmsg0(50, "Storage daemon connection OK\n"); + } /* * OK, now connect to the File daemon @@ -243,10 +226,10 @@ bool do_verify(JCR *jcr) /* * send Storage daemon address to the File daemon */ - if (jcr->store->SDDport == 0) { - jcr->store->SDDport = jcr->store->SDport; + if (jcr->rstore->SDDport == 0) { + jcr->rstore->SDDport = jcr->rstore->SDport; } - bnet_fsend(fd, storaddr, jcr->store->address, jcr->store->SDDport); + bnet_fsend(fd, storaddr, jcr->rstore->address, jcr->rstore->SDDport); if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) { return false; } @@ -254,7 +237,8 @@ bool do_verify(JCR *jcr) /* * 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; } @@ -277,7 +261,7 @@ bool do_verify(JCR *jcr) return false; } - if (!send_run_before_and_after_commands(jcr)) { + if (!send_runscripts_commands(jcr)) { return false; } @@ -300,19 +284,19 @@ bool do_verify(JCR *jcr) Dmsg0(10, "Verify level=catalog\n"); jcr->sd_msg_thread_done = true; /* no SD msg thread, so it is done */ jcr->SDJobStatus = JS_Terminated; - get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId); + get_attributes_and_compare_to_catalog(jcr, jcr->previous_jr.JobId); break; case L_VERIFY_VOLUME_TO_CATALOG: Dmsg0(10, "Verify level=volume\n"); - get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId); + get_attributes_and_compare_to_catalog(jcr, jcr->previous_jr.JobId); break; case L_VERIFY_DISK_TO_CATALOG: Dmsg0(10, "Verify level=disk_to_catalog\n"); jcr->sd_msg_thread_done = true; /* no SD msg thread, so it is done */ jcr->SDJobStatus = JS_Terminated; - get_attributes_and_compare_to_catalog(jcr, jcr->target_jr.JobId); + get_attributes_and_compare_to_catalog(jcr, jcr->previous_jr.JobId); break; case L_VERIFY_INIT: @@ -436,7 +420,7 @@ void verify_cleanup(JCR *jcr, int TermCode) jcr->fileset->hdr.name, level_to_str(jcr->JobLevel), jcr->client->hdr.name, - jcr->target_jr.JobId, + jcr->previous_jr.JobId, Name, sdt, edt, @@ -469,7 +453,7 @@ void verify_cleanup(JCR *jcr, int TermCode) jcr->fileset->hdr.name, level_to_str(jcr->JobLevel), jcr->client->hdr.name, - jcr->target_jr.JobId, + jcr->previous_jr.JobId, Name, sdt, edt, @@ -494,7 +478,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) 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)); @@ -508,7 +492,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) * We expect: * FileIndex * Stream - * Options or SIG (MD5/SHA1) + * Options or Digest (MD5/SHA1) * Filename * Attributes * Link name ??? @@ -516,11 +500,11 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) 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, _("birdmsg; 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) { @@ -554,7 +538,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) 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 */ @@ -566,7 +550,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) */ fdbr.FileId = 0; if (!db_get_file_attributes_record(jcr, jcr->db, jcr->fname, - &jcr->target_jr, &fdbr)) { + &jcr->previous_jr, &fdbr)) { Jmsg(jcr, M_INFO, 0, _("New file: %s\n"), jcr->fname); Dmsg1(020, _("File not in catalog: %s\n"), jcr->fname); stat = JS_Differences; @@ -580,13 +564,13 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) } 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 */ @@ -671,10 +655,10 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) 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': @@ -683,13 +667,13 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) } } /* - * 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) { @@ -697,20 +681,20 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) 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; @@ -723,15 +707,15 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) } /* Now find all the files that are missing -- i.e. all files in - * the database where the MarkedId != current JobId + * the database where the MarkId != current JobId */ jcr->fn_printed = false; bsnprintf(buf, sizeof(buf), -"SELECT Path.Path,Filename.Name FROM File,Path,Filename " -"WHERE File.JobId=%d " -"AND File.MarkedId!=%d AND File.PathId=Path.PathId " -"AND File.FilenameId=Filename.FilenameId", - JobId, jcr->JobId); + "SELECT Path.Path,Filename.Name FROM File,Path,Filename " + "WHERE File.JobId=%d " + "AND File.MarkId!=%d AND File.PathId=Path.PathId " + "AND File.FilenameId=Filename.FilenameId", + JobId, jcr->JobId); /* missing_handler is called for each file found */ db_sql_query(jcr->db, buf, missing_handler, (void *)jcr); if (jcr->fn_printed) {