#! /usr/bin/python
# -*- coding: utf-8 -*-

# Filename: log2db.py

__module_name__= "Backup Log To Database"
__module_version__= "1.5"
__module_description__= "Windows 2000 Server-en Backup erreghistroak Datu-basera sartu"
__module_author__= "Alfredo Barrainkua Zallo"



################################################################################################################

#					Log To Database

################################################################################################################
#
# 1.5 - 2009-02-20
#	Orain, soilik bidaltzen du postaz metatze kopuru limetearen mezua, aurretik datuak metatu badira.
#	Honela, soilik bidaltzen du azken zintaren mezua
# 1.4 - 2008-12-21
#	Espero duen zinta ez badu aurkitzen, fitxategian beste mezu bat jartzen du, baina ez dago
#	segurtasun kopien daturik.
# 1.3 - 2008-12-16
#	Fitxategia hutsirik badako, zinta kanporatua izan da.
#	Programak, aurreikusten du egoera hau. Posta mezua bidaltzen du.
# 1.2 - 2008-12-14
#	Fitxategiak bilatu edo sortzerakoan, helbide absolutuak erabili.
#	cron batez egikaritzerakoan, ez du funtzionatzen bestela. (HOMEDIR)
# 1.1 - 2008-12-12
#	LOG fitxategi bateratua
# 1.0 - 2008-12-03
#	Hasierako bertsioa
#
### Datubasearen egitura ###
# Data DATE
# Medioa VARCHAR (12)
# Kopia INTEGER
# Byteak BIGINT
################################################################################################################


import sys, os, string, readline, commands
from datetime import date
from time import time, localtime, strftime
from pysqlite2 import dbapi2 as sqlite3
import smtplib


# Skriptaren izena
PRGNAME = "log2db"

# Non daude programa eta fitxategiak
HOMEDIR = "/datuak2/backupreports/"

LOGEATU = "BAI"

DBFILE = HOMEDIR + PRGNAME + ".sqlite"

EMAILFROM = "log2db@iurreta-institutua.net"
EMAILTO = "sare-admin@iurreta-institutua.net"
EMAILSUBJECT = "Kopia metatua"
EMAILSUBJECT2 = "Kontuz!!!"
EMAILSUBJECT3 = "Desastre!!!"
EMAILSERVER = "localhost"

ZINTAMETATZEMUGA = 42000000000


#=================================================================================================================
def hartu_zintako_byteak (zinta) :
    print "Hartu zintak erabilita duen byte kopurua. Zinta::  " + zinta
    b_kop = 0
    db = sqlite3.connect(DBFILE)
    cursor = db.cursor()
    cursor.execute("SELECT Byteak, Kopia FROM backupreports WHERE Medioa = '" + zinta + "'")
    lerroak = cursor.fetchall()
    for line in lerroak :
#	print line
	b_kop = b_kop + line[0]
#    print line[1]
    cursor.close()
    db.close()
    return b_kop


def bilatu_kopia (zinta, kopia) :
    print "Bilatzen " + zinta + "-ko " + str(kopia) + ". kopia."
    e_kop = 0
    db = sqlite3.connect(DBFILE)
    cursor = db.cursor()
    cursor.execute("SELECT Kopia FROM backupreports WHERE Medioa = '" + zinta + "' AND Kopia = '" + kopia + "'")
    lerroak = cursor.fetchall()
    for line in lerroak :
#	print line
	e_kop = e_kop + 1
    cursor.close()
    db.close()
    return e_kop


def sartu_backup_datuak (data, zinta, kopia, byteak) :
    print "Sartu segurtasun kopiaren datuak datu-basean. Data: " + data + " - Zinta: " + zinta + " - Kopia: " + str(kopia) + " - Byteak: " + str(byteak)
    db = sqlite3.connect(DBFILE)
    cursor = db.cursor()
    cursor.execute("INSERT INTO backupreports(Data, Medioa, Kopia, Byteak) VALUES (?, ?, ?, ?)", (data, zinta, kopia, byteak))
    db.commit()
    cursor.close()
    db.close()
    return 0


def sortu_datubasea () :
    print "Backup datu-basea sortzen\n"
    db = sqlite3.connect(DBFILE)
    cursor = db.cursor()
    cursor.execute("CREATE TABLE backupreports (Data TIMESTAMP, Medioa VARCHAR(12), Kopia INTEGER, Byteak INTEGER)")
    db.commit()
    cursor.close()
    db.close()
    return 0
