Growl уведомления для Mac пользователей
Чтобы разрешить Growl принимать сетевые уведомления необходимо:
- Зайти в настройки Growl (Системные настройки -> Growl)
- Во вкладке Сеть установить галочки "Слушать входящие события" и "Разрешить регистрацию приложений по сети" (пароль вводить не обязательно)
На маршрутизаторе установить python (ipkg install python).
Далее сам скрипт nano ~/growl.py
Code:
#!/opt/bin/python
"""Python Growl Notifications"""
__version__ = "0.1"
__author__ = "Maxim S. (http://spirituser.com)"
__copyright__ = "BSD License."
__contributors__ = "Ingmar J Stein (Growl Team), John Morrissey (hashlib patch), Rui Carmo (http://the.taoofmac.com)"
import sys
noc = len(sys.argv)
if noc < 4:
print '''Usage: ip[:port] title description [priority] [sticky] [password]
\nDefault port: 9887 (UDP only)\nPriority: -2...2 (default: 0)\nSticky: 0 or 1 (default: 0)'''
sys.exit(0)
if sys.argv[1].find(":") != -1:
splitip = sys.argv[1].split(":")
realip = splitip[0]
GROWL_UDP_PORT = splitip[1]
else:
realip = sys.argv[1]
GROWL_UDP_PORT = 9887
try:
import hashlib
md5_constructor = hashlib.md5
except ImportError:
import md5
md5_constructor = md5.new
import struct
from socket import AF_INET, SOCK_DGRAM, socket
GROWL_PROTOCOL_VERSION=1
GROWL_TYPE_REGISTRATION=0
GROWL_TYPE_NOTIFICATION=1
class GrowlNotificationPacket:
def __init__(self, application="growlnotify",
notification="Command-Line Growl Notification", title="Router",
description="Notification", priority = 0, sticky = False, password = None ):
self.application = application.encode("utf-8")
self.notification = notification.encode("utf-8")
self.title = title.encode("utf-8")
self.description = description.encode("utf-8")
flags = (priority & 0x07) * 2
if priority < 0:
flags |= 0x08
if sticky:
flags = flags | 0x0100
self.data = struct.pack( "!BBHHHHH",
GROWL_PROTOCOL_VERSION,
GROWL_TYPE_NOTIFICATION,
flags,
len(self.notification),
len(self.title),
len(self.description),
len(self.application) )
self.data += self.notification
self.data += self.title
self.data += self.description
self.data += self.application
self.checksum = md5_constructor()
self.checksum.update(self.data)
if password:
self.checksum.update(password)
self.data += self.checksum.digest()
# end def
def payload(self):
return self.data
# end def
# end class
def stickyok(s):
return s.lower() in ["yes", "true", "1"]
if __name__ == '__main__':
addr = (realip, GROWL_UDP_PORT)
s = socket(AF_INET,SOCK_DGRAM)
if noc == 5:
p = GrowlNotificationPacket(title=sys.argv[2],
description=sys.argv[3],
priority=int(sys.argv[4]))
elif noc == 6:
p = GrowlNotificationPacket(title=sys.argv[2],
description=sys.argv[3],
priority=int(sys.argv[4]),
sticky=stickyok(sys.argv[5]))
elif noc == 7:
p = GrowlNotificationPacket(title=sys.argv[2],
description=sys.argv[3],
priority=int(sys.argv[4]),
sticky=stickyok(sys.argv[5]),
password=sys.argv[6])
else:
p = GrowlNotificationPacket(title=sys.argv[2],
description=sys.argv[3])
s.sendto(p.payload(), addr)
s.close()
*Python до этого не изучал, буду рад замечаниям
Использование
- Открываем nano /usr/local/sbin/post-mount
- Добавляем /usr/local/root/growl.py 192.168.1.102 Router "Successfully booted"
- Открываем /usr/local/sbin/pre-shutdown
- Добавляем /usr/local/root/growl.py 192.168.1.102 Router "Shutdown..."
Опции
IP[:Port] Заголовок Описание [Приоритет] [Прикреплен] [Пароль]
По умолчанию порт: 9887 (UDP)
Приоритет: -2...2 (по умолчанию: 0)
Прикреплен: 0 (Да) или 1 (Нет) (по умолчанию: 0)