Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 10, 2015 13:44:00

Djam36
Зарегистрирован: 2014-01-21
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь по файлам

Привет всем, python изучаю день 2-3 купил книгу по 3 питону, а на работе нужен 2.6
Вопрос таков, есть файл со строками, их от 35- до 40
SERVER HEALTH : Component:ServerRuntime,State:HEALTH_OK,MBean: выглядят вот так
Где HEALTH_OK может быть warning-critical
Задача, сделать скрипт который будет выводить статус данных нод в файл и проверять колво в ОК - Варнинг - и Критикал, посчитать кол-во я смог, а вот как выдернуть строк, например если будет Варнинг то мне нужно будет выдернуть строку с варнинг и отправить по емаил, как отправку по емаил организовать знаю, а как выдернут ьстроку из файла, с Варнинг и с Критикал не знаю скрипт пока выглядит так, сильно не ругайтесь, толкьо учу питон моогут быть проблемы со синтаксисом.
Кстати это скорее всего jython (получается) т.к используется WLST Weblogic

#!/usr/bin/python
import sys
connect('username','password','t3://server');
domainRuntime()
cd('ServerRuntimes')
servers = domainRuntimeService.getServerRuntimes();
for server in servers:
   sys.stdout  = open('testpython.txt', 'a')
   print ' SERVER HEALTH :', server.getHealthState()
col = 0
Search = 'OK'
for Search  in open('testpython.txt','r').readlines():
     if Search == Search:
         col += 1
         continue
print 'Node status OK', col
disconnect();
exit();

Офлайн

#2 Фев. 10, 2015 14:55:37

Djam36
Зарегистрирован: 2014-01-21
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь по файлам

Разобрался спасибо, можете подсказать если есть лучший вариант чем у меня

CountNodeOK = 0
CountnodeWarning = 0
nodeOK = ''
nodeWarning = ''
CountCritical = 0
nodeCritical = ''
for x in open('testpython.txt', 'r').readlines():
    if x.find('OK') > 0:
        CountNodeOK += 1
        nodeOK = nodeOK + x + "; "
    if x.find('Warning') > 0:
        CountnodeWarning += 1
        nodeWarning  = nodeWarning  + x + "; "
    if x.find('Critical') > 0:
        CountCritical += 1
        nodeCritical = nodeCritical + x + "; "

Офлайн

#3 Фев. 10, 2015 15:40:36

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Помощь по файлам

Тут скорее вопрос привычек, я бы написал как-то так:

counters = {'OK': 0, 'Warning': 0, 'Critical': 0}
nodes = {x: [] for x in counters}
for s in open('testpython.txt'):
    for key in counters:
        if key in s:
            counters[key] += 1
            nodes[key].append(s)

PS: Опять же смотря что дальше делать с данными предполагается, на больших файлах я бы не стал строки собирать, а постарался бы по месту обработать/вывести



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Фев. 10, 2015 15:44:16)

Офлайн

#4 Фев. 11, 2015 03:53:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Помощь по файлам

Это набросок, начало.

def f():
    sh = StrHandler()
    strs = sh.load_from_server(
        't3://server',
        'username',
        'password'
    )
    nok = sh.count(strs, 'OK')
    nwar = sh.count(strs, 'Warning')
    ncri = sh.count(strs, 'Critical')
    sh.print_stat('output.txt', (nok, nwar, ncri))
    for i in sh.filter(strs, 'Warning'):
        sh.send('x@x.com', i)
 
class StrHandler:
    
    def load_from_server(self, server, user, password):
        print('See 1', server, user, password)
        return ['a']
    
    def count(self, seq,  s):
        print('See 2', seq, s)
        return 0
    
    def filter(self, seq, s):
        print('See 3', seq, s)
        return ['a']
    
    def print_stat(self, fname, stat):
        print('See 4', fname, stat)
    
    def send(self, addr, s):
        print('See 5', addr, s)
 
f()

Это то, как он работает.
>>> def f():
...     sh = StrHandler()
...     strs = sh.load_from_server(
...         't3://server',
...         'username',
...         'password'
...     )
...     nok = sh.count(strs, 'OK')
...     nwar = sh.count(strs, 'Warning')
...     ncri = sh.count(strs, 'Critical')
...     sh.print_stat('output.txt', (nok, nwar, ncri))
...     for i in sh.filter(strs, 'Warning'):
...         sh.send('x@x.com', i)
... 
>>> class StrHandler:
...     
...     def load_from_server(self, server, user, password):
...         print('See 1', server, user, password)
...         return ['a']
...     
...     def count(self, seq,  s):
...         print('See 2', seq, s)
...         return 0
...     
...     def filter(self, seq, s):
...         print('See 3', seq, s)
...         return ['a']
...     
...     def print_stat(self, fname, stat):
...         print('See 4', fname, stat)
...     
...     def send(self, addr, s):
...         print('See 5', addr, s)
... 
>>> f()
See 1 t3://server username password
See 2 ['a'] OK
See 2 ['a'] Warning
See 2 ['a'] Critical
See 4 output.txt (0, 0, 0)
See 3 ['a'] Warning
See 5 x@x.com a
>>>

Пишешь сверху вниз: сначала функцию f() полностью, затем то, что для неё нужно - класс StrHandler, затем то же самое делаешь с его методами.



Отредактировано py.user.next (Фев. 11, 2015 04:02:30)

Офлайн

#5 Фев. 11, 2015 11:29:33

Djam36
Зарегистрирован: 2014-01-21
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Помощь по файлам

Всем спасибо за советы, ответы, рекомендации, буду улучшать по мере поступления знаний!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version