From: <ri...@us...> - 2007-03-31 08:05:15
|
Revision: 4467 http://bacula.svn.sourceforge.net/bacula/?rev=4467&view=rev Author: ricozz Date: 2007-03-31 01:05:13 -0700 (Sat, 31 Mar 2007) Log Message: ----------- ebl Check size, age of each file after their backup to see if they have changed during backup. Modified Paths: -------------- trunk/bacula/src/dird/inc_conf.c trunk/bacula/src/filed/backup.c trunk/bacula/src/filed/job.c trunk/bacula/src/findlib/find.h trunk/bacula/src/findlib/find_one.c trunk/bacula/src/findlib/protos.h trunk/bacula/src/win32/dll/bacula.def trunk/bacula/technotes-2.1 Modified: trunk/bacula/src/dird/inc_conf.c =================================================================== --- trunk/bacula/src/dird/inc_conf.c 2007-03-31 03:06:44 UTC (rev 4466) +++ trunk/bacula/src/dird/inc_conf.c 2007-03-31 08:05:13 UTC (rev 4467) @@ -120,6 +120,7 @@ {"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 @@ INC_KW_IGNORECASE, INC_KW_HFSPLUS, INC_KW_NOATIME, - INC_KW_ENHANCEDWILD + INC_KW_ENHANCEDWILD, + INC_KW_CHKCHANGES }; /* @@ -174,6 +176,7 @@ {"hfsplussupport", INC_KW_HFSPLUS}, {"noatime", INC_KW_NOATIME}, {"enhancedwild", INC_KW_ENHANCEDWILD}, + {"checkfilechanges", INC_KW_CHKCHANGES}, {NULL, 0} }; @@ -239,6 +242,8 @@ {"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} }; Modified: trunk/bacula/src/filed/backup.c =================================================================== --- trunk/bacula/src/filed/backup.c 2007-03-31 03:06:44 UTC (rev 4466) +++ trunk/bacula/src/filed/backup.c 2007-03-31 08:05:13 UTC (rev 4467) @@ -466,7 +466,13 @@ } 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; } Modified: trunk/bacula/src/filed/job.c =================================================================== --- trunk/bacula/src/filed/job.c 2007-03-31 03:06:44 UTC (rev 4466) +++ trunk/bacula/src/filed/job.c 2007-03-31 08:05:13 UTC (rev 4467) @@ -1021,6 +1021,9 @@ 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; Modified: trunk/bacula/src/findlib/find.h =================================================================== --- trunk/bacula/src/findlib/find.h 2007-03-31 03:06:44 UTC (rev 4466) +++ trunk/bacula/src/findlib/find.h 2007-03-31 08:05:13 UTC (rev 4467) @@ -107,6 +107,7 @@ #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; Modified: trunk/bacula/src/findlib/find_one.c =================================================================== --- trunk/bacula/src/findlib/find_one.c 2007-03-31 03:06:44 UTC (rev 4466) +++ trunk/bacula/src/findlib/find_one.c 2007-03-31 08:05:13 UTC (rev 4467) @@ -181,6 +181,51 @@ 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. Modified: trunk/bacula/src/findlib/protos.h =================================================================== --- trunk/bacula/src/findlib/protos.h 2007-03-31 03:06:44 UTC (rev 4466) +++ trunk/bacula/src/findlib/protos.h 2007-03-31 08:05:13 UTC (rev 4467) @@ -65,8 +65,8 @@ 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); Modified: trunk/bacula/src/win32/dll/bacula.def =================================================================== --- trunk/bacula/src/win32/dll/bacula.def 2007-03-31 03:06:44 UTC (rev 4466) +++ trunk/bacula/src/win32/dll/bacula.def 2007-03-31 08:05:13 UTC (rev 4467) @@ -80,7 +80,9 @@ ; find_one.c: _Z13find_one_fileP3JCRP6FF_PKTPFiS2_PvbES3_Pcjb +_Z17has_file_changedP3JCRP6FF_PKT + ; fstype.c: _Z6fstypePKcPci Modified: trunk/bacula/technotes-2.1 =================================================================== --- trunk/bacula/technotes-2.1 2007-03-31 03:06:44 UTC (rev 4466) +++ trunk/bacula/technotes-2.1 2007-03-31 08:05:13 UTC (rev 4467) @@ -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 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |