Naja um das zu wissen wäre interessant wie dein Code aussieht - vielleicht gibts da ja auch noch was zu optimieren...amok404 hat geschrieben:Jap. Wenn jetzt php deutlich schneller ist nehm ich das!
Oscam.log Senderstatistik
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
Du musst nicht kämpfen um zu siegen
Re: Oscam.log Senderstatistik
Hier mal der code zum einlesen mit bash
Spoiler
Show
Code: Alles auswählen
#/bin/bash
if [ -e channelstat.db ]; then
echo "Datenbank existiert bereits"
else
STRUCTURE="CREATE TABLE channel (sid CHAR(4) PRIMARY KEY NOT NULL,name VARCHAR(20) NOT NULL);";
STRUCTURE2="CREATE TABLE data (id INTEGER PRIMARY KEY AUTOINCREMENT,date VARCHAR(255),count INTEGER,user VARCHAR(20) NOT NULL,sid CHAR(4) NOT NULL REFERENCES "channel" (sid));";
# Creating an Empty db file and filling it with my structure
cat /dev/null > channelstat.db
echo $STRUCTURE > /tmp/tmpstructure
echo $STRUCTURE2 > /tmp/tmpstructure2
sqlite3 channelstat.db < /tmp/tmpstructure;
sqlite3 channelstat.db < /tmp/tmpstructure2;
rm -f /tmp/tmpstructure;
rm -f /tmp/tmpstructure2;
fi
while read line
do
SID=$(echo $line | awk '{print $1}')
NAME=$(echo $line | awk '{print $2}')
#NAME=$(echo $NAME | tr "_" " ")
sqlite3 channelstat.db "INSERT INTO channel (sid,name) VALUES ('$SID','$NAME')";
done < channel
while read line2
do
clear
echo $anzahl
#echo $maxanzahl
anzahl=$(($anzahl+1))
DATE=$(echo $line2 | awk '{print $1}')
DateTime=$(echo $line2 | awk '{print $1,$2}');
TID=$(echo $line2 | awk '{print $3}')
TYPE=$(echo $line2 | awk '{print $4}')
USER=$(echo $line2 | awk '{print $5}')
CIS=$(echo $line2 | awk '{print $6}')
ECM=$(echo $line2 | awk '{print $7}')
CIS2=$(echo $CIS | tr "&" " ")
CIS2=$(echo $CIS2 | tr "/" " ")
CAID=$(echo $CIS2 | awk '{print $1}' | tr -d "(")
IDENT=$(echo $CIS2 | awk '{print $2}')
SID=$(echo $CIS2 | awk '{print $4}')
DateTime=$(echo $DateTime | tr " " "_")
if [ "$ECM" = "found" ] || [ "$ECM" = "cache"* ]; then
#Datenbankabfrage
SQLData=`sqlite3 channelstat.db "SELECT id,user,sid,count,date from data where user='$USER' and sid='$SID' and date='$DATE'"`;
for ROW in $SQLData; do
sqlid=`echo $ROW | awk '{split($0,a,"|"); print a[1]}'`
sqluser=`echo $ROW | awk '{split($0,a,"|"); print a[2]}'`
sqlsid=`echo $ROW | awk '{split($0,a,"|"); print a[3]}'`
sqlcount=`echo $ROW | awk '{split($0,a,"|"); print a[4]}'`
sqldate=`echo $ROW | awk '{split($0,a,"|"); print a[5]}'`
done
#Vergleichen ob User schon Kanal guckt
if [ "$SID" = "$sqlsid" ] && [ "$USER" = "$sqluser" ] && [ "$DATE" = "$sqldate" ]; then
COUNT=$(($sqlcount+1))
sqlite3 channelstat.db "UPDATE data SET count = "$COUNT" WHERE id = "$sqlid"";
else
sqlite3 channelstat.db "INSERT INTO data (date,user,sid,count) VALUES ('$DATE','$USER','$SID',"1")";
fi
fi
done
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
Hm naja ich versteh immernoch nicht was die while schleifen überhaupt einlesen?
Und was schreibst du in die extra "channel" Tabelle?
Und wie unterscheidest du ob die jeweilige Logzeile bereits verarbeitet wurde oder nicht?
Und wie unterscheidest du ob derjenige caid 1702, 1722, 1834, 1831, 1835 oder 1838 abgefragt hat? Du speicherst anscheint nur die SID aber die überschneidet sich zb auch mit UnityMedia usw
Wie sieht denn dein php code aus?
Und was schreibst du in die extra "channel" Tabelle?
Und wie unterscheidest du ob die jeweilige Logzeile bereits verarbeitet wurde oder nicht?
Und wie unterscheidest du ob derjenige caid 1702, 1722, 1834, 1831, 1835 oder 1838 abgefragt hat? Du speicherst anscheint nur die SID aber die überschneidet sich zb auch mit UnityMedia usw
Wie sieht denn dein php code aus?
Du musst nicht kämpfen um zu siegen
Re: Oscam.log Senderstatistik
Sicher, hab die Caids nicht unterschieden. Das sich die SIDs überschneiden wusste ich nicht, da ich nur SAT-TV gucke. in der Channeldatei sind die Namen mit der zugehörigen SID die ich beim ersten mal starte einlese (gut sehr stümperhaft, da sonst eine Fehlernmeldung kommt, das der Primärschlüssel (SID im diesem Fall) schon vergeben ist), die aber in meinem Fall nur mit SAT geht, da wie du ja geschrieben hast es bei Kabelnetz die gleichen gibt.
Die Idee die Logdatei alle 10sek zum Beispiel einzulesen habe ich nicht verfolgt, sondern einfach die OScam.log-prev, welche ja je nach "Datenaufkommen" alle x-Stunden neu erstellt wird und dann eingelesen wird (kann man via cron checken).
In der ersten while-schleife lese ich die besagte Channeldatei ein, und in der zweiten die angegebene OScam.log-prev
Da ich gerade öfters unterwegs bin kann ich gerade nur bedingt weiter dran basteln.
Meistens aber halt abends / nachts wenn Ruhe ist
Hier die php datei
Die Idee die Logdatei alle 10sek zum Beispiel einzulesen habe ich nicht verfolgt, sondern einfach die OScam.log-prev, welche ja je nach "Datenaufkommen" alle x-Stunden neu erstellt wird und dann eingelesen wird (kann man via cron checken).
In der ersten while-schleife lese ich die besagte Channeldatei ein, und in der zweiten die angegebene OScam.log-prev
Da ich gerade öfters unterwegs bin kann ich gerade nur bedingt weiter dran basteln.
Meistens aber halt abends / nachts wenn Ruhe ist
Hier die php datei
Spoiler
Show
Code: Alles auswählen
<?php
class MyDB extends SQLite3
{
function __construct()
{
$this->open('/tmp/channelstat.db');
}
}
$dbname = new MyDB();
error_reporting (E_ALL ^ E_NOTICE);
$query = "SELECT data.user,channel.name,data.date,data.sid,count
FROM data
INNER JOIN channel ON channel.sid=data.sid
WHERE count>50
group by channel.sid
order by count desc";
$result = $dbname->query($query);
/*
while ($row = $result->fetchArray()) {
print $row["user"] . "</br>";
print $row["name"] . "</br>";
print $row["count"] . "</br>";
echo strftime("%H:%M:%S", $row['count']*7) . "</br>";
echo "------------</br>";
}*/
require_once 'phplot.php';
$data = array();
$num = 0;
while ($row = $result->fetchArray()) {
$data[$num] = array($row["name"],$row["count"]);
$num += 1;
}
$plot = new PHPlot(800,600);
$plot->SetImageBorderType('plain');
$plot->SetPlotType('pie');
$plot->SetDataType('text-data-single');
$plot->SetDataValues($data);
# Set enough different colors;
$plot->SetDataColors(array('red', 'green', 'blue', 'yellow', 'cyan',
'magenta', 'brown', 'lavender', 'pink',
'gray', 'orange'));
# Main plot title:
$plot->SetTitle("OScam Statistik");
# Build a legend from our data array.
# Each call to SetLegend makes one line as "label: value".
foreach ($data as $row)
$plot->SetLegend(implode(': ', $row));
# Place the legend in the upper left corner:
$plot->SetLegendPixels(5, 5);
$plot->SetPieLabelType('label');
$plot->DrawGraph();
?>
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
Hm aha naja ich hab das anders gelöst
oscam.srvid für die channel namen, die man anhand caid und sid ja auslesen kann, wird nur beim aufrufen der show_stats.php ausgelesen weil zum scannen der logs brauch man die nicht... evtl. dauerts deshalb bei dir so lange?
der scanner ist bei mir auch in php geschrieben und brauch wie gesagt, jenachdem wie gross das log ist bzw wieviel logzeilen schon bearbeitet und in der oslog datenbank hinterlegt wurden, dauert das maximal 2 minuten zum scannen..
der scanner ansich wiederum wird von einem bash script alle 10 sekunden ausgeführt - dauert das scannen also länger wird der scan auch erst nach zb 2 minuten durchgeführt - am anfang dauerts aber nur umdie 2 sekunden zu scannen
das oslog wird bei mir einstellbar, ein tag später als das logfile erstellt wurde, gelöscht... oder auch 2 tage später aber eben minimum 1 tag...
allerdings ist das grösste problem das die datenbank einfach zu voll wird - irgendwann erkennt man nix mehr weil zu viele sender abgefragt wurden:
oscam.srvid für die channel namen, die man anhand caid und sid ja auslesen kann, wird nur beim aufrufen der show_stats.php ausgelesen weil zum scannen der logs brauch man die nicht... evtl. dauerts deshalb bei dir so lange?
der scanner ist bei mir auch in php geschrieben und brauch wie gesagt, jenachdem wie gross das log ist bzw wieviel logzeilen schon bearbeitet und in der oslog datenbank hinterlegt wurden, dauert das maximal 2 minuten zum scannen..
der scanner ansich wiederum wird von einem bash script alle 10 sekunden ausgeführt - dauert das scannen also länger wird der scan auch erst nach zb 2 minuten durchgeführt - am anfang dauerts aber nur umdie 2 sekunden zu scannen
das oslog wird bei mir einstellbar, ein tag später als das logfile erstellt wurde, gelöscht... oder auch 2 tage später aber eben minimum 1 tag...
allerdings ist das grösste problem das die datenbank einfach zu voll wird - irgendwann erkennt man nix mehr weil zu viele sender abgefragt wurden:
Spoiler
Show
Du musst nicht kämpfen um zu siegen
Re: Oscam.log Senderstatistik
In der PHP Datei ist die SQL Abfrage auch für alle Sender, da ist kein Filter nach Tag oder Benutzer
Man soll ja auswählen pro Benutzer/Tag, Benutzer/Woche (Top10) ,... Global Top 10/Tag, Global Top 10/Woche etc.
Dann wird schon übersichtlich. Vielleicht kannst du ja dein php code mal schicken?
Man soll ja auswählen pro Benutzer/Tag, Benutzer/Woche (Top10) ,... Global Top 10/Tag, Global Top 10/Woche etc.
Dann wird schon übersichtlich. Vielleicht kannst du ja dein php code mal schicken?
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
Ja sowas hab ich auch noch nicht drin - der zeigt bei mir auch einfach alles an was er findet allerdings pro Benutzer eine Tabelle
get_stats.php
get_stats_deamon.sh
/EDIT: show_stats.php hab ich später durch index.php ersetzt, hab in dem zip zwar beide drin aber index.php ist wie gesagt die weiterentwicklung
Spoiler
Show
Code: Alles auswählen
<?php
//v0.6
//------------------ CONFIG - START -------------------------
$DBfile = "/tmp/osstats.db";
$SRVID = "/var/etc/oscam.srvid";
$DRAWpie = 1;
//------------------ CONFIG - END ---------------------------
require('phplot.php');
error_reporting(E_ALL);
ini_set('track_errors',1);
ini_set("max_execution_time", "240");
ob_implicit_flush(true);
@ob_end_flush();
//-----------------------------------------------------------
?>
<!DOCTYPE html>
<html>
<head>
<title>OSCAM Channel Charts</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style>
table { margin: 0px; padding: 3px; border: 0px; }
th { font-family: tahoma; font-size: 11px; margin: 0px; padding: 3px; border: 0px; }
tr { margin: 0px; padding: 3px; border: 0px; }
td { font-family: tahoma; font-size: 11px; margin: 0px; padding: 3px; border: 0px; }
</style>
</head>
<?php
if (!file_exists("$DBfile")) {
$e="font-size:23px; text-align:left; color:firebrick; font-weight:bold;";
echo "<b style='".$e."'>Error: DBfile $DBfile doesnt exists! Aborting..</b><br/>\n";
exit();
}
$c=0;
$unknownchan=0;
$DURATION_start = startTime();
$db = db_con();
// collect users
$query = $db->query("SELECT user FROM osstats WHERE 1 GROUP BY user ORDER BY user ASC");
while ($result = $query->fetch(PDO::FETCH_ASSOC)) {
$user = $result["user"];
$TOTALstats["$user"] = 0;
// collect stats for each user
echo "<b>".$user."</b><br/>\n";
echo "<table border='1'>\n";
echo "<tr>";
echo "<th>CAID</th> <th>IDENT</th> <th>SID</th> <th>Count</th>";
if (file_exists("$SRVID")) { echo " <th>Channel</th>"; }
echo " <th>Time Range</th>";
echo "</tr>\n";
$query2 = $db->query("SELECT startdate,enddate,caid,ident,sid,count FROM osstats WHERE user = '".$user."' ORDER BY enddate DESC");
$cc=2;
while ($result2 = $query2->fetch(PDO::FETCH_ASSOC)) {
$bgc='';
if ($cc == 2) { $bgc = 'background-color:#dcdcdc;'; $cc=0; }
echo "<tr>\n";
echo "<td style='".$bgc."'>".$result2['caid']."</td>";
echo "<td style='".$bgc."'>".$result2['ident']."</td>";
echo "<td style='".$bgc."'>".$result2['sid']."</td>";
echo "<td style='".$bgc."' align='center'>".$result2['count']."</td>";
if (file_exists("$SRVID")) {
$ChanName = get_channelname($result2['caid'],$result2['sid']);
if (empty($ChanName)) {
$unknownchan++;
$ChanName = "<unknown".$unknownchan.">";
}
echo "<td style='".$bgc."'>".$ChanName."</td>";
#$ChannelNames["$CAID"]["$IDENT"]["$SID"] = $ChanName;
}
$StartDate = date("Y/m/d H:i:s",$result2['startdate']);
$EndDate = date("Y/m/d H:i:s",$result2['enddate']);
echo "<td style='".$bgc."' align='center'>".$StartDate." -> ".$EndDate."</td>";
echo "</tr>\n";
$c++;
$cc++;
$STATS["$user"]["$ChanName"] = $result2["count"];
$TOTALstats["$user"] += $result2["count"];
}
echo "</table><br/>\n";
$c++;
if (isset($DRAWpie) AND $DRAWpie == 1) {
// For each User -> Channel Chart
$output_file = "chanscharts_".$user.".png";
$data = array();
foreach ($STATS["$user"] AS $Channel => $COUNT) {
array_push($data,array("$Channel",$COUNT));
}
$plot = new PHPlot(1200,1200);
$plot->SetImageBorderType('plain');
$plot->SetPlotType('pie');
$plot->SetDataType('text-data-single');
$plot->SetDataValues($data);
#$plot->SetTitle("OScam - Users");
foreach ($data AS $row) {
$plot->SetLegend(implode(': ', $row));
}
# Place the legend in the upper left corner:
#$plot->SetLegendPixels(1, 1);
#$plot->SetPieLabelType('value', 'data', 0);
#$plot->SetPieLabelType(array('percent', 'label'), 'custom', 'labelcallback');
$plot->SetOutputFile($output_file);
$plot->DrawGraph();
echo "<br/><img src=\"".$output_file."\"><br/>\n";
}
}
echo "<br/>generating took ".endTime($DURATION_start)." seconds (for ".$c." entries)<br/>\n";
// Draw PIE
if (isset($DRAWpie) AND $DRAWpie == 1) {
// User Channel Chart
$output_file = "charts_users.png";
$data = array();
foreach ($TOTALstats AS $U => $COUNT) {
array_push($data,array("$U",$COUNT));
}
$plot = new PHPlot(600,400);
$plot->SetImageBorderType('plain');
$plot->SetPlotType('pie');
$plot->SetDataType('text-data-single');
$plot->SetDataValues($data);
$plot->SetTitle("OScam - Users");
foreach ($data AS $row) {
$plot->SetLegend(implode(': ', $row));
}
# Place the legend in the upper left corner:
#$plot->SetLegendPixels(5, 5);
#$plot->SetPieLabelType('value', 'data', 0);
#$plot->SetPieLabelType(array('percent', 'label'), 'custom', 'labelcallback');
$plot->SetOutputFile($output_file);
$plot->DrawGraph();
echo "<br/><img src=\"".$output_file."\"><br/>\n";
}
//______________________________________________________________________________________
function labelcallback($str) {
list($percent, $label) = explode(' ', $str, 2);
return sprintf('%s (%.1f%%)', $label, $percent);
}
function get_channelname($CAID,$SID) {
global $SRVID;
$RE = "";
$content = file("$SRVID");
for($i=0; $i<count($content); $i++) {
$line = $content[$i];
if (empty($line)) { continue; }
if (preg_match("/.*$CAID.*\:$SID.+/i",$line)) {
$tmp = explode("|",$line);
$RE = "".$tmp[1]." - ".$tmp[2]."";
break;
}
}
return $RE;
}
function db_con() {
global $DBfile;
if (!$db = new PDO("sqlite:$DBfile")) {
$e="font-size:23px; text-align:left; color:firebrick; font-weight:bold;";
echo "<b style='".$e."'>Fehler beim öffnen der Datenbank:</b><br/>";
echo "<b style='".$e."'>".$db->errorInfo()."</b><br/>";
die;
}
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $db;
}
function db_query($sql) {
global $db;
if (!isset($db) OR empty($db)) { $db = db_con(); }
$result = $db->query($sql) OR db_error($sql);
return $result;
}
function db_error($sql) {
global $db;
$error = $db->errorInfo();
die('<small><font color="#ff0000"><b>[DB ERROR]</b></font></small><br/><br/><font color="#800000"><b>'.$error.'</b><br/><br/>'.$sql.'</font>');
}
//Add HTML character incoding to strings
function db_output($string) {
return htmlspecialchars_decode($string);
}
//Add slashes to incoming data
function db_input($string) {
return htmlspecialchars($string);
}
function startTime() {
$timeExplode = explode(" ", microtime());
$time = $timeExplode[1] + $timeExplode[0];
return $time;
}
function endTime($timer) {
$timeExplode = explode(" ", microtime());
$time = $timeExplode[1] + $timeExplode[0];
$finish = $time - $timer;
$endTime = sprintf("%4.3f", $finish);
return $endTime;
}
?>
</body>
</html>
Code: Alles auswählen
<?php
//v0.6
//------------------ CONFIG - START -------------------------
$DBstats = "/tmp/osstats.db";
$DBlog = "/tmp/oslog.db";
#$OSCFG = "/var/etc/oscam.conf";
$OSLOG = "/tmp/OScam.log"; //only if $OSCFG is not set
// delete oslog database after x days.
// must be higher than logfile rotate-time..
// if maxlogsize is high and oscam is not used much, set this higher
$DELDAYloglines = "1";
//------------------ CONFIG - END ---------------------------
$SKIPlines = array('not found','rejected','timeout');
/*
TODO:
ggf. rrd Datenbank erzeugen um die Daten mit Munin anzuzeigen
*/
error_reporting(E_ALL);
ini_set('track_errors',1);
ini_set("max_execution_time", "240");
ob_implicit_flush(true);
@ob_end_flush();
if (!isset($argv[1]) OR empty($argv[1])) {
if (!isset($OSLOG) OR empty($OSLOG) OR !file_exists($OSLOG)) {
if (isset($OSCFG) AND !empty($OSCFG)) {
$OSLOG = GetCFG_OScam($OSCFG,"logfile");
} else {
if (file_exists("/var/etc/oscam.conf")) {
$OSLOG = GetCFG_OScam("/var/etc/oscam.conf","logfile");
}
}
if (!isset($OSLOG) OR empty($OSLOG)) {
if (file_exists("/var/emu/script/functions.sh")) {
ReadFUNCTIONS();
$OSLOG = str_replace("\$CAMLOGS",$CAMLOGS,$OSLOGFILE);
}
}
if (!isset($OSLOG) OR empty($OSLOG)) {
print ASCII::BOLD_RED("Error getting \$OSLOG! Check Configuration! Aborting..\n");
exit();
}
}
}
if (!isset($DELDAYloglines) OR empty($DELDAYloglines)) { $DELDAYloglines = 1; }
$dblog = db_con($DBlog);
$dbstats = db_con($DBstats);
// verify tables exists
$CreateLOG = "CREATE TABLE oslog (id INTEGER PRIMARY KEY,date INT,cis TEXT);";
$CreateSTATS = "CREATE TABLE osstats (id INTEGER PRIMARY KEY,startdate INT,enddate INT,caid TEXT,ident TEXT,sid TEXT,user TEXT,count INT);";
$sqlLOG = "SELECT count(name) FROM sqlite_master WHERE type='table' AND name='oslog'";
$sqlSTATS = "SELECT count(name) FROM sqlite_master WHERE type='table' AND name='osstats'";
$query = $dblog->query($sqlLOG);
$result = $query->fetch(PDO::FETCH_ASSOC);
if (!$result["count(name)"]) { $query = $dblog->query($CreateLOG); }
$query = $dbstats->query($sqlSTATS);
$result = $query->fetch(PDO::FETCH_ASSOC);
if (!$result["count(name)"]) { $query = $dbstats->query($CreateSTATS); }
// check if last modification time is older than $DELloglines and if: drop oslog table
$sql = "SELECT date FROM oslog WHERE 1 ORDER BY date ASC LIMIT 0,1";
$query = $dblog->query($sql);
$result = $query->fetch(PDO::FETCH_ASSOC);
if (!empty($result["date"])) {
$DELDAY = 86400 * $DELDAYloglines;
$diff = time() - $result["date"];
if ($diff > $DELDAY) {
print("Reached $DELDAYloglines days of old loglines. Deleting oslog Database!\n");
unlink($DBlog);
$query = $dblog->query($CreateLOG);
}
}
if (!isset($argv[1]) OR empty($argv[1])) {
echo "Scanning logfile... \n";
if (!$LOGcontent = file("$OSLOG")) {
print ASCII::BOLD_RED("Error getting Data! Aborting..\n");
exit();
}
} else { echo "Parsing logline... \n"; }
$checked=$added=$updated=0;
$DURATION_start = startTime();
if (!isset($argv[1]) OR empty($argv[1])) {
for($i=0; $i<count($LOGcontent); $i++) {
$line = $LOGcontent[$i];
if (empty($line)) { continue; }
parse_line($line);
}
} else {
parse_line($argv[1]);
}
/*
| date | tid |t|user| caid| ident| |sid | |skip | text
2013/01/25 21:23:23 F7134B38 c USER (1722&000000/0000/0081/93:DF65): found (707 ms) by SERVER (2 of 6) - Sky Sport HD 1
2013/01/25 21:23:23 F7134B38 c USER (1722&000000/0000/D035/93:45CA): found (492 ms) by SERVER (2 of 8) - History
*/
function parse_line($line) {
global $dbstats,$dblog,$SKIPlines;
global $checked,$added,$updated;
// check for valid line
if (preg_match("/.+(\([0-9]{4}\&.*).+/",$line)) {
$CONTINUE=0;
foreach ($SKIPlines AS $SKIP) { if (preg_match("/$SKIP/",$line)) { $CONTINUE=1; } }
if ($CONTINUE == 0) {
// check if logline already checked/exists
$l = preg_split("/ /",$line,-1,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
$DATE = $l[0];
$TIME = $l[1];
$DT = strtotime("$DATE $TIME");
$CIS = $l[5];
$CIS = str_replace("):","",substr($CIS,1));
$query = $dblog->query("SELECT date,cis FROM oslog WHERE date = '".$DT."' AND cis = '".db_input($CIS)."'");
$result = $query->fetch(PDO::FETCH_ASSOC);
if (empty($result)) {
// parse logline
#print("$line");
$USER = $l[4];
$CIS2 = explode("&",$CIS);
$CAID = $CIS2[0];
$CIS2 = explode("/",$CIS2[1]);
$IDENT = $CIS2[0];
$SID = $CIS2[2];
$TEXT = explode("):",$line);
$TEXT = trim($TEXT[1]);
#print("$DATE $TIME - $USER $CAID $IDENT $SID - $TEXT\n");
// check if data is already added and if update it..
$query = $dbstats->query("SELECT count FROM osstats WHERE caid = '".$CAID."' AND ident = '".$IDENT."' AND sid = '".$SID."' AND user = '".$USER."'");
$result = $query->fetch(PDO::FETCH_ASSOC);
if (isset($result["count"]) AND !empty($result["count"])) {
$COUNT = $result["count"]+1;
$query = $dbstats->query("UPDATE osstats SET count='".$COUNT."',enddate='".$DT."' WHERE caid = '".$CAID."' AND ident = '".$IDENT."' AND sid = '".$SID."' AND user = '".$USER."'");
$updated++;
} else {
// ..if not, add new entry
$VALUES = "(\"".$DT."\",\"".$DT."\",\"".$CAID."\",\"".$IDENT."\",\"".$SID."\",\"".$USER."\",\"1\")";
$query = $dbstats->query("INSERT INTO osstats (startdate,enddate,caid,ident,sid,user,count) VALUES ".$VALUES."");
$added++;
}
// insert line into oslog table..
$query = $dblog->query("INSERT INTO oslog (date,cis) VALUES (\"".$DT."\",\"".db_input($CIS)."\");");
$checked++;
}
}
}
}
print ASCII::BOLD_GRN("Scan took ".endTime($DURATION_start)." seconds. Checked ".$checked." loglines.");
print ASCII::BOLD_GRN(" Added: ".$added." - Updated: ".$updated."\n");
//______________________________________________________________________________________
function db_con($dbfile) {
if (!$db = new PDO("sqlite:$dbfile")) {
$e="font-size:23px; text-align:left; color:firebrick; font-weight:bold;";
print ASCII::BOLD_RED("Fehler beim öffnen der Datenbank: $dbfile\n");
print ASCII::BOLD_RED("".$db->errorInfo()."\n");
die;
}
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $db;
}
function db_query($dbfile,$sql) {
$db = db_con($dbfile);
$result = $db->query($sql) OR db_error($sql);
return $result;
}
function db_error($sql) {
global $db;
$error = $db->errorInfo();
die("".$error."\n".$sql."\n");
}
//Add HTML character incoding to strings
function db_output($string) {
return htmlspecialchars_decode($string);
}
//Add slashes to incoming data
function db_input($string) {
#if (function_exists('mysql_real_escape_string')) {
# return mysql_real_escape_string($string);
#}
return addslashes($string);
#return htmlspecialchars($string);
}
function startTime() {
$timeExplode = explode(" ", microtime());
$time = $timeExplode[1] + $timeExplode[0];
return $time;
}
function endTime($timer) {
$timeExplode = explode(" ", microtime());
$time = $timeExplode[1] + $timeExplode[0];
$finish = $time - $timer;
$endTime = sprintf("%4.3f", $finish);
return $endTime;
}
// Auslesen der oscam.conf
function GetCFG_OScam($FILE="",$SEARCH="") {
global $OSCFG;
$SEARCHED="";
if (!empty($FILE)) { $GETFILE = $FILE; } else { $GETFILE = $OSCFG; }
if (file_exists($GETFILE)) {
$file = file("$GETFILE");
if (!empty($SEARCH)) {
for($i=0; $i<count($file); $i++) {
if (preg_match("/$SEARCH/",trim($file[$i]))) {
$zeile = "$file[$i]";
$SEARCHED = trim(substr(strrchr($zeile, "="), 1));
if (isset($zeile[0]) AND $zeile[0]=='#') { $SEARCHED = ""; }
break;
}
}
}
}
return $SEARCHED;
}
// Auslesen der functions.sh
// nur variablen in " " werden ausgelesen
function ReadFUNCTIONS() {
$functions=fopen("/var/emu/script/functions.sh","r");
while($input = fgets($functions, 1024)) {
preg_match("/^(.+)=\"(.*)\"/",trim($input),$find);
if (isset($find[1]) AND !empty($find[1])) {
if (!preg_match("/^\[|^.+\[\".+\"\]/",trim($find[1]))) {
global $$find[1];
if (empty($find[2])) { $find[2]='""'; }
$$find[1] = $find[2];
}
}
}
@fclose($functions);
}
class ASCII {
public static function BOLD_RED($text) { return "\033[31;1m".$text."\033[0m"; }
public static function BOLD_GRN($text) { return "\033[32;1m".$text."\033[0m"; }
public static function BOLD_YLW($text) { return "\033[33;1m".$text."\033[0m"; }
public static function BOLD_TUR($text) { return "\033[36;1m".$text."\033[0m"; }
public static function BOLD_PUR($text) { return "\033[35;1m".$text."\033[0m"; }
public static function BOLD_WHT($text) { return "\033[37;1m".$text."\033[0m"; }
}
?>
Code: Alles auswählen
#!/bin/bash
#
#### CONFIG - START
#
get_stats_php="/var/www/get_stats.php"
phpbin="/usr/bin/php"
#OScfg="/var/etc/oscam.conf"
OSlog="/tmp/OScam.log"
#
#### CONFIG - END
proc_parse_cfg() {
i=0
while read line; do
line=$(echo $line | sed -e 's/ //g')
if [[ "$line" =~ ^[^#]*= ]]; then
cfg_name[$i]=$(echo $line | cut -d'=' -f 1)
cfg_value[$i]=$(echo $line | cut -d'=' -f 2-)
((++i))
fi
done < $1
}
get_cfg_value() {
i=0
for name in ${cfg_name[*]}; do
[ "$1" = "$name" ] && echo "${cfg_value[$i]}" && break
((++i))
done
}
if [ -z "$OSlog" ]; then
proc_parse_cfg $OScfg
OSlog=$(get_cfg_value logfile)
fi
lastmodified=$(stat -c %Y $OSlog)
while true; do
#echo $lastmodified
#echo $(stat -c %Y $OSlog)
if [ -n "$lastmodified" ]&&[ "$(stat -c %Y $OSlog)" -gt "$lastmodified" ]; then
lastmodified=$(stat -c %Y $OSlog)
$phpbin -f $get_stats_php
fi
sleep 10
done
exit 0
/EDIT: show_stats.php hab ich später durch index.php ersetzt, hab in dem zip zwar beide drin aber index.php ist wie gesagt die weiterentwicklung
- Dateianhänge
-
- OScam_Channel_Charts.zip
- v0.6
- (77.74 KiB) 124-mal heruntergeladen
Du musst nicht kämpfen um zu siegen
Re: Oscam.log Senderstatistik
feissmaik, bei der index.php erstellt er keine Charts sondern den "png-text"
//edit und
bash get_stats_deamon.sh
: Kommando nicht gefunden. 12:
'et_stats_deamon.sh: Zeile 13: Syntaxfehler beim unerwarteten Wort `{
'et_stats_deamon.sh: Zeile 13: `proc_parse_cfg() {
//edit und
bash get_stats_deamon.sh
: Kommando nicht gefunden. 12:
'et_stats_deamon.sh: Zeile 13: Syntaxfehler beim unerwarteten Wort `{
'et_stats_deamon.sh: Zeile 13: `proc_parse_cfg() {
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
Hab das zip nochmal ersetzt - die Dateien funktionieren jetzt aber 100pro
Der Unterschied ist nämlich auch das ich bild dateien erstellen lasse die dann angezeigt werden - wenn ihr die dateien aber in einem Verzeichnis ablegt das nicht " www-data " gehört, müsst ihr das erst ändern denn sonst ist phplot.php nicht berechtigt die *.png dateien anzulegen
Der Unterschied ist nämlich auch das ich bild dateien erstellen lasse die dann angezeigt werden - wenn ihr die dateien aber in einem Verzeichnis ablegt das nicht " www-data " gehört, müsst ihr das erst ändern denn sonst ist phplot.php nicht berechtigt die *.png dateien anzulegen
Du musst nicht kämpfen um zu siegen
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste