Killing Floor - lokalne statystyki

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Tak jak mówie, zabawa w wyłapywanie niedozwolonych znaków. Podaj te wpisy, które się duplikują. U mnie działa bez zarzutu, ale na krótszym logu. Trzeba wyłapać wszystkie, albo, jeśli się da zabronić graczom stosowania "dziwnych" znaków a tylko alfanumeryczne.
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

Skrypt działa. Niestety kolejne uruchomienie skryptu duplikuje wszystkie wpisy.
Musze za każdym razem czyścic tabele przed wykonaniem skryptu czy jak?

Po pierwszym wykonaniu skryptu:

Kod: Zaznacz cały

180 wszystkich, Wykonanie zapytania trwało 0.0004 sekund(y)
Po drugim wykonaniu skryptu:
Tu akurat ktoś się podłączył wiec jest jeden więcej. To świadczy o tym że całość działa. :D

Kod: Zaznacz cały

361 wszystkich, Wykonanie zapytania trwało 0.0012 sekund(y)
Po trzecim wykonaniu skryptu:

Kod: Zaznacz cały

542 wszystkich, Wykonanie zapytania trwało 0.0005 sekund(y)
180+181+181=542
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Nie, nie musisz. Wyczyścić musisz jedynie, jeżeli, podsyłam nową wersję skryptu. Przeczytaj to co napisałem powyżej.

Dodane:
Dobrze, poprawię to.
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

Tak robiłem jak napisałeś.
Jednak dodanie wykonania do cron'a powieli wpisy występujące w tabeli o te same wysyłane ze skryptu.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

kf_users.awk

Kod: Zaznacz cały

