Архив метки: python

Работа с именованными массивами на Python

Задача: получить список портов и их состояний из БД в именованый массив.

Обьявление массива:

res[]

Добавление в массив:

res.append({name:{‘port_id’:port_id,’name’:name,’status’:status}});

Другие функции работы с массивом:

array.typecode — TypeCode символ, использованный при создании массива.

array.itemsize — размер в байтах одного элемента в массиве.

array.append(х) — добавление элемента в конец массива.

array.buffer_info() — кортеж (ячейка памяти, длина). Полезно для низкоуровневых операций.

array.byteswap() — изменить порядок следования байтов в каждом элементе массива. Полезно при чтении данных из файла, написанного на машине с другим порядком байтов.

array.count(х) — возвращает количество вхождений х в массив.

array.extend(iter) — добавление элементов из объекта в массив.

array.frombytes(b) — делает массив array из массива байт. Количество байт должно быть кратно размеру одного элемента в массиве.

array.fromfile(F, N) — читает N элементов из файла и добавляет их в конец массива. Файл должен быть открыт на бинарное чтение. Если доступно меньше N элементов, генерируется исключение EOFError , но элементы, которые были доступны, добавляются в массив.

array.fromlist(список) — добавление элементов из списка.

array.index(х) — номер первого вхождения x в массив.

array.insert(n, х) — включить новый пункт со значением х в массиве перед номером n. Отрицательные значения рассматриваются относительно конца массива.

array.pop(i) — удаляет i-ый элемент из массива и возвращает его. По умолчанию удаляется последний элемент.

array.remove(х) — удалить первое вхождение х из массива.

array.reverse() — обратный порядок элементов в массиве.

array.tobytes() — преобразование к байтам.

array.tofile(f) — запись массива в открытый файл.

array.tolist() — преобразование массива в список.

Пример:

def GetPortList(conn,device_id):           
    sql="select ports.name,device_status.device_id,device_status.port_id,device_status.param_value from device_status inner join ports on ports.port_id=device_status.port_id where device_status.device_id=%s and device_status.port_id>0";
    cursor = conn.cursor(dictionary=True,buffered=True)
    cursor.execute(sql,[device_id]);
    row = cursor.fetchone()
    res=[]
    while row is not None:        
	name=row["name"];
	port_id=row['port_id'];
	status=row['param_value'];
	res.append({name:{'port_id':port_id,'name':name,'status':status}});
	row = cursor.fetchone()
    cursor=None
    return res

port_list=GetPortList(connb,row["device_id"]);
pprint.pprint(port_list)

Получится чудный вывод на экран чтото типа:

[{1: {'name': 1, 'port_id': 319, 'status': u'2'}},
 {2: {'name': 2, 'port_id': 320, 'status': u'2'}},
 {3: {'name': 3, 'port_id': 321, 'status': u'2'}},
 {4: {'name': 4, 'port_id': 322, 'status': u'2'}},
 {5: {'name': 5, 'port_id': 323, 'status': u'2'}},
 {6: {'name': 6, 'port_id': 324, 'status': u'2'}},
 {7: {'name': 7, 'port_id': 325, 'status': u'2'}},
 {8: {'name': 8, 'port_id': 326, 'status': u'2'}},
 {9: {'name': 9, 'port_id': 327, 'status': u'1'}},
 {10: {'name': 10, 'port_id': 328, 'status': u'2'}},
 {11: {'name': 11, 'port_id': 329, 'status': u'1'}},
 {12: {'name': 12, 'port_id': 330, 'status': u'1'}},
 {13: {'name': 13, 'port_id': 331, 'status': u'2'}},
 {14: {'name': 14, 'port_id': 332, 'status': u'2'}},
 {15: {'name': 15, 'port_id': 333, 'status': u'2'}},
 {16: {'name': 16, 'port_id': 334, 'status': u'1'}},
 {17: {'name': 17, 'port_id': 335, 'status': u'2'}},
 {18: {'name': 18, 'port_id': 336, 'status': u'2'}},
 {19: {'name': 19, 'port_id': 337, 'status': u'2'}},
 {20: {'name': 20, 'port_id': 338, 'status': u'2'}},
 {21: {'name': 21, 'port_id': 339, 'status': u'2'}},
 {22: {'name': 22, 'port_id': 340, 'status': u'2'}},
 {23: {'name': 23, 'port_id': 341, 'status': u'2'}},
 {24: {'name': 24, 'port_id': 342, 'status': u'1'}},
 {25: {'name': 25, 'port_id': 343, 'status': u'2'}},
 {26: {'name': 26, 'port_id': 344, 'status': u'2'}},
 {27: {'name': 27, 'port_id': 345, 'status': u'2'}},
 {28: {'name': 28, 'port_id': 346, 'status': u'1'}}]

RuntimeError: autoconf error

Ошибка возникла при попытке установить модуль pysnmp  во FreeBSD:

pip install pysnmp

Решение:

— ставим gcc, убеждаемся что /tmp смонтирован с флагом exec. Помогло. Теперь другая ошибка:

src/_fastmath.c:36:11: fatal error: ‘gmp.h’ file not found

Решение: копируем gmp.h из /usr/include/ в /usr/local/include/

Включаем и выключаем порты на свичах Dlink, SNR, QSW скрипт на Python

Задача: считать текущий статус порта, и в зависимости от него или выключить порт, или включить.

Решение: скрипт на python

# coding=utf-8
from pysnmp.hlapi import *
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto import rfc1902

