X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=bacula%2Fsrc%2Fwin32%2Ffiled%2Fplugins%2Fexchange-fd.c;h=22222702b0923314fb00b1db4e638a774a9b0bbd;hb=da3d730b307afd1432722a4011a18924c02b712c;hp=a2e3fa40609381bf7313ee9c40771476aa43fbce;hpb=e486ad2ee0f43f7afbb20034d28753dc952920be;p=bacula%2Fbacula diff --git a/bacula/src/win32/filed/plugins/exchange-fd.c b/bacula/src/win32/filed/plugins/exchange-fd.c index a2e3fa4060..22222702b0 100644 --- a/bacula/src/win32/filed/plugins/exchange-fd.c +++ b/bacula/src/win32/filed/plugins/exchange-fd.c @@ -1,12 +1,12 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2008-2008 Free Software Foundation Europe e.V. + Copyright (C) 2010-2011 Bacula Systems(R) SA 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, which is listed 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. @@ -35,9 +35,9 @@ bFuncs *bfuncs = NULL; bInfo *binfo = NULL; -#define PLUGIN_LICENSE "GPL" +#define PLUGIN_LICENSE "Bacula AGPLv3" #define PLUGIN_AUTHOR "James Harper" -#define PLUGIN_DATE "September 2008" +#define PLUGIN_DATE "September 2008" #define PLUGIN_VERSION "1" #define PLUGIN_DESCRIPTION "Exchange Plugin" @@ -71,8 +71,8 @@ static pFuncs pluginFuncs = { FD_PLUGIN_INTERFACE_VERSION, /* Entry points into plugin */ - newPlugin, /* new plugin instance */ - freePlugin, /* free plugin instance */ + newPlugin, /* new plugin instance */ + freePlugin, /* free plugin instance */ getPluginValue, setPluginValue, handlePluginEvent, @@ -117,204 +117,245 @@ splitString(char *string, char split, int maxParts, int *count) return RetVal; } -bRC DLLEXPORT +bRC DLL_IMP_EXP loadPlugin(bInfo *lbinfo, bFuncs *lbfuncs, pInfo **pinfo, pFuncs **pfuncs) { - bRC retval; - bfuncs = lbfuncs; /* set Bacula funct pointers */ - binfo = lbinfo; - *pinfo = &pluginInfo; - *pfuncs = &pluginFuncs; - retval = loadExchangeApi(); - if (retval != bRC_OK) - { - printf("Cannot load Exchange DLL\n"); - return retval; - } - return retval; + bRC retval; + bfuncs = lbfuncs; /* set Bacula funct pointers */ + binfo = lbinfo; + *pinfo = &pluginInfo; + *pfuncs = &pluginFuncs; + retval = loadExchangeApi(); + if (retval != bRC_OK) { + printf("Cannot load Exchange DLL\n"); + return retval; + } + return retval; } -bRC DLLEXPORT +bRC DLL_IMP_EXP unloadPlugin() { - return bRC_OK; + return bRC_OK; } } - +/* void * b_malloc(const char *file, int lone, size_t size) { - return NULL; + return NULL; } void * sm_malloc(const char *file, int lone, size_t size) { - return NULL; + return NULL; } +*/ static bRC newPlugin(bpContext *ctx) { - exchange_fd_context_t *context; - bRC retval = bRC_OK; - DWORD size; - - int JobId = 0; - ctx->pContext = new exchange_fd_context_t; - context = (exchange_fd_context_t *)ctx->pContext; - context->bpContext = ctx; - context->job_since = 0; - context->notrunconfull_option = false; - bfuncs->getBaculaValue(ctx, bVarJobId, (void *)&JobId); - _DebugMessage(0, "newPlugin JobId=%d\n", JobId); - bfuncs->registerBaculaEvents(ctx, 1, 2, 0); - size = MAX_COMPUTERNAME_LENGTH + 1; - context->computer_name = new WCHAR[size]; - GetComputerNameW(context->computer_name, &size); - context->current_node = NULL; - context->root_node = NULL; - return retval; + exchange_fd_context_t *context; + bRC retval = bRC_OK; + DWORD size; + + int JobId = 0; + ctx->pContext = new exchange_fd_context_t; + context = (exchange_fd_context_t *)ctx->pContext; + context->bpContext = ctx; + context->job_since = 0; + context->notrunconfull_option = false; + context->plugin_active = false; + bfuncs->getBaculaValue(ctx, bVarJobId, (void *)&JobId); + _DebugMessage(0, "newPlugin JobId=%d\n", JobId); + bfuncs->registerBaculaEvents(ctx, 1, 2, 0); + size = MAX_COMPUTERNAME_LENGTH + 1; + context->computer_name = new WCHAR[size]; + /* + GetComputerNameW(context->computer_name, &size); + */ + GetComputerNameExW(ComputerNameNetBIOS, context->computer_name, &size); + context->current_node = NULL; + context->root_node = NULL; + return retval; } static bRC freePlugin(bpContext *ctx) { - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - int JobId = 0; - bfuncs->getBaculaValue(ctx, bVarJobId, (void *)&JobId); - _DebugMessage(100, "freePlugin JobId=%d\n", JobId); - delete context; - return bRC_OK; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + int JobId = 0; + bfuncs->getBaculaValue(ctx, bVarJobId, (void *)&JobId); + _DebugMessage(100, "freePlugin JobId=%d\n", JobId); + delete context; + return bRC_OK; } static bRC getPluginValue(bpContext *ctx, pVariable var, void *value) { - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - _DebugMessage(100, "getPluginValue var=%d\n", var); - return bRC_OK; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + _DebugMessage(100, "getPluginValue var=%d\n", var); + return bRC_OK; } static bRC setPluginValue(bpContext *ctx, pVariable var, void *value) { - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - _DebugMessage(100, "setPluginValue var=%d\n", var); - return bRC_OK; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + _DebugMessage(100, "setPluginValue var=%d\n", var); + return bRC_OK; } static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) { - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - char *name; - int i; - - switch (event->eventType) { - case bEventJobStart: - _DebugMessage(0, "JobStart=%s\n", (char *)value); - break; - case bEventJobEnd: - _DebugMessage(0, "JobEnd\n"); - break; - case bEventStartBackupJob: - _DebugMessage(0, "BackupStart\n"); - context->job_type = JOB_TYPE_BACKUP; - // level should have been specified by now - check it - // if level is D or I, since should have been specified too - switch (context->job_level) - { - case 'F': - if (context->notrunconfull_option) { - context->truncate_logs = false; - } else { - context->truncate_logs = true; - } - break; - case 'D': - context->truncate_logs = false; - break; - case 'I': - context->truncate_logs = false; - break; - default: - _DebugMessage(0, "Invalid job level %c\n", context->job_level); - return bRC_Error; - } - break; - case bEventEndBackupJob: - _DebugMessage(0, "BackupEnd\n"); - break; - case bEventLevel: - _DebugMessage(0, "JobLevel=%c %d\n", (int)value, (int)value); - context->job_level = (int)value; - break; - case bEventSince: - _DebugMessage(0, "since=%d\n", (int)value); - context->job_since = (time_t)value; - break; - case bEventStartRestoreJob: - _DebugMessage(0, "StartRestoreJob\n"); - context->job_type = JOB_TYPE_RESTORE; - break; - case bEventEndRestoreJob: - _DebugMessage(0, "EndRestoreJob\n"); - break; - - /* Plugin command e.g. plugin = ::command */ - case bEventRestoreCommand: - _DebugMessage(0, "restore\n"); // command=%s\n", (char *)value); - break; - - case bEventBackupCommand: - { - _DebugMessage(0, "backup command=%s\n", (char *)value); - char *command = new char[strlen((char *)value)]; - strcpy(command, (char *)value); - char *plugin_name = strtok((char *)command, ":"); - char *path = strtok(NULL, ":"); - char *option; - while ((option = strtok(NULL, ":")) != NULL) - { - _DebugMessage(100, "option %s\n", option); - if (stricmp(option, "notrunconfull") == 0) - { - context->notrunconfull_option = true; - } - else - { - _JobMessage(M_WARNING, "Unknown plugin option '%s'\n", option); - } - } - _DebugMessage(0, "name = %s\n", plugin_name); - _DebugMessage(0, "path = %s\n", path); - if (*path != '/') - { - _JobMessage(M_ERROR, "Path does not begin with a '/'\n"); - return bRC_Error; - } - - for (i = 0; i < 6; i++) - context->path_bits[i] = NULL; - - char *path_bit = strtok(path, "/"); - for (i = 0; path_bit != NULL && i < 6; i++) - { - context->path_bits[i] = new char[strlen(path_bit) + 1]; - strcpy(context->path_bits[i], path_bit); - path_bit = strtok(NULL, "/"); - } - - if (i < 2 || i > 4) - { - _JobMessage(M_ERROR, "Invalid plugin backup path\n"); - return bRC_Error; - } - context->root_node = new root_node_t(context->path_bits[0]); - context->current_node = context->root_node; - - } - break; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + char *name; + int i, intval; + int accurate; + char *command; + char *plugin_name; + + switch (event->eventType) { + case bEventJobStart: + _DebugMessage(0, "JobStart=%s\n", (char *)value); + context->plugin_active = false; + break; + case bEventJobEnd: + _DebugMessage(0, "JobEnd\n"); + break; + case bEventPluginCommand: + _DebugMessage(0, "bEventPluginCommand %s\n", value); + command = bstrdup((char *)value); + /* this isn't really unused */ + plugin_name = strtok((char *)command, ":"); + if (strcmp(plugin_name, "exchange") != 0) { + context->plugin_active = false; + } else { + context->plugin_active = true; + } + free(command); + break; + case bEventStartBackupJob: + if (!context->plugin_active) { + break; + } + _DebugMessage(0, "BackupStart\n"); + bfuncs->getBaculaValue(ctx, bVarAccurate, (void *)&accurate); + context->accurate = accurate; + context->job_type = JOB_TYPE_BACKUP; + // level should have been specified by now - check it + // if level is D or I, since should have been specified too + switch (context->job_level) { + case 'F': + if (context->notrunconfull_option) { + context->truncate_logs = false; + } else { + context->truncate_logs = true; + } + break; + case 'D': + context->truncate_logs = false; + break; + case 'I': + context->truncate_logs = false; + break; + default: + _DebugMessage(0, "Invalid job level %c\n", context->job_level); + return bRC_Error; + } + break; + case bEventEndBackupJob: + _DebugMessage(0, "BackupEnd\n"); + if (!context->plugin_active) { + break; + } + break; + case bEventLevel: + if (!context->plugin_active) { + break; + } + intval = (intptr_t)value; + _DebugMessage(0, "JobLevel=%c %d\n", intval, intval); + context->job_level = intval; + break; + case bEventSince: + if (!context->plugin_active) { + break; + } + intval = (intptr_t)value; + _DebugMessage(0, "since=%d\n", intval); + context->job_since = (time_t)value; + break; + case bEventStartRestoreJob: + _DebugMessage(0, "StartRestoreJob\n"); + context->job_type = JOB_TYPE_RESTORE; + context->plugin_active = true; + break; + case bEventEndRestoreJob: + if (!context->plugin_active) { + break; + } + _DebugMessage(0, "EndRestoreJob\n"); + context->plugin_active = false; + break; + + /* Plugin command e.g. plugin = ::command */ + case bEventRestoreCommand: + _DebugMessage(0, "restore\n"); // command=%s\n", (char *)value); + if (!context->plugin_active) { + break; + } + break; + + case bEventBackupCommand: + if (!context->plugin_active) { + break; + } + { + _DebugMessage(0, "backup command=%s\n", (char *)value); + char *command = new char[strlen((char *)value)]; + strcpy(command, (char *)value); + char *plugin_name = strtok((char *)command, ":"); + char *path = strtok(NULL, ":"); + char *option; + while ((option = strtok(NULL, ":")) != NULL) { + _DebugMessage(100, "option %s\n", option); + if (stricmp(option, "notrunconfull") == 0) { + context->notrunconfull_option = true; + } else { + _JobMessage(M_WARNING, "Unknown plugin option '%s'\n", option); + } + } + _DebugMessage(0, "name = %s\n", plugin_name); + _DebugMessage(0, "path = %s\n", path); + if (*path != '/') { + _JobMessage(M_FATAL, "Path does not begin with a '/'\n"); + return bRC_Error; + } + + for (i = 0; i < 6; i++) { + context->path_bits[i] = NULL; + } + + char *path_bit = strtok(path, "/"); + for (i = 0; path_bit != NULL && i < 6; i++) { + context->path_bits[i] = new char[strlen(path_bit) + 1]; + strcpy(context->path_bits[i], path_bit); + path_bit = strtok(NULL, "/"); + } + + if (i < 2 || i > 4) { + _JobMessage(M_FATAL, "Invalid plugin backup path\n"); + return bRC_Error; + } + context->root_node = new root_node_t(context->path_bits[0]); + context->current_node = context->root_node; + + } + break; default: - _JobMessage(M_ERROR, "unknown event=%d\n", event->eventType); + _DebugMessage(0, "Ignored event=%d\n", event->eventType); + break; } bfuncs->getBaculaValue(ctx, bVarFDName, (void *)&name); return bRC_OK; @@ -323,41 +364,42 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value) static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp) { - bRC retval; - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - node_t *current_node; - - _DebugMessage(100, "startBackupFile, cmd = %s\n", sp->cmd); - if (sp->pkt_size != sizeof(struct save_pkt) || sp->pkt_end != sizeof(struct save_pkt)) - { - _JobMessage(M_FATAL, "save_pkt size mismatch - sizeof(struct save_pkt) = %d, pkt_size = %d, pkt_end = %d\n", sizeof(struct save_pkt), sp->pkt_size, sp->pkt_end); - return bRC_Error; - } - - //context->root_node = new root_node_t(PLUGIN_PATH_PREFIX_BASE); - //context->current_node = context->root_node; - do { - current_node = context->current_node; - retval = current_node->startBackupFile(context, sp); - } while (current_node != context->current_node); - _DebugMessage(100, "startBackupFile done - type = %d, fname = %s, retval = %d\n", sp->type, sp->fname, retval); - return retval; + bRC retval; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + node_t *current_node; + + _DebugMessage(100, "startBackupFile, cmd = %s\n", sp->cmd); + if (sp->pkt_size != sizeof(struct save_pkt) || sp->pkt_end != sizeof(struct save_pkt)) { + _JobMessage(M_FATAL, "save_pkt size mismatch - sizeof(struct save_pkt) = %d, pkt_size = %d, pkt_end = %d\n", sizeof(struct save_pkt), sp->pkt_size, sp->pkt_end); + return bRC_Error; + } + + //context->root_node = new root_node_t(PLUGIN_PATH_PREFIX_BASE); + //context->current_node = context->root_node; + do { + current_node = context->current_node; + retval = current_node->startBackupFile(context, sp); + if (retval == bRC_Seen) + endBackupFile(ctx); + } while (current_node != context->current_node); + _DebugMessage(100, "startBackupFile done - type = %d, fname = %s, retval = %d\n", sp->type, sp->fname, retval); + return retval; } static bRC endBackupFile(bpContext *ctx) { - bRC retval; - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - node_t *current_node; - - _DebugMessage(100, "endBackupFile\n"); - - do { - current_node = context->current_node; - retval = current_node->endBackupFile(context); - } while (current_node != context->current_node); - _DebugMessage(100, "endBackupFile done - retval = %d\n", retval); - return retval; + bRC retval; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + node_t *current_node; + + _DebugMessage(100, "endBackupFile\n"); + + do { + current_node = context->current_node; + retval = current_node->endBackupFile(context); + } while (current_node != context->current_node); + _DebugMessage(100, "endBackupFile done - retval = %d\n", retval); + return retval; } /* @@ -365,107 +407,108 @@ static bRC endBackupFile(bpContext *ctx) */ static bRC pluginIO(bpContext *ctx, struct io_pkt *io) { - bRC retval = bRC_OK; - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - - if (io->pkt_size != sizeof(struct io_pkt) || io->pkt_end != sizeof(struct io_pkt)) - { - _JobMessage(M_ERROR, "io_pkt size mismatch - sizeof(struct io_pkt) = %d, pkt_size = %d, pkt_end = %d\n", sizeof(struct io_pkt), io->pkt_size, io->pkt_end); - } - - switch(io->func) { - case IO_OPEN: - _DebugMessage(100, "IO_OPEN\n"); - retval = context->current_node->pluginIoOpen(context, io); - break; - case IO_READ: - //_DebugMessage(100, "IO_READ buf=%p len=%d\n", io->buf, io->count); - retval = context->current_node->pluginIoRead(context, io); - break; - case IO_WRITE: - //_DebugMessage(100, "IO_WRITE buf=%p len=%d\n", io->buf, io->count); - retval = context->current_node->pluginIoWrite(context, io); - break; - case IO_CLOSE: - _DebugMessage(100, "IO_CLOSE\n"); - retval = context->current_node->pluginIoClose(context, io); - break; - } - return retval; + bRC retval = bRC_OK; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + + if (io->pkt_size != sizeof(struct io_pkt) || io->pkt_end != sizeof(struct io_pkt)) + { + _JobMessage(M_FATAL, "io_pkt size mismatch - sizeof(struct io_pkt) = %d, pkt_size = %d, pkt_end = %d\n", sizeof(struct io_pkt), io->pkt_size, io->pkt_end); + } + + switch(io->func) { + case IO_OPEN: + _DebugMessage(100, "IO_OPEN\n"); + retval = context->current_node->pluginIoOpen(context, io); + break; + case IO_READ: + //_DebugMessage(100, "IO_READ buf=%p len=%d\n", io->buf, io->count); + retval = context->current_node->pluginIoRead(context, io); + break; + case IO_WRITE: + //_DebugMessage(100, "IO_WRITE buf=%p len=%d\n", io->buf, io->count); + retval = context->current_node->pluginIoWrite(context, io); + break; + case IO_CLOSE: + _DebugMessage(100, "IO_CLOSE\n"); + retval = context->current_node->pluginIoClose(context, io); + break; + } + return retval; } static bRC startRestoreFile(bpContext *ctx, const char *cmd) { - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - _DebugMessage(100, "startRestoreFile\n"); + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + _DebugMessage(100, "startRestoreFile\n"); - return bRC_OK; + return bRC_OK; } static bRC endRestoreFile(bpContext *ctx) { - bRC retval; - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - node_t *current_node; - - _DebugMessage(100, "endRestoreFile\n"); - - do { - current_node = context->current_node; - retval = current_node->endRestoreFile(context); - } while (current_node != context->current_node); - _DebugMessage(100, "endRestoreFile done - retval = %d\n", retval); - return retval; + bRC retval; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + node_t *current_node; + + _DebugMessage(100, "endRestoreFile\n"); + + do { + current_node = context->current_node; + retval = current_node->endRestoreFile(context); + } while (current_node != context->current_node); + _DebugMessage(100, "endRestoreFile done - retval = %d\n", retval); + return retval; } static bRC createFile(bpContext *ctx, struct restore_pkt *rp) { - bRC retval; - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - node_t *current_node; - char **path_bits; - int count; - int i; - - - _DebugMessage(100, "createFile - type = %d, ofname = %s\n", rp->type, rp->ofname); - if (rp->pkt_size != sizeof(struct restore_pkt) || rp->pkt_end != sizeof(struct restore_pkt)) - { - _JobMessage(M_ERROR, "restore_pkt size mismatch - sizeof(struct restore_pkt) = %d, pkt_size = %d, pkt_end = %d\n", sizeof(struct restore_pkt), rp->pkt_size, rp->pkt_end); - } - - for (i = 0; i < 6; i++) - { - context->path_bits[i] = NULL; - } - - path_bits = splitString((char *)rp->ofname, '/', 7, &count); - - _DebugMessage(100, "count = %d\n", count); - - for (i = 1; i < count; i++) - { - _DebugMessage(150, "%d = '%s'\n", i, path_bits[i]); - context->path_bits[i - 1] = path_bits[i]; - } - - if (context->current_node == NULL) - { - context->root_node = new root_node_t(context->path_bits[0]); - context->current_node = context->root_node; - } - - do { - current_node = context->current_node; - retval = current_node->createFile(context, rp); - } while (current_node != context->current_node); - _DebugMessage(100, "createFile done - retval = %d\n", retval); - return retval; + bRC retval; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + node_t *current_node; + char **path_bits; + int count; + int i; + + + _DebugMessage(100, "createFile - type = %d, ofname = %s\n", rp->type, rp->ofname); + if (rp->pkt_size != sizeof(struct restore_pkt) || rp->pkt_end != sizeof(struct restore_pkt)) + { + _JobMessage(M_FATAL, "restore_pkt size mismatch - sizeof(struct restore_pkt) = %d, pkt_size = %d, pkt_end = %d\n", sizeof(struct restore_pkt), rp->pkt_size, rp->pkt_end); + return bRC_Error; + } + + for (i = 0; i < 6; i++) + { + context->path_bits[i] = NULL; + } + + path_bits = splitString((char *)rp->ofname, '/', 7, &count); + + _DebugMessage(100, "count = %d\n", count); + + for (i = 1; i < count; i++) + { + _DebugMessage(150, "%d = '%s'\n", i, path_bits[i]); + context->path_bits[i - 1] = path_bits[i]; + } + + if (context->current_node == NULL) + { + context->root_node = new root_node_t(context->path_bits[0]); + context->current_node = context->root_node; + } + + do { + current_node = context->current_node; + retval = current_node->createFile(context, rp); + } while (current_node != context->current_node); + _DebugMessage(100, "createFile done - retval = %d\n", retval); + return retval; } static bRC setFileAttributes(bpContext *ctx, struct restore_pkt *rp) { - exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; - _DebugMessage(100, "setFileAttributes\n"); - return bRC_OK; + exchange_fd_context_t *context = (exchange_fd_context_t *)ctx->pContext; + _DebugMessage(100, "setFileAttributes\n"); + return bRC_OK; }