network manager y python

8 04 2009
  • Usando dbus para interactuar con Network Manager desde python
  • Escuchando eventos desde dbus
  • Obtención de IP propia y de un host x
  • Simple envío de mail
  • gobject: loops y timers
  • libnotify (usando pynotify)
  • Actualización de IP dinámica en CDMON


#!/usr/bin/python
import httplib
import smtplib
import socket
import fcntl
import struct
import os
import time
import datetime
import dbus
import sys
import pynotify
import gobject
import dbus.mainloop.glib
import logging
import logging.handlers
import urllib2
import threading
#
LOG_FILENAME="-----------.log"
IFNAME = "eth0"
URL_TEST = "http://www.google.com"
FROM_ADDR = 'From: ----------'
TO_ADDR = 'To: ------------'
DYNA_HOST = "dinamico.cdmon.org"
PWD="------------------"
USR="-----------"
URL="/onlineService.php?n="+USR+"&p="+PWD+"&enctype=MD5"
MY_HOSTNAME="-----------"
TIMEOUT=5000
#
NM_STATE_UNKNOWN = 0
NM_STATE_ASLEEP = 1
NM_STATE_CONNECTING = 2
NM_STATE_CONNECTED = 3
NM_STATE_DISCONNECTED = 4
.
class Callable:
....def __init__(self, anycallable):
........self.__call__ = anycallable
#
class Message:
#
....def error(msg):
........if pynotify.init("NetControl"):
............n = pynotify.Notification("CDMON", msg, "error")
............n.set_urgency(pynotify.URGENCY_CRITICAL)
............n.set_timeout(5000)
............n.show()
#
....def info(msg):
........if pynotify.init("NetControl"):
............n = pynotify.Notification("CDMON", msg)
............n.set_urgency(pynotify.URGENCY_LOW)
............n.set_timeout(5000)
............n.show()
....error = Callable(error)
....info = Callable(info)
#
class Manager:
....bus = None
....nm = None
....logger = None
#
....def __init__(self):
........self.bus = dbus.SystemBus()
........self.logger = logging.getLogger('NetControl')
........self.logger.setLevel(logging.DEBUG)
........handler = logging.handlers.RotatingFileHandler(
............ LOG_FILENAME, maxBytes=1048576, backupCount=2)
........formatter = logging.Formatter("%(asctime)s - %(funcName)s - %(levelname)s - %(message)s")
........handler.setFormatter(formatter)
........self.logger.addHandler(handler)
#
....def connect(self):
........for i in range(1,3):
............try:
................self.logger.debug("Connect to Network Manager. Attemp %s",i)
................self.nm = self.bus.get_object('org.freedesktop.NetworkManager','/org/freedesktop/NetworkManager')
................break
............except Exception, e1:
................self.logger.error("Failed to connect to Network Manager (%s)",str(e1))
................time.sleep(10)
#
........if self.nm is None:
............Message.error("Unable to connect to the Network Manager")
............self.logger.error("Unable to connect to Network Manager. Exit.")
............sys.exit(2)
#
....def is_active(self):
........return self.nm.state() == NM_STATE_CONNECTED
#
....def wake_up(self):
........if self.nm.state() NM_STATE_ASLEEP:
............self.logger.debug("Put to sleep")
............self.nm.sleep()
............time.sleep(2)
........self.logger.debug("Wake up")
........self.nm.wake()
#
....def is_alive(self):
........try:
............self.logger.debug("Check if there is a real connection")
............urllib2.urlopen(URL_TEST)
............self.logger.debug("Connected.")
............return True
........except Exception, e1:
............self.logger.debug("No connection.")
............self.logger.error(str(e1))
............return False
#
....def check_cdmon(self):
........try:
............'''GET INET ADDRESS'''
............self.logger.debug("Get local IP")
............s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
............myip = socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915,struct.pack('256s', IFNAME[:15]))[20:24])
#
............'''GET HOST ADDRESS'''
............self.logger.debug("Get CDMON record")
............result = socket.getaddrinfo(MY_HOSTNAME, None, 0, socket.SOCK_STREAM)
............hostip = [x[4][0] for x in result][0]
............if (myip != hostip):
................self.update_cdmon(myip)
............else:
................self.logger.debug("No need to update.")
........except Exception, e1:
............Message.error(str(e1))
............self.logger.error(str(e1))
............return True
#
....def update_cdmon(self,myip):
........try:
............self.logger.debug("Updating IP (%s)",myip)
............conn = httplib.HTTPSConnection(DYNA_HOST)
............conn.putrequest('GET', URL)
............conn.endheaders()
............response = conn.getresponse()
............resp = response.read()
#
............if resp.count("errorlogin") > 0:
................Message.error("Login failed!")
................self.logger.error("Login failed!")
................self.send_mail("Login failed! " + myip)
............elif resp.count("novaversio") > 0:
................Message.error("Request url changed!")
................self.logger.error("Request url changed!")
................self.send_mail("Request URL has changed. Update this tool! " + myip)
............elif resp.count("guardatok") > 0:
................rs = resp.split("&")
................for part in rs:
....................if part.count("newip"):
........................newip = part[6:]
........................Message.info("New IP: "+newip)
........................self.send_mail("New IP: "+newip)
....................elif resp.count("badip") > 0:
........................Message.error("Bad IP!")
........................self.logger.error("Bad IP!")
........except httplib.HTTPException:
............Message.error("HTTPException")
............self.logger.error("HTTPException")
........except httplib.NotConnected:
............Message.error("NotConnected")
............self.logger.error("NotConnected")
........except httplib.InvalidURL:
............Message.error("InvalidURL")
............self.logger.error("InvalidURL")
........except httplib.UnknownProtocol:
............Message.error("UnknownProtocol")
............self.logger.error("UnknownProtocol")
........except httplib.UnknownTransferEncoding:
............Message.error("UnknownTransferEncoding")
............self.logger.error("UnknownTransferEncoding")
........except httplib.UnimplementedFileMode:
............Message.error("UnimplementedFileMode")
............self.logger.error("UnimplementedFileMode")
........except httplib.IncompleteRead:
............Message.error("IncompleteRead")
............self.logger.error("IncompleteRead")
........except httplib.ImproperConnectionState:
............Message.error("ImproperConnectionState")
............self.logger.error("ImproperConnectionState")
........except httplib.CannotSendRequest:
............Message.error("IncompleteRead")
............self.logger.error("IncompleteRead")
........except httplib.CannotSendHeader:
............Message.error("CannotSendHeader")
............self.logger.error("CannotSendHeader")
........except httplib.ResponseNotReady:
............Message.error("ResponseNotReady")
............self.logger.error("ResponseNotReady")
........except httplib.BadStatusLine:
............Message.error("BadStatusLine")
............self.logger.error("BadStatusLine")
#
....def send_mail(self,msg):
........server = smtplib.SMTP("localhost")
........smsg = TO_ADDR + "\n"
........smsg += "Subject: CDMON\n\n" + msg
........server.sendmail(FROM_ADDR,TO_ADDR, smsg)
........server.quit()
#
....def on_nm_update(self, arg1):
........if arg1 == NM_STATE_UNKNOWN:
............self.logger.debug("Interface state is UNKNOWN")
........elif arg1 == NM_STATE_ASLEEP:
............self.logger.debug("Interface state is SLEEP")
........elif arg1 == NM_STATE_CONNECTING:
............self.logger.debug("Interface state is CONNECTING")
........elif arg1 == NM_STATE_DISCONNECTED:
............self.logger.debug("Interface state is DISCONNECTED")
........elif arg1 == NM_STATE_CONNECTED:
............self.logger.debug("Interface state is CONNECTED")
............time.sleep(5)
............if self.check_alive():
................self.check_cdmon()
............else:
................self.logger.error("No connection")
................Message.error("No connection")
#
....def check_alive(self):
........for i in range(1,3):
............if self.is_alive():
................break
............self.wake_up()
............time.sleep(10)
........return self.is_alive()
#
....def listen(self):
........self.logger.debug("Listening")
........self.bus.add_signal_receiver(self.on_nm_update,
............dbus_interface="org.freedesktop.NetworkManager",
............signal_name="StateChanged")
#
....def do_self_check(self):
........self.logger.debug("Self checking")
........if self.check_alive():
............self.check_cdmon()
........else:
............self.logger.error("No connection")
............Message.error("No connection")
........self.start_timer()
#
....def start_timer(self):
........self.logger.debug("Start timer")
........gobject.timeout_add(TIMEOUT, self.do_self_check)
#
#MAIN
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
#
man = Manager()
man.connect()
#
for i in range(1,3):
....for b in range(1,3):
........if man.is_active():
............break
........time.sleep(5)
#
....if man.is_active():
.... break
#
....man.wake_up()
....time.sleep(10)
#
if not man.is_active():
....Message.error("Connection is not active")
....sys.exit(2)
#
if not man.check_alive():
....Message.error("No connection")
#
man.listen()
man.check_cdmon()
#
man.start_timer()
gobject.MainLoop().run()

Para conservar la indentación los espacios iniciales fueron reemplazados por ‘.’
Saltos de línea reemplazados por #


Acciones

Información

Deja un comentario

Tienes que iniciar sesión para escribir un comentario.