[Cluster-devel] conga ./conga.spec.in.in luci/conga_ssl/SSLCli ...

rmccabe at sourceware.org rmccabe at sourceware.org
Tue Mar 27 02:11:07 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	conga
Branch: 	RHEL5
Changes by:	rmccabe at sourceware.org	2007-03-27 03:11:04

Modified files:
	.              : conga.spec.in.in 
	luci/conga_ssl : SSLClient.cpp conga_ssl_lib.cpp setup.py 
	ricci/common   : ClientSocket.cpp Makefile Socket.cpp Time.cpp 
	                 XML.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 
	ricci/test_suite: SSLClient_send_to_ricci 

Log message:
	- Fix a bug that caused connect(2) to block under some circumstances.
	- Fix bugs that caused intermittent failures for some systems when accessing the "storage" tab in luci.
	- Include a new test script that uses the conga SSL python module.
	- Upgrade to Zope 2.8.9.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/conga.spec.in.in.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.45.2.26&r2=1.45.2.27
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/SSLClient.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.2&r2=1.1.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/conga_ssl_lib.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.2&r2=1.1.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/setup.py.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.1&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Network.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/ClientSocket.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4&r2=1.4.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.6.2.1&r2=1.6.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Socket.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3&r2=1.3.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Time.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4&r2=1.4.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/XML.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.6.2.1&r2=1.6.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/include/Network.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/include/Socket.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3&r2=1.3.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.10.2.3&r2=1.10.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.5&r2=1.5.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/Ricci.cpp.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.18.2.4&r2=1.18.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/test_suite/SSLClient_send_to_ricci.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=NONE&r2=1.1.4.1

--- conga/conga.spec.in.in	2007/03/20 17:39:13	1.45.2.26
+++ conga/conga.spec.in.in	2007/03/27 02:11:03	1.45.2.27
@@ -285,6 +285,7 @@
 %changelog
 
 * Tue Mar 20 2007 Stanko Kupcevic <kupcevic at redhat.com> 0.8-31
