X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Frestore.c;h=b57e6802dff6dd95461eff1af980e61d5f94563d;hb=928fa1c1a90e32611cdceecc19672945757af154;hp=cb6eed17cd970822a2fe4a24d141298a14bdcf8d;hpb=918fcdcc0d93e7fa03affa41eb704a6911a60f8f;p=bacula%2Fbacula diff --git a/bacula/src/dird/restore.c b/bacula/src/dird/restore.c index cb6eed17cd..b57e6802df 100644 --- a/bacula/src/dird/restore.c +++ b/bacula/src/dird/restore.c @@ -1,14 +1,14 @@ /* 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. This program is Free Software; you can redistribute it and/or modify it under the terms of version two of the GNU General Public - License as published by the Free Software Foundation plus additions - that are listed in the file LICENSE. + License as published by the Free Software Foundation and included + in the file LICENSE. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -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 restorecmdR[] = "restore replace=%c prelinks=%d rwhere=%s\n"; -static char storaddr[] = "storage address=%s port=%d ssl=0\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"; /* 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,8 +137,7 @@ bool do_restore(JCR *jcr) */ set_jcr_job_status(jcr, JS_WaitFD); if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) { - restore_cleanup(jcr, JS_ErrorTerminated); - return false; + goto bail_out; } fd = jcr->file_bsock; @@ -150,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; } /* @@ -162,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; - char empty = '\0'; if (jcr->replace != 0) { replace = jcr->replace; @@ -183,36 +179,44 @@ bool do_restore(JCR *jcr) } else { replace = REPLACE_ALWAYS; /* always replace */ } - if (jcr->where) { + + if (jcr->RegexWhere) { + where = jcr->RegexWhere; /* override */ + cmd = restorecmdR; + } else if (jcr->job->RegexWhere) { + where = jcr->job->RegexWhere; /* no override take from job */ + cmd = restorecmdR; + + } else if (jcr->where) { where = jcr->where; /* override */ + cmd = restorecmd; } else if (jcr->job->RestoreWhere) { where = jcr->job->RestoreWhere; /* no override take from job */ - } else { - where = ∅ /* None */ + cmd = restorecmd; + + } else { /* nothing was specified */ + where = ∅ /* use default */ + cmd = restorecmd; } jcr->prefix_links = jcr->job->PrefixLinks; - if (jcr->where_use_regexp) { - cmd = restorecmdR; - } else { - cmd = restorecmd; - } - 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) @@ -242,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) { @@ -255,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); } @@ -264,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); } @@ -289,11 +297,11 @@ 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" -" Client: %s\n" +" Restore Client: %s\n" " Start time: %s\n" " End time: %s\n" " Files Expected: %s\n" @@ -304,11 +312,11 @@ 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, - jcr->client->hdr.name, + jcr->client->name(), sdt, edt, edit_uint64_with_commas((uint64_t)jcr->ExpectedFiles, ec1),