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