X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffiled%2Fstatus.c;h=e29dd5d5e43d8abba97614a1683070e469dca851;hb=f3820aebe94dda85d7130cfca2e75dbaa1f6e7ab;hp=6c2f646cec750709a89ef6d58670fd34552770cc;hpb=9c1bc3d2dc5c2bd684808689f4c2ce815af7901a;p=bacula%2Fbacula diff --git a/bacula/src/filed/status.c b/bacula/src/filed/status.c index 6c2f646cec..e29dd5d5e4 100644 --- a/bacula/src/filed/status.c +++ b/bacula/src/filed/status.c @@ -1,12 +1,12 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2001-2010 Free Software Foundation Europe e.V. + Copyright (C) 2001-2011 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,7 +15,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -38,6 +38,9 @@ extern void *start_heap; +extern bool GetWindowsVersionString(char *buf, int maxsiz); + + /* Forward referenced functions */ static void list_terminated_jobs(STATUS_PKT *sp); static void list_running_jobs(STATUS_PKT *sp); @@ -87,6 +90,11 @@ static void list_status_header(STATUS_PKT *sp) dt, num_jobs_run, job_count()); sendit(msg.c_str(), len, sp); #if defined(HAVE_WIN32) + char buf[300]; + if (GetWindowsVersionString(buf, sizeof(buf))) { + len = Mmsg(msg, "%s\n", buf); + sendit(msg.c_str(), len, sp); + } if (debug_level > 0) { if (!privs) { privs = enable_backup_privileges(NULL, 1); @@ -158,7 +166,7 @@ static void list_status_header(STATUS_PKT *sp) } } -static void list_running_jobs(STATUS_PKT *sp) +static void list_running_jobs_plain(STATUS_PKT *sp) { int sec, bps; POOL_MEM msg(PM_MESSAGE); @@ -171,10 +179,8 @@ static void list_running_jobs(STATUS_PKT *sp) * List running jobs */ Dmsg0(1000, "Begin status jcr loop.\n"); - if (!sp->api) { - len = Mmsg(msg, _("\nRunning Jobs:\n")); - sendit(msg.c_str(), len, sp); - } + len = Mmsg(msg, _("\nRunning Jobs:\n")); + sendit(msg.c_str(), len, sp); const char *vss = ""; #ifdef WIN32_VSS if (g_pVSSClient && g_pVSSClient->IsInitialized()) { @@ -230,15 +236,90 @@ static void list_running_jobs(STATUS_PKT *sp) } endeach_jcr(njcr); - if (!sp->api) { - if (!found) { - len = Mmsg(msg, _("No Jobs running.\n")); + if (!found) { + len = Mmsg(msg, _("No Jobs running.\n")); + sendit(msg.c_str(), len, sp); + } + sendit(_("====\n"), 5, sp); +} + +static void list_running_jobs_api(STATUS_PKT *sp) +{ + int sec, bps; + POOL_MEM msg(PM_MESSAGE); + char b1[32], b2[32], b3[32]; + int len; + bool found = false; + JCR *njcr; + char dt[MAX_TIME_LENGTH]; + /* + * List running jobs for Bat/Bweb (simple to parse) + */ + int vss = 0; +#ifdef WIN32_VSS + if (g_pVSSClient && g_pVSSClient->IsInitialized()) { + vss = 1; + } +#endif + foreach_jcr(njcr) { + bstrutime(dt, sizeof(dt), njcr->start_time); + if (njcr->JobId == 0) { + len = Mmsg(msg, "DirectorConnected=%s\n", dt); + } else { + len = Mmsg(msg, "JobId=%d\n Job=%s\n", + njcr->JobId, njcr->Job); + sendit(msg.c_str(), len, sp); + len = Mmsg(msg," VSS=%d\n Level=%c\n JobType=%c\n JobStarted=%s\n", + vss, njcr->getJobLevel(), + njcr->getJobType(), dt); + } + sendit(msg.c_str(), len, sp); + if (njcr->JobId == 0) { + continue; + } + sec = time(NULL) - njcr->start_time; + if (sec <= 0) { + sec = 1; + } + bps = (int)(njcr->JobBytes / sec); + len = Mmsg(msg, " Files=%s\n Bytes=%s\n Bytes/sec=%s\n Errors=%d\n" + " Bwlimit=%d\n", + edit_uint64(njcr->JobFiles, b1), + edit_uint64(njcr->JobBytes, b2), + edit_uint64(bps, b3), + njcr->JobErrors, njcr->max_bandwidth); + sendit(msg.c_str(), len, sp); + len = Mmsg(msg, " Files Examined=%s\n", + edit_uint64(njcr->num_files_examined, b1)); + sendit(msg.c_str(), len, sp); + if (njcr->JobFiles > 0) { + njcr->lock(); + len = Mmsg(msg, " Processing file=%s\n", njcr->last_fname); + njcr->unlock(); + sendit(msg.c_str(), len, sp); + } + + found = true; + if (njcr->store_bsock) { + len = Mmsg(msg, " SDReadSeqNo=%" lld "\n fd=%d\n", + njcr->store_bsock->read_seqno, njcr->store_bsock->m_fd); + sendit(msg.c_str(), len, sp); + } else { + len = Mmsg(msg, _(" SDSocket=closed\n")); sendit(msg.c_str(), len, sp); } - sendit(_("====\n"), 5, sp); } + endeach_jcr(njcr); } - + +static void list_running_jobs(STATUS_PKT *sp) +{ + if (sp->api) { + list_running_jobs_api(sp); + } else { + list_running_jobs_plain(sp); + } +} static void list_terminated_jobs(STATUS_PKT *sp) {