]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Check size, age of each file after their backup to see if
authorEric Bollengier <eric@eb.homelinux.org>
Sat, 31 Mar 2007 08:05:13 +0000 (08:05 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Sat, 31 Mar 2007 08:05:13 +0000 (08:05 +0000)
     they have changed during backup.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4467 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/dird/inc_conf.c
bacula/src/filed/backup.c
bacula/src/filed/job.c
bacula/src/findlib/find.h
bacula/src/findlib/find_one.c
bacula/src/findlib/protos.h
bacula/technotes-2.1

index 0960a59aebf65592109cd1200fb937fef66d5a19..c9ebc379950d0bfef7eac903b4ca9de84eeb8153 100644 (file)
@@ -120,6 +120,7 @@ static RES_ITEM options_items[] = {
    {"noatime",         store_opts,    {0},     0, 0, 0},
    {"enhancedwild",    store_opts,    {0},     0, 0, 0},
    {"drivetype",       store_drivetype, {0},     0, 0, 0},
+   {"checkfilechanges",store_opts,    {0},     0, 0, 0},
    {NULL, NULL, {0}, 0, 0, 0}
 };
 
@@ -145,7 +146,8 @@ enum {
    INC_KW_IGNORECASE,
    INC_KW_HFSPLUS,
    INC_KW_NOATIME,
-   INC_KW_ENHANCEDWILD
+   INC_KW_ENHANCEDWILD,
+   INC_KW_CHKCHANGES
 };
 
 /*
@@ -174,6 +176,7 @@ static struct s_kw FS_option_kw[] = {
    {"hfsplussupport", INC_KW_HFSPLUS},
    {"noatime",     INC_KW_NOATIME},
    {"enhancedwild", INC_KW_ENHANCEDWILD},
+   {"checkfilechanges", INC_KW_CHKCHANGES},
    {NULL,          0}
 };
 
@@ -239,6 +242,8 @@ static struct s_fs_opt FS_options[] = {
    {"no",       INC_KW_NOATIME,       "0"},
    {"yes",      INC_KW_ENHANCEDWILD,  "K"},
    {"no",       INC_KW_ENHANCEDWILD,  "0"},
+   {"yes",      INC_KW_CHKCHANGES,    "c"},
+   {"no",       INC_KW_CHKCHANGES,    "0"},
    {NULL,       0,                      0}
 };
 
index f218f52f15c002777cd2122d331740532f3617ec..83ba1d4f6565ad0214345f5a65a0db250eb3bea8 100644 (file)
@@ -466,7 +466,13 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
       }
 
       stat = send_data(jcr, data_stream, ff_pkt, digest, signing_digest);
+
+      if (ff_pkt->flags & FO_CHKCHANGES) {
+         has_file_changed(jcr, ff_pkt);
+      }
+
       bclose(&ff_pkt->bfd);
+      
       if (!stat) {
          goto bail_out;
       }
index 89aa461d582084f6f2decc94a45b71a05ee539e3..13b094ec263345bd4f6e9098adb6d32d3352d962 100644 (file)
@@ -1021,6 +1021,9 @@ static void set_options(findFOPTS *fo, const char *opts)
       case 'K':
          fo->flags |= FO_NOATIME;
          break;
+      case 'c':
+         fo->flags |= FO_CHKCHANGES;
+         break;
       default:
          Emsg1(M_ERROR, 0, _("Unknown include/exclude option: %c\n"), *p);
          break;
index 7b6c7ab741986b6bb4503bd86d1c45c075140cad..9c2e6b4c2317cfc3c2bca7a6c79630c20065dab2 100644 (file)
@@ -107,6 +107,7 @@ enum {
 #define FO_ENCRYPT      (1<<21)       /* Encrypt data stream */
 #define FO_NOATIME      (1<<22)       /* Use O_NOATIME to prevent atime change */
 #define FO_ENHANCEDWILD (1<<23)       /* Enhanced wild card processing */
+#define FO_CHKCHANGES   (1<<24)       /* Check if file have been modified during backup */
 
 struct s_included_file {
    struct s_included_file *next;
index 3615f8088cb09d3f982947181a5211f0c0f99dfc..d6c25fbdee2ad89290ce2a770c7798a8b794abbc 100644 (file)
@@ -181,6 +181,51 @@ static bool volume_has_attrlist(const char *fname)
    return false;
 }
 
+/* check if a file have changed during backup and display an error */
+bool has_file_changed(JCR *jcr, FF_PKT *ff_pkt)
+{
+   struct stat statp;
+   Dmsg1(500, "has_file_changed fname=%s\n",ff_pkt->fname);
+
+   if (ff_pkt->type != FT_REG) { /* not a regular file */
+      return false;
+   }
+
+   if (lstat(ff_pkt->fname, &statp) != 0) {
+      berrno be;
+      Jmsg(jcr, M_WARNING, 0, 
+          _("Cannot stat file %s: ERR=%s\n"),ff_pkt->fname,be.strerror());
+      return true;
+   }
+
+   if (statp.st_mtime != ff_pkt->statp.st_mtime) {
+      /* TODO: add time of changes */
+      Jmsg(jcr, M_ERROR, 0, _("%s mtime changed during backup.\n"), ff_pkt->fname);
+      return true;
+   }
+
+   if (statp.st_ctime != ff_pkt->statp.st_ctime) {
+      /* TODO: add time of changes */
+      Jmsg(jcr, M_ERROR, 0, _("%s ctime changed during backup.\n"), ff_pkt->fname);
+      return true;
+   }
+  
+   if (statp.st_size != ff_pkt->statp.st_size) {
+      /* TODO: add size change */
+      Jmsg(jcr, M_ERROR, 0, _("%s size changed during backup.\n"),ff_pkt->fname);
+      return true;
+   }
+
+   if ((statp.st_blksize != ff_pkt->statp.st_blksize) ||
+       (statp.st_blocks  != ff_pkt->statp.st_blocks)) {
+      /* TODO: add size change */
+      Jmsg(jcr, M_ERROR, 0, _("%s size changed during backup.\n"),ff_pkt->fname);
+      return true;
+   }
+
+   return false;
+}
+
 /*
  * Find a single file.
  * handle_file is the callback for handling the file.
index 4999a1fb55a283e30d7fb74750ab95fbcae1102a..a2332e048f9272accd31adcbaf8411a01a7a65df 100644 (file)
@@ -65,7 +65,7 @@ int   find_one_file(JCR *jcr, FF_PKT *ff,
                int handle_file(FF_PKT *ff_pkt, void *hpkt, bool top_level),
                void *pkt, char *p, dev_t parent_device, bool top_level);
 int   term_find_one(FF_PKT *ff);
-
+bool  has_file_changed(JCR *jcr, FF_PKT *ff_pkt);
 
 /* From get_priv.c */
 int enable_backup_privileges(JCR *jcr, int ignore_errors);
index aa6c8c493a954a25efbb1dad878f02e50e5efda8..60e41dab84d0d9765d58c637fb71e763816133e2 100644 (file)
@@ -1,6 +1,14 @@
               Technical notes on version 2.1
 
 General:
+31Mar07
+ebl  Check size and age of each file after their backup to see if
+     they have changed during backup.
+     It ask to fd to do an extra check (stat(2)) after
+     each file backup. mtime, ctime and size are compared with
+     "before backup" informations. If time or size mismatch, an
+     error will raise.
+     You must upgrade FD to use it.
 30Mar07
 kes  Make database name and user configurable
      --with-db-name=xxx --with-db-user=xxx