*/
/*
- Copyright (C) 2000-2004 Kern Sibbald and John Walker
+ Copyright (C) 2000-2005 Kern Sibbald
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
extern char my_name[];
extern time_t daemon_start_time;
extern int num_jobs_run;
-#ifdef SMARTALLOC
-extern uint64_t sm_max_bytes;
-extern uint64_t sm_bytes;
-extern uint32_t sm_max_buffers;
-extern uint32_t sm_buffers;
-#endif
static void list_scheduled_jobs(UAContext *ua);
static void list_running_jobs(UAContext *ua);
static void do_director_status(UAContext *ua);
static void do_all_status(UAContext *ua);
+static char OKqstatus[] = "1000 OK .status\n";
+static char DotStatusJob[] = "JobId=%d JobStatus=%c JobErrors=%d\n";
+
+/*
+ * .status command
+ */
+int qstatus_cmd(UAContext *ua, const char *cmd)
+{
+ JCR* njcr;
+ s_last_job* job;
+
+ if (!open_db(ua)) {
+ return 1;
+ }
+ Dmsg1(20, "status:%s:\n", cmd);
+
+ if ((ua->argc != 3) || (strcasecmp(ua->argk[1], "dir"))) {
+ bsendmsg(ua, "1900 Bad .status command, missing arguments.\n");
+ return 1;
+ }
+
+ if (strcasecmp(ua->argk[2], "current") == 0) {
+ bsendmsg(ua, OKqstatus, ua->argk[2]);
+ lock_jcr_chain();
+ foreach_jcr(njcr) {
+ if (njcr->JobId != 0) {
+ bsendmsg(ua, DotStatusJob, njcr->JobId, njcr->JobStatus, njcr->JobErrors);
+ }
+ free_locked_jcr(njcr);
+ }
+ unlock_jcr_chain();
+ }
+ else if (strcasecmp(ua->argk[2], "last") == 0) {
+ bsendmsg(ua, OKqstatus, ua->argk[2]);
+ if ((last_jobs) && (last_jobs->size() > 0)) {
+ job = (s_last_job*)last_jobs->last();
+ bsendmsg(ua, DotStatusJob, job->JobId, job->JobStatus, job->Errors);
+ }
+ }
+ else {
+ bsendmsg(ua, "1900 Bad .status command, wrong argument.\n");
+ return 1;
+ }
+
+ return 1;
+}
+
/*
* status command
*/
}
}
/* If no args, ask for status type */
- if (ua->argc == 1) {
- char prmt[MAX_NAME_LENGTH];
-
+ if (ua->argc == 1) {
+ char prmt[MAX_NAME_LENGTH];
+
start_prompt(ua, _("Status available for:\n"));
add_prompt(ua, _("Director"));
add_prompt(ua, _("Storage"));
return 1;
}
Dmsg1(20, "item=%d\n", item);
- switch (item) {
+ switch (item) {
case 0: /* Director */
do_director_status(ua);
break;
i++;
}
unique_store = (STORE **) malloc(i * sizeof(STORE));
- /* Find Unique Storage address/port */
+ /* Find Unique Storage address/port */
i = 0;
foreach_res(store, R_STORAGE) {
found = false;
i++;
}
unique_client = (CLIENT **)malloc(i * sizeof(CLIENT));
- /* Find Unique Client address/port */
+ /* Find Unique Client address/port */
i = 0;
foreach_res(client, R_CLIENT) {
found = false;
do_client_status(ua, unique_client[j]);
}
free(unique_client);
-
+
}
static void do_director_status(UAContext *ua)
bsendmsg(ua, "%s Version: " VERSION " (" BDATE ") %s %s %s\n", my_name,
HOST_OS, DISTNAME, DISTVER);
bstrftime_nc(dt, sizeof(dt), daemon_start_time);
- bsendmsg(ua, _("Daemon started %s, %d Job%s run since started.\n"),
+ bsendmsg(ua, _("Daemon started %s, %d Job%s run since started.\n"),
dt, num_jobs_run, num_jobs_run == 1 ? "" : "s");
-#ifdef SMARTALLOC
if (debug_level > 0) {
char b1[35], b2[35], b3[35], b4[35];
bsendmsg(ua, _(" Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
edit_uint64_with_commas(sm_max_bytes, b2),
edit_uint64_with_commas(sm_buffers, b3),
edit_uint64_with_commas(sm_max_buffers, b4));
- }
-#endif
+ }
/*
* List scheduled Jobs
*/
list_scheduled_jobs(ua);
- /*
+ /*
* List running jobs
*/
list_running_jobs(ua);
- /*
+ /*
* List terminated jobs
*/
list_terminated_jobs(ua);
{
BSOCK *sd;
- ua->jcr->store = store;
+ set_storage(ua->jcr, store);
/* Try connecting for up to 15 seconds */
- bsendmsg(ua, _("Connecting to Storage daemon %s at %s:%d\n"),
+ bsendmsg(ua, _("Connecting to Storage daemon %s at %s:%d\n"),
store->hdr.name, store->address, store->SDport);
if (!connect_to_storage_daemon(ua->jcr, 1, 15, 0)) {
bsendmsg(ua, _("\nFailed to connect to Storage daemon %s.\n====\n"),
if (ua->jcr->store_bsock) {
bnet_close(ua->jcr->store_bsock);
ua->jcr->store_bsock = NULL;
- }
+ }
return;
}
Dmsg0(20, _("Connected to storage daemon\n"));
bnet_sig(sd, BNET_TERMINATE);
bnet_close(sd);
ua->jcr->store_bsock = NULL;
- return;
+ return;
}
-
+
static void do_client_status(UAContext *ua, CLIENT *client)
{
BSOCK *fd;
ua->jcr->sd_auth_key = bstrdup("dummy");
/* Try to connect for 15 seconds */
- bsendmsg(ua, _("Connecting to Client %s at %s:%d\n"),
+ bsendmsg(ua, _("Connecting to Client %s at %s:%d\n"),
client->hdr.name, client->address, client->FDport);
if (!connect_to_file_daemon(ua->jcr, 1, 15, 0)) {
bsendmsg(ua, _("Failed to connect to Client %s.\n====\n"),
if (ua->jcr->file_bsock) {
bnet_close(ua->jcr->file_bsock);
ua->jcr->file_bsock = NULL;
- }
+ }
return;
}
Dmsg0(20, _("Connected to file daemon\n"));
bnet_close(fd);
ua->jcr->file_bsock = NULL;
- return;
+ return;
}
static void prt_runhdr(UAContext *ua)
static void prt_runtime(UAContext *ua, sched_pkt *sp)
{
- char dt[MAX_TIME_LENGTH];
+ char dt[MAX_TIME_LENGTH];
const char *level_ptr;
bool ok = false;
bool close_db = false;
JCR *jcr = ua->jcr;
MEDIA_DBR mr;
+
memset(&mr, 0, sizeof(mr));
if (sp->job->JobType == JT_BACKUP) {
jcr->db = NULL;
close_db = true; /* new db opened, remember to close it */
}
if (ok) {
+ mr.PoolId = jcr->PoolId;
ok = find_next_volume_for_append(jcr, &mr, 0);
}
if (!ok) {
level_ptr = level_to_str(sp->level);
break;
}
- bsendmsg(ua, _("%-14s %-8s %3d %-18s %-18s %s\n"),
- level_ptr, job_type_to_str(sp->job->JobType), sp->priority, dt,
+ bsendmsg(ua, _("%-14s %-8s %3d %-18s %-18s %s\n"),
+ level_ptr, job_type_to_str(sp->job->JobType), sp->priority, dt,
sp->job->hdr.name, mr.VolumeName);
if (close_db) {
db_close_database(jcr, jcr->db);
return -1;
} else if (p1->runtime > p2->runtime) {
return 1;
- }
+ }
if (p1->priority < p2->priority) {
return -1;
} else if (p1->priority > p2->priority) {
return 0;
}
-/*
+/*
* Find all jobs to be run in roughly the
* next 24 hours.
*/
continue;
}
for (run=NULL; (run = find_next_run(run, job, runtime)); ) {
- level = job->level;
+ level = job->JobLevel;
if (run->level) {
level = run->level;
}
- priority = job->Priority;
+ priority = job->Priority;
if (run->Priority) {
priority = run->Priority;
}
}
if (num_jobs == 0) {
bsendmsg(ua, _("No Scheduled Jobs.\n"));
- }
+ }
bsendmsg(ua, "====\n");
Dmsg0(200, "Leave list_sched_jobs_runs()\n");
}
break;
case JS_WaitFD:
emsg = (char *) get_pool_memory(PM_FNAME);
- Mmsg(&emsg, _("is waiting on Client %s"), jcr->client->hdr.name);
+ Mmsg(emsg, _("is waiting on Client %s"), jcr->client->hdr.name);
pool_mem = true;
msg = emsg;
break;
case JS_WaitSD:
emsg = (char *) get_pool_memory(PM_FNAME);
- Mmsg(&emsg, _("is waiting on Storage %s"), jcr->store->hdr.name);
+ Mmsg(emsg, _("is waiting on Storage %s"), jcr->store->hdr.name);
pool_mem = true;
msg = emsg;
break;
default:
emsg = (char *) get_pool_memory(PM_FNAME);
- Mmsg(&emsg, _("is in unknown state %c"), jcr->JobStatus);
+ Mmsg(emsg, _("is in unknown state %c"), jcr->JobStatus);
pool_mem = true;
msg = emsg;
break;
}
- /*
- * Now report Storage daemon status code
+ /*
+ * Now report Storage daemon status code
*/
switch (jcr->SDJobStatus) {
case JS_WaitMount:
emsg = (char *) get_pool_memory(PM_FNAME);
pool_mem = true;
}
- Mmsg(&emsg, _("is waiting for Client %s to connect to Storage %s"),
+ Mmsg(emsg, _("is waiting for Client %s to connect to Storage %s"),
jcr->client->hdr.name, jcr->store->hdr.name);
msg = emsg;
break;
break;
}
- bsendmsg(ua, _("%6d %-6s %-20s %s\n"),
+ bsendmsg(ua, _("%6d %-6s %-20s %s\n"),
jcr->JobId,
- level,
+ level,
jcr->Job,
msg);
char JobName[MAX_NAME_LENGTH];
const char *termstat;
+ bstrncpy(JobName, je->Job, sizeof(JobName));
+ /* There are three periods after the Job name */
+ char *p;
+ for (int i=0; i<3; i++) {
+ if ((p=strrchr(JobName, '.')) != NULL) {
+ *p = 0;
+ }
+ }
+
+ if (!acl_access_ok(ua, Job_ACL, JobName)) {
+ continue;
+ }
+
bstrftime_nc(dt, sizeof(dt), je->end_time);
switch (je->JobType) {
case JT_ADMIN:
termstat = "Other";
break;
}
- bstrncpy(JobName, je->Job, sizeof(JobName));
- /* There are three periods after the Job name */
- char *p;
- for (int i=0; i<3; i++) {
- if ((p=strrchr(JobName, '.')) != NULL) {
- *p = 0;
- }
- }
- bsendmsg(ua, _("%6d %-6s %8s %14s %-7s %-8s %s\n"),
+ bsendmsg(ua, _("%6d %-6s %8s %14s %-7s %-8s %s\n"),
je->JobId,
- level,
+ level,
edit_uint64_with_commas(je->JobFiles, b1),
- edit_uint64_with_commas(je->JobBytes, b2),
+ edit_uint64_with_commas(je->JobBytes, b2),
termstat,
dt, JobName);
}