#!/usr/bin/perl -w ########################################################################## # INFORMATION TOOL ABOUT THE SERVERS VERSION OF ATHENA # # By connection on a server, this software display the version of the # designed server. #------------------------------------------------------------------------- # Usages: # ./checkversion IP:port # ./checkversion IP port # perl checkversion IP:port # perl checkversion IP port # # note: default port: 6900 # # When successfull, the software return the value 0. # ########################################################################## #------------------------- start of configuration ------------------------ $connecttimeout = 10; # Connection Timeout (in seconds) #-------------------------- End of configuration ------------------------- use IO::Socket; unless($ARGV[0]) { print "USAGE: $0 server_ip:port\n"; exit(1); } $server = $ARGV[0]; $port = $ARGV[1]; $port = $1 if ($server =~ s/:(\d+)//); $port ||= 6900; # Connection to the server my($so,$er) = (); eval{ $so = IO::Socket::INET->new( PeerAddr=> $server, PeerPort=> $port, Proto => "tcp", Timeout => $connecttimeout) or $er = 1; }; if($er || $@) { print "Can't not connect to server [$server:$port] !\n"; exit(2); } # Request for the server version print $so pack("v",30000); # 0x7530 $so->flush(); # Receiving of the answer of the server if (read($so,$buf,10) < 10) { print "Invalid answer. It isn't an athena server or it is a too old version.\n"; exit(5); } # Sending end of connection to the server print $so pack("v",30002); # 0x7532 $so->flush(); # Analyse of the answer my($ret,$maver,$miver,$rev,$dev,$mod,$type,$mdver) = unpack("v c6 v",$buf); if ($ret != 30001) { # 0x7531 print "Invalid answer. It isn't an athena server or it is a too old version.\n"; exit(6); } my(@stype) = (); foreach $i(0..3) { push @stype,(("login","char","inter","map")[$i]) if( $type & (1<<$i) ); } print " ".join("/",@stype)." server [$server:$port].\n"; printf " Athena version %s-%d.%d", ("stable","dev")[$dev], $maver,$miver; printf " revision %d",$rev if $rev; printf "%s%d\n",("","-mod")[$mod],$mdver; exit(0);