#=================================================================================================================

def aztertu_fitxategia (FILEA) :
    kopia = 0
    kopia2 = 0
    byteak = 0
    byteak2 = 0
    errorea = 0
    zinta = ""
    data3 = ""
    # Elkartuz programako datuekin sorturiko fitxategia
    backregfile = open(FILEA)                         # Fitxategia ireki
    for line in backregfile.readlines() :                # Lerro guztiak irakurri
    #    print "\nLine::: " + line

        # Lerroa, zutabeetan zatitu
        lerroa = line.split(" ", 9)
        hitza = lerroa[0].strip()

        # Zintaren izena
        if hitza == "Nombre" :
    	    zinta = lerroa[3].strip().replace("\"", "")
	# Byte kopurua (lehenengo eta bigarren kopia)
	if hitza == "Bytes:" :
	    if byteak == 0 :
		byteak = int(lerroa[1].strip().replace(".",""))
	    else :
		byteak2 = int(lerroa[1].strip().replace(".",""))
	# data
	if hitza == "La" :
	    data = lerroa[7].strip()
	    data2 = data.split("/", 3)
	    data3 = data2[2] + "-" + data2[1] + "-" + data2[0]
	# Kopiaren zenbakia (lehenengo eta bigarren kopia)
	if hitza == "Conjunto" :
	    if kopia == 0 :
		kopia = int(lerroa[6].strip())
	    else :
		kopia2 = int(lerroa[6].strip())
	# Ezin izan bada kopiarik egin (zinta ez dago sartuta edo ez da espero duena)
	if hitza == "No" :
	    errorea = 1
	    backregfile.close()
	    return errorea, zinta, kopia, kopia2, byteak, byteak2, data3

    backregfile.close()

    return errorea, zinta, kopia, kopia2, byteak, byteak2, data3
    
#=================================================================================================================
# KONTUZ!!!! Mezuaren gorputzaren lehenengo hitzaren atzetik ":" karakterea jartzen bada, ez du bidaltzen mezuaren gorputza.
def bidali_posta (gaia, mezua):
    server = smtplib.SMTP(EMAILSERVER)
#    server.set_debuglevel(1)
    print mezua
#    msg = ("From: " + EMAILFROM + "\r\nTo: " + EMAILTO + "\r\nSubject: " + gaia + "\r\n" + mezua)
    msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n" % (EMAILFROM, (EMAILTO), (gaia)))
    msg = msg + mezua
    server.sendmail(EMAILFROM, EMAILTO, msg)
    server.quit()

#=================================================================================================================
def utf8ra_pasatu_fitxategia (BACKLOGFILE) :
    # Fitxategiaren karaktere kodeaketa begiratu
    # Unicode baldin bada, UTF-8ra pasatu.
    # UTF-8 bada, ez ezer egin
    filemota = commands.getstatusoutput("file " + BACKLOGFILE)
    lerroa = filemota[1].split(" ", 7)
    #print filemota
    #print lerroa[1]
    if lerroa[1] != "UTF-8" :
	emaitza = commands.getstatusoutput("recode unicode..utf8 " + BACKLOGFILE)

#=================================================================================================================
def laburpena_pantailaratu (line, zinta, kopia, kopia2, byteak, byteak2, data3) :
    print "Laburpena:::"
    print "Fitxategia: " + line
    print "Data: " + data3
    print "Zinta: " + zinta
    print "Kopia: " + str(kopia)
    print "Byteak: " + str(byteak)
    if kopia2 != 0 :
	print "Kopia: " + str(kopia2)
        print "Byteak: " + str(byteak2)

#=================================================================================================================


# Erregistro fitxategiaren izena...
gaur_d = date.today()
TIMESTAMP = gaur_d.strftime("%Y%m%d") + "-" + strftime("%H%M", localtime())
LOGFILE = HOMEDIR + PRGNAME + ".log"

# Erregistroa idazteko fitxategia ireki
if LOGEATU == "BAI" :
    logfile = open (LOGFILE, "a")
    logfile.write("\n======= Saiakera data: " + TIMESTAMP + " =======\n")


# Datu-basea ez bada existitzen, sortu
if os.path.exists (DBFILE) :
    print "Datubasea badago jada...."
else :
    sortu_datubasea()


# Hartu direktorioko errreporte fitxategiak
emaitza = commands.getstatusoutput("ls " + HOMEDIR + "backup*.log")
filea = emaitza[1].split("\n", 10)

