Esempio n. 1
0
def db_backup(timestamp):
    import shutil
    import M_RC
    shutil.copy2(M_CONF.NomeDB, M_CONF.NomeArchivi + "/" + timestamp + "_" + M_CONF.NomeDB)             #Copio il DB in Archivi
    DB.connetti()
    DB.esegui("""VACUUM""")                                                                             #DOPO che l'ho backuppato, lo comprimo.
    DB.salva()
    DB.disconnetti()
    M_RC.scrivilog("DB backup done.", M_CONF.activity)
Esempio n. 2
0
def crashlog(t, v, tra):
    """gestisce i crash del programma, scrivendo l'errore nel file di log"""
    import traceback
    evento = "\r\n REDCAP CRASH:: "
    for stringa in traceback.format_tb(tra):
        evento += str(stringa)
    for stringa in traceback.format_exception_only(sys.last_type, sys.last_value):
        evento += str(stringa)
    M_RC.scrivilog(evento, M_CONF.crashlog)
    sys.exit()
Esempio n. 3
0
def db_clean_guid():
    """pulizia periodica DB dai record non piu utilizzati"""
    import M_RC
    DB.connetti()
    res = DB.esegui(DB.query["cleanoldplayers"], (time.time(), float(M_CONF.maxAbsence*86400), time.time())).fetchall()
    for guid in res:
        for tab in tabs:
            DB.esegui(DB.query["delplayer"] % (tab, guid[0]))  #Elimino guid che non frequentano piu' il gameserver da M_CONF.maxAbsence giorni.
    DB.salva()
    DB.disconnetti()
    M_RC.scrivilog("DB old record cleaned.", M_CONF.activity)
Esempio n. 4
0
def crashlog(t, v, tra):
    """gestisce i crash del programma, scrivendo l'errore nel file di log"""
    import traceback
    evento = "\r\n REDCAP CRASH:: "
    for stringa in traceback.format_tb(tra):
        evento += str(stringa)
    for stringa in traceback.format_exception_only(sys.last_type,
                                                   sys.last_value):
        evento += str(stringa)
    M_RC.scrivilog(evento, M_CONF.crashlog)
    sys.exit()
Esempio n. 5
0
def log_backup(timestamp):
    """Esegue il backup del file di log."""
    import os
    import re
    import M_RC
    logfile = open(M_CONF.NomeFileLog, "r")
    contenuto = logfile.read()          #leggo il log
    logfile.close()
    contenuto=re.sub(r"Item: .* ","",contenuto) #elimino le voci Item
    logfile = open(M_CONF.NomeArchivi + "/" + timestamp + ".log", "w")
    logfile.write(contenuto)              #creo il file di log in Archivi
    logfile.close()
    M_RC.scrivilog("UrT Log backup done.", M_CONF.activity)
    os.remove(M_CONF.NomeFileLog)   #cancello il vecchio file
Esempio n. 6
0
def cr_riavvia():
    """restarto RedCap ed eventualmente il server"""
    import os
    import sys
    import M_RC
    if M_CONF.gameserver_autorestart > 0:
        M_RC.scrivilog(" Redcap and UrT Server restarted.", M_CONF.activity)
        os.system("./S_full_restart.sh")
        time.sleep(5)                                                                                   #aspetto che il gameserver riparta
        sys.exit()
    else:
        M_RC.scrivilog("Redcap restarted.", M_CONF.activity)
        M_RC.SCK.cmd("exec " + M_CONF.SV_Baseconf)                                                      #ricarico il config
        time.sleep(5)                                                                                   #aspetto che il gameserver riparta
        sys.exit()
Esempio n. 7
0
def db_clean_IP():
    """Elimino gli alias in eccedenza"""
    import M_RC
    j2 = " "
    DB.connetti()
    res = DB.esegui(DB.query["cleanIP"]).fetchall()
    for player in res:
        newIP = ""
        IPs = player[1].split(j2)
        IPs.reverse()
        IPs = IPs[0:15]                                                                                 #Limito a 15 IP memorizzati
        for IP in IPs:
            newIP += (IP + j2)
        newIP = newIP.rstrip()
        DB.esegui(DB.query["cleanedIP"],(newIP, player[0]))
    DB.salva()
    DB.disconnetti()
    M_RC.scrivilog("Old IP cleaned.", M_CONF.activity)
