X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Frestore.c;h=b57e6802dff6dd95461eff1af980e61d5f94563d;hb=928fa1c1a90e32611cdceecc19672945757af154;hp=e3a60613b0b2517c39264162afdc55d476a667c1;hpb=048e7bc4b74f74a6c06cc9bc894301def2e562c1;p=bacula%2Fbacula diff --git a/bacula/src/dird/restore.c b/bacula/src/dird/restore.c index e3a60613b0..b57e6802df 100644 --- a/bacula/src/dird/restore.c +++ b/bacula/src/dird/restore.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2007 Free Software Foundation Europe e.V. + Copyright (C) 2000-2008 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark of John Walker. + Bacula® is a registered trademark of Kern Sibbald. The licensor of Bacula is the Free Software Foundation Europe (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. @@ -50,9 +50,9 @@ #include "dird.h" /* Commands sent to File daemon */ -static char restorecmd[] = "restore replace=%c prelinks=%d where=%s\n"; +static char restorecmd[] = "restore replace=%c prelinks=%d where=%s\n"; static char restorecmdR[] = "restore replace=%c prelinks=%d regexwhere=%s\n"; -static char storaddr[] = "storage address=%s port=%d ssl=0\n"; +static char storaddr[] = "storage address=%s port=%d ssl=0\n"; /* Responses received from File daemon */ static char OKrestore[] = "2000 OK restore\n"; @@ -69,15 +69,21 @@ bool do_restore(JCR *jcr) { BSOCK *fd; JOB_DBR rjr; /* restore job record */ + char replace, *where, *cmd; + char empty = '\0'; + int stat; free_wstorage(jcr); /* we don't write */ + if (!allow_duplicate_job(jcr)) { + goto bail_out; + } + memset(&rjr, 0, sizeof(rjr)); 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); - return false; + goto bail_out; } Dmsg0(20, "Updated job start record\n"); @@ -87,8 +93,7 @@ bool do_restore(JCR *jcr) Jmsg0(jcr, M_FATAL, 0, _("Cannot restore without a bootstrap file.\n" "You probably ran a restore job directly. All restore jobs must\n" "be run using the restore command.\n")); - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } @@ -107,25 +112,22 @@ bool do_restore(JCR *jcr) * Start conversation with Storage daemon */ if (!connect_to_storage_daemon(jcr, 10, SDConnectTimeout, 1)) { - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } /* * Now start a job with the Storage daemon */ if (!start_storage_daemon_job(jcr, jcr->rstorage, NULL)) { - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } - if (!bnet_fsend(jcr->store_bsock, "run")) { - return false; + if (!jcr->store_bsock->fsend("run")) { + goto bail_out; } /* * Now start a Storage daemon message thread */ if (!start_storage_daemon_message_thread(jcr)) { - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } Dmsg0(50, "Storage daemon connection OK\n"); @@ -135,9 +137,7 @@ bool do_restore(JCR *jcr) */ set_jcr_job_status(jcr, JS_WaitFD); if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) { - cancel_storage_daemon_job(jcr); - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } fd = jcr->file_bsock; @@ -151,11 +151,10 @@ bool do_restore(JCR *jcr) if (jcr->rstore->SDDport == 0) { jcr->rstore->SDDport = jcr->rstore->SDport; } - bnet_fsend(fd, storaddr, jcr->rstore->address, jcr->rstore->SDDport); + fd->fsend(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); - return false; + goto bail_out; } /* @@ -163,19 +162,15 @@ bool do_restore(JCR *jcr) */ if (!send_bootstrap_file(jcr, fd) || !response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) { - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } if (!send_runscripts_commands(jcr)) { - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } /* Send restore command */ - char replace, *where, *cmd=NULL; - char empty = '\0'; if (jcr->replace != 0) { replace = jcr->replace; @@ -185,13 +180,11 @@ bool do_restore(JCR *jcr) replace = REPLACE_ALWAYS; /* always replace */ } - where = ∅ /* default */ - if (jcr->RegexWhere) { where = jcr->RegexWhere; /* override */ cmd = restorecmdR; } else if (jcr->job->RegexWhere) { - where = jcr->job->RegexWhere; /* no override take from job */ + where = jcr->job->RegexWhere; /* no override take from job */ cmd = restorecmdR; } else if (jcr->where) { @@ -200,24 +193,30 @@ bool do_restore(JCR *jcr) } else if (jcr->job->RestoreWhere) { where = jcr->job->RestoreWhere; /* no override take from job */ cmd = restorecmd; - } + + } else { /* nothing was specified */ + where = ∅ /* use default */ + cmd = restorecmd; + } jcr->prefix_links = jcr->job->PrefixLinks; bash_spaces(where); - bnet_fsend(fd, cmd, replace, jcr->prefix_links, where); + fd->fsend(cmd, replace, jcr->prefix_links, where); unbash_spaces(where); if (!response(jcr, fd, OKrestore, "Restore", DISPLAY_ERROR)) { - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } /* Wait for Job Termination */ - int stat = wait_for_job_termination(jcr); + stat = wait_for_job_termination(jcr); restore_cleanup(jcr, stat); - return true; + +bail_out: + restore_cleanup(jcr, JS_ErrorTerminated); + return false; } bool do_restore_init(JCR *jcr) @@ -247,6 +246,10 @@ void restore_cleanup(JCR *jcr, int TermCode) jcr->unlink_bsr = false; } + if (job_canceled(jcr)) { + cancel_storage_daemon_job(jcr); + } + switch (TermCode) { case JS_Terminated: if (jcr->ExpectedFiles > jcr->jr.JobFiles) { @@ -260,7 +263,7 @@ void restore_cleanup(JCR *jcr, int TermCode) term_msg = _("*** Restore Error ***"); msg_type = M_ERROR; /* Generate error message */ if (jcr->store_bsock) { - bnet_sig(jcr->store_bsock, BNET_TERMINATE); + jcr->store_bsock->signal(BNET_TERMINATE); if (jcr->SD_msg_chan) { pthread_cancel(jcr->SD_msg_chan); } @@ -269,7 +272,7 @@ void restore_cleanup(JCR *jcr, int TermCode) case JS_Canceled: term_msg = _("Restore Canceled"); if (jcr->store_bsock) { - bnet_sig(jcr->store_bsock, BNET_TERMINATE); + jcr->store_bsock->signal(BNET_TERMINATE); if (jcr->SD_msg_chan) { pthread_cancel(jcr->SD_msg_chan); } @@ -294,7 +297,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 %s %s (%s): %s\n" + Jmsg(jcr, msg_type, 0, _("%s %s %s (%s): %s\n" " Build OS: %s %s %s\n" " JobId: %d\n" " Job: %s\n" @@ -309,7 +312,7 @@ void restore_cleanup(JCR *jcr, int TermCode) " FD termination status: %s\n" " SD termination status: %s\n" " Termination: %s\n\n"), - my_name, VERSION, LSMDATE, edt, + BACULA, my_name, VERSION, LSMDATE, edt, HOST_OS, DISTNAME, DISTVER, jcr->jr.JobId, jcr->jr.Job,