Big Brother Bot

Co to jest B3? Jak działa? Czy i jak mogę go samodzielnie zainstalować? Na te i wiele innych pytań znajdziesz odpowiedź w tym tekście.

Artykuł opisuje sposób instalacji i konfiguracji zautomatyzowanego narzędzia do administracji serwerem gry Urban Terror - Big Brother Bot, zwanym w skrócie B3. Dowiesz się czym jest B3, poznasz szczegóły jego działania, jakie musisz spełniać wymagania i w końcu jak poprawnie go zainstalować, starając się opisać problemy, które możesz po drodze napotkać. Może nie będę prowadził całą drogę za rękę, ale nie powinien też umknąć żaden aspekt, o który - w razie kłopotów - zawsze możesz zapytać w komentarzach.

1. Czym jest B3?

Big Brother Bot to oprogramowanie open source napisane w języku skryptowym Python służące do szeroko pojętej administracji serwerem gry (nie tylko Urban Terror). Oczywiście może służyć do wielu innych celów, z którymi na pewno B3 utożsamiacie - liczenie fragów, zgonów, doniesionych flag, headshotów. Aby poznać zasadę działania B3, należy najpierw zrozumieć w jaki sposób gra komunikuje się z B3. Proces gry domyślnie zapisuje pewne akcje, które wydarzyły się w grze do pliku zwanego dalej logiem. W logu można znaleźć m.in.: kto się połączył (wraz z parametrami połączenia tj. IP, nick itd.), kto kogo trafił/zabił i z jakiej broni, kto został wykopany, kto doniósł flagę i wiele innych). Każde takie zdarzenie znajduje się w osobnej linii pliku z logiem. Przykładowy fragment znajdziemy poniżej:

10:42 ClientBegin: 14
10:43 Kill: 7 7 10: ^2Equity killed ^2Equity by MOD_CHANGE_TEAM
10:43 ClientUserinfo: 7 \ip\x.x.x.x:27960\name\^2Equity\racered\2\raceblue\2\rate\8000\ut_timenudge\0\cg_rgb\0 0 0\cg_predictitems\0\cg_physics\1\cl_anonymous\0\sex\male\color2\5\color1\4\team_headmodel\*james\team_model\james\headmodel\sarge\model\sarge\snaps\20\gear\GMIARWA\teamtask\0\cl_guid\x\weapmodes\00000110220000020002
10:43 ClientUserinfoChanged: 7 n\^2Equity\t\1\r\2\tl\0\f0\\f1\\f2\\a0\0\a1\0\a2\0
10:43 ClientBegin: 7
10:43 Kill: 19 19 10: DR_Headshot killed DR_Headshot by MOD_CHANGE_TEAM

Każde zdarzenie ma swój określony format. Posiadając tę wiedzę można zatem napisać program, który czyta logi linia po linii i podejmuje odpowiednie akcje na podstawie wydarzeń zaistniałych w grze. Takim programem jest właśnie B3. Skąd zatem jego ograniczenia? Gra nie komunikuje o wszystkim, np. B3 nie ma pojęcia, że dany gracz otrzymał obrażenia od wybuchającego obok granatu (o ile nie zginął), bo taka informacja po prostu nie znajduje się w logach. Jest to jeden z wielu licznych przykładów, gdy B3 nie może zostać użyte do realizacji każdej zachcianki. Ostatnio często popularnym pomysłem jest nagradzanie medyków, jednak nie ma możliwości wyciągnięcia takiej informacji od gry bez jej modyfikacji. W jaki sposób komunikacja przebiega w drugą stronę? B3 wysyła wszystkie komunikaty za pomocą rcona.

B3 -[rcon] - /> UrT -[log]-> B3
2. Wymagania

Część wymagań musisz spełnić ty, a pozostałe środowisko w jakim pracuje twój serwer. Poradnik jest dla osób, które rozróżniają serwer fizyczny od procesu uruchomionego nań. Musisz posiadać podstawową wiedzę na temat internetu i systemów operacyjnych (szczególnie Linuksa). Zagadnienia takie, jak transfer plików przez FTP czy obsługa swojego konta przez SSH na zdalnej maszynie nie powinny być ci obce.

