Добрый день, коллеги..Изучаю Python и возникли непонятки..Дело вот в чём...
Имеется в linux команда на астере:asterisk -rx 'sip show peers', которая выдаёт следующую простыню:отрывок
TEnnANT8806_IPPBX/core_88 D N A 5080 OK (13 ms)
TEnnANT8807_IPPBX/core_88 D N A 5080 OK (15 ms)
TEnnANT8808_IPPBX/core_88 D A 5080 OK (9 ms)
TEnnANT8809_IPPBX/core_88 D A 5080 OK (10 ms)
TEnnANT8810_IPPBX/core_88 D N A 5060 OK (6 ms)
TEnnANT8811_IPPBX/core_88 D N A 5060 OK (6 ms)
TEnnANT8812_IPPBX/core_88 D N A 5060 OK (6 ms)
TEnnANT8813_IPPBX/core_88 D A 35060 Unmonitored
TEnnANT8814_IPPBX/core_88 D A 35060 Unmonitored
TEnnANT8815_IPPBX/core_88 D A 35060 Unmonitored
TEnnANT8816_IPPBX/core_88 D A 0 Unmonitored
TEnnANT8817_IPPBX/core_88 D A 35060 Unmonitored
TEnnANT8818_IPPBX/core_88 D A 35060 Unmonitored
TEnnANT8819_IPPBX/core_88 D A 35060 Unmonitored
TEnnANT8820_IPPBX/core_88 D A 0 Unmonitored
TEnnANT8821_IPPBX/core_88 D N A 10020 OK (49 ms)
TEnnANT8822_IPPBX/core_88 D N A 10020 OK (51 ms)
TEnnANT9901_IPPBX/core_99 D N A 5060 OK (16 ms)
TEnnANT9902_IPPBX/core_99 D N A 5060 OK (16 ms)
TEnnANT9903_IPPBX/core_99 D N A 5060 OK (15 ms)
TEnnANT9904_IPPBX/core_99 D N A 5060 OK (15 ms)
TEnnANT9905_IPPBX/core_99 D N A 5060 OK (16 ms)
TEnnANT9906_IPPBX/core_99 D N A 5060 OK (15 ms)
TEnnANT9907_IPPBX/core_99 D N A 5060 OK (16 ms)
TEnnANT9908_IPPBX/core_99 D N A 5060 OK (15 ms)задача такова , что надо чекать значение в последнем столбце и смотреть значение выше 60 ms.. команду asterisk -rx 'sip show peers' повторять 3 раза, и если определённое значение на протяжении 3 попыток будет больше 60 ms, то выдавать его в почту...
Набросал некоторые части скрипта:
#!/usr/bin/env python
import subprocess
import re
import smtplib
from email.MIMEText import MIMETextdef asterisk_check():
command = "asterisk -rx 'sip show peers' | awk '{print $1,$7,$8,$9}'"
full_output = subprocess.call('{param1}'.format(param1=command), shell=True)awk = ""
asterisk_check()
#me = '___@__'
#you = '____@____'
#text = 'Asterisk Problem\n'
#subj = 'Asterisk Problem'
#
#server = "______"
#port = 25
#msg = MIMEText(text, "", "utf-8")
#msg['Subject'] = subj
#msg['From'] = me
#msg['To'] = you
#s = smtplib.SMTP(server, port)
#s.ehlo()
#s.starttls()
#s.ehlo()
#s.sendmail(me, you, msg.as_string())
#s.quit()но вот , awk в скрипте питон это не правильно, хотелось бы использовать модуль re , но вот проблема с регулярным выражением, поэтому прошу вашей помощи... Заранее спасибо....
Задача использовать именно модуль re? Если это не самоцель, то можно было бы распарсить как-то так:#!/usr/bin/env python
from pyparsing import Word, alphas, nums, oneOf, Optionalfirst = Word( alphas ) + Word( nums ) + "_" + Word( alphas ) + "/" + Word( alphas ) + "_" + Word( nums )
second = "D"
third = "N"
forth = Word( alphas )
fifth = Word( nums )
sixth = Word( alphas )
seventh = "(" + Word( nums ) + Word( alphas ) + ")"
asterisk = "TEnnANT9906_IPPBX/core_99 D N A 5060 OK (15 ms)"
asterisk2 = "TEnnANT8819_IPPBX/core_88 D A 35060 Unmonitored"
grammar = first + second + Optional(third) + forth + fifth + sixth + Optional(seventh)
parsed = grammar.parseString( asterisk )
parsed2 = grammar.parseString( asterisk2 )
print parsed.asList()
print parsed2.asList()
print parsed[14]
try:
print parsed2[14]
except IndexError:
pass$ ./4.py
['TEnnANT', '9906', '_', 'IPPBX', '/', 'core', '_', '99', 'D', 'N', 'A', '5060', 'OK', '(', '15', 'ms', ')']
['TEnnANT', '8819', '_', 'IPPBX', '/', 'core', '_', '88', 'D', 'A', '35060', 'Unmonitored']
15
>[оверквотинг удален]
> print parsed[14]
> try:
> print parsed2[14]
> except IndexError:
> pass
> $ ./4.py
> ['TEnnANT', '9906', '_', 'IPPBX', '/', 'core', '_', '99', 'D', 'N', 'A', '5060',
> 'OK', '(', '15', 'ms', ')']
> ['TEnnANT', '8819', '_', 'IPPBX', '/', 'core', '_', '88', 'D', 'A', '35060', 'Unmonitored']
> 15Спасибо за помощь, но при выполнении вашего парсинга выдаётся следующая ошибка такого вида:
Traceback (most recent call last):
File "./asterisk_check.py", line 16, in <module>
parsed = grammar.parseString( asterisk )
File "/usr/lib/python2.7/dist-packages/pyparsing.py", line 1076, in parseString
raise exc
pyparsing.ParseException: Expected "D" (at char 25), (line:1, col:26)С чем может быть связана проблема не подскажете?? Спасибо за помощь
> С чем может быть связана проблема не подскажете?? Спасибо за помощьЭто не был production ready пример, просто мысль в определенном направлении. :-)
Судя по ошибке во второй колонке кроме "D" может быть что-то еще. Как вариант - ничего. Пытался вчера найти описание, что вообще выдает команда asterisk -rx 'sip show peers', но сходу не нашел. Ориентировался на пару строк из вашего примера. А если дейтвительно делать, то логично иметь хорошее представление о предполагаемом выводе. Думаю, это верно и в случае, если вы будете разбирать вывод регулярными выражениями.
С другой стороны, если вас awk устраивает, то не overkill ли для вас регулярки? Может, тогда так:
with open ('/home/user/sip_show_peers.txt', 'r') as aster_out:
for i in aster_out:
col = i.split()
print col[0], col[6:8]
Если нужно кол-во милисекунд, то:
with open ('/home/maccalan/sip_show_peers.txt', 'r') as aster_out:
for i in aster_out:
m = re.search('(\d+) ms', i)
if m:
print m.group(1)
> Если нужно кол-во милисекунд, то:
> with open ('/home/maccalan/sip_show_peers.txt', 'r') as aster_out:
> for i in aster_out:
> m = re.search('(\d+) ms',
> i)
> if m:
>
> print m.group(1)я полагаю что все таки по мимо миллисекунд надо знать, а на каком пире вышла столь значительная задержка, поэтому просто миллисекунды находить бесполезно. поэтому строку все таки придется разбирать целиком. я предлагаю два этапа, чтобы потом не запутаться в регулярке.
import re
def work_parse(l):
name_symb='[a-zA-Z0-9_]'
pattern = '^(' + name_symb + '+)/(' + name_symb + '+)\s+(D\s+N\s+A|D\s+A)\s+(\d+)\s+(.+)'
result=re.match(pattern,l)
if result:
print("find for %s: %s")%(result.group(1), result.group(5)),
small_patt='OK\s+\((\d+)'
small_res=re.match(small_patt,result.group(5))
if small_res:
print " %s(sec)"%small_res.group(1)
else:
print " Unmonitored"
else:
print("parse asterisk string error")
if __name__=='__main__':
import timeit
f=open('asterisk_peers', 'r')
l=f.readline()
while l:
#print l
work_parse(l)
l=f.readline()
f.close()
>[оверквотинг удален]
> print("parse asterisk string error")
> if __name__=='__main__':
> import timeit
> f=open('asterisk_peers', 'r')
> l=f.readline()
> while l:
> #print l
> work_parse(l)
> l=f.readline()
> f.close()Вы правы, необходимо знать на каком пире такая задержка, интересный ход мысли в вашем скрипте, только что за файл f=open('asterisk_peers', 'r') ..
я пробовал через регулярки таким образом:
>>> import re
>>> asterisk = "TEnnANT9906_IPPBX/core_99 D N A 5060 OK (15 ms)"
>>> search_regex = re.compile( ur"\((\d+) ms\)", re.M | re.S | re.U )
>>> match = search_regex.search(asterisk)
>>> match.groups()('15',)
но вот имеено мс мало играют роли...
А как сделать чтобы команда asterisk -rx 'sip show peers' выполнялась 3 раза, и если все эти три раза на определённом пире есть юольшая задержка(свыше 60 mc), то выдавать в почту..реализацию отправки в почту я делал таким образом:
me = '-----------------'
you = '----------------'
text = 'Asterisk Problem\n'
subj = 'Asterisk Problem'server = "------------"
port = 25
msg = MIMEText(text, "", "utf-8")
msg['Subject'] = subj
msg['From'] = me
msg['To'] = you
s = smtplib.SMTP(server, port)
s.ehlo()
s.starttls()
s.ehlo()
s.sendmail(me, you, msg.as_string())
s.quit()
> Вы правы, необходимо знать на каком пире такая задержка, интересный ход мысли
> в вашем скрипте, только что за файл f=open('asterisk_peers', 'r') ..у меня нет астериска, поэтому ваш вывод я просто скопировал в файл что бы отладить пример.
> но вот имеено мс мало играют роли...
> А как сделать чтобы команда asterisk -rx 'sip show peers' выполнялась 3
> раза, и если все эти три раза на определённом пире есть
> юольшая задержка(свыше 60 mc), то выдавать в почту..что бы эта команда выполнялась три раза - выполните ее ТРИ раза. а вот что бы сопоставить результаты выполнения команд вам нужно на первом проходе создать хеш массив, ключем в котором сделать имя пира, ну а значением 1, если превышена задержка, или 0 если задержка в норме, выполняя в последствии нужно просто добавлять по 1 в нужные элементы массива, если задержка превышена, по окончании работы проверьте хеш массив, и если найдете там что нибудь равное 3 отправляете на почту имена этих пиров.
>> С чем может быть связана проблема не подскажете?? Спасибо за помощь
> Это не был production ready пример, просто мысль в определенном направлении. :-)
> Судя по ошибке во второй колонке кроме "D" может быть что-то еще.
> Как вариант - ничего. Пытался вчера найти описание, что вообще выдает
> команда asterisk -rx 'sip show peers', но сходу не нашел. Ориентировался
> на пару строк из вашего примера. А если дейтвительно делать, то
> логично иметь хорошее представление о предполагаемом выводе. Думаю, это верно и
> в случае, если вы будете разбирать вывод регулярными выражениями.вот полный вывод команды:
#asterisk -rx 'sip show peers'
Name/username Host Dyn Forcerport ACL Port Status
TEnnANT1101_IPPBX/core_11 ip D N A 5063 OK (16 ms)
TEnnANT1102_IPPBX/core_11 ip D N A 5060 OK (9 ms)
TEnnANT1103_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1104_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1105_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1106_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1107_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1108_IPPBX/core_11 ip D N A 1092 OK (9 ms)
TEnnANT1109_IPPBX/core_11 ip D N A 1093 OK (5 ms)
TEnnANT1110_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1111_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1112_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1113_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1114_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1115_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1116_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1117_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1118_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1119_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1120_IPPBX/core_11 ip D N A 5061 OK (9 ms)
TEnnANT1121_IPPBX/core_11 ip D N A 1103 OK (12 ms)
TEnnANT1122_IPPBX/core_11 ip D N A 5062 OK (20 ms)
TEnnANT1123_IPPBX/core_11 ip D N A 1041 OK (20 ms)
TEnnANT1124_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1125_IPPBX/core_11 (Unspecified) D N A 0 Unmonitored
TEnnANT1126_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1127_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1128_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1129_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1130_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1131_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1132_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1133_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1134_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1135_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1136_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1137_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1138_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1139_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1140_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1141_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1142_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1143_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1144_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1145_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1146_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1147_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1148_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1149_IPPBX/core_11 (Unspecified) D N A 0 UNKNOWN
TEnnANT1400_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1401_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1402_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1403_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1404_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1405_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1406_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1407_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1408_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1409_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1410_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1411_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1412_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1413_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1414_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1415_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1416_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1417_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1418_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1419_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1420_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1421_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1422_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1423_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1424_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1425_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1426_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1427_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1428_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1429_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1430_IPPBX/core_14 (Unspecified) D N A 0 UNKNOWN
TEnnANT1601_IPPBX/core_16 ip D N A 5060 OK (45 ms)
TEnnANT1602_IPPBX/core_16 ip D N A 5060 OK (44 ms)
TEnnANT1603_IPPBX/core_16 ip D N A 5060 OK (44 ms)
TEnnANT1604_IPPBX/core_16 ip D N A 5060 OK (44 ms)
TEnnANT1605_IPPBX/core_16 ip D N A 5060 OK (46 ms)
TEnnANT1606_IPPBX/core_16 ip D N A 5060 OK (45 ms)
TEnnANT1607_IPPBX/core_16 ip D N A 5060 OK (92 ms)
TEnnANT1608_IPPBX/core_16 ip D N A 5060 OK (92 ms)
TEnnANT1609_IPPBX/core_16 (Unspecified) D N A 0 UNKNOWN
TEnnANT1610_IPPBX/core_16 (Unspecified) D N A 0 UNKNOWN
TEnnANT1800_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1801_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1802_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1803_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1804_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1805_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1806_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1807_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1808_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1809_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1810_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1811_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1812_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1813_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1814_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT1815_IPPBX/core_18 (Unspecified) D N A 0 UNKNOWN
TEnnANT2001_IPPBX/core_20 ip D N A 5060 OK (22 ms)
TEnnANT2002_IPPBX/core_20 ip D N A 5060 OK (20 ms)
TEnnANT2003_IPPBX/core_20 ip D N A 5060 OK (21 ms)
TEnnANT2004_IPPBX/core_20 ip D N A 5060 OK (21 ms)
TEnnANT2005_IPPBX/core_20 ip D N A 5060 OK (23 ms)
TEnnANT2006_IPPBX/core_20 ip D N A 5060 OK (20 ms)
TEnnANT2007_IPPBX/core_20 ip D N A 5060 OK (22 ms)
TEnnANT2008_IPPBX/core_20 ip D N A 5060 OK (54 ms)
TEnnANT2009_IPPBX/core_20 (Unspecified) D N A 0 UNKNOWN
> вот полный вывод команды:
> #asterisk -rx 'sip show peers'Александр, судя по всему у вас нет проблем с питоном? поменяйте чуть мою регулярку, и будет вам счастье.
можно так:
pattern = '^(' + name_symb + '+)/(' + name_symb + '+)+\s+\S+\s+(D\s+N\s+A|D\s+A)\s+(\d+)\s+(.+)'
можно так:ip_symb='[a-zA-Z0-9_()]'
pattern = '^(' + name_symb + '+)/(' + name_symb + '+)+\s+' + ip_symb + '+\s+(D\s+N\s+A|D\s+A)\s+(\d+)\s+(.+)'
>> вот полный вывод команды:
>> #asterisk -rx 'sip show peers'
> Александр, судя по всему у вас нет проблем с питоном? поменяйте чуть
> мою регулярку, и будет вам счастье.
> можно так:
> pattern = '^(' + name_symb + '+)/(' + name_symb + '+)+\s+\S+\s+(D\s+N\s+A|D\s+A)\s+(\d+)\s+(.+)'
> можно так:
> ip_symb='[a-zA-Z0-9_()]'
> pattern = '^(' + name_symb + '+)/(' + name_symb + '+)+\s+' +
> ip_symb + '+\s+(D\s+N\s+A|D\s+A)\s+(\d+)\s+(.+)'Спасибо за помощь,попробую,отпишусь..
ИМХО
неправильная постановка задачи всегда ведёт к неправильному/неоптимальному её решениюgoogle asterisk+snmp
google python+snmp