• Hola Invitado, nos gustaría recordarte que mantener este sitio en línea conlleva unos gastos mensuales y anuales.

    Sin vuestra ayuda mensual no es posible seguir en pie, no hay mucho más que contar.

    Si quieres colaborar para que sea posible por lo menos seguir en pie como comunidad, puedes hacerlo mediante alguno de los métodos disponibles en esta página: https://www.lonasdigital.com/donaciones/

    Recuerda que si necesitas invitación para acceder al foro, puedes solicitarla en nuestro Grupo de Telegram


Script monitorización oscam

A

avastreg

Miembro de Lonas
Registrado
10 Oct 2012
Mensajes
17
Reacciones
0
Puntos
4
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á:
Ver el archivo adjunto 5256

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,"")
 

Temas similares

R
Respuestas
1
Visitas
461
Javilonas
Javilonas
J
Respuestas
0
Visitas
698
juspahilon
J
J
Respuestas
3
Visitas
353
cen00
C
payback126
Respuestas
15
Visitas
2K
payback126
payback126
S
Respuestas
1
Visitas
342
sidesgame
S
Atrás
Arriba