[NeoStats-Devel] [Commits] r2844 - trunk/src

[email protected] Thu, 29 Sep 2005 17:58:06 +1000
Newsgroups gmane.comp.neostats.devel
Message-ID <[email protected]>
Author: Fish
Date: Thu Sep 29 15:57:59 2005
New Revision: 2844

Modified:
   trunk/src/conf.c
   trunk/src/neostats.pm.h
   trunk/src/updates.c
Log:
Start commiting the minimessage stuff


Modified: trunk/src/conf.c
==============================================================================
--- trunk/src/conf.c	(original)
+++ trunk/src/conf.c	Thu Sep 29 15:57:59 2005
@@ -101,6 +101,14 @@
 	CFG_END()
 };
 
+cfg_opt_t neonet[] = {
+	CFG_STR ("HostName", "mqpool.neostats.net", CFGF_NONE),
+	CFG_INT ("Port", 2960, CFGF_NONE),
+	CFG_STR ("UserName", 0, CFGF_NONE),
+	CFG_STR ("Password", 0, CFGF_NONE),
+	CFG_END()
+};
+
 cfg_opt_t fileconfig[] = {
 	CFG_SEC ("ServerConfig", server_details, CFGF_NONE),
 	CFG_SEC ("Options", options, CFGF_NONE),
@@ -112,6 +120,7 @@
 #endif /* 0 */
 	CFG_SEC ("ServiceRoot", serviceroot, CFGF_NONE),
 	CFG_SEC ("Modules", modules, CFGF_NONE),
+	CFG_SEC ("NeoNet", neonet, CFGF_NONE),
 	CFG_END()
 };
 
@@ -128,7 +137,8 @@
 	{"Options|NOLOAD", &cb_noload},
 	{"Servers|IpAddress", &cb_verify_host},
 	{"ServiceRoot|Mask", &cb_verify_mask},
-	{"Modules|ModuleName", &cb_verify_file}
+	{"Modules|ModuleName", &cb_verify_file},
+	{"NeoNet|HostName", &cb_verify_host}
 };
 
 /** @brief ConfParseError
@@ -260,6 +270,13 @@
 		dlog( DEBUG6, "                     %s", cfg_getnstr( cfg, "Modules|ModuleName", i ));
 	}	
 	dlog( DEBUG6, "-----------------------------------------------" );
+printf("%d\n", cfg_size(cfg, "NeoNet|UserName"));
+	if (cfg_size(cfg, "NeoNet|UserName") > 1) 
+		strlcpy(mqs.username, cfg_getstr(cfg, "NeoNet|UserName"), MAXUSER);
+	if (cfg_size(cfg, "NeoNet|Password") > 1)
+	strlcpy(mqs.password, cfg_getstr(cfg, "NeoNet|Password"), MAXUSER);
+	strlcpy(mqs.hostname, cfg_getstr(cfg, "NeoNet|HostName"), MAXHOST);
+	mqs.port = cfg_getint(cfg, "NeoNet|Port");
 	return NS_SUCCESS;
 }
 

Modified: trunk/src/neostats.pm.h
==============================================================================
--- trunk/src/neostats.pm.h	(original)
+++ trunk/src/neostats.pm.h	Thu Sep 29 15:57:59 2005
@@ -608,7 +608,6 @@
 "my $callback = shift;\n"
 "my ($package) = caller;\n"
 "$callback = NeoStats::Embed::fix_callback( $package, $callback );\n"
-"NeoStats::debug(\"Callback is $callback\");\n"
 "return NeoStats::Internal::AddTimer($type, $name, $interval, $callback);\n"
 "}\n"
 "\n"

Modified: trunk/src/updates.c
==============================================================================
--- trunk/src/updates.c	(original)
+++ trunk/src/updates.c	Thu Sep 29 15:57:59 2005
@@ -25,19 +25,33 @@
  */
 
 #include "neostats.h"
+#include "event.h"
+#include "MiniMessage.h"
+#include "MiniMessageGateway.h"
+
 
 void GotUpdateAddress(void *data, adns_answer *a);
+static int mqswrite(int fd, void *data);
+static int mqsread(void *data, void *notused, size_t len);
+int mqs_login();
+
+updateserver mqs;
+MMessageGateway *mqsgw;
+
+int MQSSendSock(const char * buf, uint32 numBytes, void * arg) {
+	return os_sock_write(mqs.sock, buf, numBytes); 
+}
 
