Ver Fonte

work around for wrong exit code of rsync

Wolfgang Ortmann há 9 anos atrás
pai
commit
b82f3ce66c
3 ficheiros alterados com 432 adições e 426 exclusões
  1. 3 3
      src/filetools.cpp
  2. 4 2
      src/kind.ag
  3. 425 421
      src/kind.cpp

+ 3 - 3
src/filetools.cpp

@@ -164,7 +164,8 @@ void removeLock(const std::string& lockfilename)
 
 #define POPEN_BUFFER_SIZE 2000
 Strings myPopen(const std::string& cmd,
-                int& rc, bool debug, const std::string& logfn)
+                int& rc, bool debug, 
+		const std::string& logfn)
 {
   if (debug)
     std::cout << "Executing " << cmd << std::endl;
@@ -181,7 +182,6 @@ Strings myPopen(const std::string& cmd,
   FILE* fd = popen(cmd.c_str(), "r");
   if (fd != nullptr)
     {
-      std::string input;
       char buffer[POPEN_BUFFER_SIZE];
       while (fgets(buffer, POPEN_BUFFER_SIZE - 1, fd))
         {
@@ -189,7 +189,7 @@ Strings myPopen(const std::string& cmd,
           int size = strlen(buffer);
           if (buffer[size - 1] == '\n') // substitute linefeed with string end
             buffer[size - 1] = 0;
-          input = buffer;
+          std::string input = buffer;
           if (log.is_open())
             log << input << std::endl;
           res.push_back(input);

+ 4 - 2
src/kind.ag

@@ -333,7 +333,9 @@ void backupVault(const string& vault,
           int rc;
           backupResult = myPopen(rsyncCmd, rc, debug, imageFullName + "/rsync-log");
           // strings2File(backupResult, imageFullName + "/rsync-log");
-          if (rc == 0 || rc == 24) // "no error" or "vanished source files" (ignored)
+          if (rc == 0 || 
+	      rc == 24 || // "no error" or "vanished source files" (ignored)
+	      rc == 6114) // workaround for wrong exit code ??!!
             {
               unlink(errorfile.c_str());
               string lastLink = vaultpath + "/last";
@@ -353,7 +355,7 @@ void backupVault(const string& vault,
               //  cout << vault << " " << st << " || " << sc << endl;
             }
           else
-            throw Exception("Backup", "Failed to execute rsync (result: " + to_string(rc)+")");
+            throw Exception("Backup", "Failed to execute rsync (result: " + to_string(rc) + ")");
         }
       else
         cout << "Not executing " << rsyncCmd << endl;

+ 425 - 421
src/kind.cpp

@@ -677,652 +677,656 @@ void backupVault(const string& vault,
 # 335 "kind.ag"
           // strings2File(backupResult, imageFullName + "/rsync-log");
 # 336 "kind.ag"
-          if (rc == 0 || rc == 24) // "no error" or "vanished source files" (ignored)
+          if (rc == 0 || 
 # 337 "kind.ag"
-            {
+	      rc == 24 || // "no error" or "vanished source files" (ignored)
 # 338 "kind.ag"
-              unlink(errorfile.c_str());
+	      rc == 6114) // workaround for wrong exit code ??!!
 # 339 "kind.ag"
-              string lastLink = vaultpath + "/last";
+            {
 # 340 "kind.ag"
-              unlink(lastLink.c_str());
+              unlink(errorfile.c_str());
 # 341 "kind.ag"
-              symlink(imageFullName.c_str(), lastLink.c_str());
+              string lastLink = vaultpath + "/last";
 # 342 "kind.ag"
-              long int st = 0;
+              unlink(lastLink.c_str());
 # 343 "kind.ag"
-              long int sc = 0;
+              symlink(imageFullName.c_str(), lastLink.c_str());
 # 344 "kind.ag"
-              for (auto bl : backupResult)
+              long int st = 0;
 # 345 "kind.ag"
-                {
+              long int sc = 0;
 # 346 "kind.ag"
-                  if (bl.substr(0, 15) == "Total file size")
+              for (auto bl : backupResult)
 # 347 "kind.ag"
-                    st = getNumber(bl);
+                {
 # 348 "kind.ag"
-                  else if (bl.substr(0, 27) == "Total transferred file size")
+                  if (bl.substr(0, 15) == "Total file size")
 # 349 "kind.ag"
-                    sc = getNumber(bl);
+                    st = getNumber(bl);
 # 350 "kind.ag"
-                }
+                  else if (bl.substr(0, 27) == "Total transferred file size")
 # 351 "kind.ag"
-              // sizes[vault] = pair<long int, long int>(st, sc);
+                    sc = getNumber(bl);
 # 352 "kind.ag"
-              sizes[vault] = Sizes(st, sc);
+                }
 # 353 "kind.ag"
-              //  cout << vault << " " << st << " || " << sc << endl;
+              // sizes[vault] = pair<long int, long int>(st, sc);
 # 354 "kind.ag"
-            }
+              sizes[vault] = Sizes(st, sc);
 # 355 "kind.ag"
-          else
+              //  cout << vault << " " << st << " || " << sc << endl;
 # 356 "kind.ag"
-            throw Exception("Backup", "Failed to execute rsync (result: " + to_string(rc)+")");
+            }
 # 357 "kind.ag"
-        }
+          else
 # 358 "kind.ag"
-      else
+            throw Exception("Backup", "Failed to execute rsync (result: " + to_string(rc) + ")");
 # 359 "kind.ag"
-        cout << "Not executing " << rsyncCmd << endl;
+        }
 # 360 "kind.ag"
-    }
+      else
 # 361 "kind.ag"
-  catch (Exception ex)
+        cout << "Not executing " << rsyncCmd << endl;
 # 362 "kind.ag"
-    {
+    }
 # 363 "kind.ag"
-      cerr << "Exception in vault " << vault << ": " << ex.what() << endl;
+  catch (Exception ex)
 # 364 "kind.ag"
-    }
+    {
 # 365 "kind.ag"
-}
+      cerr << "Exception in vault " << vault << ": " << ex.what() << endl;
 # 366 "kind.ag"
-
+    }
 # 367 "kind.ag"
-DateTime imageDate(const string& image)
+}
 # 368 "kind.ag"
-{
+
 # 369 "kind.ag"
-  FileName fn(image);
+DateTime imageDate(const string& image)
 # 370 "kind.ag"
-  Strings ss;
+{
 # 371 "kind.ag"
-  split(fn.getName(), ss, '-');
+  FileName fn(image);
 # 372 "kind.ag"
-  if (ss.size() < 5)
+  Strings ss;
 # 373 "kind.ag"
-    throw Exception("imageDate", "image date not available");
+  split(fn.getName(), ss, '-');
 # 374 "kind.ag"
-  int Y = stoi(ss[1]);
+  if (ss.size() < 5)
 # 375 "kind.ag"
-  int M = stoi(ss[2]);
+    throw Exception("imageDate", "image date not available");
 # 376 "kind.ag"
-  int D = stoi(ss[3]);
+  int Y = stoi(ss[1]);
 # 377 "kind.ag"
-  int h = stoi(ss[4]);
+  int M = stoi(ss[2]);
 # 378 "kind.ag"
-  int m = 0, s = 0;
+  int D = stoi(ss[3]);
 # 379 "kind.ag"
-  if (ss.size() > 5) // longImageName
+  int h = stoi(ss[4]);
 # 380 "kind.ag"
-    m = stoi(ss[5]);
+  int m = 0, s = 0;
 # 381 "kind.ag"
-  if (ss.size() > 6)
+  if (ss.size() > 5) // longImageName
 # 382 "kind.ag"
-    s = stoi(ss[6]);
+    m = stoi(ss[5]);
 # 383 "kind.ag"
-  return DateTime(Y, M, D, h, m, s);
+  if (ss.size() > 6)
 # 384 "kind.ag"
-}
+    s = stoi(ss[6]);
 # 385 "kind.ag"
-
+  return DateTime(Y, M, D, h, m, s);
 # 386 "kind.ag"
-void parseRule(string rule,
+}
 # 387 "kind.ag"
-               set<int>& M, set<int>& D, set<int>& W, set<int>& h,
+
 # 388 "kind.ag"
-               time_t& exptime)
+void parseRule(string rule,
 # 389 "kind.ag"
-{
+               set<int>& M, set<int>& D, set<int>& W, set<int>& h,
 # 390 "kind.ag"
-  for (unsigned int i = 0; i < rule.size(); ++i)
+               time_t& exptime)
 # 391 "kind.ag"
-    rule[i] = tolower(rule[i]);
+{
 # 392 "kind.ag"
-
+  for (unsigned int i = 0; i < rule.size(); ++i)
 # 393 "kind.ag"
-  substitute(rule, ' ', ',');
+    rule[i] = tolower(rule[i]);
 # 394 "kind.ag"
-  reduceToOne(rule, ',');
-# 395 "kind.ag"
 
+# 395 "kind.ag"
+  substitute(rule, ' ', ',');
 # 396 "kind.ag"
-  // rule = hour wday mday month <exptime>
+  reduceToOne(rule, ',');
 # 397 "kind.ag"
-  Lexer p(rule);
-# 398 "kind.ag"
 
+# 398 "kind.ag"
+  // rule = hour wday mday month <exptime>
 # 399 "kind.ag"
-  h = getValues(p, 0, 23); // hour
+  Lexer p(rule);
 # 400 "kind.ag"
 
 # 401 "kind.ag"
-  p.expect(',');
+  h = getValues(p, 0, 23); // hour
 # 402 "kind.ag"
 
 # 403 "kind.ag"
-  W = getValues(p, 0, 7, 1); // wday
+  p.expect(',');
 # 404 "kind.ag"
 
 # 405 "kind.ag"
-  p.expect(',');
+  W = getValues(p, 0, 7, 1); // wday
 # 406 "kind.ag"
 
 # 407 "kind.ag"
-  D = getValues(p, 1, 31); // day of month
+  p.expect(',');
 # 408 "kind.ag"
 
 # 409 "kind.ag"
-  p.expect(',');
+  D = getValues(p, 1, 31); // day of month
 # 410 "kind.ag"
 
 # 411 "kind.ag"
-  M = getValues(p, 1, 12, 2); // month
+  p.expect(',');
 # 412 "kind.ag"
 
 # 413 "kind.ag"
-#if 0
+  M = getValues(p, 1, 12, 2); // month
 # 414 "kind.ag"
-  // debug-output
+
 # 415 "kind.ag"
-  cout << "hour: ";
+#if 0
 # 416 "kind.ag"
-  for (int i : h)
+  // debug-output
 # 417 "kind.ag"
-    cout << i << " ";
+  cout << "hour: ";
 # 418 "kind.ag"
-  cout << endl;
+  for (int i : h)
 # 419 "kind.ag"
-  cout << "wday: ";
+    cout << i << " ";
 # 420 "kind.ag"
-  for (int i : W)
+  cout << endl;
 # 421 "kind.ag"
-    cout << i << " ";
+  cout << "wday: ";
 # 422 "kind.ag"
-  cout << endl;
+  for (int i : W)
 # 423 "kind.ag"
-  cout << "mday: ";
+    cout << i << " ";
 # 424 "kind.ag"
-  for (int i : D)
+  cout << endl;
 # 425 "kind.ag"
-    cout << i << " ";
+  cout << "mday: ";
 # 426 "kind.ag"
-  cout << endl;
+  for (int i : D)
 # 427 "kind.ag"
-  cout << "month: ";
+    cout << i << " ";
 # 428 "kind.ag"
-  for (int i : M)
+  cout << endl;
 # 429 "kind.ag"
-    cout << i << " ";
+  cout << "month: ";
 # 430 "kind.ag"
-  cout << endl;
+  for (int i : M)
 # 431 "kind.ag"
-#endif
+    cout << i << " ";
 # 432 "kind.ag"
-
+  cout << endl;
 # 433 "kind.ag"
-  string ts = p.getAll();
+#endif
 # 434 "kind.ag"
-  substitute(ts, ',', ' ');
+
 # 435 "kind.ag"
-  exptime = stot(ts);
+  string ts = p.getAll();
 # 436 "kind.ag"
-}
+  substitute(ts, ',', ' ');
 # 437 "kind.ag"
-
+  exptime = stot(ts);
 # 438 "kind.ag"
-int removeDir(const string& path)
+}
 # 439 "kind.ag"
-{
+
 # 440 "kind.ag"
-  debugPrint("removeDir " + path);
+int removeDir(const string& path)
 # 441 "kind.ag"
-
+{
 # 442 "kind.ag"
-  DIR* d = opendir(path.c_str());
+  debugPrint("removeDir " + path);
 # 443 "kind.ag"
 
 # 444 "kind.ag"
-  int r = -1;
+  DIR* d = opendir(path.c_str());
 # 445 "kind.ag"
-  if (d)
+
 # 446 "kind.ag"
-    {
+  int r = -1;
 # 447 "kind.ag"
-      struct dirent* p;
+  if (d)
 # 448 "kind.ag"
-
+    {
 # 449 "kind.ag"
-      r = 0;
+      struct dirent* p;
 # 450 "kind.ag"
 
 # 451 "kind.ag"
-      while (!r && (p = readdir(d)))
+      r = 0;
 # 452 "kind.ag"
-        {
+
 # 453 "kind.ag"
-          int r2 = 0;
+      while (!r && (p = readdir(d)))
 # 454 "kind.ag"
-
+        {
 # 455 "kind.ag"
-          string fn = p->d_name;
+          int r2 = 0;
 # 456 "kind.ag"
 
 # 457 "kind.ag"
-          if (fn != "." && fn != "..")
+          string fn = p->d_name;
 # 458 "kind.ag"
-            {
+
 # 459 "kind.ag"
-              fn = path + "/" + fn;
+          if (fn != "." && fn != "..")
 # 460 "kind.ag"
-
+            {
 # 461 "kind.ag"
-              debugPrint("-- " + fn);
+              fn = path + "/" + fn;
 # 462 "kind.ag"
 
 # 463 "kind.ag"
-              struct stat statbuf;
+              debugPrint("-- " + fn);
 # 464 "kind.ag"
-              if (lstat(fn.c_str(), &statbuf) == 0)
+
 # 465 "kind.ag"
-                {
+              struct stat statbuf;
 # 466 "kind.ag"
-                  if (S_ISLNK(statbuf.st_mode))
+              if (lstat(fn.c_str(), &statbuf) == 0)
 # 467 "kind.ag"
-                    {
+                {
 # 468 "kind.ag"
-                      debugPrint("Remove link " + fn);
+                  if (S_ISLNK(statbuf.st_mode))
 # 469 "kind.ag"
-                      r2 = unlink(fn.c_str());
+                    {
 # 470 "kind.ag"
-                    }
+                      debugPrint("Remove link " + fn);
 # 471 "kind.ag"
-                  else if (S_ISDIR(statbuf.st_mode))
+                      r2 = unlink(fn.c_str());
 # 472 "kind.ag"
-                    {
+                    }
 # 473 "kind.ag"
-                      debugPrint("Remove dir " + fn);
+                  else if (S_ISDIR(statbuf.st_mode))
 # 474 "kind.ag"
-                      r2 = removeDir(fn);
+                    {
 # 475 "kind.ag"
-                    }
+                      debugPrint("Remove dir " + fn);
 # 476 "kind.ag"
-                  else
+                      r2 = removeDir(fn);
 # 477 "kind.ag"
-                    {
+                    }
 # 478 "kind.ag"
-                      debugPrint("Remove file " + fn);
+                  else
 # 479 "kind.ag"
-                      r2 = unlink(fn.c_str());
+                    {
 # 480 "kind.ag"
-                    }
+                      debugPrint("Remove file " + fn);
 # 481 "kind.ag"
-                }
+                      r2 = unlink(fn.c_str());
 # 482 "kind.ag"
-              else
+                    }
 # 483 "kind.ag"
-                {
+                }
 # 484 "kind.ag"
-                  cout << "stat(" << fn << ") failed" << endl;
+              else
 # 485 "kind.ag"
-                  // we assume "file" here
+                {
 # 486 "kind.ag"
-                  r2 = unlink(fn.c_str());
+                  cout << "stat(" << fn << ") failed" << endl;
 # 487 "kind.ag"
-                }
+                  // we assume "file" here
 # 488 "kind.ag"
-            }
+                  r2 = unlink(fn.c_str());
 # 489 "kind.ag"
-          r = r2;
+                }
 # 490 "kind.ag"
-        }
+            }
 # 491 "kind.ag"
-
+          r = r2;
 # 492 "kind.ag"
-      closedir(d);
+        }
 # 493 "kind.ag"
-    }
-# 494 "kind.ag"
 
+# 494 "kind.ag"
+      closedir(d);
 # 495 "kind.ag"
-  if (r == 0)
+    }
 # 496 "kind.ag"
-    {
+
 # 497 "kind.ag"
-      debugPrint("Remove Dir itself " + path);
+  if (r == 0)
 # 498 "kind.ag"
-
+    {
 # 499 "kind.ag"
-      r = rmdir(path.c_str());
+      debugPrint("Remove Dir itself " + path);
 # 500 "kind.ag"
-    }
-# 501 "kind.ag"
 
+# 501 "kind.ag"
+      r = rmdir(path.c_str());
 # 502 "kind.ag"
-  return r;
+    }
 # 503 "kind.ag"
-}
-# 504 "kind.ag"
 
+# 504 "kind.ag"
+  return r;
 # 505 "kind.ag"
-#if 0
+}
 # 506 "kind.ag"
-int removeDir(const string& dname)
+
 # 507 "kind.ag"
-{
+#if 0
 # 508 "kind.ag"
-  int rc = 0;
+int removeDir(const string& dname)
 # 509 "kind.ag"
-  if (!dryRun)
+{
 # 510 "kind.ag"
-    {
+  int rc = 0;
 # 511 "kind.ag"
-      Strings files;
+  if (!dryRun)
 # 512 "kind.ag"
-      // subdirectories
+    {
 # 513 "kind.ag"
-      dirList(dname, files);
+      Strings files;
 # 514 "kind.ag"
-      for (unsigned int i = 0; i < files.size(); ++i)
+      // subdirectories
 # 515 "kind.ag"
-        {
+      dirList(dname, files);
 # 516 "kind.ag"
-          debugPrint("Remove dir " + files[i]);
+      for (unsigned int i = 0; i < files.size(); ++i)
 # 517 "kind.ag"
-          for (unsigned int i = 0; i < files.size(); ++i)
+        {
 # 518 "kind.ag"
-            rc += removeDir(files[i]);
+          debugPrint("Remove dir " + files[i]);
 # 519 "kind.ag"
-        }
+          for (unsigned int i = 0; i < files.size(); ++i)
 # 520 "kind.ag"
-      files.clear();
+            rc += removeDir(files[i]);
 # 521 "kind.ag"
-
+        }
 # 522 "kind.ag"
-      // files in directory
+      files.clear();
 # 523 "kind.ag"
-      fileList(dname, files);
+
 # 524 "kind.ag"
-      for (unsigned int i = 0; i < files.size(); ++i)
+      // files in directory
 # 525 "kind.ag"
-        {
+      fileList(dname, files);
 # 526 "kind.ag"
-          debugPrint("unlink " + files[i]);
+      for (unsigned int i = 0; i < files.size(); ++i)
 # 527 "kind.ag"
-          if (!dryRun)
+        {
 # 528 "kind.ag"
-            {
+          debugPrint("unlink " + files[i]);
 # 529 "kind.ag"
-              if (unlink(files[i].c_str()) != 0)
+          if (!dryRun)
 # 530 "kind.ag"
-                rc++;
+            {
 # 531 "kind.ag"
-            }
+              if (unlink(files[i].c_str()) != 0)
 # 532 "kind.ag"
-        }
+                rc++;
 # 533 "kind.ag"
-      debugPrint("rmdir " + dname);
+            }
 # 534 "kind.ag"
-
+        }
 # 535 "kind.ag"
-      // directory
+      debugPrint("rmdir " + dname);
 # 536 "kind.ag"
-      if (rmdir(dname.c_str()) != 0)
+
 # 537 "kind.ag"
-        rc++;
+      // directory
 # 538 "kind.ag"
-    }
+      if (rmdir(dname.c_str()) != 0)
 # 539 "kind.ag"
-
+        rc++;
 # 540 "kind.ag"
-  return rc;
+    }
 # 541 "kind.ag"
-}
+
 # 542 "kind.ag"
-#endif
+  return rc;
 # 543 "kind.ag"
-
+}
 # 544 "kind.ag"
-void expireVault(const string& vault, KindConfig conf, DateTime now)
+#endif
 # 545 "kind.ag"
-{
+
 # 546 "kind.ag"
-  if (!quiet)
+void expireVault(const string& vault, KindConfig conf, DateTime now)
 # 547 "kind.ag"
-    cout << DateTime::now().getString('h') << ": Expiring images in vault " << vault << endl;
+{
 # 548 "kind.ag"
-
+  if (!quiet)
 # 549 "kind.ag"
-  readVaultConfig(vault, conf);
+    cout << DateTime::now().getString('h') << ": Expiring images in vault " << vault << endl;
 # 550 "kind.ag"
 
 # 551 "kind.ag"
-  string vaultpath = findVault(vault);
+  readVaultConfig(vault, conf);
 # 552 "kind.ag"
 
 # 553 "kind.ag"
-  Strings dirlist; // list of subdirectories
+  string vaultpath = findVault(vault);
 # 554 "kind.ag"
-  dirList(vaultpath, dirlist);
-# 555 "kind.ag"
 
+# 555 "kind.ag"
+  Strings dirlist; // list of subdirectories
 # 556 "kind.ag"
-  Strings validImages;
+  dirList(vaultpath, dirlist);
 # 557 "kind.ag"
-  Strings invalidImages;
+
 # 558 "kind.ag"
-  string imgname = getImageName(conf);
+  Strings validImages;
 # 559 "kind.ag"
-
+  Strings invalidImages;
 # 560 "kind.ag"
-  for (unsigned int i = 0; i < dirlist.size(); ++i)
+  string imgname = getImageName(conf);
 # 561 "kind.ag"
-    {
+
 # 562 "kind.ag"
-      FileName fn(dirlist[i]);
+  for (unsigned int i = 0; i < dirlist.size(); ++i)
 # 563 "kind.ag"
-      if (startsWith(fn.getName(), imgname)) // dir is image ?
+    {
 # 564 "kind.ag"
-        {
+      FileName fn(dirlist[i]);
 # 565 "kind.ag"
-          debugPrint(dirlist[i]);
+      if (startsWith(fn.getName(), imgname)) // dir is image ?
 # 566 "kind.ag"
-
+        {
 # 567 "kind.ag"
-          DateTime t = imageDate(dirlist[i]);
+          debugPrint(dirlist[i]);
 # 568 "kind.ag"
 
 # 569 "kind.ag"
-          if (t != now) // ignore just created image
+          DateTime t = imageDate(dirlist[i]);
 # 570 "kind.ag"
-            {
+
 # 571 "kind.ag"
-              if (!isValidImage(dirlist[i])) // invalid image?
+          if (t != now) // ignore just created image
 # 572 "kind.ag"
-                {
+            {
 # 573 "kind.ag"
-                  invalidImages.push_back(dirlist[i]);
+              if (!isValidImage(dirlist[i])) // invalid image?
 # 574 "kind.ag"
-                  debugPrint("- invalid image");
+                {
 # 575 "kind.ag"
-                }
+                  invalidImages.push_back(dirlist[i]);
 # 576 "kind.ag"
-              else
+                  debugPrint("- invalid image");
 # 577 "kind.ag"
-                {
+                }
 # 578 "kind.ag"
-                  validImages.push_back(dirlist[i]);
+              else
 # 579 "kind.ag"
-                  debugPrint("- valid image");
+                {
 # 580 "kind.ag"
-                }
+                  validImages.push_back(dirlist[i]);
 # 581 "kind.ag"
-            }
+                  debugPrint("- valid image");
 # 582 "kind.ag"
-          else
+                }
 # 583 "kind.ag"
-            debugPrint("- current image - ignored");
+            }
 # 584 "kind.ag"
-        }
+          else
 # 585 "kind.ag"
-    }
+            debugPrint("- current image - ignored");
 # 586 "kind.ag"
-
+        }
 # 587 "kind.ag"
-  for (unsigned int i = 0; i < invalidImages.size(); ++i)
+    }
 # 588 "kind.ag"
-    {
+
 # 589 "kind.ag"
-      try
+  for (unsigned int i = 0; i < invalidImages.size(); ++i)
 # 590 "kind.ag"
-        {
+    {
 # 591 "kind.ag"
-          DateTime t = imageDate(invalidImages[i]);
+      try
 # 592 "kind.ag"
-          DateTime expireTime = t + stot(conf.getString("expireFailedImage"));
+        {
 # 593 "kind.ag"
-          if (debug)
+          DateTime t = imageDate(invalidImages[i]);
 # 594 "kind.ag"
-            {
+          DateTime expireTime = t + stot(conf.getString("expireFailedImage"));
 # 595 "kind.ag"
-              cout << "image: " << t.getString('h') << "  expire: " << expireTime.getString('h') << endl;
+          if (debug)
 # 596 "kind.ag"
-              cout << " now: " << now.getString('h') << endl;
+            {
 # 597 "kind.ag"
-            }
+              cout << "image: " << t.getString('h') << "  expire: " << expireTime.getString('h') << endl;
 # 598 "kind.ag"
-          if (expireTime < now)
+              cout << " now: " << now.getString('h') << endl;
 # 599 "kind.ag"
-            {
+            }
 # 600 "kind.ag"
-              if (!quiet)
+          if (expireTime < now)
 # 601 "kind.ag"
-                cout << "  removing invalid image " << invalidImages[i] << endl;
+            {
 # 602 "kind.ag"
-              if (removeDir(invalidImages[i]) != 0)
+              if (!quiet)
 # 603 "kind.ag"
-                cout << "Error removing " <<  invalidImages[i] << endl;
+                cout << "  removing invalid image " << invalidImages[i] << endl;
 # 604 "kind.ag"
-            }
+              if (removeDir(invalidImages[i]) != 0)
 # 605 "kind.ag"
-        }
+                cout << "Error removing " <<  invalidImages[i] << endl;
 # 606 "kind.ag"
-      catch (Exception ex)
+            }
 # 607 "kind.ag"
-        {
+        }
 # 608 "kind.ag"
-          cerr << "Exception: " << ex.what() << endl;
+      catch (Exception ex)
 # 609 "kind.ag"
-        }
+        {
 # 610 "kind.ag"
-    }
+          cerr << "Exception: " << ex.what() << endl;
 # 611 "kind.ag"
-
+        }
 # 612 "kind.ag"
-  sort(validImages.begin(), validImages.end()); // lexicographical order == temporal order
+    }
 # 613 "kind.ag"
-  for (unsigned int i = 0;
+
 # 614 "kind.ag"
-       i < validImages.size() - 1; // never expire latest image
+  sort(validImages.begin(), validImages.end()); // lexicographical order == temporal order
 # 615 "kind.ag"
-       ++i)
+  for (unsigned int i = 0;
 # 616 "kind.ag"
-    {
+       i < validImages.size() - 1; // never expire latest image
 # 617 "kind.ag"
-      try
+       ++i)
 # 618 "kind.ag"
-        {
+    {
 # 619 "kind.ag"
-          DateTime imageTime = imageDate(validImages[i]);
+      try
 # 620 "kind.ag"
-          DateTime expireTime = DateTime::now() + 100; // don't expire if  no rule found
+        {
 # 621 "kind.ag"
-          Strings expireRules = conf.getStrings("expireRule");
+          DateTime imageTime = imageDate(validImages[i]);
 # 622 "kind.ag"
-          int ruleNr = 0;
+          DateTime expireTime = DateTime::now() + 100; // don't expire if  no rule found
 # 623 "kind.ag"
-          for (unsigned int k = 0; k < expireRules.size(); ++k)
+          Strings expireRules = conf.getStrings("expireRule");
 # 624 "kind.ag"
-            {
+          int ruleNr = 0;
 # 625 "kind.ag"
-              debugPrint("Checking rule " + expireRules[k]);
+          for (unsigned int k = 0; k < expireRules.size(); ++k)
 # 626 "kind.ag"
-
+            {
 # 627 "kind.ag"
-              set<int> M, D, W, h;
+              debugPrint("Checking rule " + expireRules[k]);
 # 628 "kind.ag"
-              set<int> Y, m, s;
+
 # 629 "kind.ag"
-              time_t expirePeriod;
+              set<int> M, D, W, h;
 # 630 "kind.ag"
-              parseRule(expireRules[k], M, D, W, h, expirePeriod);
+              set<int> Y, m, s;
 # 631 "kind.ag"
-              //    cout << M << " " << D << " " << W << " " << h << " " << expirePeriod << endl;
+              time_t expirePeriod;
 # 632 "kind.ag"
-
+              parseRule(expireRules[k], M, D, W, h, expirePeriod);
 # 633 "kind.ag"
-              if (imageTime.match(Y, M, D, W, h, m, s))
+              //    cout << M << " " << D << " " << W << " " << h << " " << expirePeriod << endl;
 # 634 "kind.ag"
-                {
+
 # 635 "kind.ag"
-                  debugPrint("match");
+              if (imageTime.match(Y, M, D, W, h, m, s))
 # 636 "kind.ag"
-                  expireTime = imageTime + expirePeriod;
+                {
 # 637 "kind.ag"
-                  ruleNr = k;
+                  debugPrint("match");
 # 638 "kind.ag"
-                }
+                  expireTime = imageTime + expirePeriod;
 # 639 "kind.ag"
-            }
+                  ruleNr = k;
 # 640 "kind.ag"
+                }
+# 641 "kind.ag"
+            }
+# 642 "kind.ag"
           if (debug)
-# 641 "kind.ag"
+# 643 "kind.ag"
             {
-# 642 "kind.ag"
+# 644 "kind.ag"
               cout << "image: " << imageTime.getString('h') << "  expire: " << expireTime.getString('h') << endl;
-# 643 "kind.ag"
+# 645 "kind.ag"
               cout << " now: " << now.getString('h') << endl;
-# 644 "kind.ag"
+# 646 "kind.ag"
             }
-# 645 "kind.ag"
+# 647 "kind.ag"
           if (now > expireTime)
-# 646 "kind.ag"
+# 648 "kind.ag"
             {
-# 647 "kind.ag"
+# 649 "kind.ag"
               if (!quiet)
-# 648 "kind.ag"
+# 650 "kind.ag"
                 cout << "removing " << validImages[i] << " rule=" << expireRules[ruleNr] << endl;
-# 649 "kind.ag"
+# 651 "kind.ag"
               removeDir(validImages[i]);
-# 650 "kind.ag"
+# 652 "kind.ag"
             }
-# 651 "kind.ag"
+# 653 "kind.ag"
         }
-# 652 "kind.ag"
+# 654 "kind.ag"
       catch (Exception ex)
-# 653 "kind.ag"
+# 655 "kind.ag"
         {
-# 654 "kind.ag"
+# 656 "kind.ag"
           cerr << "Exception: " << ex.what() << endl;
-# 655 "kind.ag"
+# 657 "kind.ag"
         }
-# 656 "kind.ag"
+# 658 "kind.ag"
     }
-# 657 "kind.ag"
+# 659 "kind.ag"
 }
-# 658 "kind.ag"
+# 660 "kind.ag"
 
-# 659 "kind.ag"
+# 661 "kind.ag"
 /*AppGen:Main*/
 string ag_programName;
 
@@ -1462,229 +1466,229 @@ string vault = "";
   else error("Parameter vault_or_group needed");
 
 /*AppGen:MainEnd*/
-# 663 "kind.ag"
-
-# 664 "kind.ag"
-  int exitCode = 0;
 # 665 "kind.ag"
-  string lockFile;
+
 # 666 "kind.ag"
-  try
+  int exitCode = 0;
 # 667 "kind.ag"
-    {
+  string lockFile;
 # 668 "kind.ag"
-      if (debug)
+  try
 # 669 "kind.ag"
-        verbose = true;
+    {
 # 670 "kind.ag"
-
+      if (debug)
 # 671 "kind.ag"
-      KindConfig conf;
+        verbose = true;
 # 672 "kind.ag"
 
 # 673 "kind.ag"
-      // default-values
+      KindConfig conf;
 # 674 "kind.ag"
-      conf.add("imageName", "image");
+
 # 675 "kind.ag"
-      conf.add("vaultConfigName", "kind/vault.conf");
+      // default-values
 # 676 "kind.ag"
-      conf.add("expireFailedImage", "3 days");
+      conf.add("imageName", "image");
 # 677 "kind.ag"
-      conf.add("expireRule", "* * * * 1 month");
+      conf.add("vaultConfigName", "kind/vault.conf");
 # 678 "kind.ag"
-      conf.add("rsyncOption", ""); // no additional rsync option
+      conf.add("expireFailedImage", "3 days");
 # 679 "kind.ag"
-      conf.add("remoteShell", "");
+      conf.add("expireRule", "* * * * 1 month");
 # 680 "kind.ag"
-      conf.add("lockfile", "/var/lock/kind");
+      conf.add("rsyncOption", ""); // no additional rsync option
 # 681 "kind.ag"
-      conf.add("userExcludeFile", "nobackup.list");
+      conf.add("remoteShell", "");
 # 682 "kind.ag"
-      conf.add("userExcludeCommand",
+      conf.add("lockfile", "/var/lock/kind");
 # 683 "kind.ag"
-               "find %path -type f -iname '*nobackup' -printf '%P\\\\n'");
+      conf.add("userExcludeFile", "nobackup.list");
 # 684 "kind.ag"
-      conf.add("logSize", "");
+      conf.add("userExcludeCommand",
 # 685 "kind.ag"
-
+               "find %path -type f -iname '*nobackup' -printf '%P\\\\n'");
 # 686 "kind.ag"
-      if (listConfig)
+      conf.add("logSize", "");
 # 687 "kind.ag"
-        {
+
 # 688 "kind.ag"
-          cout << "builtin config" << endl;
+      if (listConfig)
 # 689 "kind.ag"
-          conf.print(".   ");
+        {
 # 690 "kind.ag"
-        }
+          cout << "builtin config" << endl;
 # 691 "kind.ag"
-
+          conf.print(".   ");
 # 692 "kind.ag"
-      readMasterConfig(masterConfig, conf);
+        }
 # 693 "kind.ag"
 
 # 694 "kind.ag"
-      banks = conf.getStrings("bank");
+      readMasterConfig(masterConfig, conf);
 # 695 "kind.ag"
-      if (banks.empty())
+
 # 696 "kind.ag"
-        throw Exception("read master config", "no banks defined");
+      banks = conf.getStrings("bank");
 # 697 "kind.ag"
-
+      if (banks.empty())
 # 698 "kind.ag"
-      if (listConfig)
+        throw Exception("read master config", "no banks defined");
 # 699 "kind.ag"
-        {
+
 # 700 "kind.ag"
-          cout << "global config:" << endl;
+      if (listConfig)
 # 701 "kind.ag"
-          conf.print(".   ");
+        {
 # 702 "kind.ag"
-          readVaultConfig(vault, conf);
+          cout << "global config:" << endl;
 # 703 "kind.ag"
-          cout << "vault config:" << endl;
-# 704 "kind.ag"
           conf.print(".   ");
+# 704 "kind.ag"
+          readVaultConfig(vault, conf);
 # 705 "kind.ag"
-          exit(0);
+          cout << "vault config:" << endl;
 # 706 "kind.ag"
-        }
+          conf.print(".   ");
 # 707 "kind.ag"
-
+          exit(0);
 # 708 "kind.ag"
-      lockFile = conf.getString("lockfile");
+        }
 # 709 "kind.ag"
-      createLock(lockFile);
-# 710 "kind.ag"
 
+# 710 "kind.ag"
+      lockFile = conf.getString("lockfile");
 # 711 "kind.ag"
-      DateTime imageTime = DateTime::now();
+      createLock(lockFile);
 # 712 "kind.ag"
-      string logSizeFile = conf.getString("logSize");
+
 # 713 "kind.ag"
-      if (!logSizeFile.empty() && fileExists(logSizeFile))
+      DateTime imageTime = DateTime::now();
 # 714 "kind.ag"
-        {
+      string logSizeFile = conf.getString("logSize");
 # 715 "kind.ag"
-          vector<string> ss;
+      if (!logSizeFile.empty() && fileExists(logSizeFile))
 # 716 "kind.ag"
-          file2Strings(logSizeFile, ss);
+        {
 # 717 "kind.ag"
-          for (auto s : ss)
+          vector<string> ss;
 # 718 "kind.ag"
-            {
+          file2Strings(logSizeFile, ss);
 # 719 "kind.ag"
-              unsigned int i = 0;
+          for (auto s : ss)
 # 720 "kind.ag"
-              string v = getWord(s, i);
+            {
 # 721 "kind.ag"
-              long int s1 = getLongInt(s, i);
+              unsigned int i = 0;
 # 722 "kind.ag"
-              long int s2 = getLongInt(s, i);
+              string v = getWord(s, i);
 # 723 "kind.ag"
-              sizes[v] = Sizes(s1, s2);
+              long int s1 = getLongInt(s, i);
 # 724 "kind.ag"
-            }
+              long int s2 = getLongInt(s, i);
 # 725 "kind.ag"
-        }
+              sizes[v] = Sizes(s1, s2);
 # 726 "kind.ag"
-
+            }
 # 727 "kind.ag"
-      vector<string> vaults;
+        }
 # 728 "kind.ag"
-      string groupname = "group_" + vault;
+
 # 729 "kind.ag"
-      if (conf.hasKey(groupname))
+      vector<string> vaults;
 # 730 "kind.ag"
-        vaults = conf.getStrings(groupname);
+      string groupname = "group_" + vault;
 # 731 "kind.ag"
-      else
+      if (conf.hasKey(groupname))
 # 732 "kind.ag"
-        vaults.push_back(vault);
+        vaults = conf.getStrings(groupname);
 # 733 "kind.ag"
-
+      else
 # 734 "kind.ag"
-      if (!expireOnly)
+        vaults.push_back(vault);
 # 735 "kind.ag"
-        for (unsigned int i = 0; i < vaults.size(); ++i)
+
 # 736 "kind.ag"
-          {
+      if (!expireOnly)
 # 737 "kind.ag"
-            backupVault(vaults[i], conf, imageTime, fullImage);
+        for (unsigned int i = 0; i < vaults.size(); ++i)
 # 738 "kind.ag"
-            if (!logSizeFile.empty())
+          {
 # 739 "kind.ag"
-              {
+            backupVault(vaults[i], conf, imageTime, fullImage);
 # 740 "kind.ag"
-                Strings st;
+            if (!logSizeFile.empty())
 # 741 "kind.ag"
-                for (auto s : sizes)
+              {
 # 742 "kind.ag"
-                  {
+                Strings st;
 # 743 "kind.ag"
-                    string h = s.first + " " + to_string(s.second.first) + " " + to_string(s.second.second);
+                for (auto s : sizes)
 # 744 "kind.ag"
-                    st.push_back(h);
+                  {
 # 745 "kind.ag"
-                  }
+                    string h = s.first + " " + to_string(s.second.first) + " " + to_string(s.second.second);
 # 746 "kind.ag"
-                strings2File(st, logSizeFile);
+                    st.push_back(h);
 # 747 "kind.ag"
-              }
+                  }
 # 748 "kind.ag"
-          }
+                strings2File(st, logSizeFile);
 # 749 "kind.ag"
-
+              }
 # 750 "kind.ag"
-      if (!backupOnly)
+          }
 # 751 "kind.ag"
-        for (unsigned int i = 0; i < vaults.size(); ++i)
+
 # 752 "kind.ag"
-          expireVault(vaults[i], conf, imageTime);
+      if (!backupOnly)
 # 753 "kind.ag"
-
+        for (unsigned int i = 0; i < vaults.size(); ++i)
 # 754 "kind.ag"
-      if (!quiet)
+          expireVault(vaults[i], conf, imageTime);
 # 755 "kind.ag"
-        cout << DateTime::now().getString('h') << ": finished" << endl;
-# 756 "kind.ag"
 
+# 756 "kind.ag"
+      if (!quiet)
 # 757 "kind.ag"
-    }
+        cout << DateTime::now().getString('h') << ": finished" << endl;
 # 758 "kind.ag"
-  catch (const Exception& ex)
+
 # 759 "kind.ag"
-    {
+    }
 # 760 "kind.ag"
-      cerr << "Exception: " << ex.what() << endl;
+  catch (const Exception& ex)
 # 761 "kind.ag"
-      exitCode = 1;
+    {
 # 762 "kind.ag"
-    }
+      cerr << "Exception: " << ex.what() << endl;
 # 763 "kind.ag"
-  catch (const char* msg)
+      exitCode = 1;
 # 764 "kind.ag"
-    {
+    }
 # 765 "kind.ag"
-      cerr << "Exception(char*): " << msg << endl;
+  catch (const char* msg)
 # 766 "kind.ag"
-      exitCode = 1;
+    {
 # 767 "kind.ag"
-    }
+      cerr << "Exception(char*): " << msg << endl;
 # 768 "kind.ag"
-  catch (const string& msg)
+      exitCode = 1;
 # 769 "kind.ag"
-    {
+    }
 # 770 "kind.ag"
-      cerr << "Exception(string): " << msg << endl;
+  catch (const string& msg)
 # 771 "kind.ag"
-      exitCode = 1;
+    {
 # 772 "kind.ag"
-    }
+      cerr << "Exception(string): " << msg << endl;
 # 773 "kind.ag"
-  removeLock(lockFile);
+      exitCode = 1;
 # 774 "kind.ag"
-  return exitCode;
+    }
 # 775 "kind.ag"
+  removeLock(lockFile);
+# 776 "kind.ag"
+  return exitCode;
+# 777 "kind.ag"
 }