2 * Contributed in 2012 by Inteos sp. z o.o.
4 * Utility tool display various information about Bacula plugin,
5 * including but not limited to:
6 * - Name and Author of the plugin
10 * - Enabled functions, etc.
13 Bacula(R) - The Network Backup Solution
15 Copyright (C) 2012-2016 Kern Sibbald
17 The original author of Bacula is Kern Sibbald, with contributions
18 from many others, a complete list can be found in the file AUTHORS.
20 You may use this file and others of this release according to the
21 license defined in the LICENSE file, which includes the Affero General
22 Public License, v3.0 ("AGPLv3") and some additional permissions and
23 terms pursuant to its AGPLv3 Section 7.
25 This notice must be preserved when any source code is
26 conveyed and/or propagated.
28 Bacula(R) is a registered trademark of Kern Sibbald.
31 #ifdef working /* currently will not compile KES 21 Nov 2015 */
43 #include "../filed/fd_plugins.h"
44 #include "../dird/dir_plugins.h"
45 // I can't include sd_plugins.h here ...
46 #include "../stored/stored.h"
47 #include "assert_macro.h"
50 typedef int (*loadPlugin) (void *binfo, void *bfuncs, void **pinfo,
52 typedef int (*unloadPlugin) (void);
54 #define DEFAULT_API_VERSION 1
67 typedef union _pluginfo pluginfo;
79 typedef union _plugfuncs plugfuncs;
92 * TODO: change to union
94 typedef union _baculafuncs baculafuncs;
101 typedef struct _baculafuncs baculafuncs;
102 struct _baculafuncs {
105 int (*registerBaculaEvents) (void *ctx, ...);
106 int (*getBaculaValue) (void *ctx, int var, void *value);
107 int (*setBaculaValue) (void *ctx, int var, void *value);
108 int (*JobMessage) (void *ctx, const char *file, int line, int type, int64_t mtime,
109 const char *fmt, ...);
110 int (*DebugMessage) (void *ctx, const char *file, int line, int level,
111 const char *fmt, ...);
112 void *(*baculaMalloc) (void *ctx, const char *file, int line, size_t size);
113 void (*baculaFree) (void *ctx, const char *file, int line, void *mem);
121 typedef union _baculainfos baculainfos;
129 typedef struct _baculainfos baculainfos;
130 struct _baculainfos {
136 typedef struct _progdata progdata;
149 /* memory allocation/deallocation */
150 #define MALLOC(size) \
151 (char *) bmalloc ( size );
153 #define ASSERT_MEMORY(m) \
155 printf ( "Error: memory allocation error!\n" ); \
160 if ( ptr != NULL ){ \
165 int registerBaculaEvents(void *ctx, ...)
170 int getBaculaValue(void *ctx, int var, void *value)
175 int setBaculaValue(void *ctx, int var, void *value)
180 int DebugMessage(void *ctx, const char *file, int line, int level, const char *fmt, ...)
183 printf("DG: %s:%d %s\n", file, line, fmt);
188 int JobMessage(void *ctx, const char *file, int line, int type, int64_t mtime,
189 const char *fmt, ...)
192 printf("JM: %s:%d <%d> %s\n", file, line, type, fmt);
197 void *baculaMalloc(void *ctx, const char *file, int line, size_t size)
202 void baculaFree(void *ctx, const char *file, int line, void *mem)
208 * displays a short help
210 void print_help(int argc, char *argv[])
214 "Usage: bpluginfo [options] <plugin_file.so>\n"
216 " -i list plugin header information only (default)\n"
217 " -f list plugin functions information only\n"
218 " -a <api> bacula api version (default %d)\n"
219 " -h help screen\n" "\n", DEFAULT_API_VERSION);
222 /* allocates and resets a main program data variable */
223 progdata *allocpdata(void)
228 pdata = (progdata *) bmalloc(sizeof(progdata));
229 ASSERT_MEMORY(pdata);
230 memset(pdata, 0, sizeof(progdata));
235 /* releases all allocated program data resources */
236 void freepdata(progdata * pdata)
239 if (pdata->pluginfile) {
240 FREE(pdata->pluginfile);
246 * parse execution arguments and fills required pdata structure fields
249 * pdata - pointer to program data structure
250 * argc, argv - execution envinroment variables
252 * pdata - required structure fields
256 * -i list plugin header info only (default)
257 * -f list implemented functions only
258 * -a bacula api version (default 1)
261 void parse_args(progdata * pdata, int argc, char *argv[])
271 /* TODO - add a real help screen */
272 printf("\nNot enough parameters!\n");
273 print_help(argc, argv);
278 /* TODO - add a real help screen */
279 printf("\nToo many parameters!\n");
280 print_help(argc, argv);
284 for (i = 1; i < argc; i++) {
285 if (strcmp(argv[i], "-h") == 0) {
287 print_help(argc, argv);
290 if (strcmp(argv[i], "-v") == 0) {
295 if (strcmp(argv[i], "-f") == 0) {
300 if (strcmp(argv[i], "-i") == 0) {
305 if (strcmp(argv[i], "-a") == 0) {
306 /* bacula api version */
308 s = sscanf(argv[i + 1], "%d", &api);
310 pdata->bapiversion = api;
315 printf("\nAPI version number required!\n");
316 print_help(argc, argv);
319 if (!pdata->pluginfile) {
320 if (argv[i][0] != '/') {
321 dirtmp = MALLOC(PATH_MAX);
322 ASSERT_MEMORY(dirtmp);
323 progdir = MALLOC(PATH_MAX);
324 ASSERT_MEMORY(progdir);
325 dirtmp = getcwd(dirtmp, PATH_MAX);
328 strcat(dirtmp, argv[i]);
330 if (realpath(dirtmp, progdir) == NULL) {
331 /* error in resolving path */
333 progdir = bstrdup(argv[i]);
335 pdata->pluginfile = bstrdup(progdir);
339 pdata->pluginfile = bstrdup(argv[i]);
347 * checks a plugin type based on a plugin magic string
350 * pdata - program data with plugin info structure
352 * int - enum plugintype
354 int getplugintype(progdata * pdata)
357 ASSERT_NVAL_RET_V(pdata, ERRORPLUGIN);
359 pluginfo *pinfo = pdata->pinfo;
361 ASSERT_NVAL_RET_V(pinfo, ERRORPLUGIN);
363 if (pinfo->pdirinfo.plugin_magic &&
364 strcmp(pinfo->pdirinfo.plugin_magic, DIR_PLUGIN_MAGIC) == 0) {
367 if (pinfo->pfdinfo.plugin_magic &&
368 strcmp(pinfo->pfdinfo.plugin_magic, FD_PLUGIN_MAGIC) == 0) {
371 if (pinfo->psdinfo.plugin_magic &&
372 strcmp(pinfo->psdinfo.plugin_magic, SD_PLUGIN_MAGIC) == 0) {
380 * prints any available information about a plugin
383 * pdata - program data with plugin info structure
387 void dump_pluginfo(progdata * pdata)
390 ASSERT_NVAL_RET(pdata);
392 pluginfo *pinfo = pdata->pinfo;
394 ASSERT_NVAL_RET(pinfo);
396 plugfuncs *pfuncs = pdata->pfuncs;
398 ASSERT_NVAL_RET(pfuncs);
400 switch (pdata->bplugtype) {
402 printf("\nPlugin type:\t\tBacula Director plugin\n");
403 if (pdata->verbose) {
404 printf("Plugin magic:\t\t%s\n", NPRT(pinfo->pdirinfo.plugin_magic));
406 printf("Plugin version:\t\t%s\n", pinfo->pdirinfo.plugin_version);
407 printf("Plugin release date:\t%s\n", NPRT(pinfo->pdirinfo.plugin_date));
408 printf("Plugin author:\t\t%s\n", NPRT(pinfo->pdirinfo.plugin_author));
409 printf("Plugin licence:\t\t%s\n", NPRT(pinfo->pdirinfo.plugin_license));
410 printf("Plugin description:\t%s\n", NPRT(pinfo->pdirinfo.plugin_description));
411 printf("Plugin API version:\t%d\n", pinfo->pdirinfo.version);
414 printf("\nPlugin type:\t\tFile Daemon plugin\n");
415 if (pdata->verbose) {
416 printf("Plugin magic:\t\t%s\n", NPRT(pinfo->pfdinfo.plugin_magic));
418 printf("Plugin version:\t\t%s\n", pinfo->pfdinfo.plugin_version);
419 printf("Plugin release date:\t%s\n", NPRT(pinfo->pfdinfo.plugin_date));
420 printf("Plugin author:\t\t%s\n", NPRT(pinfo->pfdinfo.plugin_author));
421 printf("Plugin licence:\t\t%s\n", NPRT(pinfo->pfdinfo.plugin_license));
422 printf("Plugin description:\t%s\n", NPRT(pinfo->pfdinfo.plugin_description));
423 printf("Plugin API version:\t%d\n", pinfo->pfdinfo.version);
426 printf("\nPlugin type:\t\tBacula Storage plugin\n");
427 if (pdata->verbose) {
428 printf("Plugin magic:\t\t%s\n", NPRT(pinfo->psdinfo.plugin_magic));
430 printf("Plugin version:\t\t%s\n", pinfo->psdinfo.plugin_version);
431 printf("Plugin release date:\t%s\n", NPRT(pinfo->psdinfo.plugin_date));
432 printf("Plugin author:\t\t%s\n", NPRT(pinfo->psdinfo.plugin_author));
433 printf("Plugin licence:\t\t%s\n", NPRT(pinfo->psdinfo.plugin_license));
434 printf("Plugin description:\t%s\n", NPRT(pinfo->psdinfo.plugin_description));
435 printf("Plugin API version:\t%d\n", pinfo->psdinfo.version);
438 printf("\nUnknown plugin type or other Error\n\n");
443 * prints any available information about plugin' functions
446 * pdata - program data with plugin info structure
450 void dump_plugfuncs(progdata * pdata)
453 ASSERT_NVAL_RET(pdata);
455 plugfuncs *pfuncs = pdata->pfuncs;
457 ASSERT_NVAL_RET(pfuncs);
459 printf("\nPlugin functions:\n");
461 switch (pdata->bplugtype) {
463 if (pdata->verbose) {
464 if (pfuncs->pdirfuncs.newPlugin) {
465 printf(" newPlugin()\n");
467 if (pfuncs->pdirfuncs.freePlugin) {
468 printf(" freePlugin()\n");
471 if (pfuncs->pdirfuncs.getPluginValue) {
472 printf(" getPluginValue()\n");
474 if (pfuncs->pdirfuncs.setPluginValue) {
475 printf(" setPluginValue()\n");
477 if (pfuncs->pdirfuncs.handlePluginEvent) {
478 printf(" handlePluginEvent()\n");
482 if (pdata->verbose) {
483 if (pfuncs->pfdfuncs.newPlugin) {
484 printf(" newPlugin()\n");
486 if (pfuncs->pfdfuncs.freePlugin) {
487 printf(" freePlugin()\n");
490 if (pfuncs->pfdfuncs.getPluginValue) {
491 printf(" getPluginValue()\n");
493 if (pfuncs->pfdfuncs.setPluginValue) {
494 printf(" setPluginValue()\n");
496 if (pfuncs->pfdfuncs.handlePluginEvent) {
497 printf(" handlePluginEvent()\n");
499 if (pfuncs->pfdfuncs.startBackupFile) {
500 printf(" startBackupFile()\n");
502 if (pfuncs->pfdfuncs.endBackupFile) {
503 printf(" endBackupFile()\n");
505 if (pfuncs->pfdfuncs.startRestoreFile) {
506 printf(" startRestoreFile()\n");
508 if (pfuncs->pfdfuncs.endRestoreFile) {
509 printf(" endRestoreFile()\n");
511 if (pfuncs->pfdfuncs.pluginIO) {
512 printf(" pluginIO()\n");
514 if (pfuncs->pfdfuncs.createFile) {
515 printf(" createFile()\n");
517 if (pfuncs->pfdfuncs.setFileAttributes) {
518 printf(" setFileAttributes()\n");
520 if (pfuncs->pfdfuncs.checkFile) {
521 printf(" checkFile()\n");
525 if (pdata->verbose) {
526 if (pfuncs->psdfuncs.newPlugin) {
527 printf(" newPlugin()\n");
529 if (pfuncs->psdfuncs.freePlugin) {
530 printf(" freePlugin()\n");
533 if (pfuncs->psdfuncs.getPluginValue) {
534 printf(" getPluginValue()\n");
536 if (pfuncs->psdfuncs.setPluginValue) {
537 printf(" setPluginValue()\n");
539 if (pfuncs->psdfuncs.handlePluginEvent) {
540 printf(" handlePluginEvent()\n");
544 printf("\nUnknown plugin type or other Error\n\n");
550 * argv[0] [options] <plugin_filename.so>
554 * 1 - cannot load a plugin
555 * 2 - cannot find a loadPlugin function
556 * 3 - cannot find an unloadPlugin function
557 * 10 - not enough memory
559 int main(int argc, char *argv[])
563 loadPlugin loadplugfunc;
564 unloadPlugin unloadplugfunc;
565 baculafuncs bfuncs = {
568 registerBaculaEvents,
578 pdata = allocpdata();
579 parse_args(pdata, argc, argv);
581 binfos.bfdinfo.size = sizeof(binfos);
582 binfos.bfdinfo.version = DEFAULT_API_VERSION;
584 pdata->pluginhandle = dlopen(pdata->pluginfile, RTLD_LAZY);
585 if (pdata->pluginhandle == NULL) {
586 printf("\nCannot load a plugin: %s\n\n", dlerror());
591 loadplugfunc = (loadPlugin) dlsym(pdata->pluginhandle, "loadPlugin");
592 if (loadplugfunc == NULL) {
593 printf("\nCannot find loadPlugin function: %s\n", dlerror());
594 printf("\nWhether the file is a really Bacula plugin?\n\n");
599 unloadplugfunc = (unloadPlugin) dlsym(pdata->pluginhandle, "unloadPlugin");
600 if (unloadplugfunc == NULL) {
601 printf("\nCannot find unloadPlugin function: %s\n", dlerror());
602 printf("\nWhether the file is a really Bacula plugin?\n\n");
607 if (pdata->bapiversion > 0) {
608 binfos.bdirinfo.version = pdata->bapiversion;
611 loadplugfunc(&binfos, &bfuncs, (void **)&pdata->pinfo, (void **)&pdata->pfuncs);
613 pdata->bplugtype = getplugintype(pdata);
615 if (!pdata->listfunc) {
616 dump_pluginfo(pdata);
618 if ((!pdata->listinfo && pdata->listfunc) || pdata->verbose) {
619 dump_plugfuncs(pdata);
625 dlclose(pdata->pluginhandle);