-struct updateserver {
-	int ok;
-	struct sockaddr_in sendtomq;
-	OS_SOCKET sock;
-} mqs;
 
 int InitUpdate(void) 
 {
-	mqs.ok = 0;
-	dns_lookup( "mqpool.neostats.net",  adns_r_a, GotUpdateAddress, NULL );
+	mqs.state = MQS_DISCONNECTED;
+	mqsgw = MGAllocMessageGateway();
+	if (!mqsgw) {
+		nlog(LOG_WARNING, "Couldn't allocate MiniMessageGateway Object");
+		return NS_FAILURE;
+	}
+	dns_lookup( mqs.hostname,  adns_r_a, GotUpdateAddress, NULL );
 	dlog(DEBUG1, "Updates Initialized successfully");
 	return NS_SUCCESS;
 }
@@ -48,34 +62,75 @@
 
 void GotUpdateAddress(void *data, adns_answer *a) 
 {
-	char *url;
-	int i, len, ri;
-
+	struct timeval tv;
 	SET_SEGV_LOCATION();
-	adns_rr_info(a->type, 0, 0, &len, 0, 0);
-	for(i = 0; i < a->nrrs;  i++) {
-		ri = adns_rr_info(a->type, 0, 0, 0, a->rrs.bytes +i*len, &url);
-		if (!ri) {
-			/* ok, we got a valid answer, lets maybe kick of the update check.*/
-			mqs.sendtomq.sin_addr.s_addr = inet_addr(url);
-			mqs.sendtomq.sin_port = htons(2335);
-			mqs.sendtomq.sin_family = AF_INET;
-			mqs.sock = socket(AF_INET, SOCK_DGRAM, 0);
-			mqs.ok = 1;
-			nlog (LOG_NORMAL, "Got DNS for MQ Pool Server: %s", url);
-		} else {
-			nlog(LOG_WARNING, "DNS error Checking for MQ Server Pool: %s", adns_strerror(ri));
-		}
-		ns_free (url);
+	if( a && a->nrrs > 0 && a->status == adns_s_ok ) {
+			mqs.sock = sock_connect(SOCK_STREAM, a->rrs.addr->addr.inet.sin_addr, mqs.port);
+			if (mqs.sock > 0) {
+				tv.tv_sec = 30;
+				AddSock(SOCK_NATIVE, "MQS", mqs.sock, mqsread, mqswrite, EV_WRITE|EV_TIMEOUT, NULL, &tv);
+				mqs.state = MQS_CONNECTING;
+			}
+			nlog (LOG_NORMAL, "Got DNS for MQ Pool Server: %s", inet_ntoa(a->rrs.addr->addr.inet.sin_addr));
+	} else {
+		nlog(LOG_WARNING, "DNS error Checking for MQ Server Pool: %s", adns_strerror(a->status));
 	}
-	if (a->nrrs < 1) {
-		nlog(LOG_WARNING, "DNS Error checking for MQ Server Pool");
+}
+
+int mqswrite(int fd, void *data) {
+	switch (mqs.state) {
+		case MQS_DISCONNECTED:
+			break;
+		/* we are connected */
+		case MQS_CONNECTING:
+			return mqs_login();
+			break;
+		case MQS_SENTAUTH:
+		case MQS_OK:
+			/* ask MiniMessageGateway to write any buffer out */
+			break;
+	}
+	return NS_FAILURE;
+}
+
+int mqsread(void *data, void *notused, size_t len) {
+
+	return NS_SUCCESS;
+}
+
+int mqs_login() 
+{
+	MMessage *msg = MMAllocMessage(0);
+	MByteBuffer **username;
+	MByteBuffer **password;
+	MByteBuffer **version;
+	if (!msg) {
+		nlog(LOG_WARNING, "Warning, Couldn't create MiniMessage");
+		return NS_FAILURE;
 	}
+	username = MMPutStringField(msg, false, "username", 1);
+	username[0] = MBStrdupByteBuffer(mqs.username);
+	password = MMPutStringField(msg, false, "password", 1);
+	password[0] = MBStrdupByteBuffer(mqs.password);
+	version = MMPutStringField(msg, false, "version", 1);
+	version[0] = MBStrdupByteBuffer(me.version);
+	MMSetWhat(msg, MAKETYPE("login\0"));
+#ifdef DEBUG
+	MMPrintToStream(msg);
+#endif
+	MGAddOutgoingMessage(mqsgw, msg);
+	MMFreeMessage(msg);
+
+	MGDoOutput(mqsgw, ~0, MQSSendSock, NULL);
+	
+	mqs.state = MQS_SENTAUTH;
+	
+	return NS_SUCCESS;
 }
 void sendtoMQ( MQ_MSG_TYPE type, void *data, size_t len) {
 	char *buf;
 	
-	if (mqs.ok == 1) {
+	if (mqs.state == MQS_OK) {
 		/* for now, we know that data is always a char string */
 		buf = malloc(sizeof(int) + len);
 		ircsnprintf(buf, (sizeof(int)+len+1), "%d\n%s", type, (char *)data);