Example #1
0
def register(name, port, stype='', rentry='' , host=''):
	'''
	'''

	rdata = ""
	if type(rentry) == dict:
		rdata = create_rentry_from_dict(rentry)
	else:
		rdata = rentry

	service_ref = bonjour.AllocateDNSServiceRef()

	if type == '':
		stype = SERVICE_TYPE

	retval = bonjour.pyDNSServiceRegister(service_ref, 0, 0,
						name, stype, SERVICE_DOMAIN,
						host, socket.htons(port),
						len(rdata), rdata, _register_callback,
						None)

	if retval != bonjour.kDNSServiceErr_NoError:
		message = "Error registering service %s (%d)" % (name, retval)
		raise RegisterError(message, reference=service_ref, errorval=retval)

	fd = bonjour.DNSServiceRefSockFD(service_ref)
	source = gobject.io_add_watch(fd, gobject.IO_IN, _fd_callback, service_ref)
	_add_ref(service_ref, source)
Example #2
0
    def startAdvertising(self):
        """Advertise the service with Bonjour.
        
        This method returns a deferred.  Upon success, the result
        is a dictionary of information about the service.  Upon failure,
        the result is a Failure object that knows the BonjourError code.
        """

        # Allocate a Bonjour Service Reference
        self.sdRef = bonjour.AllocateDNSServiceRef()

        # Initiate Registration of the service
        ret = bonjour.pyDNSServiceRegister(self.sdRef, self.flags,
                                           self.interfaceIndex, self.name,
                                           self.regtype, self.domain,
                                           self.host, self.port, self.txtLen,
                                           self.txtRecord, self.callback,
                                           self.context)

        # Error check for immediate failure
        if ret != bonjour.kDNSServiceErr_NoError:
            raise BonjourRegistrationError(ret)

        # Get the file descriptor and integrate with twisted
        self.fd = bonjour.DNSServiceRefSockFD(self.sdRef)
        self.bonjourDesc = BonjourDescriptor(self.fd, self.sdRef)
        self.reactor.addReader(self.bonjourDesc)

        return None
        def __init__(self, serviceName, regtype, url, port=9999):

            if port == 0:
                raise PublisherError(
                    'Service registered with invalid port %d' % (port, ))

            self.serviceRef = None
            self.registerFlag = threading.Event()

            # Create a text record
            txtRecordTxt = 'url=' + url
            txtRecord = chr(len(txtRecordTxt)) + txtRecordTxt
            txtRecordLen = len(txtRecord)

            # Allocate a service discovery reference and register the specified service
            self.serviceRef = bonjour.AllocateDNSServiceRef()
            ret = bonjour.pyDNSServiceRegister(self.serviceRef, 0, 0,
                                               serviceName, regtype, 'local.',
                                               None, port, txtRecordLen,
                                               txtRecord,
                                               self.__RegisterCallback, None)

            if ret != bonjour.kDNSServiceErr_NoError:
                raise PublisherError(ret)

            # Get the socket and loop
            fd = bonjour.DNSServiceRefSockFD(self.serviceRef)
            ret = select.select([fd], [], [])
            if ret[0]:
                ret = bonjour.DNSServiceProcessResult(self.serviceRef)