Jeśli nie posiadasz jeszcze własnego serwera, przeczytaj ten rozdział przed zakupem, a może uchroni cię to od niemiłej niespodzianki. Dostępne na rynku usługi serwerowe postnowiłem podzielić na trzy kategorie:

  • Serwer gry - a dokładniej jeden z wielu procesów gry uruchomiony na sprzęcie usługodawcy. W tej opcji wykupujesz pojedyncze sloty (publicznie lub - taniej - prywatne), masz możliwość zmiany większości parametrów configa, wgrywania nowych map przez FTP i dostęp do panelu przez przeglądarkę, w którym możesz np. zrestartować uslugę.
  • Serwer dedykowany - cała fizyczna maszyna wynajęta do dowolnych potrzeb. Jedynym ograniczeniem jest wydajność komponentów, z których złożony został sprzęt oraz twoja wyobraźnia i umiejętności.
  • Serwer prywatny/VPS - na pierwszy rzut oka rozwiązanie podobne do poprzedniego. VPS to maszyna wirtualna (jedna z wielu) uruchomiona na jednym fizycznie serwerze. Możliwości równie szerokie, jednak istotnie przytłumione niższymi parametrami czasu procesora, dostępnej pamięci czy pojemności dyskowej od serwera dedykowanego.

Jak wszędzie, gdy mamy do wyboru wiele dróg, tak i te mają swoje wady i zalety. Serwer gry jest rozwiązaniem najprostszym i najtańszym - płacisz np. esemesem i po chwili otrzymuejsz informację zwrotną z adresem IP serwera i hasłem rcona. Sprawdza się najlepiej dla serwerów klanowych/prywatnych ze względu na stosunkowo wysoki koszt slota publicznego. Niestety, możliwości rozbudowy takiego serwera są praktycznie zerowe. Serwer dedykowany jest usługą najdroższą (koszt conajmniej 200zł miesięcznie), dlatego bez pomysłu na biznes z wykorzystaniem tej usługi, raczej mało kto będzie mógł sobie na to pozwolić. Zaletą jest dowolność i swoboda w wyborze... wszystkiego. Ty decydujesz jakie oprogramowanie będzie tam zainstalowane. Rozwiązanie ostatnie jest niejako kompromisem dwóch wcześniejszych. Sposób dostępu jak i możliwości wyboru oprogramowania są równie szerokie jak w przypadku serwera dedykowanego, a koszt znacznie niższy, rzędu kilkudziesięciu złotych miesięcznie. Wydajność serwera wirtualnego daje jednak wiele do życzenia. Serwer taki powinien wystarczyć dla niewielkiego serwera publicznego lub prywatnego.

Na koniec należałoby również wspomnieć o kontach shell, których usługodawcy oferują niekiedy możliwość instalacji serwera gry. Przy dobrym kontakcie z administratorem serwera również nie widzę problemu, aby użyć takiego konta do realizacji naszego celu. Najważniejsze zatem: B3 można zainstalować na serwerze dedykowanym oraz VPS (żeby nie skłamać - istnieją firmy, które oferują opcję pierwszą z B3, ale niedość, że policzyć je można na palcach jednej ręki, to nie oferują szerokiego zakresu konfiguracji).

Czego będziemy potrzebować (informacja dla tych, którzy mogą to już mieć i niekoniecznie pragną wdawać się w szczegóły następnego rozdziału):

  • python >= 2.7,
  • python-mysqldb 
  • użytkownik i baza MySQL,
  • użytkownik w systemie.

3. Przygotowanie gruntu

W tym momencie zakładam, że posiadasz jedną z poniższych opcji:

  • serwer dedykowany,
  • serwer VPS,
  • konto shell (z dobrym kontaktem z administratorem - w przypadku braku potrzebnego oprogramowania na serwerze). 

Jako ciekawostkę podam, że serwer Polkowice działa na koncie shell bez dostępu do praw administratora (ani bez sprawnego kontaktu z administratorem), stąd miałem do pokonania wiele trudności, żeby wszystko dobrze działało.

