-
Notifications
You must be signed in to change notification settings - Fork 27
/
growl.sh
executable file
·113 lines (90 loc) · 3.19 KB
/
growl.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/bin/bash
# Работа с Growl на bash. Евгений Степанищев http://bolknote.ru/ 2012
# Growl communication in Bash. Copyright by Evgeny Stepanischev http://bolknote.ru/ 2012
APPLICATION="My Shell Script"
NOTIFYNAME="Shell Message"
MESSAGE="Hi all!"
# Получаем наш IP
function _GetMyIP {
local route=`/sbin/route -n get default 2>&-`
if [ -z "$route" ]; then
# Либо, первый попавшийся, если нет IP по-умолчанию
/sbin/ifconfig |
/usr/bin/awk '/^[\t ]*inet/ {print $2}' |
(/usr/bin/egrep -v '^(127\.|::1)' || echo 127.0.0.1) |
/usr/bin/head -n1
else
# Либо IP по-умолчанию в системе, если он назначен
echo "$route" |
/usr/bin/egrep -oi 'interface: [^ ]+' |
/usr/bin/cut -c12- |
/usr/bin/xargs /usr/sbin/ipconfig getifaddr
fi
}
# Отсылка сообщение в growl через telnet при помощи expect
# Возвращает «-OK» в случае успеха
function _GrowlSend {
local ip="$1"
local port="$2"
(
echo "spawn -noecho /usr/bin/telnet -N8EL $ip $port"
echo set timeout 1
echo expect_after timeout exit
echo 'expect "Escape" {'
while read -re; do
echo "send -- \"$REPLY\\n\""
done
echo 'send "\n"'
echo expect '"Response-Action"'
echo '}'
) |
/usr/bin/expect |
/usr/bin/awk '/^GNTP\/1.0 -(OK|ERROR)/{print $2}'
}
# Посылаем нотификацию
# параметры:
# IP на котором «слушает» Growl (если пустой, используется локальный)
# порт на котором «слушает» Growl (если пустой, используется 23053)
# текст сообщения
# пример:
# GlowSendNotify "" "" 'Привет всем!'
function GrowlSendNotify {
local ip="$1"
[ -z "$ip" ] && ip=$(_GetMyIP)
local -i port="$2"
[ $port -gt 0 ] || port=23053
local text="$3"
res=`_GrowlSend "$ip" $port <<NOTIFY
GNTP/1.0 NOTIFY NONE
Application-Name: $APPLICATION
Notification-Name: $NOTIFYNAME
Notification-Title: $text
NOTIFY`
[ "$res" == "-OK" ] && return 0 || return 1
}
# Регистрируем своё приложение
# параметры:
# IP на котором «слушает» Growl (если пустой, используется локальный)
# порт на котором «слушает» Growl (если пустой, используется 23053)
# пример:
# GlowSendRegister
function GrowlSendRegister {
local ip="$1"
[ -z "$ip" ] && ip=$(_GetMyIP)
local -i port="$2"
[ $port -gt 0 ] || port=23053
local text="$3"
res=`_GrowlSend "$ip" $port <<REGISTER
GNTP/1.0 REGISTER NONE
Application-Name: $APPLICATION
Notifications-Count: 1
Notification-Enabled: True
Notification-Name: $NOTIFYNAME
REGISTER`
[ "$res" == "-OK" ] && return 0 || return 1
}
# Пробуем отослать сообщение
cmd='GrowlSendNotify "" "" "'"$MESSAGE"'"'
eval $cmd || (
GrowlSendRegister && eval $cmd
)