Killing Floor - lokalne statystyki

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

[+]Killing Floor - lokalne statystyki

Post autor: DaVidoSS »

Witam.
Mam na VPS serwer gry Killing Floor.
Serwer ten ma webowy interfejs (Web Admin Interface).

http://www.custwiki.cyberwurx.com/index ... _Web_Admin

Chciałbym aby pewne informacje trafiały do utworzonej w tym celu bazy danych.
Przeszukałem w tym celu szmat internetu ale cisza o tym.
Najważniejsze informacje dla mnie to lista graczy i ilosc połączeń z serwerem każdego z nich.
Na VPS mam tez apache2 z PHP5 i mysql.

Czy ktoś z Was wie jak się za to zabrać?

Dodane:
Trochę martwi mnie brak zainteresowania.
Z racji tego iż zdarza się że odwiedzają naszą Agorę prawdziwe persona świata
serwera i WWW, naprawdę liczyłem tutaj na pomoc.

Myślałem dużo nad tym zagadnieniem aż wpadłem na pewien pomysł.
Skoro użycie webowego interfejsu admina do tego celu wydaje się trudne czy wnet nie możliwe do zrealizowania, czemu nie użyć innego źródła?
Otóż przecież serwer ma log! A w tym pliku są takie informacje jak:

Kod: Zaznacz cały

.....................
ScriptLog: New Player Jelcz id=65613302                                                                                                                                                                                                                                        
ScriptLog: New Player pirojgok id=80047933                                                                                                                                                                                                                                     
ScriptLog: New Player [MR_OLD]_Crazy_Boy id=71751087                                                                                                                                                                                                                           
ScriptLog: New Player silentgrenade id=81061790                                                                                                                                                                                                                                
ScriptLog: New Player Lucius_Shadowhive id=47126556                                                                                                                                                                                                                            
ScriptLog: New Player RobbyJump id=59142364                                                                                                                                                                                                                                    
ScriptLog: New Player wach-marc id=53436366

.........................

Jak wykorzystać te informacje zapisując je automatycznie do bazy danych, jakie tabele utworzyć?
Jak powinien wyglądać taki skrypt i jak powinien być uruchamiany?
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Skrypt powłoki do bazy się dostanie bez problemu.
Możesz za pomocą awk wyciągnąć z logów interesującą cię kolumnę i wrzucić do bazy, a jak to sobie potem obrobisz to już twoja sprawa.
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

Pomóżcie rzesz towarzyszu. Pojęcia nie mam o czym do mnie piszecie...
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Tu masz połączenie z bazą danych: http://www.daniweb.com/software-develop ... eads/27653
Do tego jak wpiszesz sobie coś takiego:

Kod: Zaznacz cały

cat /sciezka/do/pliku/z/logami | awk '{print $4 " " $5}'
to dostaniesz na wyjściu tylko dwie kolumny oddzielone spacją, mianowicie nazwę użytkownika i ID, prawdopodobnie to jest id sesji
Nie wiem jak w normalny sposób rozwiązać cykliczne odczytywanie pliku z logami, żeby było dobrze.
Pokombinuj, nic się samo nie robi.
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

Że niby tak to ma wygladac?:

Kod: Zaznacz cały

variable=`
mysql -u user --password=password << eof

use mydatabase;
SELECT version FROM versions WHERE versionid = 'LIST';
cat /sciezka/do/pliku/z/logami | awk '{print $4 " " $5}'

eof`
A tabele? A kolumny? Gdzie "INSERT INTO"?
Co będzie jak ktoś istniejący w bazie się połączy po raz drugi? "INSERT FAILED" ?
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

To polecenie co masz wyżej to wykonujesz w powłoce, nie jako polecenie sql, a inserty i tak dalej to sobie musisz sam opracować jak to chcesz mieć.
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

O jej... teraz to mnie dopiero zabolało. Zrazu dałeś Waść nadzieję i wraz potem obuchem w łeb...

Chciałbym otrzymać coś takiego dla przykładu:

Kod: Zaznacz cały

Liczba połączeń     Nick             ID
22                  silentgrenade    81061790
14                  wach-marc        53436366
 7                  pirojgok         80047933
 
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

