+/*
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2000-2007 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
+ License as published by the Free Software Foundation plus additions
+ that are listed in the file LICENSE.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ 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
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Bacula® is a registered trademark of John Walker.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
/*
*
* Bacula Director -- backup.c -- responsible for doing backup jobs
*
* Version $Id$
*/
-/*
- Copyright (C) 2000-2006 Kern Sibbald
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as amended with additional clauses defined in the
- file LICENSE in the main source directory.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- the file LICENSE for additional details.
-
- */
#include "bacula.h"
#include "dird.h"
static char OKbackup[] = "2000 OK backup\n";
static char OKstore[] = "2000 OK storage\n";
static char EndJob[] = "2800 End Job TermCode=%d JobFiles=%u "
- "ReadBytes=%lld JobBytes=%lld Errors=%u\n";
-
+ "ReadBytes=%llu JobBytes=%llu Errors=%u "
+ "VSS=%d Encrypt=%d\n";
+/* Pre 1.39.29 (04Dec06) EndJob */
+static char OldEndJob[] = "2800 End Job TermCode=%d JobFiles=%u "
+ "ReadBytes=%llu JobBytes=%llu Errors=%u\n";
/*
* Called here before the job is run to do the job
* specific setup.
bool do_backup_init(JCR *jcr)
{
+ free_rstorage(jcr); /* we don't read so release */
+
if (!get_or_create_fileset_record(jcr)) {
return false;
}
apply_pool_overrides(jcr);
- jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->pool->hdr.name);
+ jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->pool->name());
if (jcr->jr.PoolId == 0) {
return false;
}
/* If pool storage specified, use it instead of job storage */
- copy_storage(jcr, jcr->pool->storage, _("Pool resource"));
+ copy_wstorage(jcr, jcr->pool->storage, _("Pool resource"));
- if (!jcr->storage) {
+ if (!jcr->wstorage) {
Jmsg(jcr, M_FATAL, 0, _("No Storage specification found in Job or Pool.\n"));
return false;
}
/*
* Now start a job with the Storage daemon
*/
- if (!start_storage_daemon_job(jcr, NULL, jcr->storage)) {
+ if (!start_storage_daemon_job(jcr, NULL, jcr->wstorage)) {
return false;
}
/*
* send Storage daemon address to the File daemon
*/
- store = jcr->store;
+ store = jcr->wstore;
if (store->SDDport == 0) {
store->SDDport = store->SDport;
}
goto bail_out;
}
-
if (!send_runscripts_commands(jcr)) {
goto bail_out;
}
/* Pickup Job termination data */
stat = wait_for_job_termination(jcr);
+ db_write_batch_file_records(jcr); /* used by bulk batch file insert */
if (stat == JS_Terminated) {
backup_cleanup(jcr, stat);
return true;
BSOCK *fd = jcr->file_bsock;
bool fd_ok = false;
uint32_t JobFiles, Errors;
- uint64_t ReadBytes, JobBytes;
+ uint64_t ReadBytes = 0;
+ uint64_t JobBytes = 0;
+ int VSS = 0;
+ int Encrypt = 0;
set_jcr_job_status(jcr, JS_Running);
/* Wait for Client to terminate */
while ((n = bget_dirmsg(fd)) >= 0) {
- if (!fd_ok && sscanf(fd->msg, EndJob, &jcr->FDJobStatus, &JobFiles,
- &ReadBytes, &JobBytes, &Errors) == 5) {
+ if (!fd_ok &&
+ (sscanf(fd->msg, EndJob, &jcr->FDJobStatus, &JobFiles,
+ &ReadBytes, &JobBytes, &Errors, &VSS, &Encrypt) == 7 ||
+ sscanf(fd->msg, OldEndJob, &jcr->FDJobStatus, &JobFiles,
+ &ReadBytes, &JobBytes, &Errors) == 5)) {
fd_ok = true;
set_jcr_job_status(jcr, jcr->FDJobStatus);
Dmsg1(100, "FDStatus=%c\n", (char)jcr->JobStatus);
break;
}
}
+
if (is_bnet_error(fd)) {
Jmsg(jcr, M_FATAL, 0, _("Network error with FD during %s: ERR=%s\n"),
job_type_to_str(jcr->JobType), bnet_strerror(fd));
jcr->Errors = Errors;
jcr->ReadBytes = ReadBytes;
jcr->JobBytes = JobBytes;
+ jcr->VSS = VSS;
+ jcr->Encrypt = Encrypt;
} else {
Jmsg(jcr, M_FATAL, 0, _("No Job status returned from FD.\n"));
}
char ec6[30], ec7[30], ec8[30], elapsed[50];
char term_code[100], fd_term_msg[100], sd_term_msg[100];
const char *term_msg;
- int msg_type;
+ int msg_type = M_INFO;
MEDIA_DBR mr;
CLIENT_DBR cr;
double kbps, compression;
utime_t RunTime;
Dmsg2(100, "Enter backup_cleanup %d %c\n", TermCode, TermCode);
- dequeue_messages(jcr); /* display any queued messages */
memset(&mr, 0, sizeof(mr));
memset(&cr, 0, sizeof(cr));
- set_jcr_job_status(jcr, TermCode);
- update_job_end_record(jcr); /* update database */
+ update_job_end(jcr, TermCode);
if (!db_get_job_record(jcr, jcr->db, &jcr->jr)) {
Jmsg(jcr, M_WARNING, 0, _("Error getting job record for stats: %s"),
update_bootstrap_file(jcr);
- msg_type = M_INFO; /* by default INFO message */
switch (jcr->JobStatus) {
case JS_Terminated:
if (jcr->Errors || jcr->SDErrors) {
// bmicrosleep(15, 0); /* for debugging SIGHUP */
- Jmsg(jcr, msg_type, 0, _("Bacula %s (%s): %s\n"
+ Jmsg(jcr, msg_type, 0, _("Bacula %s Version: %s (%s) %s %s %s at %s\n"
" JobId: %d\n"
" Job: %s\n"
" Backup Level: %s%s\n"
" SD Bytes Written: %s (%sB)\n"
" Rate: %.1f KB/s\n"
" Software Compression: %s\n"
+" VSS: %s\n"
+" Encryption: %s\n"
" Volume name(s): %s\n"
" Volume Session Id: %d\n"
" Volume Session Time: %d\n"
" FD termination status: %s\n"
" SD termination status: %s\n"
" Termination: %s\n\n"),
- VERSION,
- LSMDATE,
+ my_name, VERSION, BDATE, HOST_OS, DISTNAME, DISTVER,
edt,
jcr->jr.JobId,
jcr->jr.Job,
level_to_str(jcr->JobLevel), jcr->since,
- jcr->client->hdr.name, cr.Uname,
- jcr->fileset->hdr.name, jcr->FSCreateTime,
- jcr->pool->hdr.name, jcr->pool_source,
- jcr->store->hdr.name, jcr->storage_source,
+ jcr->client->name(), cr.Uname,
+ jcr->fileset->name(), jcr->FSCreateTime,
+ jcr->pool->name(), jcr->pool_source,
+ jcr->wstore->name(), jcr->wstore_source,
schedt,
sdt,
edt,
edit_uint64_with_suffix(jcr->SDJobBytes, ec6),
(float)kbps,
compress,
+ jcr->VSS?"yes":"no",
+ jcr->Encrypt?"yes":"no",
jcr->VolumeName,
jcr->VolSessionId,
jcr->VolSessionTime,
FILE *fd;
BPIPE *bpipe = NULL;
int got_pipe = 0;
- char *fname = jcr->job->WriteBootstrap;
+ POOLMEM *fname = get_pool_memory(PM_FNAME);
+ fname = edit_job_codes(jcr, fname, jcr->job->WriteBootstrap, "");
+
VOL_PARAMS *VolParams = NULL;
int VolCount;
char edt[50];
if (*fname == '|') {
- fname++;
got_pipe = 1;
- bpipe = open_bpipe(fname, 0, "w");
+ bpipe = open_bpipe(fname+1, 0, "w"); /* skip first char "|" */
fd = bpipe ? bpipe->wfd : NULL;
} else {
/* ***FIXME*** handle BASE */
- fd = fopen(fname, jcr->JobLevel==L_FULL?"w+":"a+");
+ fd = fopen(fname, jcr->JobLevel==L_FULL?"w+b":"a+b");
}
if (fd) {
VolCount = db_get_job_volume_parameters(jcr, jcr->db, jcr->JobId,
"%s: ERR=%s\n"), fname, be.strerror());
set_jcr_job_status(jcr, JS_ErrorTerminated);
}
+ free_pool_memory(fname);
}
}