From d2679a37129fded2cd7e1d0f5c2ea83d56abe28b Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Wed, 24 Apr 2002 07:41:59 +0000 Subject: [PATCH] 1.19 24Apr02 git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@5 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/cats/cats.h | 2 + bacula/src/dird/dird_conf.c | 34 ++++---- bacula/src/dird/dird_conf.h | 156 ++++++++++++++++++----------------- bacula/src/dird/ua_cmds.c | 1 - bacula/src/dird/ua_dotcmds.c | 1 - bacula/src/dird/ua_output.c | 1 - bacula/src/dird/ua_run.c | 6 +- bacula/src/dird/ua_select.c | 2 +- bacula/src/dird/verify.c | 20 +++-- bacula/src/version.h | 6 +- 10 files changed, 116 insertions(+), 113 deletions(-) diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index 55bfe85549..d765ccb8a7 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -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 */ diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index aea47de80e..5d3dc5a8b7 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -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; diff --git a/bacula/src/dird/dird_conf.h b/bacula/src/dird/dird_conf.h index 161ac4f673..f36c24587f 100644 --- a/bacula/src/dird/dird_conf.h +++ b/bacula/src/dird/dird_conf.h @@ -28,63 +28,63 @@ /* * 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 */ diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index 791ca47f05..d14de4a0fe 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -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[]; diff --git a/bacula/src/dird/ua_dotcmds.c b/bacula/src/dird/ua_dotcmds.c index 12aa6f7141..a466e3e185 100644 --- a/bacula/src/dird/ua_dotcmds.c +++ b/bacula/src/dird/ua_dotcmds.c @@ -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[]; diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index e77673cfd7..a7a97df109 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -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[]; diff --git a/bacula/src/dird/ua_run.c b/bacula/src/dird/ua_run.c index 8a5c90b50a..a44d73ea03 100644 --- a/bacula/src/dird/ua_run.c +++ b/bacula/src/dird/ua_run.c @@ -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; diff --git a/bacula/src/dird/ua_select.c b/bacula/src/dird/ua_select.c index d0ac1a4bef..cb2693cdf6 100644 --- a/bacula/src/dird/ua_select.c +++ b/bacula/src/dird/ua_select.c @@ -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; } diff --git a/bacula/src/dird/verify.c b/bacula/src/dird/verify.c index 57d97e4c6e..4f216a3299 100644 --- a/bacula/src/dird/verify.c +++ b/bacula/src/dird/verify.c @@ -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, _("birdmsglen, 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 */ diff --git a/bacula/src/version.h b/bacula/src/version.h index 1b38e64888..33f8cc8597 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -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 -- 2.39.5