#include "bacula.h"
#include "filed.h"
+#include "host.h"
extern char my_name[];
extern CLIENT *me; /* our client resource */
static int restore_cmd(JCR *jcr);
static int storage_cmd(JCR *jcr);
static int session_cmd(JCR *jcr);
-static int response(BSOCK *sd, char *resp, char *cmd);
+static int response(JCR *jcr, BSOCK *sd, char *resp, char *cmd);
static void filed_free_jcr(JCR *jcr);
static int open_sd_read_session(JCR *jcr);
static int send_bootstrap_file(JCR *jcr);
static char jobcmd[] = "JobId=%d Job=%127s SDid=%d SDtime=%d Authorization=%100s";
static char storaddr[] = "storage address=%s port=%d\n";
static char sessioncmd[] = "session %s %ld %ld %ld %ld %ld %ld\n";
-static char restorecmd[] = "restore where=%s\n";
+static char restorecmd[] = "restore replace=%c where=%s\n";
static char verifycmd[] = "verify level=%20s\n";
/* Responses sent to Director */
static char OKrestore[] = "2000 OK restore\n";
static char OKsession[] = "2000 OK session\n";
static char OKstore[] = "2000 OK storage\n";
-static char OKjob[] = "2000 OK Job\n";
+static char OKjob[] = "2000 OK Job " FDHOST "," DISTNAME "," DISTVER;
static char OKsetdebug[] = "2000 OK setdebug=%d\n";
static char BADjob[] = "2901 Bad Job\n";
+static char EndRestore[] = "2800 End Job TermCode=%d JobFiles=%u JobBytes=%" lld "\n";
+static char EndBackup[] = "2801 End Backup Job TermCode=%d JobFiles=%u ReadBytes=%" lld " JobBytes=%" lld "\n";
/* Responses received from Storage Daemon */
static char OK_end[] = "3000 OK end\n";
+static char OK_close[] = "3000 OK close Status = %d\n";
static char OK_open[] = "3000 OK open ticket = %d\n";
static char OK_data[] = "3000 OK data\n";
static char OK_append[] = "3000 OK append data\n";
jcr->last_fname = get_pool_memory(PM_FNAME);
jcr->client_name = get_memory(strlen(my_name) + 1);
strcpy(jcr->client_name, my_name);
+ dir->jcr = (void *)jcr;
/**********FIXME******* add command handler error code */
for (quit=0; !quit;) {
/* Read command */
- if (bnet_recv(dir) <= 0) {
+ if (bnet_recv(dir) < 0) {
break; /* connection terminated */
}
dir->msg[dir->msglen] = 0;
*/
static int hello_cmd(JCR *jcr)
{
- Dmsg0(20, "Calling Authenticate\n");
+ Dmsg0(120, "Calling Authenticate\n");
if (!authenticate_director(jcr)) {
return 0;
}
- Dmsg0(20, "OK Authenticate\n");
+ Dmsg0(120, "OK Authenticate\n");
jcr->authenticated = TRUE;
return 1;
}
BSOCK *dir = jcr->dir_bsock;
int level;
- Dmsg1(10, "setdebug_cmd: %s", dir->msg);
+ Dmsg1(110, "setdebug_cmd: %s", dir->msg);
if (sscanf(dir->msg, "setdebug=%d", &level) != 1 || level < 0) {
bnet_fsend(dir, "2991 Bad setdebug command: %s\n", dir->msg);
return 0;
{
BSOCK *dir = jcr->dir_bsock;
make_estimate(jcr);
- return bnet_fsend(dir, OKest, jcr->JobFiles, jcr->JobBytes);
+ return bnet_fsend(dir, OKest, jcr->num_files_examined, jcr->JobBytes);
}
/*
}
jcr->sd_auth_key = bstrdup(sd_auth_key);
free_pool_memory(sd_auth_key);
- Dmsg2(20, "JobId=%d Auth=%s\n", jcr->JobId, jcr->sd_auth_key);
+ Dmsg2(120, "JobId=%d Auth=%s\n", jcr->JobId, jcr->sd_auth_key);
return bnet_fsend(dir, OKjob);
}
{
BSOCK *dir = jcr->dir_bsock;
- while (bnet_recv(dir) > 0) {
+ while (bnet_recv(dir) >= 0) {
dir->msg[dir->msglen] = 0;
strip_trailing_junk(dir->msg);
Dmsg1(110, "filed<dird: include file %s\n", dir->msg);
BSOCK *dir = jcr->dir_bsock;
char *p;
- while (bnet_recv(dir) > 0) {
+ while (bnet_recv(dir) >= 0) {
dir->msg[dir->msglen] = 0;
strip_trailing_junk(dir->msg);
/* Skip leading options */
return 0;
}
- while (bnet_recv(dir) > 0) {
+ while (bnet_recv(dir) >= 0) {
Dmsg1(200, "filed<dird: bootstrap file %s\n", dir->msg);
fputs(dir->msg, bs);
}
Jmsg(jcr, M_FATAL, 0, _("Bad storage command: %s"), dir->msg);
return 0;
}
- Dmsg2(10, "Open storage: %s:%d\n", jcr->stored_addr, stored_port);
+ Dmsg2(110, "Open storage: %s:%d\n", jcr->stored_addr, stored_port);
/* Open command communications with Storage daemon */
/* Try to connect for 1 hour at 10 second intervals */
sd = bnet_connect(jcr, 10, 3600, _("Storage daemon"),
Jmsg(jcr, M_FATAL, 0, _("Failed to authenticate Storage daemon.\n"));
return 0;
}
- Dmsg0(10, "Authenticated with SD.\n");
+ Dmsg0(110, "Authenticated with SD.\n");
/* Send OK to Director */
return bnet_fsend(dir, OKstore);
{
BSOCK *dir = jcr->dir_bsock;
BSOCK *sd = jcr->store_bsock;
- int len;
+ int ok = 0;
+ int SDJobStatus;
jcr->JobStatus = JS_Blocked;
jcr->JobType = JT_BACKUP;
/*
* Expect to receive back the Ticket number
*/
- if (bnet_recv(sd) > 0) {
+ if (bnet_recv(sd) >= 0) {
Dmsg1(110, "<stored: %s", sd->msg);
if (sscanf(sd->msg, OK_open, &jcr->Ticket) != 1) {
Jmsg(jcr, M_FATAL, 0, _("Bad response to append open: %s\n"), sd->msg);
jcr->JobStatus = JS_ErrorTerminated;
goto cleanup;
}
- Dmsg1(10, "Got Ticket=%d\n", jcr->Ticket);
+ Dmsg1(110, "Got Ticket=%d\n", jcr->Ticket);
} else {
Jmsg(jcr, M_FATAL, 0, _("Bad response from stored to open command\n"));
jcr->JobStatus = JS_ErrorTerminated;
* Expect to get OK data
*/
Dmsg1(110, "<stored: %s", sd->msg);
- if (!response(sd, OK_data, "Append Data")) {
+ if (!response(jcr, sd, OK_data, "Append Data")) {
jcr->JobStatus = JS_ErrorTerminated;
goto cleanup;
}
/*
* Send Files to Storage daemon
*/
- Dmsg1(10, "begin blast ff=%p\n", jcr->ff);
+ Dmsg1(110, "begin blast ff=%p\n", jcr->ff);
if (!blast_data_to_storage_daemon(jcr, NULL)) {
jcr->JobStatus = JS_ErrorTerminated;
} else {
/*
* Expect to get response to append_data from Storage daemon
*/
- if (!response(sd, OK_append, "Append Data")) {
+ if (!response(jcr, sd, OK_append, "Append Data")) {
jcr->JobStatus = JS_ErrorTerminated;
goto cleanup;
}
*/
bnet_fsend(sd, append_end, jcr->Ticket);
/* Get end OK */
- if (!response(sd, OK_end, "Append End")) {
+ if (!response(jcr, sd, OK_end, "Append End")) {
jcr->JobStatus = JS_ErrorTerminated;
goto cleanup;
}
* Send Append Close to Storage daemon
*/
bnet_fsend(sd, append_close, jcr->Ticket);
- while ((len = bnet_recv(sd)) > 0) {
- /* discard anything else returned from SD */
+ while (bnet_recv(sd) >= 0) { /* stop on signal or error */
+ if (sscanf(sd->msg, OK_close, &SDJobStatus) == 1) {
+ ok = 1;
+ Dmsg2(200, "SDJobStatus = %d %c\n", SDJobStatus, (char)SDJobStatus);
+ }
+ }
+ if (!ok) {
+ Jmsg(jcr, M_FATAL, 0, _("Append Close with SD failed.\n"));
+ jcr->JobStatus = JS_ErrorTerminated;
+ goto cleanup;
}
- if (len < 0) {
- Jmsg(jcr, M_FATAL, 0, _("<stored: net_recv len=%d: ERR=%s\n"), len, bnet_strerror(sd));
+ if (SDJobStatus != JS_Terminated) {
+ Jmsg(jcr, M_FATAL, 0, _("Bad status %d returned from Storage Daemon.\n"),
+ SDJobStatus);
jcr->JobStatus = JS_ErrorTerminated;
}
}
bnet_sig(sd, BNET_TERMINATE);
}
+ bnet_fsend(dir, EndBackup, jcr->JobStatus, jcr->JobFiles, jcr->ReadBytes, jcr->JobBytes);
+
/* Inform Director that we are done */
bnet_sig(dir, BNET_TERMINATE);
BSOCK *dir = jcr->dir_bsock;
BSOCK *sd = jcr->store_bsock;
POOLMEM *where;
+ char replace;
/*
* Scan WHERE (base directory for restore) from command
/* Pickup where string */
where = get_memory(dir->msglen+1);
*where = 0;
- sscanf(dir->msg, restorecmd, where);
- Dmsg1(150, "Got where=%s\n", where);
+
+ if (sscanf(dir->msg, restorecmd, &replace, where) != 2) {
+ Jmsg(jcr, M_FATAL, 0, _("Bad replace command.\n"));
+ return 0;
+ }
+
+ Dmsg2(150, "Got replace %c, where=%s\n", replace, where);
+ unbash_spaces(where);
jcr->where = where;
+ jcr->replace = replace;
bnet_fsend(dir, OKrestore);
Dmsg1(110, "bfiled>dird: %s", dir->msg);
/* Inform Storage daemon that we are done */
bnet_sig(sd, BNET_TERMINATE);
+ bnet_fsend(dir, EndRestore, jcr->JobStatus, jcr->num_files_examined, jcr->JobBytes);
+
/* Inform Director that we are done */
bnet_sig(dir, BNET_TERMINATE);
/*
* Get ticket number
*/
- if (bnet_recv(sd) > 0) {
+ if (bnet_recv(sd) >= 0) {
Dmsg1(110, "bfiled<stored: %s", sd->msg);
if (sscanf(sd->msg, OK_open, &jcr->Ticket) != 1) {
Jmsg(jcr, M_FATAL, 0, _("Bad response to SD read open: %s\n"), sd->msg);
/*
* Get OK data
*/
- if (!response(sd, OK_data, "Read Data")) {
+ if (!response(jcr, sd, OK_data, "Read Data")) {
return 0;
}
return 1;
* Returns: 0 on failure
* 1 on success
*/
-int response(BSOCK *sd, char *resp, char *cmd)
+int response(JCR *jcr, BSOCK *sd, char *resp, char *cmd)
{
int n;
return 1;
}
}
- /* ********FIXME******** segfault if the following is executed */
- if (n > 0) {
- Emsg3(M_FATAL, 0, _("<stored: bad response to %s: wanted: %s, got: %s\n"),
- cmd, resp, sd->msg);
- } else {
- Emsg2(M_FATAL, 0, _("<stored: bad response to %s command: ERR=%s\n"),
+ if (is_bnet_error(sd)) {
+ Jmsg2(jcr, M_FATAL, 0, _("Comm error with SD. bad response to %s. ERR=%s\n"),
cmd, bnet_strerror(sd));
+ } else {
+ Jmsg3(jcr, M_FATAL, 0, _("Bad response to %s command. Wanted %s, got %s\n"),
+ cmd, resp, sd->msg);
}
return 0;
}
}
bnet_sig(sd, BNET_EOD);
fclose(bs);
- if (!response(sd, OKSDbootstrap, "Bootstrap")) {
+ if (!response(jcr, sd, OKSDbootstrap, "Bootstrap")) {
jcr->JobStatus = JS_ErrorTerminated;
return 0;
}