воскресенье, 17 января 2016 г.

Державний реєстр лікарських засобів України просмотр на мобильном телефоне

В связи с продолжительным невыкладыванием справочника по лекарственным препаратам хотелось перейти на онлайн вариант.
И вроде бы поиск по сайту Державний реєстр лікарських засобів України
www.drlz.kiev.ua работает и с мобильного. Только вот посмотреть инструкцию по препарату нельзя, она скачивается в формате .mht.  Чтобы посмотреть это нужно поставить firefox на телефон и поставить add-on unmht (в самом firefox есть возможность добавлять различные add-on -три точки в правом углу-> tools->add-on->browse all firefox add-ons). Шрифт конечно караул, но лучше чем ничего.

пятница, 15 января 2016 г.

сбор информации с маршрутизаторов cisco python paramiko

На основе предыдущего скрипта сделал сбор информации и подсчет подходящих под условие
отличие здесь довольно простое
из функции есть возрат значения, а уже значение (по сути ответ устройства) анализируется на наличие строк.
поиск строки сделан очень просто просто проверяется строка целиком с помощью in.

#!/usr/bin/python
#for work with SSH we need paramiko pip install paramiko
import paramiko
#hide password input 
import getpass
#build in library socket for with exception
import socket
list_bad_ip=[]
receive_buffer=""
client = paramiko.SSHClient()
#for connection via ssh you need to accept SSH keys
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#create function for send command and check answer
def send_string_and_wait_for_string(command, wait_string):
#send command
    shell.send(command)
#clear buffer
    receive_buffer = ""
#until receive WAIT_STRING - remote device ready
    while not wait_string in receive_buffer:
        receive_buffer += shell.recv(1024)
#return buffer with output of command 
 return receive_buffer
#read list of IPs from text file one by line
ips = [i.strip() for i in open("./1")]
username1 = raw_input("enter login :")
#hide password input 
password1 = getpass.getpass("enter password :")
#create loop for each IPs
for ip in ips:
#if we use try easy to work with expection
    try:
#connect to device
        client.connect(ip,port=22,username=username1,password=password1)
#check state
#        print "connect to ",ip
        shell = client.invoke_shell()
#wait for enable
        send_string_and_wait_for_string("", "#")
#enter command and wait for return to #
        receive_buffer = send_string_and_wait_for_string("sh int Vlan12 | i line protocol\n","#")
#first option not interesting 
        if "line protocol is up" in receive_buffer:
            print ip+" protocol is up"
#second possible answer interesting save in separate list 
        else:
            print ip+" line protocol is down"
            list_bad_ip.append(ip)
#close with this device
        shell.close()
        client.close()
#work with timeout error
    except socket.error:
        print ip + '=== Device unreachable'
#add ip with errors to list
        list_bad_ip.append(ip)
#save this list to file
with open('bad_ip', 'w') as f:
    for s in list_bad_ip:
        f.write(s + '\n')
#show list at the screen for lazy admin
print list_bad_ip
(END)

массовая настройка маршрутизаторов Cisco по ssh (mass configuring cisco router via ssh)

Написал небольшой скрипт как пример массовой настройки маршрутизаторов Cisco по ssh на python.
Использовал paramiko, а не модуль clogin из rancid, потому что было интересно уменьшить зависимости.

От других подобных скриптов мне кажется отличает такое
1) за счет ожидания wait for string работает и на каналах с большой латентностью (спутниках и наземных в перемешку)
2) в тоже время за счет выноса цикла отправки и ожидания ответа в функцию код получается более-менее компактным и добавлять команды довольно просто
3) за счет getpass получается скрытый ввод пароля
4) да и вообще в скрипте не храняться учетные данные
5) так как в моем списке ip могут попадаться и неактивные устройства, то используется try и  expect  для вывода адресов, до которых не удалось достучаться.
 
#!/usr/bin/python
#for work with SSH we need paramiko pip install paramiko
import paramiko
import getpass
#build in library socket for with exception
import socket
list_bad_ip=[]
client = paramiko.SSHClient()
#for connection via ssh you need to accept SSH keys
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#create function for send command and check answer
def send_string_and_wait_for_string(command, wait_string):
#send command
    shell.send(command)
#clear buffer
    receive_buffer = ""
#until receive WAIT_STRING - remote device ready
    while not wait_string in receive_buffer:
        receive_buffer += shell.recv(1024)
#read list of IPs from text file one by line
ips = [i.strip() for i in open("./1")]
username1 = raw_input("enter login :")
password1 = getpass.getpass("enter password :")
#create loop for each IPs
for ip in ips:
#if we use try easy to work with expection
    try:
#connect to device
        client.connect(ip,port=22,username=username1,password=password1)
#check state
        print "connect to ",ip
        shell = client.invoke_shell()
#wait for enable
        send_string_and_wait_for_string("", "#")
#enter conf t and wait for #
        send_string_and_wait_for_string("conf t\n", "(config)#")
#enter command and wait for return to #
        send_string_and_wait_for_string("login on-failure log\n","(config)#")
        send_string_and_wait_for_string("login on-success log\n","(config)#")
#end is important, exit worse in this case
        send_string_and_wait_for_string("end\n","#")
#don't forget store in flash
        send_string_and_wait_for_string("wr mem\n","#")
#we are near end with device
        print ip+" ok"
#close with this device
        shell.close()
        client.close()
#work with timeout error
    except socket.error:
        print ip + '=== Device unreachable'
#add ip with errors to list
        list_bad_ip.append(ip)
#save this list to file
with open('bad_ip', 'w') as f:
    for s in list_bad_ip:
        f.write(s + '\n')
#show list at the screen for lazy admin
print list_bad_ip