From: <ke...@us...> - 2008-02-10 18:26:34
|
Revision: 6397 http://bacula.svn.sourceforge.net/bacula/?rev=6397&view=rev Author: kerns Date: 2008-02-10 10:26:40 -0800 (Sun, 10 Feb 2008) Log Message: ----------- First cut of plugin restore code Modified Paths: -------------- trunk/bacula/src/filed/fd-plugins.c trunk/bacula/src/filed/fd-plugins.h trunk/bacula/src/filed/job.c trunk/bacula/src/filed/restore.c trunk/bacula/src/version.h trunk/bacula/technotes-2.3 Modified: trunk/bacula/src/filed/fd-plugins.c =================================================================== --- trunk/bacula/src/filed/fd-plugins.c 2008-02-10 18:24:21 UTC (rev 6396) +++ trunk/bacula/src/filed/fd-plugins.c 2008-02-10 18:26:40 UTC (rev 6397) @@ -104,55 +104,59 @@ event.eventType = eventType; Dmsg2(dbglvl, "plugin_ctx=%p JobId=%d\n", jcr->plugin_ctx_list, jcr->JobId); - if (eventType != bEventPluginCommand) { + switch (eventType) { + case bEventPluginCommand: + /* Handle plugin command here backup */ + Dmsg1(100, "plugin cmd=%s\n", cmd); + if (!(p = strchr(cmd, ':'))) { + Jmsg1(jcr, M_ERROR, 0, "Malformed plugin command: %s\n", cmd); + goto bail_out; + } + len = p - cmd; + if (len <= 0) { + goto bail_out; + } + + foreach_alist(plugin, plugin_list) { + Dmsg3(100, "plugin=%s cmd=%s len=%d\n", plugin->file, cmd, len); + if (strncmp(plugin->file, cmd, len) == 0) { + Dmsg1(100, "Command plugin = %s\n", cmd); + if (plug_func(plugin)->handlePluginEvent(&plugin_ctx_list[i], &event, value) != bRC_OK) { + goto bail_out; + } + memset(&sp, 0, sizeof(sp)); + sp.type = FT_REG; + sp.portable = true; + sp.cmd = cmd; + Dmsg3(000, "startBackup st_size=%p st_blocks=%p sp=%p\n", &sp.statp.st_size, &sp.statp.st_blocks, + &sp); + if (plug_func(plugin)->startPluginBackup(&plugin_ctx_list[i], &sp) != bRC_OK) { + goto bail_out; + } + jcr->plugin_ctx = &plugin_ctx_list[i]; + jcr->plugin = plugin; + jcr->plugin_sp = &sp; + ff_pkt = jcr->ff; + ff_pkt->fname = sp.fname; + ff_pkt->type = sp.type; + memcpy(&ff_pkt->statp, &sp.statp, sizeof(ff_pkt->statp)); + Dmsg1(000, "Save_file: file=%s\n", ff_pkt->fname); + save_file(jcr, ff_pkt, true); + goto bail_out; + } + i++; + } + Jmsg1(jcr, M_ERROR, 0, "Command plugin \"%s\" not found.\n", cmd); + break; + + default: /* Pass event to every plugin */ foreach_alist(plugin, plugin_list) { plug_func(plugin)->handlePluginEvent(&plugin_ctx_list[i++], &event, value); } - goto bail_out; + break; } - /* Handle plugin command here (backup/restore of file) */ - Dmsg1(100, "plugin cmd=%s\n", cmd); - if (!(p = strchr(cmd, ':'))) { - Jmsg1(jcr, M_ERROR, 0, "Malformed plugin command: %s\n", cmd); - goto bail_out; - } - len = p - cmd; - if (len <= 0) { - goto bail_out; - } - - foreach_alist(plugin, plugin_list) { - Dmsg3(100, "plugin=%s cmd=%s len=%d\n", plugin->file, cmd, len); - if (strncmp(plugin->file, cmd, len) == 0) { - Dmsg1(100, "Command plugin = %s\n", cmd); - if (plug_func(plugin)->handlePluginEvent(&plugin_ctx_list[i], &event, value) != bRC_OK) { - goto bail_out; - } - memset(&sp, 0, sizeof(sp)); - sp.type = FT_REG; - sp.portable = true; - sp.cmd = cmd; - Dmsg3(000, "startBackup st_size=%p st_blocks=%p sp=%p\n", &sp.statp.st_size, &sp.statp.st_blocks, - &sp); - if (plug_func(plugin)->startPluginBackup(&plugin_ctx_list[i], &sp) != bRC_OK) { - goto bail_out; - } - jcr->plugin_ctx = &plugin_ctx_list[i]; - jcr->plugin = plugin; - jcr->plugin_sp = &sp; - ff_pkt = jcr->ff; - ff_pkt->fname = sp.fname; - ff_pkt->type = sp.type; - memcpy(&ff_pkt->statp, &sp.statp, sizeof(ff_pkt->statp)); - Dmsg1(000, "Save_file: file=%s\n", ff_pkt->fname); - save_file(jcr, ff_pkt, true); - goto bail_out; - } - i++; - } - Jmsg1(jcr, M_ERROR, 0, "Command plugin \"%s\" not found.\n", cmd); bail_out: return; @@ -165,20 +169,13 @@ { int stat; struct save_pkt *sp = (struct save_pkt *)jcr->plugin_sp; - Plugin *plugin = (Plugin *)jcr->plugin; if (!sd->fsend("%ld %d %d", jcr->JobFiles, STREAM_PLUGIN_NAME, start)) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); return false; } - if (start) { - stat = sd->fsend("%ld 1 %d %s%c%s%c", jcr->JobFiles, sp->portable, plugin->file, 0, - sp->cmd, 0); - } else { - stat = sd->fsend("%ld 0 %d %s%c%s%c", jcr->JobFiles, sp->portable, plugin->file, 0, - sp->cmd, 0); - } + stat = sd->fsend("%ld %d %d %s%c", jcr->JobFiles, start, sp->portable, sp->cmd, 0); if (!stat) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), sd->bstrerror()); @@ -188,7 +185,80 @@ return true; } +/* + * Plugin name stream found during restore. This is the record + * that was generated in send_plugin_name() above. + */ +void plugin_name_stream(JCR *jcr, char *name) +{ + char *p = name; + char *cmd; + bool start, portable; + bEvent event; + Plugin *plugin; + int len; + int i = 0; + bpContext *plugin_ctx_list; + Dmsg1(000, "plugin stream string=%s\n", name); + skip_nonspaces(&p); /* skip over jcr->JobFiles */ + skip_spaces(&p); + start = *p == '1'; + skip_nonspaces(&p); /* skip start/end flag */ + skip_spaces(&p); + portable = *p == '1'; + skip_nonspaces(&p); /* skip portable flag */ + skip_spaces(&p); + cmd = p; + event.eventType = start ? bEventRestoreStart : bEventRestoreEnd; + + /* Check for restore end */ + if (!start) { + /* + * If end of restore, notify plugin, then clear flags + */ + plugin = (Plugin *)jcr->plugin; + plug_func(plugin)->handlePluginEvent((bpContext *)jcr->plugin_ctx, &event, cmd); + jcr->plugin_ctx = NULL; + jcr->plugin = NULL; + goto bail_out; + } + + /* + * After this point, we are dealing with a restore start + */ + + Dmsg1(000, "plugin cmd=%s\n", cmd); + if (!(p = strchr(cmd, ':'))) { + Jmsg1(jcr, M_ERROR, 0, "Malformed plugin command: %s\n", cmd); + goto bail_out; + } + len = p - cmd; + if (len <= 0) { + goto bail_out; + } + + + plugin_ctx_list = (bpContext *)jcr->plugin_ctx_list; + foreach_alist(plugin, plugin_list) { + Dmsg3(100, "plugin=%s cmd=%s len=%d\n", plugin->file, cmd, len); + if (strncmp(plugin->file, cmd, len) == 0) { + Dmsg1(100, "Command plugin = %s\n", cmd); + if (plug_func(plugin)->handlePluginEvent(&plugin_ctx_list[i], + &event, (void *)name) != bRC_OK) { + goto bail_out; + } + jcr->plugin_ctx = &plugin_ctx_list[i]; + jcr->plugin = plugin; + goto bail_out; + } + i++; + } +bail_out: + return; +} + + void load_fd_plugins(const char *plugin_dir) { if (!plugin_dir) { Modified: trunk/bacula/src/filed/fd-plugins.h =================================================================== --- trunk/bacula/src/filed/fd-plugins.h 2008-02-10 18:24:21 UTC (rev 6396) +++ trunk/bacula/src/filed/fd-plugins.h 2008-02-10 18:26:40 UTC (rev 6397) @@ -133,6 +133,7 @@ void free_plugins(JCR *jcr); void generate_plugin_event(JCR *jcr, bEventType event, void *value=NULL); bool send_plugin_name(JCR *jcr, BSOCK *sd, bool start); +void plugin_name_stream(JCR *jcr, char *name); #ifdef __cplusplus extern "C" { Modified: trunk/bacula/src/filed/job.c =================================================================== --- trunk/bacula/src/filed/job.c 2008-02-10 18:24:21 UTC (rev 6396) +++ trunk/bacula/src/filed/job.c 2008-02-10 18:26:40 UTC (rev 6397) @@ -1120,7 +1120,7 @@ if (!term_fileset(jcr)) { return 0; } - return bnet_fsend(dir, OKinc); + return dir->fsend(OKinc); } static void free_bootstrap(JCR *jcr) Modified: trunk/bacula/src/filed/restore.c =================================================================== --- trunk/bacula/src/filed/restore.c 2008-02-10 18:24:21 UTC (rev 6396) +++ trunk/bacula/src/filed/restore.c 2008-02-10 18:26:40 UTC (rev 6397) @@ -631,6 +631,10 @@ } break; + case STREAM_PLUGIN_NAME: + plugin_name_stream(jcr, sd->msg); + break; + default: /* If extracting, wierd stream (not 1 or 2), close output file anyway */ if (extract) { Modified: trunk/bacula/src/version.h =================================================================== --- trunk/bacula/src/version.h 2008-02-10 18:24:21 UTC (rev 6396) +++ trunk/bacula/src/version.h 2008-02-10 18:26:40 UTC (rev 6397) @@ -4,8 +4,8 @@ #undef VERSION #define VERSION "2.3.9" -#define BDATE "09 February 2008" -#define LSMDATE "09Feb08" +#define BDATE "10 February 2008" +#define LSMDATE "10Feb08" #define PROG_COPYRIGHT "Copyright (C) %d-2008 Free Software Foundation Europe e.V.\n" #define BYEAR "2008" /* year for copyright messages in progs */ Modified: trunk/bacula/technotes-2.3 =================================================================== --- trunk/bacula/technotes-2.3 2008-02-10 18:24:21 UTC (rev 6396) +++ trunk/bacula/technotes-2.3 2008-02-10 18:26:40 UTC (rev 6397) @@ -2,6 +2,11 @@ General: 10Feb08 +kes First cut of plugin restore code. +kes Fix bug #1047, which had a heap overrun when stripping certain paths, + and do not strip paths on symbolic links. +kes Set catalog backup database and user name from values specified on + the ./configure line. ebl Fix #1031 about wrong pool source information in job report. 09Feb08 kes Fix Win32 build. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |