X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffiled%2Fjob.c;h=e81f608342c3203ca1079fa4f0d21b4e3cdb9e32;hb=9471da7e0b684cb2da6a5bc4ecb3a73cc3ddac52;hp=8cac931472c1fa2ba485d80ec8ebca00af9666cf;hpb=c3e84ba6b4f90a64b8ddd1876767ac633ef9611a;p=bacula%2Fbacula diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index 8cac931472..e81f608342 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -6,7 +6,7 @@ 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 + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,7 +15,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -91,6 +91,10 @@ static int runbeforenow_cmd(JCR *jcr); static int restore_object_cmd(JCR *jcr); static int set_options(findFOPTS *fo, const char *opts); static void set_storage_auth_key(JCR *jcr, char *key); +static int sm_dump_cmd(JCR *jcr); +#ifdef DEVELOPER +static int exit_cmd(JCR *jcr); +#endif /* Exported functions */ @@ -126,6 +130,10 @@ static struct s_cmds cmds[] = { {"Run", runscript_cmd, 0}, {"accurate", accurate_cmd, 0}, {"restoreobject", restore_object_cmd, 0}, + {"sm_dump", sm_dump_cmd, 0}, +#ifdef DEVELOPER + {"exit", exit_cmd, 0}, +#endif {NULL, NULL} /* list terminator */ }; @@ -394,9 +402,28 @@ void *handle_client_request(void *dirp) free_jcr(jcr); /* destroy JCR record */ Dmsg0(100, "Done with free_jcr\n"); Dsm_check(1); + garbage_collect_memory_pool(); return NULL; } +static int sm_dump_cmd(JCR *jcr) +{ + close_memory_pool(); + sm_dump(false, true); + jcr->dir_bsock->fsend("2000 sm_dump OK\n"); + return 1; +} + +#ifdef DEVELOPER +static int exit_cmd(JCR *jcr) +{ + jcr->dir_bsock->fsend("2000 exit OK\n"); + terminate_filed(0); + return 0; +} +#endif + + /** * Hello from Director he must identify himself and provide his * password. @@ -425,13 +452,13 @@ static int cancel_cmd(JCR *jcr) if (!(cjcr=get_jcr_by_full_name(Job))) { dir->fsend(_("2901 Job %s not found.\n"), Job); } else { + generate_plugin_event(cjcr, bEventCancelCommand, NULL); + set_jcr_job_status(cjcr, JS_Canceled); if (cjcr->store_bsock) { cjcr->store_bsock->set_timed_out(); cjcr->store_bsock->set_terminated(); cjcr->my_thread_send_signal(TIMEOUT_SIGNAL); } - generate_plugin_event(cjcr, bEventCancelCommand, NULL); - set_jcr_job_status(cjcr, JS_Canceled); free_jcr(cjcr); dir->fsend(_("2001 Job %s marked to be canceled.\n"), Job); } @@ -734,6 +761,22 @@ static bool init_fileset(JCR *jcr) return true; } +static void append_file(JCR *jcr, findINCEXE *incexe, + const char *buf, bool is_file) +{ + if (is_file) { + incexe->name_list.append(new_dlistString(buf)); + + } else if (me->plugin_directory) { + generate_plugin_event(jcr, bEventPluginCommand, (void *)buf); + incexe->plugin_list.append(new_dlistString(buf)); + + } else { + Jmsg(jcr, M_FATAL, 0, + _("Plugin Directory not defined. Cannot use plugin: \"%s\"\n"), + buf); + } +} /** * Add fname to include/exclude fileset list. First check for @@ -768,11 +811,7 @@ void add_file_to_fileset(JCR *jcr, const char *fname, bool is_file) free_pool_memory(fn); while (fgets(buf, sizeof(buf), bpipe->rfd)) { strip_trailing_junk(buf); - if (is_file) { - fileset->incexe->name_list.append(new_dlistString(buf)); - } else { - fileset->incexe->plugin_list.append(new_dlistString(buf)); - } + append_file(jcr, fileset->incexe, buf, is_file); } if ((stat=close_bpipe(bpipe)) != 0) { berrno be; @@ -786,32 +825,19 @@ void add_file_to_fileset(JCR *jcr, const char *fname, bool is_file) p++; /* skip over < */ if ((ffd = fopen(p, "rb")) == NULL) { berrno be; - Jmsg(jcr, M_FATAL, 0, _("Cannot open FileSet input file: %s. ERR=%s\n"), + Jmsg(jcr, M_FATAL, 0, + _("Cannot open FileSet input file: %s. ERR=%s\n"), p, be.bstrerror()); return; } while (fgets(buf, sizeof(buf), ffd)) { strip_trailing_junk(buf); - Dmsg1(100, "%s\n", buf); - if (is_file) { - fileset->incexe->name_list.append(new_dlistString(buf)); - } else { - fileset->incexe->plugin_list.append(new_dlistString(buf)); - } - } + append_file(jcr, fileset->incexe, buf, is_file); + } fclose(ffd); break; default: - if (is_file) { - fileset->incexe->name_list.append(new_dlistString(fname)); - } else { - if (me->plugin_directory) { - fileset->incexe->plugin_list.append(new_dlistString(fname)); - } else { - Jmsg(jcr, M_FATAL, 0, _("Plugin Directory not defined. Cannot use plugin: \"%\"\n"), - fname); - } - } + append_file(jcr, fileset->incexe, fname, is_file); break; } } @@ -1796,30 +1822,29 @@ static int backup_cmd(JCR *jcr) if (get_win32_driveletters(jcr->ff, szWinDriveLetters)) { Jmsg(jcr, M_INFO, 0, _("Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"), g_pVSSClient->GetDriverName(), szWinDriveLetters); if (!g_pVSSClient->CreateSnapshots(szWinDriveLetters)) { - Jmsg(jcr, M_WARNING, 0, _("Generate VSS snapshots failed.\n")); - jcr->JobErrors++; + berrno be; + Jmsg(jcr, M_FATAL, 0, _("Generate VSS snapshots failed. ERR=%s\n"), be.bstrerror()); } else { /* tell user if snapshot creation of a specific drive failed */ int i; for (i=0; i < (int)strlen(szWinDriveLetters); i++) { if (islower(szWinDriveLetters[i])) { - Jmsg(jcr, M_WARNING, 0, _("Generate VSS snapshot of drive \"%c:\\\" failed. VSS support is disabled on this drive.\n"), szWinDriveLetters[i]); - jcr->JobErrors++; + Jmsg(jcr, M_FATAL, 0, _("Generate VSS snapshot of drive \"%c:\\\" failed.\n"), szWinDriveLetters[i]); } } /* inform user about writer states */ - for (i=0; i < (int)g_pVSSClient->GetWriterCount(); i++) + for (i=0; i < (int)g_pVSSClient->GetWriterCount(); i++) { if (g_pVSSClient->GetWriterState(i) < 1) { - Jmsg(jcr, M_WARNING, 0, _("VSS Writer (PrepareForBackup): %s\n"), g_pVSSClient->GetWriterInfo(i)); - jcr->JobErrors++; + Jmsg(jcr, M_INFO, 0, _("VSS Writer (PrepareForBackup): %s\n"), g_pVSSClient->GetWriterInfo(i)); } + } } } else { - Jmsg(jcr, M_INFO, 0, _("No drive letters found for generating VSS snapshots.\n")); + Jmsg(jcr, M_FATAL, 0, _("No drive letters found for generating VSS snapshots.\n")); } } else { berrno be; - Jmsg(jcr, M_WARNING, 0, _("VSS was not initialized properly. VSS support is disabled. ERR=%s\n"), be.bstrerror()); + Jmsg(jcr, M_FATAL, 0, _("VSS was not initialized properly. ERR=%s\n"), be.bstrerror()); } run_scripts(jcr, jcr->RunScripts, "ClientAfterVSS"); } @@ -1882,6 +1907,7 @@ cleanup: #if defined(WIN32_VSS) if (jcr->VSS) { Win32ConvCleanupCache(); + g_pVSSClient->DestroyWriterInfo(); V(vss_mutex); } #endif @@ -2087,14 +2113,9 @@ static int restore_cmd(JCR *jcr) /* inform user about writer states */ int i; for (i=0; i < (int)g_pVSSClient->GetWriterCount(); i++) { - int msg_type = M_INFO; - if (g_pVSSClient->GetWriterState(i) < 1) { - msg_type = M_WARNING; - jcr->JobErrors++; - } if (g_pVSSClient->GetWriterState(i) < 1) { - Jmsg(jcr, M_WARNING, 0, _("VSS Writer (PreRestore): %s\n"), g_pVSSClient->GetWriterInfo(i)); - jcr->JobErrors++; + Jmsg(jcr, M_INFO, 0, _("VSS Writer (PreRestore): %s\n"), g_pVSSClient->GetWriterInfo(i)); + //jcr->JobErrors++; } } } else { @@ -2133,23 +2154,24 @@ static int restore_cmd(JCR *jcr) #if defined(WIN32_VSS) /* STOP VSS ON WIN32 */ /* tell vss to close the restore session */ - Dmsg0(0, "About to call CloseRestore\n"); + Dmsg0(100, "About to call CloseRestore\n"); if (jcr->VSS) { - Dmsg0(0, "Really about to call CloseRestore\n"); + generate_plugin_event(jcr, bEventVssBeforeCloseRestore); + Dmsg0(100, "Really about to call CloseRestore\n"); if (g_pVSSClient->CloseRestore()) { - Dmsg0(0, "CloseRestore success\n"); + Dmsg0(100, "CloseRestore success\n"); /* inform user about writer states */ for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) { int msg_type = M_INFO; if (g_pVSSClient->GetWriterState(i) < 1) { - msg_type = M_WARNING; - jcr->JobErrors++; + //msg_type = M_WARNING; + //jcr->JobErrors++; } Jmsg(jcr, msg_type, 0, _("VSS Writer (RestoreComplete): %s\n"), g_pVSSClient->GetWriterInfo(i)); } } else - Dmsg1(0, "CloseRestore fail - %08x\n", errno); + Dmsg1(100, "CloseRestore fail - %08x\n", errno); V(vss_mutex); } #endif @@ -2173,6 +2195,10 @@ bail_out: ret = 0; /* we stop here */ } + if (job_canceled(jcr)) { + ret = 0; /* we stop here */ + } + return ret; }