From: Rudolf Polzer Date: Mon, 7 Nov 2011 12:52:36 +0000 (+0100) Subject: rcon2irc: support for rcon2irc behind NAT (not tested) X-Git-Tag: xonotic-v0.6.0~70 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=d636e647ad37711dfce5e067a8951acbc8b753f4;p=xonotic%2Fxonotic.git rcon2irc: support for rcon2irc behind NAT (not tested) --- diff --git a/server/rcon2irc/rcon2irc-example.conf b/server/rcon2irc/rcon2irc-example.conf index 2cc6cc35..2e031cdb 100644 --- a/server/rcon2irc/rcon2irc-example.conf +++ b/server/rcon2irc/rcon2irc-example.conf @@ -37,6 +37,7 @@ irc_channel = #Xonotic-Pwayers #dp_secure_challengetimeout = 1 #dp_server_from_wan = #dp_listen = +#dp_listen_from_server = #dp_status_delay = 30 #dp_utf8_enable = 1 #irc_reconnect_delay = 300 diff --git a/server/rcon2irc/rcon2irc.pl b/server/rcon2irc/rcon2irc.pl index 13d97791..48d703fc 100755 --- a/server/rcon2irc/rcon2irc.pl +++ b/server/rcon2irc/rcon2irc.pl @@ -266,6 +266,8 @@ sub color_dpfix($) # Connection: # $conn->sockname() returns a connection type specific representation # string of the local address, or undef if not applicable. +# $conn->peername() returns a connection type specific representation +# string of the remote address, or undef if not applicable. # $conn->send("string") sends something over the connection. # $conn->recv() receives a string from the connection, or returns "" if no # data is available. @@ -341,6 +343,14 @@ sub sockname($) return "@{[inet_ntoa $addr]}:$port"; } +# $sock->peername() returns the remote address of the socket. +sub peername($) +{ + my ($self) = @_; + my ($port, $addr) = sockaddr_in $self->{sock}->peername(); + return "@{[inet_ntoa $addr]}:$port"; +} + # $sock->send($data) sends some data over the socket; on success, 1 is returned. sub send($$) { @@ -740,6 +750,7 @@ our %config = ( dp_password => undef, dp_status_delay => 30, dp_server_from_wan => "", + dp_listen_from_server => "", dp_utf8_enable => $color_utf8_enable, irc_local => "", @@ -752,6 +763,16 @@ our %config = ( plugins => "", ); +sub pickip($$) +{ + my ($wan, $lan) = @_; + return $wan + if $wan =~ /:\d+$/; + return $wan + if $lan !~ /:(\d+)$/; + return "$wan:$1"; +} + # Xonotic specific parsing of some server messages @@ -764,7 +785,7 @@ sub xon_slotsstring() my $slots = $store{slots_max} - $store{slots_active}; my $slots_s = ($slots == 1) ? '' : 's'; $slotsstr = " ($slots free slot$slots_s)"; - my $s = $config{dp_server_from_wan} || $config{dp_server}; + my $s = pickip($config{dp_server_from_wan}, $config{dp_server}); $slotsstr .= "; join now: \002xonotic +connect $s" if $slots >= 1 and not $store{lms_blocked}; } @@ -821,6 +842,7 @@ $SIG{TERM} = sub { $channels{irc} = new Channel::Line(new Connection::Socket(tcp => $config{irc_local} => $config{irc_server} => 6667)); $channels{dp} = new Channel::QW(my $dpsock = new Connection::Socket(udp => $config{dp_listen} => $config{dp_server} => 26000), $config{dp_password}, $config{dp_secure}, $config{dp_secure_challengetimeout}); $config{dp_listen} = $dpsock->sockname(); +$config{dp_server} = $dpsock->peername(); print "Listening on $config{dp_listen}\n"; $channels{irc}->throttle(0.5, 5); @@ -1075,8 +1097,8 @@ sub cond($) [ dp => q{"log_dest_udp" is "([^"]*)" \["[^"]*"\]} => sub { my ($dest) = @_; my @dests = split ' ', $dest; - return 0 if grep { $_ eq $config{dp_listen} } @dests; - out dp => 0, 'log_dest_udp "' . join(" ", @dests, $config{dp_listen}) . '"'; + return 0 if grep { $_ eq pickip($config{dp_listen_from_server}, $config{dp_listen}) } @dests; + out dp => 0, 'log_dest_udp "' . join(" ", @dests, pickip($config{dp_listen_from_server}, $config{dp_listen})) . '"'; return 0; } ], @@ -1404,7 +1426,7 @@ sub cond($) # remove myself from the log destinations and exit everything [ dp => q{quitting rcon2irc (??{$store{quitcookie}}): log_dest_udp is (.*) *} => sub { my ($dest) = @_; - my @dests = grep { $_ ne $config{dp_listen} } split ' ', $dest; + my @dests = grep { $_ ne pickip($config{dp_listen_from_server}, $config{dp_listen}) } split ' ', $dest; out dp => 0, 'log_dest_udp "' . join(" ", @dests) . '"'; exit 0; return 0;