#!/usr/bin/python3 ## Copyright (C) 2010, 2011, 2012, 2013, 2014 Red Hat, Inc. ## Authors: ## Tim Waugh <twaugh@redhat.com> ## 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. import dbus, re import urllib.parse from debug import * class DNSSDHostNamesResolver: def __init__ (self, devices): self._devices = devices self._unresolved = len (devices) self._device_uri_by_name = {} debugprint ("+%s" % self) def __del__ (self): debugprint ("-%s" % self) def resolve (self, reply_handler): self._reply_handler = reply_handler bus = dbus.SystemBus () if not bus: reply_handler ([]) del self._devices del self._reply_handler return for uri, device in self._devices.items (): if not uri.startswith ("dnssd://"): self._unresolved -= 1 continue # We need to resolve the DNS-SD hostname in order to # compare with other network devices. result = urllib.parse.urlparse (uri) hostname = result.netloc elements = hostname.rsplit (".", 3) if len (elements) != 4: self._resolved () continue name, stype, protocol, domain = elements name = urllib.parse.unquote (name) stype += "." + protocol # e.g. _printer._tcp try: obj = bus.get_object ("org.freedesktop.Avahi", "/") server = dbus.Interface (obj, "org.freedesktop.Avahi.Server") self._device_uri_by_name[(name, stype, domain)] = uri debugprint ("Resolving address for %s" % hostname) server.ResolveService (-1, -1, name, stype, domain, -1, 0, reply_handler=self._reply, error_handler=lambda e: self._error (uri, e)) except dbus.DBusException as e: debugprint ("Failed to resolve address: %s" % repr (e)) self._resolved () def _resolved (self): self._unresolved -= 1 if self._unresolved == 0: debugprint ("All addresses resolved") self._reply_handler (self._devices) del self._devices del self._reply_handler def _reply (self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): uri = self._device_uri_by_name[(name, stype, domain)] self._devices[uri].address = address hostname = host p = hostname.find(".") if p != -1: hostname = hostname[:p] debugprint ("%s is at %s (%s)" % (uri, address, hostname)) self._devices[uri].hostname = hostname self._resolved () def _error (self, uri, error): debugprint ("Error resolving %s: %s" % (uri, repr (error))) self._resolved () if __name__ == '__main__': class Device: def __repr__ (self): try: return "<Device @ %s>" % self.address except: return "<Device>" devices = {"dnssd://dlk-08E206-P1._printer._tcp.local/": Device(), "dnssd://foo._printer._tcp.local/": Device()} from dbus.glib import DBusGMainLoop DBusGMainLoop (set_as_default=True) class Test: def __init__ (self, loop, devices): self._loop = loop self._devices = devices def run (self): r = DNSSDHostNamesResolver (self._devices) r.resolve (reply_handler=self.reply) return False def reply (self, *args): print(args) self._loop.quit () from gi.repository import GObject from gi.repository import GLib loop = GObject.MainLoop () set_debugging (True) GLib.idle_add (Test (loop, devices).run) loop.run ()
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
icons | Folder | 0755 |
|
|
troubleshoot | Folder | 0755 |
|
|
ui | Folder | 0755 |
|
|
xml | Folder | 0755 |
|
|
HIG.py | File | 57 B | 0644 |
|
OpenPrintingRequest.py | File | 6.81 KB | 0644 |
|
PhysicalDevice.py | File | 16.19 KB | 0644 |
|
SearchCriterion.py | File | 1.32 KB | 0644 |
|
ToolbarSearchEntry.py | File | 6.96 KB | 0644 |
|
applet.py | File | 16.39 KB | 0755 |
|
asyncconn.py | File | 9.6 KB | 0644 |
|
asyncipp.py | File | 26.13 KB | 0644 |
|
asyncpk1.py | File | 25.85 KB | 0644 |
|
authconn.py | File | 18.85 KB | 0644 |
|
check-device-ids.py | File | 11.16 KB | 0755 |
|
config.py | File | 1.19 KB | 0644 |
|
cupspk.py | File | 27.48 KB | 0644 |
|
debug.py | File | 1.62 KB | 0644 |
|
dnssdresolve.py | File | 4.66 KB | 0644 |
|
errordialogs.py | File | 3.12 KB | 0644 |
|
firewallsettings.py | File | 9.38 KB | 0644 |
|
gtkinklevel.py | File | 4.71 KB | 0644 |
|
gui.py | File | 2.13 KB | 0644 |
|
install-printerdriver.py | File | 5.34 KB | 0755 |
|
installpackage.py | File | 2.2 KB | 0644 |
|
jobviewer.py | File | 97.36 KB | 0644 |
|
killtimer.py | File | 2.08 KB | 0644 |
|
monitor.py | File | 32.36 KB | 0644 |
|
newprinter.py | File | 178.53 KB | 0644 |
|
options.py | File | 18.97 KB | 0644 |
|
optionwidgets.py | File | 8.89 KB | 0644 |
|
ppdcache.py | File | 7.57 KB | 0644 |
|
ppdippstr.py | File | 16.19 KB | 0644 |
|
ppdsloader.py | File | 10.98 KB | 0644 |
|
printerproperties.py | File | 78.11 KB | 0644 |
|
probe_printer.py | File | 15.82 KB | 0644 |
|
pysmb.py | File | 6.81 KB | 0755 |
|
scp-dbus-service.py | File | 22.22 KB | 0755 |
|
serversettings.py | File | 21.83 KB | 0644 |
|
smburi.py | File | 3.22 KB | 0644 |
|
statereason.py | File | 6.83 KB | 0644 |
|
system-config-printer.py | File | 86.21 KB | 0755 |
|
timedops.py | File | 8.21 KB | 0644 |
|
userdefault.py | File | 6.2 KB | 0644 |
|