Pierwszą rzeczą jest upewnienie się, że posiadamy interpreter języka Python. Z racji, że większość poradników dotyczy dystrybucji Debian lub Ubuntu jak i ze względu na samą popularność tychże, również ja przedstawię instalację w oparciu o te dytrybucje. Sprawdzamy zatem czy i w jakiej wersji posiadamy interpreter Pythona:

$ python -V

Jeśli pojawił nam się numer wersji i była ona conajmniej 2.7, to ten krok mamy z głowy. W przeciwnym wypadku musimy zainstalować Pythona. W momencie pisania tego poradnika wersja 2.7 nie znajdowała się w stabilnym repozytorium Debiana, dlatego należało dodać następującą linijkę do pliku /etc/apt/sources.list:

deb http://ftp.uk.debian.org/debian/ testing main contrib non-free

oraz zaktualizować dostępne paczki:

# apt-get update

Proszę zwrócić uwagę na znaki zachęty, które umieszczam na początku poleceń, $ oznacza, że polecenie może (lub powinno) zostać wykonane z prawami szeregowego użytkownika, natomiast # wymaga praw administratora (roota).

Po pomyślnej aktualizacji, możemy przejść do instalacji:

# apt-get install python2.7 python-mysqldb

Paczka python-mysqldb dodaje możliwość łączenia się z bazą danych MySQL, z której korzysta B3.

Krótka wzmianka dla zaawansowanych użytkowników: jeśli nie mamy roota, możemy zainstalować Pythona ze źródeł w naszym katalogu domowym (wymaganiem jest dostęp do gcc, make itd.). Przy odpowiednim ustawieniu zmiennych środowiskowych (służę pomocą) możemy cieszyć się pythonem równie mocno, jakby został zainstalowany przez administratora globalnie w systemie.

Gdy mamy już działający interpreter, możemy przejść do zainstalowania serwera MySQL i stworzenia na nim użytkownika oraz bazy.

# apt-get install mysql-server mysql-client

Podczas instalacji zostaniemy zapytani m. in. o hasło dla użytkownika root (do bazy, nie mylić z systemowym) - zapamiętujemy i... po chwili wykorzystujemy:

$ mysql -u root -p
Password:

mysql> create user 'b3'@'localhost' identified by 'b3haslo';
mysql> create database b3;
mysql> grant all on b3.* to 'b3'@'localhost';

Powyższe polecenia oznaczają odpowiednio: stworzenie użytkownika b3 z hasłem b3haslo, stworzenie bazy danych o nazwie b3 i przydzielenie wszystkich praw do bazy danych b3 użytkownikowi o tej samej nazwie.

Jedyne, co nam zostało, to... serwer gry, którego sposób instalacji znajdziesz w innym poradniku - Stawianie serwera Urban Terror od podstaw. Skoro mamy serwer gry, to musimy mieć też użytkownika w systemie, na którym będzie on uruchomiony. Na potrzeby przyszłych rozdziałów zakładam, że jego nazwa to urt.

4. Instalacja

Zakladam, że katalogiem domowym użytkownika, na którym uruchomiony jest serwer gry jest /home/urt. Umieśćmy w nim najnowszą wersję (obecnie 1.8.2) B3, którą znajdziemy na strone http://bigbrotherbot.net/ (wersja Latest pypi Release (Source .zip file)). Pliki możemy rozpakować na swoim komputerze, a następnie przetrasnferować je na nasze konto za pomocą (Win)SCP lub FTP. Dla uproszczenia zmieńmy mu również nazwę z b3-1.8.2/ na b3/. I już.

Należałoby jeszcze wspomnieć o alternatywnym sposobie instalacji jako python .egg. Uważam te rozwiązanie za niekoniecznie łatwiejsze, choćby dlatego, że bez praw roota wymaga "akrobacji" ze zmiennymi środowiskowymi. Instaluje B3 globalnie w systemie. Paczka taka jest co prawda łatwiejsza w aktualizacji, ale tychże będziemy unikać jeśli chcemy wprowadzać zmiany w kodzie B3 - a te wypada zrobić, choćby dla zachowania spójności kolorystycznej. Każdy autor pisze swój plugin inaczej i po załadowaniu ich wszystkich to działa, ale estetycznie pozostawia duże pole manewru.

