]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Apply Steve Polyack patch to add DirSourceAddress and FDSourceAddress
authorEric Bollengier <eric@eb.homelinux.org>
Tue, 26 May 2009 13:44:08 +0000 (13:44 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Tue, 26 May 2009 13:44:08 +0000 (13:44 +0000)
     directives. That permits to choose the outgoing interface.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8863 91ce42f0-d328-0410-95d8-f526ca767f89

12 files changed:
bacula/src/dird/dird_conf.c
bacula/src/dird/dird_conf.h
bacula/src/dird/fd_cmds.c
bacula/src/dird/msgchan.c
bacula/src/filed/filed_conf.c
bacula/src/filed/filed_conf.h
bacula/src/filed/job.c
bacula/src/lib/bnet.c
bacula/src/lib/bsock.c
bacula/src/lib/bsock.h
bacula/src/lib/lib.h
bacula/technotes

index 3087c440d5fc78220fb320d2c7b717bd5cd2279c..83c583618c46974c24415eb7b6a2c39c182a3531 100644 (file)
@@ -112,6 +112,7 @@ static RES_ITEM dir_items[] = {
    {"dirport",     store_addresses_port,    ITEM(res_dir.DIRaddrs),  0, ITEM_DEFAULT, 9101},
    {"diraddress",  store_addresses_address, ITEM(res_dir.DIRaddrs),  0, ITEM_DEFAULT, 9101},
    {"diraddresses",store_addresses,         ITEM(res_dir.DIRaddrs),  0, ITEM_DEFAULT, 9101},
+   {"dirsourceaddress",store_addresses_address, ITEM(res_dir.DIRsrc_addr),  0, ITEM_DEFAULT, 0},
    {"queryfile",   store_dir,      ITEM(res_dir.query_file), 0, ITEM_REQUIRED, 0},
    {"workingdirectory", store_dir, ITEM(res_dir.working_directory), 0, ITEM_REQUIRED, 0},
    {"plugindirectory",  store_dir, ITEM(res_dir.plugin_directory),  0, 0, 0},
@@ -1079,6 +1080,9 @@ void free_resource(RES *sres, int type)
       if (res->res_dir.DIRaddrs) {
          free_addresses(res->res_dir.DIRaddrs);
       }
+      if (res->res_dir.DIRsrc_addr) {
+         free_addresses(res->res_dir.DIRsrc_addr);
+      }
       if (res->res_dir.tls_ctx) { 
          free_tls_context(res->res_dir.tls_ctx);
       }
index fea4ee029e7010261e090ba242c3206b2a1764e1..231dfabe5d6ab084ed7ae04d1863cb87b48de1ac 100644 (file)
@@ -106,6 +106,7 @@ class DIRRES {
 public:
    RES   hdr;
    dlist *DIRaddrs;
+   dlist *DIRsrc_addr;                /* address to source connections from */
    char *password;                    /* Password for UA access */
    char *query_file;                  /* SQL query file */
    char *working_directory;           /* WorkingDirectory */
index 5badf778bf660770008d0533b7bbc00c9e552295..6859a6e55f3f51120354f7ad32d7dcc0333c11ac 100644 (file)
@@ -80,7 +80,7 @@ extern int FDConnectTimeout;
 int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time,
                            int verbose)
 {
-   BSOCK   *fd;
+   BSOCK   *fd = new_bsock();
    char ed1[30];
    utime_t heart_beat;
 
@@ -94,8 +94,14 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time,
       char name[MAX_NAME_LENGTH + 100];
       bstrncpy(name, _("Client: "), sizeof(name));
       bstrncat(name, jcr->client->name(), sizeof(name));
-      fd = bnet_connect(jcr, retry_interval, max_retry_time, heart_beat,
-           name, jcr->client->address, NULL, jcr->client->FDport, verbose);
+
+      fd->set_source_address(director->DIRsrc_addr);
+      if (!fd->connect(jcr,retry_interval,max_retry_time, heart_beat, name, jcr->client->address,
+           NULL, jcr->client->FDport, verbose)) {
+        fd->destroy();
+        fd = NULL;
+      }
+
       if (fd == NULL) {
          set_jcr_job_status(jcr, JS_ErrorTerminated);
          return 0;
index 1955ccc093c46993cd0f9ab26bc47a81a42196ee..1ccfb81c0c7ab28d204badfe566da118ecc72280 100644 (file)
@@ -76,7 +76,7 @@ extern "C" void *msg_thread(void *arg);
 bool connect_to_storage_daemon(JCR *jcr, int retry_interval,
                               int max_retry_time, int verbose)
 {
-   BSOCK *sd;
+   BSOCK *sd = new_bsock();
    STORE *store;
    utime_t heart_beat;    
 
@@ -102,9 +102,13 @@ bool connect_to_storage_daemon(JCR *jcr, int retry_interval,
     */
    Dmsg2(100, "bnet_connect to Storage daemon %s:%d\n", store->address,
       store->SDport);
-   sd = bnet_connect(jcr, retry_interval, max_retry_time, heart_beat,
-          _("Storage daemon"), store->address,
-          NULL, store->SDport, verbose);
+   sd->set_source_address(director->DIRsrc_addr);
+   if (!sd->connect(jcr, retry_interval, max_retry_time, heart_beat, _("Storage daemon"),
+         store->address, NULL, store->SDport, verbose)) {
+      sd->destroy();
+      sd = NULL;
+   }
+
    if (sd == NULL) {
       return false;
    }
index 7a07998759466e5eb694008e17a954b440e1ee91..b8470c39b32dfa0f58405173f430c9c7a1d8cfab 100644 (file)
@@ -91,6 +91,7 @@ static RES_ITEM cli_items[] = {
    {"fdport",      store_addresses_port,    ITEM(res_client.FDaddrs),  0, ITEM_DEFAULT, 9102},
    {"fdaddress",   store_addresses_address, ITEM(res_client.FDaddrs),  0, ITEM_DEFAULT, 9102},
    {"fdaddresses", store_addresses,         ITEM(res_client.FDaddrs),  0, ITEM_DEFAULT, 9102},
+   {"fdsourceaddress", store_addresses_address, ITEM(res_client.FDsrc_addr),  0, ITEM_DEFAULT, 0},
 
    {"workingdirectory",  store_dir, ITEM(res_client.working_directory), 0, ITEM_REQUIRED, 0},
    {"piddirectory",  store_dir,     ITEM(res_client.pid_directory),     0, ITEM_REQUIRED, 0},
@@ -267,6 +268,9 @@ void free_resource(RES *sres, int type)
       if (res->res_client.FDaddrs) {
          free_addresses(res->res_client.FDaddrs);
       }
+      if (res->res_client.FDsrc_addr) {
+         free_addresses(res->res_client.FDsrc_addr);
+      }
 
       if (res->res_client.pki_keypair_file) { 
          free(res->res_client.pki_keypair_file);
index 3624950b0eafba8697f44eb2da86ef2a192a2d22..978c94a584677dd7179dc95672e70c35f55d4bb7 100644 (file)
@@ -76,6 +76,7 @@ struct DIRRES {
 struct CLIENT {
    RES   hdr;
    dlist *FDaddrs;
+   dlist *FDsrc_addr;                 /* address to source connections from */
    char *working_directory;
    char *pid_directory;
    char *subsys_directory;
index c85e5ad0b0e5dcc665b0497ae54209219733e2dd..4d825499ee11eac6cc3943eaadcac7d3dc747284 100644 (file)
@@ -1371,7 +1371,7 @@ static int storage_cmd(JCR *jcr)
    int stored_port;                /* storage daemon port */
    int enable_ssl;                 /* enable ssl to sd */
    BSOCK *dir = jcr->dir_bsock;
-   BSOCK *sd;                         /* storage daemon bsock */
+   BSOCK *sd = new_bsock();        /* storage daemon bsock */
 
    Dmsg1(100, "StorageCmd: %s", dir->msg);
    if (sscanf(dir->msg, storaddr, &jcr->stored_addr, &stored_port, &enable_ssl) != 3) {
@@ -1382,8 +1382,14 @@ static int storage_cmd(JCR *jcr)
    Dmsg3(110, "Open storage: %s:%d ssl=%d\n", jcr->stored_addr, stored_port, enable_ssl);
    /* Open command communications with Storage daemon */
    /* Try to connect for 1 hour at 10 second intervals */
-   sd = bnet_connect(jcr, 10, (int)me->SDConnectTimeout, me->heartbeat_interval,
-                      _("Storage daemon"), jcr->stored_addr, NULL, stored_port, 1);
+
+   sd->set_source_address(me->FDsrc_addr);
+   if (!sd->connect(jcr, 10, (int)me->SDConnectTimeout, me->heartbeat_interval,
+                _("Storage daemon"), jcr->stored_addr, NULL, stored_port, 1)) {
+     sd->destroy();
+     sd = NULL;
+   }
+
    if (sd == NULL) {
       Jmsg(jcr, M_FATAL, 0, _("Failed to connect to Storage daemon: %s:%d\n"),
           jcr->stored_addr, stored_port);
index 2e247eef23c48e0bc297161563e7472f4c4950a4..ee2415db8d8caae6c4e88e01089731923a095278 100644 (file)
@@ -702,6 +702,9 @@ BSOCK *dup_bsock(BSOCK *osock)
    if (osock->host()) {
       bsock->set_host(bstrdup(osock->host()));
    }
+   if (osock->src_addr) {
+      bsock->src_addr = New( IPADDR( *(osock->src_addr)) );
+   }
    bsock->set_duped();
    return bsock;
 }
index 788c1237261fcfc227df5e1765fd5bae566204d8..a19a90b011cc5b1ac51b814c1646dd87e24f63d1 100644 (file)
@@ -161,6 +161,26 @@ void BSOCK::fin_init(JCR * jcr, int sockfd, const char *who, const char *host, i
    set_jcr(jcr);
 }
 
+/*
+ * Copy the address from the configuration dlist that gets passed in
+ */
+void BSOCK::set_source_address(dlist *src_addr_list)
+{
+   IPADDR *addr = NULL;
+
+   // delete the object we already have, if it's allocated
+   if (src_addr) {
+     free( src_addr);
+     src_addr = NULL;
+   }
+
+   if (src_addr_list) {
+     addr = (IPADDR*) src_addr_list->first();
+     src_addr = New( IPADDR(*addr));
+   }
+}
+
+
 /*
  * Open a TCP connection to the server
  * Returns NULL
@@ -208,6 +228,19 @@ bool BSOCK::open(JCR *jcr, const char *name, char *host, char *service,
             ipaddr->get_family(), ipaddr->get_port_host_order(), be.bstrerror());
          continue;
       }
+
+      /* Bind to the source address if it is set */
+      if (src_addr) {
+         if (bind(sockfd, src_addr->get_sockaddr(), src_addr->get_sockaddr_len()) < 0) {
+            berrno be;
+            save_errno = errno;
+            *fatal = 1;
+            Pmsg2(000, _("Source address bind error. proto=%d. ERR=%s\n"),
+                  src_addr->get_family(), be.bstrerror() );
+            continue;
+         }
+      }
+
       /*
        * Keep socket from timing out from inactivity
        */
@@ -885,6 +918,10 @@ void BSOCK::destroy()
       free(m_host);
       m_host = NULL;
    }
+   if (src_addr) {
+      free(src_addr);
+      src_addr = NULL;
+   } 
    free(this);
 }
 
index ccea240602cc94fe7411d024231e875c90351408..fca01157a40ba3e82dccf1de8969d3e06dfd711c 100644 (file)
@@ -89,6 +89,7 @@ public:
    FILE *m_spool_fd;                  /* spooling file */
    struct sockaddr client_addr;       /* client's IP address */
    struct sockaddr_in peer_addr;      /* peer's IP address */
+   IPADDR *src_addr;                  /* IP address to source connections from */
 
    /* methods -- in bsock.c */
    void init();
@@ -116,6 +117,7 @@ public:
                   TLS_CONTEXT *tls_ctx, char *msg, int msglen);
    bool set_locking();                /* in bsock.c */
    void clear_locking();              /* in bsock.c */
+   void set_source_address(dlist *src_addr_list);
 
    /* Inline functions */
    void set_jcr(JCR *jcr) { m_jcr = jcr; };
index 07bc7e518ec4868e9e7ac7dc43dc08453cb6ce2b..09655c9a85a0f5ad22b39ecd45ac517cf0bb2525 100644 (file)
@@ -53,6 +53,7 @@
 #include "lex.h"
 #include "parse_conf.h"
 #include "tls.h"
+#include "address_conf.h"
 #include "bsock.h"
 #include "workq.h"
 #ifndef HAVE_FNMATCH
@@ -67,7 +68,6 @@
 #include "bpipe.h"
 #include "attr.h"
 #include "var.h"
-#include "address_conf.h"
 #include "guid_to_name.h"
 
 #include "protos.h"
index 6d7fc3c466f33fdf50cbe12e5f8abda27a79bac6..079fa213225e1ab15e76b29b6efd48ed8fabdcc1 100644 (file)
@@ -2,6 +2,9 @@
           
 General:
 
+26May09
+ebl  Apply Steve Polyack patch to add DirSourceAddress and FDSourceAddress
+     directives. That permits to choose the outgoing interface.
 25May09
 mvw  Allow acl and xattr to be explicitly enabled and fail the configure
      if we are asked to enable acl or xattr support and the OS doesn't support