INSTALLATION ASTERISK-STATS

Outils d'analyse des logs d'Asterisk Site web : http://areski.net/asterisk-stat-v2/about.php

NB : ces notes sont écrites après une journée de "dur boulot" :(


NB: Notez qu'Asterisk est capable d'écrire directement les CDR dans une série de base de données (en natif dans PostgreSQL/TDS/ODBC/SQLite et avec asterisk-addons dans MySQL). Si vous utilisez déjà un pilote CDR base de données (cdr_*.conf) vous n'aurez besoin ni de cette importation des CDR CSV, ni du cron décrit ci-dessous.

<?php

//*** process asterisk cdr file (Master.csv) insert usage 
// * values into a mysql database which is created for use
// * with the Asterisk_addons cdr_addon_mysql.so 
// * The script will only insert NEW records so it is safe 
// * to run on the same log over-and-over such as in the 
// * case where logs have not been rotated. 
// * 
// * Author: John Lange ( john.lange@open-it.ca ) 
// * Date: May 4, 2005. Updated July 21, 2005 
// * 
// * Here is what the script does: 
// * 
// * 1) Find the last log entry in the database cdr table. 
// * 2) scan the asterisk logs until the dates are larger than the last log entry (so we don't duplicate entries) 
// * 3) parse each row from the text log and insert it into the database. 
// *

 $locale_db_host  = 'localhost';

 $locale_db_name  = '.......'; //ajuster

 $locale_db_login = '.....';   //ajuster

 $locale_db_pass  = '.......';  //ajuster


if($argc == 2) {
    $logfile = $argv[1];
} else {
    print("Usage ".$argv[0]." <filename>\n");
    print("Where filename is the path to the Asterisk csv file to import (Master.csv)\n");
    print("This script is safe to run multiple times on a growing log file as it only imports records that are newer than the database\n");
    exit(0);
}

// connect to db
$link = mysql_connect($locale_db_host, $locale_db_login, $locale_db_pass);
if (!$link) {
   die('Could not connect: ' . mysql_error());
   }

//echo "Connected successfully\n";
mysql_select_db($locale_db_name, $link) or die("Could not select database $locale_db_name");

/** 1) Find the last log entry **/
// look in cdr table to see when the last entry was made.
// this establishes the starting point for the asterisk data.
$sql="SELECT UNIX_TIMESTAMP(calldate) as calldate".
    "  FROM cdr".
    " ORDER BY calldate DESC".
    " LIMIT 1";

if(!($result = mysql_query($sql, $link))) {
    print("Invalid query: " . mysql_error()."\n");
    print("SQL: $sql\n");
    die();
}
$result_array = mysql_fetch_array($result);
//$lasttimestamp = date("Y-m-d H:i:s", $result_array['voip_stamp']);
$lasttimestamp = $result_array['calldate'];

//** 2) Find new records in the asterisk log file. **

$rows = 0;
$handle = fopen($logfile, "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    // NOTE: the fields in Master.csv can vary. This should work by default on all installations but you may have to edit the next line to match your configuration
    list($accountcode,$src, $dst, $dcontext, $clid, $channel, $dstchannel, $lastapp, $lastdata, $start, $answer, $end, $duration,
     $billsec, $disposition, $amaflags ) = $data;

    // 3) parse each row and add to the database
    if(strtotime($end) > $lasttimestamp) { // we found a new record so add it to the DB
        $sql = "INSERT INTO cdr (calldate, clid, src, dst, userfield, channel, dstchannel, lastapp, lastdata, duration, billsec, disposition, amaflags, accountcode)
                   VALUES('$end', '".mysql_real_escape_string($clid)."', '$src', '$dst', '$dcontext', '$channel', '$dstchannel', '$lastapp', '$lastdata', '$duration', '$billsec',
                    '$disposition', '$amaflags', '$accountcode')";
        if(!($result2 = mysql_query($sql, $link))) {
            print("Invalid query: " . mysql_error()."\n");
            print("SQL: $sql\n");
            die();
        }
        $rows++;
    }
}
fclose($handle);

print("$rows imported\n");

?>

ASTUCES : pour récuperer tous les logs (y compris ceux déjà archivés), créer un fichier tous-les-log.csv (cat /var/log/asterisk/cdr-csv/Master.csv* >> tous-les-log.csv)

Lancer l'importation : php importcdr.php tous-les-log.csv

NB: Il faudra créer, après, une tâche cron, pour lancer régulièrement l'importation.

Pour utiliser l'application, taper http://votre-serveur/asterisk-stats, et voilà.

Voici ce que ça donne à Montréal : http://tech.auf/stats-voip/?s=1, choisir un intervalle de date et cliquer sur "Search".

Respect de la confidentialité

Voici un petit script réalisé par Tini pour anonymiser un peu nos stats :

# -*-cperl-*-
# /usr/local/sbin/asterisk-anonymize-csv.pl

# mettez ici les 5 premiers chiffres de votre implantation
# (un guru Perl pourrait récupérer ça de la conf' asterisk...)
$PREFIX = "00844";

while(<>)
{
  chomp;

  s:IAX2/[a-z][^"]*":IAX2/XXX":gi;
  s:IAX2_[a-z][^/]*/:IAX2_XXX/:gi;
  my @tableau=split(/,/);

  $tableau[1] =~ s/(\d{5})\d*/$1.../;
  $tableau[2] =~ s/(\d{5})\d*/$1.../;
  $tableau[2] = '"'.$PREFIX.'..."' if $tableau[2] =~ /^"[1-9]/;
  $tableau[4] = '"XXX"';
  $tableau[8] =~ s/\d+/XXX/ if $tableau[7] =~ /VoiceMail/;
  print join(",",@tableau),"\n";
}

Il s'utilise simplement comme un filtre : asterisk-anonymize-csv.pl <Master.csv >Master-anonyme.csv

Vous pouvez également l'utiliser dans la rotation des logs pour générer automatiquement un fichier de stats anonyme mensuel. Pour cela modifiez le fichier /etc/logrotate.d/asterisk comme suit :

/var/log/asterisk/debug /var/log/asterisk/event_log /var/log/asterisk/messages /var/log/asterisk/cdr-csv/Master.csv {
        monthly
        missingok
        rotate 12
        sharedscripts
        prerotate
                today=$(date +%Y-%m-%d)
                /usr/local/sbin/asterisk-anonymize-csv.pl </var/log/asterisk/cdr-csv/Master.csv >/srv/www/cia/Master-${today}.csv
                /usr/local/sbin/asterisk-import-cdr.php /srv/www/cia/Master-${today}.csv
        endscript
        postrotate
                /usr/sbin/invoke-rc.d asterisk logger-reload
        endscript
}

Il ne vous reste alors plus qu'à rendre le répertoire /var/www/cia/ accessible en ligne.

Asterisk/Stats (dernière édition le 2008-02-21 22:09:46 par localhost)