Aby rozpocząć właściwą konfigurację, należy skopiować domyślny config, który znajdziemy w /home/urt/b3/b3/conf/b3.distribution.xml. Proponuję umieścić go pod nazwą b3.xml w tym samym katalogu (/home/urt/b3/b3/conf). Na koniec trzeba załadować domyślną bazę danych, z której będzie korzystało B3. Przechodzimy do katalogu ze zrzutami domyślnej struktury bazy danych i ładujemy do naszej bazy plik b3.sql (już jako użytkownik b3, zatem uwierzytelniamy się hasłem b3hasło):

$ cd /home/urt/b3/b3/sql
$ mysql -u b3 -p b3 < b3.sql
Password:

5. Konfiguracja

Edytujemy plik /home/urt/b3/b3/conf/b3.xml wedle własnych potrzeb. Poniżej przedstawiam większość opcji konfiguracyjnych, które można w nim znaleźć.

  • <set name="parser">changeme</set> - nazwa parsera, który będzie przetwarzał plik z logiem. Artykuł dotyczy gry Urban Terror, jeśli ktoś do tej pory nie zauważył, dlatego zmienną parser ustawiamy na iourt41.
  • <set name="database">mysql://b3:password@localhost/b3</set> - dane dostępowe do bazy danych w formacie [mysql]://[db-user]:[db-password]@[db-server[:port]]/[db-name]. Zatem w naszym wypadku zmienna ta powinna mieć wartość mysql://b3:b3haslo@localhost/b3.
  • <set name="bot_name">b3</set> - nazwa bota, mało istotna.
  • <set name="bot_prefix">^0(^2b3^0)^7:</set> - każda wiadomość wysyłana przez B3 widoczna na serwerze gry będzie miał swój, ustalony w tej zmiennej, przedrostek.
  • <set name="time_zone">CST</set> - strefa czasowa. Dla Polski powinno być CEST.
  • <set name="log_level">9</set> - poziom szczegółowości loga B3. Dostępne poziomy: 9 = verbose, 10 = debug, 21 = bot, 22 = console. Zostawiamy wartość odpowiednią dla verbose, przynajmniej na początek, gdy możemy napotkać dużo błędów.
  • <set name="rcon_password">password</set> - hasło rcon.
  • <set name="port">27960</set> - port, na którym nasłuchuje serwer UrT.
  • <set name="game_log">games_mp.log</set> - bardzo ważna zmienna wskazująca plik z logiem UrT. Domyślnie będzie znajdował się w /home/urt/.q3a/q3ut4/games.log.
    W tym momencie warto upewnić się, że ustawienia logowania serwera gry są poprawne. Należy zwrócić uwagę na zmienne g_logroll, g_loghits i g_logsync, które odpowiadają kolejno za:
    • rotację logów, gdy przekroczą dany rozmiar (dzięki temu ustawieniu zamiast jednego wielkiego loga, mamy mnóstwo małych. Nie chcemy takiego rozwiązania, które jest kłopotliwe dla B3, dlatego ustawiany zmienną na 0),
    • logowanie każdego trafienia (warto ustawić na 1, żeby mieć dostęp do wielu ciekawych statystyk),
    • synchronizację między logiem znajdującym się w pamięci a dyskiem (chcemy, aby zdarzenia z gry zapisywane zostały niezwłocznie do loga, aby mógł na nie reagować B3, dlatego ustawiany zmienną na 2).
  • <set name="public_ip">127.0.0.1</set> - publiczny adres IP serwera.
  • <set name="rcon_ip">127.0.0.1</set> - adres IP, pod który będą wysyłane polecenia rcon. Ponieważ proces gry uruchomiony jest na tej samej maszynie, zostawiamy 127.0.0.1.
  • <set name="punkbuster">on</set> - PunkBuster nie wspiera UrT, więc ustawiamy na off.

W sekcji plugins znajdziemy listę pluginów do załadowania. Plugin składa się z kodu oraz pliku konfiguracyjnego. Kod pluginu znajdziemy w b3/plugins/ lub b3/extplugins/ w zależności od tego czy został dostarczony z paczką czy napisany przez zewnętrznego autora. Pliki konfiguracyjne znajdziemy odpowiednio w b3/conf/ i b3/extplugins/conf/. Kolejność na liście pluginów ma znaczenie, gdyż w takiej właśnie kolejności będą wywoływane pluginy dla każdego zdarzenia z gry. Istotne to może być, gdy np. jeden plugin korzysta z wyników działania innego pluginu lub przy duzym obciążeniu dobrze jest mieć niski czas reakcji dla najważniejszych pluginów (admin?).

