Oscam.log Senderstatistik

Fragen, Probleme ... die sonst nirgends passen ...
amok404
IPC Neuling
Beiträge: 36
Registriert: Mo 25. Apr 2011, 08:50
Kontaktdaten:

Oscam.log Senderstatistik

Beitrag von amok404 »

Versuche irgendwie ein Senderstatistik zu basteln in Verbindung mit einer mySQL Datenbank.
Dazu soll die oscam.log ausgewertet werden, leider fehlt mir da Syntax wie ich nur einzelne Teilbereiche wähle,
daher hoffe ich auf eure Linuxerfahrung, sobald das passiert ist, werd ich sicher weiterkommen, aber der Grundstein
fehlt leider gerade.


2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus

Die Zeit vorne dachte ich mit "cut" zu lösen. Aber ich brauche noch den user und das EF15. Wenn alle Benutzer die gleiche
Länge hätten dann wäre es ja über cut möglich, sind aber unterschiedlich lang. Kann mir einer da auf die Sprünge helfen?
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 »

Naja wenn du bereit bist dein Projekt hier zu posten kann man dir auch besser helfen..


Anstatt MySQL würde ich aber stattdessen SQLite benutzen da dafür kein extra Prozess laufen muss - MySQL verbrät ziemlich viel CPU+Ram

Mit "cut" wäre es meiner meinung nach zu umständlich, wobei das auch darauf ankommt was genau du suchst - ich würd zunächst mit ' awk ' arbeiten um zum beispiel aus einer Zeile die Argumente (durch <space> getrennt) zu filtern..
also erst speicherst du die Zeile in eine Variable:

line='2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus'

dann ziehst du dir daraus datum+ührzeit sowie TID, Type, User, CIS und den restlichen text..

Code: Alles auswählen

|      date        |  tid  |t|user| caid| ident|    |sid |
2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus
also: /tmp/test

Code: Alles auswählen

#!/bin/bash

line='2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus'

DateTime=$(echo $line | awk '{print $1,$2}')
TID=$(echo $line | awk '{print $3}')
TYPE=$(echo $line | awk '{print $4}')
USER=$(echo $line | awk '{print $5}')
CIS=$(echo $line | awk '{print $6}')

#text..
length=${#line}
searchlength=$(expr index "$line" '\)')
sl=$(($searchlength + 1))
TEXT=${line:$sl:$length}

echo $line
echo ""
echo $DateTime
echo $TID
echo $TYPE
echo $USER
echo $CIS
echo $TEXT
das sprukt dann das hier aus:

Code: Alles auswählen

root@raspberrypi ~ > bash /tmp/test
2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus

2013/01/20 15:10:38
8921820
c
home
(1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767):
found (364 ms) by hdplus
...das kann man dann weiter verarbeiten...
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 »

Super danke! Das einzige was fehlt ist noch das EF15. Klar würde ich das Projekt sofort hier posten wenn es halbwegs läuft :P
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 »

Naja das is jetzt nicht mehr allzu schwer...

Code: Alles auswählen

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}')
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 »

Die ersten Versuche, wird auch soweit auch eingetragen. Nun mal sehen wie man darauf nen Chart baut, am besten mit php.

Code: Alles auswählen

#/bin/bash
STRUCTURE="CREATE TABLE data (time DATETIME,user TEXT,sid CHAR(4), PRIMARY KEY (time,user));";
 
# Creating an Empty db file and filling it with my structure
cat /dev/null > channelstat.db
echo $STRUCTURE > /tmp/tmpstructure
sqlite3 channelstat.db < /tmp/tmpstructure;
rm -f /tmp/tmpstructure;

while read line
do

DateTime=$(echo $line | awk '{print $1,$2}');
TID=$(echo $line | awk '{print $3}')
TYPE=$(echo $line | awk '{print $4}')
USER=$(echo $line | awk '{print $5}')
CIS=$(echo $line | awk '{print $6}')
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}')

