Code Monkey home page Code Monkey logo

static-upnp's Introduction

Static-UPnP

Static UPnP responds to upnp search requests with statically configured responses. This can be usefull to make devices available on other subnets, or to make devices available that are not responding to search requests.

Installation

git clone https://github.com/nigelb/Static-UPnP.git
cd Static-UPnP
pip install .

Or if you want static_upnp to automatically get the IP addresses to bind to from your network interfaces:

pip install .[interfaces]

Examples

Chromecast

This example demonstrates how to make a chrome cast available on another subnet. This demonstration assumes that the Chromecast's IP address is able to be determined by resolving the Chromecast hostname.

cd Static-UPnP
static_upnp --config-dir examples/Chromecast

If the Chromecast's IP address cannot be resolved you can set it by changing examples/Chromecast/StaticUPnP_StaticServices.py line 60. For example if the Chromecast's IP address is 10.0.0.20 then change line 60 from:

chromecast_ip = socket.gethostbyname_ex("Chromecast")[2][0]

to:

chromecast_ip = "10.0.0.20"

static-upnp's People

Contributors

nigelb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

static-upnp's Issues

youtube works but Netflix does not

Nigel,
I am using you you deamon.
Works great for youtube on iOS, Android and chrome browser.
The Android and the iOS Netflix app do not work. Does not even show the cast icon.
Netflix works well on chrome, though!
Is this a known issue?
thanks,
Leo

CONFIG NOTE: OpenWRT + Chromecast

I had five issues with the setup and config.

  1. I had to install python with "opkg install python"

  2. I had to manually download, unpack, move to my router (using sftp) and install (using ssh) https://pypi.python.org/simple/schedule/ and https://pypi.python.org/simple/pyip/ with "python setup.py install"

  3. To have it run automatically is used this in me "/etc/rc.local" file:
    "python /root/Static-UPnP/static_upnp/static.py --config-dir /root/Static-UPnP/examples/Chromecast/ &"

  4. The group in OpenWRT is "nogroup" not "nobody". change here https://github.com/nigelb/Static-UPnP/blob/master/examples/Chromecast/StaticUPnP_Permissions.py#L19

  5. The router needs to accept 239.255.255.250 traffic. So I had to add a static route to "239.255.255.250" mask "255.255.255.255" on the interface without the Chromecast.

I hope this helps someone else figure it all out.

You can also replace this line https://github.com/nigelb/Static-UPnP/blob/master/examples/Chromecast/StaticUPnP_StaticServices.py#L61 with the static ip address of your chromecast if you can't set dns name resolution for "Chromecast"

It works perfectly though. I have a chromecast available on two separate subnets.

Not working for current version of chromecast

I've set up the flowering configuration
10.0.10.x/24 (WLAN) -> Smartphones, Clients
10.0.12.x/24 (WLAN_MEDIA) -> Chromecast

10.0.12.11 (IP of the Chromecast)

The Chromecast does not appear in the App. For example YouTube.
If i connect to the same wifi (WLAN), the button appears.

Checked the firewall, no traffic between the smartphone and or chromecast is blocked.

Can you see the problem?

Here is the logging of Static UPnP