Weźmy na stół losowy plugin:

<plugin name="censor" config="@conf/plugin_censor.xml" />

Linia ta mówi nam, że plugin nazywa się censor, jego kod znajduje się w pliku censor.py (który leży w b3/plugins/, ponieważ jest to plugin dostarczony razem z B3), a jego plik konfiguracyjny znajdziemy w b3/conf/plugin_censor.xml. Fragment @conf jest zamieniany na ścieżkę do domyślnej lokalizacji configów pluginów, czyli /home/urt/b3/b3/conf. Aby wyłączyc plugin, należy linię usunąć, a najlepiej zakomentować. Zakomentowana linia pliku konfiguracyjnego jest ignorowana przez B3 i wygląda następująco:

<!-- <plugin name="censor" config="@conf/plugin_censor.xml" /> -->

Zatem każdy tekst znajdujący sie miedzy <!-- a --> jest ignorowany.

Konfigurację poszczególnych pluginów pozostawiam użytkownikowi. Każdy jest inny, zawiera różne parametry, dlatego - w przypadku problemów - zachęcam do komentowania.

Ładowanie pluginów zewnętrznych odbywa się analogicznie, z tym że nalezy pamiętać o innej ścieżce do pliku konfiguracyjnego. Najlepiej dać sobie spokój z makrami @conf i @b3, a zamiast nich poadawać pełne bezwzględne ściezki w celu uniknięcia błędów.

Nadszedł czas uruchamiania. Aby to zrobić, wykonujemy polecenie (będąc w katalogu /home/urt/b3/):

$ python ./b3_run.py -c b3/conf/b3.xml

W idealnym wypadku powinniśmy ujrzeć na ekranie coś podobnego do:

Starting www.bigbrotherbot.net (b3) v1.8.1 [posix] [Seda]

Using config file: b3.xml
checking for updates...
latest B3 stable version is 1.8.1

_\|/_
(o o) 1.8.2
+----oOO---OOo-----------------------+
| |
| |
| A newer version of B3 is available |
| |
| http://bit.ly/MHI1Wv |
| |
+------------------------------------+


Using external plugin directory: /home/urt/b3/b3/extplugins
Activating log : b3.log
Connecting to DB : OK
Using Gamelog : /home/urt/.q3a/q3ut4/games.log
Testing RCON : OK
Loading Events : 34 events loaded
Loading Plugins : .................. (18)
Starting Plugins : .................. (18)
Startup Complete : B3 is running! Let's get to work!

Jeśli coś pójdzie nie tak i z powrotem ujrzymy znak zachęty, powinniśmy zajrzeć do loga /home/urt/b3.log, gdzie znajdziemy informacje co poszło nie tak.

Gdy już dotrzemy wszystkie configi i bot uruchamia się poprawnie, zapewne chcielibyśmy, aby B3 działało zawsze i w tle. W normalnych warunkach program uruchomiony przez konsolę na zdalnej maszynie zakończy swoje działanie, gdy zamkniemy okno terminala. Aby temu zabiobiec, powinniśmy skorzystać z oprogramowania pomocniczego, które powoli nam wygodnie pozostawić uruchomiony program w tle. Takim programem jest screen:

# apt-get install screen

Stworzymy teraz krótki skrypt, który pozwoli nam na łatwe uruchamianie B3 w tle. W katalogu /home/urt/b3/ tworzymy plik START_B3.sh o zawartości:

#!/bin/bash
screen -m -d -S b3 python ./b3_run.py -c /home/urt/b3/b3/conf/b3.xml

Nadajemy mu prawa wykonywania:

$ chmod +x START_B3.sh

I... uruchamiamy:

$ ./START_B3.sh

Do programu możemy dostać się poleceniem:

$ screen -r

a w przypadku wielu programów uruchomionych w tle:

$ screen -r b3

