1#! /usr/bin/env python
2# $Id: testupnpigd.py,v 1.7 2020/04/06 10:23:02 nanard Exp $
3# MiniUPnP project
4# Author : Thomas Bernard
5# This Sample code is public domain.
6# website : https://miniupnp.tuxfamily.org/
7
8# import the python miniupnpc module
9import miniupnpc
10import socket
11
12try:
13    from http.server import BaseHTTPRequestHandler, HTTPServer
14except ImportError:
15    from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
16
17# function definition
18def list_redirections():
19	i = 0
20	while True:
21		p = u.getgenericportmapping(i)
22		if p==None:
23			break
24		print(i, p)
25		i = i + 1
26
27#define the handler class for HTTP connections
28class handler_class(BaseHTTPRequestHandler):
29	def do_GET(self):
30		self.send_response(200)
31		self.end_headers()
32		self.wfile.write(b"OK MON GARS")
33
34# create the object
35u = miniupnpc.UPnP()
36#print 'inital(default) values :'
37#print ' discoverdelay', u.discoverdelay
38#print ' lanaddr', u.lanaddr
39#print ' multicastif', u.multicastif
40#print ' minissdpdsocket', u.minissdpdsocket
41u.discoverdelay = 200;
42
43try:
44	print('Discovering... delay=%ums' % u.discoverdelay)
45	ndevices = u.discover()
46	print(ndevices, 'device(s) detected')
47
48	# select an igd
49	u.selectigd()
50	# display information about the IGD and the internet connection
51	print('local ip address :', u.lanaddr)
52	externalipaddress = u.externalipaddress()
53	print('external ip address :', externalipaddress)
54	print(u.statusinfo(), u.connectiontype())
55
56	#instanciate a HTTPd object. The port is assigned by the system.
57	httpd = HTTPServer((u.lanaddr, 0), handler_class)
58	eport = httpd.server_port
59
60	# find a free port for the redirection
61	r = u.getspecificportmapping(eport, 'TCP')
62	while r != None and eport < 65536:
63		eport = eport + 1
64		r = u.getspecificportmapping(eport, 'TCP')
65
66	print('trying to redirect %s port %u TCP => %s port %u TCP' % (externalipaddress, eport, u.lanaddr, httpd.server_port))
67
68	b = u.addportmapping(eport, 'TCP', u.lanaddr, httpd.server_port,
69	                    'UPnP IGD Tester port %u' % eport, '')
70	if b:
71		print('Success. Now waiting for some HTTP request on http://%s:%u' % (externalipaddress ,eport))
72		try:
73			httpd.handle_request()
74			httpd.server_close()
75		except KeyboardInterrupt as details:
76			print("CTRL-C exception!", details)
77		b = u.deleteportmapping(eport, 'TCP')
78		if b:
79			print('Successfully deleted port mapping')
80		else:
81			print('Failed to remove port mapping')
82	else:
83		print('Failed')
84
85	httpd.server_close()
86
87except Exception as e:
88	print('Exception :', e)
89