Esempio n. 8
0
def db_clean_alias():
    """Elimino gli alias in eccedenza"""
    import M_RC
    j2 = "  "
    DB.connetti()
    res = DB.esegui(DB.query["cleanalias"]).fetchall()
    for player in res:
        newalias = ""
        aliases = player[1].split(j2)
        aliases.sort()
        aliases.reverse()
        aliases = aliases[0:M_CONF.maxAlias]
        for alias in aliases:
            newalias += (alias + j2)
        newalias = newalias.rstrip()
        DB.esegui(DB.query["cleanedalias"],(newalias, player[0]))
    DB.salva()
    DB.disconnetti()
    M_RC.scrivilog("DB alias cleaned.", M_CONF.activity)
Esempio n. 9
0
def web_FTPtransfer(filefrom, fileto):
    """trasferisce un file sul webserver ausiliario"""
    esito = True
    import M_RC
    from ftplib import FTP
    htmlfile = open(filefrom, "rb")
    try:
        connessione = FTP(M_CONF.w_url)
        connessione.login(M_CONF.w_login, M_CONF.w_password)   # connect to host, default port
        connessione.cwd(M_CONF.w_ftp_directory)
        connessione.storbinary('STOR ' + fileto, htmlfile)
        connessione.quit()
    except:
        esito = False
    finally:
        htmlfile.close()
        if esito:
            M_RC.scrivilog("File %s transfer OK." %filefrom, M_CONF.activity)
        else:
           M_RC.scrivilog("File %s transfer not achieved." %filefrom, M_CONF.activity)
Esempio n. 10
0
def log_chat_backup(timestamp):
    """crea un file di chat"""
    import re
    import M_RC
    logfile = open(M_CONF.NomeFileLog, "r")
    dialoghi = logfile.read()   #Estraggo i dialoghi
    logfile.close()
    dialoghi = dialoghi.replace("<", "&lt;")
    dialoghi = dialoghi.replace(">", "&gt;")
    says=re.findall(r"say: (?P<colore>\d+) (?P<nick>.*): (?P<frase>.*)", dialoghi)
    #creo il file dei dialoghi
    html = "<table class='dialoghi'>" #preparo la tabella e inserisco i dialoghi
    for say in says:
        if say[2].find("!sk") != -1 or say[2].find("!z") != -1 or say[2].find("!al") != -1:
            continue #elimino comandi inutili
        html +="<tr><td>"
        html += "<span style='color:" + colori[say[0]] + "'>" +say[1] + "</span></td><td style='color:#bbbbbb'>" + say[2]
        html +="</td></tr>\n"
    html +="</table>"
    logfile = open(M_CONF.NomeArchivi + "/" + timestamp + "_saylog.log", "w")                           #salvo il tutto in un file
    logfile.write(html)
    logfile.close()
    M_RC.scrivilog("UrT Chatlog backup done.", M_CONF.activity)
Esempio n. 11
0
def check_gameserver():
    """Check if gameserver is on"""
    import M_RC
    M_RC.ini_clientlist()
