X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=scandir.cc;h=2d5a3a8f89a16ce79090b087b7926f42ad1d7152;hb=c58e9ce625efbdecd2e505102ed273eacad409d2;hp=82160a162c04b750786988f0b2ee6a585aa80d51;hpb=a4cf5f4d8df46fa00992a210d587cd824cedcb08;p=cumulus.git diff --git a/scandir.cc b/scandir.cc index 82160a1..2d5a3a8 100644 --- a/scandir.cc +++ b/scandir.cc @@ -559,6 +559,7 @@ void usage(const char *program) { fprintf( stderr, + "LBS %s\n\n" "Usage: %s [OPTION]... --dest=DEST PATHS...\n" "Produce backup snapshot of files in SOURCE and store to DEST.\n" "\n" @@ -572,7 +573,7 @@ void usage(const char *program) " string to append to segment files\n" " (defaults to \".bz2\")\n" " --scheme=NAME optional name for this snapshot\n", - program + lbs_version, program ); } @@ -723,6 +724,40 @@ int main(int argc, char *argv[]) tss->dump_stats(); delete tss; + /* Write out a checksums file which lists the checksums for all the + * segments included in this snapshot. The format is designed so that it + * may be easily verified using the sha1sums command. */ + const char csum_type[] = "sha1"; + string checksum_filename = backup_dest + "/snapshot-"; + if (backup_scheme.size() > 0) + checksum_filename += backup_scheme + "-"; + checksum_filename = checksum_filename + desc_buf + "." + csum_type + "sums"; + FILE *checksums = fopen(checksum_filename.c_str(), "w"); + if (checksums != NULL) { + for (std::set::iterator i = segment_list.begin(); + i != segment_list.end(); ++i) { + string seg_path, seg_csum; + if (db->GetSegmentChecksum(*i, &seg_path, &seg_csum)) { + const char *raw_checksum = NULL; + if (strncmp(seg_csum.c_str(), csum_type, + strlen(csum_type)) == 0) { + raw_checksum = seg_csum.c_str() + strlen(csum_type); + if (*raw_checksum == '=') + raw_checksum++; + else + raw_checksum = NULL; + } + + if (raw_checksum != NULL) + fprintf(checksums, "%s *%s\n", + raw_checksum, seg_path.c_str()); + } + } + fclose(checksums); + } else { + fprintf(stderr, "ERROR: Unable to write checksums file: %m\n"); + } + db->Close(); /* Write a backup descriptor file, which says which segments are needed and @@ -742,6 +777,11 @@ int main(int argc, char *argv[]) descriptor << "Scheme: " << backup_scheme << "\n"; descriptor << "Root: " << backup_root << "\n"; + SHA1Checksum checksum_csum; + if (checksum_csum.process_file(checksum_filename.c_str())) { + descriptor << "Checksums: " << checksum_csum.checksum_str() << "\n"; + } + descriptor << "Segments:\n"; for (std::set::iterator i = segment_list.begin(); i != segment_list.end(); ++i) {