1#!/usr/bin/env python
2"""
3This script using NSNetServiceBrowser to look for local HTTP servers.
4"""
5
6import objc
7from Foundation import *
8
9class PrintingResolverDelegate(NSObject):
10    def netServiceDidResolveAddress_(self, service):
11        addresses = service.addresses()
12        if len(addresses) == 0:
13            return
14        print "%s.%s" % (service.name(), service.domain())
15        for address in service.addresses():
16            print "   %s"%(address,)
17        print ""
18
19    def netService_didNotResolve_(self, service, didNotResolve):
20        print "didNotResolve",didNotResolve
21
22class PrintingBrowserDelegate(NSObject):
23    def startLookup(self):
24        for aNetService in self.services:
25            prd = PrintingResolverDelegate.new()
26            aNetService.setDelegate_(prd)
27            aNetService.resolve()
28
29    def netServiceBrowserWillSearch_(self, browser):
30        print "Browsing for advertised services..."
31        self.services = []
32
33    def netServiceBrowserDidStopSearch_(self, browser):
34        print "Browse complete"
35        self.startLookup()
36
37    def netServiceBrowser_didNotSearch_(self, browser, errorDict):
38        print "Could not search."
39
40    def netServiceBrowser_didFindService_moreComing_(self, browser, aNetService, moreComing):
41        print "Found a service: %s %s"%(aNetService.name(), aNetService.domain())
42        self.services.append(aNetService)
43        if not moreComing:
44            browser.stop()
45
46    def netServiceBrowser_didRemoveService_moreComing_(self, browser, aNetService, moreComing):
47        print "Service removed: %s"%(aNetService.name(),)
48        if not moreComing:
49            browser.stop()
50
51def findDomains(serviceName, seconds=5.0):
52    runloop = NSRunLoop.currentRunLoop()
53    browser = NSNetServiceBrowser.new()
54    pbd = PrintingBrowserDelegate.new()
55    browser.setDelegate_(pbd)
56    browser.searchForServicesOfType_inDomain_(serviceName, "")
57    untilWhen = NSDate.dateWithTimeIntervalSinceNow_(seconds)
58    runloop.runUntilDate_(untilWhen)
59
60if __name__ == '__main__':
61    # Use '_afpovertcp' instead of '_http' to look for fileservers.
62    findDomains("_afpovertcp._tcp")
63