]> git.sur5r.net Git - bacula/bacula/commitdiff
1.19 24Apr02
authorKern Sibbald <kern@sibbald.com>
Wed, 24 Apr 2002 07:41:59 +0000 (07:41 +0000)
committerKern Sibbald <kern@sibbald.com>
Wed, 24 Apr 2002 07:41:59 +0000 (07:41 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@5 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/cats/cats.h
bacula/src/dird/dird_conf.c
bacula/src/dird/dird_conf.h
bacula/src/dird/ua_cmds.c
bacula/src/dird/ua_dotcmds.c
bacula/src/dird/ua_output.c
bacula/src/dird/ua_run.c
bacula/src/dird/ua_select.c
bacula/src/dird/verify.c
bacula/src/version.h

index 55bfe85549c12012e56059b7bc5c45aebef2f27a..d765ccb8a72ac9f2d5b44e38bb481353c7935553 100644 (file)
@@ -331,6 +331,8 @@ typedef struct {
    int UseOnce;                       /* set to use once only */
    int UseCatalog;                    /* set to use catalog */
    int AcceptAnyVolume;               /* set to accept any volume sequence */
+   int AutoRecycle;                   /* set to recycle automatically */
+   uint32_t VolumeRetention;          /* retention period in seconds */
    char PoolType[MAX_NAME_LENGTH];             
    char LabelFormat[MAX_NAME_LENGTH];
    /* Extra stuff not in DB */
index aea47de80e081fb47d620824549a295be5a80dbc..5d3dc5a8b740204f0e4e8f8c8afef74218966f20 100644 (file)
@@ -109,10 +109,8 @@ static struct res_items cli_items[] = {
    {"fdport",   store_pint,       ITEM(res_client.FDport),   0, ITEM_REQUIRED, 0},
    {"password", store_password,   ITEM(res_client.password), 0, ITEM_REQUIRED, 0},
    {"catalog",  store_res,        ITEM(res_client.catalog),  R_CATALOG, 0, 0},
-   {"catalogretentionperiod", store_time,      
-                        ITEM(res_client.cat_ret_period), 0, ITEM_DEFAULT, 60},
-   {"mediaretentionperiod", store_time,      
-                        ITEM(res_client.media_ret_period), 0, ITEM_DEFAULT, 60},
+   {"fileretention", store_time,  ITEM(res_client.FileRetention), 0, ITEM_DEFAULT, 60*60*24*30},
+   {"jobretention",  store_time,  ITEM(res_client.JobRetention),  0, ITEM_DEFAULT, 60*60*24*365},
    {NULL, NULL, NULL, 0, 0, 0} 
 };
 
@@ -217,6 +215,8 @@ static struct res_items pool_items[] = {
    {"maximumvolumes",  store_pint,  ITEM(res_pool.max_volumes),     0, 0,             0},
    {"acceptanyvolume", store_yesno, ITEM(res_pool.accept_any_volume), 1, 0,           0},
    {"catalogfiles",    store_yesno, ITEM(res_pool.catalog_files),   1, ITEM_DEFAULT,  1},
+   {"volumeretention", store_time,  ITEM(res_pool.VolumeRetention), 0, ITEM_DEFAULT, 60*60*24*365},
+   {"autorecycle",     store_yesno, ITEM(res_pool.AutoRecycle), 0, ITEM_DEFAULT, 1},
    {NULL, NULL, NULL, 0, 0, 0} 
 };
 
@@ -249,15 +249,15 @@ struct s_res resources[] = {
  *   level_name      level             level_class
  */
 struct s_jl joblevels[] = {
-   {"full",          L_FULL,            JT_BACKUP},
-   {"incremental",   L_INCREMENTAL,     JT_BACKUP},
-   {"differential",  L_DIFFERENTIAL,    JT_BACKUP},
-   {"level",         L_LEVEL,           JT_BACKUP},
-   {"since",         L_SINCE,           JT_BACKUP},
-   {"catalog",       L_VERIFY_CATALOG,  JT_VERIFY},
-   {"initcatalog",   L_VERIFY_INIT,     JT_VERIFY},
-   {"volume",        L_VERIFY_VOLUME,   JT_VERIFY},
-   {"data",          L_VERIFY_DATA,     JT_VERIFY},
+   {"Full",          L_FULL,            JT_BACKUP},
+   {"Incremental",   L_INCREMENTAL,     JT_BACKUP},
+   {"Differential",  L_DIFFERENTIAL,    JT_BACKUP},
+   {"Level",         L_LEVEL,           JT_BACKUP},
+   {"Since",         L_SINCE,           JT_BACKUP},
+   {"Catalog",       L_VERIFY_CATALOG,  JT_VERIFY},
+   {"Initcatalog",   L_VERIFY_INIT,     JT_VERIFY},
+   {"Volume",        L_VERIFY_VOLUME,   JT_VERIFY},
+   {"Data",          L_VERIFY_DATA,     JT_VERIFY},
    {NULL,           0}
 };
 
@@ -373,8 +373,8 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, char *fmt, ...
       case R_CLIENT:
          sendit(sock, "Client: name=%s address=%s FDport=%d\n",
            res->res_client.hdr.name, res->res_client.address, res->res_client.FDport);
-         sendit(sock, "CatRetPeriod=%d MediaRetPeriod=%d\n",
-           res->res_client.cat_ret_period, res->res_client.media_ret_period);
+         sendit(sock, "JobRetention=%d FileRetention=%d\n",
+           res->res_client.JobRetention, res->res_client.FileRetention);
         if (res->res_client.catalog) {
             sendit(sock, "  --> ");
            dump_resource(-R_CATALOG, (RES *)res->res_client.catalog, sendit, sock);
@@ -749,7 +749,7 @@ static void store_backup(LEX *lc, struct res_items *item, int index, int pass)
          Dmsg1(190, "Got keyword: %s\n", lc->str);
         found = FALSE;
         for (i=0; BakVerFields[i].name; i++) {
-           if (strcmp(lc->str, BakVerFields[i].name) == 0) {
+           if (strcasecmp(lc->str, BakVerFields[i].name) == 0) {
               found = TRUE;
               if (lex_get_token(lc) != T_EQUALS) {
                   scan_err1(lc, "Expected an equals, got: %s", lc->str);
@@ -787,7 +787,7 @@ static void store_backup(LEX *lc, struct res_items *item, int index, int pass)
                     lcase(lc->str);
                     for (i=0; joblevels[i].level_name; i++) {
                        if (joblevels[i].job_class == item->code && 
-                            strcmp(lc->str, joblevels[i].level_name) == 0) {
+                            strcasecmp(lc->str, joblevels[i].level_name) == 0) {
                           ((JOB *)(item->value))->level = joblevels[i].level;
                           i = 0;
                           break;
index 161ac4f6735afe2b1e555c9c942846878e3f545b..f36c24587fa8fd061f50132a4ee78f0a76b47cba 100644 (file)
 /*
  * Resource codes -- they must be sequential for indexing   
  */
-#define R_FIRST                      1001
+#define R_FIRST                       1001
 
-#define R_DIRECTOR                   1001
-#define R_CLIENT                     1002
-#define R_JOB                        1003
-#define R_STORAGE                    1004
-#define R_CATALOG                    1005
-#define R_SCHEDULE                   1006
-#define R_FILESET                    1007
-#define R_GROUP                      1008
-#define R_POOL                       1009
-#define R_MSGS                       1010
+#define R_DIRECTOR                    1001
+#define R_CLIENT                      1002
+#define R_JOB                         1003
+#define R_STORAGE                     1004
+#define R_CATALOG                     1005
+#define R_SCHEDULE                    1006
+#define R_FILESET                     1007
+#define R_GROUP                       1008
+#define R_POOL                        1009
+#define R_MSGS                        1010
 
-#define R_LAST                       R_MSGS
+#define R_LAST                        R_MSGS
 
 /*
  * Some resource attributes
  */
-#define R_NAME                       1020
-#define R_ADDRESS                    1021
-#define R_PASSWORD                   1022
-#define R_TYPE                       1023
-#define R_BACKUP                     1024
+#define R_NAME                        1020
+#define R_ADDRESS                     1021
+#define R_PASSWORD                    1022
+#define R_TYPE                        1023
+#define R_BACKUP                      1024
 
 
 /* Used for certain KeyWord tables */
-struct s_kw {      
+struct s_kw {       
    char *name;
-   int token;  
+   int token;   
 };
 
 /* Job Level keyword structure */
 struct s_jl {
    char *level_name;
-   int level;
-   int job_class;
+   int  level;
+   int  job_class;
 };
 
 
 /* Definition of the contents of each Resource */
 
 /* 
- *   Director Resource 
+ *   Director Resource  
  *
  */
 struct s_res_dir {
-   RES  hdr;
-   int  DIRport;                     /* where we listen -- UA port server port */
-   char *password;                   /* Password for UA access */
-   char *query_file;                 /* SQL query file */
-   char *working_directory;          /* WorkingDirectory */
-   char *pid_directory;              /* PidDirectory */
-   char *subsys_directory;           /* SubsysDirectory */
+   RES   hdr;
+   int   DIRport;                     /* where we listen -- UA port server port */
+   char *password;                    /* Password for UA access */
+   char *query_file;                  /* SQL query file */
+   char *working_directory;           /* WorkingDirectory */
+   char *pid_directory;               /* PidDirectory */
+   char *subsys_directory;            /* SubsysDirectory */
    struct s_res_msgs *messages;
-   int  MaxConcurrentJobs;
-   int  FDConnectTimeout;            /* timeout for connect in seconds */
-   int  SDConnectTimeout;            /* timeout in seconds */
+   int   MaxConcurrentJobs;
+   int   FDConnectTimeout;            /* timeout for connect in seconds */
+   int   SDConnectTimeout;            /* timeout in seconds */
 };
 typedef struct s_res_dir DIRRES;
 
@@ -93,11 +93,11 @@ typedef struct s_res_dir DIRRES;
  *
  */
 struct s_res_client {
-   RES  hdr;
+   RES   hdr;
 
-   int  FDport;                      /* Where File daemon listens */
-   int32_t cat_ret_period;           /* Catalog retention period */
-   int32_t media_ret_period;         /* Media retention period */
+   int   FDport;                      /* Where File daemon listens */
+   uint32_t FileRetention;            /* file retention period in seconds */
+   uint32_t JobRetention;             /* job retention period in seconds */
    char *address;
    char *password;
    struct s_res_cat    *catalog;       /* Catalog resource */
@@ -109,10 +109,10 @@ typedef struct s_res_client CLIENT;
  * 
  */
 struct s_res_store {
-   RES  hdr;
+   RES   hdr;
 
-   int  SDport;                      /* port where Directors connect */
-   int  SDDport;                     /* data port for File daemon */
+   int   SDport;                      /* port where Directors connect */
+   int   SDDport;                     /* data port for File daemon */
    char *address;
    char *password;
    char *media_type;
@@ -125,9 +125,9 @@ typedef struct s_res_store STORE;
  *
  */
 struct s_res_cat {
-   RES  hdr;
+   RES   hdr;
 
-   int  DBport;                      /* Port -- not yet implemented */
+   int   DBport;                      /* Port -- not yet implemented */
    char *address;
    char *db_password;
    char *db_user;
@@ -140,22 +140,22 @@ typedef struct s_res_cat CAT;
  *
  */
 struct s_res_job {
-   RES  hdr;
+   RES   hdr;
 
-   int  JobType;                     /* job type (backup, verify, restore */
-   int  level;                       /* default backup/verify level */
-   int  RestoreJobId;                /* What -- JobId to restore */
-   char *RestoreWhere;               /* Where on disk to restore -- directory */
-   int  RestoreOptions;              /* How (overwrite, ..) */
-   int  MaxRunTime;                  /* max run time in seconds */
-   int  MaxStartDelay;               /* max start delay in seconds */
+   int   JobType;                     /* job type (backup, verify, restore */
+   int   level;                       /* default backup/verify level */
+   int   RestoreJobId;                /* What -- JobId to restore */
+   char *RestoreWhere;                /* Where on disk to restore -- directory */
+   int   RestoreOptions;              /* How (overwrite, ..) */
+   int   MaxRunTime;                  /* max run time in seconds */
+   int   MaxStartDelay;               /* max start delay in seconds */
 
    struct s_res_msgs   *messages;     /* How and where to send messages */
    struct s_res_sch    *schedule;     /* When -- Automatic schedule */
    struct s_res_client *client;       /* Who to backup */
-   struct s_res_fs     *fs;          /* What to backup -- Fileset */
+   struct s_res_fs     *fs;           /* What to backup -- Fileset */
    struct s_res_store  *storage;      /* Where is device -- Storage daemon */
-   struct s_res_pool   *pool;        /* Where is media -- Media Pool */
+   struct s_res_pool   *pool;         /* Where is media -- Media Pool */
 };
 typedef struct s_res_job JOB;
 
@@ -164,7 +164,7 @@ typedef struct s_res_job JOB;
  *
  */
 struct s_res_fs {
-   RES  hdr;
+   RES   hdr;
 
    char **include_array;
    int num_includes;
@@ -172,8 +172,8 @@ struct s_res_fs {
    char **exclude_array;
    int num_excludes;
    int exclude_size;
-   int have_MD5;                     /* set if MD5 initialized */
-   struct MD5Context md5c;           /* MD5 of include/exclude */
+   int have_MD5;                      /* set if MD5 initialized */
+   struct MD5Context md5c;            /* MD5 of include/exclude */
 };
 typedef struct s_res_fs FILESET;
  
@@ -183,7 +183,7 @@ typedef struct s_res_fs FILESET;
  *
  */
 struct s_res_sch {
-   RES  hdr;
+   RES   hdr;
 
    struct s_run *run;
 };
@@ -194,7 +194,7 @@ typedef struct s_res_sch SCHED;
  *
  */
 struct s_res_group {
-   RES  hdr;
+   RES   hdr;
 };
 typedef struct s_res_group GROUP;
 
@@ -203,15 +203,17 @@ typedef struct s_res_group GROUP;
  *
  */
 struct s_res_pool {
-   RES  hdr;
+   RES   hdr;
 
    char *pool_type;
-   char *label_format;               /* Label format string */
-   int  use_catalog;                 /* maintain catalog for media */
-   int  catalog_files;               /* maintain file entries in catalog */
-   int  use_volume_once;             /* write on volume only once */
-   int  accept_any_volume;           /* accept any volume */
-   int  max_volumes;                 /* max number of volumes */
+   char *label_format;                /* Label format string */
+   int   use_catalog;                 /* maintain catalog for media */
+   int   catalog_files;               /* maintain file entries in catalog */
+   int   use_volume_once;             /* write on volume only once */
+   int   accept_any_volume;           /* accept any volume */
+   int   max_volumes;                 /* max number of volumes */
+   uint32_t VolumeRetention;          /* volume retention period in seconds */
+   int   AutoRecycle;                 /* auto recycle */
 };
 typedef struct s_res_pool POOL;
 
@@ -220,16 +222,16 @@ typedef struct s_res_pool POOL;
  * resource structure definitions.
  */
 union u_res {
-   struct s_res_dir    res_dir;
-   struct s_res_client res_client;
-   struct s_res_store  res_store;
-   struct s_res_cat    res_cat;
-   struct s_res_job    res_job;
-   struct s_res_fs     res_fs;
-   struct s_res_sch    res_sch;
-   struct s_res_group  res_group;
-   struct s_res_pool   res_pool;
-   struct s_res_msgs   res_msgs;
+   struct s_res_dir     res_dir;
+   struct s_res_client  res_client;
+   struct s_res_store   res_store;
+   struct s_res_cat     res_cat;
+   struct s_res_job     res_job;
+   struct s_res_fs      res_fs;
+   struct s_res_sch     res_sch;
+   struct s_res_group   res_group;
+   struct s_res_pool    res_pool;
+   struct s_res_msgs    res_msgs;
    RES hdr;
 };
 
@@ -238,14 +240,14 @@ typedef union u_res URES;
 
 /* Run structure contained in Schedule Resource */
 struct s_run {
-   struct s_run *next;               /* points to next run record */
+   struct s_run *next;                /* points to next run record */
    int level;
    int job_class;  
    char *since;
    int level_no;
-   int minute;                       /* minute to run job */
-   time_t last_run;                  /* last time run */
-   time_t next_run;                  /* next time to run */
+   int minute;                        /* minute to run job */
+   time_t last_run;                   /* last time run */
+   time_t next_run;                   /* next time to run */
    char hour[nbytes_for_bits(24)];    /* bit set for each hour */
    char mday[nbytes_for_bits(31)];    /* bit set for each day of month */
    char month[nbytes_for_bits(12)];   /* bit set for each month */
index 791ca47f05b9001838174f5d52237568aec45e64..d14de4a0fee02fa9287f4787abf91f0cc93624fd 100644 (file)
@@ -33,7 +33,6 @@
 extern void run_job(JCR *jcr);
 
 /* Imported variables */
-extern struct s_jl joblevels[];
 extern int r_first;
 extern int r_last;
 extern struct s_res resources[];
index 12aa6f7141c7c5088bd5c75edfea2ae1cb18316a..a466e3e18587c80ace44f419abc6ae57666c6eeb 100644 (file)
@@ -34,7 +34,6 @@
 #include "ua.h"
 
 /* Imported variables */
-extern struct s_jl joblevels[];
 extern int r_first;
 extern int r_last;
 extern struct s_res resources[];
index e77673cfd71a07acfc369eb90cd2c1fef6ffce02..a7a97df109eaf41745904873c8b3cef97eb62675 100644 (file)
@@ -34,7 +34,6 @@
 extern void run_job(JCR *jcr);
 
 /* Imported variables */
-extern struct s_jl joblevels[];
 extern int r_first;
 extern int r_last;
 extern struct s_res resources[];
index 8a5c90b50ac3bde796bfd6695002e9f3ed27c537..a44d73ea0395070bc3bb21d5306d4395698a5589 100644 (file)
@@ -327,16 +327,16 @@ Storage:    %s\n"),
            goto try_again;
         } else if (jcr->JobType == JT_VERIFY) {
             start_prompt(ua, _("Levels:\n"));
-            add_prompt(ua, _("Verify from Catalog"));
             add_prompt(ua, _("Initialize Catalog"));
+            add_prompt(ua, _("Verify from Catalog"));
             add_prompt(ua, _("Verify Volume"));
             add_prompt(ua, _("Verify Volume Data"));
             switch (do_prompt(ua, _("Select level"), NULL)) {
            case 0:
-              jcr->level = L_VERIFY_CATALOG;
+              jcr->level = L_VERIFY_INIT;
               break;
            case 1:
-              jcr->level = L_VERIFY_INIT;
+              jcr->level = L_VERIFY_CATALOG;
               break;
            case 2:
               jcr->level = L_VERIFY_VOLUME;
index d0ac1a4bef65ed86ba8eb1b3a3941d48adc434c3..cb2693cdf61cb7d29d850062b2fb3fdd719715dd 100644 (file)
@@ -260,7 +260,7 @@ int select_pool_dbr(UAContext *ua, POOL_DBR *pr)
       return 0;
    }
    if (num_pools <= 0) {
-      bsendmsg(ua, _("No pools defined.\n"));
+      bsendmsg(ua, _("No pools defined. Use the \"create\" command to create one.\n"));
       return 0;
    }
      
index 57d97e4c6e9fe1ade97d2accf7fc4ab4bc1e0a91..4f216a3299bb371754dac70898f7c9a317cd96e9 100644 (file)
@@ -116,7 +116,9 @@ int do_verify(JCR *jcr)
       return 0;
    }
 
-   jcr->fname = (char *) get_pool_memory(PM_FNAME);
+   if (!jcr->fname) {
+      jcr->fname = (char *) get_pool_memory(PM_FNAME);
+   }
 
    jcr->jr.JobId = last_full_id;      /* save last full id */
 
@@ -336,12 +338,12 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, int last_full_id)
        long file_index, attr_file_index;
        int stream;
        char *attr, *p;
-       char Opts[MAXSTRING];         /* Verify Opts or MD5 signature */
+       char Opts_MD5[MAXSTRING];       /* Verify Opts or MD5 signature */
        int do_MD5;
 
        Dmsg1(50, "Atts+MD5=%s\n", fd->msg);
        if ((len = sscanf(fd->msg, "%ld %d %s %s", &file_index, &stream, 
-            Opts, jcr->fname)) != 4) {
+            Opts_MD5, jcr->fname)) != 4) {
           Jmsg3(jcr, M_FATAL, 0, _("bird<filed: bad attributes, expected 4 fields got %d\n\
 msglen=%d msg=%s\n"), len, fd->msglen, fd->msg);
          jcr->JobStatus = JS_ErrorTerminated;
@@ -380,14 +382,14 @@ msglen=%d msg=%s\n"), len, fd->msglen, fd->msg);
             db_mark_file_record(jcr->db, fdbr.FileId, jcr->JobId);
          }
 
-          Dmsg2(20, "Found %s in catalog. Opts=%s\n", jcr->fname, Opts);
+          Dmsg2(20, "Found %s in catalog. Opts=%s\n", jcr->fname, Opts_MD5);
          decode_stat(fdbr.LStat, &statc); /* decode catalog stat */
          strip_trailing_junk(jcr->fname);
          /*
           * Loop over options supplied by user and verify the
           * fields he requests.
           */
-         for (p=Opts; *p; p++) {
+         for (p=Opts_MD5; *p; p++) {
             switch (*p) {
              case 'i':                /* compare INODEs */
                if (statc.st_ino != statf.st_ino) {
@@ -477,7 +479,7 @@ msglen=%d msg=%s\n"), len, fd->msglen, fd->msg);
          }
        /*
        * Got MD5 Signature from Storage daemon
-       *  It came across in the Opts field.
+       *  It came across in the Opts_MD5 field.
        */
        } else if (stream == STREAM_MD5_SIGNATURE) {
          if (attr_file_index != file_index) {
@@ -485,9 +487,8 @@ msglen=%d msg=%s\n"), len, fd->msglen, fd->msg);
                file_index, attr_file_index);
             jcr->JobStatus = JS_ErrorTerminated;
             return 0;
-         }
-         if (do_MD5) {
-            db_escape_string(buf, Opts, strlen(Opts));
+         } else if (do_MD5) {
+            db_escape_string(buf, Opts_MD5, strlen(Opts_MD5));
             if (strcmp(buf, fdbr.MD5) != 0) {
                /***FIXME**** fname may not be valid */
                prt_fname(jcr);
@@ -509,6 +510,7 @@ msglen=%d msg=%s\n"), len, fd->msglen, fd->msg);
       jcr->JobStatus = JS_ErrorTerminated;
       return 0;
    }
+
    /* Now find all the files that are missing -- i.e. all files in
     *  the database where the FileIndex != current JobId
     */
index 1b38e64888a5aebc9c051195f25d03556c4889a6..33f8cc859791be7ee1294ed0f74bdc820284ba40 100644 (file)
@@ -1,8 +1,8 @@
 /* */
-#define VERSION "1.18"
+#define VERSION "1.19"
 #define VSTRING "1"
-#define DATE    "22 April 2002"
-#define LSMDATE "22Apr02"
+#define DATE    "24 April 2002"
+#define LSMDATE "24Apr02"
 
 /* Debug flags */
 #define DEBUG 1