Rev1533, Add uPnP open protocols as parameter

This commit is contained in:
shortcutme 2016-10-02 14:39:03 +02:00
parent 8f6f6abb0e
commit 1849547133
3 changed files with 21 additions and 13 deletions

View file

@ -8,7 +8,7 @@ class Config(object):
def __init__(self, argv): def __init__(self, argv):
self.version = "0.4.1" self.version = "0.4.1"
self.rev = 1532 self.rev = 1533
self.argv = argv self.argv = argv
self.action = None self.action = None
self.config_file = "zeronet.conf" self.config_file = "zeronet.conf"

View file

@ -69,7 +69,7 @@ class FileServer(ConnectionServer):
self.log.info("Trying to open port using UpnpPunch...") self.log.info("Trying to open port using UpnpPunch...")
try: try:
UpnpPunch.ask_to_open_port(self.port, 'ZeroNet', retries=3) UpnpPunch.ask_to_open_port(self.port, 'ZeroNet', retries=3, protos=["TCP"])
except (UpnpPunch.UpnpError, UpnpPunch.IGDError) as err: except (UpnpPunch.UpnpError, UpnpPunch.IGDError) as err:
self.log.error("UpnpPunch run error: %s" % self.log.error("UpnpPunch run error: %s" %
Debug.formatException(err)) Debug.formatException(err))
@ -278,7 +278,7 @@ class FileServer(ConnectionServer):
if self.running and self.port_opened: if self.running and self.port_opened:
self.log.debug('Closing port %d' % self.port) self.log.debug('Closing port %d' % self.port)
try: try:
UpnpPunch.ask_to_close_port(self.port) UpnpPunch.ask_to_close_port(self.port, protos=["TCP"])
self.log.info('Closed port via upnp.') self.log.info('Closed port via upnp.')
except (UpnpPunch.UpnpError, UpnpPunch.IGDError), err: except (UpnpPunch.UpnpError, UpnpPunch.IGDError), err:
self.log.info("Failed at attempt to use upnp to close port: %s" % err) self.log.info("Failed at attempt to use upnp to close port: %s" % err)

View file

@ -266,13 +266,13 @@ def _send_requests(messages, location, upnp_schema, control_path):
raise UpnpError('Sending requests using UPnP failed.') raise UpnpError('Sending requests using UPnP failed.')
def _orchestrate_soap_request(ip, port, msg_fn, desc=None): def _orchestrate_soap_request(ip, port, msg_fn, desc=None, protos=['TCP', 'UDP']):
logging.debug("Trying using local ip: %s" % ip) logging.debug("Trying using local ip: %s" % ip)
idg_data = _collect_idg_data(ip) idg_data = _collect_idg_data(ip)
soap_messages = [ soap_messages = [
msg_fn(ip, port, desc, proto, idg_data['upnp_schema']) msg_fn(ip, port, desc, proto, idg_data['upnp_schema'])
for proto in ['TCP'] for proto in protos
] ]
_send_requests(soap_messages, **idg_data) _send_requests(soap_messages, **idg_data)
@ -281,7 +281,8 @@ def _orchestrate_soap_request(ip, port, msg_fn, desc=None):
def _communicate_with_igd(port=15441, def _communicate_with_igd(port=15441,
desc="UpnpPunch", desc="UpnpPunch",
retries=3, retries=3,
fn=_create_open_message): fn=_create_open_message,
protos=["TCP", "UDP"]):
""" """
Manage sending a message generated by 'fn'. Manage sending a message generated by 'fn'.
""" """
@ -292,7 +293,7 @@ def _communicate_with_igd(port=15441,
for local_ip in local_ips: for local_ip in local_ips:
try: try:
_orchestrate_soap_request(local_ip, port, fn, desc) _orchestrate_soap_request(local_ip, port, fn, desc, protos)
success = True success = True
break break
except (UpnpError, IGDError) as e: except (UpnpError, IGDError) as e:
@ -307,30 +308,37 @@ def _communicate_with_igd(port=15441,
port, retries)) port, retries))
def ask_to_open_port(port=15441, desc="UpnpPunch", retries=3): def ask_to_open_port(port=15441, desc="UpnpPunch", retries=3, protos=["TCP", "UDP"]):
logging.debug("Trying to open port %d." % port) logging.debug("Trying to open port %d." % port)
_communicate_with_igd(port=port, _communicate_with_igd(port=port,
desc=desc, desc=desc,
retries=retries, retries=retries,
fn=_create_open_message) fn=_create_open_message,
protos=protos)
def ask_to_close_port(port=15441, desc="UpnpPunch", retries=3): def ask_to_close_port(port=15441, desc="UpnpPunch", retries=3, protos=["TCP", "UDP"]):
logging.debug("Trying to close port %d." % port) logging.debug("Trying to close port %d." % port)
# retries=1 because multiple successes cause 500 response and failure # retries=1 because multiple successes cause 500 response and failure
_communicate_with_igd(port=port, _communicate_with_igd(port=port,
desc=desc, desc=desc,
retries=1, retries=1,
fn=_create_close_message) fn=_create_close_message,
protos=protos)
if __name__ == "__main__": if __name__ == "__main__":
from gevent import monkey from gevent import monkey
monkey.patch_socket() monkey.patch_socket()
logging.getLogger().setLevel(logging.DEBUG)
import time import time
s = time.time() s = time.time()
logging.getLogger().setLevel(logging.DEBUG) print "Opening port..."
print ask_to_open_port(15441, "ZeroNet", retries=3) print ask_to_open_port(15443, "ZeroNet", retries=3, protos=["TCP"])
print "Done in", time.time()-s
print "Closing port..."
print ask_to_close_port(15443, "ZeroNet", retries=3, protos=["TCP"])
print "Done in", time.time()-s print "Done in", time.time()-s