#!/usr/bin/perl -w # gangliahack.pl (c) 18.sep.2003 Antti.Vanne@uku.fi # Description: # Quick hack to use ganglia in a cluster with a non-multicasting # switch. Doesn't scale too well, usable on a 24 cluster though. # Idea: listen to port $serverPort (8666 as default) for gmetad's # request for XML data and when connected, gather XML from # individual nodes from port $queryPort and serve it to gmetad. # modified 26.03.2004: new header is created every time, otherwise # the new version of ganglia complains about the non-updated # cluster local time # use strict; use IO::Socket::INET; sub getHeader { my @argv = @_; my $host = $argv[0]; my $port = $argv[1]; my $header; my $remote = new IO::Socket::INET( Proto => "tcp", Timeout => "5", PeerAddr => $host, PeerPort => $port, ); if ($remote) { while (<$remote>) { $header .= $_; last if (/CLUSTER NAME="Klunga"/); # modify this as needed } } close $remote; return $header; } sub getNodeInfo { my @argv = @_; my $host = $argv[0]; my $port = $argv[1]; my $nodeInfo; my $remote = new IO::Socket::INET( Proto => "tcp", Timeout => "5", PeerAddr => $host, PeerPort => $port, ); my $found = 0; if ($remote) { while (<$remote>) { if (/HOST NAME="$host"/) { $found = 1; }; if ($found) { $nodeInfo .= $_; } last if ($found && /<\/HOST>/); } close $remote; } if (!$remote) { print "Error in fetching node information!!\n"; $nodeInfo = "perkele"; } return $nodeInfo; } # modify these as needed my $numOfNodes = 24; my $queryPort = 8649; # port to query xml trees from nodes my $serverPort = 8666; # port to serve gathered data my $localip = "193.167.234.240"; my $serverSocket; my $host; my $tmp; my $nodeInfo; my @hosts; # modify hostnames as needed $hosts[0] = "klunga"; my $i = 1; for ($i = 1; $i < $numOfNodes; $i++) { $hosts[$i] = "node"."$i"; } my $header; my $tailer = "\n\n"; $serverSocket = new IO::Socket::INET (LocalHost => $localip, LocalPort => $serverPort, Proto => 'tcp', Listen => 5, Reuse => 1 ); die "Socket could not be created. Reason: $!" unless $serverSocket; my $new_sock; while ($new_sock = $serverSocket->accept()) { $nodeInfo = ""; foreach $host (@hosts) { $tmp = getNodeInfo($host, $queryPort); $nodeInfo .= $tmp; } $header = getHeader("klunga", $queryPort); $new_sock->send($header); $new_sock->send($nodeInfo); $new_sock->send($tailer); close $new_sock; } close ($serverSocket);