length=${#line}
searchlength=$(expr index "$line" '\)')
sl=$(($searchlength + 1))
TEXT=${line:$sl:$length}
#echo ""
#echo $DateTime
#echo $USER
#echo $SID
sqlite3 channelstat.db "INSERT INTO data (time,user,sid) VALUES ('$DateTime','$USER','$SID')";
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 »

ehrlich gesagt hätte ich gedacht das du schon weiter wärst und dadurch vielleicht bemerkt hättest, das es komplett in php (ohne bash) einfacher/sinnvoller wäre
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 »

php hab ich mich generell dagegen entschieden, da die Datenbank nicht erst gefüllt werden soll, wenn ich die Seite
abrufe. Denn vorher zu einen bestimmten Zeitpunkt via cron. Habe gestern auch mit beiden DBMS rumprobiert und SQLite3
verbraucht gleich viel Resourcen beim einlesen wie MySQL. Des weiteren braucht SQLite3 weitaus länger als MySQL (rund 13.000 Datensätze pro Tag) und schwellt um das doppelte an. :roll:

Weiter? Ich hab doch vor drei Tagen angefangen wie ich bereits geschrieben habe :oops:
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:php hab ich mich generell dagegen entschieden, da die Datenbank nicht erst gefüllt werden soll, wenn ich die Seite
abrufe.
Denn vorher zu einen bestimmten Zeitpunkt via cron.
man kann php auch über crontab aufrufen - also man kann es auch unabhängig eines browsers programmiern
stichwort: i scan
das ist auch ein php script: /var/emu/script/pscan.php

ich würd halt ein php script basteln zum erfassen und auslesen der daten, was über crontab aufgerufen werden kann
und ein weiteres um die daten über ein webbrowser anzuzeigen (das brauchst du denk ich so oder so)
amok404 hat geschrieben:Habe gestern auch mit beiden DBMS rumprobiert und SQLite3
verbraucht gleich viel Resourcen beim einlesen wie MySQL. Des weiteren braucht SQLite3 weitaus länger als MySQL (rund 13.000 Datensätze pro Tag) und schwellt um das doppelte an. :roll:
hm also mysql verbraucht auf jedenfall wesendlich mehr resourcen weil permanent mehrere threads laufen und schneller kommt drauf an was für ein datenbank type und wie die datenbank aufgebaut ist

also zumindest auf thin clients würde das mehr resourcen verbrauchen aus besagten gründen - allerdings wirst du vermutlich alle log zeilen die du bereits ausgelesen hast auch in die db speichern müssen da du sonst nicht wirklich festellen kannst ob du die jeweilige zeile schon ausgelesen hast bzw wäre das umständlicher..
du könntest dann aber auch feststellen wann das logfile erstellt wurde und wenns ein neues ist, löschst du die "log" tabelle einfach wieder um irgendwann nicht eine überquillende db zu haben die alles ausbremst...
amok404 hat geschrieben:Weiter? Ich hab doch vor drei Tagen angefangen wie ich bereits geschrieben habe :oops:
ja so in dem zustand wie du es hier gepostet hast funktioniert erstmal nix - deshalb "weiter" :)


freddchen hatte sowas auch mal angefangen zu basteln aber in clear php also ohne bash scripte und diagramm usw und auch SQLite3 :)
Du musst nicht kämpfen um zu siegen
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 »

Ich würd das halt so probiern:
Eine Datenbank - 2 Tabellen
1. Tabelle: ID , TIMESTAMP , CAID , IDENT , SID , USER , COUNT
2. Tabelle: ID , "file creation timestamp" , LOGLINE

Ein Script das zB alle 10 Sekunden OScam.log parsed und Zeile für Zeile überprüft ob die komplette LOGLINE bereits eingetragen wurde - ggf auch nur TIMESTAMP, CAID, IDENT, SID und USER.. Wenn nicht wird geprüft ob es dafür bereits in der Ersten Tabelle einen Eintrag für CAID + IDENT + SID + USER gibt und falls nicht wird ein neuer Eintrag mit COUNT=1 eingefügt - ansonsten COUNT + 1..
Und dann eben nicht vergessen die LOGLINE in die Zweite Tabelle einzufügen..
Dann sollte das Script eben auch prüfen ob "file creation timestamp" (wann das file erstellt wurde) neuer ist als der letzte Eintrag in der Zweiten Tabelle und falls ja wird die Zweite Tabelle geleert

Dann brauch man nurnoch ein php Script um die gesammelten Daten vernünftig anzuzeigen, zB für jede Stunde oder Tag oder Woche oder Monat und dann auch welcher Sender und/oder User usw
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 »

So ähnlich hab ich's auch gedacht:
Eine DB mit zwei Tabellen
1. Tabelle: USER, SID, DATIME(Start),DATETIME(End) -- Primärschlüssel zusammen gesetzt aus DTIMEstart,DTIMEend und User (das ist wohl eindeutig genug, da bedarf es keiner ID)
2. Tabelle: SID, Name -- Finde halt Namen besser

Das Count macht SQL von sich aus mit einer Abfrage, da bedarf es keiner Spalte. Dann wird halt via Script gecheckt ob die aktuelle Zeit vom Log neuer ist und wenn dann noch die SID anders ist, wird der "alte Eintrag" abgeschlossen mit DTIMEend und ein neuer mit DTIMEstart angelegt. Sollte aber die SID gleich bleiben wird die Zeile übersprungen, es erfolgt kein Eintrag.
Das sollte die Datenbank klein halten.
Dann wird nur halt ne Abfrage gestartet wieviel Zeit zwischen DTIMEstart und DTIMEend liegt und ausgegeben.

(Hoffe ab kein Denkfehler hierbei)
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste