]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/restore.c
Minor tweaks to Migration
[bacula/bacula] / bacula / src / dird / restore.c
index f471392ae3876b45a36b1e987eefc1c861c0fb7c..49b412c5aa08a9fa431b13373982b49603865924 100644 (file)
  *     Open DB
  *     Open Message Channel with Storage daemon to tell him a job will be starting.
  *     Open connection with File daemon and pass him commands
- *      to do the restore.
+ *       to do the restore.
  *     Update the DB according to what files where restored????
  *
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   Copyright (C) 2000-2006 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
@@ -43,20 +43,23 @@ static char storaddr[]     = "storage address=%s port=%d ssl=0\n";
 /* Responses received from File daemon */
 static char OKrestore[]   = "2000 OK restore\n";
 static char OKstore[]     = "2000 OK storage\n";
+static char OKbootstrap[] = "2000 OK bootstrap\n";
 
 /*
  * Do a restore of the specified files
  *
  *  Returns:  0 on failure
- *           1 on success
+ *            1 on success
  */
 bool do_restore(JCR *jcr)
 {
    BSOCK   *fd;
-   JOB_DBR rjr;                      /* restore job record */
+   JOB_DBR rjr;                       /* restore job record */
+
+   free_wstorage(jcr);                /* we don't write */
 
    memset(&rjr, 0, sizeof(rjr));
-   jcr->jr.JobLevel = L_FULL;        /* Full restore */
+   jcr->jr.JobLevel = L_FULL;         /* Full restore */
    if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
       Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
       restore_cleanup(jcr, JS_ErrorTerminated);
@@ -94,10 +97,13 @@ bool do_restore(JCR *jcr)
    /*
     * Now start a job with the Storage daemon
     */
-   if (!start_storage_daemon_job(jcr, jcr->storage, SD_READ)) {
+   if (!start_storage_daemon_job(jcr, jcr->rstorage, NULL)) {
       restore_cleanup(jcr, JS_ErrorTerminated);
       return false;
    }
+   if (!bnet_fsend(jcr->store_bsock, "run")) {
+      return false;
+   }
    /*
     * Now start a Storage daemon message thread
     */
@@ -107,6 +113,7 @@ bool do_restore(JCR *jcr)
    }
    Dmsg0(50, "Storage daemon connection OK\n");
 
+
    /*
     * Start conversation with File daemon
     */
@@ -119,25 +126,15 @@ bool do_restore(JCR *jcr)
    fd = jcr->file_bsock;
    set_jcr_job_status(jcr, JS_Running);
 
-   if (!send_include_list(jcr)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
-   }
-
-   if (!send_exclude_list(jcr)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
-   }
-
    /*
     * send Storage daemon address to the File daemon,
-    *  then wait for File daemon to make connection
-    *  with Storage daemon.
+    *   then wait for File daemon to make connection
+    *   with Storage daemon.
     */
-   if (jcr->store->SDDport == 0) {
-      jcr->store->SDDport = jcr->store->SDport;
+   if (jcr->rstore->SDDport == 0) {
+      jcr->rstore->SDDport = jcr->rstore->SDport;
    }
-   bnet_fsend(fd, storaddr, jcr->store->address, jcr->store->SDDport);
+   bnet_fsend(fd, storaddr, jcr->rstore->address, jcr->rstore->SDDport);
    Dmsg1(6, "dird>filed: %s\n", fd->msg);
    if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) {
       restore_cleanup(jcr, JS_ErrorTerminated);
@@ -147,13 +144,14 @@ bool do_restore(JCR *jcr)
    /*
     * Send the bootstrap file -- what Volumes/files to restore
     */
-   if (!send_bootstrap_file(jcr)) {
+   if (!send_bootstrap_file(jcr, fd) ||
+       !response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
       restore_cleanup(jcr, JS_ErrorTerminated);
       return false;
    }
 
 
-   if (!send_run_before_and_after_commands(jcr)) {
+   if (!send_runscripts_commands(jcr)) {
       restore_cleanup(jcr, JS_ErrorTerminated);
       return false;
    }
@@ -170,11 +168,11 @@ bool do_restore(JCR *jcr)
       replace = REPLACE_ALWAYS;       /* always replace */
    }
    if (jcr->where) {
-      where = jcr->where;            /* override */
+      where = jcr->where;             /* override */
    } else if (jcr->job->RestoreWhere) {
       where = jcr->job->RestoreWhere; /* no override take from job */
    } else {
-      where = ∅                /* None */
+      where = ∅                 /* None */
    }
    jcr->prefix_links = jcr->job->PrefixLinks;
    bash_spaces(where);
@@ -195,6 +193,7 @@ bool do_restore(JCR *jcr)
 
 bool do_restore_init(JCR *jcr) 
 {
+   free_wstorage(jcr);
    return true;
 }
 
@@ -212,7 +211,7 @@ void restore_cleanup(JCR *jcr, int TermCode)
    double kbps;
 
    Dmsg0(20, "In restore_cleanup\n");
-   dequeue_messages(jcr);            /* display any queued messages */
+   dequeue_messages(jcr);             /* display any queued messages */
    set_jcr_job_status(jcr, TermCode);
 
    if (jcr->unlink_bsr && jcr->RestoreBootstrap) {
@@ -222,7 +221,7 @@ void restore_cleanup(JCR *jcr, int TermCode)
 
    update_job_end_record(jcr);
 
-   msg_type = M_INFO;                /* by default INFO message */
+   msg_type = M_INFO;                 /* by default INFO message */
    switch (TermCode) {
    case JS_Terminated:
       if (jcr->ExpectedFiles > jcr->jr.JobFiles) {
@@ -234,21 +233,21 @@ void restore_cleanup(JCR *jcr, int TermCode)
    case JS_FatalError:
    case JS_ErrorTerminated:
       term_msg = _("*** Restore Error ***");
-      msg_type = M_ERROR;         /* Generate error message */
+      msg_type = M_ERROR;          /* Generate error message */
       if (jcr->store_bsock) {
-        bnet_sig(jcr->store_bsock, BNET_TERMINATE);
-        if (jcr->SD_msg_chan) {
-           pthread_cancel(jcr->SD_msg_chan);
-        }
+         bnet_sig(jcr->store_bsock, BNET_TERMINATE);
+         if (jcr->SD_msg_chan) {
+            pthread_cancel(jcr->SD_msg_chan);
+         }
       }
       break;
    case JS_Canceled:
       term_msg = _("Restore Canceled");
       if (jcr->store_bsock) {
-        bnet_sig(jcr->store_bsock, BNET_TERMINATE);
-        if (jcr->SD_msg_chan) {
-           pthread_cancel(jcr->SD_msg_chan);
-        }
+         bnet_sig(jcr->store_bsock, BNET_TERMINATE);
+         if (jcr->SD_msg_chan) {
+            pthread_cancel(jcr->SD_msg_chan);
+         }
       }
       break;
    default:
@@ -270,7 +269,7 @@ void restore_cleanup(JCR *jcr, int TermCode)
    jobstatus_to_ascii(jcr->FDJobStatus, fd_term_msg, sizeof(fd_term_msg));
    jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));
 
-   Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n"
+   Jmsg(jcr, msg_type, 0, _("Bacula %s (%s): %s\n"
 "  JobId:                  %d\n"
 "  Job:                    %s\n"
 "  Client:                 %s\n"
@@ -284,20 +283,22 @@ void restore_cleanup(JCR *jcr, int TermCode)
 "  FD termination status:  %s\n"
 "  SD termination status:  %s\n"
 "  Termination:            %s\n\n"),
-       edt,
-       jcr->jr.JobId,
-       jcr->jr.Job,
-       jcr->client->hdr.name,
-       sdt,
-       edt,
-       edit_uint64_with_commas((uint64_t)jcr->ExpectedFiles, ec1),
-       edit_uint64_with_commas((uint64_t)jcr->jr.JobFiles, ec2),
-       edit_uint64_with_commas(jcr->jr.JobBytes, ec3),
-       (float)kbps,
-       jcr->Errors,
-       fd_term_msg,
-       sd_term_msg,
-       term_msg);
+        VERSION,
+        LSMDATE,
+        edt,
+        jcr->jr.JobId,
+        jcr->jr.Job,
+        jcr->client->hdr.name,
+        sdt,
+        edt,
+        edit_uint64_with_commas((uint64_t)jcr->ExpectedFiles, ec1),
+        edit_uint64_with_commas((uint64_t)jcr->jr.JobFiles, ec2),
+        edit_uint64_with_commas(jcr->jr.JobBytes, ec3),
+        (float)kbps,
+        jcr->Errors,
+        fd_term_msg,
+        sd_term_msg,
+        term_msg);
 
    Dmsg0(20, "Leaving restore_cleanup\n");
 }