Resultados 1 al 1 de 1






Script monitorización oscam


Estás en el tema Script monitorización oscam dentro del subforo Scripts & tools en LonasDigital. Hola, aquí os dejo un script para monitorizar oscam desde un PC con python (funciona bajo windows y bajo Linux, probado en Win 7 x64, Ubuntu 12.10 y Debian 5) Requiere pyhton 2.7 y los módulos adicionales cURL, BeautifulSoup y sqlite3. Probado con oscam 1_20 unstable build #8043 Se puede poner en el cron (o programador de tareas de windows) y envía un correo con el resultado (requiere cuenta gmail o hotmail). Aquí está: 5256 #/usr/bin/python...



Este tema tuvo 1444 Visitas y 0 Respuestas

Actualmente hay 1 usuarios viendo este tema. (0 miembros y 1 visitantes)

  1. #1
    Avatar de avastreg

    avastreg ha iniciado este hilo.
    avastreg está desconectado
    Título:  Miembro de Lonas Rango:  Miembro de Lonas
    Fecha de ingreso
    Oct-2012
    Nacionalidad
    Europa
    Temas
    3
    Mensajes
    17


    Hola,
    aquí os dejo un script para monitorizar oscam desde un PC con python (funciona bajo windows y bajo Linux, probado en Win 7 x64, Ubuntu 12.10 y Debian 5)
    Requiere pyhton 2.7 y los módulos adicionales cURL, BeautifulSoup y sqlite3. Probado con oscam 1_20 unstable build #8043

    Se puede poner en el cron (o programador de tareas de windows) y envía un correo con el resultado (requiere cuenta gmail o hotmail).

    Aquí está:
    chkoscamEnv.py.txt

    Código:
    #/usr/bin/python
    
    
    from __future__ import print_function
    from BeautifulSoup import BeautifulSoup
    
    
    from datetime import datetime
    import sqlite3
    from StringIO import StringIO    
    import pycurl
    import smtplib
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEBase import MIMEBase
    from email.MIMEText import MIMEText
    from email import Encoders
    import os
    import sys
    import re
    
    
    mail_dest="cualquierdireccion@mail.com" #direccion a enviar mails
    mail_user="usuario@hotmail.com" # o usuario para usuario@gmail.com
    mail_pwd="password"
    mail_server="smtp.live.com" # o smtp.gmail.com
    oscam_user="osuser" # usuario oscam
    oscam_pwd="ospass" # password oscam
    oscam_urlbase="http://192.168.1.2:8888" # url del webif de oscam (direccion del deco y puerto del webif del oscam)
    min_clients=15 #numero minimo de clientes conectados
    min_servers=15 #numero minimo de servidores conectados
    debug=1 #imprime mensajes de depuracion 0 o 1
    log2screen=1 #muestra lo que se va a enviar por mail en pantalla 0 o 1
    
    
    
    
    def surt(codi,missatge):
       print("Error oscam : %d-%s" % (codi,missatge))
       mailto(mail_server,mail_dest,"Aviso: Oscam error %d" % codi,missatge,"")
       sys.exit(codi)
    
    
    def missatge(dst,cadena):
       dst+=cadena + "\r"
       if log2screen: print (cadena)
       return dst
       
    def mailto(server, to, subject, text, attach):
       msg = MIMEMultipart()
    
    
       msg['From'] = mail_user
       msg['To'] = to
       msg['Subject'] = subject
       msg.attach(MIMEText(text,_subtype='plain',_charset='windows-1255'))
    
    
       if attach != "" :
          part = MIMEBase('application', 'octet-stream')
          part.set_payload(open(attach, 'rb').read())
          Encoders.encode_base64(part)
          part.add_header('Content-Disposition',
                  'attachment; filename="%s"' % os.path.basename(attach))
          msg.attach(part)
    
    
       mailServer = smtplib.SMTP(server, 587)
       mailServer.ehlo()
       mailServer.starttls()
       mailServer.ehlo()
       mailServer.login(mail_user, mail_pwd)
       mailServer.sendmail(mail_user, to, msg.as_string())
       # Should be mailServer.quit(), but that crashes...
       mailServer.close()
    
    
    #mail("some.person@some.address.com",
       #"Hello from python!",
       #"This is a email sent with python",
       #"my_picture.jpg")
    
    
    def agafa_html( url ):
      storage = StringIO()
      c = pycurl.Curl()
      c.setopt(c.URL, url)
      c.setopt(c.WRITEFUNCTION, storage.write)
      c.setopt(c.USERPWD, "%s:%s" % (oscam_user,oscam_pwd))
      c.setopt(c.HTTPAUTH,c.HTTPAUTH_DIGEST)
      c.perform()
      c.close()
      content = storage.getvalue()
      return content
    
    
    
    
      
    body= "" 
    connection = sqlite3.connect('oscam.db')
    cursor=connection.cursor()
    try:
      cursor.execute ("DROP TABLE users")
    except:
      if debug: print ("Ignorando error drop users")
    
    
    try:
      cursor.execute ("CREATE TABLE servers_off (server text PRIMARY KEY ASC"
                      ", dia datetime)")
    except:
      if debug: print ("Ignorando error create servers_off")
    
    
    try:
      cursor.execute ("CREATE TABLE clients_off (client text PRIMARY KEY ASC"
                      ", dia datetime)")
    except:
      if debug: print ("Ignorando error clients_off")
    
    
    try:
      cursor.execute ("CREATE TABLE peers_coneguts (client text, server text,"
                      " PRIMARY KEY (client,server))")
    except:
      if debug: print ("Ignorando error peers_coneguts")
    
    
    try:
      cursor.execute ("CREATE TABLE users (user text,host text, ip text, status_p, status_c )")
    except:
      if debug: print ("Ignorando error users")
    
    
    
    
    if debug: print ("Entrando a processar servers")
    try:
      soup=BeautifulSoup(agafa_html(oscam_urlbase))
    
    
      tabla=soup.find("table",{ "class":"status"} )
    
    
      for fila in tabla.findAll('tr',{ 'class':'p' }):
        col4=fila.find('td',{ 'class':'statuscol4'})
        col16=fila.find('td',{ 'class':'statuscol16'})
        col7=fila.find('td',{ 'class':'statuscol7'})
        status="CONNECTED" if (col16.text.find("CONNECTED")>=0) else "ERROR"
        try:
           if debug: print ("Server to check: %s" % col4.text)
           cursor.execute("SELECT client FROM peers_coneguts WHERE server=?", (col4.text,))
           client=cursor.fetchone()
           if debug: print (client)
           cli=client[0]
        except:
           cli=""
        if col4.text != 'root' :
          cursor.execute ('INSERT INTO users VALUES ( ?,?,?,?,null)',  \
                          (cli,col4.text,col7.text,status) )
    except:
      surt(1,"Error no controlado en parte inicial")
    
    
    if debug: print ("Entrando a procesar clientes")
    try:
      soup=BeautifulSoup(agafa_html("%s/userconfig.html" % oscam_urlbase))
      tabla=soup.find("table",{ "class":"users"} )
      for fila in tabla.findAll("tr", {"class":True}):
        col1=fila.find('td',{ 'class':'usercol1'})
        col2=fila.find('td',{ 'class':'usercol2'})
        col3=fila.find('td',{ 'class':'usercol3'})
        if debug: print ("Dades usuari: %s - %s - %s " % (col1.text,col2.text,col3.text))
        if col2.text=="offline" :
           cursor.execute("UPDATE users SET status_c='ERROR' WHERE " \
                            "user = ?",(col1.text,))
           if debug: print("Update usuario %s a ERROR" % col1.text)
           if cursor.rowcount==0 :
              if debug: print("Insert usuari %s amb ERROR" % col1.text)
              cursor.execute("INSERT INTO users VALUES (?,null,null,null,'ERROR')", \
                              (col1.text,) )
        else:
           status="CONNECTED"
           cursor.execute ("UPDATE users SET user=? , status_c='CONNECTED' where ip=? and ip!='0.0.0.0'", \
                           (col1.text,col3.text))
           if cursor.rowcount==0 :
              cursor.execute("INSERT INTO users VALUES (?,null,?,null,?)",(col1.text \
                              ,col3.text,"CONNECTED"))
    except:
      surt(2,"Error en el prceos de la parte client")
    if debug: print ("borrando clientes que estan activos")
    cursor.execute ("delete from clients_off where exists "
                     "(select user from users where clients_off.client=users.user "
                     "and status_c='CONNECTED')")
    if debug: print ("borrando servers que estan activos")
    cursor.execute ("delete from servers_off where exists "
                     "(select host from users where servers_off.server=users.host "
                     "and status_p='CONNECTED')")
    if debug: print ("insertant peers reconeguts")
    cursor.execute ("INSERT INTO peers_coneguts(client,server) "
                      "SELECT user,host FROM users AS u "
                      "WHERE status_p='CONNECTED' and status_c='CONNECTED' "
                      "AND NOT EXISTS (SELECT '1' FROM peers_coneguts pc "
                      "WHERE u.host=pc.server  "
                      "AND   u.user=pc.client)")
    connection.commit()
    
    
    if debug: print ("Imprimiendo resultados")
    cursor.execute("SELECT COUNT(*) FROM users where host is not null")
    total_reg=cursor.fetchone()
    cursor.execute("SELECT COUNT(*) FROM users where status_p='CONNECTED'")
    total_srv=cursor.fetchone()
    
    
    body=missatge(body,"Total servidores: %d - Connectado a %d " % (total_reg[0],total_srv[0]) )
    
    
    cursor.execute("SELECT COUNT(*) FROM users where user is not null")
    total_reg=cursor.fetchone()
    cursor.execute("SELECT COUNT(*) FROM users where status_c='CONNECTED'")
    total_cli=cursor.fetchone()
    
    
    body=missatge(body,"Total clientes: %d - Connectados %d " % (total_reg[0],total_cli[0]))
    
    
    if debug: print ("Imprimiendo peers con error")
    body=missatge(body,"")
    body=missatge(body,"Peers con error")
    body=missatge(body,"---------------")
    
    
    cursor.execute("SELECT * FROM users WHERE status_c='ERROR' " 
                   "and status_p='ERROR'")
    srv_error=cursor.fetchall()
    for serv in srv_error:
        body=missatge(body,"%s - %s - %s - %s - %s " % (serv[0],serv[1],serv[2],serv[3],serv[4]))
        body=missatge(body,"")
        try:
          cursor.execute("INSERT INTO servers_off VALUES (?,?)",(serv[1],datetime.now()))
          cursor.execute("INSERT INTO clients_off VALUES (?,?)",(serv[0],datetime.now()))
        except:
          if debug: print ("ya existe")
    body=missatge(body,"")
    
    
    connection.commit()
    
    
    if debug: print ("Imprimiendo clientes sin conectar")
    body=missatge(body,"")
    body=missatge(body,"Clientes sin conectar")
    body=missatge(body,"---------------------")
    cursor.execute("SELECT * FROM users WHERE user is not null and status_c='ERROR' "
                   "AND (status_p!='ERROR' or status_p is null)")
    srv_error=cursor.fetchall()
    for serv in srv_error:
        body=missatge(body, "%s" % (serv[0]))
        try:
          cursor.execute("INSERT INTO clients_off VALUES (?,?)",(serv[0],datetime.now()))
        except:
          if debug: print ("ya existe")
    
    
    if debug: print ("Imprimiendo servers sein conectar")
    body=missatge(body,"")
    body=missatge(body,"Servidors sin connectar")
    body=missatge(body,"-----------------------")
    cursor.execute("SELECT * FROM users WHERE host is not null and status_p='ERROR'"
                   "AND (status_c!='ERROR' or status_c is null)")
    srv_error=cursor.fetchall()
    for serv in srv_error:
        body=missatge(body,"%s - %s - %s - %s - %s " % (serv[0],serv[1],serv[2],serv[3],serv[4]))
        try:
          cursor.execute("INSERT INTO servers_off VALUES (?,?)",(serv[1],datetime.now()))
        except:
          if debug: print ("ya existe")
    body=missatge(body,"")
    
    
    connection.commit()
    
    
    
    
    connection.close()
    if total_cli[0]<min_clients or total_srv[0]<min_servers:
      body=missatge(body,"ERROR: clientes o servidores bajo minimo")
      body=missatge(body,"Clientes: %s - Servidores %s" % (total_cli[0],total_srv[0]))
      surt(5,body)
    else:
      mailto (mail_server,mail_dest,"OSCAM status",body,"")




    Citar Citar  

  2. Los siguientes usuarios agradecieron a avastreg por su mensaje :

    lonas (03-01-13)




Subir