118 lines
5.0 KiB
Python
118 lines
5.0 KiB
Python
|
|
"""
|
||
|
|
Contributors can be viewed at:
|
||
|
|
http://svn.secondlife.com/svn/linden/projects/2008/pyogp/lib/base/trunk/CONTRIBUTORS.txt
|
||
|
|
|
||
|
|
$LicenseInfo:firstyear=2008&license=apachev2$
|
||
|
|
|
||
|
|
Copyright 2009, Linden Research, Inc.
|
||
|
|
|
||
|
|
Licensed under the Apache License, Version 2.0.
|
||
|
|
You may obtain a copy of the License at:
|
||
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
or in
|
||
|
|
http://svn.secondlife.com/svn/linden/projects/2008/pyogp/lib/base/LICENSE.txt
|
||
|
|
|
||
|
|
$/LicenseInfo$
|
||
|
|
"""
|
||
|
|
# standard python libs
|
||
|
|
from logging import getLogger
|
||
|
|
|
||
|
|
# pyogp
|
||
|
|
from pyogp.lib.base.udpdispatcher import UDPDispatcher
|
||
|
|
|
||
|
|
# initialize logging
|
||
|
|
logger = getLogger('message.udpproxy')
|
||
|
|
|
||
|
|
class UDPProxy(UDPDispatcher):
|
||
|
|
""" proxies a Second Life viewer's UDP connection to a region """
|
||
|
|
|
||
|
|
def __init__(self, sim_ip, sim_port, udp_client = None, settings = None, message_handler = None, message_template = None, message_xml = None):
|
||
|
|
""" initialize a UDP proxy, mapping 2 ports to a single outbound port """
|
||
|
|
|
||
|
|
super(UDPProxy, self).__init__(udp_client, settings, message_handler, message_template, message_xml)
|
||
|
|
|
||
|
|
self.target_host = Host((sim_ip, sim_port))
|
||
|
|
|
||
|
|
# ToDo: change all this crap below!
|
||
|
|
|
||
|
|
# the outgoing connection to the grid
|
||
|
|
self.server_facing_udp_client = NetUDPClient() # the sender, what we are proxying the target to
|
||
|
|
#self.server_facing_socket = self.server_facing_udp_client.start_udp_connection()
|
||
|
|
self.server_facing_udp_dispatcher = UDPDispatcher(udp_client=self.server_facing_udp_client)
|
||
|
|
|
||
|
|
# the local connection for the client
|
||
|
|
self.viewer_facing_udp_client = NetUDPClient() # the sender, what we are proxying the target to
|
||
|
|
#self.viewer_facing_socket = self.viewer_facing_udp_client.start_udp_connection()
|
||
|
|
self.viewer_facing_udp_dispatcher = UDPDispatcher(udp_client=self.viewer_facing_udp_client)
|
||
|
|
|
||
|
|
logger.debug("Building socket pair for %s udp proxy" % (self.target_host))
|
||
|
|
|
||
|
|
def pin_udp_proxy_ports(self, viewer_facing_port, server_facing_port):
|
||
|
|
|
||
|
|
try:
|
||
|
|
|
||
|
|
# tell the sim_socket to be on a specific port
|
||
|
|
logger.debug("Binding server_facing_socket to port %s" % (server_facing_port))
|
||
|
|
self.server_facing_udp_dispatcher.socket.bind((socket.gethostname(), server_facing_port))
|
||
|
|
|
||
|
|
# tell the local_socket to be on a specific port
|
||
|
|
logger.debug("Binding viewer_facing_socket to port %s" % (viewer_facing_port))
|
||
|
|
self.viewer_facing_udp_dispatcher.socket.bind((socket.gethostname(), viewer_facing_port))
|
||
|
|
|
||
|
|
hostname = self.viewer_facing_udp_dispatcher.socket.getsockname()[0]
|
||
|
|
|
||
|
|
self.local_host = Host((hostname, viewer_facing_port))
|
||
|
|
|
||
|
|
return hostname
|
||
|
|
|
||
|
|
except Exception, e:
|
||
|
|
raise
|
||
|
|
|
||
|
|
def start_proxy(self):
|
||
|
|
|
||
|
|
logger.debug("Starting proxies in UDPProxy")
|
||
|
|
|
||
|
|
self._is_running = True
|
||
|
|
|
||
|
|
while self._is_running:
|
||
|
|
|
||
|
|
try:
|
||
|
|
api.sleep(0)
|
||
|
|
|
||
|
|
self._send_viewer_to_sim()
|
||
|
|
self._receive_sim_to_viewer()
|
||
|
|
except KeyboardInterrupt:
|
||
|
|
logger.INFO("Stopping UDP proxy for %s" % (self.target_host))
|
||
|
|
break
|
||
|
|
except:
|
||
|
|
traceback.print_exc()
|
||
|
|
|
||
|
|
def _send_viewer_to_sim(self):
|
||
|
|
|
||
|
|
logger.debug("Checking for msgs from viewer")
|
||
|
|
|
||
|
|
msg_buf, msg_size = self.viewer_facing_udp_client.receive_packet(self.viewer_facing_udp_dispatcher.socket)
|
||
|
|
recv_packet = self.viewer_facing_udp_dispatcher.receive_check(self.viewer_facing_udp_dispatcher.udp_client.get_sender(),
|
||
|
|
msg_buf,
|
||
|
|
msg_size)
|
||
|
|
|
||
|
|
#logger.debug("viewer_facing_udp_client.receive_packet got %s:%s" % (msg_buf, msg_size))
|
||
|
|
|
||
|
|
if msg_size > 0:
|
||
|
|
logger.debug("Sending from %s to %s! Data: len(%s) Host: %s" % (self.viewer_facing_udp_dispatcher.socket.getsockname(), self.server_facing_udp_dispatcher.socket.getsockname(), len(msg_buf), self.target_host))
|
||
|
|
self.server_facing_udp_client.send_packet(self.server_facing_udp_dispatcher.socket, msg_buf, self.target_host)
|
||
|
|
|
||
|
|
def _receive_sim_to_viewer(self):
|
||
|
|
|
||
|
|
logger.debug("Checking for msgs from server")
|
||
|
|
|
||
|
|
msg_buf, msg_size = self.server_facing_udp_client.receive_packet(self.server_facing_udp_dispatcher.socket)
|
||
|
|
recv_packet = self.server_facing_udp_dispatcher.receive_check(self.server_facing_udp_dispatcher.udp_client.get_sender(),
|
||
|
|
msg_buf,
|
||
|
|
msg_size)
|
||
|
|
|
||
|
|
#logger.debug("server_facing_udp_client.receive_packet got %s:%s" % (msg_buf, msg_size))
|
||
|
|
|
||
|
|
if msg_size > 0:
|
||
|
|
logger.debug("Sending from %s to %s! Data: len(%s) Host: %s" % (self.server_facing_udp_dispatcher.socket.getsockname(), self.viewer_facing_udp_dispatcher.socket.getsockname(), len(msg_buf), self.target_host))
|
||
|
|
self.viewer_facing_udp_client.send_packet(self.viewer_facing_udp_dispatcher.socket, msg_buf, self.local_host)
|