for line in filea :
    datuak_sartuak = "EZ"

    utf8ra_pasatu_fitxategia (line)

    filemota = os.stat(line)
#    print filemota[6]
    if filemota[6] :
	errorea, zinta, kopia, kopia2, byteak, byteak2, data3 = aztertu_fitxategia(line)
	if errorea :
	    print "Akats bat gertatu da. Ez dago kopia daturik fitxategian"
	    continue
    else :
	print '"' + line + '" Fitxategia hutsirik. Zinta kanporatua!'
	if LOGEATU == "BAI" :
    	    logfile.write("\nFitxategia hutsirik. Zinta kanporatua!:: " + line + "\n")
	mezua = '"' + line + '" Fitxategia hutsirik. Zinta kanporatua!'
	bidali_posta (EMAILSUBJECT3, mezua)
	continue

    laburpena_pantailaratu (line, zinta, kopia, kopia2, byteak, byteak2, data3)

    if LOGEATU == "BAI" :
        logfile.write("\nFtxategia:: " + line + "\n")
        logfile.write("Data: " + data3 + "\n")
        logfile.write("Zinta: " + zinta + "\n")
        logfile.write("Kopia: " + str(kopia) + "\n")
        logfile.write("Byteak: " + str(byteak) + "\n")
        if kopia2 != 0 :
    	    logfile.write("Kopia: " + str(kopia2) + "\n")
    	    logfile.write("Byteak: " + str(byteak2) + "\n")

    erantzuna = bilatu_kopia(zinta, str(kopia))
    if erantzuna :
	print "Badago sartuta: " + zinta + " -- " + str(kopia)
	if LOGEATU == "BAI" :
    	    logfile.write("Badago sartuta: " + zinta + " -- " + str(kopia) + "\n")
# 2009-02-20
#	continue

    else :
	print "Ez dago sartuta: " + zinta + " -- " + str(kopia)
	if LOGEATU == "BAI" :
    	    logfile.write("Ez dago sartuta: " + zinta + " -- " + str(kopia) + "\n")
	# Sartu datuak datu-basera
	sartu_backup_datuak(data3, zinta, kopia, byteak)
	datuak_sartuak = "BAI"
	# Mezua bidali administrariari posta elektronikoz
        mezua = 'Backupreports +++ ' + data3 + " ++ Zinta: " + zinta + " ++ Kopia: " + str(kopia) + " ++ Byteak: " + str(byteak)
        print "Mezua ::: " + mezua
        bidali_posta (EMAILSUBJECT, mezua)
	

    # Bigarren kopia badago
    if kopia2 != 0 :
        erantzuna = bilatu_kopia(zinta, str(kopia2))
        if erantzuna :
            print "Badago sartuta: " + zinta + " -- " + str(kopia2)
	    if LOGEATU == "BAI" :
    		logfile.write("Badago sartuta: " + zinta + " -- " + str(kopia2) + "\n")
	else :
            print "Ez dago sartuta: " + zinta + " -- " + str(kopia2)
	    if LOGEATU == "BAI" :
    		logfile.write("Ez dago sartuta: " + zinta + " -- " + str(kopia2) + "\n")
	    # Sartu datuak datu-basera
	    sartu_backup_datuak(data3, zinta, kopia2, byteak2)
	    datuak_sartuak = "BAI"
	    # Mezua bidali administrariari posta elektronikoz
	    mezua = 'Backupreports +++  ' + data3 + " ++ Zinta: " + zinta + ' ++ Kopia: ' + str(kopia2) + ' ++ Byteak: ' + str(byteak2)
	    bidali_posta (EMAILSUBJECT, mezua)
	

    # Kalkulatu zintak metatu duen byte kopurua
    if datuak_sartuak == "BAI" :
	guztira = hartu_zintako_byteak (zinta)
        print "Guztira zintan:::   " + str(guztira) + " byte.\n"
	if LOGEATU == "BAI" :
    	    logfile.write("Guztira zintan: " + str(guztira) + " byte.\n")

	if guztira > ZINTAMETATZEMUGA :
	    mezua = '"' + zinta + '" Zintan metatutako byte kopurua: ' + str(guztira) + " byte da."
	    bidali_posta (EMAILSUBJECT2, mezua)
	    if LOGEATU == "BAI" :
    		logfile.write("Zintan metatze muga gainditua. e-posta bidalia.\n")


if LOGEATU == "BAI" :
    logfile.close()

sys.exit(0)