Jeśli screen nie zabierze nas do okna B3, to zawsze pamiętajmy o b3.log.

6. Korzystaj

Wejdź teraz do gry i wpisz !iamgod, aby uzyskać prawa super administratora. Pamiętaj, nikt nie może cię w tym uprzedzić, w przeciwnym razie trzeba będzie ręcznie dłubać w bazie. Teraz czeka cię długa lektura dokumentacji. Znajdziesz tam informacje na temat poleceń, które możesz wydawać botowi, a także szczegółową instrukcję konfigurowania pluginów, które zostały potraktowane tutaj tylko pobieżnie. Aby wyłączyć bota wpisujemy w grze !die lub ctrl+c w oknie B3 (screen -r b3).

Tak naprawdę dopiero teraz zaczyna się zabawa, jakby nie patrzeć mamy dopiero co działający bot, ale przecież chcielibyśmy, aby wyrównywał nam drużyny, wyświetlał statystyki, wyrzucał za niecenzuralne słowa i pomagał w wielu innych sytuacjach. Liczba zastosowań jest nieograniczona, dlatego zapraszam do zadawania pytań w komentarzach w jaki sposób osiągnąć dany efekt. W wielu przypadkach ogranicza się to do (ściągnięcia i) dodania nowego pluginu do listy, ale jeśli chcemy zmienić działanie lub sposób prezentacji danej funkcjonalności nierzadko musimy zajrzeć do matriksa tzn. kodu.

Obrazek użytkownika fruk
fruk

O artykule:

Komentarze:

Obrazek użytkownika DFN
DFN, 6 lat temu

Świetny poradnik, dodaję link do FAQ.

#
Obrazek użytkownika Wlodi
Wlodi, 6 lat temu

Dobra robota!Przyda się.

#
Obrazek użytkownika Rosa
Rosa, 6 lat temu

O tak super artykuł. Przyda się. Tym bardziej, że nie było Polskich artykułów/manuali na ten temat.

#
Obrazek użytkownika Scalator
Scalator, 6 lat temu

manual super - myślę, że korzystali z niego będą nie tylko admini UrT

#
Obrazek użytkownika killshot
killshot, 6 lat temu

Takie poradniki ułatwiają życie, dzięki fruk

#
Obrazek użytkownika Garreth
Garreth, 6 lat temu

Żeby bot mógł wstać po komendzie !restart, trzeba dopisać parametr -r przy jego uruchamianiu. Ścieżki do cfg podawać nie trzeba jeżeli korzystamy z pliku b3/conf/b3.xml. Podawanie ścieżki się przydaje, gdy na tych samych plikach bota, chcemy uruchomić go dla kilku serwerów, z których każdy ma osobny plik b3.xml. Ale to takie szczegóły:)

P.S. Wersja 1.8.2 mi się coś sypała, nie potrafił bot wysyłać komend przez rcon...

#
Obrazek użytkownika fruk
fruk, 6 lat temu

Prawdę mówiąc nie testowałem nieczego na 1.8.2, bo za długo się męczyłem, żeby dostosować 1.8.1. Ważne, że parser zwraca już prawidłowy damage dla hitów. O ile pamiętam, nawet dzięki Tobie ;)

#
Obrazek użytkownika Garreth
Garreth, 6 lat temu

Tak, tak. Jeszcze z Majkim spisywaliśmy dmg broni, żeby dopisać do parsera. Ale niestety dmg z HE jest nie do przewidzenia. Chociaż zobaczymy ile będzie pracy z BBB jak wyjdzie 4.2.

#
Obrazek użytkownika Majki
Majki, 6 lat temu

No BBB, a właściwie to jego dzielni developerzy i biedni beta-testerzy, dostaną do implementacji sporo nowych komend i co nieco z logów do przeparsowania. Ale poczekajmy z tym do oficjalnej premiery :}

#
Obrazek użytkownika Garreth
Garreth, 6 lat temu

Właśnie tu leży problem, bo w dniu premiery 4.2 prawdopodobnie bbb się posypią (chyba, że istnieje jakaś super tajna współpraca Courguette z FS, albo logi pozostaną takie same, a jedynie komunikaty widoczne przez graczy będą inne).

#