$1 ~ /^[[:digit:]]/ {
connb[$2]= $3; nickb[$2]=$2;}
$2 ~ /New/ && $3 ~ /Player/ {
 if (start) { 
  znalazl=0;
  {for (x in conn) {
    sub(/[\'\"\`\\\$]/, "", $4)
    if ( x == $4) {
      znalazl=1;
      conn[x]++; break
      }  
    }}
   {if (znalazl == 0) {
      sub(/[\'\"\`\\\$]/, "", $4)
      conn[$4]= 1; id[$4]= substr($5, 4); nick[$4]=$4;}}
       } else {
      start=1;
      sub(/[\'\"\`\\\$]/, "", $4)
      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 user -h localhost --password=haslo produkty -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 user -h localhost --password=haslp produkty -Bse \""update_tb"\"" | "/bin/bash"
    }
  }
}
}


kf_users.sh

Kod: Zaznacz cały

#!/bin/bash
USER="root" 
HASLO="haslo_bazy";
HOST="localhost"; 
BAZA="nazwa_bazy"; 
TABELA="nazwa_tabeli";
KF_LOG="kf_users.log";
TEMP="tmp.log";

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}
  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
Ten kod u mnie działa na 100% nie powiela wpisów. Testowałem go na tym Twoim wielkim logu i działa poprawnie. Ewentualnie wyłącz linijkę:

Kod: Zaznacz cały

rm ${TEMP} 


I zobacz, czy tworzy u Ciebie plik tmp.log. Innych pomysłów nie mam bo po prostu działa.
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

To samo, jest podwójnie.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

plik tmp.log się tworzy?
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

DavidoSS: miałeś zamieścić ostateczny kod...
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

Dzięki nie dającej się opisać słowami pomocy, uzyskałem taki oto kod:

Kod: Zaznacz cały

#!/bin/bash
USER="xxxxx" 
HASLO="yyyyyyyyyyyyyyyyyyy";
HOST="localhost"; 
BAZA="zzzzzzzzzz"; 
TABELA="players_basic";
KF_LOG="server_kfbasic.log";
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} 
  rm ${TEMP}
else
  echo "tabela nieistnieje. Tworze...";
  mysql -u ${USER} -h ${HOST} --password=${HASLO} ${BAZA} -Bse "CREATE TABLE ${TABELA} (nr INT(10) NOT NULL AUTO_INCREMENT, id INT(10) NOT NULL, player CHAR(40) NOT NULL, connections INT(11) NOT NULL, PRIMARY KEY(nr))"
  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

Kod: Zaznacz cały

$1 ~ /^[[:digit:]]/ {
connb[$3]= $4; nickb[$3]=$3;}
$2 ~ /New/ && $3 ~ /Player/ {
 if (start) { 
  znalazl=0;
  {for (x in conn) {
    sub(/[\'\"\`\\\$\t\n\r *]/, "", $4)
    if ( x == $4) {
      znalazl=1;
      conn[x]++; break
      }  
    }}
   {if (znalazl == 0) {
      sub(/[\'\"\`\\\$\t\n\r *]/, "", $4)
      conn[$4]= 1; id[$4]= substr($5, 4); nick[$4]=$4;}}
       } else {
      start=1;
      sub(/[\'\"\`\\\$\t\n\r *]/, "", $4)
      conn[$4] = 1; id[$4]= substr($5, 4); nick[$4]=$4
      }}
END {  
  tabela="players_basic";        //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 xxxxxx -h localhost --password=yyyyyyyyyyyyyyy zzzzzzz -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 xxxxxx -h localhost --password=yyyyyyyyyyyyyyy zzzzzzz -Bse \""update_tb"\"" | "/bin/bash"
    }
  }
}
}

Skrypt działa wyśmienicie.
Tutaj UWAGA! Wymaga zainstalowania gawk!
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

Powyższy skrypt wymaga dostosowania powodem rotacji loga.
Po rotacji loga cały system zbierania informacji nie działa prawidłowo.

W między czasie wymyśliłem coś innego, co w zupełności zamyka temat.

Kod: Zaznacz cały

#!/bin/bash                                                                                                                                                                                                                                                                    
svlog=/usr/local/games/steam_servers/kfserver_mod/log/server_kf_mut.log                                                                                                                                                                                                        
lista=/usr/local/games/steam_servers/kfserver_mod/log/player.list                                                                                                                                                                                                              
exist_id=/usr/local/games/steam_servers/kfserver_mod/log/exist_id.list                                                                                                                                                                                                         
score=/usr/local/games/steam_servers/kfserver_mod/log/score.list                                                                                                                                                                                                               
dbconn="mysql -u user -h localhost --password=password baza_danych"                                                                                                                                                                                                    
tabela="tabela"                                                                                                                                                                                                                                                           
        echo "SELECT id from $tabela" | $dbconn | grep -v 'id' > $exist_id                                                                                                                                                                                                     
        grep 'New Player' $svlog | awk '{print $4" "$5}' | tr --delete '=;:`<>,-/?!@#$%^&(){}[]""~''' | sort | uniq -c > $lista                                                                                                                                                

        while read LINE
                do
                        conn="$(echo $LINE | awk '{print $1}')"
                        players="$(echo $LINE | awk '{print $2}')"
                        ids="$(echo $LINE | awk '{print $3}' | cut -c 3-)"
                        echo ""
                        echo "Przetwarzam dane dla $players $ids $conn "
                                if grep -q "$players" "$score" ; then
                                        new_score="$(grep "$players" "$score" | awk '{print $2}' | sort -nr | head -n1)"
                                        echo "Nowe score dla $players wynosi $new_score"
                                else
                                        new_score="0"
                                        echo "Nowe score dla $players wynosi $new_score bo nie ma $players w $score"

                                fi

                                if grep -q  "$ids" "$exist_id" ; then
                                        last_score="$(echo  "SELECT killed_zeds from $tabela WHERE player='$players'" | $dbconn | grep -v 'killed_zeds')"
                                        echo "Poprzedni wynik dla $players wynosi $last_score" 
                                        echo "UPDATE $tabela SET connections=connections +$conn WHERE id ='$ids'" | $dbconn
                                        echo "Polaczenia gracza $players zostaly zaktualizowane o $conn"
                                else
                                        last_score="0"
                                        echo "Poprzedni wynik dla $players wynosi $last_score bo nie ma $players w db"
                                        echo "INSERT INTO $tabela (id,player,killed_zeds,connections) VALUES ('$ids','$players','$new_score','$conn')" | $dbconn
                                        echo "Dodano $players do bazy danych z id: $ids , wynikiem: $new_score oraz  polaczen: $conn"
                                fi

                                if grep -q "$players" "$score" ; then
                                compare_result="$(echo "$new_score > $last_score" | bc)"
                                                if [ $compare_result != "0" ]; then
                                                                echo "$new_score jest wieksze od $last_score"
                                                                echo "UPDATE $tabela SET killed_zeds = $new_score WHERE id = '$ids'" | $dbconn
                                                                echo "Aktualizuje baze danych dla $players o wynik $new_score"
                                               else
                                                                echo "$new_score jest mniejsze od $last_score baza danych pozostanie nie zmieniona"
                                                fi
                                fi 
       done < $lista

rm $lista
rm $exist_id
rm $score


Dodane:
Hej ludzie pomóżcie, jak usuwać znaki nie alfabetyczne? To co mam mi nie działa prawidłowo i gdy taki-owaki gracz ma np. apostrof (') w nazwie to mi się wykrzacza składnia polecenia dla MYSQL.

Dane zbieram poleceniem:

Kod: Zaznacz cały

grep 'New Player' $svlog | awk '{print $4" "$5}' | tr --delete '=;:`<>,-/?!@#$%^&(){}[]""~''' | sort | uniq -c
i choć ma niby usuwać znaki:

Kod: Zaznacz cały

 =;:`<>,-/?!@#$%^&(){}[]""~''
to jednak to nie do końca działa.

Podczas interpretowaniu delikwenta np.:

Kod: Zaznacz cały

Cap'Taine'_'Snp3R 
który to ma w nazwie apostrofy, mam:

Kod: Zaznacz cały

SQL syntax error
przy:

Kod: Zaznacz cały

 echo "INSERT INTO $tabela (id,player,killed_zeds,connections) VALUES ('$ids','$players','$new_score','$conn')" | $dbconn
polegający na tym, że po wywołaniu zmiennych powstaje coś takiego:

Kod: Zaznacz cały

echo "INSERT INTO tabela (id,player,killed_zeds,connections) VALUES ('47572412', '[B]Taine'_'Snp3R[/B]','2060','2')" | $dbconn
Oto przykład:

Kod: Zaznacz cały

Przetwarzam dane dla Cap'Taine'_'Snp3R 47572412 2 
Nowe score dla Cap'Taine'_'Snp3R wynosi 2060
Poprzedni wynik dla Cap'Taine'_'Snp3R wynosi 0 bo nie ma Cap'Taine'_'Snp3R w db
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Taine'_'Snp3R','2060','2')' at line 1
Dodano Cap'Taine'_'Snp3R do bazy danych z id: 47572412 , wynikiem: 2060 oraz  polaczen: 2
2060 jest wieksze od 0
Aktualizuje baze danych dla Cap'Taine'_'Snp3R o wynik 2060
Oraz jeszcze jeden błąd :

Kod: Zaznacz cały

Przetwarzam dane dla ﮐ��I����_Mad_D 23425959 2 
Nowe score dla ﮐ��I����_Mad_D wynosi 0 bo nie ma ﮐ��I����_Mad_D w /usr/local/games/steam_servers/kfserver_mod/log/score.list
ERROR 1267 (HY000) at line 1: Illegal mix of collations (latin2_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
Poprzedni wynik dla ﮐ��I����_Mad_D wynosi 
Polaczenia gracza ﮐ��I����_Mad_D zostaly zaktualizowane o 2
ale to już muszę sobie darować bo jak myślę będzie nie możliwe tego rodzaju problem rozwiązać...

Z góry dziękuje za pomoc...
ODPOWIEDZ