root@Evelyn:~/Static-UPnP# screen -AmdS cc static_upnp --config-dir examples/Chromecast -v
root@Evelyn:~/Static-UPnP# screen -r
2018-02-19 22:19:02,786 INFO    UPnPServiceResponder upnp_reciever.py:respond_ok_static:221 - Sending data to: 239.255.255.250:1900
2018-02-19 22:19:02,787 INFO    UPnPServiceResponder upnp_reciever.py:respond_ok_static:226 - M-SEARCH for ['ssdp:all'], Found: True
2018-02-19 22:19:07,746 DEBUG   mDNSResponder mDNS.py:handle_request:148 - QUERY: [u'_%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local.', u'_233637DE._sub._googlecast._tcp.local.', u'_googlecast._tcp.local.'], from: ('10.0.10.22', 5353)
2018-02-19 22:19:07,746 DEBUG   mDNSResponder mDNS.py:handle_request:152 - ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7
;; flags: ; QUERY: 3, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;_%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. IN      PTR
;_233637DE._sub._googlecast._tcp.local. IN      PTR
;_googlecast._tcp.local.        IN      PTR
2018-02-19 22:19:07,746 DEBUG   mDNSResponder mDNS.py:handle_request:154 - ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7
;; flags: qr aa; QUERY: 0, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; ANSWER SECTION:
_googlecast._tcp.local. 120     IN      PTR     Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local.
;; ADDITIONAL SECTION:
Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local. 4500    32769   TXT     "id=7825ff7835d65de382fe8d739fc25a61" "rm=" "ve=05" "md=Chromecast" "ic=/setup/icon.png" "fn=CC1" "ca=4101" "st=0" "bs=XXXXXXXXXXXX" "rs="
Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local. 120     32769   SRV     0 0 8009 7825ff78-35d6-5de3-82fe-8d739fc25a61.local.
7825ff78-35d6-5de3-82fe-8d739fc25a61.local. 120     32769   A       10.0.12.11
2018-02-19 22:19:08,754 DEBUG   mDNSResponder mDNS.py:handle_request:148 - QUERY: [u'_%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local.', u'_233637DE._sub._googlecast._tcp.local.', u'_googlecast._tcp.local.'], from: ('10.0.10.22', 5353)
2018-02-19 22:19:08,755 DEBUG   mDNSResponder mDNS.py:handle_request:152 - ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8
;; flags: ; QUERY: 3, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;_%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. IN      PTR
;_233637DE._sub._googlecast._tcp.local. IN      PTR
;_googlecast._tcp.local.        IN      PTR
2018-02-19 22:19:08,755 DEBUG   mDNSResponder mDNS.py:handle_request:154 - ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8
;; flags: qr aa; QUERY: 0, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; ANSWER SECTION:
_googlecast._tcp.local. 120     IN      PTR     Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local.
;; ADDITIONAL SECTION:
Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local. 4500    32769   TXT     "id=7825ff7835d65de382fe8d739fc25a61" "rm=" "ve=05" "md=Chromecast" "ic=/setup/icon.png" "fn=CC1" "ca=4101" "st=0" "bs=XXXXXXXXXXXX" "rs="
Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local. 120     32769   SRV     0 0 8009 7825ff78-35d6-5de3-82fe-8d739fc25a61.local.
7825ff78-35d6-5de3-82fe-8d739fc25a61.local. 120     32769   A       10.0.12.11
2018-02-19 22:19:09,663 DEBUG   mDNSResponder mDNS.py:handle_request:148 - QUERY: [u'_%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local.', u'_233637DE._sub._googlecast._tcp.local.', u'_googlecast._tcp.local.'], from: ('10.0.10.22', 5353)
2018-02-19 22:19:09,663 DEBUG   mDNSResponder mDNS.py:handle_request:152 - ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9
;; flags: ; QUERY: 3, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;_%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. IN      PTR
;_233637DE._sub._googlecast._tcp.local. IN      PTR
;_googlecast._tcp.local.        IN      PTR
2018-02-19 22:19:09,663 DEBUG   mDNSResponder mDNS.py:handle_request:154 - ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9
;; flags: qr aa; QUERY: 0, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; ANSWER SECTION:
_googlecast._tcp.local. 120     IN      PTR     Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local.
;; ADDITIONAL SECTION:
Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local. 4500    32769   TXT     "id=7825ff7835d65de382fe8d739fc25a61" "rm=" "ve=05" "md=Chromecast" "ic=/setup/icon.png" "fn=CC1" "ca=4101" "st=0" "bs=XXXXXXXXXXXX" "rs="
Chromecast-7825ff7835d65de382fe8d739fc25a61._googlecast._tcp.local. 120     32769   SRV     0 0 8009 7825ff78-35d6-5de3-82fe-8d739fc25a61.local.
7825ff78-35d6-5de3-82fe-8d739fc25a61.local. 120     32769   A       10.0.12.11

Does not work when an interface has multiple IP addresses

I have a linux box as my router; it sits under a comcast modem/router - but all devices are under the linux box. eno1 is the 'external' nic; enp2s0 is the internal. There are a bunch of static ips assigned for the internal nic for each subnet.