Esempio n. 12
0
def redcap_main():
    """Routine principale"""
    no_news = 0                                                                             #sensore di inattività serve
    while 1:
        M_RC.sleep(M_CONF.TempoCiclo)                                                       #wait for a cycletime
        no_news += M_CONF.TempoCiclo                                                        #nessuna news dal log
        if PARSER.novita():                                                                 #log check
            no_news = 0                                                                     #se ho parsato qualcosa azzero il sensore
            for frase in PARSER.outputs:                                                    #frase[0]=contenuto, frase[1]=tipo di frase (assigned from PARSER)
                if frase[1] == "InitGame":
                    M_RC.initGame(frase[0])                                                 #aggiorno le cvars del server CVARS = [matchmode, gametype,maxclients,mapname]
                    continue
                elif frase[1].find("Client") !=  -1:                                        #gestisco le frasi Client indirizzando alla funzione appropriata (i comandi li parso anche in fase di startup)
                    exec("M_RC.%s(frase[0])"%frase[1].lower())
                    continue
                elif frase[1] == "Comandi":                                                 #COMANDI frase[0] (0,0=id, 0,1=comando)
                    M_RC.comandi(frase[0])                                                  #passo richiedente e parametri alla funzione comandi del modulo M_RC
                    continue
                elif frase[1] == "InitRound":
                    M_RC.initRound(frase[0])
                    continue
                if M_RC.GSRV.Server_mode > 2:                                               #ALTRI EVENTI da processare solo a startup finito e non in war (0 = fase avvio 2 = warmode  3 = silentmode 5 = normale)
                    if frase[1] == "Hits":
                        M_RC.hits(frase[0])                                                 #del tipo (['1', '0', '3', '5'], 'Hits') Vittima, Killer, Zona, Arma
                        continue
                    elif frase[1] == "Says":                                                #SAY frase[0] (0,0=id, 0,1=testo)
                        M_RC.says(frase[0])
                        continue
                    elif frase[1] == "Radio":                                                #SAY frase[0] (0,0=id, 0,1=msg del tipo "x - y")
                        M_RC.radio(frase[0])
                        continue
                    elif frase[1] == "Kills":                                               #del tipo (['0', '0', '10'], 'Kills')
                        M_RC.kills(frase[0])
                        continue
                    elif frase[1] == "EndRound":
                        M_RC.endRound(frase[0])
                        continue
                    elif frase[1] == "EndMap":                    
                        M_RC.endMap(frase[0])
                        continue
        if CRON1.is_time():                                                                             #ESEGUO OPERAZIONI A CRON1
            if M_RC.GSRV.Server_mode > 2:                                                               #controlli fatti solo in modalita' normale o silent.
                M_RC.cr_tbkicked()                                                                      #da fare sempre per primo
                M_RC.cr_floodcontrol()                                                                  #controllo se qualcuno ha floodato
                M_RC.cr_nickrotation()                                                                  #controllo se qualcuno fa nickrotation
                M_RC.cr_unvote()                                                                        #controllo se c'e' un voto speciale attivo
                M_RC.cr_warning()                                                                       #controllo se qualcuno ha troppi warning
                M_RC.cr_notorietycheck()                                                                #controllo notoriety bassa da fare per ultimo
            M_RC.cr_full()                                                                              #controllo se il server e' pieno o vuoto (questo controllo va fatto sempre)
            if int(CRON1.ticks % (M_CONF.Spamtime // M_CONF.CRON1)) == 0:                               #divisione modulo per intervallo di spam
                M_RC.cr_spam()                                                                          #spammo
            if CRON1.ticks == 240:                                                                      #E' passata 1 ora circa
                q3ut4_parse()                                                                           #aggiorno maplist e configs (non si sa mai...)
                CRON1.reset()
        if CRON2.is_time():                                                                             #ESEGUO OPERAZIONI A CRON2
            if int(CRON2.ticks % ((M_CONF.w_webranktime*3600) // M_CONF.CRON2)) == 0:                   #divisione modulo per intervallo di aggiornamento classifica
                if M_CONF.Website_ON:                                                                   #Se esiste un website di appoggio aggiorno la classifica, la trasferisco al server remoto e salvo il risultato dell'operazione nel log
                    M_AUX.web_rank()
                    M_AUX.web_FTPtransfer("HTML" + "/" + M_CONF.w_tabella, M_CONF.w_tabella)
            if CRON2.get_time("Ora") == M_CONF.Control_Daily:                                           #all'ora prefissata eseguo operazioni giornaliere (pulizia DB, riavvio server, etc)
                M_RC.cr_recordErase()                                                                   #Pulisco i record se del giorno (settimana, mese) prima.
                M_AUX.automaintenance()                                                                 #automanutenzione e riavvio
                # -= Non puo' leggere istruzioni oltre qui (riavvio server e redcap!) =-
        if no_news > M_CONF.GameServerDown:                                                             #il gameserver non da notizie da circa 60 sec
            M_AUX.check_gameserver()                                                                    #il log è fermo. controllo se il gameserver è up.
            no_news = 0
Esempio n. 13
0
def init_jobs():
    """attivita' da fare all'avvio di redcap"""
    M_RC.say("^2Starting RedCap...", 2)
    lista = M_RC.ini_clientlist()                                                           #recupero i client gia presenti sul server
    if lista:
        M_RC.ini_clientadd(lista)                                                               #li aggiungo
    M_RC.ini_recordlist()                                                                   #recupero i record dal server
    M_RC.ini_spamlist()                                                                     #carico la spamlist
    if M_CONF.Website_ON:                                                                   #Se esiste un website di appoggio aggiorno la classifica, la trasferisco al server remoto e salvo il risultato dell'operazione nel log
        M_RC.say("^4Webrank updating...", 2)
        res = M_AUX.web_rank()
        if res == False:
            M_RC.scrivilog("WEBRANK TRANSFER FAILED", M_CONF.crashlog)
    M_RC.say("^4Q3ut4 parsing...", 2)
    q3ut4_parse()
    M_RC.say("^2Main routine started. Waiting for players identification...", 2)
    M_RC.ini_addcfg(M_CONF.SV_Basewar)                                                      #scrivo la basewar cfg in q3ut4
    redcap_main()                                                                           #LANCIO LA PROCEDURA PRINCIPALE
Esempio n. 14
0
 def __cmd_error(self,cmd):
     """scrive il comando non inviato nel file di log di RedCap"""
     import M_RC
     if M_RC.GSRV.Attivo:
         M_RC.scrivilog("NOT SENT: %s"%cmd, M_CONF.socketlog)
Esempio n. 15
0
def redcap_main():
    """Routine principale"""
    no_news = 0  #sensore di inattività serve
    while 1:
        M_RC.sleep(M_CONF.TempoCiclo)  #wait for a cycletime
        no_news += M_CONF.TempoCiclo  #nessuna news dal log
        if PARSER.novita():  #log check
            no_news = 0  #se ho parsato qualcosa azzero il sensore
            for frase in PARSER.outputs:  #frase[0]=contenuto, frase[1]=tipo di frase (assigned from PARSER)
                if frase[1] == "InitGame":
                    M_RC.initGame(
                        frase[0]
                    )  #aggiorno le cvars del server CVARS = [matchmode, gametype,maxclients,mapname]
                    continue
                elif frase[1].find(
                        "Client"
                ) != -1:  #gestisco le frasi Client indirizzando alla funzione appropriata (i comandi li parso anche in fase di startup)
                    exec("M_RC.%s(frase[0])" % frase[1].lower())
                    continue
                elif frase[
                        1] == "Comandi":  #COMANDI frase[0] (0,0=id, 0,1=comando)
                    M_RC.comandi(
                        frase[0]
                    )  #passo richiedente e parametri alla funzione comandi del modulo M_RC
                    continue
                elif frase[1] == "InitRound":
                    M_RC.initRound(frase[0])
                    continue
                if M_RC.GSRV.Server_mode > 2:  #ALTRI EVENTI da processare solo a startup finito e non in war (0 = fase avvio 2 = warmode  3 = silentmode 5 = normale)
                    if frase[1] == "Hits":
                        M_RC.hits(
                            frase[0]
                        )  #del tipo (['1', '0', '3', '5'], 'Hits') Vittima, Killer, Zona, Arma
                        continue
                    elif frase[1] == "Says":  #SAY frase[0] (0,0=id, 0,1=testo)
                        M_RC.says(frase[0])
                        continue
                    elif frase[
                            1] == "Radio":  #SAY frase[0] (0,0=id, 0,1=msg del tipo "x - y")
                        M_RC.radio(frase[0])
                        continue
                    elif frase[
                            1] == "Kills":  #del tipo (['0', '0', '10'], 'Kills')
                        M_RC.kills(frase[0])
                        continue
                    elif frase[1] == "EndRound":
                        M_RC.endRound(frase[0])
                        continue
                    elif frase[1] == "EndMap":
                        M_RC.endMap(frase[0])
                        continue
        if CRON1.is_time():  #ESEGUO OPERAZIONI A CRON1
            if M_RC.GSRV.Server_mode > 2:  #controlli fatti solo in modalita' normale o silent.
                M_RC.cr_tbkicked()  #da fare sempre per primo
                M_RC.cr_floodcontrol()  #controllo se qualcuno ha floodato
                M_RC.cr_nickrotation()  #controllo se qualcuno fa nickrotation
                M_RC.cr_unvote()  #controllo se c'e' un voto speciale attivo
                M_RC.cr_warning()  #controllo se qualcuno ha troppi warning
                M_RC.cr_notorietycheck(
                )  #controllo notoriety bassa da fare per ultimo
            M_RC.cr_full(
            )  #controllo se il server e' pieno o vuoto (questo controllo va fatto sempre)
            if int(
                    CRON1.ticks %
                (M_CONF.Spamtime //
                 M_CONF.CRON1)) == 0:  #divisione modulo per intervallo di spam
                M_RC.cr_spam()  #spammo
            if CRON1.ticks == 240:  #E' passata 1 ora circa
                q3ut4_parse()  #aggiorno maplist e configs (non si sa mai...)
                CRON1.reset()
        if CRON2.is_time():  #ESEGUO OPERAZIONI A CRON2
            if int(
                    CRON2.ticks %
                ((M_CONF.w_webranktime * 3600) // M_CONF.CRON2)
            ) == 0:  #divisione modulo per intervallo di aggiornamento classifica
                if M_CONF.Website_ON:  #Se esiste un website di appoggio aggiorno la classifica, la trasferisco al server remoto e salvo il risultato dell'operazione nel log
                    M_AUX.web_rank()
                    M_AUX.web_FTPtransfer("HTML" + "/" + M_CONF.w_tabella,
                                          M_CONF.w_tabella)
            if CRON2.get_time(
                    "Ora"
            ) == M_CONF.Control_Daily:  #all'ora prefissata eseguo operazioni giornaliere (pulizia DB, riavvio server, etc)
                M_RC.cr_recordErase(
                )  #Pulisco i record se del giorno (settimana, mese) prima.
                M_AUX.automaintenance()  #automanutenzione e riavvio
                # -= Non puo' leggere istruzioni oltre qui (riavvio server e redcap!) =-
        if no_news > M_CONF.GameServerDown:  #il gameserver non da notizie da circa 60 sec
            M_AUX.check_gameserver(
            )  #il log è fermo. controllo se il gameserver è up.
            no_news = 0
Esempio n. 16
0
def init_jobs():
    """attivita' da fare all'avvio di redcap"""
    M_RC.say("^2Starting RedCap...", 2)
    lista = M_RC.ini_clientlist()  #recupero i client gia presenti sul server
    if lista:
        M_RC.ini_clientadd(lista)  #li aggiungo
    M_RC.ini_recordlist()  #recupero i record dal server
    M_RC.ini_spamlist()  #carico la spamlist
    if M_CONF.Website_ON:  #Se esiste un website di appoggio aggiorno la classifica, la trasferisco al server remoto e salvo il risultato dell'operazione nel log
        M_RC.say("^4Webrank updating...", 2)
        res = M_AUX.web_rank()
        if res == False:
            M_RC.scrivilog("WEBRANK TRANSFER FAILED", M_CONF.crashlog)
    M_RC.say("^4Q3ut4 parsing...", 2)
    q3ut4_parse()
    M_RC.say("^2Main routine started. Waiting for players identification...",
             2)
    M_RC.ini_addcfg(M_CONF.SV_Basewar)  #scrivo la basewar cfg in q3ut4
    redcap_main()  #LANCIO LA PROCEDURA PRINCIPALE