2 Bacula® - The Network Backup Solution
4 Copyright (C) 2001-2012 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version three of the GNU Affero General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU Affero General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
29 * This file handles accepting Director Commands
31 * Most Director commands are handled here, with the
32 * exception of the Job command command and subsequent
33 * subcommands that are handled
36 * N.B. in this file, in general we must use P(dev->mutex) rather
37 * than dev->r_lock() so that we can examine the blocked
38 * state rather than blocking ourselves because a Job
39 * thread has the device blocked. In some "safe" cases,
40 * we can do things to a blocked device. CAREFUL!!!!
42 * File daemon commands are handled in fdcmd.c
44 * Kern Sibbald, May MMI
51 /* Exported variables */
53 /* Imported variables */
54 extern BSOCK *filed_chan;
55 extern struct s_last_job last_job;
56 extern bool init_done;
58 /* Static variables */
59 static char derrmsg[] = "3900 Invalid command:";
60 static char OKsetdebug[] = "3000 OK setdebug=%d\n";
61 static char invalid_cmd[] = "3997 Invalid command for a Director with Monitor directive enabled.\n";
62 static char OK_bootstrap[] = "3000 OK bootstrap\n";
63 static char ERROR_bootstrap[] = "3904 Error bootstrap\n";
65 /* Imported functions */
66 extern void terminate_child();
67 extern bool job_cmd(JCR *jcr);
68 extern bool use_cmd(JCR *jcr);
69 extern bool run_cmd(JCR *jcr);
70 extern bool status_cmd(JCR *sjcr);
71 extern bool qstatus_cmd(JCR *jcr);
72 //extern bool query_cmd(JCR *jcr);
74 /* Forward referenced functions */
75 static bool label_cmd(JCR *jcr);
76 static bool die_cmd(JCR *jcr);
77 static bool relabel_cmd(JCR *jcr);
78 static bool readlabel_cmd(JCR *jcr);
79 static bool release_cmd(JCR *jcr);
80 static bool setdebug_cmd(JCR *jcr);
81 static bool cancel_cmd(JCR *cjcr);
82 static bool mount_cmd(JCR *jcr);
83 static bool unmount_cmd(JCR *jcr);
84 //static bool action_on_purge_cmd(JCR *jcr);
85 static bool bootstrap_cmd(JCR *jcr);
86 static bool changer_cmd(JCR *sjcr);
87 static bool do_label(JCR *jcr, int relabel);
88 static DCR *find_device(JCR *jcr, POOL_MEM &dev_name, int drive);
89 static void read_volume_label(JCR *jcr, DCR *dcr, DEVICE *dev, int Slot);
90 static void label_volume_if_ok(DCR *dcr, char *oldname,
91 char *newname, char *poolname,
92 int Slot, int relabel);
93 static bool try_autoload_device(JCR *jcr, DCR *dcr, int slot, const char *VolName);
94 static void send_dir_busy_message(BSOCK *dir, DEVICE *dev);
98 bool (*func)(JCR *jcr);
99 bool monitoraccess; /* set if monitors can access this cmd */
103 * The following are the recognized commands from the Director.
105 static struct s_cmds cmds[] = {
106 {"JobId=", job_cmd, 0}, /* start Job */
107 {"autochanger", changer_cmd, 0},
108 {"bootstrap", bootstrap_cmd, 0},
109 {"cancel", cancel_cmd, 0},
110 {".die", die_cmd, 0},
111 {"label", label_cmd, 0}, /* label a tape */
112 {"mount", mount_cmd, 0},
113 {"readlabel", readlabel_cmd, 0},
114 {"release", release_cmd, 0},
115 {"relabel", relabel_cmd, 0}, /* relabel a tape */
116 {"setdebug=", setdebug_cmd, 0}, /* set debug level */
117 {"status", status_cmd, 1},
118 {".status", qstatus_cmd, 1},
119 {"unmount", unmount_cmd, 0},
120 // {"action_on_purge", action_on_purge_cmd, 0},
121 {"use storage=", use_cmd, 0},
123 // {"query", query_cmd, 0},
124 {NULL, NULL} /* list terminator */
129 * Connection request. We accept connections either from the
130 * Director or a Client (File daemon).
132 * Note, we are running as a seperate thread of the Storage daemon.
133 * and it is because a Director has made a connection with
134 * us on the "Message" channel.
136 * Basic tasks done here:
137 * - Create a JCR record
138 * - If it was from the FD, call handle_filed_connection()
139 * - Authenticate the Director
140 * - We wait for a command
141 * - We execute the command
142 * - We continue or exit depending on the return status
144 void *handle_connection_request(void *arg)
146 BSOCK *bs = (BSOCK *)arg;
154 if (bs->recv() <= 0) {
155 Emsg1(M_ERROR, 0, _("Connection request from %s failed.\n"), bs->who());
156 bmicrosleep(5, 0); /* make user wait 5 seconds */
162 * Do a sanity check on the message received
164 if (bs->msglen < 25 || bs->msglen > (int)sizeof(name)) {
165 Dmsg1(000, "<filed: %s", bs->msg);
166 Emsg2(M_ERROR, 0, _("Invalid connection from %s. Len=%d\n"), bs->who(), bs->msglen);
167 bmicrosleep(5, 0); /* make user wait 5 seconds */
172 * See if this is a File daemon connection. If so
175 Dmsg1(110, "Conn: %s", bs->msg);
176 if (debug_level == 3) {
177 Dmsg1(000, "<filed: %s", bs->msg);
179 if (sscanf(bs->msg, "Hello Start Job %127s", name) == 1) {
180 Dmsg1(110, "Got a FD connection at %s\n", bstrftimes(tbuf, sizeof(tbuf),
181 (utime_t)time(NULL)));
182 Dmsg1(50, "%s", bs->msg);
183 handle_filed_connection(bs, name);
188 * This is a connection from the Director, so setup a JCR
190 Dmsg1(110, "Got a DIR connection at %s\n", bstrftimes(tbuf, sizeof(tbuf),
191 (utime_t)time(NULL)));
192 jcr = new_jcr(sizeof(JCR), stored_free_jcr); /* create Job Control Record */
193 jcr->dir_bsock = bs; /* save Director bsock */
194 jcr->dir_bsock->set_jcr(jcr);
195 jcr->dcrs = New(alist(10, not_owned_by_alist));
196 /* Initialize FD start condition variable */
197 int errstat = pthread_cond_init(&jcr->job_start_wait, NULL);
200 Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), be.bstrerror(errstat));
204 Dmsg0(1000, "stored in start_job\n");
207 * Authenticate the Director
209 if (!authenticate_director(jcr)) {
210 Jmsg(jcr, M_FATAL, 0, _("Unable to authenticate Director\n"));
213 Dmsg0(90, "Message channel init completed.\n");
215 for (quit=false; !quit;) {
217 if ((bnet_stat = bs->recv()) <= 0) {
218 break; /* connection terminated */
220 Dmsg1(199, "<dird: %s\n", bs->msg);
221 /* Ensure that device initialization is complete */
226 for (i=0; cmds[i].cmd; i++) {
227 if (strncmp(cmds[i].cmd, bs->msg, strlen(cmds[i].cmd)) == 0) {
228 if ((!cmds[i].monitoraccess) && (jcr->director->monitor)) {
229 Dmsg1(100, "Command \"%s\" is invalid.\n", cmds[i].cmd);
230 bs->fsend(invalid_cmd);
231 bs->signal(BNET_EOD);
234 Dmsg1(200, "Do command: %s\n", cmds[i].cmd);
235 if (!cmds[i].func(jcr)) { /* do command */
236 quit = true; /* error, get out */
237 Dmsg1(190, "Command %s requests quit\n", cmds[i].cmd);
239 found = true; /* indicate command found */
243 if (!found) { /* command not found */
245 Mmsg(err_msg, "%s %s\n", derrmsg, bs->msg);
246 bs->fsend(err_msg.c_str());
251 generate_daemon_event(jcr, "JobEnd");
252 dequeue_messages(jcr); /* send any queued messages */
253 bs->signal(BNET_TERMINATE);
260 * Force SD to die, and hopefully dump itself. Turned on only
261 * in development version.
263 static bool die_cmd(JCR *jcr)
268 BSOCK *dir = jcr->dir_bsock;
269 pthread_mutex_t m=PTHREAD_MUTEX_INITIALIZER;
271 if (strstr(dir->msg, "deadlock")) {
272 Pmsg0(000, "I have been requested to deadlock ...\n");
277 Pmsg1(000, "I have been requested to die ... (%s)\n", dir->msg);
278 a = djcr->JobId; /* ref NULL pointer */
279 b = a; /* Keep compiler quiet */
288 * Set debug level as requested by the Director
291 static bool setdebug_cmd(JCR *jcr)
293 BSOCK *dir = jcr->dir_bsock;
294 int32_t level, trace_flag;
296 Dmsg1(10, "setdebug_cmd: %s", dir->msg);
297 if (sscanf(dir->msg, "setdebug=%d trace=%d", &level, &trace_flag) != 2 || level < 0) {
298 dir->fsend(_("3991 Bad setdebug command: %s\n"), dir->msg);
302 set_trace(trace_flag);
303 return dir->fsend(OKsetdebug, level);
309 * Be careful, we switch to using the job's JCR! So, using
310 * BSOCKs on that jcr can have two threads in the same code.
312 static bool cancel_cmd(JCR *cjcr)
314 BSOCK *dir = cjcr->dir_bsock;
316 char Job[MAX_NAME_LENGTH];
319 if (sscanf(dir->msg, "cancel Job=%127s", Job) == 1) {
320 if (!(jcr=get_jcr_by_full_name(Job))) {
321 dir->fsend(_("3904 Job %s not found.\n"), Job);
323 oldStatus = jcr->JobStatus;
324 jcr->setJobStatus(JS_Canceled);
325 Dmsg2(800, "Cancel JobId=%d %p\n", jcr->JobId, jcr);
326 if (!jcr->authenticated && oldStatus == JS_WaitFD) {
327 pthread_cond_signal(&jcr->job_start_wait); /* wake waiting thread */
329 if (jcr->file_bsock) {
330 jcr->file_bsock->set_terminated();
331 jcr->file_bsock->set_timed_out();
332 Dmsg2(800, "Term bsock jid=%d %p\n", jcr->JobId, jcr);
334 /* Still waiting for FD to connect, release it */
335 pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */
336 Dmsg2(800, "Signal FD connect jid=%d %p\n", jcr->JobId, jcr);
338 /* If thread waiting on mount, wake him */
339 if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->waiting_for_mount()) {
340 pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
341 Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId);
342 pthread_cond_broadcast(&wait_device_release);
344 if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->waiting_for_mount()) {
345 pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol);
346 Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId);
347 pthread_cond_broadcast(&wait_device_release);
349 dir->fsend(_("3000 JobId=%ld Job=\"%s\" marked to be canceled.\n"), jcr->JobId, jcr->Job);
353 dir->fsend(_("3903 Error scanning cancel command.\n"));
355 dir->signal(BNET_EOD);
363 static bool label_cmd(JCR *jcr)
365 return do_label(jcr, 0);
368 static bool relabel_cmd(JCR *jcr)
370 return do_label(jcr, 1);
373 static bool do_label(JCR *jcr, int relabel)
375 POOLMEM *newname, *oldname, *poolname, *mtype;
377 BSOCK *dir = jcr->dir_bsock;
383 newname = get_memory(dir->msglen+1);
384 oldname = get_memory(dir->msglen+1);
385 poolname = get_memory(dir->msglen+1);
386 mtype = get_memory(dir->msglen+1);
388 if (sscanf(dir->msg, "relabel %127s OldName=%127s NewName=%127s PoolName=%127s "
389 "MediaType=%127s Slot=%d drive=%d",
390 dev_name.c_str(), oldname, newname, poolname, mtype,
391 &slot, &drive) == 7) {
396 if (sscanf(dir->msg, "label %127s VolumeName=%127s PoolName=%127s "
397 "MediaType=%127s Slot=%d drive=%d",
398 dev_name.c_str(), newname, poolname, mtype, &slot, &drive) == 6) {
403 unbash_spaces(newname);
404 unbash_spaces(oldname);
405 unbash_spaces(poolname);
406 unbash_spaces(mtype);
407 dcr = find_device(jcr, dev_name, drive);
410 dev->dlock(); /* Use P to avoid indefinite block */
411 if (!dev->is_open() && !dev->is_busy()) {
412 Dmsg1(400, "Can %slabel. Device is not open\n", relabel?"re":"");
413 label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
415 /* Under certain "safe" conditions, we can steal the lock */
416 } else if (dev->can_steal_lock()) {
417 Dmsg0(400, "Can relabel. can_steal_lock\n");
418 label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
419 } else if (dev->is_busy() || dev->is_blocked()) {
420 send_dir_busy_message(dir, dev);
421 } else { /* device not being used */
422 Dmsg0(400, "Can relabel. device not used\n");
423 label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
428 dir->fsend(_("3999 Device \"%s\" not found or could not be opened.\n"), dev_name.c_str());
431 /* NB dir->msg gets clobbered in bnet_fsend, so save command */
432 pm_strcpy(jcr->errmsg, dir->msg);
433 dir->fsend(_("3903 Error scanning label command: %s\n"), jcr->errmsg);
435 free_memory(oldname);
436 free_memory(newname);
437 free_memory(poolname);
439 dir->signal(BNET_EOD);
444 * Read the tape label and determine if we can safely
445 * label the tape (not a Bacula volume), then label it.
447 * Enter with the mutex set
449 static void label_volume_if_ok(DCR *dcr, char *oldname,
450 char *newname, char *poolname,
451 int slot, int relabel)
453 BSOCK *dir = dcr->jcr->dir_bsock;
455 DEVICE *dev = dcr->dev;
458 const char *volname = (relabel == 1) ? oldname : newname;
461 steal_device_lock(dev, &hold, BST_WRITING_LABEL);
462 Dmsg1(100, "Stole device %s lock, writing label.\n", dev->print_name());
465 Dmsg0(90, "try_autoload_device - looking for volume_info\n");
466 if (!try_autoload_device(dcr->jcr, dcr, slot, volname)) {
467 goto bail_out; /* error */
470 /* Ensure that the device is open -- autoload_device() closes it */
471 if (dev->is_tape()) {
472 mode = OPEN_READ_WRITE;
474 mode = CREATE_READ_WRITE;
478 dev->truncating = true; /* let open() know we will truncate it */
480 /* Set old volume name for open if relabeling */
481 dcr->setVolCatName(volname);
482 if (!dev->open(dcr, mode)) {
483 dir->fsend(_("3910 Unable to open device \"%s\": ERR=%s\n"),
484 dev->print_name(), dev->bstrerror());
488 /* See what we have for a Volume */
489 label_status = read_dev_volume_label(dcr);
491 /* Set new volume name */
492 dcr->setVolCatName(newname);
493 switch(label_status) {
495 case VOL_VERSION_ERROR:
496 case VOL_LABEL_ERROR:
500 "3920 Cannot label Volume because it is already labeled: \"%s\"\n"),
501 dev->VolHdr.VolumeName);
505 /* Relabel request. If oldname matches, continue */
506 if (strcmp(oldname, dev->VolHdr.VolumeName) != 0) {
507 dir->fsend(_("3921 Wrong volume mounted.\n"));
510 if (dev->label_type != B_BACULA_LABEL) {
511 dir->fsend(_("3922 Cannot relabel an ANSI/IBM labeled Volume.\n"));
514 /* Fall through wanted! */
517 if (!write_new_volume_label_to_dev(dcr, newname, poolname,
518 relabel, true /* write dvd now */)) {
519 dir->fsend(_("3912 Failed to label Volume: ERR=%s\n"), dev->bstrerror());
522 bstrncpy(dcr->VolumeName, newname, sizeof(dcr->VolumeName));
523 /* The following 3000 OK label. string is scanned in ua_label.c */
524 dir->fsend("3000 OK label. VolBytes=%s DVD=%d Volume=\"%s\" Device=%s\n",
525 edit_uint64(dev->VolCatInfo.VolCatBytes, ed1),
526 dev->is_dvd()?1:0, newname, dev->print_name());
529 dir->fsend(_("3914 Failed to label Volume (no media): ERR=%s\n"), dev->bstrerror());
532 dir->fsend(_("3913 Cannot label Volume. "
533 "Unknown status %d from read_volume_label()\n"), label_status);
538 if (!dev->is_open()) {
541 volume_unused(dcr); /* no longer using volume */
542 give_back_device_lock(dev, &hold);
548 * Read the tape label
550 * Enter with the mutex set
552 static bool read_label(DCR *dcr)
556 BSOCK *dir = jcr->dir_bsock;
558 DEVICE *dev = dcr->dev;
560 steal_device_lock(dev, &hold, BST_DOING_ACQUIRE);
562 dcr->VolumeName[0] = 0;
563 dev->clear_labeled(); /* force read of label */
564 switch (read_dev_volume_label(dcr)) {
566 dir->fsend(_("3001 Mounted Volume: %s\n"), dev->VolHdr.VolumeName);
570 dir->fsend(_("3902 Cannot mount Volume on Storage Device \"%s\" because:\n%s"),
571 dev->print_name(), jcr->errmsg);
576 give_back_device_lock(dev, &hold);
581 * Searches for device by name, and if found, creates a dcr and
584 static DCR *find_device(JCR *jcr, POOL_MEM &devname, int drive)
587 AUTOCHANGER *changer;
591 unbash_spaces(devname);
592 foreach_res(device, R_DEVICE) {
593 /* Find resource, and make sure we were able to open it */
594 if (strcmp(device->hdr.name, devname.c_str()) == 0) {
596 device->dev = init_dev(jcr, device);
599 Jmsg(jcr, M_WARNING, 0, _("\n"
600 " Device \"%s\" requested by DIR could not be opened or does not exist.\n"),
604 Dmsg1(20, "Found device %s\n", device->hdr.name);
610 foreach_res(changer, R_AUTOCHANGER) {
611 /* Find resource, and make sure we were able to open it */
612 if (strcmp(devname.c_str(), changer->hdr.name) == 0) {
613 /* Try each device in this AutoChanger */
614 foreach_alist(device, changer->device) {
615 Dmsg1(100, "Try changer device %s\n", device->hdr.name);
617 device->dev = init_dev(jcr, device);
620 Dmsg1(100, "Device %s could not be opened. Skipped\n", devname.c_str());
621 Jmsg(jcr, M_WARNING, 0, _("\n"
622 " Device \"%s\" in changer \"%s\" requested by DIR could not be opened or does not exist.\n"),
623 device->hdr.name, devname.c_str());
626 if (!device->dev->autoselect) {
627 Dmsg1(100, "Device %s not autoselect skipped.\n", devname.c_str());
628 continue; /* device is not available */
630 if (drive < 0 || drive == (int)device->dev->drive_index) {
631 Dmsg1(20, "Found changer device %s\n", device->hdr.name);
635 Dmsg3(100, "Device %s drive wrong: want=%d got=%d skipping\n",
636 devname.c_str(), drive, (int)device->dev->drive_index);
638 break; /* we found it but could not open a device */
644 Dmsg1(100, "Found device %s\n", device->hdr.name);
645 dcr = new_dcr(jcr, NULL, device->dev);
646 dcr->device = device;
653 * Mount command from Director
655 static bool mount_cmd(JCR *jcr)
658 BSOCK *dir = jcr->dir_bsock;
665 ok = sscanf(dir->msg, "mount %127s drive=%d slot=%d", devname.c_str(),
668 ok = sscanf(dir->msg, "mount %127s drive=%d", devname.c_str(), &drive) == 2;
670 Dmsg3(100, "ok=%d drive=%d slot=%d\n", ok, drive, slot);
672 dcr = find_device(jcr, devname, drive);
675 dev->dlock(); /* Use P to avoid indefinite block */
676 Dmsg2(100, "mount cmd blocked=%d must_unload=%d\n", dev->blocked(),
678 switch (dev->blocked()) { /* device blocked? */
679 case BST_WAITING_FOR_SYSOP:
680 /* Someone is waiting, wake him */
681 Dmsg0(100, "Waiting for mount. Attempting to wake thread\n");
682 dev->set_blocked(BST_MOUNT);
683 dir->fsend("3001 OK mount requested. %sDevice=%s\n",
684 slot>0?_("Specified slot ignored. "):"",
686 pthread_cond_broadcast(&dev->wait_next_vol);
687 Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
688 pthread_cond_broadcast(&wait_device_release);
691 /* In both of these two cases, we (the user) unmounted the Volume */
692 case BST_UNMOUNTED_WAITING_FOR_SYSOP:
694 Dmsg2(100, "Unmounted changer=%d slot=%d\n", dev->is_autochanger(), slot);
695 if (dev->is_autochanger() && slot > 0) {
696 try_autoload_device(jcr, dcr, slot, "");
698 /* We freed the device, so reopen it and wake any waiting threads */
699 if (!dev->open(dcr, OPEN_READ_ONLY)) {
700 dir->fsend(_("3901 Unable to open device \"%s\": ERR=%s\n"),
701 dev->print_name(), dev->bstrerror());
702 if (dev->blocked() == BST_UNMOUNTED) {
703 /* We blocked the device, so unblock it */
704 Dmsg0(100, "Unmounted. Unblocking device\n");
709 read_dev_volume_label(dcr);
710 if (dev->blocked() == BST_UNMOUNTED) {
711 /* We blocked the device, so unblock it */
712 Dmsg0(100, "Unmounted. Unblocking device\n");
713 read_label(dcr); /* this should not be necessary */
716 Dmsg0(100, "Unmounted waiting for mount. Attempting to wake thread\n");
717 dev->set_blocked(BST_MOUNT);
719 if (dev->is_labeled()) {
720 dir->fsend(_("3001 Device \"%s\" is mounted with Volume \"%s\"\n"),
721 dev->print_name(), dev->VolHdr.VolumeName);
723 dir->fsend(_("3905 Device \"%s\" open but no Bacula volume is mounted.\n"
724 "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
727 pthread_cond_broadcast(&dev->wait_next_vol);
728 Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
729 pthread_cond_broadcast(&wait_device_release);
732 case BST_DOING_ACQUIRE:
733 dir->fsend(_("3001 Device \"%s\" is doing acquire.\n"),
737 case BST_WRITING_LABEL:
738 dir->fsend(_("3903 Device \"%s\" is being labeled.\n"),
742 case BST_NOT_BLOCKED:
743 Dmsg2(100, "Not blocked changer=%d slot=%d\n", dev->is_autochanger(), slot);
744 if (dev->is_autochanger() && slot > 0) {
745 try_autoload_device(jcr, dcr, slot, "");
747 if (dev->is_open()) {
748 if (dev->is_labeled()) {
749 dir->fsend(_("3001 Device \"%s\" is mounted with Volume \"%s\"\n"),
750 dev->print_name(), dev->VolHdr.VolumeName);
752 dir->fsend(_("3905 Device \"%s\" open but no Bacula volume is mounted.\n"
753 "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
756 } else if (dev->is_tape()) {
757 if (!dev->open(dcr, OPEN_READ_ONLY)) {
758 dir->fsend(_("3901 Unable to open device \"%s\": ERR=%s\n"),
759 dev->print_name(), dev->bstrerror());
763 if (dev->is_labeled()) {
764 dir->fsend(_("3001 Device \"%s\" is already mounted with Volume \"%s\"\n"),
765 dev->print_name(), dev->VolHdr.VolumeName);
767 dir->fsend(_("3905 Device \"%s\" open but no Bacula volume is mounted.\n"
768 "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
771 } else if (dev->is_unmountable()) {
773 dir->fsend(_("3002 Device \"%s\" is mounted.\n"), dev->print_name());
775 dir->fsend(_("3907 %s"), dev->bstrerror());
777 } else { /* must be file */
778 dir->fsend(_("3906 File device \"%s\" is always mounted.\n"),
780 pthread_cond_broadcast(&dev->wait_next_vol);
781 Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
782 pthread_cond_broadcast(&wait_device_release);
787 dir->fsend(_("3930 Device \"%s\" is being released.\n"), dev->print_name());
791 dir->fsend(_("3905 Unknown wait state %d\n"), dev->blocked());
797 dir->fsend(_("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
800 pm_strcpy(jcr->errmsg, dir->msg);
801 dir->fsend(_("3909 Error scanning mount command: %s\n"), jcr->errmsg);
803 dir->signal(BNET_EOD);
808 * unmount command from Director
810 static bool unmount_cmd(JCR *jcr)
813 BSOCK *dir = jcr->dir_bsock;
818 if (sscanf(dir->msg, "unmount %127s drive=%d", devname.c_str(), &drive) == 2) {
819 dcr = find_device(jcr, devname, drive);
822 dev->dlock(); /* Use P to avoid indefinite block */
823 if (!dev->is_open()) {
824 if (!dev->is_busy()) {
825 unload_autochanger(dcr, -1);
827 if (dev->is_unmountable()) {
828 if (dev->unmount(0)) {
829 dir->fsend(_("3002 Device \"%s\" unmounted.\n"),
832 dir->fsend(_("3907 %s"), dev->bstrerror());
835 Dmsg0(90, "Device already unmounted\n");
836 dir->fsend(_("3901 Device \"%s\" is already unmounted.\n"),
839 } else if (dev->blocked() == BST_WAITING_FOR_SYSOP) {
840 Dmsg2(90, "%d waiter dev_block=%d. doing unmount\n", dev->num_waiting,
842 if (!unload_autochanger(dcr, -1)) {
843 /* ***FIXME**** what is this ???? */
847 if (dev->is_unmountable() && !dev->unmount(0)) {
848 dir->fsend(_("3907 %s"), dev->bstrerror());
850 dev->set_blocked(BST_UNMOUNTED_WAITING_FOR_SYSOP);
851 dir->fsend(_("3001 Device \"%s\" unmounted.\n"),
855 } else if (dev->blocked() == BST_DOING_ACQUIRE) {
856 dir->fsend(_("3902 Device \"%s\" is busy in acquire.\n"),
859 } else if (dev->blocked() == BST_WRITING_LABEL) {
860 dir->fsend(_("3903 Device \"%s\" is being labeled.\n"),
863 } else if (dev->is_busy()) {
864 send_dir_busy_message(dir, dev);
865 } else { /* device not being used */
866 Dmsg0(90, "Device not in use, unmounting\n");
867 /* On FreeBSD, I am having ASSERT() failures in block_device()
868 * and I can only imagine that the thread id that we are
869 * leaving in no_wait_id is being re-used. So here,
870 * we simply do it by hand. Gross, but a solution.
872 /* block_device(dev, BST_UNMOUNTED); replace with 2 lines below */
873 dev->set_blocked(BST_UNMOUNTED);
874 clear_thread_id(dev->no_wait_id);
875 if (!unload_autochanger(dcr, -1)) {
879 if (dev->is_unmountable() && !dev->unmount(0)) {
880 dir->fsend(_("3907 %s"), dev->bstrerror());
882 dir->fsend(_("3002 Device \"%s\" unmounted.\n"),
889 dir->fsend(_("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
892 /* NB dir->msg gets clobbered in bnet_fsend, so save command */
893 pm_strcpy(jcr->errmsg, dir->msg);
894 dir->fsend(_("3907 Error scanning unmount command: %s\n"), jcr->errmsg);
896 dir->signal(BNET_EOD);
902 * The truncate command will recycle a volume. The director can call this
903 * after purging a volume so that disk space will not be wasted. Only useful
904 * for File Storage, of course.
907 * It is currently disabled
909 static bool action_on_purge_cmd(JCR *jcr)
911 BSOCK *dir = jcr->dir_bsock;
913 char devname[MAX_NAME_LENGTH];
914 char volumename[MAX_NAME_LENGTH];
917 /* TODO: Need to find a free device and ask for slot to the director */
919 "action_on_purge %127s vol=%127s action=%d",
920 devname, volumename, &action)!= 5)
922 dir->fsend(_("3916 Error scanning action_on_purge command\n"));
925 unbash_spaces(volumename);
926 unbash_spaces(devname);
928 /* Check if action is correct */
929 if (action & AOP_TRUNCTATE) {
935 dir->signal(BNET_EOD);
941 * Release command from Director. This rewinds the device and if
942 * configured does a offline and ensures that Bacula will
943 * re-read the label of the tape before continuing. This gives
944 * the operator the chance to change the tape anytime before the
947 static bool release_cmd(JCR *jcr)
950 BSOCK *dir = jcr->dir_bsock;
955 if (sscanf(dir->msg, "release %127s drive=%d", devname.c_str(), &drive) == 2) {
956 dcr = find_device(jcr, devname, drive);
959 dev->dlock(); /* Use P to avoid indefinite block */
960 if (!dev->is_open()) {
961 if (!dev->is_busy()) {
962 unload_autochanger(dcr, -1);
964 Dmsg0(90, "Device already released\n");
965 dir->fsend(_("3921 Device \"%s\" already released.\n"),
968 } else if (dev->blocked() == BST_WAITING_FOR_SYSOP) {
969 Dmsg2(90, "%d waiter dev_block=%d.\n", dev->num_waiting,
971 unload_autochanger(dcr, -1);
972 dir->fsend(_("3922 Device \"%s\" waiting for sysop.\n"),
975 } else if (dev->blocked() == BST_UNMOUNTED_WAITING_FOR_SYSOP) {
976 Dmsg2(90, "%d waiter dev_block=%d. doing unmount\n", dev->num_waiting,
978 dir->fsend(_("3922 Device \"%s\" waiting for mount.\n"),
981 } else if (dev->blocked() == BST_DOING_ACQUIRE) {
982 dir->fsend(_("3923 Device \"%s\" is busy in acquire.\n"),
985 } else if (dev->blocked() == BST_WRITING_LABEL) {
986 dir->fsend(_("3914 Device \"%s\" is being labeled.\n"),
989 } else if (dev->is_busy()) {
990 send_dir_busy_message(dir, dev);
991 } else { /* device not being used */
992 Dmsg0(90, "Device not in use, releasing\n");
993 dcr->release_volume();
994 dir->fsend(_("3022 Device \"%s\" released.\n"),
1000 dir->fsend(_("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
1003 /* NB dir->msg gets clobbered in bnet_fsend, so save command */
1004 pm_strcpy(jcr->errmsg, dir->msg);
1005 dir->fsend(_("3927 Error scanning release command: %s\n"), jcr->errmsg);
1007 dir->signal(BNET_EOD);
1011 static pthread_mutex_t bsr_mutex = PTHREAD_MUTEX_INITIALIZER;
1012 static uint32_t bsr_uniq = 0;
1014 static bool get_bootstrap_file(JCR *jcr, BSOCK *sock)
1016 POOLMEM *fname = get_pool_memory(PM_FNAME);
1020 if (jcr->RestoreBootstrap) {
1021 unlink(jcr->RestoreBootstrap);
1022 free_pool_memory(jcr->RestoreBootstrap);
1026 Mmsg(fname, "%s/%s.%s.%d.bootstrap", me->working_directory, me->hdr.name,
1027 jcr->Job, bsr_uniq);
1029 Dmsg1(400, "bootstrap=%s\n", fname);
1030 jcr->RestoreBootstrap = fname;
1031 bs = fopen(fname, "a+b"); /* create file */
1034 Jmsg(jcr, M_FATAL, 0, _("Could not create bootstrap file %s: ERR=%s\n"),
1035 jcr->RestoreBootstrap, be.bstrerror());
1038 Dmsg0(10, "=== Bootstrap file ===\n");
1039 while (sock->recv() >= 0) {
1040 Dmsg1(10, "%s", sock->msg);
1041 fputs(sock->msg, bs);
1044 Dmsg0(10, "=== end bootstrap file ===\n");
1045 jcr->bsr = parse_bsr(jcr, jcr->RestoreBootstrap);
1047 Jmsg(jcr, M_FATAL, 0, _("Error parsing bootstrap file.\n"));
1050 if (debug_level >= 10) {
1051 dump_bsr(jcr->bsr, true);
1053 /* If we got a bootstrap, we are reading, so create read volume list */
1054 create_restore_volume_list(jcr);
1058 unlink(jcr->RestoreBootstrap);
1059 free_pool_memory(jcr->RestoreBootstrap);
1060 jcr->RestoreBootstrap = NULL;
1062 sock->fsend(ERROR_bootstrap);
1065 return sock->fsend(OK_bootstrap);
1068 static bool bootstrap_cmd(JCR *jcr)
1070 return get_bootstrap_file(jcr, jcr->dir_bsock);
1074 * Autochanger command from Director
1076 static bool changer_cmd(JCR *jcr)
1079 BSOCK *dir = jcr->dir_bsock;
1082 const char *cmd = NULL;
1085 * A safe_cmd may call autochanger script but does not load/unload
1086 * slots so it can be done at the same time that the drive is open.
1088 bool safe_cmd = false;
1090 if (sscanf(dir->msg, "autochanger listall %127s", devname.c_str()) == 1) {
1092 safe_cmd = ok = true;
1093 } else if (sscanf(dir->msg, "autochanger list %127s", devname.c_str()) == 1) {
1095 safe_cmd = ok = true;
1096 } else if (sscanf(dir->msg, "autochanger slots %127s", devname.c_str()) == 1) {
1098 safe_cmd = ok = true;
1099 } else if (sscanf(dir->msg, "autochanger drives %127s", devname.c_str()) == 1) {
1101 safe_cmd = ok = true;
1104 dcr = find_device(jcr, devname, -1);
1107 dev->dlock(); /* Use P to avoid indefinite block */
1108 if (!dev->device->changer_res) {
1109 dir->fsend(_("3998 Device \"%s\" is not an autochanger.\n"),
1111 /* Under certain "safe" conditions, we can steal the lock */
1112 } else if (safe_cmd || !dev->is_open() || dev->can_steal_lock()) {
1113 autochanger_cmd(dcr, dir, cmd);
1114 } else if (dev->is_busy() || dev->is_blocked()) {
1115 send_dir_busy_message(dir, dev);
1116 } else { /* device not being used */
1117 autochanger_cmd(dcr, dir, cmd);
1122 dir->fsend(_("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
1124 } else { /* error on scanf */
1125 pm_strcpy(jcr->errmsg, dir->msg);
1126 dir->fsend(_("3908 Error scanning autochanger drives/list/slots command: %s\n"),
1129 dir->signal(BNET_EOD);
1134 * Read and return the Volume label
1136 static bool readlabel_cmd(JCR *jcr)
1139 BSOCK *dir = jcr->dir_bsock;
1142 int32_t Slot, drive;
1144 if (sscanf(dir->msg, "readlabel %127s Slot=%d drive=%d", devname.c_str(),
1145 &Slot, &drive) == 3) {
1146 dcr = find_device(jcr, devname, drive);
1149 dev->dlock(); /* Use P to avoid indefinite block */
1150 if (!dev->is_open()) {
1151 read_volume_label(jcr, dcr, dev, Slot);
1153 /* Under certain "safe" conditions, we can steal the lock */
1154 } else if (dev->can_steal_lock()) {
1155 read_volume_label(jcr, dcr, dev, Slot);
1156 } else if (dev->is_busy() || dev->is_blocked()) {
1157 send_dir_busy_message(dir, dev);
1158 } else { /* device not being used */
1159 read_volume_label(jcr, dcr, dev, Slot);
1164 dir->fsend(_("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
1167 pm_strcpy(jcr->errmsg, dir->msg);
1168 dir->fsend(_("3909 Error scanning readlabel command: %s\n"), jcr->errmsg);
1170 dir->signal(BNET_EOD);
1176 * Read the tape label
1178 * Enter with the mutex set
1180 static void read_volume_label(JCR *jcr, DCR *dcr, DEVICE *dev, int Slot)
1182 BSOCK *dir = jcr->dir_bsock;
1186 steal_device_lock(dev, &hold, BST_WRITING_LABEL);
1188 if (!try_autoload_device(jcr, dcr, Slot, "")) {
1189 goto bail_out; /* error */
1192 dev->clear_labeled(); /* force read of label */
1193 switch (read_dev_volume_label(dcr)) {
1195 /* DO NOT add quotes around the Volume name. It is scanned in the DIR */
1196 dir->fsend(_("3001 Volume=%s Slot=%d\n"), dev->VolHdr.VolumeName, Slot);
1197 Dmsg1(100, "Volume: %s\n", dev->VolHdr.VolumeName);
1200 dir->fsend(_("3902 Cannot mount Volume on Storage Device \"%s\" because:\n%s"),
1201 dev->print_name(), jcr->errmsg);
1206 give_back_device_lock(dev, &hold);
1210 static bool try_autoload_device(JCR *jcr, DCR *dcr, int slot, const char *VolName)
1212 BSOCK *dir = jcr->dir_bsock;
1214 bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
1215 dcr->VolCatInfo.Slot = slot;
1216 dcr->VolCatInfo.InChanger = slot > 0;
1217 if (autoload_device(dcr, 0, dir) < 0) { /* autoload if possible */
1223 static void send_dir_busy_message(BSOCK *dir, DEVICE *dev)
1225 if (dev->is_blocked()) {
1226 switch (dev->blocked()) {
1228 dir->fsend(_("3931 Device \"%s\" is BLOCKED. user unmounted.\n"),
1231 case BST_UNMOUNTED_WAITING_FOR_SYSOP:
1232 dir->fsend(_("3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/mount.\n"),
1235 case BST_WAITING_FOR_SYSOP:
1236 dir->fsend(_("3933 Device \"%s\" is BLOCKED waiting for media.\n"),
1239 case BST_DOING_ACQUIRE:
1240 dir->fsend(_("3934 Device \"%s\" is being initialized.\n"),
1243 case BST_WRITING_LABEL:
1244 dir->fsend(_("3935 Device \"%s\" is blocked labeling a Volume.\n"),
1248 dir->fsend(_("3935 Device \"%s\" is blocked for unknown reason.\n"),
1252 } else if (dev->can_read()) {
1253 dir->fsend(_("3936 Device \"%s\" is busy reading.\n"),
1254 dev->print_name());;
1256 dir->fsend(_("3937 Device \"%s\" is busy with writers=%d reserved=%d.\n"),
1257 dev->print_name(), dev->num_writers, dev->num_reserved());