Как фильтровать мониторы F5 с помощью скрипта Python и bigsuds - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь отфильтровать список мониторов, чтобы сохранить только те, которые содержат определенную строку символов.Я получаю список с моей функцией.


import bigsuds
import re
import string

def get_monitors(obj):
    try:
        return obj.LocalLB.Monitor.get_template_list()
    except Exception, e:
        print e

try:
    b = bigsuds.BIGIP(
            hostname = "F5.serveur.com",
            username = "user",
            password = "password",
            )

except Exception, e:
    print e

monitors = get_monitors(b)

Вот пример результата:

[{'template_type': 'TTYPE_DIAMETER', 'template_name': '/Common/diameter'}, {'template_type': 'TTYPE_DNS', 'template_name': '/Common/dns'}, {'template_type': 'TTYPE_HTTP', 'template_name': '/Common/namexxxxx'}]

Мне нужно отфильтровать этот список, чтобы сохранить только элементы, содержащие «Common \ name»

Я пытаюсь для примера:

moniteur_ok = list(filter(lambda x: 'Common\name' in x, monitors))

or

moniteur_ok = re.findall(r'(?<=\s)/Common/name\S+' ,monitors)

Идеи для фильтрации в соответствии с моими потребностями?

Я мог бы затем восстановить через мой F5 некоторую информацию.

monitor_property= b.LocalLB.Monitor.get_template_string_property(["\Common\namexxxxx"],["STYPE_SEND"],["STYPE_RECEIVE"],["STYPE_TIMEOUT_PACKETS"])

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Спасибо за ответ, я взял пример с вашего ответа. Я также создал функции для получения данных с монитора. Затем я создам файл json для отображения данных с помощью Datables, например:

#!/usr/bin/python

import bigsuds
import re
import datetime
import json

# Fonction pour recuperer les strings d'un moniteur
def get_moniteur_type(obj, monitor):
    try:
        return obj.LocalLB.Monitor.get_template_type([monitor])[0]
    except Exception, e:
        print e

# Fonction pour recuperer les strings d'un moniteur
def get_stype_string(obj, monitor, stype):
    try:
        return obj.LocalLB.Monitor.get_template_string_property([monitor],[stype])[0]['value']
    except Exception, e:
        print e

# Fonction reverse sur la reponse attendue a un test applicatif, si true, on ne doit pas avoir la reponse indiquee dans la receive string
def get_reverse_mode(obj, monitor):
    try:
       return obj.LocalLB.Monitor.get_template_reverse_mode([monitor])[0]
    except Exception, e:
        print e

# Fonction pour recuperer l'intervalle et le timeout d'un moniteur
def get_itype_string(obj, monitor, itype):
    try:
        return obj.LocalLB.Monitor.get_template_integer_property([monitor],[itype])[0]['value']
    except Exception, e:
        print e

# Fonction pour recuperer le port utilise par le moniteur
def get_moniteur_port(obj, monitor):
    try:
        return obj.LocalLB.Monitor.get_template_destination([monitor])[0]['ipport']['port']
    except Exception, e:
        print e

# Information de connexion au F5
try:
    b = bigsuds.BIGIP(
            hostname = "server-f5.domaine",
            username = "user",
            password = "password",
            )

except Exception, e:
    print e

#On recupere tous les moniteurs present dans la partition Common, qui est l'emplacement des moniteurs crees par le reseau
b.Management.Partition.set_active_partition(active_partition='Common')
noms_long = b.LocalLB.Monitor.get_template_list()
#On boucle sur les noms des moniteurs en filtrant ceux crees pour dune
for nom in noms_long:
#On supprime \Common\ dans le nom long pour avoir le nom du moniteur
    moniteur = format(nom['template_name'])[8:]
#On ne va recuperer que les moniteurs qui commencent par"startname"
    if re.match(r'^startname', moniteur):

        print "{ \"moniteur\": \"",moniteur,"\", \"type\": \"",get_moniteur_type(b, moniteur),"\", \"requette_http\": \"",get_stype_string(b, moniteur, "STYPE_SEND"),"\", \"reponse_attendue\": \"",get_stype_string(b, moniteur, "STYPE_RECEIVE"),"\", \"mode_reverse\": \"",get_reverse_mode(b, moniteur),"\", \"timeout\": \"",get_itype_string(b, moniteur, "ITYPE_TIMEOUT"),"\", \"intervale\": \"",get_itype_string(b, moniteur, "ITYPE_INTERVAL"),"\", \"port\": \"",get_moniteur_port(b, moniteur),"\", \"type\": \"",get_moniteur_type(b, moniteur),"\"},"

В этом примере меня интересует восстановление после теста приложения, отправленного запроса и ожидаемого ответа или нет, но в целом у меня могут быть тесты для определенного порта или тесты UDP. Это все о наличии основных данных.

0 голосов
/ 11 апреля 2019

Было бы проще установить активный раздел ( set_active_partition метод) и получить только общие мониторы. Вот пример, который проходит через все разделы и печатает мониторы в каждом:

>>> partitions = b.Management.Partition.get_partition_list()
>>> for partition in partitions:
...     print "\t{}".format(partition['partition_name'])
...     b.Management.Partition.set_active_partition(active_partition=partition['partition_name'])
...     mons = b.LocalLB.Monitor.get_template_list()
...     for mon in mons:
...         print "\t\t{}".format(mon['template_name'])
...         
    Common
        /Common/none
        /Common/diameter
        /Common/external
        /Common/firepass
        /Common/ftp
        /Common/gateway_icmp
        /Common/http
        /Common/http_head_f5
        /Common/https
        /Common/https_443
        /Common/https_head_f5
        /Common/icmp
        /Common/imap
        /Common/inband
        /Common/ldap
        /Common/module_score
        /Common/mssql
        /Common/mysql
        /Common/nntp
        /Common/oracle
        /Common/pop3
        /Common/postgresql
        /Common/radius
        /Common/radius_accounting
        /Common/real_server
        /Common/rpc
        /Common/sasp
        /Common/scripted
        /Common/sip
        /Common/smb
        /Common/smtp
        /Common/snmp_dca
        /Common/snmp_dca_base
        /Common/soap
        /Common/tcp
        /Common/tcp_echo
        /Common/tcp_half_open
        /Common/udp
        /Common/dns
        /Common/virtual_location
        /Common/wap
        /Common/wmi
        /Common/mqtt
        /Common/myhttp
    bc
        /bc/new_http_test
    mc
        /mc/new_http_test
    part1
    part2
...