]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/dircmd.c
dad767bfc082be72825e4a1c0bbb40fba3d39091
[bacula/bacula] / bacula / src / stored / dircmd.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2001-2007 Free Software Foundation Europe e.V.
5
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 two of the GNU General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
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.
17
18    You should have received a copy of the GNU 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
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of John Walker.
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.
27 */
28 /*
29  *  This file handles accepting Director Commands
30  *
31  *    Most Director commands are handled here, with the
32  *    exception of the Job command command and subsequent
33  *    subcommands that are handled
34  *    in job.c.
35  *
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!!!!
41  *
42  *    File daemon commands are handled in fdcmd.c
43  *
44  *     Kern Sibbald, May MMI
45  *
46  *   Version $Id$
47  *
48  */
49
50 #include "bacula.h"
51 #include "stored.h"
52
53 /* Exported variables */
54
55 /* Imported variables */
56 extern BSOCK *filed_chan;
57 extern int r_first, r_last;
58 extern struct s_res resources[];
59 extern struct s_last_job last_job;
60 extern bool init_done;
61
62 /* Static variables */
63 static char derrmsg[]     = "3900 Invalid command\n";
64 static char OKsetdebug[]  = "3000 OK setdebug=%d\n";
65 static char invalid_cmd[] = "3997 Invalid command for a Director with Monitor directive enabled.\n";
66
67 /* Imported functions */
68 extern void terminate_child();
69 extern bool job_cmd(JCR *jcr);
70 extern bool use_cmd(JCR *jcr);
71 extern bool run_cmd(JCR *jcr);
72 extern bool status_cmd(JCR *sjcr);
73 extern bool qstatus_cmd(JCR *jcr);
74 //extern bool query_cmd(JCR *jcr);
75
76 /* Forward referenced functions */
77 static bool label_cmd(JCR *jcr);
78 static bool die_cmd(JCR *jcr);
79 static bool relabel_cmd(JCR *jcr);
80 static bool readlabel_cmd(JCR *jcr);
81 static bool release_cmd(JCR *jcr);
82 static bool setdebug_cmd(JCR *jcr);
83 static bool cancel_cmd(JCR *cjcr);
84 static bool mount_cmd(JCR *jcr);
85 static bool unmount_cmd(JCR *jcr);
86 static bool bootstrap_cmd(JCR *jcr);
87 static bool changer_cmd(JCR *sjcr);
88 static bool do_label(JCR *jcr, int relabel);
89 static DCR *find_device(JCR *jcr, POOL_MEM &dev_name, int drive);
90 static void read_volume_label(JCR *jcr, DCR *dcr, DEVICE *dev, int Slot);
91 static void label_volume_if_ok(DCR *dcr, char *oldname,
92                                char *newname, char *poolname,
93                                int Slot, int relabel);
94 static bool try_autoload_device(JCR *jcr, DCR *dcr, int slot, const char *VolName);
95 static void send_dir_busy_message(BSOCK *dir, DEVICE *dev);
96
97 struct s_cmds {
98    const char *cmd;
99    bool (*func)(JCR *jcr);
100    int monitoraccess; /* specify if monitors have access to this function */
101 };
102
103 /*
104  * The following are the recognized commands from the Director.
105  */
106 static struct s_cmds cmds[] = {
107    {"JobId=",      job_cmd,         0},     /* start Job */
108    {"autochanger", changer_cmd,     0},
109    {"bootstrap",   bootstrap_cmd,   0},
110    {"cancel",      cancel_cmd,      0},
111    {".die",        die_cmd,         0},
112    {"label",       label_cmd,       0},     /* label a tape */
113    {"mount",       mount_cmd,       0},
114    {"readlabel",   readlabel_cmd,   0},
115    {"release",     release_cmd,     0},
116    {"relabel",     relabel_cmd,     0},     /* relabel a tape */
117    {"setdebug=",   setdebug_cmd,    0},     /* set debug level */
118    {"status",      status_cmd,      1},
119    {".status",     qstatus_cmd,     1},
120    {"unmount",     unmount_cmd,     0},
121    {"use storage=", use_cmd,        0},
122    {"run",         run_cmd,         0},
123 // {"query",       query_cmd,       0},
124    {NULL,        NULL}                      /* list terminator */
125 };
126
127
128 /*
129  * Connection request. We accept connections either from the
130  *  Director or a Client (File daemon).
131  *
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.
135  *
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
143  */
144 void *handle_connection_request(void *arg)
145 {
146    BSOCK *bs = (BSOCK *)arg;
147    JCR *jcr;
148    int i;
149    bool found, quit;
150    int bnet_stat = 0;
151    char name[MAX_NAME_LENGTH];
152
153    if (bs->recv() <= 0) {
154       Emsg0(M_ERROR, 0, _("Connection request failed.\n"));
155       bnet_close(bs);
156       return NULL;
157    }
158
159    /*
160     * Do a sanity check on the message received
161     */
162    if (bs->msglen < 25 || bs->msglen > (int)sizeof(name)-25) {
163       Emsg1(M_ERROR, 0, _("Invalid connection. Len=%d\n"), bs->msglen);
164       bnet_close(bs);
165       return NULL;
166    }
167    /*
168     * See if this is a File daemon connection. If so
169     *   call FD handler.
170     */
171    Dmsg1(110, "Conn: %s", bs->msg);
172    if (sscanf(bs->msg, "Hello Start Job %127s", name) == 1) {
173       Dmsg0(110, "Got a FD connection\n");
174       handle_filed_connection(bs, name);
175       return NULL;
176    }
177
178    /* 
179     * This is a connection from the Director, so setup a JCR 
180     */
181    Dmsg0(110, "Got a DIR connection\n");
182    jcr = new_jcr(sizeof(JCR), stored_free_jcr); /* create Job Control Record */
183    jcr->dir_bsock = bs;               /* save Director bsock */
184    jcr->dir_bsock->set_jcr(jcr);
185    jcr->dcrs = New(alist(10, not_owned_by_alist));
186    /* Initialize FD start condition variable */
187    int errstat = pthread_cond_init(&jcr->job_start_wait, NULL);
188    if (errstat != 0) {
189       Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), strerror(errstat));
190       goto bail_out;
191    }
192
193    Dmsg0(1000, "stored in start_job\n");
194
195    /*
196     * Authenticate the Director
197     */
198    if (!authenticate_director(jcr)) {
199       Jmsg(jcr, M_FATAL, 0, _("Unable to authenticate Director\n"));
200       goto bail_out;
201    }
202    Dmsg0(90, "Message channel init completed.\n");
203
204    for (quit=false; !quit;) {
205       /* Read command */
206       if ((bnet_stat = bs->recv()) <= 0) {
207          break;               /* connection terminated */
208       }
209       Dmsg1(199, "<dird: %s\n", bs->msg);
210       /* Ensure that device initialization is complete */
211       while (!init_done) {
212          bmicrosleep(1, 0);
213       }
214       found = false;
215       for (i=0; cmds[i].cmd; i++) {
216         if (strncmp(cmds[i].cmd, bs->msg, strlen(cmds[i].cmd)) == 0) {
217            if ((!cmds[i].monitoraccess) && (jcr->director->monitor)) {
218               Dmsg1(100, "Command \"%s\" is invalid.\n", cmds[i].cmd);
219               bnet_fsend(bs, invalid_cmd);
220               bs->signal(BNET_EOD);
221               break;
222            }
223            Dmsg1(200, "Do command: %s\n", cmds[i].cmd);
224            if (!cmds[i].func(jcr)) { /* do command */
225               quit = true; /* error, get out */
226               Dmsg1(190, "Command %s reqeusts quit\n", cmds[i].cmd);
227            }
228            found = true;             /* indicate command found */
229            break;
230         }
231       }
232       if (!found) {                   /* command not found */
233         bnet_fsend(bs, derrmsg);
234         break;
235       }
236    }
237 bail_out:
238    generate_daemon_event(jcr, "JobEnd");
239    dequeue_messages(jcr);             /* send any queued messages */
240    bnet_sig(bs, BNET_TERMINATE);
241    free_jcr(jcr);
242    return NULL;
243 }
244
245
246 /*
247  * Force SD to die, and hopefully dump itself.  Turned on only
248  *  in development version.
249  */
250 static bool die_cmd(JCR *jcr)
251 {
252 #ifdef DEVELOPER
253    JCR *djcr = NULL;
254    int a;
255    Pmsg0(000, "I have been requested to die ...");
256    a = djcr->JobId;   /* ref NULL pointer */
257 #endif
258    return 0;
259 }
260
261      
262
263 /*
264  * Set debug level as requested by the Director
265  *
266  */
267 static bool setdebug_cmd(JCR *jcr)
268 {
269    BSOCK *dir = jcr->dir_bsock;
270    int level, trace_flag;
271
272    Dmsg1(10, "setdebug_cmd: %s", dir->msg);
273    if (sscanf(dir->msg, "setdebug=%d trace=%d", &level, &trace_flag) != 2 || level < 0) {
274       bnet_fsend(dir, _("3991 Bad setdebug command: %s\n"), dir->msg);
275       return 0;
276    }
277    debug_level = level;
278    set_trace(trace_flag);
279    return bnet_fsend(dir, OKsetdebug, level);
280 }
281
282
283 /*
284  * Cancel a Job
285  */
286 static bool cancel_cmd(JCR *cjcr)
287 {
288    BSOCK *dir = cjcr->dir_bsock;
289    int oldStatus;
290    char Job[MAX_NAME_LENGTH];
291    JCR *jcr;
292
293    if (sscanf(dir->msg, "cancel Job=%127s", Job) == 1) {
294       if (!(jcr=get_jcr_by_full_name(Job))) {
295          bnet_fsend(dir, _("3904 Job %s not found.\n"), Job);
296       } else {
297          oldStatus = jcr->JobStatus;
298          set_jcr_job_status(jcr, JS_Canceled);
299          if (!jcr->authenticated && oldStatus == JS_WaitFD) {
300             pthread_cond_signal(&jcr->job_start_wait); /* wake waiting thread */
301          }
302          if (jcr->file_bsock) {
303             bnet_sig(jcr->file_bsock, BNET_TERMINATE);
304          } else {
305             /* Still waiting for FD to connect, release it */
306             pthread_cond_signal(&jcr->job_start_wait); /* wake waiting job */
307          }
308          /* If thread waiting on mount, wake him */
309          if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->waiting_for_mount()) {
310             pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
311             Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId);
312             pthread_cond_broadcast(&wait_device_release);
313          }
314          if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->waiting_for_mount()) {
315             pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol);
316             Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId);
317             pthread_cond_broadcast(&wait_device_release);
318          }
319          Jmsg(jcr, M_INFO, 0, _("Job %s marked to be canceled.\n"), jcr->Job);
320          bnet_fsend(dir, _("3000 Job %s marked to be canceled.\n"), jcr->Job);
321          free_jcr(jcr);
322       }
323    } else {
324       bnet_fsend(dir, _("3903 Error scanning cancel command.\n"));
325    }
326    bnet_sig(dir, BNET_EOD);
327    return 1;
328 }
329
330 /*
331  * Label a Volume
332  *
333  */
334 static bool label_cmd(JCR *jcr)
335 {
336    return do_label(jcr, 0);
337 }
338
339 static bool relabel_cmd(JCR *jcr)
340 {
341    return do_label(jcr, 1);
342 }
343
344 static bool do_label(JCR *jcr, int relabel)
345 {
346    POOLMEM *newname, *oldname, *poolname, *mtype;
347    POOL_MEM dev_name;
348    BSOCK *dir = jcr->dir_bsock;
349    DCR *dcr;
350    DEVICE *dev;
351    bool ok = false;
352    int slot;
353    int drive;
354
355    newname = get_memory(dir->msglen+1);
356    oldname = get_memory(dir->msglen+1);
357    poolname = get_memory(dir->msglen+1);
358    mtype = get_memory(dir->msglen+1);
359    if (relabel) {
360       if (sscanf(dir->msg, "relabel %127s OldName=%127s NewName=%127s PoolName=%127s "
361                  "MediaType=%127s Slot=%d drive=%d",
362                   dev_name.c_str(), oldname, newname, poolname, mtype, 
363                   &slot, &drive) == 7) {
364          ok = true;
365       }
366    } else {
367       *oldname = 0;
368       if (sscanf(dir->msg, "label %127s VolumeName=%127s PoolName=%127s "
369                  "MediaType=%127s Slot=%d drive=%d", 
370           dev_name.c_str(), newname, poolname, mtype, &slot, &drive) == 6) {
371          ok = true;
372       }
373    }
374    if (ok) {
375       unbash_spaces(newname);
376       unbash_spaces(oldname);
377       unbash_spaces(poolname);
378       unbash_spaces(mtype);
379       dcr = find_device(jcr, dev_name, drive);
380       if (dcr) {
381          dev = dcr->dev;
382          dev->dlock();                 /* Use P to avoid indefinite block */
383          if (!dev->is_open()) {
384             Dmsg1(400, "Can %slabel. Device is not open\n", relabel?"re":"");
385             label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
386             dev->close();
387          /* Under certain "safe" conditions, we can steal the lock */
388          } else if (dev->can_steal_lock()) {
389             Dmsg0(400, "Can relabel. can_steal_lock\n");
390             label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
391          } else if (dev->is_busy() || dev->is_blocked()) {
392             send_dir_busy_message(dir, dev);
393          } else {                     /* device not being used */
394             Dmsg0(400, "Can relabel. device not used\n");
395             label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
396          }
397          dev->dunlock();
398          free_dcr(dcr);
399       } else {
400          bnet_fsend(dir, _("3999 Device \"%s\" not found or could not be opened.\n"), dev_name.c_str());
401       }
402    } else {
403       /* NB dir->msg gets clobbered in bnet_fsend, so save command */
404       pm_strcpy(jcr->errmsg, dir->msg);
405       bnet_fsend(dir, _("3903 Error scanning label command: %s\n"), jcr->errmsg);
406    }
407    free_memory(oldname);
408    free_memory(newname);
409    free_memory(poolname);
410    free_memory(mtype);
411    bnet_sig(dir, BNET_EOD);
412    return true;
413 }
414
415 /*
416  * Read the tape label and determine if we can safely
417  * label the tape (not a Bacula volume), then label it.
418  *
419  *  Enter with the mutex set
420  */
421 static void label_volume_if_ok(DCR *dcr, char *oldname,
422                                char *newname, char *poolname,
423                                int slot, int relabel)
424 {
425    BSOCK *dir = dcr->jcr->dir_bsock;
426    bsteal_lock_t hold;
427    DEVICE *dev = dcr->dev;
428    int label_status;
429    int mode;
430    const char *volname = (relabel == 1) ? oldname : newname;
431    char ed1[50];
432
433    steal_device_lock(dev, &hold, BST_WRITING_LABEL);
434    Dmsg1(100, "Stole device %s lock, writing label.\n", dev->print_name());
435
436
437    Dmsg0(90, "try_autoload_device - looking for volume_info\n");
438    if (!try_autoload_device(dcr->jcr, dcr, slot, volname)) {
439       goto bail_out;                  /* error */
440    }
441
442    /* Ensure that the device is open -- autoload_device() closes it */
443    if (dev->is_tape()) {
444       mode = OPEN_READ_WRITE;
445    } else {
446       mode = CREATE_READ_WRITE;
447    }
448
449    if (relabel) {
450       dev->truncating = true;         /* let open() know we will truncate it */
451    }
452    /* Set old volume name for open if relabeling */
453    bstrncpy(dcr->VolCatInfo.VolCatName, volname, sizeof(dcr->VolCatInfo.VolCatName));
454    if (dev->open(dcr, mode) < 0) {
455       bnet_fsend(dir, _("3910 Unable to open device %s: ERR=%s\n"),
456          dev->print_name(), dev->strerror());
457       goto bail_out;      
458    }
459
460    /* See what we have for a Volume */
461    label_status = read_dev_volume_label(dcr);
462    
463    /* Set new volume name */
464    bstrncpy(dcr->VolCatInfo.VolCatName, newname, sizeof(dcr->VolCatInfo.VolCatName));
465    switch(label_status) {
466    case VOL_NAME_ERROR:
467    case VOL_VERSION_ERROR:
468    case VOL_LABEL_ERROR:
469    case VOL_OK:
470       if (!relabel) {
471          bnet_fsend(dir, _(
472             "3920 Cannot label Volume because it is already labeled: \"%s\"\n"),
473              dev->VolHdr.VolumeName);
474          break;
475       }
476
477       /* Relabel request. If oldname matches, continue */
478       if (strcmp(oldname, dev->VolHdr.VolumeName) != 0) {
479          bnet_fsend(dir, _("3921 Wrong volume mounted.\n"));
480          break;
481       }
482       if (dev->label_type != B_BACULA_LABEL) {
483          bnet_fsend(dir, _("3922 Cannot relabel an ANSI/IBM labeled Volume.\n"));
484          break;
485       }
486       /* Fall through wanted! */
487    case VOL_IO_ERROR:
488    case VOL_NO_LABEL:
489       if (!write_new_volume_label_to_dev(dcr, newname, poolname, 
490            relabel, true /* write dvd now */)) {
491          bnet_fsend(dir, _("3912 Failed to label Volume: ERR=%s\n"), dev->bstrerror());
492          break;
493       }
494       bstrncpy(dcr->VolumeName, newname, sizeof(dcr->VolumeName));
495       /* The following 3000 OK label. string is scanned in ua_label.c */
496       bnet_fsend(dir, "3000 OK label. VolBytes=%s DVD=%d Volume=\"%s\" Device=%s\n",
497                  edit_uint64(dev->VolCatInfo.VolCatBytes, ed1),
498                  dev->is_dvd()?1:0, newname, dev->print_name());
499       break;
500    case VOL_NO_MEDIA:
501       bnet_fsend(dir, _("3914 Failed to label Volume (no media): ERR=%s\n"), dev->bstrerror());
502       break;
503    default:
504       bnet_fsend(dir, _("3913 Cannot label Volume. "
505 "Unknown status %d from read_volume_label()\n"), label_status);
506       break;
507    }
508
509 bail_out:
510    if (!dev->is_open()) {
511       dev->clear_volhdr();
512    }
513    give_back_device_lock(dev, &hold);
514    return;
515 }
516
517
518 /*
519  * Read the tape label
520  *
521  *  Enter with the mutex set
522  */
523 static bool read_label(DCR *dcr)
524 {
525    int ok;
526    JCR *jcr = dcr->jcr;
527    BSOCK *dir = jcr->dir_bsock;
528    bsteal_lock_t hold;
529    DEVICE *dev = dcr->dev;
530
531    steal_device_lock(dev, &hold, BST_DOING_ACQUIRE);
532
533    dcr->VolumeName[0] = 0;
534    dev->clear_labeled();              /* force read of label */
535    switch (read_dev_volume_label(dcr)) {
536    case VOL_OK:
537       bnet_fsend(dir, _("3001 Mounted Volume: %s\n"), dev->VolHdr.VolumeName);
538       ok = true;
539       break;
540    default:
541       bnet_fsend(dir, _("3902 Cannot mount Volume on Storage Device %s because:\n%s"),
542          dev->print_name(), jcr->errmsg);
543       ok = false;
544       break;
545    }
546    give_back_device_lock(dev, &hold);
547    return ok;
548 }
549
550 /* 
551  * Searches for device by name, and if found, creates a dcr and
552  *  returns it.
553  */
554 static DCR *find_device(JCR *jcr, POOL_MEM &devname, int drive)
555 {
556    DEVRES *device;
557    AUTOCHANGER *changer;
558    bool found = false;
559    DCR *dcr = NULL;
560
561    unbash_spaces(devname);
562    foreach_res(device, R_DEVICE) {
563       /* Find resource, and make sure we were able to open it */
564       if (strcmp(device->hdr.name, devname.c_str()) == 0) {
565          if (!device->dev) {
566             device->dev = init_dev(jcr, device);
567          }
568          if (!device->dev) {
569             Jmsg(jcr, M_WARNING, 0, _("\n"
570                "     Device \"%s\" requested by DIR could not be opened or does not exist.\n"),
571                  devname.c_str());
572             continue;
573          }
574          Dmsg1(20, "Found device %s\n", device->hdr.name);
575          found = true;
576          break;
577       }
578    }
579    if (!found) {
580       foreach_res(changer, R_AUTOCHANGER) {
581          /* Find resource, and make sure we were able to open it */
582          if (strcmp(devname.c_str(), changer->hdr.name) == 0) {
583             /* Try each device in this AutoChanger */
584             foreach_alist(device, changer->device) {
585                Dmsg1(100, "Try changer device %s\n", device->hdr.name);
586                if (!device->dev) {
587                   device->dev = init_dev(jcr, device);
588                }
589                if (!device->dev) {
590                   Dmsg1(100, "Device %s could not be opened. Skipped\n", devname.c_str());
591                   Jmsg(jcr, M_WARNING, 0, _("\n"
592                      "     Device \"%s\" in changer \"%s\" requested by DIR could not be opened or does not exist.\n"),
593                        device->hdr.name, devname.c_str());
594                   continue;
595                }
596                if (!device->dev->autoselect) {
597                   Dmsg1(100, "Device %s not autoselect skipped.\n", devname.c_str());
598                   continue;              /* device is not available */
599                }
600                if (drive < 0 || drive == (int)device->dev->drive_index) {
601                   Dmsg1(20, "Found changer device %s\n", device->hdr.name);
602                   found = true;
603                   break;
604                }
605                Dmsg3(100, "Device %s drive wrong: want=%d got=%d skipping\n",
606                   devname.c_str(), drive, (int)device->dev->drive_index);
607             }
608             break;                    /* we found it but could not open a device */
609          }
610       }
611    }
612
613    if (found) {
614       Dmsg1(100, "Found device %s\n", device->hdr.name);
615       dcr = new_dcr(jcr, NULL, device->dev);
616       dcr->device = device;
617    }
618    return dcr;
619 }
620
621
622 /*
623  * Mount command from Director
624  */
625 static bool mount_cmd(JCR *jcr)
626 {
627    POOL_MEM devname;
628    BSOCK *dir = jcr->dir_bsock;
629    DEVICE *dev;
630    DCR *dcr;
631    int drive;
632    int slot = 0;
633    bool ok;
634
635    ok = sscanf(dir->msg, "mount %127s drive=%d slot=%d", devname.c_str(), 
636                &drive, &slot) == 3;
637    if (!ok) {
638       ok = sscanf(dir->msg, "mount %127s drive=%d", devname.c_str(), &drive) == 2;
639    }
640    if (ok) {
641       dcr = find_device(jcr, devname, drive);
642       if (dcr) {
643          dev = dcr->dev;
644          dev->dlock();                 /* Use P to avoid indefinite block */
645          Dmsg1(100, "mount cmd blocked=%d\n", dev->blocked());
646          switch (dev->blocked()) {         /* device blocked? */
647          case BST_WAITING_FOR_SYSOP:
648             /* Someone is waiting, wake him */
649             Dmsg0(100, "Waiting for mount. Attempting to wake thread\n");
650             dev->set_blocked(BST_MOUNT);
651             bnet_fsend(dir, "3001 OK mount. Device=%s\n", 
652                dev->print_name());
653             pthread_cond_broadcast(&dev->wait_next_vol);
654             Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
655             pthread_cond_broadcast(&wait_device_release);
656             break;
657
658          /* In both of these two cases, we (the user) unmounted the Volume */
659          case BST_UNMOUNTED_WAITING_FOR_SYSOP:
660          case BST_UNMOUNTED:
661             if (dev->is_autochanger() && slot > 0) {
662                try_autoload_device(jcr, dcr, slot, "");
663             }
664             /* We freed the device, so reopen it and wake any waiting threads */
665             if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
666                bnet_fsend(dir, _("3901 open device failed: ERR=%s\n"),
667                   dev->bstrerror());
668                if (dev->blocked() == BST_UNMOUNTED) {
669                   /* We blocked the device, so unblock it */
670                   Dmsg0(100, "Unmounted. Unblocking device\n");
671                   unblock_device(dev);
672                }
673                break;
674             }
675             read_dev_volume_label(dcr);
676             if (dev->blocked() == BST_UNMOUNTED) {
677                /* We blocked the device, so unblock it */
678                Dmsg0(100, "Unmounted. Unblocking device\n");
679                read_label(dcr);       /* this should not be necessary */
680                unblock_device(dev);
681             } else {
682                Dmsg0(100, "Unmounted waiting for mount. Attempting to wake thread\n");
683                dev->set_blocked(BST_MOUNT);
684             }
685             if (dev->is_labeled()) {
686                bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"),
687                   dev->print_name(), dev->VolHdr.VolumeName);
688             } else {
689                bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
690                                  "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
691                           dev->print_name());
692             }
693             pthread_cond_broadcast(&dev->wait_next_vol);
694             Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
695             pthread_cond_broadcast(&wait_device_release);
696             break;
697
698          case BST_DOING_ACQUIRE:
699             bnet_fsend(dir, _("3001 Device %s is doing acquire.\n"),
700                        dev->print_name());
701             break;
702
703          case BST_WRITING_LABEL:
704             bnet_fsend(dir, _("3903 Device %s is being labeled.\n"), 
705                dev->print_name());
706             break;
707
708          case BST_NOT_BLOCKED:
709             if (dev->is_autochanger() && slot > 0) {
710                try_autoload_device(jcr, dcr, slot, "");
711             }
712             if (dev->is_open()) {
713                if (dev->is_labeled()) {
714                   bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"),
715                      dev->print_name(), dev->VolHdr.VolumeName);
716                } else {
717                   bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
718                                  "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
719                              dev->print_name());
720                }
721             } else if (dev->is_tape()) {
722                if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
723                   bnet_fsend(dir, _("3901 open device failed: ERR=%s\n"),
724                      dev->bstrerror());
725                   break;
726                }
727                read_label(dcr);
728                if (dev->is_labeled()) {
729                   bnet_fsend(dir, _("3001 Device %s is already mounted with Volume \"%s\"\n"),
730                      dev->print_name(), dev->VolHdr.VolumeName);
731                } else {
732                   bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n"
733                                     "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
734                              dev->print_name());
735                }
736             } else if (dev->is_unmountable()) {
737                if (dev->mount(1)) {
738                   bnet_fsend(dir, _("3002 Device %s is mounted.\n"), 
739                      dev->print_name());
740                } else {
741                   bnet_fsend(dir, _("3907 %s"), dev->bstrerror());
742                } 
743             } else { /* must be file */
744                bnet_fsend(dir, _("3906 File device %s is always mounted.\n"),
745                   dev->print_name());
746             }
747             break;
748
749          default:
750             bnet_fsend(dir, _("3905 Bizarre wait state %d\n"), dev->blocked());
751             break;
752          }
753          dev->dunlock();
754          free_dcr(dcr);
755       } else {
756          bnet_fsend(dir, _("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
757       }
758    } else {
759       pm_strcpy(jcr->errmsg, dir->msg);
760       bnet_fsend(dir, _("3909 Error scanning mount command: %s\n"), jcr->errmsg);
761    }
762    bnet_sig(dir, BNET_EOD);
763    return true;
764 }
765
766 /*
767  * unmount command from Director
768  */
769 static bool unmount_cmd(JCR *jcr)
770 {
771    POOL_MEM devname;
772    BSOCK *dir = jcr->dir_bsock;
773    DEVICE *dev;
774    DCR *dcr;
775    int drive;
776
777    if (sscanf(dir->msg, "unmount %127s drive=%d", devname.c_str(), &drive) == 2) {
778       dcr = find_device(jcr, devname, drive);
779       if (dcr) {
780          dev = dcr->dev;
781          dev->dlock();                 /* Use P to avoid indefinite block */
782          if (!dev->is_open()) {
783             if (!dev->is_busy()) {
784                unload_autochanger(dcr, -1);          
785             }
786             if (dev->is_unmountable()) {
787                if (dev->unmount(0)) {
788                   bnet_fsend(dir, _("3002 Device %s unmounted.\n"), 
789                      dev->print_name());
790                } else {
791                   bnet_fsend(dir, _("3907 %s"), dev->bstrerror());
792                } 
793             } else {
794                Dmsg0(90, "Device already unmounted\n");
795                bnet_fsend(dir, _("3901 Device %s is already unmounted.\n"), 
796                   dev->print_name());
797             }
798          } else if (dev->blocked() == BST_WAITING_FOR_SYSOP) {
799             Dmsg2(90, "%d waiter dev_block=%d. doing unmount\n", dev->num_waiting,
800                dev->blocked());
801             if (!unload_autochanger(dcr, -1)) {
802                /* ***FIXME**** what is this ????  */
803                dev->close();
804             }
805             if (dev->is_unmountable() && !dev->unmount(0)) {
806                bnet_fsend(dir, _("3907 %s"), dev->bstrerror());
807             } else {
808                dev->set_blocked(BST_UNMOUNTED_WAITING_FOR_SYSOP);
809                bnet_fsend(dir, _("3001 Device %s unmounted.\n"), 
810                   dev->print_name());
811             }
812
813          } else if (dev->blocked() == BST_DOING_ACQUIRE) {
814             bnet_fsend(dir, _("3902 Device %s is busy in acquire.\n"), 
815                dev->print_name());
816
817          } else if (dev->blocked() == BST_WRITING_LABEL) {
818             bnet_fsend(dir, _("3903 Device %s is being labeled.\n"), 
819                dev->print_name());
820
821          } else if (dev->is_busy()) {
822             send_dir_busy_message(dir, dev);
823          } else {                     /* device not being used */
824             Dmsg0(90, "Device not in use, unmounting\n");
825             /* On FreeBSD, I am having ASSERT() failures in block_device()
826              * and I can only imagine that the thread id that we are
827              * leaving in no_wait_id is being re-used. So here,
828              * we simply do it by hand.  Gross, but a solution.
829              */
830             /*  block_device(dev, BST_UNMOUNTED); replace with 2 lines below */
831             dev->set_blocked(BST_UNMOUNTED);
832             dev->no_wait_id = 0;
833             if (!unload_autochanger(dcr, -1)) {
834                dev->close();
835             }
836             if (dev->is_unmountable() && !dev->unmount(0)) {
837                bnet_fsend(dir, _("3907 %s"), dev->bstrerror());
838             } else {
839                bnet_fsend(dir, _("3002 Device %s unmounted.\n"), 
840                   dev->print_name());
841             }
842          }
843          dev->dunlock();
844          free_dcr(dcr);
845       } else {
846          bnet_fsend(dir, _("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
847       }
848    } else {
849       /* NB dir->msg gets clobbered in bnet_fsend, so save command */
850       pm_strcpy(jcr->errmsg, dir->msg);
851       bnet_fsend(dir, _("3907 Error scanning unmount command: %s\n"), jcr->errmsg);
852    }
853    bnet_sig(dir, BNET_EOD);
854    return true;
855 }
856
857 /*
858  * Release command from Director. This rewinds the device and if
859  *   configured does a offline and ensures that Bacula will
860  *   re-read the label of the tape before continuing. This gives
861  *   the operator the chance to change the tape anytime before the
862  *   next job starts.
863  */
864 static bool release_cmd(JCR *jcr)
865 {
866    POOL_MEM devname;
867    BSOCK *dir = jcr->dir_bsock;
868    DEVICE *dev;
869    DCR *dcr;
870    int drive;
871
872    if (sscanf(dir->msg, "release %127s drive=%d", devname.c_str(), &drive) == 2) {
873       dcr = find_device(jcr, devname, drive);
874       if (dcr) {
875          dev = dcr->dev;
876          dev->dlock();                 /* Use P to avoid indefinite block */
877          if (!dev->is_open()) {
878             if (!dev->is_busy()) {
879                unload_autochanger(dcr, -1);
880             }
881             Dmsg0(90, "Device already released\n");
882             bnet_fsend(dir, _("3921 Device %s already released.\n"), 
883                dev->print_name());
884
885          } else if (dev->blocked() == BST_WAITING_FOR_SYSOP) {
886             Dmsg2(90, "%d waiter dev_block=%d.\n", dev->num_waiting,
887                dev->blocked());
888             unload_autochanger(dcr, -1);
889             bnet_fsend(dir, _("3922 Device %s waiting for sysop.\n"), 
890                dev->print_name());
891
892          } else if (dev->blocked() == BST_UNMOUNTED_WAITING_FOR_SYSOP) {
893             Dmsg2(90, "%d waiter dev_block=%d. doing unmount\n", dev->num_waiting,
894                dev->blocked());
895             bnet_fsend(dir, _("3922 Device %s waiting for mount.\n"), 
896                dev->print_name());
897
898          } else if (dev->blocked() == BST_DOING_ACQUIRE) {
899             bnet_fsend(dir, _("3923 Device %s is busy in acquire.\n"), 
900                dev->print_name());
901
902          } else if (dev->blocked() == BST_WRITING_LABEL) {
903             bnet_fsend(dir, _("3914 Device %s is being labeled.\n"), 
904                dev->print_name());
905
906          } else if (dev->is_busy()) {
907             send_dir_busy_message(dir, dev);
908          } else {                     /* device not being used */
909             Dmsg0(90, "Device not in use, releaseing\n");
910             unload_autochanger(dcr, -1);
911             release_volume(dcr);
912             bnet_fsend(dir, _("3022 Device %s released.\n"), 
913                dev->print_name());
914          }
915          dev->dunlock();
916          free_dcr(dcr);
917       } else {
918          bnet_fsend(dir, _("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
919       }
920    } else {
921       /* NB dir->msg gets clobbered in bnet_fsend, so save command */
922       pm_strcpy(jcr->errmsg, dir->msg);
923       bnet_fsend(dir, _("3927 Error scanning release command: %s\n"), jcr->errmsg);
924    }
925    bnet_sig(dir, BNET_EOD);
926    return true;
927 }
928
929
930 static bool bootstrap_cmd(JCR *jcr)
931 {
932    return get_bootstrap_file(jcr, jcr->dir_bsock);
933 }
934
935 /*
936  * Autochanger command from Director
937  */
938 static bool changer_cmd(JCR *jcr)
939 {
940    POOL_MEM devname;
941    BSOCK *dir = jcr->dir_bsock;
942    DEVICE *dev;
943    DCR *dcr;
944    const char *cmd = NULL;
945    bool ok = false;
946    /*
947     * A safe_cmd may call autochanger script but does not load/unload
948     *    slots so it can be done at the same time that the drive is open.
949     */
950    bool safe_cmd = false;
951
952    if (sscanf(dir->msg, "autochanger list %127s", devname.c_str()) == 1) {
953       cmd = "list";
954       safe_cmd = ok = true;
955    } else if (sscanf(dir->msg, "autochanger slots %127s", devname.c_str()) == 1) {
956       cmd = "slots";
957       safe_cmd = ok = true;
958    } else if (sscanf(dir->msg, "autochanger drives %127s", devname.c_str()) == 1) {
959       cmd = "drives";
960       safe_cmd = ok = true;
961    }
962    if (ok) {
963       dcr = find_device(jcr, devname, -1);
964       if (dcr) {
965          dev = dcr->dev;
966          dev->dlock();                 /* Use P to avoid indefinite block */
967          if (!dev->device->changer_res) {
968             bnet_fsend(dir, _("3995 Device %s is not an autochanger.\n"), 
969                dev->print_name());
970          /* Under certain "safe" conditions, we can steal the lock */
971          } else if (safe_cmd || !dev->is_open() || dev->can_steal_lock()) {
972             autochanger_cmd(dcr, dir, cmd);
973          } else if (dev->is_busy() || dev->is_blocked()) {
974             send_dir_busy_message(dir, dev);
975          } else {                     /* device not being used */
976             autochanger_cmd(dcr, dir, cmd);
977          }
978          dev->dunlock();
979          free_dcr(dcr);
980       } else {
981          bnet_fsend(dir, _("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
982       }
983    } else {  /* error on scanf */
984       pm_strcpy(jcr->errmsg, dir->msg);
985       bnet_fsend(dir, _("3908 Error scanning autocharger drives/list/slots command: %s\n"),
986          jcr->errmsg);
987    }
988    dir->signal(BNET_EOD);
989    return true;
990 }
991
992 /*
993  * Read and return the Volume label
994  */
995 static bool readlabel_cmd(JCR *jcr)
996 {
997    POOL_MEM devname;
998    BSOCK *dir = jcr->dir_bsock;
999    DEVICE *dev;
1000    DCR *dcr;
1001    int Slot;
1002    int drive;
1003
1004    if (sscanf(dir->msg, "readlabel %127s Slot=%d drive=%d", devname.c_str(), 
1005        &Slot, &drive) == 3) {
1006       dcr = find_device(jcr, devname, drive);
1007       if (dcr) {
1008          dev = dcr->dev;
1009          dev->dlock();                 /* Use P to avoid indefinite block */
1010          if (!dev->is_open()) {
1011             read_volume_label(jcr, dcr, dev, Slot);
1012             dev->close();
1013          /* Under certain "safe" conditions, we can steal the lock */
1014          } else if (dev->can_steal_lock()) {
1015             read_volume_label(jcr, dcr, dev, Slot);
1016          } else if (dev->is_busy() || dev->is_blocked()) {
1017             send_dir_busy_message(dir, dev);
1018          } else {                     /* device not being used */
1019             read_volume_label(jcr, dcr, dev, Slot);
1020          }
1021          dev->dunlock();
1022          free_dcr(dcr);
1023       } else {
1024          bnet_fsend(dir, _("3999 Device \"%s\" not found or could not be opened.\n"), devname.c_str());
1025       }
1026    } else {
1027       pm_strcpy(jcr->errmsg, dir->msg);
1028       bnet_fsend(dir, _("3909 Error scanning readlabel command: %s\n"), jcr->errmsg);
1029    }
1030    dir->signal(BNET_EOD);
1031    return true;
1032 }
1033
1034
1035 /*
1036  * Read the tape label
1037  *
1038  *  Enter with the mutex set
1039  */
1040 static void read_volume_label(JCR *jcr, DCR *dcr, DEVICE *dev, int Slot)
1041 {
1042    BSOCK *dir = jcr->dir_bsock;
1043    bsteal_lock_t hold;
1044
1045    dcr->dev = dev;
1046    steal_device_lock(dev, &hold, BST_WRITING_LABEL);
1047
1048    if (!try_autoload_device(jcr, dcr, Slot, "")) {
1049       goto bail_out;                  /* error */
1050    }
1051
1052    dev->clear_labeled();              /* force read of label */
1053    switch (read_dev_volume_label(dcr)) {
1054    case VOL_OK:
1055       /* DO NOT add quotes around the Volume name. It is scanned in the DIR */
1056       bnet_fsend(dir, _("3001 Volume=%s Slot=%d\n"), dev->VolHdr.VolumeName, Slot);
1057       Dmsg1(100, "Volume: %s\n", dev->VolHdr.VolumeName);
1058       break;
1059    default:
1060       bnet_fsend(dir, _("3902 Cannot mount Volume on Storage Device %s because:\n%s"),
1061                  dev->print_name(), jcr->errmsg);
1062       break;
1063    }
1064
1065 bail_out:
1066    give_back_device_lock(dev, &hold);
1067    return;
1068 }
1069
1070 static bool try_autoload_device(JCR *jcr, DCR *dcr, int slot, const char *VolName)
1071 {
1072    BSOCK *dir = jcr->dir_bsock;
1073
1074    bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
1075    dcr->VolCatInfo.Slot = slot;
1076    dcr->VolCatInfo.InChanger = slot > 0;
1077    if (autoload_device(dcr, 0, dir) < 0) {    /* autoload if possible */
1078       return false;
1079    }
1080    return true;
1081 }
1082
1083 static void send_dir_busy_message(BSOCK *dir, DEVICE *dev)
1084 {
1085    if (dev->is_blocked()) {
1086       switch (dev->blocked()) {
1087       case BST_UNMOUNTED:
1088          bnet_fsend(dir, _("3931 Device %s is BLOCKED. user unmounted.\n"),
1089             dev->print_name());
1090          break;
1091       case BST_UNMOUNTED_WAITING_FOR_SYSOP:
1092          bnet_fsend(dir, _("3932 Device %s is BLOCKED. user unmounted during wait for media/mount.\n"),
1093              dev->print_name());
1094          break;
1095       case BST_WAITING_FOR_SYSOP:
1096          bnet_fsend(dir, _("3933 Device %s is BLOCKED waiting for media.\n"),
1097             dev->print_name());
1098          break;
1099       case BST_DOING_ACQUIRE:
1100          bnet_fsend(dir, _("3934 Device %s is being initialized.\n"),
1101             dev->print_name());
1102          break;
1103       case BST_WRITING_LABEL:
1104          bnet_fsend(dir, _("3935 Device %s is blocked labeling a Volume.\n"),
1105             dev->print_name());
1106          break;
1107       default:
1108          bnet_fsend(dir, _("3935 Device %s is blocked for unknown reason.\n"),
1109             dev->print_name());
1110          break;
1111       }
1112    } else if (dev->can_read()) {
1113        bnet_fsend(dir, _("3936 Device %s is busy reading.\n"),
1114                    dev->print_name());;
1115    } else {
1116        bnet_fsend(dir, _("3937 Device %s is busy with %d writer(s).\n"),
1117           dev->print_name(), dev->num_writers);
1118    }
1119 }