1. hop

    15.02.2010

    0 ↑
    0 ↓
    Привет всем!!!
    Есть небольшой скрипт который держит постоянный коннект к БД (mysql) и telnet-коннект на voip switch. Как правильно/грамотно закрыть коннект к БД? Я конечно понимаю,что БД сама по таймауту рубанет нективные коннекты, но все же хотелось бы знать как надо делать.
    Код выглядит так, прошу указать на ошибки:
    #!/usr/bin/env python
    # -*- coding: utf8 -*-

    import telnetlib
    import re
    import time
    import datetime
    from MySQLdb import connections
    import signal
    import sys

    sleep_time = 10

    voip_host = "192.168.1.1"
    voip_port = 23
    voip_user = "voip_user"
    voip_pass = ""

    db_user = 'voip'
    db_pass = '12345'
    db_host = 'localhost'
    db_name = 'voip_switch'

    class VoipSwitch():
    def __init__(self):
    self.tn = telnetlib.Telnet(voip_host, voip_port)
    self.tn.read_until("login: ")
    self.tn.write(voip_user + "\n")
    self.tn.read_until("password: ")
    self.tn.write(voip_pass + "\n")

    def get_port(self):
    self.tn.write("line -print" + "\n")
    text = self.tn.read_until("usr/config$ ")
    matches = re.findall(r"Busy", text)
    return len(matches)

    def close(self):
    self.tn.write("quit" + "\n")
    self.tn.close()

    class VoipDatabase():
    def __init__(self):
    self.con = connections.Connection(db=db_name, host=db_host, user=db_user, passwd=db_pass)
    self.cu = self.con.cursor()

    def add(self, port):
    sql = """INSERT INTO main(port, cur_time) VALUES(%d, NOW());""" % (int(port))
    self.cu.execute(sql)
    self.con.commit()

    def get(self):
    sql = """SELECT port, cur_date FROM main;"""
    self.cu.execute(sql)
    data = []
    for tmp in self.cu.fetchaall():
    data.append(tmp[0])
    return data

    def close(self):
    self.con.close()

    if __name__ == "__main__":

    def signal_handler(signal, frame):
    global db
    global voip
    db.close()
    voip.close()
    sys.exit(0)

    def signal_handler2(signal, frame):
    global db
    global voip
    db.close()
    voip.close()
    sys.exit(0)

    voip = VoipSwitch()
    db = VoipDatabase()
    signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler2)

    while(1):
    port = voip.get_port()
    print port, datetime.datetime.now()
    db.add(port)
    time.sleep(sleep_time)
    И нужно ли вообще отлавливать SIGINT, SIGTERM? Как в данном случае правильно закрыть telnet-коннект ? И не является все это дело излишеством?
  2. cbx

    26.03.2010

    0 ↑
    0 ↓

    Выглядит вполне работоспособно. Есть какие-то проблемы с закрытием telnet сессии?

  3. cbx

    26.03.2010

    0 ↑
    0 ↓

    Пожалуй я бы только избавился от второго handler'а (можно оба сигнала обрабатывать одной функцией) и от глобальных переменных на случай если появится ещё один switch или база данных.

    Ну и можно подумать об обработке ошибок (на случай внезапной потери соединений можно сделать автоматическое переподключение) и экспоненциальной задержке если что-то идёт не так (чтобы не DOS'ить оборудование).

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.