+- Upgrade to Zope 2.9.7-final
 - Fixed bz229027 (luci failover domain forms are missing/empty)
 - Fixed bz230447 (fence_xvm is incorrectly listed as "xmv" in virtual cluster)
 - Fixed bz230452 (Advanced options parameters settings don't do anything)
--- conga/luci/conga_ssl/SSLClient.cpp	2006/12/22 17:50:16	1.1.2.2
+++ conga/luci/conga_ssl/SSLClient.cpp	2007/03/27 02:11:03	1.1.2.3
@@ -81,14 +81,14 @@
   if (!SSL_CTX_load_verify_locations(ctx, 
 				     _trust_CAs, 
 				     NULL))
-    cout << "failed to load trusted CAs" << endl;
+    ;//cout << "failed to load trusted CAs" << endl;
   
   STACK_OF(X509_NAME) *cert_names = 
     SSL_load_client_CA_file(_trust_CAs);
   if (cert_names)
     SSL_CTX_set_client_CA_list(ctx, cert_names);
-  else
-    cout << "failed to load trusted CAs" << endl;
+//  else
+//    cout << "failed to load trusted CAs" << endl;
   
   // load saved certs
   
--- conga/luci/conga_ssl/conga_ssl_lib.cpp	2006/12/22 17:50:16	1.1.2.2
+++ conga/luci/conga_ssl/conga_ssl_lib.cpp	2007/03/27 02:11:03	1.1.2.3
@@ -133,7 +133,7 @@
     counting_auto_ptr<SSLClient> ss;
     {
       PythonThreadsAllower all;
-      ClientSocket sock(hostname, port);
+      ClientSocket sock(hostname, port, timeout * 1000);
       ss = counting_auto_ptr<SSLClient>(new SSLClient(sock));
       ss->connect(timeout * 1000);
     }
--- conga/luci/conga_ssl/setup.py	2006/12/08 18:27:32	1.1.2.1
+++ conga/luci/conga_ssl/setup.py	2007/03/27 02:11:03	1.1.2.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.4.1
--- conga/ricci/common/Network.cpp
+++ -	2007-03-27 03:11:05.883443000 +0100
@@ -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	2006/08/10 22:53:07	1.4
+++ conga/ricci/common/ClientSocket.cpp	2007/03/27 02:11:04	1.4.2.1
@@ -1,5 +1,5 @@
 /*
-  Copyright Red Hat, Inc. 2005
+  Copyright Red Hat, Inc. 2005-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
@@ -23,6 +23,7 @@
 
 #include "Socket.h"
 #include "Logger.h"
+#include "Network.h"
 
 #include <unistd.h>
 #include <errno.h>
@@ -38,7 +39,7 @@
   Socket(-1)
 {}
 
-ClientSocket::ClientSocket(int sock, unsigned int addr) :
+ClientSocket::ClientSocket(int sock, u_int32_t addr) :
   Socket(sock),
   _addr(addr)
 {}
@@ -66,34 +67,57 @@
   //  log(msg, LogSocket);
 }
 
-ClientSocket::ClientSocket(const String& hostname, unsigned short port) :
+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): socket() failed");
+    throw String("ClientSocket(hostname, port, timeout): socket() failed");
   
-  struct hostent* ent = gethostbyname2(hostname.c_str(), AF_INET);
-  if (!ent)
-    throw String("ClientSocket(hostname, port): gethostbyname() failed");
+  if (timeout_ms)
+    nonblocking(true);
   
-  char** addrs = ent->h_addr_list;
+  counting_auto_ptr<Network::Hostent> ent = Network::getHostByName(hostname);
+  
+  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) :
@@ -118,14 +142,13 @@
 bool 
 ClientSocket::connected_to(const String& hostname)
 {
-  struct hostent* ent = gethostbyname2(hostname.c_str(), AF_INET);
-  if (!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;
 }
 
@@ -153,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)
 {
@@ -171,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, 
@@ -180,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 21:13:20	1.6.2.1
+++ conga/ricci/common/Makefile	2007/03/27 02:11:04	1.6.2.2
@@ -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	2006/08/10 22:53:07	1.3
+++ conga/ricci/common/Socket.cpp	2007/03/27 02:11:04	1.3.2.1
@@ -1,5 +1,5 @@
 /*
-  Copyright Red Hat, Inc. 2005
+  Copyright Red Hat, Inc. 2005-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
@@ -181,23 +181,3 @@
     }
   }
 }
-
-
-
-std::vector<String>
-name2IP(const String& hostname)
-{
-  char buff[INET_ADDRSTRLEN+1];
-  std::vector<String> addrs;
-  struct hostent* ent = gethostbyname2(hostname.c_str(), AF_INET);
-  if (!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;
-}
--- conga/ricci/common/Time.cpp	2006/08/10 22:53:07	1.4
+++ conga/ricci/common/Time.cpp	2007/03/27 02:11:04	1.4.2.1
@@ -1,5 +1,5 @@
 /*
-  Copyright Red Hat, Inc. 2005
+  Copyright Red Hat, Inc. 2005-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
@@ -31,8 +31,7 @@
 time_sec()
 {
   struct timeval t;
-  struct timezone z;
-  gettimeofday(&t, &z);
+  gettimeofday(&t, NULL);
   return t.tv_sec;
 }
 
@@ -40,8 +39,7 @@
 time_mil()
 {
   struct timeval t;
-  struct timezone z;
-  gettimeofday(&t, &z);
+  gettimeofday(&t, NULL);
   return t.tv_sec*1000 + t.tv_usec/1000;
 }
 
--- conga/ricci/common/XML.cpp	2006/10/23 21:13:20	1.6.2.1
+++ conga/ricci/common/XML.cpp	2007/03/27 02:11:04	1.6.2.2
@@ -189,7 +189,7 @@
 			      xml.size(),
 			      "noname.xml",
 			      NULL,
-			      XML_PARSE_NONET);
+			      XML_PARSE_NONET | XML_PARSE_NOERROR | XML_PARSE_NOWARNING);
   if (!doc)
     throw String("parseXML(): couldn't parse xml");
   
@@ -216,7 +216,7 @@
 			      xml.size(),
 			      "noname.xml",
 			      NULL,
-			      XML_PARSE_NONET);
+			      XML_PARSE_NONET | XML_PARSE_NOERROR | XML_PARSE_NOWARNING);
   if (!doc) {
     //    cout << xml << endl;
     throw String("generateXML(): internal error");
/cvs/cluster/conga/ricci/include/Network.h,v  -->  standard output
revision 1.1.4.1
--- conga/ricci/include/Network.h
+++ -	2007-03-27 03:11:06.441588000 +0100
@@ -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	2006/08/10 22:53:07	1.3
+++ conga/ricci/include/Socket.h	2007/03/27 02:11:04	1.3.2.1
@@ -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,24 +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 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
 
@@ -101,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:21:52	1.10.2.3
+++ conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp	2007/03/27 02:11:04	1.10.2.4
@@ -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/27 02:11:04	1.5.2.1
@@ -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/01/04 00:22:13	1.18.2.4
+++ conga/ricci/ricci/Ricci.cpp	2007/03/27 02:11:04	1.18.2.5
@@ -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,20 +458,6 @@
 
 
 
-
-String 
-hostname()
-{
-  char name[1024];
-  if (gethostname(name, sizeof(name)))
-    return "";
-  struct hostent *ent = gethostbyname(name);
-  if (ent)
-    return String(ent->h_name);
-  else
-    return name;
-}
-
 pair<String, String> 
 clusterinfo()
 {
/cvs/cluster/conga/ricci/test_suite/SSLClient_send_to_ricci,v  -->  standard output
revision 1.1.4.1
--- conga/ricci/test_suite/SSLClient_send_to_ricci
+++ -	2007-03-27 03:11:07.550878000 +0100
@@ -0,0 +1,70 @@
+#!/usr/bin/python
+
+import socket
+import sys, os
+import xml.dom
+import xml
+from xml.dom import minidom
+
+import sys
+sys.path.append('/var/lib/luci/Extensions')
+from conga_ssl import SSLSocket
+
+
+WRITE_TIMEOUT = 600
+READ_TIMEOUT = 600
+CONNECT_TIMEOUT = 4
+
+RICCI_PORT = 11111
+
+
+def send_to_ricci(hostname, msg):
+    ss = SSLSocket(hostname, RICCI_PORT, CONNECT_TIMEOUT)
+    
+    res1 = ss.recv(READ_TIMEOUT)
+    ss.send(msg, WRITE_TIMEOUT)
+    res2 = ''
+    while True:
+        buff = ss.recv(READ_TIMEOUT)
+        if buff == '':
+            break
+        res2 += buff
+        try:
+            minidom.parseString(res2)
+            break
+        except:
+            pass
+    return res1, res2
+
+
+def main(argv):
+    certs_present = True
+    if os.access('cacert.pem', os.R_OK) == False:
+        print 'cannot find cacert.pem'
+        certs_present = False
+    if os.access('privkey.pem', os.R_OK) == False:
+        print 'cannot find privkey.pem'
+        certs_present = False
+    
+    if len(argv) != 3 or not certs_present:
+        print 'sends <command_file> to ricci on <hostname>, and writes its response to stdout'
+        print '\t' + argv[0] + ' <hostname> <command_file>'
+        print '\t\thostname - host to send command to'
+        print '\t\txml_file - file with valid ricci request to be sent'
+        print '\t./ has to contain privkey.pem and cacert.pem'
+        sys.exit(1)
+
+    hostname = argv[1]
+    filename = argv[2]
+    res = send_to_ricci(hostname, open(filename).read(100000))
+    print res[1]
+    if res[1].find('success="5"') > -1:
+        print "not authenticated, send ricci/authenticate.xml with root password in it"
+
+
+
+
+# If called from the command line
+if __name__ == '__main__':
+    main(sys.argv)
+




More information about the Cluster-devel mailing list