aioupnp/README.md

147 lines
5.2 KiB
Markdown
Raw Permalink Normal View History

2020-10-30 20:27:37 +01:00
[![Build Status](https://github.com/lbryio/aioupnp/workflows/CI/badge.svg)
2018-10-08 07:55:42 +02:00
[![codecov](https://codecov.io/gh/lbryio/aioupnp/branch/master/graph/badge.svg)](https://codecov.io/gh/lbryio/aioupnp)
2018-10-18 17:53:10 +02:00
[![PyPI version](https://badge.fury.io/py/aioupnp.svg)](https://badge.fury.io/py/aioupnp)
2018-10-19 16:11:13 +02:00
[![Python 3.6](https://img.shields.io/badge/python-3.6-blue.svg)](https://www.python.org/downloads/release/python-360/)
[![Python 3.7](https://img.shields.io/badge/python-3.7-blue.svg)](https://www.python.org/downloads/release/python-370/)
2019-10-25 20:50:33 +02:00
[![Python 3.8](https://img.shields.io/badge/python-3.8-blue.svg)](https://www.python.org/downloads/release/python-380/)
2018-09-26 06:16:02 +02:00
2018-10-08 04:30:13 +02:00
# UPnP for asyncio
2018-07-30 23:48:20 +02:00
2020-01-16 21:34:02 +01:00
`aioupnp` is a python 3.6-8 library and command line tool to interact with UPnP gateways using asyncio. `aioupnp` requires the `netifaces` and `defusedxml` modules.
2018-07-30 23:48:20 +02:00
2018-10-12 19:56:15 +02:00
## Supported devices
2020-10-04 07:19:43 +02:00
![img](https://i.imgur.com/JtO4glP.png)
2018-07-30 23:48:20 +02:00
2019-11-15 16:46:15 +01:00
## Installation
2018-10-16 15:01:25 +02:00
2019-11-15 16:46:15 +01:00
Verify python is version 3.6-8
2018-10-16 15:01:25 +02:00
```
python --version
```
2020-10-29 03:11:48 +01:00
#### Installation for normal usage
2018-10-12 19:56:15 +02:00
```
pip install aioupnp
```
2020-10-29 03:11:48 +01:00
#### Installation for development
2018-07-30 23:51:59 +02:00
```
2018-10-12 19:56:15 +02:00
git clone https://github.com/lbryio/aioupnp.git
cd aioupnp
pip install -e .
2018-07-30 23:51:59 +02:00
```
2018-07-30 23:48:20 +02:00
2018-10-12 19:56:15 +02:00
2018-07-30 23:48:20 +02:00
## Usage
2018-07-31 17:35:24 +02:00
```
2018-10-12 19:56:15 +02:00
aioupnp [-h] [--debug_logging] [--interface=<interface>] [--gateway_address=<gateway_address>]
2018-10-08 07:00:42 +02:00
[--lan_address=<lan_address>] [--timeout=<timeout>]
2018-10-12 19:56:15 +02:00
[(--<case sensitive m-search header>=<value>)...]
2018-10-08 07:00:42 +02:00
command [--<arg name>=<arg>]...
```
2018-10-12 19:56:15 +02:00
#### Commands
* `help`
* `get_external_ip`
* `m_search`
* `add_port_mapping`
* `get_port_mapping_by_index`
* `get_redirects`
* `get_specific_port_mapping`
* `delete_port_mapping`
* `get_next_mapping`
* `gather_debug_info`
2020-10-04 07:19:43 +02:00
#### To get the documentation for a command
2018-07-30 23:52:16 +02:00
aioupnp help get_external_ip
2018-07-30 23:48:20 +02:00
#### To get the external ip address
2018-07-30 23:52:16 +02:00
2018-10-08 23:57:45 +02:00
aioupnp get_external_ip
2019-01-22 22:22:38 +01:00
#### To list the active port mappings on the gateway
2018-10-08 23:57:45 +02:00
aioupnp get_redirects
2019-01-22 22:30:06 +01:00
#### To set up a TCP port mapping
aioupnp add_port_mapping --external_port=1234 --internal_port=1234 --lan_address=<lan_addr> --description=test --protocol=TCP
2018-10-08 23:57:45 +02:00
#### To delete a TCP port mapping
2018-10-08 23:57:45 +02:00
aioupnp delete_port_mapping --external_port=1234 --protocol=TCP
2018-10-08 23:57:45 +02:00
#### M-Search headers
2020-10-14 21:08:21 +02:00
UPnP uses a multicast protocol (SSDP) to locate the gateway. Gateway discovery is automatic by default, but you may provide specific headers for the search to use to override automatic discovery.
2018-10-08 23:57:45 +02:00
If m-search headers are provided as keyword arguments then all of the headers to be used must be provided, in the order they are to be used. For example:
aioupnp --HOST=239.255.255.250:1900 --MAN=\"ssdp:discover\" --MX=1 --ST=upnp:rootdevice m_search
#### Using non-default network interfaces
By default, the network device will be automatically discovered. The interface may instead be specified with the `--interface`, provided before the command to be run. The gateway used on the interface network may be specified with the `--gateway_address` argument.
aioupnp --interface=wlp4s0 --gateway_address=192.168.1.6 m_search
2020-10-13 23:05:14 +02:00
#### Example usage from python
from aioupnp.upnp import UPnP
async def main():
upnp = await UPnP.discover()
print(await upnp.get_external_ip())
print(await upnp.get_redirects())
print("adding a port mapping")
await upnp.add_port_mapping(1234, 'TCP', 1234, upnp.lan_address, 'test mapping')
print(await upnp.get_redirects())
print("deleting the port mapping")
await upnp.delete_port_mapping(1234, 'TCP')
print(await upnp.get_redirects())
asyncio.run(main())
## Troubleshooting
If `aioupnp` is failing with m-search timeouts this means the UPnP gateway (the router) isn't being found at all. To see if this error is expected try running m_search with debug logging, which will print out the packets sent and received:
aioupnp --debug_logging m_search
If you only see packets being sent or the replies are only from devices that aren't your router (smart devices, speakers, etc), then there are three options:
* your router does not support UPnP (this is unlikely)
* UPnP is turned off in the web gui for your router (more likely)
* `aioupnp` has a bug (very likely if you don't see your router manufacturer doing well in the supported devices table)
If you see replies from the router but it still fails, then it's likely a bug in aioupnp.
If there are no replies and UPnP is certainly turned on, then a local firewall is the likely culprit.
2020-10-29 03:11:48 +01:00
## Sending a bug report
2020-10-29 03:11:48 +01:00
If it still doesn't work, you can send a bug report using an included script. This script will try finding the UPnP gateway using `aioupnp` as well as `miniupnpc` and then try add and remove a port mapping using each library. The script does this while capturing the packets sent/received, which makes figuring out what went wrong possible. The script will create a file with this packet capture (`aioupnp-bug-report.json`) and automatically send it.
Note: the bug report script currently does not work on MacOS
```
git clone https://github.com/lbryio/aioupnp.git
cd aioupnp
python3 -m pip install -e .
python3 -m pip install --user certifi aiohttp miniupnpc
sudo -E python3 generate_bug_report.py
```
2018-10-08 23:57:45 +02:00
2018-07-30 23:48:20 +02:00
## License
This project is MIT licensed. For the full license, see [LICENSE](LICENSE).
## Contact
2019-11-15 16:46:15 +01:00
The primary contact for this project is [@jackrobison](mailto:jackrobison@lbry.com)