]> git.sur5r.net Git - bacula/bacula/commitdiff
Plugin update
authorKern Sibbald <kern@sibbald.com>
Thu, 7 Feb 2008 21:24:51 +0000 (21:24 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 7 Feb 2008 21:24:51 +0000 (21:24 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6375 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/baconfig.h
bacula/src/dird/bacula-dir.conf.in
bacula/src/filed/backup.c
bacula/src/filed/fd-plugins.c
bacula/src/filed/fd-plugins.h
bacula/src/filed/restore.c
bacula/src/findlib/bfile.c
bacula/src/jcr.h
bacula/src/plugins/fd/bpipe-fd.c
bacula/src/plugins/fd/example-plugin-fd.c
bacula/src/stored/bscan.c

index c947d31739fc6ea88aecdeb323bd79ae21938437..0891c40e53353a206c5c073835871d398c3ef3a0 100644 (file)
@@ -1,7 +1,7 @@
 /*
    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.
@@ -207,27 +207,27 @@ void InitWinAPIWrapper();
  *   STREAM_SHA256_DIGEST
  *   STREAM_SHA512_DIGEST
  */
-#define STREAM_NONE               0    /* Reserved Non-Stream */
-#define STREAM_UNIX_ATTRIBUTES    1    /* Generic Unix attributes */
-#define STREAM_FILE_DATA          2    /* Standard uncompressed data */
-#define STREAM_MD5_SIGNATURE      3    /* deprecated */
-#define STREAM_MD5_DIGEST         3    /* MD5 digest for the file */
-#define STREAM_GZIP_DATA          4    /* GZip compressed file data */
+#define STREAM_NONE                        0    /* Reserved Non-Stream */
+#define STREAM_UNIX_ATTRIBUTES             1    /* Generic Unix attributes */
+#define STREAM_FILE_DATA                   2    /* Standard uncompressed data */
+#define STREAM_MD5_SIGNATURE               3    /* deprecated */
+#define STREAM_MD5_DIGEST                  3    /* MD5 digest for the file */
+#define STREAM_GZIP_DATA                   4    /* GZip compressed file data */
 /* Extended Unix attributes with Win32 Extended data.  Deprecated. */
-#define STREAM_UNIX_ATTRIBUTES_EX 5    /* Extended Unix attr for Win32 EX */
-#define STREAM_SPARSE_DATA        6    /* Sparse data stream */
-#define STREAM_SPARSE_GZIP_DATA   7
-#define STREAM_PROGRAM_NAMES      8    /* program names for program data */
-#define STREAM_PROGRAM_DATA       9    /* Data needing program */
-#define STREAM_SHA1_SIGNATURE    10    /* deprecated */
-#define STREAM_SHA1_DIGEST       10    /* SHA1 digest for the file */
-#define STREAM_WIN32_DATA        11    /* Win32 BackupRead data */
-#define STREAM_WIN32_GZIP_DATA   12    /* Gzipped Win32 BackupRead data */
-#define STREAM_MACOS_FORK_DATA   13    /* Mac resource fork */
-#define STREAM_HFSPLUS_ATTRIBUTES 14   /* Mac OS extra attributes */
+#define STREAM_UNIX_ATTRIBUTES_EX          5    /* Extended Unix attr for Win32 EX */
+#define STREAM_SPARSE_DATA                 6    /* Sparse data stream */
+#define STREAM_SPARSE_GZIP_DATA            7
+#define STREAM_PROGRAM_NAMES               8    /* program names for program data */
+#define STREAM_PROGRAM_DATA                9    /* Data needing program */
+#define STREAM_SHA1_SIGNATURE             10    /* deprecated */
+#define STREAM_SHA1_DIGEST                10    /* SHA1 digest for the file */
+#define STREAM_WIN32_DATA                 11    /* Win32 BackupRead data */
+#define STREAM_WIN32_GZIP_DATA            12    /* Gzipped Win32 BackupRead data */
+#define STREAM_MACOS_FORK_DATA            13    /* Mac resource fork */
+#define STREAM_HFSPLUS_ATTRIBUTES         14    /* Mac OS extra attributes */
 /*** FIXME ***/
-#define STREAM_UNIX_ATTRIBUTES_ACCESS_ACL 15 /* Standard ACL attributes on UNIX */
-#define STREAM_UNIX_ATTRIBUTES_DEFAULT_ACL 16 /* Default ACL attributes on UNIX */
+#define STREAM_UNIX_ACCESS_ACL            15   /* Standard ACL attributes on UNIX */
+#define STREAM_UNIX_DEFAULT_ACL           16   /* Default ACL attributes on UNIX */
 /*** FIXME ***/
 #define STREAM_SHA256_DIGEST              17   /* SHA-256 digest for the file */
 #define STREAM_SHA512_DIGEST              18   /* SHA-512 digest for the file */
index 2efe50f4990b76e5cd1862bacb15118fa6e4d5e1..f2e72d6652964f19b93f60dc63f0ee5df97140c1 100644 (file)
@@ -63,7 +63,9 @@ Job {
   # This creates an ASCII copy of the catalog
   # WARNING!!! Passing the password via the command line is insecure.
   # see comments in make_catalog_backup for details.
-  RunBeforeJob = "@scriptdir@/make_catalog_backup bacula bacula"
+  # Arguments to make_catalog_backup are:
+  #  make_catalog_backup <database-name> <user-name> <password> <host>
+  RunBeforeJob = "@scriptdir@/make_catalog_backup @db_name@ @db_user@"
   # This deletes the copy of the catalog
   RunAfterJob  = "@scriptdir@/delete_catalog_backup"
   Write Bootstrap = "@working_dir@/BackupCatalog.bsr"
index 87afdb62a3dab343db392b10e77d6fa99ac43c46..708a1635dba81e711049c244d15e751ba4ac7365 100644 (file)
@@ -443,6 +443,7 @@ int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
       if (!set_cmd_plugin(&ff_pkt->bfd, jcr)) {
          goto bail_out;
       }
+      send_plugin_name(jcr, sd);
    }
 
    /* Send attributes -- must be done after binit() */
@@ -567,12 +568,12 @@ int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
 
    if (ff_pkt->flags & FO_ACL) {
       /* Read access ACLs for files, dirs and links */
-      if (!read_and_send_acl(jcr, BACL_TYPE_ACCESS, STREAM_UNIX_ATTRIBUTES_ACCESS_ACL)) {
+      if (!read_and_send_acl(jcr, BACL_TYPE_ACCESS, STREAM_UNIX_ACCESS_ACL)) {
          goto bail_out;
       }
       /* Directories can have default ACLs too */
       if (ff_pkt->type == FT_DIREND && (BACL_CAP & BACL_CAP_DEFAULTS_DIR)) {
-         if (!read_and_send_acl(jcr, BACL_TYPE_DEFAULT, STREAM_UNIX_ATTRIBUTES_DEFAULT_ACL)) {
+         if (!read_and_send_acl(jcr, BACL_TYPE_DEFAULT, STREAM_UNIX_DEFAULT_ACL)) {
             goto bail_out;
          }
       }
index d407240a1d8f42d65ea7d300b139ee820ecd2a6b..53ba28879f09edc5d728f1dc16f0cf84bf7776ee 100644 (file)
@@ -45,6 +45,7 @@ extern int     (*plugin_bopen)(JCR *jcr, const char *fname, int flags, mode_t mo
 extern int     (*plugin_bclose)(JCR *jcr);
 extern ssize_t (*plugin_bread)(JCR *jcr, void *buf, size_t count);
 extern ssize_t (*plugin_bwrite)(JCR *jcr, void *buf, size_t count);
+extern boffset_t (*plugin_blseek)(JCR *jcr, boffset_t offset, int whence);
 
 
 /* Forward referenced functions */
@@ -60,6 +61,7 @@ static int     my_plugin_bopen(JCR *jcr, const char *fname, int flags, mode_t mo
 static int     my_plugin_bclose(JCR *jcr);
 static ssize_t my_plugin_bread(JCR *jcr, void *buf, size_t count);
 static ssize_t my_plugin_bwrite(JCR *jcr, void *buf, size_t count);
+static boffset_t my_plugin_blseek(JCR *jcr, boffset_t offset, int whence);
 
 
 /* Bacula info */
@@ -131,16 +133,18 @@ void generate_plugin_event(JCR *jcr, bEventType eventType, void *value)
          memset(&sp, 0, sizeof(sp));
          sp.type = FT_REG;
          sp.portable = true;
+         sp.cmd = cmd;
          Dmsg0(000, "Plugin startBackup\n");
          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;
-         ff_pkt->statp = sp.statp;        /* structure copy */
+         memcpy(&ff_pkt->statp, &sp.statp, sizeof(ff_pkt->statp));
          Dmsg1(000, "Save_file: file=%s\n", ff_pkt->fname);
          save_file(ff_pkt, (void *)jcr, true);
          goto bail_out;
@@ -152,6 +156,31 @@ bail_out:
    return;
 }
 
+/* 
+ * Send plugin name record to SD
+ */
+bool send_plugin_name(JCR *jcr, BSOCK *sd)
+{
+   int stat;
+   struct save_pkt *sp = (struct save_pkt *)jcr->plugin_sp;
+   Plugin *plugin = (Plugin *)jcr->plugin;
+   if (!sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_PLUGIN_NAME)) {
+     Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
+           sd->bstrerror());
+     return false;
+   }
+   stat = sd->fsend("%ld %d %s%c%s%c", jcr->JobFiles, sp->portable, 0, plugin->file,
+            sp->cmd, 0);
+   if (!stat) {
+      Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
+            sd->bstrerror());
+         return false;
+   }
+   sd->signal(BNET_EOD);            /* indicate end of plugin name data */
+   return true;
+}
+
+
 void load_fd_plugins(const char *plugin_dir)
 {
    if (!plugin_dir) {
@@ -164,6 +193,7 @@ void load_fd_plugins(const char *plugin_dir)
    plugin_bclose = my_plugin_bclose;
    plugin_bread  = my_plugin_bread;
    plugin_bwrite = my_plugin_bwrite;
+   plugin_blseek = my_plugin_blseek;
 
 }
 
@@ -271,6 +301,19 @@ static ssize_t my_plugin_bwrite(JCR *jcr, void *buf, size_t count)
    return (ssize_t)io.status;
 }
 
+static boffset_t my_plugin_blseek(JCR *jcr, boffset_t offset, int whence)
+{
+   Plugin *plugin = (Plugin *)jcr->plugin;
+   bpContext *plugin_ctx = (bpContext *)jcr->plugin_ctx;
+   struct io_pkt io;
+   Dmsg0(000, "plugin_bseek\n");
+   io.func = IO_SEEK;
+   io.offset = offset;
+   io.whence = whence;
+   plug_func(plugin)->pluginIO(plugin_ctx, &io);
+   return (boffset_t)io.offset;
+}
+
 /* ==============================================================
  *
  * Callbacks from the plugin
@@ -346,6 +389,7 @@ int     (*plugin_bopen)(JCR *jcr, const char *fname, int flags, mode_t mode) = N
 int     (*plugin_bclose)(JCR *jcr) = NULL;
 ssize_t (*plugin_bread)(JCR *jcr, void *buf, size_t count) = NULL;
 ssize_t (*plugin_bwrite)(JCR *jcr, void *buf, size_t count) = NULL;
+boffset_t (*plugin_blseek)(JCR *jcr, boffset_t offset, int whence) = NULL;
 
 int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
 {
index 30f4d35103f7fed883862ab6084517048367b0fe..18e392fcebe65e8e7a7f58cdd302d3af0837f396 100644 (file)
@@ -50,22 +50,26 @@ struct save_pkt {
   char *fname;                        /* Full path and filename */
   char *link;                         /* Link name if any */
   struct stat statp;                  /* System stat() packet for file */
-  int type;                           /* FT_xx for this file */             
+  int32_t type;                       /* FT_xx for this file */             
   uint32_t flags;                     /* Bacula internal flags */
   bool portable;                      /* set if data format is portable */
+  char *cmd;                          /* command */
 };
 
 #define IO_OPEN  1
 #define IO_READ  2
 #define IO_WRITE 3
 #define IO_CLOSE 4
+#define IO_SEEK  5
 
 struct io_pkt {
-   int func;                          /* Function code */
-   int count;                         /* read/write count */
+   int32_t func;                      /* Function code */
+   int32_t count;                     /* read/write count */
    char *buf;                         /* read/write buffer */
-   int status;                        /* return status */
-   int io_errno;                      /* errno code */  
+   int32_t status;                    /* return status */
+   int32_t io_errno;                  /* errno code */  
+   int32_t whence;
+   boffset_t offset;
 };
 
 /****************************************************************************
@@ -115,6 +119,7 @@ void load_fd_plugins(const char *plugin_dir);
 void new_plugins(JCR *jcr);
 void free_plugins(JCR *jcr);
 void generate_plugin_event(JCR *jcr, bEventType event, void *value=NULL);
+bool send_plugin_name(JCR *jcr, BSOCK *sd);
 
 #ifdef __cplusplus
 extern "C" {
index 30fb4dc4da58b8b16580174895476485f3698cbe..8abe454371995e1d14c639c641a800e3b63f3872 100644 (file)
@@ -1,7 +1,7 @@
 /*
    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.
@@ -122,7 +122,7 @@ bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags,
  * Close a bfd check that we are at the expected file offset.
  * Makes some code in set_attributes().
  */
-int bclose_chksize(JCR *jcr, BFILE *bfd, boffset_t osize)
+static int bclose_chksize(JCR *jcr, BFILE *bfd, boffset_t osize)
 {
    char ec1[50], ec2[50];
    boffset_t fsize;
@@ -580,7 +580,7 @@ void do_restore(JCR *jcr)
 #endif
          break;
 
-      case STREAM_UNIX_ATTRIBUTES_ACCESS_ACL:
+      case STREAM_UNIX_ACCESS_ACL:
          if (have_acl) {
             pm_strcpy(jcr->acl_text, sd->msg);
             Dmsg2(400, "Restoring ACL type 0x%2x <%s>\n", BACL_TYPE_ACCESS, jcr->acl_text);
@@ -592,7 +592,7 @@ void do_restore(JCR *jcr)
          }
          break;
 
-      case STREAM_UNIX_ATTRIBUTES_DEFAULT_ACL:
+      case STREAM_UNIX_DEFAULT_ACL:
          if (have_acl) {
             pm_strcpy(jcr->acl_text, sd->msg);
             Dmsg2(400, "Restoring ACL type 0x%2x <%s>\n", BACL_TYPE_DEFAULT, jcr->acl_text);
index d5020dd38599a1628da3dba09b96fd610f1baf55..1473db59993bc27b5104ac7697631a8d27ac8a61 100644 (file)
@@ -43,6 +43,7 @@ int     (*plugin_bopen)(JCR *jcr, const char *fname, int flags, mode_t mode) = N
 int     (*plugin_bclose)(JCR *jcr) = NULL;
 ssize_t (*plugin_bread)(JCR *jcr, void *buf, size_t count) = NULL;
 ssize_t (*plugin_bwrite)(JCR *jcr, void *buf, size_t count) = NULL;
+boffset_t (*plugin_blseek)(JCR *jcr, boffset_t offset, int whence) = NULL;
 
 
 #ifdef HAVE_DARWIN_OS
@@ -106,9 +107,9 @@ const char *stream_to_ascii(int stream)
       return _("MacOS Fork data");
    case STREAM_HFSPLUS_ATTRIBUTES:
       return _("HFS+ attribs");
-   case STREAM_UNIX_ATTRIBUTES_ACCESS_ACL:
+   case STREAM_UNIX_ACCESS_ACL:
       return _("Standard Unix ACL attribs");
-   case STREAM_UNIX_ATTRIBUTES_DEFAULT_ACL:
+   case STREAM_UNIX_DEFAULT_ACL:
       return _("Default Unix ACL attribs");
    case STREAM_SHA256_DIGEST:
       return _("SHA256 digest");
@@ -903,6 +904,10 @@ bool is_bopen(BFILE *bfd)
 boffset_t blseek(BFILE *bfd, boffset_t offset, int whence)
 {
     boffset_t pos;
+
+   if (bfd->cmd_plugin && plugin_bwrite) {
+      return plugin_blseek(bfd->jcr, offset, whence);
+   }
     pos = (boffset_t)lseek(bfd->fid, (off_t)offset, whence);
     bfd->berrno = errno;
     return pos;
index d7b6b9e816efa01fc778f934da6896540c7c7b0b..c520b685da9255a81fda352fc0608c3c01169356 100644 (file)
@@ -212,6 +212,7 @@ public:
    void *plugin_ctx_list;             /* list of contexts for plugins */
    void *plugin_ctx;                  /* current plugin context */
    void *plugin;                      /* plugin instance */
+   void *plugin_sp;                   /* plugin save packet */
 
    /* Daemon specific part of JCR */
    /* This should be empty in the library */
index f29eb72b2af712485b88328bbfe988d3412f76af..a14c8292e3f2f4a8a5db78eebc36c8b0755298ca 100644 (file)
@@ -88,6 +88,7 @@ static pFuncs pluginFuncs = {
 
 struct plugin_ctx {
    int record;
+   boffset_t offset;
 };
 
 bRC loadPlugin(bInfo *lbinfo, bFuncs *lbfuncs, pInfo **pinfo, pFuncs **pfuncs)
@@ -158,6 +159,13 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value)
       printf("bpipe-fd: since=%d\n", (int)value);
       break;
 
+   case bEventRestoreStart: 
+      printf("bpipe-fd: RestoreStart\n");
+      break;
+   case bEventRestoreEnd:
+      printf("bpipe-fd: RestoreEnd\n");
+      break;
+
    /* Plugin command e.g. plugin = <plugin-name>:<name-space>:command */
    case bEventPluginCommand:
       printf("bpipe-fd: command=%s\n", (char *)value);
@@ -175,7 +183,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value)
 
 static bRC startPluginBackup(bpContext *ctx, struct save_pkt *sp)
 {
-   static char *fname = (char *)"/BPIPE/test.txt";
+   static char *fname = (char *)"/@BPIPE/test.txt";
    time_t now = time(NULL);
    sp->fname = fname;
    sp->statp.st_mode = 0700;
@@ -208,6 +216,7 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io)
       if (p_ctx->record == 0) {
          strcpy(io->buf, "This is a test string.\n");
          io->status = strlen(io->buf);
+         p_ctx->offset = io->status;
          p_ctx->record = 1;
          return bRC_OK;
       }
@@ -219,6 +228,9 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io)
    case IO_CLOSE:
       printf("bpipe-fd: IO_CLOSE\n");
       break;
+   case IO_SEEK:
+      io->offset = p_ctx->offset;
+      break;
    }
    return bRC_OK;
 }
index 01e30d3d3072faa80587e6539d35b2645c888849..24eb21855316dcfe18107a01fb6cf4a4e0ff54eb 100644 (file)
@@ -153,6 +153,12 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value)
    case bEventSince:
       printf("plugin: since=%d\n", (int)value);
       break;
+   case bEventRestoreStart:
+      printf("bpipe-fd: RestoreStart\n");
+      break;
+   case bEventRestoreEnd:
+      printf("bpipe-fd: RestoreEnd\n");
+      break;
 
    /* Plugin command e.g. plugin = <plugin-name>:<name-space>:command */
    case bEventPluginCommand:
index a5b6cf28412162fb728617951972c3af30c41bf7..2bdeac3f0480228d5734b3b6cfbdeca7ffddb641 100644 (file)
@@ -790,8 +790,8 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       }
       break;
 
-   case STREAM_UNIX_ATTRIBUTES_ACCESS_ACL:   /* Standard ACL attributes on UNIX */
-   case STREAM_UNIX_ATTRIBUTES_DEFAULT_ACL:  /* Default ACL attributes on UNIX */
+   case STREAM_UNIX_ACCESS_ACL:          /* Standard ACL attributes on UNIX */
+   case STREAM_UNIX_DEFAULT_ACL:         /* Default ACL attributes on UNIX */
       /* Ignore Unix attributes */
       break;