def GetPortStatus(ip,comm,oid):
 rez=None	    
 try:
    errorIndication, errorStatus, errorIndex, varBinds = next(
       getCmd(SnmpEngine(),
	      CommunityData(comm),
	      UdpTransportTarget(
		  (ip, 161), timeout=2.0, retries=0
	      ),
	      ContextData(),
	      ObjectType(ObjectIdentity(oid)))
    )

    if errorIndication:
       print(errorIndication)
       return rez
    elif errorStatus:
       print('%s at %s' % (errorStatus.prettyPrint(),
			   errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
       return rez			
    else:
       for varBind in varBinds:      
	 if str(varBind).find("up")>0: rez=1;
	 if str(varBind).find("down")>0: rez=2;
	 if rez==None:
	   zx=str(varBind).split("=");
	   rez=zx[1].replace(" ","");      
 except:	       
     rez=None   
 return rez

def SetPortStatus(ip,comm,oid,status):
 rez=None	          
 try:
    cmdGen = cmdgen.CommandGenerator()
    errorIndication, errorStatus, errorIndex, varBinds = cmdGen.setCmd(
       cmdgen.CommunityData(comm,mpModel=1),
       cmdgen.UdpTransportTarget((ip, 161)),
	(oid, rfc1902.Integer(status)),    
    )
    # Check for errors and print out results
    if errorIndication:
       print(errorIndication)
    else:
       if errorStatus:
	   print('%s at %s' % (
	       errorStatus.prettyPrint(),
	       errorIndex and varBinds[int(errorIndex)-1] or '?'
	       )
	   )
	   rez=None
       else:
	   for name, val in varBinds:
	       print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))    
	       rez=True
 except:	       
     rez=None
 return rez
#снимает статус порта	
#dlink
# oid=1.3.6.1.2.1.2.2.1.8.x
# x - номер порта
rz=GetPortStatus('12.1.14.6','XFiles','1.3.6.1.2.1.2.2.1.8.9')	
print "Dlink: ",rz
#snr
rz=GetPortStatus('72.1.14.201','X-Files','1.3.6.1.2.1.2.2.1.8.3')	
print "SNR: ",rz
#qsw
rz=GetPortStatus('72.1.114.201','X-Files','1.3.6.1.2.1.2.2.1.8.3')	
print "QSW: ",rz

#устанавливаем статус порта
#up=1,down=2
#oid=1.3.6.1.2.1.2.2.1.7.9.x
# x - номер порта
#Dlink
rz=SetPortStatus('72.8.114.4','X-Files','1.3.6.1.2.1.2.2.1.7.9',1)
print rz;
#SNR
rz=SetPortStatus('72.7.114.196','X-Files','1.3.6.1.2.1.2.2.1.7.8',1)
print rz;
#QSR
rz=SetPortStatus('12.1.114.100','X-Files','1.3.6.1.2.1.2.2.1.7.3',1)
print rz;

 

Работаем на python с протоколом snmp

Есть несколько модулей, которые помогают работать с snmp на python. Гугл в помощь какие. Наиболее популярный: pysnmp. В Ubuntu ставится как:

pip install pysnmp

Напишем на Python аналог команды из консоли, которая получает  список мак адресов на портах свичей Dlink:

snmpwalk -v2c -c XFiles 172.18.114.6 1.3.6.1.2.1.17.7.1.2.2.1.2

Снимок экрана из 2016-05-20 10-05-50

Код:

from pysnmp.entity.rfc3413.oneliner import cmdgen

cmdGen = cmdgen.CommandGenerator()

errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
    cmdgen.CommunityData('XFiles'),
    cmdgen.UdpTransportTarget(('172.18.114.6', 161)),
    '1.3.6.1.2.1.17.7.1.2.2.1.2'    
)

if errorIndication:
    print(errorIndication)
else:
    if errorStatus:
        print('%s at %s' % (
            errorStatus.prettyPrint(),
            errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
            )
        )
    else:
        for varBindTableRow in varBindTable:
            for name, val in varBindTableRow:
                print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))

Снимок экрана из 2016-05-20 10-07-41

Потоки на Python

На удивление, на такую простую вещь как создание потоков, потратил пару часов, из-за обилия в интернетиках примеров с ошибками в коде. Потому привожу рабочий пример:

#!/usr/local/bin/python
# coding=utf-8
import threading
import time

debug=True
#количество одновременно запускаемых потоков
thread_count=10;

def putlog(txt):
    if (debug==True):
     print txt
def worker(th):
    putlog("--стартовал поток "+str(th));
    i=0
    while i<config.thread_count:
     putlog("--поток "+str(th)+", шаг "+str(i))
     time.sleep(1)
     i=i+1
def main():
    putlog("-скрипт стартовал!");    
    #запускаем потоки
    for i in xrange(thread_count):
	thread = threading.Thread(target=worker, args=(i,)).start()	
    #ждем пока потоки завершатся	
    while threading.active_count() >1:
     putlog("!ждем завершения потоков")	
     time.sleep(1)
    putlog("-скрипт закончил работу!");	 
main()

Результат работы скрипта:

-скрипт стартовал!
--стартовал поток 0
--поток 0, шаг 0
--стартовал поток 1
--поток 1, шаг 0
--стартовал поток 2
 !ждем завершения потоков
--поток 2, шаг 0
--поток 0, шаг 1
!ждем завершения потоков
--поток 1, шаг 1
--поток 2, шаг 1
--поток 0, шаг 2
!ждем завершения потоков--поток 1, шаг 2

--поток 2, шаг 2
!ждем завершения потоков
-скрипт закончил работу