]> git.sur5r.net Git - bacula/bacula/commitdiff
Add BaseJob option to fileset
authorEric Bollengier <eric@eb.homelinux.org>
Wed, 26 Aug 2009 13:49:01 +0000 (15:49 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Wed, 26 Aug 2009 13:49:01 +0000 (15:49 +0200)
bacula/src/dird/inc_conf.c
bacula/src/filed/accurate.c
bacula/src/filed/backup.c
bacula/src/filed/job.c
bacula/src/findlib/find.c
bacula/src/findlib/find.h

index ef15d3f2dd0a6e056e22e9a8af32b2fd773e612e..5f34d8f00c9a52abc0a80a2f3daf46d8d7bed7de 100644 (file)
@@ -98,6 +98,7 @@ static RES_ITEM2 newinc_items[] = {
 static RES_ITEM options_items[] = {
    {"compression",     store_opts,    {0},     0, 0, 0},
    {"signature",       store_opts,    {0},     0, 0, 0},
+   {"basejob",         store_opts,    {0},     0, 0, 0},
    {"accurate",        store_opts,    {0},     0, 0, 0},
    {"verify",          store_opts,    {0},     0, 0, 0},
    {"onefs",           store_opts,    {0},     0, 0, 0},
@@ -140,6 +141,7 @@ enum {
    INC_KW_DIGEST,
    INC_KW_ENCRYPTION,
    INC_KW_VERIFY,
+   INC_KW_BASEJOB,
    INC_KW_ACCURATE,
    INC_KW_ONEFS,
    INC_KW_RECURSE,
@@ -173,6 +175,7 @@ static struct s_kw FS_option_kw[] = {
    {"signature",   INC_KW_DIGEST},
    {"encryption",  INC_KW_ENCRYPTION},
    {"verify",      INC_KW_VERIFY},
+   {"basejob",     INC_KW_BASEJOB},
    {"accurate",    INC_KW_ACCURATE},
    {"onefs",       INC_KW_ONEFS},
    {"recurse",     INC_KW_RECURSE},
@@ -297,6 +300,12 @@ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen)
       bstrncat(opts, lc->str, optlen);
       bstrncat(opts, ":", optlen);         /* terminate it */
       Dmsg3(900, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen);
+   } else if (keyword == INC_KW_BASEJOB) { /* special case */
+      /* ***FIXME**** ensure these are in permitted set */
+      bstrncat(opts, "J", optlen);         /* indicate BaseJob */
+      bstrncat(opts, lc->str, optlen);
+      bstrncat(opts, ":", optlen);         /* terminate it */
+      Dmsg3(900, "Catopts=%s option=%s optlen=%d\n", opts, option,optlen);
    } else if (keyword == INC_KW_STRIPPATH) { /* another special case */
       if (!is_an_integer(lc->str)) {
          scan_err1(lc, _("Expected a strip path positive integer, got:%s:"), lc->str);
index 90e7ff24d3138b99678a921e423b9e3387879bb2..2075de877ac6bc8feb2948e54267a62ce5cc63c3 100644 (file)
@@ -242,6 +242,7 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
    struct stat statc;
    int32_t LinkFIc;
    bool stat = false;
+   char *opts;
    char *fname;
    CurFile elt;
 
@@ -270,11 +271,17 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
 
    decode_stat(elt.lstat, &statc, &LinkFIc); /* decode catalog stat */
 
+   if (jcr->get_JobLevel() == L_FULL) {
+      opts = ff_pkt->BaseJobOpts;
+   } else {
+      opts = ff_pkt->AccurateOpts;
+   }
+
    /*
     * Loop over options supplied by user and verify the
     * fields he requests.
     */
-   for (char *p=ff_pkt->AccurateOpts; !stat && *p; p++) {
+   for (char *p=opts; !stat && *p; p++) {
       char ed1[30], ed2[30];
       switch (*p) {
       case 'i':                /* compare INODEs */
@@ -287,6 +294,9 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
          }
          break;
       case 'p':                /* permissions bits */
+         /* TODO: If something change only in perm, user, group
+          * Backup only the attribute stream
+          */
          if (statc.st_mode != ff_pkt->statp.st_mode) {
             Dmsg3(dbglvl-1, "%s     st_mode  differ. Cat: %x File: %x\n",
                   fname,
@@ -362,13 +372,21 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
           * The remainder of the function is all about getting the checksum.
           * First we initialise, then we read files, other streams and Finder Info.
           */
-         if (!stat && *elt.chksum && ff_pkt->type != FT_LNKSAVED && 
+         if (!stat && ff_pkt->type != FT_LNKSAVED && 
              (S_ISREG(ff_pkt->statp.st_mode) && 
               ff_pkt->flags & (FO_MD5|FO_SHA1|FO_SHA256|FO_SHA512))) 
          {
+
+            if (!*elt.chksum) {
+               Jmsg(jcr, M_WARNING, 0, _("Can't verify checksum for %s\n"),
+                    ff_pkt->fname);
+               stat = true;
+               break;
+            }
+
             /*
-             * Create our digest context. If this fails, the digest will be set to NULL
-             * and not used.
+             * Create our digest context. If this fails, the digest will be set
+             * to NULL and not used.
              */
             if (ff_pkt->flags & FO_MD5) {
                digest = crypto_digest_new(jcr, CRYPTO_DIGEST_MD5);
@@ -428,6 +446,7 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
 
          break;
       case ':':
+      case 'J':
       case 'C':
       default:
          break;
index ef18dcda45ae7854ed3bb69a4901ca142784d898..ff8265aea77d6f2894b20bdb6c7ebf3570c95bd3 100644 (file)
@@ -454,10 +454,12 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
       }
 
       /*
-       * Set up signature digest handling. If this fails, the signature digest will be set to
-       * NULL and not used.
+       * Set up signature digest handling. If this fails, the signature digest
+       * will be set to NULL and not used.
+       */
+      /* TODO landonf: We should really only calculate the digest once, for
+       * both verification and signing.
        */
-      // TODO landonf: We should really only calculate the digest once, for both verification and signing.
       if (jcr->crypto.pki_sign) {
          signing_digest = crypto_digest_new(jcr, signing_algorithm);
 
index 502d11439bbfa4720bec558a4904a7401948e6b6..777bac36c4fba2d5482eba866af53aa07c7a7ffa 100644 (file)
@@ -1112,6 +1112,16 @@ static void set_options(findFOPTS *fo, const char *opts)
          }
          fo->AccurateOpts[j] = 0;
          break;
+      case 'J':                  /* Basejob options */
+         /* Copy BaseJob Options */
+         for (j=0; *p && *p != ':'; p++) {
+            fo->BaseJobOpts[j] = *p;
+            if (j < (int)sizeof(fo->BaseJobOpts) - 1) {
+               j++;
+            }
+         }
+         fo->BaseJobOpts[j] = 0;
+         break;
       case 'P':                  /* strip path */
          /* Get integer */
          p++;                    /* skip P */
index 0a4599e43a7859163c423dbacd0304df0a86fb69..258e4b198802edf5d3d4a65a98b1d8288ea55abd 100644 (file)
@@ -176,6 +176,7 @@ find_files(JCR *jcr, FF_PKT *ff, int file_save(JCR *jcr, FF_PKT *ff_pkt, bool to
       ff->VerifyOpts[0] = 'V';
       ff->VerifyOpts[1] = 0;
       strcpy(ff->AccurateOpts, "C:mcs"); /* mtime+ctime+size by default */
+      strcpy(ff->BaseJobOpts, "J:mspug5"); /* mtime+size+perm+user+group+chk  */
       for (i=0; i<fileset->include_list.size(); i++) {
          findINCEXE *incexe = (findINCEXE *)fileset->include_list.get(i);
          fileset->incexe = incexe;
@@ -192,6 +193,7 @@ find_files(JCR *jcr, FF_PKT *ff, int file_save(JCR *jcr, FF_PKT *ff_pkt, bool to
             ff->drivetypes = fo->drivetype;
             bstrncat(ff->VerifyOpts, fo->VerifyOpts, sizeof(ff->VerifyOpts));
             bstrncat(ff->AccurateOpts, fo->AccurateOpts, sizeof(ff->AccurateOpts));
+            bstrncat(ff->BaseJobOpts, fo->BaseJobOpts, sizeof(ff->BaseJobOpts));
          }
          dlistString *node;
          foreach_dlist(node, &incexe->name_list) {
index b1af7394036c2d9aabd51c641110b30bed3fdc5e..5f15769133f3fc38ecb3a61644b0f8036d5ff00f 100644 (file)
@@ -141,6 +141,7 @@ struct findFOPTS {
    int strip_path;                    /* strip path count */
    char VerifyOpts[MAX_FOPTS];        /* verify options */
    char AccurateOpts[MAX_FOPTS];      /* accurate mode options */
+   char BaseJobOpts[MAX_FOPTS];       /* basejob mode options */
    alist regex;                       /* regex string(s) */
    alist regexdir;                    /* regex string(s) for directories */
    alist regexfile;                   /* regex string(s) for files */
@@ -206,6 +207,7 @@ struct FF_PKT {
    bool incremental;                  /* incremental save */
    char VerifyOpts[20];
    char AccurateOpts[20];
+   char BaseJobOpts[20];
    struct s_included_file *included_files_list;
    struct s_excluded_file *excluded_files_list;
    struct s_excluded_file *excluded_paths_list;