summaryrefslogtreecommitdiff
path: root/tool/checkversion
blob: 135165236944c93a9ff06d152f6ba01da6663392 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/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);