#! /usr/bin/env python # $Id: testupnpigd.py,v 1.7 2020/04/06 10:23:02 nanard Exp $ # MiniUPnP project # Author : Thomas Bernard # This Sample code is public domain. # website : https://miniupnp.tuxfamily.org/ # import the python miniupnpc module import miniupnpc import socket try: from http.server import BaseHTTPRequestHandler, HTTPServer except ImportError: from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer # function definition def list_redirections(): i = 0 while True: p = u.getgenericportmapping(i) if p==None: break print(i, p) i = i + 1 #define the handler class for HTTP connections class handler_class(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.end_headers() self.wfile.write(b"OK MON GARS") # create the object u = miniupnpc.UPnP() #print 'inital(default) values :' #print ' discoverdelay', u.discoverdelay #print ' lanaddr', u.lanaddr #print ' multicastif', u.multicastif #print ' minissdpdsocket', u.minissdpdsocket u.discoverdelay = 200; try: print('Discovering... delay=%ums' % u.discoverdelay) ndevices = u.discover() print(ndevices, 'device(s) detected') # select an igd u.selectigd() # display information about the IGD and the internet connection print('local ip address :', u.lanaddr) externalipaddress = u.externalipaddress() print('external ip address :', externalipaddress) print(u.statusinfo(), u.connectiontype()) #instanciate a HTTPd object. The port is assigned by the system. httpd = HTTPServer((u.lanaddr, 0), handler_class) eport = httpd.server_port # find a free port for the redirection r = u.getspecificportmapping(eport, 'TCP') while r != None and eport < 65536: eport = eport + 1 r = u.getspecificportmapping(eport, 'TCP') print('trying to redirect %s port %u TCP => %s port %u TCP' % (externalipaddress, eport, u.lanaddr, httpd.server_port)) b = u.addportmapping(eport, 'TCP', u.lanaddr, httpd.server_port, 'UPnP IGD Tester port %u' % eport, '') if b: print('Success. Now waiting for some HTTP request on http://%s:%u' % (externalipaddress ,eport)) try: httpd.handle_request() httpd.server_close() except KeyboardInterrupt as details: print("CTRL-C exception!", details) b = u.deleteportmapping(eport, 'TCP') if b: print('Successfully deleted port mapping') else: print('Failed to remove port mapping') else: print('Failed') httpd.server_close() except Exception as e: print('Exception :', e)