/* Forward referenced subroutines */
-static void store_backup(LEX *lc, struct res_items *item, int index, int pass);
-static void store_restore(LEX *lc, struct res_items *item, int index, int pass);
static void store_jobtype(LEX *lc, struct res_items *item, int index, int pass);
static void store_level(LEX *lc, struct res_items *item, int index, int pass);
static void store_replace(LEX *lc, struct res_items *item, int index, int pass);
* name handler value code flags default_value
*/
static struct res_items job_items[] = {
- {"name", store_name, ITEM(res_job.hdr.name), 0, ITEM_REQUIRED, 0},
- {"description", store_str, ITEM(res_job.hdr.desc), 0, 0, 0},
- {"backup", store_backup, ITEM(res_job), JT_BACKUP, 0, 0},
- {"verify", store_backup, ITEM(res_job), JT_VERIFY, 0, 0},
- {"restore", store_restore, ITEM(res_job), JT_RESTORE, 0, 0},
- {"schedule", store_res, ITEM(res_job.schedule), R_SCHEDULE, 0, 0},
- {"type", store_jobtype, ITEM(res_job), 0, 0, 0},
- {"level", store_level, ITEM(res_job), 0, 0, 0},
- {"messages", store_res, ITEM(res_job.messages), R_MSGS, 0, 0},
- {"storage", store_res, ITEM(res_job.storage), R_STORAGE, 0, 0},
- {"pool", store_res, ITEM(res_job.pool), R_POOL, 0, 0},
- {"client", store_res, ITEM(res_job.client), R_CLIENT, 0, 0},
- {"fileset", store_res, ITEM(res_job.fileset), R_FILESET, 0, 0},
- {"jobdefs", store_defs, ITEM(res_job), R_JOB, 0, 0},
- {"verifyjob", store_res, ITEM(res_job.verify_job), R_JOB, 0, 0},
- {"where", store_dir, ITEM(res_job.RestoreWhere), 0, 0, 0},
- {"replace", store_replace, ITEM(res_job.replace), 0, ITEM_DEFAULT, REPLACE_ALWAYS},
- {"bootstrap",store_dir, ITEM(res_job.RestoreBootstrap), 0, 0, 0},
- {"maxruntime", store_time, ITEM(res_job.MaxRunTime), 0, 0, 0},
- {"maxwaittime", store_time, ITEM(res_job.MaxWaitTime), 0, 0, 0},
- {"maxstartdelay", store_time,ITEM(res_job.MaxStartDelay), 0, 0, 0},
+ {"name", store_name, ITEM(res_job.hdr.name), 0, ITEM_REQUIRED, 0},
+ {"description", store_str, ITEM(res_job.hdr.desc), 0, 0, 0},
+ {"type", store_jobtype, ITEM(res_job), 0, 0, 0},
+ {"level", store_level, ITEM(res_job), 0, 0, 0},
+ {"messages", store_res, ITEM(res_job.messages), R_MSGS, 0, 0},
+ {"storage", store_res, ITEM(res_job.storage), R_STORAGE, 0, 0},
+ {"pool", store_res, ITEM(res_job.pool), R_POOL, 0, 0},
+ {"client", store_res, ITEM(res_job.client), R_CLIENT, 0, 0},
+ {"fileset", store_res, ITEM(res_job.fileset), R_FILESET, 0, 0},
+ {"schedule", store_res, ITEM(res_job.schedule), R_SCHEDULE, 0, 0},
+ {"verifyjob", store_res, ITEM(res_job.verify_job), R_JOB, 0, 0},
+ {"jobdefs", store_res, ITEM(res_job.jobdefs), R_JOBDEFS, 0, 0},
+ {"where", store_dir, ITEM(res_job.RestoreWhere), 0, 0, 0},
+ {"bootstrap",store_dir, ITEM(res_job.RestoreBootstrap), 0, 0, 0},
+ {"writebootstrap",store_dir, ITEM(res_job.WriteBootstrap), 0, 0, 0},
+ {"replace", store_replace, ITEM(res_job.replace), 0, ITEM_DEFAULT, REPLACE_ALWAYS},
+ {"maxruntime", store_time, ITEM(res_job.MaxRunTime), 0, 0, 0},
+ {"maxwaittime", store_time, ITEM(res_job.MaxWaitTime), 0, 0, 0},
+ {"maxstartdelay",store_time, ITEM(res_job.MaxStartDelay), 0, 0, 0},
+ {"jobretention", store_time, ITEM(res_job.JobRetention), 0, 0, 0},
{"prefixlinks", store_yesno, ITEM(res_job.PrefixLinks), 1, ITEM_DEFAULT, 0},
{"prunejobs", store_yesno, ITEM(res_job.PruneJobs), 1, ITEM_DEFAULT, 0},
{"prunefiles", store_yesno, ITEM(res_job.PruneFiles), 1, ITEM_DEFAULT, 0},
- {"prunevolumes", store_yesno, ITEM(res_job.PruneVolumes), 1, ITEM_DEFAULT, 0},
+ {"prunevolumes",store_yesno, ITEM(res_job.PruneVolumes), 1, ITEM_DEFAULT, 0},
+ {"spoolattributes",store_yesno, ITEM(res_job.SpoolAttributes), 1, ITEM_DEFAULT, 0},
{"runbeforejob", store_str, ITEM(res_job.RunBeforeJob), 0, 0, 0},
{"runafterjob", store_str, ITEM(res_job.RunAfterJob), 0, 0, 0},
{"runafterfailedjob", store_str, ITEM(res_job.RunAfterFailedJob), 0, 0, 0},
{"clientrunbeforejob", store_str, ITEM(res_job.ClientRunBeforeJob), 0, 0, 0},
{"clientrunafterjob", store_str, ITEM(res_job.ClientRunAfterJob), 0, 0, 0},
- {"spoolattributes", store_yesno, ITEM(res_job.SpoolAttributes), 1, ITEM_DEFAULT, 0},
- {"writebootstrap", store_dir, ITEM(res_job.WriteBootstrap), 0, 0, 0},
{"maximumconcurrentjobs", store_pint, ITEM(res_job.MaxConcurrentJobs), 0, ITEM_DEFAULT, 1},
{"rescheduleonerror", store_yesno, ITEM(res_job.RescheduleOnError), 1, ITEM_DEFAULT, 0},
{"rescheduleinterval", store_time, ITEM(res_job.RescheduleInterval), 0, ITEM_DEFAULT, 60 * 30},
{"rescheduletimes", store_pint, ITEM(res_job.RescheduleTimes), 0, 0, 0},
{"priority", store_pint, ITEM(res_job.Priority), 0, ITEM_DEFAULT, 10},
- {"jobretention", store_time, ITEM(res_job.JobRetention), 0, 0, 0},
{NULL, NULL, NULL, 0, 0, 0}
};
{"director", dir_items, R_DIRECTOR, NULL},
{"client", cli_items, R_CLIENT, NULL},
{"job", job_items, R_JOB, NULL},
- {"jobdefs", job_items, R_JOBDEFS, NULL},
{"storage", store_items, R_STORAGE, NULL},
{"catalog", cat_items, R_CATALOG, NULL},
{"schedule", sch_items, R_SCHEDULE, NULL},
{"messages", msgs_items, R_MSGS, NULL},
{"counter", counter_items, R_COUNTER, NULL},
{"console", con_items, R_CONSOLE, NULL},
+ {"jobdefs", job_items, R_JOBDEFS, NULL},
{NULL, NULL, 0, NULL}
};
{NULL, 0}
};
+#ifdef old_deprecated_code
/* Keywords (RHS) permitted in Backup and Verify records */
static struct s_kw BakVerFields[] = {
{"bootstrap", 'B'}, /* bootstrap file */
{NULL, 0}
};
+#endif
/* Options permitted in Restore replace= */
struct s_kw ReplaceOptions[] = {
}
/*
- * Free memory of resource.
+ * Free memory of resource -- called when daemon terminates.
* NB, we don't need to worry about freeing any references
* to other resources as they will be freed when that
* resource chain is traversed. Mainly we worry about freeing
int i, size;
int error = 0;
+ if (type == R_JOBDEFS) {
+ return; /* nothing required */
+ }
/*
* Ensure that all required items are present
*/
}
}
- /* During pass 2 in each "store" routine, we looked up pointers
+ /*
+ * During pass 2 in each "store" routine, we looked up pointers
* to all the resources referrenced in the current resource, now we
* must copy their addresses from the static record to the allocated
* record.
res->res_dir.messages = res_all.res_dir.messages;
break;
case R_JOB:
+ case R_JOBDEFS:
if ((res = (URES *)GetResWithName(type, res_all.res_dir.hdr.name)) == NULL) {
Emsg1(M_ERROR_TERM, 0, "Cannot find Job resource %s\n",
res_all.res_dir.hdr.name);
res->res_job.storage = res_all.res_job.storage;
res->res_job.pool = res_all.res_job.pool;
res->res_job.verify_job = res_all.res_job.verify_job;
- if (res->res_job.JobType == 0) {
- Emsg1(M_ERROR_TERM, 0, "Job Type not defined for Job resource %s\n", res_all.res_dir.hdr.name);
- }
- if (res->res_job.level != 0) {
- int i;
- for (i=0; joblevels[i].level_name; i++) {
- if (joblevels[i].level == res->res_job.level &&
- joblevels[i].job_type == res->res_job.JobType) {
- i = 0;
- break;
- }
+ res->res_job.jobdefs = res_all.res_job.jobdefs;
+ if (type == R_JOB) {
+ if (res->res_job.JobType == 0) {
+ Emsg1(M_ERROR_TERM, 0, "Job Type not defined for Job resource %s\n", res_all.res_dir.hdr.name);
}
- if (i != 0) {
- Emsg1(M_ERROR_TERM, 0, "Inappropriate level specified in Job resource %s\n",
- res_all.res_dir.hdr.name);
+ if (res->res_job.level != 0) {
+ int i;
+ for (i=0; joblevels[i].level_name; i++) {
+ if (joblevels[i].level == res->res_job.level &&
+ joblevels[i].job_type == res->res_job.JobType) {
+ i = 0;
+ break;
+ }
+ }
+ if (i != 0) {
+ Emsg1(M_ERROR_TERM, 0, "Inappropriate level specified in Job resource %s\n",
+ res_all.res_dir.hdr.name);
+ }
}
}
break;
res->res_client.catalog = res_all.res_client.catalog;
break;
case R_SCHEDULE:
- /* Schedule is a bit different in that it contains a RUN record
+ /*
+ * Schedule is a bit different in that it contains a RUN record
* chain which isn't a "named" resource. This chain was linked
* in by run_conf.c during pass 2, so here we jam the pointer
* into the Schedule resource.
}
/* Common */
if (!error) {
+ if (type == R_JOBDEFS) {
+ Dmsg0(200, "Storing JobDefs definition.\n");
+ }
res = (URES *)malloc(size);
memcpy(res, &res_all, size);
if (!resources[rindex].res_head) {
set_bit(index, res_all.hdr.item_present);
}
+#ifdef old_deprecated_code
/*
* Store backup/verify info for Job record
*
lc->options = options; /* reset original options */
set_bit(index, res_all.hdr.item_present);
}
+#endif
{
STORE *store, **unique_store;
CLIENT *client, **unique_client;
- int i, j, found;
+ int i, j;
+ bool found;
do_director_status(ua, cmd);
/* Count Storage items */
LockRes();
- store = NULL;
- for (i=0; (store = (STORE *)GetNextRes(R_STORAGE, (RES *)store)); i++)
- { }
+ i = 0;
+ foreach_res(store, R_STORAGE) {
+ i++;
+ }
unique_store = (STORE **) malloc(i * sizeof(STORE));
/* Find Unique Storage address/port */
- store = (STORE *)GetNextRes(R_STORAGE, NULL);
i = 0;
- unique_store[i++] = store;
- while ((store = (STORE *)GetNextRes(R_STORAGE, (RES *)store))) {
- found = 0;
+ foreach_res(store, R_STORAGE) {
+ found = false;
for (j=0; j<i; j++) {
if (strcmp(unique_store[j]->address, store->address) == 0 &&
unique_store[j]->SDport == store->SDport) {
- found = 1;
+ found = true;
break;
}
}
/* Count Client items */
LockRes();
- client = NULL;
- for (i=0; (client = (CLIENT *)GetNextRes(R_CLIENT, (RES *)client)); i++)
- { }
+ i = 0;
+ foreach_res(client, R_CLIENT) {
+ i++;
+ }
unique_client = (CLIENT **)malloc(i * sizeof(CLIENT));
/* Find Unique Client address/port */
- client = (CLIENT *)GetNextRes(R_CLIENT, NULL);
i = 0;
- unique_client[i++] = client;
- while ((client = (CLIENT *)GetNextRes(R_CLIENT, (RES *)client))) {
- found = 0;
+ foreach_res(client, R_CLIENT) {
+ found = false;
for (j=0; j<i; j++) {
if (strcmp(unique_client[j]->address, client->address) == 0 &&
unique_client[j]->FDport == client->FDport) {
- found = 1;
+ found = true;
break;
}
}
bsendmsg(ua, "%s Version: " VERSION " (" BDATE ") %s %s %s\n", my_name,
HOST_OS, DISTNAME, DISTVER);
- bstrftime(dt, sizeof(dt), daemon_start_time);
- strcpy(dt+7, dt+9); /* cut century */
+ bstrftime_nc(dt, sizeof(dt), daemon_start_time);
bsendmsg(ua, _("Daemon started %s, %d Job%s run.\n"), dt, last_job.NumJobs,
last_job.NumJobs == 1 ? "" : "s");
/*
bstrncpy(mr.VolumeName, "*unknown*", sizeof(mr.VolumeName));
}
}
- bstrftime(dt, sizeof(dt), runtime);
- strcpy(dt+7, dt+9); /* cut century */
+ bstrftime_nc(dt, sizeof(dt), runtime);
switch (job->JobType) {
case JT_ADMIN:
case JT_RESTORE:
/* Loop through all jobs */
LockRes();
- for (job=NULL; (job=(JOB *)GetNextRes(R_JOB, (RES *)job)); ) {
+ foreach_res(job, R_JOB) {
for (run=NULL; (run = find_next_run(run, job, runtime)); ) {
level = job->level;
if (run->level) {
* jobs in the status output.
*/
if (jcr->JobType == JT_CONSOLE) {
- bstrftime(dt, sizeof(dt), jcr->start_time);
- strcpy(dt+7, dt+9); /* cut century */
+ bstrftime_nc(dt, sizeof(dt), jcr->start_time);
bsendmsg(ua, _("Console connected at %s\n"), dt);
}
njobs--;
char JobName[MAX_NAME_LENGTH];
char *termstat;
- bstrftime(dt, sizeof(dt), je->end_time);
- strcpy(dt+7, dt+9); /* cut century */
+ bstrftime_nc(dt, sizeof(dt), je->end_time);
switch (je->JobType) {
case JT_ADMIN:
case JT_RESTORE: