Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
zeroconf [Le 09/07/2011, 17:51]
212.198.140.184
zeroconf [Le 12/02/2024, 16:51] (Version actuelle)
krodelabestiole installer avahi-daemon
Ligne 1: Ligne 1:
-#​!/​usr/​bin/​env python+{{tag>​réseau Partage}}
  
-"""​ +====== ZeroConf ======
-Copyright (c) 2010 Timothy J Fontaine <​tjfontaine@atxconsulting.com>​+
  
-Permission is hereby granted, free of charge, to any person obtaining a copy +//« Le partage de ressources de manière transparente sur un réseau local. »//
-of this software and associated documentation files (the "​Software"​),​ to deal +
-in the Software without restriction,​ including without limitation the rights +
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +
-copies of the Software, and to permit persons to whom the Software is +
-furnished to do so, subject to the following conditions:+
  
-The above copyright notice and this permission notice shall be included in +===== Introduction =====
-all copies or substantial portions of the Software.+
  
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +**ZeroConf** est une collection d'​outils et de protocoles servant à l'​autoconfiguration des réseauxCette technologie est appelée //Bonjour// (ou encore //​RendezVous//​) par Apple et est utilisée intensivement par Mac OS X.
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,​ +
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENTIN NO EVENT SHALL THE +
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +
-THE SOFTWARE. +
-"""​+
  
-import cupsos, optparse, re, urlparse +ZeroConf est composé de : 
-import os.path +  * Résolution de nomsMDNS ; 
-from StringIO import StringIO+  * Publication de service sur le réseau ; 
 +  * Allocation d'​adresses.
  
-from xml.dom.minidom import parseString +Traditionnellement,​ la plupart de ce travail est réalisé par DHCP et DNSCependant, la conception décentralisée de ZeroConf est plus appropriée dans certaines situations, comme pour les réseaux //ad hoc//De plus, cela se fait sans aucune configuration (mise à part celle de l'​installation de ZeroConf).
-from xml.dom import minidom+
  
-import sys+ZeroConf s'​intègre très bien avec les outils traditionnels. Par exemple, vous pouvez obtenir une adresse IP par DHCP et utiliser le service DNS pour résoudre les adresses sur internet, tout en utilisant le hostname.local de MDNS //​(Multicast DNS)// pour résoudre les adresses des autres ordinateurs sur le LAN.
  
-try: +Remarque ​Si vous souhaitez utiliser ZeroConf dans un réseau qui ne vous appartient pas, il est préférable de contacter en premier l'​administrateur réseauBien que ZeroConf soit un protocole performantl'​administrateur peut ne pas vouloir de ce trafic réseau additionnelSoyez aussi vigilantcar il est aisé d'usurper un nom mdns //« .local »//.
-    import lxml.etree as etree +
-    from lxml.etree import ElementElementTree,​ tostring +
-except: +
-    try: +
-        from xml.etree.ElementTree import ElementElementTree,​ tostring +
-        etree = None +
-    except: +
-        try: +
-            from elementtree import Element, ElementTree,​ tostring +
-            etree = None +
-        except: +
-            raise 'Failed to find python libxml or elementtree,​ please install one of those or use python >= 2.5'+
  
-XML_TEMPLATE = """<​!DOCTYPE service-group SYSTEM "avahi-service.dtd">​ +Cette technologie peut actuellement être utilisée pour : 
-<service-group> +  * Partager de la musique ​--- [[Rhythmbox]],​ iTunes, [[mt-daapd]];​ 
-<name replace-wildcards="​yes"><​/name> +  * Échanger des fichiers ​--- [[https://linux.softpedia.com/get/Desktop-Environment/Tools/gnome-user-share-11597.shtml|gnome-user-share]] (en); 
-<​service>​ +  * Découvrir automatiquement les autres clients VoIP --- [[Ekiga#​avahi|Ekiga]] ; 
- <​type>​_ipp._tcp<​/type> +  * Discuter par messagerie instantanée sur le réseau local --- [[gajim]], [[pidgin]], [[empathy]] ; 
- <​subtype>​_universal._sub._ipp._tcp<​/subtype>​ +  * Partager les paquets ​--- [[squid-deb-proxy]] ; 
- <​port>​631<​/port> +  * [[:​tutoriel:​installer_imprimante_partage|Partager des imprimantes]] (sous Ubuntu 7.10, dans //Système → Administration → Impression//,​ à l'​onglet //​Paramètres du Serveur//, cocher la case « Partager les imprimantes connectées à ce système »). 
- <txt-record>​txtvers=1<​/txt-record> +  * Publier les sites web disponibles avec [[apache2]] : installer le paquet **[[apt://libapache2-mod-dnssd|libapache2-mod-dnssd]]** puis activer le module apache avec la commande ''​$sudo a2enmod dnssd''​ 
- <txt-record>​qtotal=1</​txt-record> +  * Publier un serveur ssh (voir discussion sur le [[https://​forum.ubuntu-fr.org/​viewtopic.php?​id=206906|forum]] ; rapport de bug [[http://​bugs.debian.org/​cgi-bin/​bugreport.cgi?​bug=375685#​15|debian]] (en anglais))
- <txt-record>​Transparent=T</​txt-record> +
- <txt-record>​URF=none</​txt-record> +
-</service> +
-</service-group>"""​+
  
-#TODO XXX FIXME +===== Installation =====
-#<​txt-record>​ty=AirPrint Ricoh Aficio MP 6000</​txt-record>​ +
-#<​txt-record>​Binary=T</​txt-record>​ +
-#<​txt-record>​Duplex=T</​txt-record>​ +
-#<​txt-record>​Copies=T</​txt-record>​+
  
 +ZeroConf est installé et activé par défaut dans Ubuntu. Vous n'avez donc rien à faire pour l'​installer.
  
-DOCUMENT_TYPES = { +Si ce n'est pas le casil suffit d'[[:tutoriel:comment_installer_un_paquet|installer le paquet]] [[apt>​avahi-daemon]].
-    # These content-types will be at the front of the list +
-    ​'application/​pdf':​ True, +
-    '​application/​postscript': ​True, +
-    '​application/​vnd.cups-raster'​True, +
-    '​application/​octet-stream':​ True, +
-    '​image/​urf':​ True, +
-    '​image/​png':​ True, +
-    '​image/​tiff':​ True, +
-    '​image/​png':​ True, +
-    '​image/​jpeg':​ True, +
-    '​image/​gif':​ True, +
-    '​text/​plain':​ True, +
-    '​text/​html':​ True,+
  
-    # These content-types will never be reported +Il se peut que la configuration du pare-feu bloque le trafic mDNS par défaut. Dans le panneau de configuration du pare-feuon pourra si nécessaire changer la Zone par défaut (public) pour une zone plus permissible (home).
-    '​image/​x-xwindowdump':​ False, +
-    '​image/​x-xpixmap':​ False, +
-    '​image/​x-xbitmap':​ False, +
-    '​image/​x-sun-raster':​ False, +
-    '​image/​x-sgi-rgb':​ False, +
-    '​image/​x-portable-pixmap':​ False, +
-    '​image/​x-portable-graymap':​ False, +
-    '​image/​x-portable-bitmap':​ False, +
-    '​image/​x-portable-anymap':​ False, +
-    '​application/​x-shell':​ False, +
-    '​application/​x-perl':​ False, +
-    '​application/​x-csource':​ False, +
-    '​application/​x-cshell':​ False, +
-}+
  
-class AirPrintGenerate(object):​ +===== Utilisation ​=====
-    def __init__(self,​ host=None, user=None, port=None, verbose=False, +
-        directory=None, prefix='​AirPrint-',​ adminurl=False): +
-        self.host ​host +
-        self.user ​user +
-        self.port ​port +
-        self.verbose = verbose +
-        self.directory = directory +
-        self.prefix = prefix +
-        self.adminurl = adminurl +
-         +
-        if self.user:​ +
-            cups.setUser(self.user) +
-     +
-    def generate(self):​ +
-        if not self.host:​ +
-            conn = cups.Connection() +
-        else: +
-            if not self.port:​ +
-                self.port = 631 +
-            conn = cups.Connection(self.host,​ self.port) +
-             +
-        printers = conn.getPrinters() +
-         +
-        for p, v in printers.items():​ +
-            if v['​printer-is-shared'​]:​ +
-                attrs = conn.getPrinterAttributes(p) +
-                uri = urlparse.urlparse(v['​printer-uri-supported'​])+
  
