Зависший процесс на ip адресе

235
23 апреля 2022, 17:20

Возникла следующая проблема — при опросе ip адресов, которые берутся с БД, на некоторых ip адресах зависает метод подключения.
Суть следующая — как можно игнорировать данные ip адреса?
Например, если при запросе на ip адрес не получаем ответа в течении 1 минуты, то записываем его в отдельный файл (к другим таким же).

# !/usr/bin/python3
import pypyodbc
import paramiko
import socket
from datetime import datetime
def get_all_logs(file_name):
    good = []
    good.append("\t\tONLINE\n")
    bad = []
    bad.append("\t\tOFF-LINE\n")
    data = []
    for x in getAllIpAndNameFromDataBase():
        data.append(x)
    for i in range(0, len(data)):
        tmp_data = get_logg(data[i][0], data[i][1])
        print(data[i][1], data[i][0])
        if tmp_data.__contains__("ONLINE"):
            good.append(tmp_data[9:])
        else:
            bad.append(tmp_data)
    with open(file_name, 'a') as File:
        File.writelines(good)
        File.writelines(bad)
def get_logg(ip, magaz):
    try:
        socket.inet_aton(ip)
        tmp_str = ''
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(hostname=ip, username='admin', password='admin', port=22)
        stdin, stdout, stderr = client.exec_command('system package update check-for-updates')
        data = stdout.read() + stderr.read()
        log = [data]
        tmp_str += ("\n\t\tONLINE\n")
        tmp_str += (magaz)
        tmp_str += ("\n")
        tmp_str += ("IP - " + ip);
        tmp_str += ("\n")
        for i in log:
            tmp = str(i).split('  ');
            tmp_str += (tmp[6][:-4] + '\n')
            tmp_str += (tmp[7][:-4]  + '\n')
            tmp_str += ((tmp[22][:-4]).lstrip() + '\n')
    except socket.error:
        tmp_str += ("\n\t\tOFF-LINE\n")
        tmp_str += (magaz)
        tmp_str += ("\n")
        tmp_str += ("IP - " + ip);
        tmp_str += ("\n")
    finally:
        client.close()
        return tmp_str
def getAllIpAndNameFromDataBase():

    connection = pypyodbc.connect(
        'Driver={SQL Server};'
        'Server=server;'
        'Database=BD;'
        'uid=admin;'
        'pwd=admin;'
    )
    curson = connection.cursor()
    mySQLQuery = ("""
        ЗАПРОС В БД
        """)
    curson.execute(mySQLQuery)
    results = curson.fetchall()
    connection.close()
    return  results
if __name__ == '__main__':
    file_name = str(datetime.now().strftime("%d-%m-%Y %H-%M-%S")) + ".txt"
    get_all_logs(file_name)
Answer 1

Вот здесь пишут, что можно выставить таймауты. В документации можно посмотреть подробнее. Попробуйте добавить все три вида таймаута (вроде бы они указываются в секундах):

client.connect(hostname=ip, username='admin', password='admin', port=22, timeout=60, banner_timeout=60, auth_timeout=60)

При превышении таймаутов должны выбрасываться исключения, не забудьте их поймать через except, сейчас у вас ловится только один вид исключения (хотя может оно и будет выкинуто - это надо проверять).

READ ALSO
Группировка вывода дочерних разделов в родительские Mysql

Группировка вывода дочерних разделов в родительские Mysql

Имеются города city, автомойки wash и посты на них bfrs

115
Помогите изменить sql запрос

Помогите изменить sql запрос

У меня на сайте(DRUPAL) есть модуль цитата дня, каждый день меняется цитата, мне надо что бы она менялась один раз в неделю, как реализовать, я что-то...

211