ewmscp  ..
checksumTestRequestProvider.cpp
Go to the documentation of this file.
2 #include "throwcall.h"
3 #include "escapism.h"
4 #include "ewmscp.h"
5 
8  "schema used for escaping file names in checksum file", "C"));
10  "check sum type in type-less check sum check files");
11 defineStatic(checksumTestRequestProvider::lengthMap, '\0', "checkSumGuessLengthMap",
12  "map for guessing check sum types from their length",
13 {{8, "adler32"}, {32, "md5sum"}, {56, "sha224"}, {64, "sha265"}, {96, "sha384"}, {128, "sha512"}});
14 
15 
17 [](options::single<bool>&/*me*/) {
18  requestProviderName = "checksumTest";
19  printStatAnyway = true;
20 },
21 'c', "check", "just do checksum tests like md5sum -c");
22 
23 
24 
25 namespace copyRequest {
31  class checksumTest: public base {
32  protected:
34  static unsigned int numberOfMismatches;
36  public:
37  checksumTest(const std::string& aSource,
38  std::unique_ptr<const genericStat>& aStat,
39  inputHandler::base* aInputHandler):
40  base(aInputHandler, aSource, "", aStat, mapEntry, false, copyRequest::clock_type::now()) {}
41  void printResults(std::ostream& /*hashStream*/,
42  std::ostream& logStream) override {
43  static auto escaper = escapism::newEscaper("C");
44  bool matchesInAllSums = true;
45  for (const auto& sum : checkSums) {
46  if (!sum->getExpectedResult().empty()) {
47  matchesInAllSums &= sum->checkExpectation();
48  if (!quiet || sum->checkExpectation() == false) {
49  std::string name;
50  escaper->escape(source, name);
51  logStream << name << (sum->checkExpectation() ? ": OK\n" : ": FAILED\n");
52  }
53  }
54  }
55  if (! matchesInAllSums) {
57  }
58  }
59  static void printFinalLine(std::ostream& stream) {
60  if (numberOfMismatches != 0) {
61  stream << numberOfMismatches << " computed checksum" << (numberOfMismatches > 1 ? "s" : "")
62  << " did NOT match\n";
63  if (exitOnMismatch) {
64  throw std::runtime_error("bad checksums found");
65  }
66  }
67  }
69  static void prepareStatPrint() {
71  }
72  };
73  defineStatic(checksumTest::mapEntry, "checksumtest", "mapentry");
75  defineStatic(checksumTest::exitOnMismatch, '\0', "status", "for checksum test use exit state for result");
76 } // end namespace copyRequest
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 void checksumTestRequestProvider::processSource(const std::string& source) {
89  static auto escaper = escapism::newEscaper(escaperOption);
91 
92  std::ifstream srcList(source);
93  while (srcList) {
94  std::string sumType;
95  std::string sumValue;
96 
97  srcList >> sumType;
98  if (sumType.empty()) {
99  continue;
100  }
101  if (sumType.back() == ':') { // we have our own "sumtype: sumvalue filename" line style
102  sumType.pop_back();
103  srcList >> sumValue;
104  } else { // we have the default whateversum "sumvalue filename" line style
105  if (sumType.front() == '\\') { // md5sum(1) uses this to indicate escaped file names
106  sumValue = sumType.substr(1);
107  } else {
108  sumValue = sumType;
109  }
110  if (defaultSum.empty()) {
111  auto item = lengthMap.find(sumValue.size());
112  if (item == lengthMap.end()) {
113  throw std::runtime_error("can't guess checksum type from checksum length " + sumValue);
114  }
115  sumType = item->second;
116  } else {
117  sumType = defaultSum;
118  }
119  }
120  std::string line;
121  std::getline(srcList, line);
122  if (line.empty()) {
123  continue;
124  }
125 
126  std::string src;
127  escaper->deEscape(line.substr(line.find_first_not_of(" \t")), src);
128  auto sourceStat = InputHandler->getStat(src, false); // never follow links
129  if (!sourceStat) {
130  if (ignoreMissing) {
131  continue;
132  } else {
133  throw std::runtime_error("no such file or directory " + src);
134  }
135  }
136  if (sourceStat->isDir()) { // directories are created on the fly, ignore here
137  throw std::runtime_error(src + " is a directory");
138  }
139  auto request = new copyRequest::checksumTest(src, sourceStat, InputHandler);
140  request->addExpectedChecksumResult(sumType, sumValue);
141  requestSet.emplace(request);
142  }
143 }
144 
145 void checksumTestRequestProvider::prepareMappings(std::vector<std::string>& sources,
146  std::string& destination) {
147  if (!destination.empty()) { // last arg (destination) is also a source
148  sources.push_back(destination);
149  destination.clear();
150  }
151 }
copyRequest::checksumTest
class for checking if checksums match expectations Extends the copyRequest::base class with new print...
Definition: checksumTestRequestProvider.cpp:31
noFollowRequestProvider::ignoreMissing
static options::single< bool > ignoreMissing
Definition: noFollowRequestProvider.h:11
options::single< bool >
class specialisation for options of type bool
Definition: Options.h:595
requestProviderName
options::single< std::string > requestProviderName
checksumTestRequestProvider::processSource
void processSource(const std::string &source) override
Definition: checksumTestRequestProvider.cpp:88
copyRequest::checksumTest::mapEntry
static singleMap mapEntry
Definition: checksumTestRequestProvider.cpp:35
copyRequest::base
class for copy requests.
Definition: copyRequest.h:99
checksumTestRequestProvider.h
copyRequest::clock_type
std::chrono::system_clock clock_type
type for time measurements
Definition: copyRequestTypes.h:46
copyRequest::checksumTest::exitOnMismatch
static options::single< bool > exitOnMismatch
Definition: checksumTestRequestProvider.cpp:33
escapism.h
checksumTestRequestProvider::prepareMappings
void prepareMappings(std::vector< std::string > &sources, std::string &destination) override
Definition: checksumTestRequestProvider.cpp:145
copyRequest::checksumTest::checksumTest
checksumTest(const std::string &aSource, std::unique_ptr< const genericStat > &aStat, inputHandler::base *aInputHandler)
Definition: checksumTestRequestProvider.cpp:37
throwcall.h
escapism::newEscaperOption
static options::single< std::string > * newEscaperOption(const std::string &name, const std::string &description, const std::string &defaultValue="Url")
Definition: escapism.cpp:36
checksumTestRequestProvider::doCheck
static options::withAction< options::single< bool > > doCheck
Definition: checksumTestRequestProvider.h:12
copyRequest::checksumTest::printResults
void printResults(std::ostream &, std::ostream &logStream) override
Definition: checksumTestRequestProvider.cpp:41
copyRequest::checksumTest::printFinalLine
static void printFinalLine(std::ostream &stream)
Definition: checksumTestRequestProvider.cpp:59
escapism::newEscaper
static const escapism * newEscaper(const std::string &name)
Definition: escapism.cpp:25
inputHandler::base
class for handling input This is the (abstract) base class for handling input, both reading a file vi...
Definition: inputHandler.h:35
pathHandler::getStat
virtual std::unique_ptr< const genericStat > getStat(const std::string &path, bool followLink=true)=0
copyRequest::checksumTest::prepareStatPrint
static void prepareStatPrint()
setup statPrinter to print the final line for compatibiity mith eg. md5sum
Definition: checksumTestRequestProvider.cpp:69
printStatAnyway
options::single< bool > printStatAnyway
singleMap
std::pair< std::string, std::string > singleMap
Definition: copyRequest.h:52
copyRequest::base::source
const std::string source
Definition: copyRequest.h:284
requestProvider::InputHandler
inputHandler::base * InputHandler
Definition: requestProvider.h:34
checksumTestRequestProvider::factory
static factoryTemplate< checksumTestRequestProvider > factory
Definition: checksumTestRequestProvider.h:7
noFollowRequestProvider::requestSet
static std::multiset< copyRequest::base *, copyRequest::base::pointerCompare > requestSet
Definition: noFollowRequestProvider.h:13
copyRequest::base::statPrinter
static std::function< void(std::ostream &)> statPrinter
Definition: copyRequest.h:330
quiet
static options::single< bool > quiet('q', "quiet", "be quiet, no prefix to output lines")
copyRequest
Definition: checksumTestRequestProvider.cpp:25
checksumTestRequestProvider::defaultSum
static options::single< std::string > defaultSum
Definition: checksumTestRequestProvider.h:10
checksumTestRequestProvider::escaperOption
static options::single< std::string > & escaperOption
Definition: checksumTestRequestProvider.h:9
ewmscp.h
copyRequest::base::checkSums
std::list< checksum::base * > checkSums
Definition: copyRequest.h:277
defineStatic
#define defineStatic(var,...)
defines a static variable and instatitates the constructor with the variable number of arguments.
Definition: ewmscp.h:42
copyRequest::checksumTest::numberOfMismatches
static unsigned int numberOfMismatches
Definition: checksumTestRequestProvider.cpp:34
checksumTestRequestProvider::lengthMap
static options::map< std::string, std::map< int, std::string > > lengthMap
Definition: checksumTestRequestProvider.h:11