Blame SOURCES/022-crm_attribute-ra.patch

60de42
From cdd4419d08654d91cd8b72cca11e1d1cc51f1056 Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Thu, 16 Feb 2017 10:23:12 -0600
60de42
Subject: [PATCH 1/2] Fix: tools: crm_attribute should prefer node name from
60de42
 environment
60de42
60de42
Same behavior as was done for crm_node in e0eb9e76
60de42
---
60de42
 tools/crm_attribute.c | 11 +++++++++--
60de42
 1 file changed, 9 insertions(+), 2 deletions(-)
60de42
60de42
diff --git a/tools/crm_attribute.c b/tools/crm_attribute.c
60de42
index 7cb2774..60ded8d 100644
60de42
--- a/tools/crm_attribute.c
60de42
+++ b/tools/crm_attribute.c
60de42
@@ -44,7 +44,7 @@
60de42
 gboolean BE_QUIET = FALSE;
60de42
 char command = 'G';
60de42
 
60de42
-char *dest_uname = NULL;
60de42
+const char *dest_uname = NULL;
60de42
 char *dest_node = NULL;
60de42
 char *set_name = NULL;
60de42
 char *attr_id = NULL;
60de42
@@ -247,7 +247,14 @@ main(int argc, char **argv)
60de42
     } else if (safe_str_eq(type, XML_CIB_TAG_CRMCONFIG)) {
60de42
     } else if (safe_str_neq(type, XML_CIB_TAG_TICKETS)) {
60de42
         if (dest_uname == NULL) {
60de42
-            dest_uname = get_node_name(0);
60de42
+            /* If we are being called from a resource agent via the cluster,
60de42
+             * the correct local node name will be passed as an environment
60de42
+             * variable. Otherwise, we have to ask the cluster.
60de42
+             */
60de42
+            dest_uname = getenv("OCF_RESKEY_" CRM_META "_" XML_LRM_ATTR_TARGET);
60de42
+            if (dest_uname == NULL) {
60de42
+                dest_uname = get_local_node_name();
60de42
+            }
60de42
         }
60de42
 
60de42
         rc = query_node_uuid(the_cib, dest_uname, &dest_node, &is_remote_node);
60de42
-- 
60de42
1.8.3.1
60de42
60de42
60de42
From 56e89a47eff249306765d95d246783e691e8ce11 Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Thu, 16 Feb 2017 11:35:11 -0600
60de42
Subject: [PATCH 2/2] Log: cib,libcrmcommon,lrmd: handle IP addresses better in
60de42
 messages
60de42
60de42
This exposes lib/common/remote.c:get_ip_str() as a new internal API
60de42
crm_sockaddr2str(), and uses it wherever inet_ntoa() and inet_ntop()
60de42
were used previously.
60de42
60de42
Mainly, this reduces code duplication. It also takes cib/remote.c
60de42
one step towards supporting IPv6 addresses.
60de42
---
60de42
 cib/remote.c           | 12 +++++++-----
60de42
 include/crm_internal.h |  1 +
60de42
 lib/ais/plugin.c       | 16 ----------------
60de42
 lib/common/remote.c    | 48 ++++++++++++++++++++++++------------------------
60de42
 lrmd/tls_backend.c     | 12 ++----------
60de42
 5 files changed, 34 insertions(+), 55 deletions(-)
60de42
60de42
diff --git a/cib/remote.c b/cib/remote.c
60de42
index 9c2b972..9011552 100644
60de42
--- a/cib/remote.c
60de42
+++ b/cib/remote.c
60de42
@@ -285,7 +285,8 @@ cib_remote_listen(gpointer data)
60de42
 {
60de42
     int csock = 0;
60de42
     unsigned laddr;
60de42
-    struct sockaddr_in addr;
60de42
+    struct sockaddr_storage addr;
60de42
+    char ipstr[INET6_ADDRSTRLEN];
60de42
     int ssock = *(int *)data;
60de42
     int flag;
60de42
 
60de42
@@ -300,14 +301,15 @@ cib_remote_listen(gpointer data)
60de42
     laddr = sizeof(addr);
60de42
     memset(&addr, 0, sizeof(addr));
60de42
     csock = accept(ssock, (struct sockaddr *)&addr, &laddr);
60de42
-    crm_debug("New %s connection from %s",
60de42
-              ssock == remote_tls_fd ? "secure" : "clear-text", inet_ntoa(addr.sin_addr));
60de42
-
60de42
     if (csock == -1) {
60de42
-        crm_err("accept socket failed");
60de42
+        crm_perror(LOG_ERR, "Could not accept socket connection");
60de42
         return TRUE;
60de42
     }
60de42
 
60de42
+    crm_sockaddr2str(&addr, ipstr);
60de42
+    crm_debug("New %s connection from %s",
60de42
+              ((ssock == remote_tls_fd)? "secure" : "clear-text"), ipstr);
60de42
+
60de42
     if ((flag = fcntl(csock, F_GETFL)) >= 0) {
60de42
         if (fcntl(csock, F_SETFL, flag | O_NONBLOCK) < 0) {
60de42
             crm_err("fcntl() write failed");
60de42
diff --git a/include/crm_internal.h b/include/crm_internal.h
60de42
index a8fee47..96a68bd 100644
60de42
--- a/include/crm_internal.h
60de42
+++ b/include/crm_internal.h
60de42
@@ -204,6 +204,7 @@ int crm_remote_tcp_connect(const char *host, int port);
60de42
 int crm_remote_tcp_connect_async(const char *host, int port, int timeout,       /*ms */
60de42
                                  int *timer_id, void *userdata, void (*callback) (void *userdata, int sock));
60de42
 int crm_remote_accept(int ssock);
60de42
+void crm_sockaddr2str(void *sa, char *s);
60de42
 
60de42
 #  ifdef HAVE_GNUTLS_GNUTLS_H
60de42
 /*!
60de42
diff --git a/lib/ais/plugin.c b/lib/ais/plugin.c
60de42
index b8a2b96..fe89f03 100644
60de42
--- a/lib/ais/plugin.c
60de42
+++ b/lib/ais/plugin.c
60de42
@@ -674,22 +674,6 @@ pcmk_startup(struct corosync_api_v1 *init_with)
60de42
     return 0;
60de42
 }
60de42
 
60de42
-/*
60de42
-  static void ais_print_node(const char *prefix, struct totem_ip_address *host)
60de42
-  {
60de42
-  int len = 0;
60de42
-  char *buffer = NULL;
60de42
-
60de42
-  ais_malloc0(buffer, INET6_ADDRSTRLEN+1);
60de42
-
60de42
-  inet_ntop(host->family, host->addr, buffer, INET6_ADDRSTRLEN);
60de42
-
60de42
-  len = strlen(buffer);
60de42
-  ais_info("%s: %.*s", prefix, len, buffer);
60de42
-  ais_free(buffer);
60de42
-  }
60de42
-*/
60de42
-
60de42
 #if 0
60de42
 /* copied here for reference from exec/totempg.c */
60de42
 char *
60de42
diff --git a/lib/common/remote.c b/lib/common/remote.c
60de42
index 2042f78..80a7581 100644
60de42
--- a/lib/common/remote.c
60de42
+++ b/lib/common/remote.c
60de42
@@ -837,7 +837,7 @@ int
60de42
 crm_remote_tcp_connect_async(const char *host, int port, int timeout, /*ms */
60de42
                              int *timer_id, void *userdata, void (*callback) (void *userdata, int sock))
60de42
 {
60de42
-    char buffer[256];
60de42
+    char buffer[INET6_ADDRSTRLEN];
60de42
     struct addrinfo *res = NULL;
60de42
     struct addrinfo *rp = NULL;
60de42
     struct addrinfo hints;
60de42
@@ -882,20 +882,16 @@ crm_remote_tcp_connect_async(const char *host, int port, int timeout, /*ms */
60de42
             continue;
60de42
         }
60de42
 
60de42
-        memset(buffer, 0, DIMOF(buffer));
60de42
+        /* Set port appropriately for address family */
60de42
+        /* (void*) casts avoid false-positive compiler alignment warnings */
60de42
         if (addr->sa_family == AF_INET6) {
60de42
-            struct sockaddr_in6 *addr_in = (struct sockaddr_in6 *)(void*)addr;
60de42
-
60de42
-            addr_in->sin6_port = htons(port);
60de42
-            inet_ntop(addr->sa_family, &addr_in->sin6_addr, buffer, DIMOF(buffer));
60de42
-
60de42
+            ((struct sockaddr_in6 *)(void*)addr)->sin6_port = htons(port);
60de42
         } else {
60de42
-            struct sockaddr_in *addr_in = (struct sockaddr_in *)(void*)addr;
60de42
-
60de42
-            addr_in->sin_port = htons(port);
60de42
-            inet_ntop(addr->sa_family, &addr_in->sin_addr, buffer, DIMOF(buffer));
60de42
+            ((struct sockaddr_in *)(void*)addr)->sin_port = htons(port);
60de42
         }
60de42
 
60de42
+        memset(buffer, 0, DIMOF(buffer));
60de42
+        crm_sockaddr2str(addr, buffer);
60de42
         crm_info("Attempting to connect to remote server at %s:%d", buffer, port);
60de42
 
60de42
         if (callback) {
60de42
@@ -928,29 +924,33 @@ crm_remote_tcp_connect(const char *host, int port)
60de42
     return crm_remote_tcp_connect_async(host, port, -1, NULL, NULL, NULL);
60de42
 }
60de42
 
60de42
-
60de42
-/* Convert a struct sockaddr address to a string, IPv4 and IPv6: */
60de42
-
60de42
-static char *
60de42
-get_ip_str(const struct sockaddr_storage * sa, char * s, size_t maxlen)
60de42
+/*!
60de42
+ * \brief Convert an IP address (IPv4 or IPv6) to a string for logging
60de42
+ *
60de42
+ * \param[in]  sa  Socket address for IP
60de42
+ * \param[out] s   Storage for at least INET6_ADDRSTRLEN bytes
60de42
+ *
60de42
+ * \note sa The socket address can be a pointer to struct sockaddr_in (IPv4),
60de42
+ *          struct sockaddr_in6 (IPv6) or struct sockaddr_storage (either),
60de42
+ *          as long as its sa_family member is set correctly.
60de42
+ */
60de42
+void
60de42
+crm_sockaddr2str(void *sa, char *s)
60de42
 {
60de42
-    switch(((struct sockaddr *)sa)->sa_family) {
60de42
+    switch (((struct sockaddr*)sa)->sa_family) {
60de42
         case AF_INET:
60de42
             inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
60de42
-                      s, maxlen);
60de42
+                      s, INET6_ADDRSTRLEN);
60de42
             break;
60de42
 
60de42
         case AF_INET6:
60de42
             inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
60de42
-                      s, maxlen);
60de42
+                      s, INET6_ADDRSTRLEN);
60de42
             break;
60de42
 
60de42
         default:
60de42
-            strncpy(s, "Unknown AF", maxlen);
60de42
-            return NULL;
60de42
+            strcpy(s, "<invalid>");
60de42
     }
60de42
-
60de42
-    return s;
60de42
 }
60de42
 
60de42
 int
60de42
@@ -971,7 +971,7 @@ crm_remote_accept(int ssock)
60de42
     laddr = sizeof(addr);
60de42
     memset(&addr, 0, sizeof(addr));
60de42
     csock = accept(ssock, (struct sockaddr *)&addr, &laddr);
60de42
-    get_ip_str(&addr, addr_str, INET6_ADDRSTRLEN);
60de42
+    crm_sockaddr2str(&addr, addr_str);
60de42
     crm_info("New remote connection from %s", addr_str);
60de42
 
60de42
     if (csock == -1) {
60de42
diff --git a/lrmd/tls_backend.c b/lrmd/tls_backend.c
60de42
index 552b1d2..8c36434 100644
60de42
--- a/lrmd/tls_backend.c
60de42
+++ b/lrmd/tls_backend.c
60de42
@@ -248,17 +248,9 @@ bind_and_listen(struct addrinfo *addr)
60de42
     int optval;
60de42
     int fd;
60de42
     int rc;
60de42
-    char buffer[256] = { 0, };
60de42
-
60de42
-    if (addr->ai_family == AF_INET6) {
60de42
-        struct sockaddr_in6 *addr_in = (struct sockaddr_in6 *)(void*)addr->ai_addr;
60de42
-        inet_ntop(addr->ai_family, &addr_in->sin6_addr, buffer, DIMOF(buffer));
60de42
-
60de42
-    } else {
60de42
-        struct sockaddr_in *addr_in = (struct sockaddr_in *)(void*)addr->ai_addr;
60de42
-        inet_ntop(addr->ai_family, &addr_in->sin_addr, buffer, DIMOF(buffer));
60de42
-    }
60de42
+    char buffer[INET6_ADDRSTRLEN] = { 0, };
60de42
 
60de42
+    crm_sockaddr2str(addr->ai_addr, buffer);
60de42
     crm_trace("Attempting to bind on address %s", buffer);
60de42
 
60de42
     fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
60de42
-- 
60de42
1.8.3.1
60de42