Example #4
0
    def publish(self,name):
        txtRecordLength = 1
        txtRecord = ""
        interfaceIndex = 0
        flags = 0
        self.__servicename = name

        tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcpSock.bind(("0.0.0.0",0))
        (addr,self.__port)=tcpSock.getsockname()
        #print "Addr: %s Port: %d" % (addr, self.port)


        #sys.stderr.write("Register service: %s\n" % (name,))
        try:
            ret = bonjour.pyDNSServiceRegister(self.__serviceRef,
                                      flags,
                                      interfaceIndex,
                                      name,
                                      self.regtype,
                                      None,
                                      None,
                                      socket.htons(self.__port),
                                      txtRecordLength,
                                      txtRecord,
                                      self.__RegisterCallback,
                                      self)
        except Exception, err:
            print err
            sys.exit(1)
        def __init__(self,serviceName,regtype,url,port=9999):
        
            if port == 0:
                raise PublisherError('Service registered with invalid port %d' % (port,))

            self.serviceRef = None
            self.registerFlag = threading.Event()

            # Create a text record
            txtRecordTxt = 'url=' + url
            txtRecord = chr(len(txtRecordTxt)) + txtRecordTxt
            txtRecordLen = len(txtRecord)

            # Allocate a service discovery reference and register the specified service
            self.serviceRef = bonjour.AllocateDNSServiceRef()
            ret = bonjour.pyDNSServiceRegister(self.serviceRef, 
                                          0,                  
                                          0,                  
                                          serviceName,        
                                          regtype,            
                                          'local.',           
                                          None,           
                                          port,               
                                          txtRecordLen,       
                                          txtRecord,     
                                          self.__RegisterCallback,   
                                          None)

            if ret != bonjour.kDNSServiceErr_NoError:
                raise PublisherError(ret)
                
            # Get the socket and loop
            fd = bonjour.DNSServiceRefSockFD(self.serviceRef)
            ret = select.select([fd],[],[])
            if ret[0]:
                ret = bonjour.DNSServiceProcessResult(self.serviceRef)
port = int(sys.argv[3])
userdata = None
if len(sys.argv) > 4:
    userdata = sys.argv[4]

hostname = socket.gethostname()

# Allocate a service discovery reference and register the specified service
serviceRef = bonjour.AllocateDNSServiceRef()
ret = bonjour.pyDNSServiceRegister(
    serviceRef,  # DNSServiceRef           *sdRef,
    0,  # DNSServiceFlags         flags,         /* may be 0 */
    0,  # uint32_t                interfaceIndex,/* may be 0 */
    servicename,  # const char              *name,         /* may be NULL */
    regtype,  # const char              *regtype,
    'local.',  # const char              *domain,       /* may be NULL */
    hostname,  # const char              *host,         /* may be NULL */
    port,  # uint16_t                port,
    0,  # uint16_t                txtLen,
    "",  # const void              *txtRecord,    /* may be NULL */
    RegisterCallback,  # DNSServiceRegisterReply callBack,      /* may be NULL */
    userdata)

if ret != bonjour.kDNSServiceErr_NoError:
    print "error %d returned; exiting" % ret
    sys.exit(ret)

# Get the socket and loop
fd = bonjour.DNSServiceRefSockFD(serviceRef)
while 1:
    ret = select.select([fd], [], [])
Example #7
0
flags = 0
interfaceIndex = 0
servicename = "MyService"
regtype = "_test._tcp"
domain = "local."
host = socket.gethostname()
port = 23
txtRecordLength = 0
txtRecord = ""
userdata = None

sys.stderr.write("Register service: %s\n" % (servicename, ))
serviceRef = bonjour.AllocateDNSServiceRef()
ret = bonjour.pyDNSServiceRegister(serviceRef, flags, interfaceIndex,
                                   servicename, regtype, domain, host, port,
                                   txtRecordLength, txtRecord,
                                   RegisterCallback, userdata)
if ret != bonjour.kDNSServiceErr_NoError:
    print "register: ret = %d; exiting" % ret
    sys.exit(1)

# Get the socket and loop
fd = bonjour.DNSServiceRefSockFD(serviceRef)
while not waitEvent.isSet():
    ret = select.select([fd], [], [])
    ret = bonjour.DNSServiceProcessResult(serviceRef)

sys.stderr.write("\nBrowsing for service\n")
ret = bonjour.pyDNSServiceBrowse(serviceRef, 0, 0, regtype, 'local.',
                                 BrowseCallback, None)
if ret != bonjour.kDNSServiceErr_NoError: