piątek, 2 marca 2012

Hardbot, irc itp

Niedawno przypomniałem sobie o ircu i zatęskniłem za starymi czasami ;] Szybki przelot przez kanały, gdzieniegdzie znajome nicki, ale generalnie pustki. Czaty www zrobiły swoje. Chwila zadumy nad obsługą irssi, niegdyś tak prostą, intuicyjną...

Przypomniałem sobie również o pewnym programie którego chyba nigdy szerzej nie publikowałem - HardBot. Jest to bot do irca dla zaawansowanych użytkowników, działający na zasadzie firewalla. O dziwo skompilował się bez zająknięcia na najnowszym Debianie Squeeze po przeszło 5 latach - zero poprawek w kodzie przez ten czas. Czasy irca już raczej przeminęły, więc zapewne nie wielu osobom się to przyda...



Po co jeszcze jeden bot?

Istnieje już wiele botów dla irca z których będziesz zadowolony. Ten nie jest ani łatwy w użyciu, ani nie posiada żadnych wymyślnych mechanizmów dzięki którym możesz chcieć zabezpieczyć swój kanał lub zapanować nad innym ;] Należy do tych programów, które jedni lubią od pierwszego użycia, a inni nienawidzą. Mam nadzieje, ze siebie zaliczysz do tej pierwszej kategorii :)

Tak naprawdę,HardBot powstał z mojego lenistwa i kompletnego braku chęci do zagłębiania się w skomplikowane tajniki konfiguracji botów. Zwykle trzeba ustawiać w nich dziesiątki zmiennych i opcji których dokładny sens jest zaprogramowany w kodzie programu i znany tylko programiście. Z drugiej strony niektóre posiadają nawet swoje mini języki lub korzystają z istniejących interpreterów (np. perla) by dać użytkownikom swobodę i nieograniczone możliwości.

Jednak dla wspomnianego wyżej lenia (czyli mnie), zupełnie bezsensowna jest również konieczność zgłębiania wielu stron podręcznika by wymusić określona i prostą reakcje na konkretne zdarzenie. I właśnie na tym polega działanie HardBota,na filtrowaniu zdarzeń i odpowiadaniu na wybrane, tak jak sobie tego życzymy. Plik konfiguracyjny składa się wiec głownie z reguł określających jak odpowiadać na interesujące nas zdarzenia.

Co muszę wiedzieć?

By sprawnie posługiwać się HardBotem wystarczy dobra znajomość zasad, na jakich działa IRC oraz przynajmniej minimalna wyrażeń regularnych, które są używane do filtrowania zdarzeń. Bliższe informacje na temat irca, można znaleźć pod adresem http://www.irchelp.org/irchelp/rfc/, polecam zwłaszcza zapoznanie się z rozdziałem czwartym, "MESSAGE DETAILS" z dokumentu RFC 1459. Jeżeli chodzi o wyrażenia regularne mogę polecić książkę "Wyrażenia regularne" pana Friedla, choć liczę na to, ze użytkownik systemów z rodziny Unix miał już z nimi kontakt.

Szybkie wprowadzenie

Zapewne większość z Was konfigurowała już kiedyś jakiś filtr pakietów. Działanie HardBota opiera się na podobnych zasadach. Podobnie użytkownik jest ograniczony przede wszystkim poziomem swojej wiedzy na temat protokołów (np. TCP/IP) i składni poleceń, a tutaj protokołu IRC i wyrażeń regularnych. Im większa wiedza dysponujesz, tym lepsze rezultaty jesteś w stanie osiągnąć.

Niestety wynika z tego, ze nie jest to narzędzie dla początkujących, ani dla osób chcących mieć rozbudowany i duży botnet. Wynika to właśnie ze względu na operowanie na tym najniższym poziomie, na poziomie protokołu IRC (stąd tez nazwa HardBot). Na początek definiujemy listę sesji z których bot łączy się z serwerem,a następnie reguły, które mogą dotyczyć tylko konkretnej sesji, ich grupy lub wszystkich. Przykładowa definicja sesji wygląda tak:

user test_user server warszawa.irc.pl port 6667 nickappend 432-^` realname HardBot

Parametr "nickappend" służy do określenia jakie znaki będą dodawane do nicka (który tworzony jest od nazwy użytkownika, u góry podanej jako "test_user") w przypadku gdyby był już zajęty przez kogoś innego. Teraz krótkie wprowadzenie do reguł. Każda reguła składa się z trzech części. Z parametrów dotyczących bezpośrednio reguły, filtra określającego interesujące nas zdarzenie oraz sposobu odpowiedzi na to zdarzenie.

By zrozumieć specyfikę reguł proponuje uruchomić program z opcją -d, wtedy będziemy widzieć jakie dokładnie komunikaty otrzymuje bot od serwera i w jaki sposób możemy skonstruować regułę. Omówimy to wszystko analizując przykładowe reguły.

Serwer irc wysyła co określony czas np "PING :poznan.irc.pl". Ma to na celu wykrycie nie aktywnych/zawieszonych sesji i rozłączenie takich klientów którzy zabierają tylko zasoby systemowe. Pierwsza rzecz, to zdefiniować regułę która będzie odpowiadać na ping od serwera irc:

rule add match PING to .* reply PONG to $to

Czyli dodaj regułę która pasuje do polecenia PING, (którego adresatem jest .* tzn. cokolwiek) i wyślij w odpowiedzi polecenie PONG do $to - przy czym $to jest rozwijane jako zmienna z przypasowania .* następującego po słowie kluczowym "to".

Następnie definiujemy odpowiedź na zapytanie o wersje programu, polecenie ma postać (:ircuser!~user@fqdn_host PRIVMSG other_user :VERSION):

rule add delay 5 match PRIVMSG desc ":.VERSION" reply NOTICE at $snick desc "$desc Witam $snick, jestem HardBota!"

Zmienna $snick, to nazwa użytkownika który odpytuje o wersje, natomiast $desc to wszystko to, co idzie w zapytaniu po dwukropku. Parametr "delay", określa z jakim opóźnieniem (w sekundach) zostanie wysłana odpowiedź do serwera. Jest to konieczne, gdyż serwer może również odrzucić połączanie gdy wysyłamy zbyt wiele lub zbyt szybko i dostaniemy automatycznego bana za flood.

Dopiero teraz jesteśmy gotowi do wejścia na kanał, oczywiście po odebraniu komunikatu powitalnego od serwera:

rule add delay 5 match 001 at .* reply JOIN at #channell

Automatyczne wejście na kanał po odebraniu zaproszenia od zaufanego użytkownika:

rule add delay 5 match INVITE src *!*@fqdn_host at #.* reply JOIN at $at

Poproś o zaproszenie na kanał inną sesje, gdy kanał jest tylko dla zaproszonych:

rule add user ^test_user$$ match 473 at .* reply PRIVMSG at $test_user desc ":invite $at"

Jeżeli nasz test_user został zbanowany również poproś o zaproszenie:

rule add user ^myusername$$ match 474 at .* reply PRIVMSG at $test_user desc ":invite $at"

Ponieważ zmienne zaczynają się od symbolu $, to wpisanie $$ spowoduje że HardBot wstawi w dane miejsc znak $ i nie będzie próbował rozwiązywać zmiennej. Zmienna $test_user jest rozwijana jako aktualna nazwa naszego użytkownika (ze względu na parametr nickappend nie koniecznie będzie to "test_user"). Powyższe dwie reguły nabierają większego sensu gdybyśmy weszli dwoma HardBotami na kanał :)

Natomiast definiując poniższą regułę jesteśmy w stanie rozmawiać posługując się naszym botem. Wystarczy wysłać mu wiadomość według wzorca "say #chanel jestem botem"

rule add match PRIVMSG src *!*@fqdn_host desc ":say ([^ ]+) (.*)" reply PRIVMSG at $desc1 desc :$desc2

Jak widać przy pomocy nawiasów zdefiniowaliśmy odwołania wsteczne, które są rozwijane jako kolejne zmienne z cyfrą na końcu - w tym przypadku $desc1 i $desc2. Zmienna $desc oczywiście zawiera cały komunikat po dwukropku. Dopasowanie z odwołaniami wstecznymi możemy używać dla wszystkich parametrów! Pamiętaj tylko, że nie każdy parametr występuje przy określonym komunikacie od serwera. Najlepiej obejrzyj początek pliku irc.c, gdzie jest to zdefiniowane w tablicy.

Nadanie statusu operatora przyjacielowi:

rule add match JOIN src *!*@fqdn_host at #.* reply MODE flags +o at $at to $snick

Itp itd, jak widać możemy zdefiniować praktycznie wszystko, cały zestaw reguł którymi ma się kierować nasz bot. Więcej przykładów jest w załączonym pliku konfiguracyjnym. Dla mnie jest to bardzo dobre i proste w użyciu narzędzie, czy dla Was również... oceńcie sami :)

Dodam, że program powstawał bardzo szybko, niecałe dwa tygodnie - kolejny dowód na to, że grunt to mieć dobry pomysł :)

Program można pobrać tutaj, wystarczy skompilować poleceniem make.