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