Я пытаюсь запустить этот скрипт на коробке с Ubuntu 11.04: http://taoofmac.com/space/projects/ReGrowl
Это небольшой скрипт, связанный с UDP-портом 9887, предназначенный для ретрансляции пакетов Growl.
Я могу отправить скрипту пакеты Growl с локальной машины, и он работает точно так же, как и ожидалось.
Однако при попытке отправить пакеты с другого компьютера в моей сети они, похоже, отбрасываются или не попадают в сценарий.
Я настроил Ubuntu для разрешения порта, и вывод netstat выглядит следующим образом:
root@UbuntuVM:~# netstat -a | grep "udp"
udp 0 0 localhost:9887 *:*
udp 768 0 *:mdns *:*
udp 0 0 *:mdns *:*
udp 0 0 *:45030 *:*
udp6 0 0 [::]:44730 [::]:*
udp6 0 0 [::]:mdns [::]:*
Мой скрипт - первая запись в списке.
Я использовал wireshark и подтвердил, что машина ubuntu получает пакеты.
Нужно ли что-нибудь сделать в ubuntu, чтобы позволить python связываться с портами UDP? Кто-нибудь знает, что здесь происходит?
Заранее спасибо!
UPDATE:
Вывод скрипта должен выглядеть так:
127.0.0.1 - - [28/Sep/2011 12:30:27] REGISTER Network Responder 56 ['192.168.0.24', '192.168.0.140', '192.168.0.11', '192.168.0.25', '192.168.0.18', '192.168.0.28', '192.168.0.10', '192.168.0.30']
127.0.0.1 - - [28/Sep/2011 12:30:27] NOTIFY ('Network Status', 'Connection Status', 'Test', 'Network Responder') 80 ['192.168.0.24', '192.168.0.140', '192.168.0.11', '192.168.0.25', '192.168.0.18', '192.168.0.28', '192.168.0.10', '192.168.0.30']
Первый IP-адрес является источником пакета, а массив IP-адресов в конце - это пункты назначения для пакета, который должен быть ретранслирован. Как вы можете, этот пакет был получен с локальной машины, и если я отправлю пакет с другой машины, его IP-адрес должен появиться первым.
Вот часть скрипта, которая реализует сервер UDP:
class GrowlRelay(UDPServer):
"""Growl Notification Relay"""
allow_reuse_address = True
def __init__(self, inpassword = None, outpassword = None):
"""Initializes the relay and launches the resolver thread"""
self.inpassword = inpassword
self.outpassword = outpassword
self.resolver = RendezvousWatcher()
self.resolver.start()
UDPServer.__init__(self,('localhost', GROWL_UDP_PORT), _RequestHandler)
def server_close(self):
self.resolver.shutdown()
Полный сценарий и зависимые классы доступны и ссылка выше.