This seyup however does not seem to be supported bby static_upnp, attempting to reregister multicast fails with address in use. (I added the 'Attempting to reregister' log line at the beginning of the loop that has ''Reregistering multicast'):

2021-12-27 21:37:40,956 INFO    UPnPServiceResponder util.py:setup_sockets:82 - Attempting to regester multicast for: 239.255.255.250: 10.1.1.1
Traceback (most recent call last):
  File "/root/.local/bin/static_upnp", line 33, in <module>
    sys.exit(load_entry_point('static-upnp==0.0.1', 'console_scripts', 'static_upnp')())
  File "/root/.local/lib/python3.9/site-packages/static_upnp/static.py", line 97, in main
    responder.start()
  File "/root/.local/lib/python3.9/site-packages/static_upnp/upnp_reciever.py", line 92, in start
    self.setup_sockets()
  File "/root/.local/lib/python3.9/site-packages/static_upnp/upnp_reciever.py", line 109, in setup_sockets
    return setup_sockets(self)
  File "/root/.local/lib/python3.9/site-packages/static_upnp/util.py", line 86, in setup_sockets
    multi_sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
OSError: [Errno 98] Address already in use

I don't know if my setup is weird and wrong and I should do something different; or if there is a way to hack around this to make it work...

ip addr output:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether XXXXX brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 brd 10.0.0.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.1.1.1/24 brd 10.1.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.1.11.1/24 brd 10.1.11.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.1.12.1/24 brd 10.1.12.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.1.13.1/24 brd 10.1.13.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.1.2.1/24 brd 10.1.2.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.2.1.1/24 brd 10.2.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.2.11.1/24 brd 10.2.11.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.3.1.1/24 brd 10.3.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.3.11.1/24 brd 10.3.11.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.3.12.1/24 brd 10.3.12.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.3.13.1/24 brd 10.3.13.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.3.2.1/24 brd 10.3.2.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.4.11.1/24 brd 10.4.11.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.5.1.1/24 brd 10.5.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.5.11.1/24 brd 10.5.11.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.6.1.1/24 brd 10.6.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.6.11.1/24 brd 10.6.11.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.7.1.1/24 brd 10.7.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.7.11.1/24 brd 10.7.11.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.7.12.1/24 brd 10.7.12.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.7.13.1/24 brd 10.7.13.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.7.2.1/24 brd 10.7.2.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.8.1.1/24 brd 10.8.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.8.2.1/24 brd 10.8.2.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.9.1.1/24 brd 10.9.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.9.11.1/24 brd 10.9.11.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.255.1.1/24 brd 10.255.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 10.0.0.2/24 brd 10.0.0.255 scope global secondary enp2s0
       valid_lft forever preferred_lft forever
    inet6 fe80::76d4:35ff:fee5:d449/64 scope link
       valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
4: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default qlen 1000
    link/gre 0.0.0.0 brd 0.0.0.0
5: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
6: erspan0@NONE: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
7: ip_vti0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
8: ip6_vti0@NONE: <NOARP> mtu 1364 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd :: permaddr c27c:a590:6c9c::
9: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
10: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd :: permaddr 1224:21f:9bd1::
11: ip6gre0@NONE: <NOARP> mtu 1448 qdisc noop state DOWN group default qlen 1000
    link/gre6 :: brd :: permaddr 12e7:215e:b419::
12: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether XXXXX brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    inet 192.168.1.52/24 brd 192.168.1.255 scope global dynamic noprefixroute eno1
       valid_lft 2881sec preferred_lft 2431sec
    inet6 fe80::608:2a2f:6df1:db3b/64 scope link
       valid_lft forever preferred_lft forever

Installation of Script

Hi,

Thanks for the script, it could potentially resolve my problems. Where is this script installed, please assist with a how to guide.

Your assistance will be greatly appreciated.

Caswell

Problem with Unicode characters

My chromcast has unicode chars in its name.
Therefore the get the errormessage
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 4: ordinal not in range(128)

Python3 Compatibility and Launch error

After fixing some compile issues with python3, I am receiving the following error:

Traceback (most recent call last):
File "/usr/local/bin/static_upnp", line 9, in
load_entry_point('static-upnp==0.0.1', 'console_scripts', 'static_upnp')()
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 542, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 2569, in load_entry_point
return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 2229, in load
return self.resolve()
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 2235, in resolve
module = import(self.module_name, fromlist=['name'], level=0)
File "/usr/local/lib/python3.5/dist-packages/static_upnp-0.0.1-py3.5.egg/static_upnp/static.py", line 24, in
from static_upnp.upnp_reciever import UPnPServiceResponder
File "/usr/local/lib/python3.5/dist-packages/static_upnp-0.0.1-py3.5.egg/static_upnp/upnp_reciever.py", line 26, in
import ip, udp
File "", line 969, in _find_and_load
File "", line 954, in _find_and_load_unlocked
File "", line 896, in _find_spec
File "", line 1139, in find_spec
File "", line 1115, in _get_spec
File "", line 1096, in _legacy_get_spec
File "", line 444, in spec_from_loader
File "", line 533, in spec_from_file_location
File "/usr/local/lib/python3.5/dist-packages/pyip-0.7-py3.5.egg/ip.py", line 173
raise ValueError, "invalid source address"
^
SyntaxError: invalid syntax

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.