|
|
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 |
|