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 */
{"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}
};
{"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}
};
* 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}
};
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);
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);
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;
/*
* 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;
*
*/
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 */
*
*/
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;
*
*/
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;
*
*/
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;
*
*/
struct s_res_fs {
- RES hdr;
+ RES hdr;
char **include_array;
int num_includes;
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;
*
*/
struct s_res_sch {
- RES hdr;
+ RES hdr;
struct s_run *run;
};
*
*/
struct s_res_group {
- RES hdr;
+ RES hdr;
};
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;
* 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;
};
/* 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 */
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[];
#include "ua.h"
/* Imported variables */
-extern struct s_jl joblevels[];
extern int r_first;
extern int r_last;
extern struct s_res resources[];
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[];
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;
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;
}
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 */
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;
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) {
}
/*
* 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) {
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);
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
*/
/* */
-#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