-                tree ElementTree() +==== MDNS ====
-                tree.parse(StringIO(XML_TEMPLATE.replace('​\n',​ ''​).replace('​\r',​ ''​).replace('​\t',​ ''​)))+
  
-                name = tree.find('name'​) +Maintenant, chaque ordinateur qui a avahi-daemon ​(ou mdnsresponder) installé s'identifiera lui-même sur le réseau comme « hostname.local » par exemple, mon ordinateur « flute », s'identifie lui-même comme « flute.local ».
-                name.text = '​AirPrint %@ %%h' ​% (p)+
  
-                service = tree.find('​service'​)+<note importante>​Si ceci ne fonctionne pas, [[:​tutoriel:​comment_supprimer_un_paquet|désinstallez le paquet]] **libdns22** ​([[https://​bugs.launchpad.net/​ubuntu/​+source/​bind9/​+bug/​147731|bug #147731]]).</​note>​
  
-                port = service.find('​port'​) +Dès lorsn'importe quel ordinateur peut utiliser « //​hostname//​.local » à la place d'une adresse IPPar exemple vous pouvez faire 
-                port_no = None +<​code>​ping flute.local</​code>​ 
-                if hasattr(uri, 'port'): +ou 
-                  port_no = uri.port +<​code>​ssh flute.local</​code>​
-                if not port_no: +
-                    port_no = self.port +
-                if not port_no: +
-                    ​port_no = cups.getPort() +
-                port.text = '​%d'​ % port_no+
  
-                if hasattr(uri,​ '​path'​):​ +=== Configuration du pare-feu ​===
-                  rp uri.path +
-                else: +
-                  rp uri[2] +
-                 +
-                re_match ​re.match(r'​^//​(.*):​(\d+)(/​.*)',​ rp) +
-                if re_match: +
-                  rp re_match.group(3) +
-                 +
-                #Remove leading slashes from path +
-                #TODO XXX FIXME I'm worried this will match broken urlparse +
-                #results as well (for instance if they don't include a port) +
-                #the xml would be malform'​d either way +
-                rp = re.sub(r'​^/​+',​ '',​ rp) +
-                 +
-                path = Element('​txt-record'​) +
-                path.text ​'rp=%s' % (rp) +
-                service.append(path)+
  
-                desc = Element('​txt-record'​) +Si vous utilisez un [[:pare-feu]] et que vous avez des problèmes comme celui-ci
-                desc.text = '​note=%s'​ % (v['​printer-info']+
-                service.append(desc)+
  
-                product = Element('​txt-record'​) +<​code>​ 
-                ​product.text = '​product=(GPL Ghostscript)'​ +sam@titania:​~$ ping flute.local 
-                ​service.append(product)+ping: unknown host flute.local 
 +</​code>​
  
-                state = Element('​txt-record'​) +alors il est probable que votre pare-feu bloque les communications de ZeroConf.\\ 
-                ​state.text = '​printer-state=%s'​ % (v['​printer-state'​]) +Si lorsque vous arrêtez votre pare-feu ZeroConf fonctionne, alors cela vient sûrement du pare-feu.
-                service.append(state)+
  
-                ptype = Element('​txt-record'​) +Si vous utilisez le pare-feu guarddog((http://​www.simonzone.com/​software/​guarddog/​)), vous aurez besoin de créer une nouvelle zone pour le trafic multicast et d'​ajouter une entrée au fichier networkprotocoldb.xml.
-                ptype.text = '​printer-type=%s'​ % (hex(v['​printer-type'​])) +
-                service.append(ptype)+
  
-                pdl = Element('​txt-record'+Appeler cette nouvelle zone « multicast » et positionner les adresses de la zone ainsi 224.0.0.0/​255.0.0.0. Ajouter le code XML ci-dessous dans « /​usr/​share/​apps/​guarddog/​networkprotocoldb.xml », juste au-dessus de l'endroit où il est écrit « ''<​protocol name="​domain">''​ ». Relancer Guarddog et cocher les cases qui permettent le trafic mDns entre vos zones.
-                fmts [] +
-                defer = []+
  
-                for a in attrs['​document-format-supported'​]:​ +<file XML> 
-                    if a in DOCUMENT_TYPES:​ +<​protocol name="​mDns">​ 
-                        if DOCUMENT_TYPES[a]:​ +  <!-- Protocol information guessed by Greg N <​emailgregn@googlemail.com>​ --> 
-                            ​fmts.append(a) +  <​longname>​mDns,​Bonjour,​Avahi,​ZeroConf</​longname>​ 
-                    else: +  <​longname lang="​nl">​mDns</​longname>​ 
-                        defer.append(a)+  <​longname lang="​fr">​mDns</​longname>​ 
 +  <​longname lang="​it">​mDns</​longname>​ 
 +  <​longname lang="​es">​mDns</​longname>​ 
 +  <​description>​Protocols to allow networks to configure themselvesIt is called Bonjour ​(formerly Rendezvousby Apple, and used extensively on Mac OS X. </​description>​ 
 +  
 +  <​classification class="​net"/>​ 
 +  <​network>​ 
 +    <udp source="​server"​ dest="​client">​ 
 +      <​source><​port portnum="​nonprivileged"/></​source>​ 
 +      <​dest><​port portnum="​5353"/></​dest>​ 
 +    </​udp>​ 
 +    <udp source="​client"​ dest="​server">​ 
 +      <​source><​port portnum="​5353"/></​source>​ 
 +      <​dest><​port portnum="​nonprivileged"/></​dest>​ 
 +    </​udp>​ 
 +  </​network>​ 
 +  <​security threat="​medium"​ falsepos="​low"/>​ 
 +</​protocol>​ 
 +</​file>​
  
-                fmts ','​.join(fmts+defer)+===== Découvrir les services =====
  
-                dropped = []+Utilisez l'​application //​avahi-discover//,​ ou l'​applet //[[apt>​service-discovery-applet]]// pour l'​environnement gnome. 
 +service intelligent et restructuration des données implémentées page 3 via pointeurs sur structure de BITMAP html DNS et prototype TCP. 
 +Have fun!
  
-                # TODO XXX FIXME all fields should be checked for 255 limit +=====Problèmes connus =====
-                while len('​pdl=%s' % (fmts)) >255: +
-                    (fmts, drop) fmts.rsplit(',',​ 1) +
-                    dropped.append(drop)+
  
-                if len(dropped) and self.verbose: +==== hostname-2.local ====
-                    sys.stderr.write('​%s Losing support for: %s%s' % (p, ','​.join(dropped),​ os.linesep))+
  
-                pdl.text = 'pdl=%s'​ % (fmts) +Parfois Avahi n'identifie pas correctement certaines machines et leurs ajoute un "​-2",​ cela nous donne donc "​hostname-2.local"​.\\ 
-                ​service.append(pdl)+Pour retrouver un hostname correct sous la forme "​hostname.local",​ nous devons effectuer ces quelques manipulations :\\
  
-                if self.adminurl+Pour commencer, on va renommer correctement le hostname du PC :\\ 
-                    admin = Element('​txt-record'​) +<​code>​sudo hostname HOSTNAME_CORRECT_DU_PC</​code>​ 
-                    ​admin.text = '​adminurl=%s'​ % (v['​printer-uri-supported'​]) +Puis on redémarre le daemon :\\ 
-                    service.append(admin) +<​code>​sudo ​service ​avahi-daemon restart</​code>​ 
-                 +Et pour finir on s'assure que tout fonctionne correctement ​:\\ 
-                fname = '%s%s.service' ​% (self.prefix,​ p) +<​code>​ps -ef | grep -i avahi</​code>​
-                 +
-                if self.directory+
-                    fname = os.path.join(self.directory,​ fname) +
-                 +
-                f = open(fname, '​w'​)+
  
-                if etree: +===== Voir aussi =====
-                    tree.write(f,​ pretty_print=True, xml_declaration=True, encoding="​UTF-8"​) +
-                else: +
-                    xmlstr ​tostring(tree.getroot()) +
-                    doc parseString(xmlstr) +
-                    dtminidom.getDOMImplementation(''​).createDocumentType('​service-group',​ None, '​avahi-service.dtd'​) +
-                    doc.insertBefore(dt,​ doc.documentElement) +
-                    doc.writexml(f) +
-                f.close() +
-                 +
-                if self.verbose:​ +
-                    sys.stderr.write('​Created:​ %s%s' % (fname, os.linesep))+
  
-if __name__ ​== '​__main__':​ +==== Ressources externes ​==== 
-    parser ​optparse.OptionParser() + 
-    parser.add_option('​-H',​ '​--host',​ action="​store",​ type="​string",​ +  * [[http://​www.zeroconf.org/​|Site officiel]] [en] 
-        dest='​hostname',​ help='​Hostname of CUPS server (optional)',​ metavar='​HOSTNAME'​) +  * [[http://​developer.apple.com/​networking/​bonjour/​index.html|Bonjour]] [en] 
-    ​parser.add_option('​-P',​ '​--port',​ action="​store",​ type="​int",​ +  * [[http://​0pointer.de/​lennart/​projects/​nss-mdns/​|libnss-mdns]] [en] 
-        ​dest='​port',​ help='​Port number of CUPS server',​ metavar='​PORT'​) +  * [[http://​avahi.org/|Avahi mdns responder]] [en] 
-    ​parser.add_option('​-u', '--user',​ action="​store",​ type="​string",​ +  * [[http://​www.porchdogsoft.com/​products/​howl/​|Howl mdns responder]] [en] 
-        ​dest='​username',​ help='​Username to authenticate with against CUPS',​ + 
-        metavar='​USER'​) +==== Pages en rapport ​==== 
-    parser.add_option('​-d',​ '​--directory',​ action="​store",​ type="​string",​ + 
-        ​dest='​directory',​ help='​Directory to create service files',​ +{{topic>​zeroconf}} 
-        metavar='​DIRECTORY'​) + 
-    parser.add_option('​-v',​ '​--verbose',​ action="​store_true",​ dest="​verbose",​ +---- 
-        ​help="​Print debugging information to STDERR"​) + 
-    ​parser.add_option('​-p',​ '​--prefix',​ action="​store",​ type="​string",​ +//Traduit du [[https://help.ubuntu.com/​community/​HowToZeroconf|wiki anglophone]].\\ 
-        dest='​prefix',​ help='​Prefix all files with this string',​ metavar='​PREFIX',​ +Contributeurs ​[[:​contributeurs|les contributeurs du wiki]][[:​utilisateurs:​sbrunner]]Xorioskanor[[:​utilisateurs:​Id2ndR]][[:​utilisateurs:​Ner0lph]].//
-        default='​AirPrint-'​) +
-    parser.add_option('​-a',​ '​--admin',​ action="​store_true",​ dest="​adminurl",​ +
-        ​help="​Include the printer specified uri as the adminurl"​) +
-     +
-    ​(options,​ args) = parser.parse_args() +
-     +
-    # TODO XXX FIXME -- if cups login required, need to add +
-    # air=username,​password +
-    from getpass import getpass +
-    cups.setPasswordCB(getpass) +
-     +
-    if options.directory: +
-        if not os.path.exists(options.directory): +
-            os.mkdir(options.directory) +
-     +
-    apg = AirPrintGenerate( +
-        user=options.username, +
-        host=options.hostname, +
-        port=options.port, +
-        verbose=options.verbose, +
-        directory=options.directory, +
-        prefix=options.prefix,​ +
-        adminurl=options.adminurl,​ +
-    ) +
-     +
-    apg.generate()+
  • zeroconf.1310226690.txt.gz
  • Dernière modification: Le 15/12/2011, 15:22
  • (modification externe)