[Cluster-devel] conga luci/conga_ssl/setup.py ricci/common/Cli ...
kupcevic at sourceware.org
kupcevic at sourceware.org
Fri Mar 23 17:25:15 UTC 2007
CVSROOT: /cvs/cluster
Module name: conga
Changes by: kupcevic at sourceware.org 2007-03-23 17:25:13
Modified files:
luci/conga_ssl : setup.py
ricci/common : ClientSocket.cpp Makefile Socket.cpp
ricci/include : Socket.h
ricci/modules/cluster/clumon/src/daemon: Monitor.cpp Monitor.h
ricci/ricci : Ricci.cpp
Added files:
ricci/common : Network.cpp
ricci/include : Network.h
Log message:
Reorganize socket-handling code
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/setup.py.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Network.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/ClientSocket.cpp.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Makefile.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Socket.cpp.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/include/Network.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/include/Socket.h.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp.diff?cvsroot=cluster&r1=1.13&r2=1.14
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/Ricci.cpp.diff?cvsroot=cluster&r1=1.24&r2=1.25
--- conga/luci/conga_ssl/setup.py 2006/12/06 22:34:09 1.1
+++ conga/luci/conga_ssl/setup.py 2007/03/23 17:25:12 1.2
@@ -13,6 +13,7 @@
'SSLClient.cpp',
'../../ricci/common/ClientSocket.cpp',
'../../ricci/common/Socket.cpp',
+ '../../ricci/common/Network.cpp',
'../../ricci/common/Logger.cpp',
'../../ricci/common/Time.cpp',
'../../ricci/common/File.cpp',
/cvs/cluster/conga/ricci/common/Network.cpp,v --> standard output
revision 1.1
--- conga/ricci/common/Network.cpp
+++ - 2007-03-23 17:25:14.652053000 +0000
@@ -0,0 +1,84 @@
+/*
+ Copyright Red Hat, Inc. 2007
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#include "Network.h"
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+
+
+counting_auto_ptr<Network::Hostent>
+Network::getHostByName(const String& hostname)
+{
+ counting_auto_ptr<Hostent> ent_d(new Hostent());
+ struct hostent *ent = 0;
+ int error;
+ gethostbyname2_r(hostname.c_str(), AF_INET,
+ &(ent_d->ent),
+ ent_d->data, sizeof(ent_d->data),
+ &ent,
+ &error);
+ if (ent == &(ent_d->ent))
+ return ent_d;
+ throw String("unable to resolve ") + hostname;
+}
+
+
+std::vector<String>
+Network::name2IP(const String& hostname)
+{
+ std::vector<String> addrs;
+ try {
+ char buff[INET_ADDRSTRLEN+1];
+ counting_auto_ptr<Hostent> hent = getHostByName(hostname);
+ char** addrs_b = (*hent)->h_addr_list;
+ for (int i=0; addrs_b[i]; i++) {
+ struct in_addr addr;
+ addr.s_addr = *((u_int32_t*) addrs_b[i]);
+ if (inet_ntop(AF_INET, &addr, buff, sizeof(buff)))
+ addrs.push_back(buff);
+ }
+ } catch ( ... ) {}
+ return addrs;
+}
+
+
+String
+Network::localhost()
+{
+ // get hostname
+ char name[1024];
+ if (gethostname(name, sizeof(name)-1))
+ return "";
+ name[sizeof(name)-1] = '\0';
+
+ try {
+ // get fqdn
+ counting_auto_ptr<Hostent> ent = getHostByName(name);
+ return String((*ent)->h_name);
+ } catch ( ... ) {
+ return name;
+ }
+}
--- conga/ricci/common/ClientSocket.cpp 2007/03/21 22:51:20 1.6
+++ conga/ricci/common/ClientSocket.cpp 2007/03/23 17:25:12 1.7
@@ -23,7 +23,7 @@
#include "Socket.h"
#include "Logger.h"
-#include "Time.h"
+#include "Network.h"
#include <unistd.h>
#include <errno.h>
@@ -39,7 +39,7 @@
Socket(-1)
{}
-ClientSocket::ClientSocket(int sock, unsigned int addr) :
+ClientSocket::ClientSocket(int sock, u_int32_t addr) :
Socket(sock),
_addr(addr)
{}
@@ -67,95 +67,57 @@
// log(msg, LogSocket);
}
-ClientSocket::ClientSocket(const String& hostname,
- unsigned short port,
- unsigned int timeout_ms) :
+ClientSocket::ClientSocket(const String& hostname,
+ unsigned short port,
+ unsigned int timeout_ms) :
Socket(-1)
{
_sock = socket(PF_INET, SOCK_STREAM, 0);
if (_sock == -1)
throw String("ClientSocket(hostname, port, timeout): socket() failed");
- nonblocking(true);
-
- char hostbuf[4096];
- struct hostent hostent_result;
- struct hostent *ent = NULL;
- int ret = 0;
-
- if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result,
- hostbuf, sizeof(hostbuf),
- &ent, &ret) || !ent)
- throw String("ClientSocket(hostname, port, timeout): gethostbyname() failed");
+ if (timeout_ms)
+ nonblocking(true);
- char** addrs = ent->h_addr_list;
- for (int i=0; addrs[i]; i++) {
- struct sockaddr_in addr_in;
- addr_in.sin_family = AF_INET;
- addr_in.sin_port = htons(port);
- addr_in.sin_addr.s_addr = *((u_int32_t*) addrs[i]);
-
- ret = connect(_sock, (struct sockaddr*) &addr_in, sizeof(addr_in));
- if (ret != -1 || errno != EINPROGRESS)
- continue;
-
- unsigned int end = time_mil() + timeout_ms;
- do {
- bool can_read = false;
- bool can_write = true;
- poll(can_read, can_write, timeout_ms);
- if (can_write && can_read) {
- /* an error occurred */
- throw String("ClientSocket(hostname, port, timeout): connect() failed");
- }
-
- if (can_write && !can_read) {
- _addr = addr_in.sin_addr.s_addr;
- return;
- }
-
- } while (time_mil() < end);
-
- throw String("ClientSocket(hostname, port, timeout): connect() timed out");
- }
-
- throw String("ClientSocket(hostname, port, timeout): connect() failed");
-}
-
-ClientSocket::ClientSocket(const String& hostname, unsigned short port) :
- Socket(-1)
-{
- _sock = socket(PF_INET, SOCK_STREAM, 0);
- if (_sock == -1)
- throw String("ClientSocket(hostname, port): socket() failed");
-
- char hostbuf[4096];
- struct hostent hostent_result;
- struct hostent *ent = NULL;
- int ret = 0;
-
- if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result,
- hostbuf, sizeof(hostbuf),
- &ent, &ret) || !ent)
- throw String("ClientSocket(hostname, port): gethostbyname() failed");
+ counting_auto_ptr<Network::Hostent> ent = Network::getHostByName(hostname);
- char** addrs = ent->h_addr_list;
+ char** addrs = (*ent)->h_addr_list;
for (int i=0; addrs[i]; i++) {
struct sockaddr_in addr_in;
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(port);
addr_in.sin_addr.s_addr = *((u_int32_t*) addrs[i]);
- if (connect(_sock, (struct sockaddr*) &addr_in, sizeof(addr_in)))
- continue;
- else {
- // String msg = String("created client socket ") + _sock;
- // msg += ", and connected to " + hostname + ", port " + port;
- // log(msg, LogSocket);
+
+ if (connect(_sock, (struct sockaddr*) &addr_in, sizeof(addr_in)) == 0) {
+ // connected
+ nonblocking(false);
_addr = addr_in.sin_addr.s_addr;
return;
}
+
+ // connect() error
+ if (errno != EINPROGRESS)
+ continue;
+ bool can_read=false, can_write=true;
+ poll(can_read, can_write, timeout_ms);
+ if (can_write == false) {
+ // connect() not completed
+ throw String("ClientSocket(hostname, port, timeout): connect() timed out");
+ }
+ // connect() completed, check successfulness
+ int err = 1;
+ socklen_t err_size = sizeof(err);
+ getsockopt(_sock, SOL_SOCKET, SO_ERROR,
+ &err, &err_size);
+ if (err)
+ continue;
+
+ // connected
+ nonblocking(false);
+ _addr = addr_in.sin_addr.s_addr;
+ return;
}
- throw String("ClientSocket(hostname, port): connect() failed");
+ throw String("ClientSocket(hostname, port, timeout): connect() failed");
}
ClientSocket::ClientSocket(const ClientSocket& s) :
@@ -180,20 +142,13 @@
bool
ClientSocket::connected_to(const String& hostname)
{
- char hostbuf[4096];
- struct hostent hostent_result;
- struct hostent *ent = NULL;
- int ret = 0;
-
- if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result,
- hostbuf, sizeof(hostbuf),
- &ent, &ret) || !ent)
- return false;
-
- char** addrs = ent->h_addr_list;
- for (int i=0; addrs[i]; i++)
- if (*((u_int32_t*) addrs[i]) == _addr)
- return true;
+ try {
+ counting_auto_ptr<Network::Hostent> ent = Network::getHostByName(hostname);
+ char** addrs = (*ent)->h_addr_list;
+ for (int i=0; addrs[i]; i++)
+ if (*((u_int32_t*) addrs[i]) == _addr)
+ return true;
+ } catch ( ... ) {}
return false;
}
@@ -221,10 +176,23 @@
// log(String("received ") + ret + " bytes from socket " + _sock,
// LogLevel(LogSocket|LogTransfer));
- return String(buffer, ret);
+ String data(buffer, ret);
+ shred(buffer, ret);
+ return data;
}
}
+String
+ClientSocket::recv(int timeout)
+{
+ bool in=true, out=false;
+ poll(in, out, timeout);
+ if (in)
+ return recv();
+ else
+ return "";
+}
+
String
ClientSocket::send(const String& msg)
{
@@ -239,7 +207,7 @@
else if (errno == EAGAIN ||
errno == EWOULDBLOCK)
return msg;
- throw String("ClientSocket::recv(): socket error");
+ throw String("ClientSocket::send(): socket error");
}
// log(String("sent ") + ret + " bytes thru socket " + _sock,
@@ -248,6 +216,17 @@
}
}
+String
+ClientSocket::send(const String& msg, int timeout)
+{
+ bool in=false, out=true;
+ poll(in, out, timeout);
+ if (out)
+ return send(msg);
+ else
+ return msg;
+}
+
void
ClientSocket::ready(bool& recv, bool& send, int timeout)
{
--- conga/ricci/common/Makefile 2006/10/23 18:43:35 1.7
+++ conga/ricci/common/Makefile 2007/03/23 17:25:12 1.8
@@ -24,10 +24,11 @@
utils.o \
File.o \
XML.o \
+ Network.o \
Socket.o \
ServerSocket.o \
- Logger.o \
ClientSocket.o \
+ Logger.o \
Variable.o \
Random.o \
daemon_init.o \
--- conga/ricci/common/Socket.cpp 2007/03/21 22:51:20 1.5
+++ conga/ricci/common/Socket.cpp 2007/03/23 17:25:12 1.6
@@ -181,30 +181,3 @@
}
}
}
-
-
-
-std::vector<String>
-name2IP(const String& hostname)
-{
- char buff[INET_ADDRSTRLEN+1];
- std::vector<String> addrs;
- char hostbuf[4096];
- struct hostent hostent_result;
- struct hostent *ent;
- int ret;
-
- if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result,
- hostbuf, sizeof(hostbuf),
- &ent, &ret) || !ent)
- return addrs;
-
- char** addrs_b = ent->h_addr_list;
- for (int i=0; addrs_b[i]; i++) {
- struct in_addr addr;
- addr.s_addr = *((u_int32_t*) addrs_b[i]);
- if (inet_ntop(AF_INET, &addr, buff, sizeof(buff)))
- addrs.push_back(buff);
- }
- return addrs;
-}
/cvs/cluster/conga/ricci/include/Network.h,v --> standard output
revision 1.1
--- conga/ricci/include/Network.h
+++ - 2007-03-23 17:25:15.061289000 +0000
@@ -0,0 +1,54 @@
+/*
+ Copyright Red Hat, Inc. 2007
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#ifndef Conga_Network_h
+#define Conga_Network_h
+
+#include "counting_auto_ptr.h"
+#include "String.h"
+#include <vector>
+
+#include <netdb.h>
+
+
+class Network
+{
+ public:
+ static std::vector<String> name2IP(const String& hostname);
+ static String localhost();
+
+
+ class Hostent
+ {
+ public:
+ struct hostent ent;
+ char data[4*1024 - sizeof(struct hostent)];
+ struct hostent* operator->() { return &ent; }
+ struct hostent& operator*() { return ent; }
+ };
+ static counting_auto_ptr<Hostent> getHostByName(const String& hostname);
+
+};
+
+
+#endif // Conga_Network_h
--- conga/ricci/include/Socket.h 2007/03/21 20:12:58 1.4
+++ conga/ricci/include/Socket.h 2007/03/23 17:25:13 1.5
@@ -34,14 +34,11 @@
// provide external locking
-std::vector<String> name2IP(const String& hostname);
-
-
class Socket
{
public:
Socket(const Socket&);
- Socket& operator= (const Socket&);
+ virtual Socket& operator= (const Socket&);
virtual ~Socket();
virtual bool operator== (const Socket&);
@@ -73,25 +70,29 @@
public:
ClientSocket();
ClientSocket(const String& sock_path); // UNIX socket
- ClientSocket(const String& hostname, unsigned short port); // TCP socket
- ClientSocket(const String& hostname, unsigned short port, unsigned int to_ms);
+ ClientSocket(const String& hostname, unsigned short port,
+ unsigned int timeout_ms=0 /* 0 - standard blocking behavior
+ >0 - timeout
+ */ ); // TCP socket
ClientSocket(const ClientSocket&);
- ClientSocket& operator= (const ClientSocket&);
+ virtual ClientSocket& operator= (const ClientSocket&);
virtual ~ClientSocket();
- String recv();
- String send(const String& msg); // return what is left to send
+ virtual String recv();
+ virtual String recv(int timeout);
+ virtual String send(const String& msg); // return what is left to send
+ virtual String send(const String& msg, int timeout);
- void ready(bool& recv, bool& send, int timeout);
+ virtual void ready(bool& recv, bool& send, int timeout);
virtual bool server() { return false; }
virtual bool connected_to(const String& hostname);
protected:
- unsigned int _addr;
+ u_int32_t _addr; // address in network byte order
- ClientSocket(int sock, unsigned int addr=0); // takes ownership of sock
+ ClientSocket(int sock, u_int32_t addr=0); // takes ownership of sock
friend class ServerSocket;
}; // ClientSocket
@@ -102,12 +103,12 @@
ServerSocket(const String& sock_path); // UNIX socket
ServerSocket(unsigned short port); // TCP socket
ServerSocket(const ServerSocket&);
- ServerSocket& operator= (const ServerSocket&);
+ virtual ServerSocket& operator= (const ServerSocket&);
virtual ~ServerSocket();
ClientSocket accept();
- bool ready(int timeout);
+ virtual bool ready(int timeout);
virtual bool server() { return true; }
--- conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp 2006/12/13 19:14:54 1.13
+++ conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp 2007/03/23 17:25:13 1.14
@@ -26,6 +26,7 @@
#include "Logger.h"
#include "Time.h"
#include "utils.h"
+#include "Network.h"
#include <sys/poll.h>
#include <sys/sysinfo.h>
@@ -584,7 +585,7 @@
iter != nodenames.end();
iter++) {
const String& nodename = *iter;
- vector<String> ips = name2IP(nodename);
+ vector<String> ips = Network::name2IP(nodename);
for (vector<String>::iterator iter_ip = ips.begin();
iter_ip != ips.end();
iter_ip++) {
--- conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h 2006/10/13 09:36:16 1.5
+++ conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h 2007/03/23 17:25:13 1.6
@@ -49,7 +49,7 @@
const String& msg);
protected:
- void run();
+ virtual void run();
private:
Mutex _mutex; // _cluster and _cache
--- conga/ricci/ricci/Ricci.cpp 2007/03/21 22:51:21 1.24
+++ conga/ricci/ricci/Ricci.cpp 2007/03/23 17:25:13 1.25
@@ -31,13 +31,13 @@
#include "Time.h"
#include "XML_tags.h"
#include "File.h"
+#include "Network.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <dirent.h>
-#include <netdb.h>
#include <fstream>
@@ -45,7 +45,6 @@
static bool dom0();
-static String hostname();
static pair<String, String> clusterinfo();
static String os_release();
@@ -71,7 +70,7 @@
header.set_attr("authenticated", "false");
if (full) {
- String name = hostname();
+ String name = Network::localhost();
if (name.size())
header.set_attr("hostname", name);
@@ -459,27 +458,6 @@
-
-String
-hostname()
-{
- char name[1024];
- if (gethostname(name, sizeof(name)))
- return "";
-
- char hostbuf[4096];
- struct hostent hostent_result;
- struct hostent *ent = NULL;
- int ret = 0;
-
- if (gethostbyname_r(name, &hostent_result,
- hostbuf, sizeof(hostbuf),
- &ent, &ret) || !ent)
- return name;
-
- return String(ent->h_name);
-}
-
pair<String, String>
clusterinfo()
{
More information about the Cluster-devel
mailing list