Oscam.log Senderstatistik

Fragen, Probleme ... die sonst nirgends passen ...
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von feissmaik »

amok404 hat geschrieben:Jap. Wenn jetzt php deutlich schneller ist nehm ich das!
Naja um das zu wissen wäre interessant wie dein Code aussieht - vielleicht gibts da ja auch noch was zu optimieren...
Du musst nicht kämpfen um zu siegen
amok404
IPC Neuling
Beiträge: 36
Registriert: Mo 25. Apr 2011, 08:50
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von amok404 »

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
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von feissmaik »

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?
Du musst nicht kämpfen um zu siegen
amok404
IPC Neuling
Beiträge: 36
Registriert: Mo 25. Apr 2011, 08:50
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von amok404 »

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. :oops:
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();
?>
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von feissmaik »

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:
Spoiler
Show
Bild
Du musst nicht kämpfen um zu siegen
amok404
IPC Neuling
Beiträge: 36
Registriert: Mo 25. Apr 2011, 08:50
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von amok404 »

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?
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von feissmaik »

Ja sowas hab ich auch noch nicht drin - der zeigt bei mir auch einfach alles an was er findet allerdings pro Benutzer eine Tabelle :)
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>
get_stats.php

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"; }
}

?>
get_stats_deamon.sh

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
amok404
IPC Neuling
Beiträge: 36
Registriert: Mo 25. Apr 2011, 08:50
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von amok404 »

Ich muss ehrlich zugeben deins gefällt mir momentan besser :D
amok404
IPC Neuling
Beiträge: 36
Registriert: Mo 25. Apr 2011, 08:50
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von amok404 »

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() {
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Oscam.log Senderstatistik

Beitrag von feissmaik »

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
Du musst nicht kämpfen um zu siegen
Antworten

Wer ist online?

Mitglieder in diesem Forum: Semrush [Bot] und 0 Gäste