* Version $Id$
*/
/*
- 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
/* Forward referenced functions */
static char *find_msg_start(char *msg);
+static char Job_status[] = "Status Job=%127s JobStatus=%d\n";
+#ifdef needed
+static char Device_update[] = "DevUpd Job=%127s "
+ "device=%127s "
+ "append=%d read=%d num_writers=%d "
+ "open=%d labeled=%d offline=%d "
+ "reserved=%d max_writers=%d "
+ "autoselect=%d autochanger=%d "
+ "changer_name=%127s media_type=%127s volume_name=%127s\n";
+#endif
+
+
static char OK_msg[] = "1000 OK\n";
/*
* to the appropriate handler. If the message is
* in any other format, it will be returned.
*
- * E.g. any message beginning with a digit will be returned.
- * any message beginning with Jmsg will be processed.
+ * E.g. any message beginning with a digit will be passed
+ * through to the caller.
+ * All other messages are expected begin with some identifier
+ * -- for the moment only the first character is checked, but
+ * at a later time, the whole identifier (e.g. Jmsg, CatReq, ...)
+ * could be checked. This is followed by Job=Jobname <user-defined>
+ * info. The identifier is used to dispatch the message to the right
+ * place (Job message, catalog request, ...). The Job is used to lookup
+ * the JCR so that the action is performed on the correct jcr, and
+ * the rest of the message is up to the user. Note, DevUpd uses
+ * *System* for the Job name, and hence no JCR is obtained. This
+ * is a *rare* case where a jcr is not really needed.
*
*/
int bget_dirmsg(BSOCK *bs)
for (;;) {
n = bnet_recv(bs);
- Dmsg2(120, "bget_dirmsg %d: %s\n", n, bs->msg);
+ Dmsg2(900, "bget_dirmsg %d: %s", n, bs->msg);
if (is_bnet_stop(bs)) {
return n; /* error or terminate */
break;
case BNET_STATUS:
/* *****FIXME***** Implement more completely */
- bnet_fsend(bs, "Status OK\n");
+ bnet_fsend(bs, "Status OK\n");
bnet_sig(bs, BNET_EOD);
break;
case BNET_BTIME: /* send Bacula time */
char ed1[50];
- bnet_fsend(bs, "btime %s\n", edit_uint64(get_current_btime(),ed1));
+ bnet_fsend(bs, "btime %s\n", edit_uint64(get_current_btime(),ed1));
break;
default:
- Emsg1(M_WARNING, 0, _("bget_dirmsg: unknown bnet signal %d\n"), bs->msglen);
+ Emsg1(M_WARNING, 0, _("bget_dirmsg: unknown bnet signal %d\n"), bs->msglen);
return n;
}
continue;
* Try to fulfill it.
*/
if (sscanf(bs->msg, "%020s Job=%127s ", MsgType, Job) != 2) {
- Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+ Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
continue;
}
- if (!(jcr=get_jcr_by_full_name(Job))) {
- Emsg1(M_ERROR, 0, _("Job not found: %s\n"), bs->msg);
+ if (strcmp(Job, "*System*") == 0) {
+ jcr = NULL; /* No jcr */
+ } else if (!(jcr=get_jcr_by_full_name(Job))) {
+ Emsg1(M_ERROR, 0, _("Job not found: %s\n"), bs->msg);
continue;
}
- Dmsg1(200, "Getmsg got jcr 0x%x\n", jcr);
+ Dmsg1(900, "Getmsg got jcr 0x%x\n", jcr);
/* Skip past "Jmsg Job=nnn" */
if (!(msg=find_msg_start(bs->msg))) {
- Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+ Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
free_jcr(jcr);
continue;
}
* Jmsg Job=nnn type=nnn level=nnn Message-string
*/
if (bs->msg[0] == 'J') { /* Job message */
- if (sscanf(bs->msg, "Jmsg Job=%127s type=%d level=%d",
+ if (sscanf(bs->msg, "Jmsg Job=%127s type=%d level=%d",
Job, &type, &level) != 3) {
- Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+ Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
free_jcr(jcr);
continue;
}
- Dmsg1(120, "Got msg: %s\n", bs->msg);
+ Dmsg1(900, "Got msg: %s\n", bs->msg);
skip_spaces(&msg);
skip_nonspaces(&msg); /* skip type=nnn */
skip_spaces(&msg);
skip_nonspaces(&msg); /* skip level=nnn */
- if (*msg == ' ') {
+ if (*msg == ' ') {
msg++; /* skip leading space */
}
- Dmsg1(120, "Dispatch msg: %s", msg);
+ Dmsg1(900, "Dispatch msg: %s", msg);
dispatch_message(jcr, type, level, msg);
free_jcr(jcr);
continue;
* CatReq Job=nn Catalog-Request-Message
*/
if (bs->msg[0] == 'C') { /* Catalog request */
- Dmsg2(120, "Catalog req jcr 0x%x: %s", jcr, bs->msg);
+ Dmsg2(900, "Catalog req jcr 0x%x: %s", jcr, bs->msg);
catalog_request(jcr, bs, msg);
- Dmsg1(200, "Calling freejcr 0x%x\n", jcr);
+ Dmsg1(900, "Calling freejcr 0x%x\n", jcr);
free_jcr(jcr);
continue;
}
if (bs->msg[0] == 'U') { /* Catalog update */
- Dmsg2(120, "Catalog upd jcr 0x%x: %s", jcr, bs->msg);
+ Dmsg2(900, "Catalog upd jcr 0x%x: %s", jcr, bs->msg);
catalog_update(jcr, bs, msg);
- Dmsg1(200, "Calling freejcr 0x%x\n", jcr);
+ Dmsg1(900, "Calling freejcr 0x%x\n", jcr);
free_jcr(jcr);
continue;
}
if (bs->msg[0] == 'M') { /* Mount request */
- Dmsg1(120, "Mount req: %s", bs->msg);
+ Dmsg1(900, "Mount req: %s", bs->msg);
mount_request(jcr, bs, msg);
free_jcr(jcr);
continue;
}
+ if (bs->msg[0] == 'S') { /* Status change */
+ int JobStatus;
+ char Job[MAX_NAME_LENGTH];
+ if (sscanf(bs->msg, Job_status, &Job, &JobStatus) == 2) {
+ jcr->SDJobStatus = JobStatus; /* current status */
+ } else {
+ Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+ }
+ free_jcr(jcr);
+ continue;
+ }
+#ifdef needec
+ /* No JCR for Device Updates! */
+ if (bs->msg[0] = 'D') { /* Device update */
+ DEVICE *dev;
+ POOL_MEM dev_name, changer_name, media_type, volume_name;
+ int dev_open, dev_append, dev_read, dev_labeled;
+ int dev_offline, dev_autochanger, dev_autoselect;
+ int dev_num_writers, dev_max_writers, dev_reserved;
+ uint64_t dev_PoolId;
+ Dmsg1(100, "<stored: %s", bs->msg);
+ if (sscanf(bs->msg, Device_update,
+ &Job, dev_name.c_str(),
+ &dev_append, &dev_read,
+ &dev_num_writers, &dev_open,
+ &dev_labeled, &dev_offline, &dev_reserved,
+ &dev_max_writers, &dev_autoselect,
+ &dev_autochanger,
+ changer_name.c_str(), media_type.c_str(),
+ volume_name.c_str()) != 15) {
+ Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+ } else {
+ unbash_spaces(dev_name);
+ dev = (DEVICE *)GetResWithName(R_DEVICE, dev_name.c_str());
+ if (!dev) {
+ continue;
+ }
+ unbash_spaces(changer_name);
+ unbash_spaces(media_type);
+ unbash_spaces(volume_name);
+ bstrncpy(dev->ChangerName, changer_name.c_str(), sizeof(dev->ChangerName));
+ bstrncpy(dev->MediaType, media_type.c_str(), sizeof(dev->MediaType));
+ bstrncpy(dev->VolumeName, volume_name.c_str(), sizeof(dev->VolumeName));
+ /* Note, these are copied because they are boolean rather than
+ * integer.
+ */
+ dev->open = dev_open;
+ dev->append = dev_append;
+ dev->read = dev_read;
+ dev->labeled = dev_labeled;
+ dev->offline = dev_offline;
+ dev->autoselect = dev_autoselect;
+ dev->autochanger = dev_autochanger > 0;
+ dev->num_drives = dev_autochanger; /* does double duty */
+ dev->PoolId = dev_PoolId;
+ dev->num_writers = dev_num_writers;
+ dev->max_writers = dev_max_writers;
+ dev->reserved = dev_reserved;
+ dev->found = true;
+ }
+ continue;
+ }
+#endif
return n;
}
}
}
/*
- * Get response from File daemon to a command we
+ * Get response from FD or SD to a command we
* sent. Check that the response agrees with what we expect.
*
- * Returns: 0 on failure
- * 1 on success
+ * Returns: false on failure
+ * true on success
*/
-int response(JCR *jcr, BSOCK *fd, char *resp, const char *cmd, e_prtmsg prtmsg)
+bool response(JCR *jcr, BSOCK *bs, char *resp, const char *cmd, e_prtmsg prtmsg)
{
int n;
- if (is_bnet_error(fd)) {
- return 0;
+ if (is_bnet_error(bs)) {
+ return false;
}
- if ((n = bget_dirmsg(fd)) >= 0) {
- Dmsg0(110, fd->msg);
- if (strcmp(fd->msg, resp) == 0) {
- return 1;
+ if ((n = bget_dirmsg(bs)) >= 0) {
+ Dmsg0(900, bs->msg);
+ if (strcmp(bs->msg, resp) == 0) {
+ return true;
}
+ Dmsg1(900, "Bad response: ERR=%s", bs->msg);
if (prtmsg == DISPLAY_ERROR) {
- Jmsg(jcr, M_FATAL, 0, _("FD gave bad response to %s command: wanted %s got: %s\n"),
- cmd, resp, fd->msg);
+ Jmsg(jcr, M_FATAL, 0, _("Bad response to %s command: wanted %s got: %s\n"),
+ cmd, resp, bs->msg);
}
- return 0;
+ return false;
}
- Jmsg(jcr, M_FATAL, 0, _("Socket error from Filed on %s command: ERR=%s\n"),
- cmd, bnet_strerror(fd));
- return 0;
+ Jmsg(jcr, M_FATAL, 0, _("Socket error on %s command: ERR=%s\n"),
+ cmd, bnet_strerror(bs));
+ return false;
}