DaVidoSS: dotykasz materii programistycznej, musisz nauczyć się podstaw awka, niestety, żeby to ugryźć. Skoro masz logi połączeń użytkowników to wykorzystamy te logi. Napisze Ci ten skrypt ale daj mi troche czasu, bo jestem w robocie ;)

PS. Poproś admina o przeniesienie do działu "Programowanie"
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

Za wszelką pomoc pięknie dziękuję.
Tymczasem spróbowałem wyciągać dane z pliku log na bieżąco:

Kod: Zaznacz cały

tail -f -n0 server1.log | grep "New Player" >> player.list  
Niestety nie działa. Nie wiem dlaczego.
Plik player.list ma zerową zawartość pomimo że 20-u graczy odwiedziło serwer.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Hej, obiecałem skrypt więc wklejam:

Do działania potrzebujesz 3 plików: kf_users.sh, kf_users.awk oraz plik z logiem killingfloor.

kf_users.sh

Kod: Zaznacz cały

#!/bin/bash
USER="uzytkownik bazy" 
HASLO="jego haslo";
HOST="localhost"; 
BAZA="nazwa bazy"; 
TABELA="tabela";
KF_LOG="plik z logiem killing floor";
TEMP="tmp.log";  #to tymczasowy plik nazwijmy "wymiany", zostaw tak jak jest
 
mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "DESCRIBE ${TABELA}" &> /dev/null 

if [ $? -eq 0 ]; then
  mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "SELECT * FROM ${TABELA}" > ${TEMP}
  awk -f kf_users.awk ${TEMP} ${KF_LOG} &> /dev/null 
  rm ${TEMP}
else
  echo "tabela nieistnieje. Tworze...";
  mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "CREATE TABLE ${TABELA} (id INT(10) NOT NULL, player CHAR(40) NOT NULL, connections INT(11) NOT NULL) "
  if [ $? -eq 0 ]; then
    echo "Tabela utworzona. Prosze wywołać skrypt raz jeszcze"
  else
    echo "Nie udalo się utworzyć tabeli. Sprawdź konfigurację, i spróbuj raz jeszcze"
  fi
fi

kf_users.awk

Kod: Zaznacz cały

$1 ~ /^[[:digit:]]/ {
connb[$2]= $3; nickb[$2]=$2;}
$1 ~ /ScriptLog:/ {
 if (start) { 
  znalazl=0;
  {for (x in conn) {
    if ( x == $4) {
      znalazl=1;
      conn[x]++; break
      }  
    }}
   {if (znalazl == 0) {
      conn[$4]= 1; id[$4]= substr($5, 4); nick[$4]=$4;}}
       } else {
      start=1;
      conn[$4] = 1; id[$4]= substr($5, 4); nick[$4]=$4
      }}
END {  
  tabela="nazwa tabeli";        //config
  for (l in conn) {
    if (!nickb[l]) {
      insert_tb="INSERT INTO "tabela "(id, player, connections) VALUES (\'"id[l]"\', \'"nick[l]"\', \'"conn[l]"\')"
    print "mysql -u uzytkownikbazy -h localhost --password=haslo nazwa_bazy -Bse \""insert_tb"\"" | "/bin/bash"
  } else {
    if (conn[l] > connb[l]) {
      update_tb= "UPDATE "tabela" SET connections="conn[l]" WHERE player='"nick[l]"'"
      print "mysql -u uzytkownikbazy -h localhost --password=haslo nazwa_bazy -Bse \""update_tb"\"" | "/bin/bash"
    }
  }
}
}
Plik z logiem killingfloor mam nadzieje, że ma dokładnie taką postać jak wklejałeś :) Inaczej nie zadziała.
Pozamieniaj w kodzie wszystkie parametry uzytkowników, nazw tabeli i bazy oraz hasła (wszedzie muszą być tożsame)
Po wklejeniu kodu do tych plików nadaj im odpowiednie prawa wykonywalności. Następnie uruchom ./kf_users.sh. Utworzy Ci tabele i każe ponownie odpalić skrypt. Teraz już możesz dać do crona.
W razie czego pisz. Pozdrawiam
ODPOWIEDZ