Browse Source
Basic ZeroConfig support, only when SABnzbd listens to external addresses. On all platforms, ZeroConfig/Bonjour libraries fail to implement "localhost" support properly. Default on when support libraries are installed, special option to disable in case of trouble. HTTP-->HTTPS redirection only enabled when ZeroConfig is active.pull/91/head
7 changed files with 2204 additions and 2 deletions
@ -0,0 +1,10 @@ |
|||
The module pybonjour is (C) Christopher Stawarz <cstawarz@gmail.com> |
|||
|
|||
Version: 1.1.1 |
|||
May 8, 2008 |
|||
|
|||
Home of the module: |
|||
http://pseudogreen.org/bzr/pybonjour/ |
|||
|
|||
It is covered by the following license: |
|||
"pybonjour is free software, distributed under the MIT license." |
File diff suppressed because it is too large
@ -0,0 +1,114 @@ |
|||
#!/usr/bin/python -OO |
|||
# Copyright 2008-2012 The SABnzbd-Team <team@sabnzbd.org> |
|||
# |
|||
# This program is free software; you can redistribute it and/or |
|||
# modify it under the terms of the GNU General Public License |
|||
# as published by the Free Software Foundation; either version 2 |
|||
# of the License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU General Public License |
|||
# along with this program; if not, write to the Free Software |
|||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|||
|
|||
""" |
|||
sabnzbd.zconfig - bonjour/zeroconfig support |
|||
""" |
|||
|
|||
import os |
|||
import logging |
|||
import socket |
|||
import cherrypy |
|||
|
|||
_HOST_PORT = (None, None) |
|||
|
|||
try: |
|||
from sabnzbd.utils import pybonjour |
|||
from threading import Thread |
|||
_HAVE_BONJOUR = True |
|||
except: |
|||
_HAVE_BONJOUR = False |
|||
|
|||
import sabnzbd |
|||
import sabnzbd.cfg as cfg |
|||
from sabnzbd.misc import match_str |
|||
|
|||
_BONJOUR_OBJECT = None |
|||
|
|||
def hostname(): |
|||
""" Return host's pretty name """ |
|||
if sabnzbd.WIN32: |
|||
return os.environ.get('computername', 'unknown') |
|||
try: |
|||
return os.uname()[1] |
|||
except: |
|||
return 'unknown' |
|||
|
|||
|
|||
def _zeroconf_callback(sdRef, flags, errorCode, name, regtype, domain): |
|||
logging.debug('Full Bonjour-callback sdRef=%s, flags=%s, errorCode=%s, name=%s, regtype=%s, domain=%s', |
|||
sdRef, flags, errorCode, name, regtype, domain) |
|||
if errorCode == pybonjour.kDNSServiceErr_NoError: |
|||
logging.info('Registered in Bonjour as "%s" (%s)', name, domain) |
|||
|
|||
|
|||
def set_bonjour(host=None, port=None): |
|||
""" Publish host/port combo through Bonjour |
|||
""" |
|||
global _HOST_PORT, _BONJOUR_OBJECT |
|||
|
|||
if not _HAVE_BONJOUR or not cfg.enable_bonjour(): |
|||
logging.debug('No Bonjour/ZeroConfig support installed') |
|||
return |
|||
|
|||
if host is None and port is None: |
|||
host, port = _HOST_PORT |
|||
else: |
|||
_HOST_PORT = (host, port) |
|||
|
|||
scope = pybonjour.kDNSServiceInterfaceIndexAny |
|||
zhost = None |
|||
domain = None |
|||
|
|||
if match_str(host, ('localhost', '127.0.', '::1')): |
|||
logging.info('Bonjour/ZeroConfig does not support "localhost"') |
|||
# All implementations fail to implement "localhost" properly |
|||
# A false addresss is published even when scope==kDNSServiceInterfaceIndexLocalOnly |
|||
return |
|||
|
|||
name = hostname() |
|||
if '.local' in name: |
|||
suffix = '' |
|||
else: |
|||
suffix = '.local' |
|||
cherrypy.wsgiserver.redirect_url("https://%s%s:%s/sabnzbd" % (name, suffix, port)) |
|||
refObject = pybonjour.DNSServiceRegister( |
|||
interfaceIndex = scope, |
|||
name = 'SABnzbd on %s' % name, |
|||
regtype = '_http._tcp', |
|||
domain = domain, |
|||
host = zhost, |
|||
port = int(port), |
|||
txtRecord = pybonjour.TXTRecord({'path': '/sabnzbd/'}), |
|||
callBack = _zeroconf_callback) |
|||
logging.debug('Try to publish in Bonjour as "%s" (%s:%s)', name, host, port) |
|||
Thread(target=_bonjour_server, args=(refObject,)) |
|||
_BONJOUR_OBJECT = refObject |
|||
|
|||
|
|||
def _bonjour_server(refObject): |
|||
while 1: |
|||
pybonjour.DNSServiceProcessResult(refObject) |
|||
logging.debug('GOT A BONJOUR CALL') |
|||
|
|||
|
|||
def remove_server(): |
|||
""" Remove Bonjour registration """ |
|||
global _BONJOUR_OBJECT |
|||
if _BONJOUR_OBJECT: |
|||
_BONJOUR_OBJECT.close() |
|||
_BONJOUR_OBJECT = None |
Loading…
Reference in new issue