/** * Gestore amichevole degli errori * @see http://www.php.net/manual/en/function.set-error-handler.php */ function gestore_errori($livello, $messaggio, $file = 'Nessun file specificato', $linea = 0, $contesto = []) { global $_id_richiesta, $me, $sessione, $conf; // Carica MErrore anche se l'autoloading e' stato disabilitato _gaia_autoloader('MErrore'); // Ignora gli errori poco importanti if ($livello > ERRORIAMICHEVOLI_MINIMO) { return true; } try { $e = new MErrore(); } catch (Exception $e) { // Non riuscito, fallback alla modalita' classica... gestione_errori_fallback($livello, $messaggio, $file, $linea, $contesto); return true; } // Genera ID richiesta if (!$_id_richiesta) { $_id_richiesta = md5(microtime() . rand(500, 999)); } $codice = sha1(microtime() . rand(10000, 99999)); $e->update(['codice' => $codice, 'richiesta' => $_id_richiesta, 'livello' => $livello, 'timestamp' => (int) time(), 'messaggio' => $messaggio, 'file' => $file, 'linea' => (int) $linea, 'ambiente' => ['server' => $_SERVER, 'get' => $_GET, 'post' => $_POST], 'sessione' => $sessione->id, 'utente' => $me->id]); // Salta redirect nel caso di modalita' debug if ($conf['debug']) { return false; } // Eventualmente redirige alla pagina errore fatale if ($livello == E_ERROR || $livello == E_USER_ERROR) { redirect("errore.fatale&errore={$e}"); } return true; }
function cronjobGiornaliero() { global $log, $db, $cache; $ok = true; /* === 0. PERSISTE LA CACHE SU DISCO */ cronjobEsegui("Persistere la cache di Redis su disco", function () use($cache) { if ($cache) { $cache->save(); } return true; }, $log, $ok); cronjobEsegui("Cancellare file scaduti da disco e database", function () { $n = 0; foreach (File::scaduti() as $f) { $f->cancella(); $n++; } return "Cancellati {$n} file scaduti"; }, $log, $ok); cronjobEsegui("Autorizzare estensioni dopo 30gg, con notifica ai volontari", function () { $n = 0; foreach (Estensione::daAutorizzare() as $e) { $e->auto(); $n++; } return "Concesse {$n} estensioni"; }, $log, $ok); cronjobEsegui("Terminare estensioni", function () { $n = 0; foreach (Estensione::daChiudere() as $e) { $e->termina(); $n++; } return "Chiuse {$n} estensioni"; }, $log, $ok); cronjobEsegui("Autorizzare trasferimenti dopo 30gg, notifica e chiusura sospesi e turni", function () { $n = 0; foreach (Trasferimento::daAutorizzare() as $t) { $t->auto(); $n++; } return "Autorizzati {$n} trasferimenti"; }, $log, $ok); cronjobEsegui("Autorizzare riserve dopo 30gg", function () { $n = 0; foreach (Riserva::daAutorizzare() as $r) { $r->auto(); $n++; } return "Autorizzate {$n} riserve"; }, $log, $ok); cronjobEsegui("Pulitura e fix delle attività", function () { $n = 0; $n = Attivita::pulizia(); return "Fix di {$n} attività"; }, $log, $ok); cronjobEsegui("Rigenerazione albero dei comitati", function () { GeoPolitica::rigeneraAlbero(); return true; }, $log, $ok); cronjobEsegui("Chiusura validazioni scadute", function () { Validazione::chiudi(); return true; }, $log, $ok); cronjobEsegui("Rimozione errori vecchi di una settimana", function () { $n = MErrore::pulisci(); return "Cancellati log di {$n} errori in database"; }, $log, $ok); /**************************************************** * MODULO FORMAZIONE ****************************************************/ // Creo i certificati per i corsi superati cronjobEsegui("Cerca i corsi in stato da elaborare e genera i relativi certificati", function () { $n = Corso::chiudiCorsi(); return "Generati ({$n}) certificati"; }, $log, $ok); return $ok; }
/** * Cronjob: Cancella gli errori piu' vecchi di una settimana * @return int Numero di errori cancellati */ public static function pulisci() { $limite = strtotime('-1 weeks'); return MErrore::remove(['$or' => [['timestamp' => ['$exists' => false]], ['timestamp' => ['$lte' => $limite]]]])['n']; }
<?php /** * (c)2014 Croce Rossa Italiana */ paginaAdmin(); $minimo = !empty($_GET['minimo']) ? (int) $_GET['minimo'] : 1; $massimo = !empty($_GET['massimo']) ? (int) $_GET['massimo'] : ERRORIAMICHEVOLI_MINIMO; $limite = !empty($_GET['limite']) ? (int) $_GET['limite'] : 500; if (!empty($_GET['ricErr'])) { //ricerca su tutti gli errori appartenenti ad una richieste o sessione $errori = MErrore::find(['livello' => ['$gte' => $minimo, '$lte' => $massimo], '$or' => [['sessione' => $_GET['ricErr']], ['richiesta' => $_GET['ricErr']]]])->sort(['_id' => -1])->limit($limite); } else { //ricerca su tutti gli errori $errori = MErrore::find(['livello' => ['$gte' => $minimo, '$lte' => $massimo]])->sort(['_id' => -1])->limit($limite); } ?> <div class="row-fluid"> <div class="span7"> <h3><i class="icon-list"></i> Log degli ultimi errori su Gaia</h3> </div> <div class="span5"> <form action="index.php" method="GET"> <input type="hidden" name="p" value="admin.errori.dettagli" /> <div class="input-append"> <input type="text" name="id" placeholder="Codice errore..." class="input-medium" required /> <button type="submit" class="btn"> <i class="icon-search"></i> Cerca per id o codice </button>
<?php /** * (c)2014 Croce Rossa Italiana */ paginaAdmin(); try { $id = new MongoId($_GET['id']); } catch (Exception $e) { $id = "unacosachenonesiste"; } try { $errore = MErrore::findOne(['$or' => [['_id' => $id], ['codice' => $_GET['id']]]]); } catch (Exception $e) { die("Non nel formato corretto."); } if (!$errore) { die("Errore non trovato."); } ?> <div class="row-fluid"> <div class="span8"> <h3><i class="icon-info-sign"></i> Dettagli del singolo errore</h3> </div> <div class="span4"> <a class="btn btn-large btn-block" href="?p=admin.errori"> <i class="icon-reply"></i> Torna indietro </a> </div> </div>