Mercurial > libervia-backend
annotate sat/plugins/plugin_misc_nat-port.py @ 2661:661f66d41215
core (xmpp): send initial presence only after all profileConnected have been treated:
presence is now sent after profileConnected methods are done, this avoid to have to deal with synchronisation in connection event.
For instance, PEP events should not be sent before presence is sent, so profileConnected methods can assume PEP events are not
done yet, and do needed initialisation using async method if necessary.
This has been done to avoid overcomplicated synchronisation in XEP-0384 plugin (network calls are needed to initialise session,
but PEP events need an initialised session to be treated).
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 11 Aug 2018 18:24:55 +0200 |
parents | 56f94936df1e |
children | 378188abe941 |
rev | line source |
---|---|
1934
2daf7b4c6756
use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
1 #!/usr/bin/env python2 |
1536 | 2 # -*- coding: utf-8 -*- |
3 | |
4 # SAT plugin for NAT port mapping | |
2483 | 5 # Copyright (C) 2009-2018 Jérôme Poisson (goffi@goffi.org) |
1536 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 from sat.core.i18n import _ | |
21 from sat.core.constants import Const as C | |
22 from sat.core.log import getLogger | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
23 |
1536 | 24 log = getLogger(__name__) |
25 from sat.core import exceptions | |
26 from twisted.internet import threads | |
27 from twisted.internet import defer | |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
28 from twisted.python import failure |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
29 import threading |
1536 | 30 |
31 try: | |
32 import miniupnpc | |
33 except ImportError: | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
34 raise exceptions.MissingModule( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
35 u"Missing module MiniUPnPc, please download/install it (and its Python binding) at http://miniupnp.free.fr/ (or use pip install miniupnpc)" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
36 ) |
1536 | 37 |
38 | |
39 PLUGIN_INFO = { | |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
40 C.PI_NAME: "NAT port mapping", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
41 C.PI_IMPORT_NAME: "NAT-PORT", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
42 C.PI_TYPE: C.PLUG_TYPE_MISC, |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
43 C.PI_MAIN: "NatPort", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
44 C.PI_HANDLER: "no", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
45 C.PI_DESCRIPTION: _("""Automatic NAT port mapping using UPnP"""), |
1536 | 46 } |
47 | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
48 STARTING_PORT = 6000 # starting point to automatically find a port |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
49 DEFAULT_DESC = ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
50 u"SaT port mapping" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
51 ) # we don't use "à" here as some bugged NAT don't manage charset correctly |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
52 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
53 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
54 class MappingError(Exception): |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
55 pass |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
56 |
1536 | 57 |
58 class NatPort(object): | |
59 # TODO: refresh data if a new connection is detected (see plugin_misc_ip) | |
60 | |
61 def __init__(self, host): | |
62 log.info(_("plugin NAT Port initialization")) | |
63 self.host = host | |
64 self._external_ip = None | |
65 self._initialised = defer.Deferred() | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
66 self._upnp = miniupnpc.UPnP() # will be None if no device is available |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
67 self._upnp.discoverdelay = 200 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
68 self._mutex = threading.Lock() # used to protect access to self._upnp |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
69 self._starting_port_cache = None # used to cache the first available port |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
70 self._to_unmap = [] # list of tuples (ext_port, protocol) of ports to unmap on unload |
1536 | 71 discover_d = threads.deferToThread(self._discover) |
72 discover_d.chainDeferred(self._initialised) | |
73 self._initialised.addErrback(self._init_failed) | |
74 | |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
75 def unload(self): |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
76 if self._to_unmap: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
77 log.info(u"Cleaning mapped ports") |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
78 return threads.deferToThread(self._unmapPortsBlocking) |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
79 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
80 def _init_failed(self, failure_): |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
81 e = failure_.trap(exceptions.NotFound, exceptions.FeatureNotFound) |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
82 if e == exceptions.FeatureNotFound: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
83 log.info(u"UPnP-IGD seems to be not activated on the device") |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
84 else: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
85 log.info(u"UPnP-IGD not available") |
1536 | 86 self._upnp = None |
87 | |
88 def _discover(self): | |
89 devices = self._upnp.discover() | |
90 if devices: | |
91 log.info(u"{nb} UPnP-IGD device(s) found".format(nb=devices)) | |
92 else: | |
93 log.info(u"Can't find UPnP-IGD device on the local network") | |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
94 raise failure.Failure(exceptions.NotFound()) |
1536 | 95 self._upnp.selectigd() |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
96 try: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
97 self._external_ip = self._upnp.externalipaddress() |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
98 except Exception: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
99 raise failure.Failure(exceptions.FeatureNotFound()) |
1536 | 100 |
101 def getIP(self, local=False): | |
102 """Return IP address found with UPnP-IGD | |
103 | |
104 @param local(bool): True to get external IP address, False to get local network one | |
105 @return (None, str): found IP address, or None of something got wrong | |
106 """ | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
107 |
1536 | 108 def getIP(dummy): |
109 if self._upnp is None: | |
110 return None | |
111 # lanaddr can be the empty string if not found, | |
112 # we need to return None in this case | |
113 return (self._upnp.lanaddr or None) if local else self._external_ip | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
114 |
1536 | 115 return self._initialised.addCallback(getIP) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
116 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
117 def _unmapPortsBlocking(self): |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
118 """Unmap ports mapped in this session""" |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
119 self._mutex.acquire() |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
120 try: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
121 for port, protocol in self._to_unmap: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
122 log.info(u"Unmapping port {}".format(port)) |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
123 unmapping = self._upnp.deleteportmapping( |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
124 # the last parameter is remoteHost, we don't use it |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
125 port, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
126 protocol, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
127 "", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
128 ) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
129 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
130 if not unmapping: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
131 log.error( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
132 u"Can't unmap port {port} ({protocol})".format( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
133 port=port, protocol=protocol |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
134 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
135 ) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
136 del self._to_unmap[:] |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
137 finally: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
138 self._mutex.release() |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
139 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
140 def _mapPortBlocking(self, int_port, ext_port, protocol, desc): |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
141 """Internal blocking method to map port |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
142 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
143 @param int_port(int): internal port to use |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
144 @param ext_port(int): external port to use, or None to find one automatically |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
145 @param protocol(str): 'TCP' or 'UDP' |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
146 @param desc(str): description of the mapping |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
147 @param return(int, None): external port used in case of success, otherwise None |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
148 """ |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
149 # we use mutex to avoid race condition if 2 threads |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
150 # try to acquire a port at the same time |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
151 self._mutex.acquire() |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
152 try: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
153 if ext_port is None: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
154 # find a free port |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
155 starting_port = self._starting_port_cache |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
156 ext_port = STARTING_PORT if starting_port is None else starting_port |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
157 ret = self._upnp.getspecificportmapping(ext_port, protocol) |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
158 while ret != None and ext_port < 65536: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
159 ext_port += 1 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
160 ret = self._upnp.getspecificportmapping(ext_port, protocol) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
161 if starting_port is None: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
162 # XXX: we cache the first successfuly found external port |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
163 # to avoid testing again the first series the next time |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
164 self._starting_port_cache = ext_port |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
165 |
2488
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
166 try: |
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
167 mapping = self._upnp.addportmapping( |
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
168 # the last parameter is remoteHost, we don't use it |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
169 ext_port, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
170 protocol, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
171 self._upnp.lanaddr, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
172 int_port, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
173 desc, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
174 "", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
175 ) |
2488
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
176 except Exception as e: |
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
177 log.error(_(u"addportmapping error: {msg}").format(msg=e)) |
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
178 raise failure.Failure(MappingError()) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
179 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
180 if not mapping: |
2488
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
181 raise failure.Failure(MappingError()) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
182 else: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
183 self._to_unmap.append((ext_port, protocol)) |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
184 finally: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
185 self._mutex.release() |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
186 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
187 return ext_port |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
188 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
189 def mapPort(self, int_port, ext_port=None, protocol="TCP", desc=DEFAULT_DESC): |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
190 """Add a port mapping |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
191 |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
192 @param int_port(int): internal port to use |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
193 @param ext_port(int,None): external port to use, or None to find one automatically |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
194 @param protocol(str): 'TCP' or 'UDP' |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
195 @param desc(unicode): description of the mapping |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
196 Some UPnP IGD devices have broken encoding. It's probably a good idea to avoid non-ascii chars here |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
197 @return (D(int, None)): external port used in case of success, otherwise None |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
198 """ |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
199 if self._upnp is None: |
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
200 return defer.succeed(None) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
201 |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
202 def mappingCb(ext_port): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
203 log.info( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
204 u"{protocol} mapping from {int_port} to {ext_port} successful".format( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
205 protocol=protocol, int_port=int_port, ext_port=ext_port |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
206 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
207 ) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
208 return ext_port |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
209 |
2488
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
210 def mappingEb(failure_): |
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
211 failure_.trap(MappingError) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
212 log.warning(u"Can't map internal {int_port}".format(int_port=int_port)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
213 |
2488
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
214 def mappingUnknownEb(failure_): |
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
215 log.error(_(u"error while trying to map ports: {msg}").format(msg=failure_)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
216 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
217 d = threads.deferToThread( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
218 self._mapPortBlocking, int_port, ext_port, protocol, desc |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
219 ) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
220 d.addCallbacks(mappingCb, mappingEb) |
2488
78c7992a26ed
plugin NAT-port: raise MappingError if something get wrong during "addportmapping" + log unexpected errors (i.e. everything else than MappingError)
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
221 d.addErrback(mappingUnknownEb) |
1554
e281ed2c21db
plugin NAT port: added UPnP IGD mapping + automatic unmapping on backend shut down
Goffi <goffi@goffi.org>
parents:
1536
diff
changeset
|
222 return d |