From mboxrd@z Thu Jan 1 00:00:00 1970 From: kupcevic@sourceware.org Date: 23 Mar 2007 17:25:15 -0000 Subject: [Cluster-devel] conga luci/conga_ssl/setup.py ricci/common/Cli ... Message-ID: <20070323172515.12663.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 + */ + + +#include "Network.h" + +#include +#include +#include + + + +counting_auto_ptr +Network::getHostByName(const String& hostname) +{ + counting_auto_ptr 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 +Network::name2IP(const String& hostname) +{ + std::vector addrs; + try { + char buff[INET_ADDRSTRLEN+1]; + counting_auto_ptr 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 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 #include @@ -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 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 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 -name2IP(const String& hostname) -{ - char buff[INET_ADDRSTRLEN+1]; - std::vector 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 + */ + + +#ifndef Conga_Network_h +#define Conga_Network_h + +#include "counting_auto_ptr.h" +#include "String.h" +#include + +#include + + +class Network +{ + public: + static std::vector 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 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 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 #include @@ -584,7 +585,7 @@ iter != nodenames.end(); iter++) { const String& nodename = *iter; - vector ips = name2IP(nodename); + vector ips = Network::name2IP(nodename); for (vector::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 #include #include #include #include -#include #include @@ -45,7 +45,6 @@ static bool dom0(); -static String hostname(); static pair 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 clusterinfo() {