diff --git a/src/conf.c b/src/conf.c index ff4c8394..f9841b79 100644 --- a/src/conf.c +++ b/src/conf.c @@ -101,6 +101,14 @@ cfg_opt_t modules[] = { 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 @@ cfg_opt_t fileconfig[] = { #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 @@ validate_args arg_validate[] = { {"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 @@ static int set_config_values( cfg_t *cfg ) 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; } diff --git a/src/neostats.pm.h b/src/neostats.pm.h index 5bcfb9b7..322ee25d 100644 --- a/src/neostats.pm.h +++ b/src/neostats.pm.h @@ -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" diff --git a/src/updates.c b/src/updates.c index 0b4683c2..99e18786 100644 --- a/src/updates.c +++ b/src/updates.c @@ -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 FiniUpdate(void) 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);