<!-- $Id$ -->
<chapter id="daemon">
	<title>LMS Daemon</title>
	<sect1 id="daemon-intro">
	<title>Informacje podstawowe</title>
	<para>Napisany w języku C program ma ułatwiać zarządzanie usługami. Sam demon odpowiada
	za uruchamianie odpowiednich modułów na żądanie użytkownika. Moduły
	natomiast, służą do tworzenia plików konfiguracyjnych na podstawie 
	danych z bazy LMS'a oraz restartowania odpowiednich usług na serwerze.
	Spełniają także inne funkcje np. zbieranie statystyk, badanie aktywności
	hostów, naliczanie opłat, powiadamianie o zaległościach.</para>
		<sect2 id="daemon-requirements">
		<title>Wymagania</title>
			<para>Oto lista rzeczy, które <emphasis>lmsd</emphasis> potrzebuje już na etapie kompilacji:
			<itemizedlist>
			<listitem>
				<para>interfejs użytkownika <emphasis>LMS-UI</emphasis></para>
			</listitem>
			<listitem>
				<para><filename>libmysqlclient</filename> (tj. pełnej instalacji MySQL'a lub odpowiedniego 
				pakietu) lub <filename>libpq</filename> w przypadku bazy PostgreSQL</para>
      			</listitem>
			<listitem>
				<para><filename>libdl</filename> (to w każdej dzisiejszej dystrybucji jest)</para>
			</listitem>
			<listitem>
				<para>kompilator języka C (testowany na gcc-2.95.x i nowszych)</para>
			</listitem>
			<listitem>
				<para>moduł <filename>ggnotify</filename> wymaga biblioteki <filename>libgadu</filename>
				i jej plików nagłówkowych</para>
			</listitem>
			<listitem>
				<para>moduł <filename>parser</filename> wymaga pakietu bison w wersji 1.875 lub nowszej 
				oraz pakietu flex</para>
			</listitem>
			<listitem>
				<para>moduły <filename>ewx-*</filename> wymagają biblioteki net-snmp i jej plików nagłówkowych.</para>
			</listitem>
			</itemizedlist>
      			</para>
		</sect2>
		<sect2 id="daemon-install">
		<title>Instalacja</title>
			<para>Przed kompilacją należy przy pomocy skryptu <filename>./configure</filename>
			ustalić opcje przedstawione na poniższym listingu (w nawiasach podano
			wartości domyślne opcji):
<screen>
  --help                pomoc
  --enable-debug0       logowanie zapytań SQL (wyłączone)
  --enable-debug1       logowanie zdarzeń (wyłączone)
  --with-pgsql          gdy korzystasz z bazy PostgreSQL (wyłączone)
  --with-mysql          gdy korzystasz z bazy MySQL (włączone)
  --prefix=PREFIX       docelowy katalog instalacyjny demona i modułów (/usr/local)
  --lmsbindir=DIR       docelowa lokalizacja binarki lmsd (PREFIX/lms/bin)
  --lmslibdir=DIR       docelowa lokalizacja modułów lmsd (PREFIX/lms/lib)
  --libdir=DIR          lokalizacja bibliotek bazy danych (/usr/lib)
  --incdir=DIR          lokalizacja plików nagłówkowych bazy danych (/usr/include)
  --inifile=FILE        plik konfiguracyjny - wyłącza konfigurację przez UI
</screen>
			Zatem wymagane jest określenie bazy z jakiej będziemy korzystać (-with-mysql 
			lub -with-pgsql) oraz położenia bibliotek dostarczanych wraz z bazą (--incdir, 
			--libdir). Możliwe jest zmuszenie demona do korzystania
			z plików konfiguracyjnych zamiast bazy danych. Nie jest
			możliwe używanie obu sposobów przechowywania konfiguracji,
			dlatego należy o tym zdecydować przed kompilacją.
<screen>
# ./configure --with-pgsql --libdir=/usr/local/pgsql/lib --incdir=/usr/local/pgsql/include
</screen>
    			Następnie kompilacja i instalacja (umieszczenie demona w katalogu
			określonym zmienną --prefix):
<screen>
# make && make install
</screen>
			Skompilowane moduły (pliki z rozszerzeniem <filename>.so</filename>),
			znajdujące się w katalogu <filename>modules/nazwa_modułu</filename> zostają 
			umieszczone w katalogu PREFIX/lms/lib, a główny program (lmsd) w katalogu
			PREFIX/lms/bin.
			</para>
		</sect2>
		<sect2 id="daemon-config">
		<title>Konfiguracja</title>
			<para>Całą konfigurację demona i modułów przeprowadza się przy pomocy
			<emphasis>LMS-UI</emphasis> w menu Konfiguracja -> Demon.
			Konfigurację modułów omówiono w osobnych rozdziałach ich dotyczących.
			Podstawowe parametry pracy demona i dane do połączenia z bazą danych
			podaje się jako opcje linii komend, zgodnie z poniższym listingiem:
<screen>
--dbhost -h host[:port]    host na którym zainstalowana jest baza danych (domyślnie: 'localhost')
--dbname -d nazwa_bazy     nazwa bazy danych (domyślnie: 'lms')
--dbuser -u użytkownik     nazwa użytkownika bazy danych (domyślnie: 'lms')
--dbpass -p hasło          hasło do bazy danych (domyślnie: puste)
--hostname -H nazwa_hosta  host, na którym działa demon. Domyślnie przyjmowana jest nazwa
                           zwracana przez komendę hostname, ale można ją nadpisać. Nazwa
                           ta musi zgadzać się z nazwą hosta podaną w konfiguracji hostów
--pidfile -P pid_file      pidfile where daemon write pid (default: none)
--ssl -s                   wymusza bezpieczne połączenie z bazą danych (domyślnie: wyłączone)
--command -c polecenie     polecenie powłoki do wykonania przed każdym połączeniem z bazą 
                           tzn. co minutę (domyślnie: puste)
--instance -i "instancja[ ...]" lista instancji (modułów) do przeładowania. Wszystkie pozostałe 
                           zostaną pominięte
--reload -q                wykonuje przeładowanie i kończy pracę
--reload-all -r            wykonuje przeładowanie wszystkich instancji (także tych, które mają
                           zdefiniowany crontab) i kończy pracę
--foreground -f            działa na pierwszym planie (nie forkuje się) 
--version -v               wyświetla wersję i prawa licencyjne
</screen>
			Opcje dostępu do bazy są także odczytywane ze zmiennych powłoki:
			LMSDBPASS, LMSDBNAME, LMSDBUSER, LMSDBHOST, LMSDBPORT.
			<note><para>Lista instancji składa się z nazw instancji oddzielonych 
			spacją. W nazwach instancji zawierających spacje należy zamienić je
			na znaki '\s', np. <prompt>lmsd -i "moja\sinstancja"</prompt>.
			</para></note>
			</para>
			<para>Konfiguracja demona jest podzielona na hosty (umożliwiając
			osobne konfigurowanie i przeładowywanie demonów zainstalowanych
			na różnych komputerach/routerach) oraz sekcje konfiguracyjne 
			nazwane instancjami.</para>
			<para>Instancja oprócz parametrów konfiguracyjnych wybranego modułu
			zawiera opcje podstawowe, takie jak:
			<itemizedlist>
			    <listitem>
				<para>Nazwa</para>
				<para>Nazwa instancji unikalna w obrębie jednego hosta.</para>
				<para>Przykład: system</para>
			    </listitem>
			    <listitem>
				<para>Priorytet</para>
				<para>Liczba określająca priorytet, czyli kolejność wykonania instancji. Instancja o najniższym numerze zostanie wykonana jako pierwsza.</para>
				<para>Przykład: 10</para>
			    </listitem>
			    <listitem>
				<para>Moduł</para>
				<para>Nazwa pliku modułu (z rozszerzeniem lub bez). Jeśli nie podano
				ścieżki demon będzie szukał modułu w katalogu PREFIX/lms/lib, do
				którego trafiają moduły podczas "make install".</para>
				<para>Przykład: /usr/lib/system.so</para>
			    </listitem>
			    <listitem>
				<para>Crontab</para>
				<para>Czas wykonania modułu określany w sposób podobny do używanego w programie crontab. Wszystkie dane muszą być numeryczne.
				Podany przykład spowoduje wykonywanie wybranej instancji co 5 minut, w godzinach od 8 do 18. Gdy opcja ta jest pusta instancja 
				zostanie wykonana wyłącznie podczas przeładowania. Domyślnie: pusta.</para>
				<para>Przykład: */5 8-18 * * *</para>
			    </listitem>
			</itemizedlist>
			</para>
			<para>Jakakolwiek zmiana w konfiguracji nie wymaga restartu demona.</para> 
		</sect2>
		<sect2 id="daemon-run">
		<title>Uruchomienie</title>
			<para>Program domyślnie działa w trybie demona. Wtedy 
			przeładowanie konfiguracji i usług jest dokonywane na żądanie, przy użyciu menu 
			'Przeładowanie' w <emphasis>LMS-UI</emphasis>. Sprawdzenie żądania przeładowania
			oraz odczyt konfiguracji (w szczególności listy instancji i ich konfiguracji)
			następuje co minutę. Gdy demon wykryje żądanie wykonania reloadu, wywoła 
			wszystkie włączone instancje. Instancje z podaną opcją 'crontab' zostaną
			wykonane o określonym tą opcją czasie.</para>
			<para>Innym sposobem uruchomienia jest jednorazowy reload z wykorzystaniem
			opcji -q. Ten sposób najczęściej używany jest w celach testowych, a w połączeniu
			z opcją -i pozwala na wykonanie dowolnych instancji z pominięciem pozostałych
			zapisanych w bazie oraz bez względu na wartość opcji 'crontab' tych 
			instancji.</para>
		</sect2>
	</sect1>
	<sect1 id="daemon-modules">
	<title>Moduły</title>
	<para>Sam demon potrafi tylko uruchamiać moduły i to one odwalają całą robotę. 
	Większość modułów jest przeznaczona do określonego zastosowania, jedynie 'hostfile' 
	można używać do różnych konfigów (usług), np. różnych typów firewalli.
	Parametry konfiguracyjne modułów umieszcza się w sekcjach instancji je wywołujących.</para>
		<sect2 id="daemon-moduleslist">
		<title>Lista dostępnych modułów</title>
			<table id="modules-list">
			<title>Lista modułów demona lmsd</title>
			<tgroup cols="2">
			<colspec ALIGN="center" COLWIDTH="200">
			<colspec ALIGN="center" COLWIDTH="300">
				<thead>
				<row>
				<entry>Nazwa</entry>
				<entry>Opis</entry>
				</row>
				</thead>
				<tbody>
				<row>
				<entry><xref linkend="daemon-system"></entry>
				<entry>Wywoływanie poleceń powłoki</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-parser"></entry>
				<entry>Parser uniwersalnych skryptów T-Script</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-dhcp"></entry>
				<entry>Konfiguracja serwera dhcpd</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-cutoff"></entry>
				<entry>Odłączanie klientów z zaległościami w opłatach</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-dns"></entry>
				<entry>Konfiguracja serwera dns</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-ethers"></entry>
				<entry>Tworzenie pliku /etc/ethers</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-hostfile"></entry>
				<entry>Moduł uniwersalny (np. tworzenie reguł iptables)</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-notify"></entry>
				<entry>Powiadamianie klientów o zaległościach w opłatach pocztą elektroniczną</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-ggnotify"></entry>
				<entry>Powiadamianie klientów o zaległościach w opłatach przez gadu-gadu</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-payments"></entry>
				<entry>Naliczanie opłat abonamentowych</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-oident"></entry>
				<entry>Konfiguracja oident</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-tc"></entry>
				<entry>Tworzenie reguł TC</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-tc-new"></entry>
				<entry>Tworzenie reguł TC (powiązania komputerów z taryfami)</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-traffic"></entry>
				<entry>Statystyki wykorzystania łącza</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-pinger"></entry>
				<entry>Badanie aktywności klientów</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-ewx-pt"></entry>
				<entry>Konfiguracja EtherWerX PPPoE Terminatora</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-ewx-stm"></entry>
				<entry>Konfiguracja EtherWerX Standalone Traffic Managera</entry>
				</row>
				<row>
				<entry><xref linkend="daemon-ewx-stm-channels"></entry>
				<entry>Konfiguracja EtherWerX Standalone Traffic Managera (ze rozszerzoną obsługą kanałów)</entry>
				</row>
				</tbody>
			</tgroup>
			</table>
		</sect2>
		<sect2 id="daemon-system" xreflabel="system">
		<title>System</title>
		    <sect3 id="system-desc">
		    <title>Opis</title>
		    <para>Jedyne co robi ten moduł to wykonanie zadanego polecenia (listy poleceń)
		    powłoki i/lub komendy SQL. Może się przydać gdy chcesz podczas przeładowania konfiguracji 
		    wykonać jakąś komendę lub uruchomić zewnętrzny skrypt, na przykład jeden 
		    z tych, które możesz znaleźć w katalogu <filename>/bin</filename>.
		    W pierwszej kolejności jest wykonywane polecenie SQL.</para>
		    </sect3>
		    <sect3 id="system-config">
		    <title>Konfiguracja</title>
		    <para>W związku z powyższym możesz zdefiniować jedynie treść polecenia SQL lub
		    shella. Powłoka powinna sobie także poradzić z listą poleceń oddzielonych 
		    średnikami:</para>
		    <itemizedlist>
			<listitem>
			    <para>sql</para>
			    <para>Polecenie SQL. Domyślnie: puste.</para>
			    <para>Przykład: <prompt>sql = 'DELETE FROM stats WHERE dt < %NOW% - 365*86400'</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Polecenie powłoki. Domyślnie: puste.</para>
			    <para>Przykład: <prompt>command = 'echo -n "tu moduł "; echo "system"'</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-payments" xreflabel="payments">
		<title>Payments</title>
		    <sect3 id="payments-desc">
		    <title>Opis</title>
		    <para>Moduł nalicza opłaty abonamentowe klientów oraz opłaty stałe. Należy go uruchamiać 
		    codziennie. Opłaty naliczane na podstawie przypisanych klientowi
		    taryf zapisywane są do bazy wraz z komentarzem określonym zmienną 'comment'.
		    Po naliczeniu opłat tworzone są faktury. Komentarz do opłaty stałej to zlepek
		    składający się z jej nazwy oraz wierzyciela. Na końcu usuwane są z bazy nieaktualne
		    obciążenia klientów.</para>
		    </sect3>
		    <sect3 id="payments-config">
		    <title>Konfiguracja</title>
		    <para>Dla tego modułu są dostępne następujące zmienne konfiguracyjne:</para>
		    <itemizedlist>
			<listitem>
			    <para>comment</para>
			    <para>Komentarz do operacji. '%period' zostanie zamienione na daty od-do 
			    należnego abonamentu, np. '2003/10/10 - 2003/11/09', '%tariff' na nazwę
			    odpowiedniej taryfy/zobowiązania, %month na pełną nazwę bieżącego
			    miesiąca, %year na bieżący rok, a %next_mon na następny miesiąc w formacie RRRR/MM. 
			    Domyślnie: 'Subscription: '%tariff' for period: %period'.</para>
			    <para>Przykład: <prompt>comment = 'Abonament miesięczny za okres %period' </prompt></para>
			</listitem>
			<listitem>
			    <para>settlement_comment</para>
			    <para>Komentarz do operacji wyrównania. '%period' zostanie zamienione na daty od-do 
			    okresu wyrównania, np. '2003/10/20 - 2003/11/09', a '%tariff' na nazwę
			    odpowiedniej taryfy. Domyślnie odpowiada opcji <prompt>comment</prompt>.</para>
			    <para>Przykład: <prompt>settlement_comment = 'Wyrównanie za okres %period'</prompt></para>
			</listitem>
			<listitem>
			    <para>up_payments</para>
			    <para>"Naliczanie z góry", czyli czy okres w komentarzu ma być liczony do 
			    przodu, czy do tyłu w stosunku do daty naliczenia opłaty. Domyślnie: yes.</para>
			    <para>Przykład: <prompt>up_payments = no</prompt></para>
			</listitem>
			<listitem>
			    <para>expiry_days</para>
			    <para>Określa liczbę dni od daty wygaśnięcia przypisanych klientowi zobowiązań, 
			    po której dane tego zobowiązania zostaną usunięte z bazy. Przy ustawieniu na '0' dane
			    zostaną usunięte natychmiast po dacie, do której obowiązywało zobowiązanie. Domyślnie: 30.</para>
			    <para>Przykład: <prompt>expiry_days = 365</prompt></para>
			</listitem>
			<listitem>
			    <para>deadline</para>
			    <para>Termin płatności podany w dniach. Domyślnie: 14.</para>
			    <para>Przykład: <prompt>deadline = 21</prompt></para>
			</listitem>
			<listitem>
			    <para>paytype</para>
			    <para>Rodzaj płatności (1-gotówka, 2-przelew, 3-przelew/gotówka,
            4-karta, 5-kompensata, 6-barter, 7-umowa). Domyślnie: 2 (przelew).</para>
			    <para>Przykład: <prompt>paytype = 1</prompt></para>
			</listitem>
			<listitem>
				<para>numberplan</para>
				<para>ID planu numeracyjnego faktur. 
				Domyślnie: 0 (plan domyślny).</para>
				<para>Przykład: <prompt>numberplan = 0</prompt></para>
			</listitem>
			<listitem>
				<para>check_invoices</para>
				<para>Włącza automatyczne oznaczanie faktur jako rozliczonych
				dla klientów z bilansem większym równym zero.
				Domyślnie: wyłączona.</para>
				<para>Przykład: <prompt>check_invoices = 1</prompt></para>
			</listitem>
			<listitem>
				<para>networks</para>
				<para>Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
				Domyślnie: pusta (wszystkie sieci).</para>
				<para>Przykład: <prompt>networks = "lan1 lan2"</prompt></para>
			</listitem>
			<listitem>
				<para>excluded_networks</para>
				<para>Lista nazw sieci, które mają pominięte. Wielkość liter nie ma znaczenia.
					Domyślnie: pusta (żadna).</para>
				<para>Przykład: <prompt>excluded_networks = "lan3 lan4"</prompt></para>
			</listitem>
			<listitem>
				<para>customergroups</para>
				<para>Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
				Domyślnie: pusta (wszystkie grupy).</para>
				<para>Przykład: <prompt>customergroups = "grupa1 grupa2"</prompt></para>
			</listitem>
			<listitem>
				<para>excluded_customergroups</para>
				<para>Lista nazw grup klientów, które mają być pominięte. Wielkość liter nie ma znaczenia. 
					Domyślnie: pusta (żadna).</para>
				<para>Przykład: <prompt>excluded_customergroups = "grupa3 grupa4"</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-notify" xreflabel="notify">
		<title>Notify</title>
		    <sect3 id="notify-desc">
		    <title>Opis</title>
		    <para>Moduł 'notify' służy do informowania klientów o zaległościach
		    w opłatach za pomocą poczty elektronicznej. Aktualne saldo klienta
		    porównywane jest ze zmienną 'limit', jeśli jest niższe - wiadomość
		    zostaje wysłana. Treść wiadomości pobierana jest z przygotowanego szablonu, 
		    w którym można stosować następujące zmienne:
		    <itemizedlist>
			<listitem>
			    <para>%saldo - aktualne saldo klienta (także %B)</para>
			</listitem>
			<listitem>
			    <para>%b - wartość bezwzględna aktualnego salda klienta</para>
			</listitem>
			<listitem>
			    <para>%pin - PIN klienta</para>
			</listitem>
			<listitem>
			    <para>%name - imię klienta</para>
			</listitem>
			<listitem>
			    <para>%lastname - nazwisko/nazwa klienta</para>
			</listitem>
			<listitem>
			    <para>%last_10_in_a_table - wyciąg ostatnich 10 operacji na kocie klienta</para>
			</listitem>
		    </itemizedlist></para>
		    </sect3>
		    <sect3 id="notify-config">
		    <title>Konfiguracja</title>
		    <para>Poniżej przedstawiono dostępne opcje konfiguracyjne modułu 'notify':</para>
		    <itemizedlist>
			<listitem>
			    <para>template</para>
			    <para>Lokalizacja pliku z szablonem wiadomości. Domyślnie: pusty</para>
			    <para>Przykład: <prompt>template = modules/notify/sample/mailtemplate</prompt></para>
			</listitem>
			<listitem>
			    <para>file</para>
			    <para>Lokalizacja pliku tymczasowego. Domyślnie: /tmp/mail</para>
			    <para>Przykład: <prompt>file = /tmp/mail.txt</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Polecenie powłoki wysyłające e-maila. '%address' zostanie zastąpione
			    adresem e-mail klienta. Domyślnie: 'mail -s "Liabilities Information" %address &lt; /tmp/mail'.</para>
			    <para>Przykład: <prompt>command = 'mail %address -s "musisz zapłacić, bo jak nie..." &lt; /tmp/mail.txt'</prompt></para>
			</listitem>		
			<listitem>
			    <para>limit</para>
			    <para>Wiadomość o zaległościach zostaje wysłana jeśli saldo klienta 
			    spadnie poniżej kwoty określonej zmienną limit. Domyślnie: 0</para>
			    <para>Przykład: <prompt>limit = -20</prompt></para>
			</listitem>
			<listitem>
			    <para>debug_mail</para>
			    <para>Określa adres na który zostaną wysłane wszystkie wiadomości, przydatne
			    podczas testów. Domyślnie: puste.</para>
			    <para>Przykład: <prompt>debug_mail = localhost@moja.net</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-ggnotify" xreflabel="ggnotify">
		<title>Ggnotify</title>
		    <sect3 id="ggnotify-desc">
		    <title>Opis</title>
		    <para>Odpowiednik modułu 'notify' służący do wysyłania wiadomości gadu-gadu.
		    Aktualne saldo klienta porównywane jest ze zmienną 'limit', jeśli jest niższe 
		    - wiadomość zostaje wysłana. Treść wiadomości pobierana jest z przygotowanego szablonu, 
		    w którym można stosować zmienne takie jak dla modułu 'notify' (może to być też ten sam 
		    szablon).</para>
		    <para>Moduł wymaga zainstalowanej biblioteki <filename>libgadu</filename> oraz źródeł
		    programu <filename>ekg</filename>. Odpowiednie ścieżki do nich należy ustawić
		    w <filename>modules/ggnotify/Makefile</filename> przed kompilacją modułu.</para>
		    </sect3>
		    <sect3 id="ggnotify-config">
		    <title>Konfiguracja</title>
		    <para>Podobnie jak w 'notify' masz do dyspozycji następujące zmienne:</para>
		    <itemizedlist>
			<listitem>
			    <para>template</para>
			    <para>Lokalizacja pliku z szablonem wiadomości. Domyślnie: pusty.</para>
			    <para>Przykład: <prompt>template = modules/ggnotify/sample/mailtemplate</prompt></para>
			</listitem>
			<listitem>
			    <para>uin</para>
			    <para>Identyfikator gadu-gadu użytkownika wysyłającego wiadomości. 
			    Domyślnie: pusty.</para>
			    <para>Przykład: <prompt>uin = 1234567</prompt></para>
			</listitem>
			<listitem>
			    <para>password</para>
			    <para>Hasło dla konta określonego zmienną 'uin'. Domyślnie: puste.</para>
			    <para>Przykład: <prompt>password = "moje_trudne__hasło"</prompt></para>
			</listitem>		
			<listitem>
			    <para>limit</para>
			    <para>Wiadomość o zaległościach zostaje wysłana jeśli saldo klienta 
			    spadnie poniżej kwoty określonej zmienną limit. Domyślnie: 0</para>
			    <para>Przykład: <prompt>limit = -20</prompt></para>
			</listitem>
			<listitem>
			    <para>debug_uin</para>
			    <para>Jeśli ustawione, na to konto zostaną wysłane wszystkie wiadomości.
			    Domyślnie: puste.</para>
			    <para>Przykład: <prompt>debug_uin = 7654321</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-cutoff" xreflabel="cutoff">
		<title>Cutoff</title>
		    <sect3 id="cutoff-desc">
		    <title>Opis</title>
		    <para>Cutoff zmienia status komputerów na 'odłączony' i/lub włącza ostrzeżenia
		    klientom, którzy mają na koncie zaległości większe niż określony limit. 
		    Ponadto odłącza komputery klientów, którym wygasły wszystkie zobowiązania
		    lub są one zawieszone. Ten moduł nie zajmuje się fizycznym blokowaniem
		    dostępu do sieci.</para>
		    </sect3>
		    <sect3 id="cutoff-config">
		    <title>Konfiguracja</title>
		    <para>Dla modułu 'cutoff' mamy następujące opcje:</para>
		    <itemizedlist>
			<listitem>
			    <para>limit</para>
			    <para>Odłączenie następuje jeśli saldo klienta spadnie poniżej
			    wartości określonej jako kwota lub wartość procentowa sumy miesięcznych
			    zobowiązań klienta (ze znakiem '%'). Domyślnie: 0.</para>
			    <para>Przykład: <prompt>limit = -20</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Określa komendę systemową, która zostanie wywołana jeżeli co najmniej
			    jeden klient zostanie odłączony lub zostanie włączone ostrzeżenie. 
			    Domyślnie: nieustawiona.</para>
			    <para>Przykład: <prompt>command = 'lmsd -qi firewall'</prompt></para>
			</listitem>
			<listitem>
			    <para>warning</para>
			    <para>Włącza ostrzeżenie dla odłączanego klienta i przypisuje mu 
			    określoną w tej opcji treść. Jeżeli pusta, ostrzeżenie nie będzie włączane.
			    Data w ostrzeżeniu ukryta jest pod zmienną '%time'. Możesz także użyć
			    zmiennych: %B dla rzeczywistego salda klienta oraz %b dla salda bez znaku.
			    Saldo liczone jest w chwili wykonania modułu cutoff, a nie wyświetlenia
			    komunikatu w przeglądarce klienta.
			    Domyślnie: 'Blocked automatically due to payment deadline override at %time".</para>
			    <para>Przykład: <prompt>warning = ""</prompt></para>
			</listitem>
			<listitem>
				<para>expired_warning</para>
				<para>Włącza ostrzeżenie dla odłączanego klienta i przypisuje mu 
				określoną w tej opcji treść. Jeżeli pusta, ostrzeżenie nie będzie włączane.
				Dotyczy klientów, którym wygasły zobowiązania.
				Data w ostrzeżeniu ukryta jest pod zmienną '%time'.
				Domyślnie: 'Blocked automatically due to tariff(s) expiration at %time".</para>
				<para>Przykład: <prompt>expired_warning = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>warnings_only</para>
			    <para>Ta opcja pozwala zdecydować, czy chcemy użyć naszego 
			    modułu wyłącznie do włączania ostrzeżeń. Działa tylko w stosunku do 
			    klientów, którzy posiadają aktywne zobowiązania. Klienci, którym 
			    wygasły zobowiązania, zostaną odłączeni mimo włączenia tej opcji. 
			    Domyślnie: wyłączona.</para>
			    <para>Przykład: <prompt>warnings_only = true</prompt></para>
			</listitem>
			<listitem>
			<para>setnodegroup_only</para>
			<para>Ta opcja pozwala zdecydować, czy chemy przypisać do wybranej grupy 
			komputery klienta, zamiast zmieniać jego status lub włączać ostrzeżenie. Do grupa 
			o podanej nazwie zostaną przypisane wszystkie komputery klienta, który przekroczył
			limit zadłużenia, albo posiada nierozliczone faktury (jeśli włączono 
			check_invoices).
			Domyślnie: pusta.</para>
			<para>Przykład: <prompt>setnodegroup_only = ograniczony_dostep</prompt></para>
			</listitem>
			<listitem>
				<para>use_nodeassignments</para>
				<para>Jeśli stosujesz powiązywanie komputerów z zobowiązaniami
				powinieneś włączyć tą opcję. W przeciwnym wypadku będą sprawdzane
				powiązania taryf z klientami. Domyślnie: wyłączona.</para>
				<para>Przykład: <prompt>use_nodeassignments = true</prompt></para>
			</listitem>
			<listitem>
				<para>use_customerassignments</para>
				<para>Jeśli chciałbyś pominąć sprawdzanie zobowiązań klientów 
				powinieneś włączyć tą opcję. Domyślnie: włączona.</para>
				<para>Przykład: <prompt>use_customerassignments = false</prompt></para>
			</listitem>
			<listitem>
				<para>disable_suspended</para>
				<para>Włączenie tej opcji spowoduje odłaczenie także klientów,
				których wszystkie obowiązujące zobowiązania są zawieszone. 
				Domyślnie: wyłączona.</para>
				<para>Przykład: <prompt>disable_suspended = true</prompt></para>
			</listitem>
			<listitem>
				<para>check_invoices</para>
				<para>Opcja włącza dodatkowe sprawdzenie czy klient posiada nierozliczone
				faktury z dniem płatności starszym o określoną w opcji 'deadline'
				ilość dni. Domyślnie: wyłączona.</para>
				<para>Przykład: <prompt>check_invoices = true</prompt></para>
			</listitem>
			<listitem>
				<para>deadline</para>
				<para>Określa okres w dniach (licząc od terminu płatności faktury), 
				po którym nierozliczona faktura jest brana pod uwagę przy zastosowaniu
				opcji 'check_invoices'. Domyślnie, klient zostanie zablokowany od razu
				po terminie płatności. Domyślnie: 0.</para>
				<para>Przykład: <prompt>deadline = 30</prompt></para>
			</listitem>
			<listitem>
				<para>customergroups</para>
				<para>Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
					Domyślnie: pusta (wszystkie grupy).</para>
				<para>Przykład: <prompt>customergroups = "grupa1 grupa2"</prompt></para>
			</listitem>
			<listitem>
				<para>excluded_customergroups</para>
				<para>Lista nazw grup klientów, które mają być pominięte. Wielkość liter nie ma znaczenia. 
					Domyślnie: pusta (żadna).</para>
				<para>Przykład: <prompt>excluded_customergroups = "grupa3 grupa4"</prompt></para>
			</listitem>
			<listitem>
				<para>networks</para>
				<para>Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
				Domyślnie: pusta (wszystkie sieci).</para>
				<para>Przykład: <prompt>networks = "lan1 lan2"</prompt></para>
			</listitem>
			<listitem>
				<para>excluded_networks</para>
				<para>Lista nazw sieci, które mają pominięte. Wielkość liter nie ma znaczenia.
					Domyślnie: pusta (żadna).</para>
				<para>Przykład: <prompt>excluded_networks = "lan3 lan4"</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-dhcp" xreflabel="dhcp">
		<title>Dhcp</title>
		    <sect3 id="dhcp-desc">
		    <title>Opis</title>
		    <para>Moduł zarządzający serwerem DHCP, tworzy plik konfiguracyjny oraz
		    restartuje usługę. Zmienna 'command' umożliwia również wykonywanie innych 
		    czynności (programów).</para>
		    </sect3>
		    <sect3 id="dhcp-config">
		    <title>Konfiguracja</title>
		    <para>Większość parametrów konfiguracyjnych odpowiada fragmentom 
		    pliku konfiguracyjnego dhcpd, które w typowych zastosowaniach
		    nie wymagają zmiany:</para>
		    <itemizedlist>
			<listitem>
			    <para>file</para>
			    <para>Określa lokalizację pliku konfiguracyjnego serwera dhcp. 
			    Domyślnie: /etc/dhcpd.conf.</para>
			    <para>Przykład: <prompt>file = /etc/dhcpd.conf</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Polecenie wykonywane po utworzeniu pliku konfiguracyjnego. 
			    Domyślnie: 'killall dhcpd; /usr/sbin/dhcpd'.</para>
			    <para>Przykład: <prompt>command = 'service dhcp restart'</prompt></para>
			</listitem>
			<listitem>
			    <para>begin</para>
			    <para>Nagłówek pliku. Domyślnie: pusty.</para>
			    <para>Przykład: <prompt>begin = "authoritative;"</prompt></para>
			</listitem>
			<listitem>
			    <para>end</para>
			    <para>Stopka pliku. Domyślnie: pusty.</para>
			    <para>Przykład: <prompt>end = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>subnet_start</para>
			    <para>Nagłówek podsieci. '%a' - nazwa, '%m' - maska, %b - broadcast. 
			    Domyślnie: "subnet %a netmask %m {\ndefault-lease-time 86400;\nmax-lease-time 86400;".</para>
			    <para>Przykład: <prompt>subnet_start = "subnet %a netmask %m {default-lease-time 3600;"</prompt></para>
			</listitem>
			<listitem>
			    <para>subnet_end</para>
			    <para>Stopka podsieci. Domyślnie: "}".</para>
			    <para>Przykład: <prompt>subnet_end = '\t}'</prompt></para>
			</listitem>
			<listitem>
			    <para>subnet_gateway</para>
			    <para>Brama podsieci. '%i' zostanie zamienione na adres ip. Domyślnie: "option routers %i;".</para>
			    <para>Przykład: <prompt>subnet_gateway = "option routers %i"</prompt></para>
			</listitem>
			<listitem>
			    <para>subnet_dns</para>
			    <para>DNS'y podsieci. '%i - adresy dns'ów. Domyślnie: "option domain-name-servers %i;".</para>
			    <para>Przykład: <prompt>subnet_dns = "option domain-name-servers 192.168.0.1"</prompt></para>
			</listitem>
			<listitem>
			    <para>subnet_domain</para>
			    <para>Nazwa domenowa podsieci. '%n' - nazwa. Domyślnie: 'option domain-name "%n";'.</para>
			    <para>Przykład: <prompt>subnet_domain = 'option domain-name "test.%n";'</prompt></para>
			</listitem>
			<listitem>
			    <para>subnet_wins</para>
			    <para>Serwery wins. '%i' - adres ip serwera. Domyślnie: "option netbios-name-servers %i;".</para>
			    <para>Przykład: <prompt>subnet_wins = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>subnet_range</para>
			    <para>Zakres adresów podsieci. '%s' - adres początkowy, '%e' - koniec zakresu. Domyślnie: "range %s %e;".</para>
			    <para>Przykład: <prompt>subnet_range = "range %s %e;"</prompt></para>
			</listitem>
			<listitem>
			    <para>host</para>
			    <para>Parametry hostów, gdzie '%n' - nazwa hosta, '%m' - MAC, '%i' - adres ip. 
			    Domyślnie: "\thost %n {\n\t\thardware ethernet %m; fixed-address %i; \n\t}".</para>
			    <para>Przykład: <prompt>host = "host %n {hardware ethernet %m; fixed-address %i;}"</prompt></para>
			</listitem>
			<listitem>
			    <para>networks</para>
			    <para>Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
			    Domyślnie: pusta (wszystkie sieci).</para>
			    <para>Przykład: <prompt>networks = "lan1 lan2"</prompt></para>
			</listitem>
			<listitem>
			    <para>customergroups</para>
			    <para>Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
			    Domyślnie: pusta (wszystkie grupy).</para>
			    <para>Przykład: <prompt>customergroups = "grupa1 grupa2"</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-hostfile" xreflabel="hostfile">
		<title>Hostfile</title>
		    <sect3 id="hostfile-desc">
		    <title>Opis</title>
		    <para>Moduł 'hostfile' jest dość uniwersalnym narzędziem. Ponieważ 
		    wykonuje pętlę po wszystkich komputerach (oraz adresach urządzeń sieciowych)
			w bazie rozróżniając ich status podłączenia i ostrzeżenia, adresy prywatne 
			i publiczne, a ponadto sieć do której są podłączone oraz grupy do których 
			należą ich właściciele. 
			Dzięki temu możliwe jest tworzenie np. reguł
		    dowolnego firewalla, czy też pliku /etc/hosts. Dane zapisuje do pliku 
		    i następnie wykonuje określone polecenie powłoki.</para>
		    </sect3>
		    <sect3 id="hostfile-config">
		    <title>Konfiguracja</title>
		    <para>W opcjach zawierających reguły hosta można stosować specjalne 
			zmienne, które podczas zapisu do pliku zostaną 
		    zastąpione odpowiednimi dla danego komputera danymi:
		    <simplelist>
			<member>%i - adres IP,</member>
			<member>%ipub - publiczny adres IP,</member>
			<member>%id - ID komputera,</member>
			<member>%m - adres MAC,</member>
			<member>%ms - lista adresów MAC hosta (oddzielonych przecinkiem),</member>
			<member>%n - nazwa komputera,</member>
			<member>%p - hasło,</member>
			<member>%port - nr portu w urządzeniu, do którego jest podłączony komputer,</member>
			<member>%info - opis komputera,</member>
			<member>%l - lokalizacja komputera,</member>
			<member>%devl - lokalizacja urządzenia, do którego podłączony jest komputer,</member>
			<member>%domain - domena,</member>
			<member>%net - nazwa sieci, do której należy host,</member>
			<member>%if - interfejs sieci,</member>
			<member>%addr - adres sieci,</member>
			<member>%mask - maska sieci,</member>
			<member>%prefix - maska sieci w postaci prefixu CIDR,</member>
			<member>%gw - adres bramy,</member>
			<member>%dns, %dns2 - adresy serwerów DNS,</member>
			<member>%dhcps, %dhcpe - początek i koniec zakresu DHCP,</member>
			<member>%wins - adres serwera WINS,</member>
			<member>%i16 - ostatni oktet adresu IP w formacie szesnastkowym,</member>
			<member>%i16pub - ostatni oktet publicznego adresu IP w formacie szesnastkowym.</member>
			<member>%domainpub - domena sieci publicznej,</member>
			<member>%netpub - nazwa sieci, do której należy adres publiczny,</member>
			<member>%ifpub - interfejs sieci publicznej,</member>
			<member>%addrpub - adres sieci publicznej,</member>
			<member>%maskpub - maska sieci publicznej,</member>
			<member>%prefixpub - maska sieci publicznej w postaci prefixu CIDR,</member>
			<member>%gwpub - adres bramy w sieci publicznej,</member>
			<member>%dnspub, %dns2pub - adresy serwerów DNS w sieci publicznej,</member>
			<member>%dhcpspub, %dhcpepub - początek i koniec zakresu DHCP w sieci publicznej,</member>
			<member>%winspub - adres serwera WINS w sieci publicznej,</member>
			<member>%customer - nazwa klienta,</member>
                        <member>%cid - ID klienta</member>
		    </simplelist></para>
		    <para>Poniżej opcje udostępniane przez ten moduł:</para>
		    <itemizedlist>
			<listitem>
			    <para>file</para>
			    <para>Lokalizacja pliku tymczasowego. Domyślnie: /tmp/hostfile</para>
			    <para>Przykład: <prompt>file = /etc/rc.d/rc.firewall</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Polecenie powłoki wyk. po utworzeniu pliku 'file'. Domyślnie: puste</para>
			    <para>Przykład: <prompt>command = '/bin/sh /etc/rc.d/rc.firewall'</prompt></para>
			</listitem>
			<listitem>
			    <para>begin</para>
			    <para>Nagłówek pliku tymczasowego. Domyślnie: "/usr/sbin/iptables -F FORWARD\n"</para>
			    <para>Przykład: <prompt>begin = "IPT=/usr/sbin/iptables \n$IPT -F FORWARD\n"</prompt></para>
			</listitem>
			<listitem>
			    <para>end</para>
			    <para>Stopka pliku tymczasowego. Domyślnie: "/usr/sbin/iptables -A FORWARD -J REJECT\n"</para>
			    <para>Przykład: <prompt>end = "$IPT -A FORWARD -J REJECT\n"</prompt></para>
			</listitem>
			<listitem>
				<para>host_begin</para>
				<para>Nagłówek reguły hosta. Domyślnie: ""</para>
				<para>Przykład: <prompt>host_begin = "#%n\n"</prompt></para>
			</listitem>
			<listitem>
				<para>host_end</para>
				<para>Stopka reguły hosta. Domyślnie: ""</para>
				<para>Przykład: <prompt>host_end = "\n"</prompt></para>
			</listitem>
			<listitem>
			    <para>grantedhost</para>
			    <para>Reguła dla hosta podłączonego. Domyślnie: "/usr/sbin/iptables -A FORWARD -s %i -m mac --mac-source %m -j ACCEPT\n"</para>
			    <para>Przykład: <prompt>grantedhost = "$IPT -A FORWARD -s %i -m mac --mac-source %m -j ACCEPT\n"</prompt></para>
			</listitem>
			<listitem>
			    <para>deniedhost</para>
			    <para>Reguła dla hosta odłączonego. Domyślnie: "/usr/sbin/iptables -A FORWARD -s %i -m mac --mac-source %m -j REJECT\n"</para>
			    <para>Przykład: <prompt>deniedhost = "$IPT -A FORWARD -s %i -m mac --mac-source %m -j REJECT\n"</prompt></para>
			</listitem>
			<listitem>
				<para>public_grantedhost</para>
				<para>Reguła dla hosta podłączonego, który posiada adres publiczny. 
				Domyślnie reguła określona opcją 'grantedhost'.</para>
				<para>Przykład: <prompt>public_grantedhost = "$IPT -A FORWARD -s %i -m mac --mac-source %m -j ACCEPT\n$IPT -t nat -A PREROUTING -p tcp -d %ipub -j DNAT --to-destination %i\n$IPT -t nat -A POSTROUTING -s %i -j SNAT --to-source %ipub\n"</prompt></para>
			</listitem>
			<listitem>
				<para>public_deniedhost</para>
				<para>Reguła dla hosta odłączonego, który posiada adres publiczny. 
				Domyślnie reguła określona opcją 'deniedhost'.</para>
				<para>Przykład: <prompt>public_deniedhost = ""</prompt></para>
			</listitem>
			<listitem>
				<para>warnedhost</para>
				<para>Reguła dla hosta z włączonym ostrzeżeniem.
				Domyślnie reguła określona opcją 'grantedhost'.</para>
				<para>Przykład: <prompt>warnedhost = "$IPT -A PREROUTING -s %i --dport 80 -p tcp -j REDIRECT --to-port 82\n"</prompt></para>
			</listitem>
			<listitem>
				<para>public_warnedhost</para>
				<para>Reguła dla hosta z włączonym ostrzeżeniem, który posiada adres
				publiczny. Domyślnie reguła określona opcją 'warnedhost'.</para>
				<para>Przykład: <prompt>public_warnedhost = ""</prompt></para>
			</listitem>
			<listitem>
				<para>public_replace</para>
				<para>Określa czy reguły zdefiniowane dla adresów publicznych mają nadpisać
				reguły główne, czy zostać dopisane do nich.	Domyślnie: włączona.</para>
				<para>Przykład: <prompt>public_replace = false</prompt></para>
			</listitem>
			<listitem>
				<para>warn_replace</para>
				<para>Określa czy reguły zdefiniowane dla komputerów z ostrzeżeniem mają nadpisać reguły główne, czy zostać dopisane do nich. Domyślnie: wyłączona.</para>
				<para>Przykład: <prompt>warn_replace = true</prompt></para>
			</listitem>
			<listitem>
			    <para>networks</para>
			    <para>Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
			    Domyślnie: pusta (wszystkie sieci).</para>
			    <para>Przykład: <prompt>networks = "lan1 lan2"</prompt></para>
			</listitem>
			<listitem>
			    <para>customergroups</para>
			    <para>Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
			    Domyślnie: pusta (wszystkie grupy).</para>
			    <para>Przykład: <prompt>customergroups = "grupa1 grupa2"</prompt></para>
			</listitem>
			<listitem>
				<para>nodegroups</para>
				<para>Lista nazw grup komputerów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
				Domyślnie: pusta (wszystkie grupy).</para>
				<para>Przykład: <prompt>nodegroups = "grupa1 grupa2"</prompt></para>
			</listitem>
			<listitem>
				<para>excluded_networks</para>
				<para>Lista nazw sieci, które nie mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
					Domyślnie: pusta.</para>
				<para>Przykład: <prompt>excluded_networks = "lan1 lan2"</prompt></para>
			</listitem>
			<listitem>
				<para>excluded_customergroups</para>
				<para>Lista nazw grup klientów, które nie mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
					Domyślnie: pusta.</para>
				<para>Przykład: <prompt>excluded_customergroups = "grupa1 grupa2"</prompt></para>
			</listitem>
			<listitem>
				<para>excluded_nodegroups</para>
				<para>Lista nazw grup komputerów, które nie mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
					Domyślnie: pusta.</para>
				<para>Przykład: <prompt>excluded_nodegroups = "grupa1 grupa2"</prompt></para>
			</listitem>
			<listitem>
			    <para>skip_dev_ips</para>
			    <para>Jeśli ustawiona na tak (yes, true) pominięte zostaną adresy urządzeń sieciowych. Domyślnie: tak</para>
			    <para>Przykład: <prompt>skip_dev_ips = nie</prompt></para>
			</listitem>
			<listitem>
				<para>skip_host_ips</para>
				<para>Jeśli ustawiona na tak (yes, true) pominięte zostaną adresy komputerów. Uwaga: włączenie obu opcji 'skip_*_ips' spowoduje ich zignorowanie. Domyślnie: nie</para>
				<para>Przykład: <prompt>skip_host_ips = tak</prompt></para>
			</listitem>
			<listitem>
				<para>multi_mac</para>
				<para>Jeśli ustawiona na tak (yes, true) utworzony zostanie osobny rekord
				dla każdego adresu MAC. Tzn. jeśli komputer ma przypisanych
				kilka adresów MAC, będzie utworzone tyle wpisów ile tych adresów.
				Domyślnie: nie</para>
				<para>Przykład: <prompt>multi_mac = tak</prompt></para>
			</listitem>
			<listitem>
				<para>share_netdev_pubip</para>
				<para>Włączenie tej opcji (yes, true, 1) spowoduje, że wszystkim
				adresom urządzenia sieciowego, które nie posiadają zdefiniowanego 
				adresu publicznego zostanie przypisany jeden (ten sam) ze zdefiniowanych 
				dla danego urządzenia adresów publicznych. Domyślnie: nie</para>
				<para>Przykład: <prompt>share_netdev_pubip = tak</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>	    
		<sect2 id="daemon-traffic" xreflabel="traffic">
		<title>Traffic</title>
		    <sect3 id="traffic-desc">
		    <title>Opis</title>
		    <para>'Traffic' to odpowiednik perlowego lms-traffic, zapisujący do bazy statystyki
		    wykorzystania łącza z pliku utworzonego przez użytkownika. Plik taki powinien mieć 
		    format: ip_hosta upload download . Więcej informacji (w tym jak utworzyć taki plik)
		    można znaleźć w rozdziale dotyczącym lms-traffic.</para>
		    </sect3>
		    <sect3 id="traffic-config">
		    <title>Konfiguracja</title>
		    <para>Moduł posiada trzy opcje:</para>
		    <itemizedlist>
			<listitem>
			    <para>file</para>
			    <para>Lokalizacja pliku ze statystykami firewalla. Domyślnie: /var/log/traffic.log</para>
			    <para>Przykład: <prompt>file = /tmp/log</prompt></para>
			</listitem>
			<listitem>
			    <para>begin_command</para>
			    <para>Polecenie powłoki wykonywane przed wczytaniem pliku. Domyślnie: puste</para>
			    <para>Przykład: <prompt>begin_command = 'perl /usr/local/lms/bin/traffic_ipt.pl'</prompt></para>
			</listitem>
			<listitem>
			    <para>end_command</para>
			    <para>Polecenie powłoki wykonywane po wczytaniu pliku. Domyślnie: puste</para>
			    <para>Przykład: <prompt>end_command = 'rm /var/log/traffic.log'</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-tc" xreflabel="tc">
		<title>Tc (HTB)</title>
		    <sect3 id="tc-desc">
		    <title>Opis</title>
		    <para>Moduł generujący skrypt zawierający polecenia iptables i tc służące
		    do ograniczania przepływności i limitowania połączeń klientom. Regułki dla 
		    komputerów można dowolnie zdefiniować i wykorzystać nie tylko do "traffic 
		    control". Zasada działania skryptu przedstawia się następująco: Najpierw z bazy
		    pobierane są dane dla wszystkich klientów. Obliczane są sumy ograniczeń
		    (uprate, downrate, upceil, downceil, limity połączeń) dla każdego klienta
		    Następnie wykonywana jest pętla ze sprawdzeniem przynależności do grupy klientów
		    i sieci (jeśli określono). Jeśli wartości ograniczeń są różne od zera następuje
		    zapis reguł do pliku z podmianą zmiennych. W regułkach można stosować następujące
		    zmienne: %name - nazwa hosta, %i - adres IP, %m - MAC, %if - interfejs, %uprate, %downrate, %upceil,
		    %downceil, %plimit, %climit, %o1, %o2, %o3, %o4 - kolejne oktety adresu IP,
		    %h1, %h2, %h3, %h4 - kolejne oktety adresu IP w zapisie szesnastkowym oraz %x - licznik o wartości początkowej 100
		    zwiększany o jeden dla każdego komputera (lub klienta, w zależności od ustawienia
		    opcji <prompt>one_class_per_host</prompt>).</para>
		    <para>Domyślna polityka tworzenia klas htb zakłada utworzenie jednej klasy dla
		    wszystkich komputerów klienta. Może to być zmienione za pomocą opcji
		    'one_class_per_host'.</para>
		    <para>Konfiguracja domyślna zakłada, że twój system jest przystosowany
		    do zastosowania htb oraz iptables z modułami limit, connlimit, mark i ipp2p.
		    Możesz sam spatchować jądro lub skorzystać ze źródeł dostępnych na stronie
		    <ulink url="http://www.inet.one.pl">www.inet.one.pl</ulink>.</para>
		    </sect3>
		    <sect3 id="tc-config">
		    <title>Konfiguracja</title>
		    <para>Masz do dyspozycji standardowe parametry takie jak customergroups, file,
		    command, networks i dodatkowo opcje definiujące treść regułek tc i firewalla.
		    Domyślna konfiguracja przeznaczona jest dla łącz 512/128 kbit i 100mbit.</para>
		    <itemizedlist>
			<listitem>
			    <para>file</para>
			    <para>Lokalizacja pliku tymczasowego. Domyślnie: /etc/rc.d/rc.htb.</para>
			    <para>Przykład: <prompt>file = /tmp/rc.htb</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Polecenie powłoki wykonywane po utworzeniu pliku. Domyślnie: "sh /etc/rc.d/rc.htb start".</para>
			    <para>Przykład: <prompt>command = "chmod 700 /tmp/rc.htb; /tmp/rc.htb start"</prompt></para>
			</listitem>
			<listitem>
			    <para>begin</para>
			    <para>Nagłówek skryptu. Domyślnie:
<screen>
"#!/bin/sh
IPT=/usr/sbin/iptables
TC=/sbin/tc
LAN=eth0
WAN=eth1
BURST="burst 30k"

stop ()
{
$IPT -t mangle -D FORWARD -i $WAN -j LIMITS >/dev/null 2>&1
$IPT -t mangle -D FORWARD -o $WAN -j LIMITS >/dev/null 2>&1
$IPT -t mangle -F LIMITS >/dev/null 2>&1
$IPT -t mangle -X LIMITS >/dev/null 2>&1
$IPT -t mangle -F OUTPUT
$IPT -t filter -F FORWARD
$TC qdisc del dev $LAN root 2> /dev/null
$TC qdisc del dev $WAN root 2> /dev/null
}

start ()
{
stop
$IPT -t mangle -N LIMITS
$IPT -t mangle -I FORWARD -i $WAN -j LIMITS
$IPT -t mangle -I FORWARD -o $WAN -j LIMITS
# incomming traffic
$IPT -t mangle -A OUTPUT -j MARK --set-mark 1
$TC qdisc add dev $LAN root handle 1:0 htb default 3 r2q 1
$TC class add dev $LAN parent 1:0 classid 1:1 htb rate 99000kbit ceil 99000kbit quantum 1500
$TC class add dev $LAN parent 1:1 classid 1:2 htb rate   500kbit ceil   500kbit
$TC class add dev $LAN parent 1:1 classid 1:3 htb rate 98500kbit ceil 98500kbit prio 9 quantum 1500
$TC qdisc add dev $LAN parent 1:3 esfq perturb 10 hash dst
# priorities for ICMP, TOS 0x10 and ports 22 and 53
$TC class add dev $LAN parent 1:2 classid 1:20 htb rate 50kbit ceil 500kbit $BURST prio 1 quantum 1500
$TC qdisc add dev $LAN parent 1:20 esfq perturb 10 hash dst
$TC filter add dev $LAN parent 1:0 protocol ip prio 2 u32 match ip sport 22 0xffff flowid 1:20
$TC filter add dev $LAN parent 1:0 protocol ip prio 2 u32 match ip sport 53 0xffff flowid 1:20
$TC filter add dev $LAN parent 1:0 protocol ip prio 1 u32 match ip tos 0x10 0xff flowid 1:20
$TC filter add dev $LAN parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:20
# serwer -> LAN
$TC filter add dev $LAN parent 1:0 protocol ip prio 4 handle 1 fw flowid 1:3

# outgoing traffic
$TC qdisc add dev $WAN root handle 2:0 htb default 11 r2q 1
$TC class add dev $WAN parent 2:0 classid 2:1 htb rate 120kbit ceil 120kbit
# priorities for ACK, ICMP, TOS 0x10, ports 22 and 53
$TC class add dev $WAN parent 2:1 classid 2:10 htb rate 60kbit ceil 120kbit prio 1 quantum 1500
$TC qdisc add dev $WAN parent 2:10 esfq perturb 10 hash dst
$TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 1 match u8 0x10 0xff at 33 flowid 2:10
$TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip dport 22 0xffff flowid 2:10
$TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip dport 53 0xffff flowid 2:10
$TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip tos 0x10 0xff flowid 2:10
$TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 2:10
# serwer -> Internet
$TC class add dev $WAN parent 2:1 classid 2:11 htb rate 30kbit ceil 120kbit prio 2 quantum 1500
$TC qdisc add dev $WAN parent 2:11 esfq perturb 10 hash dst
$TC filter add dev $WAN parent 2:0 protocol ip prio 3 handle 1 fw flowid 2:11
$TC filter add dev $WAN parent 2:0 protocol ip prio 9 u32 match ip dst 0/0 flowid 2:11
</screen></para>
			    <para>Przykład: <prompt>begin = "#!/bin/bash\n$TC=/usr/local/sbin/tc\n"</prompt></para>
			</listitem>    
			<listitem>
			    <para>end</para>
			    <para>Stopka skryptu. Domyślnie:
<screen>
}

case "$1" in
    'start')
	start
    ;;
    'stop')
	stop
    ;;
    'status')
	echo "WAN Interface"
	echo "============="
	$TC class show dev $WAN | grep root
	$TC class show dev $WAN | grep -v root | sort | nl
	echo "LAN Interface"
	echo "============="
	$TC class show dev $LAN | grep root
	$TC class show dev $LAN | grep -v root | sort | nl
    ;;
    *)
	echo -e "\nUsage: rc.htb start|stop|status"
    ;;
esac
</screen>
			    </para>
			    <para>Przykład: <prompt>end = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>one_class_per_host</para>
			    <para>Określa politykę tworzenia klas htb. W ustawieniu domyślnym
			    wszystkie komputery klienta zostaną wrzucone do jednej klasy.
			    Ustawienie tej opcji na 'true' spowoduje, że reguły określone w 
			    host_htb_up i host_htb_down zostaną wygenerowane dla wszystkich
			    komputerów klienta (z inną wartością '%x'). Reguły z host_mark_down,
			    host_mark_up, host_plimit i host_climit generowane są dla każdego
			    komputera niezależnie od ustawień tej zmiennej. Domyślnie: false</para>
			    <para>Przykład: <prompt>one_class_per_host = 1</prompt></para>
			</listitem>
			<listitem>
			    <para>limit_per_host</para>
			    <para>Określa politykę tworzenia limitów połączeń/pakietów dla komputerów. W ustawieniu domyślnym
			    limit połączeń/pakietów jest dzielony przez ilość komputerów klienta.
			    Włączenie tej opcji spowoduje, że reguły określone w 
			    host_climit i host_plimit zostaną wygenerowane dla wszystkich
			    komputerów klienta z wartością $climit i %plimit zdefiniowaną w taryfie (nie podzieloną przez ilość komputerów).
				 Domyślnie: false</para>
			    <para>Przykład: <prompt>limit_per_host = 1</prompt></para>
			</listitem>
			<listitem>
			    <para>host_mark_up</para>
			    <para>Reguła markująca dla każdego komputera. Domyślnie:
<screen>
# %n
$IPT -t mangle -A LIMITS -s %i -j MARK --set-mark %x
</screen>
			    </para>
			    <para>Przykład: <prompt>host_mark_up = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>host_mark_down</para>
			    <para>Reguła markująca dla każdego komputera. Domyślnie:
<screen>
$IPT -t mangle -A LIMITS -d %i -j MARK --set-mark %x
</screen>
			    </para>
			    <para>Przykład: <prompt>host_mark_down = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>host_htb_down</para>
			    <para>Zestaw reguł dla każdego komputera, wykonywanych
			    gdy uprate i downrate są różne od zera. Domyślnie:
<screen>
$TC class add dev $LAN parent 1:2 classid 1:%x htb rate %downratekbit ceil %downceilkbit $BURST prio 2 quantum 1500
$TC qdisc add dev $LAN parent 1:%x esfq perturb 10 hash dst
$TC filter add dev $LAN parent 1:0 protocol ip prio 5 handle %x fw flowid 1:%x
</screen>
			    </para>
			    <para>Przykład: <prompt>host_htb_down = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>host_htb_up</para>
			    <para>Zestaw reguł dla każdego komputera, wykonywanych
			    gdy uprate i downrate są różne od zera. Domyślnie:
<screen>
$TC class add dev $WAN parent 2:1 classid 2:%x htb rate %upratekbit ceil %upceilkbit $BURST prio 2 quantum 1500
$TC qdisc add dev $WAN parent 2:%x esfq perturb 10 hash dst
$TC filter add dev $WAN parent 2:0 protocol ip prio 5 handle %x fw flowid 2:%x
</screen>
			    </para>
			    <para>Przykład: <prompt>host_htb_up = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>host_climit</para>
			    <para>Regułka z ograniczeniem ilości równoczesnych połączeń tcp. Wykonywana
			    gdy climit w bazie jest różny od zera. Domyślnie:
<screen>
$IPT -t filter -I FORWARD -p tcp -s %i -m connlimit --connlimit-above %climit -m ipp2p --ipp2p -j REJECT
</screen>
			    </para>
			    <para>Przykład: <prompt>host_climit = "$IPT -t filter -I FORWARD -p tcp -s %i -m connlimit --connlimit-above -j REJECT"</prompt></para>
			</listitem>
			<listitem>
			    <para>host_plimit</para>
			    <para>Regułka z ograniczeniem ilości pakietów w jednostce czasu (tutaj sekunda). Wykonywana
			    gdy plimit w bazie jest różny od zera. Domyślnie:
<screen>
$IPT -t filter -I FORWARD -p tcp -d %i -m limit --limit %plimit/s -m ipp2p --ipp2p -j ACCEPT
$IPT -t filter -I FORWARD -p tcp -s %i -m limit --limit %plimit/s -m ipp2p --ipp2p -j ACCEPT
</screen>
			    </para>
			    <para>Przykład: <prompt>host_plimit = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>networks</para>
			    <para>Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
			    Domyślnie: pusta (wszystkie sieci).</para>
			    <para>Przykład: <prompt>networks = "lan1 lan2"</prompt></para>
			</listitem>
			<listitem>
			    <para>customergroups</para>
			    <para>Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
			    Domyślnie: pusta (wszystkie grupy).</para>
			    <para>Przykład: <prompt>customergroups = "grupa1 grupa2"</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-tc-new" xreflabel="tc-new">
			<title>Tc-new (HTB)</title>
			<sect3 id="tc-new-desc">
				<title>Opis</title>
				<para>Moduł generujący skrypt zawierający polecenia iptables i tc służące
				do ograniczania przepływności i limitowania połączeń klientom. Działa podobnie
				do modułu 'tc', lecz obsługuje funkcjonalność pozwalającą na powiązywanie
				taryf z komputerami. Skrypt tworzy tzw. kanały dla komputerów klienta
				przypisanych do tej samej taryfy. Przykładowo: dla klienta z dwoma 
				komputerami przypisanymi do tej samej taryfy zostaną utworzone dwie
				klasy (upload i download) oraz po dwa filtry dla każdego komputera. 
				W przypadku gdy klient ma dwie taryfy i do każdej po jednym komputerze 
				powstaną po dwie klasy dla każdej taryfy i odpowiednia ilość filtrów.
				Wartość początkowa liczników (%x i %h w regułach) wynosi 100.</para>
			</sect3>
			<sect3 id="tc-new-config">
				<title>Konfiguracja</title>
				<para>Wartości domyślne niektórych opcją są zgodne z modułem <xref linkend="daemon-tc">.
				</para>
				<itemizedlist>
				<listitem>
					<para>file</para>
					<para>Lokalizacja pliku wynikowego. Domyślnie: /etc/rc.d/rc.htb.</para>
					<para>Przykład: <prompt>file = /tmp/rc.htb</prompt></para>
				</listitem>
				<listitem>
					<para>command</para>
					<para>Polecenie powłoki wykonywane po utworzeniu pliku. Domyślnie: "sh /etc/rc.d/rc.htb start".</para>
					<para>Przykład: <prompt>command = "chmod 700 /tmp/rc.htb; /tmp/rc.htb start"</prompt></para>
				</listitem>
				<listitem>
					<para>begin</para>
					<para>Nagłówek skryptu. Domyślnie: jak w module tc</para>
					<para>Przykład: <prompt>begin = "#!/bin/bash\n$TC=/usr/local/sbin/tc\n"</prompt></para>
				</listitem>
				<listitem>
					<para>end</para>
					<para>Stopka skryptu. Domyślnie: jak w module tc</para>
					<para>Przykład: <prompt>end = ""</prompt></para>
				</listitem>
				<listitem>
					<para>class_up</para>
					<para>Definicja klasy dla uploadu, w której możemy użyć następujących 
					zmiennych: %cid - ID klienta, %cname - nazwa klienta, %h - numer uchwytu 
					klasy %uprate, %upceil. Domyślnie: 
					<screen>
# %cname (ID:%cid)
$TC class add dev $WAN parent 2:1 classid 2:%h htb rate %upratekbit ceil %upceilkbit $BURST prio 2 quantum 1500
$TC qdisc add dev $WAN parent 2:%h esfq perturb 10 hash dst
</screen></para>
<para>Przykład: <prompt>class_up = "$TC class add dev $WAN parent 2:1 classid 2:%h htb rate %upratekbit ceil %upceilkbit $BURST prio 2 quantum 1500"</prompt></para>
				</listitem>
				<listitem>
					<para>class_down</para>
					<para>Definicja klasy dla downloadu, w której możemy użyć następujących 
					zmiennych: %cid - ID klienta, %cname - nazwa klienta, %h - numer uchwytu 
					klasy, %downrate, %downceil. Domyślnie: 
					<screen>
$TC class add dev $LAN parent 1:2 classid 1:%h htb rate %downratekbit ceil %downceilkbit $BURST prio 2 quantum 1500
$TC qdisc add dev $LAN parent 1:%h esfq perturb 10 hash dst						</screen></para>
					<para>Przykład: <prompt>class_up = "$TC class add dev $LAN parent 1:2 classid 1:%h htb rate %downratekbit ceil %ceilceilkbit $BURST prio 2 quantum 1500"</prompt></para>
				</listitem>
				<listitem>
					<para>filter_up</para>
					<para>Definicja filtrów dla ruchu w kierunku od hosta. Dozwolone zmienne:
					%n - nazwa hosta, %if - nazwa interfejsu sieci,
					%i - adres, %m - mac, %ms - lista adresów MAC hosta (oddzielonych przecinkiem),
					%o1, %o2, %o3, %o4 - oktety adresu dziesiętnie, %h1, %h2, %h3, %h4 - oktety adresu
					w zapisie szesnastkowym, %h - uchwyt klasy, %x - uchwyt filtra (unikalny numer reguły).
					Domyślnie:
					<screen>
# %n
$IPT -t mangle -A LIMITS -s %i -j MARK --set-mark %x
$TC filter add dev $WAN parent 2:0 protocol ip prio 5 handle %x fw flowid 2:%h
</screen></para>
					<para>Przykład: <prompt>class_up = "%n\n$IPT -A src%o3 -s %i -j CLASSIFY --set-class 2:%h\n"</prompt></para>
				</listitem>
				<listitem>
					<para>filter_down</para>
					<para>Definicja filtrów dla ruchu w kierunku do hosta. Dozwolone zmienne:
					%n - nazwa hosta, %if - nazwa interfejsu sieci, %i - adres, %m - mac, 
					%ms - lista adresów MAC hosta (oddzielonych przecinkiem),
					%o1, %o2, %o3, %o4 - oktety adresu dziesiętnie,
					%h1, %h2, %h3, %h4 - oktety adresu w zapisie szesnastkowym,
					%h - uchwyt klasy, %x - uchwyt
					filtra (unikalny numer reguły). Domyślnie: 
					<screen>
$IPT -t mangle -A LIMITS -d %i -j MARK --set-mark %x
$TC filter add dev $LAN parent 1:0 protocol ip prio 5 handle %x fw flowid 1:%h
</screen></para>
					<para>Przykład: <prompt>class_down = "%n\n$IPT -A dst%o3 -d %i -j CLASSIFY --set-class 1:%h\n"</prompt></para>
				</listitem>
				<listitem>
					<para>climit</para>
					<para>Definicja reguły dla limitu połączeń hosta. Dozwolone 
					zmienne: %n - nazwa hosta, %if - nazwa interfejsu sieci, 
					%i - adres, %m - mac, %ms - lista adresów MAC hosta (oddzielonych przecinkiem),
					%o1, %o2, %o3, %o4 - oktety adresu dziesiętnie,
					%h1, %h2, %h3, %h4 - oktety adresu w zapisie szesnastkowym,
					%climit - limit połączeń. Domyślnie:
					<screen>
$IPT -t filter -I FORWARD -p tcp -s %i -m connlimit --connlimit-above %climit -j REJECT
					</screen></para>
					<para>Przykład: <prompt>climit = ""</prompt></para>
				</listitem>
				<listitem>
					<para>plimit</para>
					<para>Definicja reguły dla limitu pakietów dla hosta. Dozwolone 
					zmienne: %n - nazwa hosta, %if - nazwa interfejsu sieci, 
				    %i - adres, %m - mac, %ms - lista adresów MAC hosta (oddzielonych przecinkiem),
					%o1, %o2, %o3, %o4 - oktety adresu dziesiętnie,
					%h1, %h2, %h3, %h4 - oktety adresu w zapisie szesnastkowym,
					%plimit - limit	pakietów. Domyślnie:
					<screen>
$IPT -t filter -I FORWARD -d %i -m limit --limit %plimit/s -j ACCEPT
$IPT -t filter -I FORWARD -s %i -m limit --limit %plimit/s -j ACCEPT										</screen></para>
					<para>Przykład: <prompt>plimit = ""</prompt></para>
				</listitem>
				<listitem>
					<para>networks</para>
					<para>Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
					Domyślnie: pusta (wszystkie sieci).</para>
					<para>Przykład: <prompt>networks = "lan1 lan2"</prompt></para>
				</listitem>
				<listitem>
					<para>customergroups</para>
					<para>Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
					Domyślnie: pusta (wszystkie grupy).</para>
					<para>Przykład: <prompt>customergroups = "grupa1 grupa2"</prompt></para>
				</listitem>
				<listitem>
					<para>night_hours</para>
					<para>Zakres godzin nocnych w formacie 24-godzinnym. Np. "22-5" 
					oznacza, że podczas uruchomienia modułu w godzinach od 22:00 do 4:59
					brane będą wartości taryf dla godzin nocnych. Obowiązują
					następujące ograniczenia dla formatu zakresu: nie może zawierać spacji,
					okres nie może zaczynać się przed godziną 18.
					Domyślnie: pusta.</para>
					<para>Przykład: <prompt>night_hours = "24-6"</prompt></para>
				</listitem>
				<listitem>
					<para>night_no_debtors</para>
					<para>Włączenie tej opcji spowoduje sprawdzenie czy klient posiada
					nierozliczone faktury przeterminowane. Jeśli tak, taryfa nocna nie
					zostanie zastosowana. Domyślnie: false.</para>
					<para>Przykład: <prompt>night_no_debtors = tak</prompt></para>
				</listitem>
				<listitem>
					<para>night_deadline</para>
					<para>Dodatkowy czas (ilość dni) po terminie płatności,
					zanim faktura zostanie potraktowana jako przeterminowana. Opcja
					działa w połączeniu z 'night_no_debtors'. Domyślnie: 0.</para>
					<para>Przykład: <prompt>night_deadline = 7</prompt></para>
				</listitem>
			    <listitem>
				    <para>multi_mac</para>
				    <para>Jeśli ustawiona na tak (yes, true) utworzony zostanie osobny rekord
				    dla każdego adresu MAC. Tzn. jeśli komputer ma przypisanych
				    kilka adresów MAC, będzie utworzone tyle wpisów ile tych adresów.
				    Domyślnie: nie</para>
				    <para>Przykład: <prompt>multi_mac = tak</prompt></para>
			    </listitem>
		    </itemizedlist>
			</sect3>
		</sect2>
		<sect2 id="daemon-dns" xreflabel="dns">
		<title>Dns</title>
		    <sect3 id="dns-desc">
		    <title>Opis</title>
		    <para>Moduł do konfiguracji stref serwera 'named' jest jednym z bardziej skomplikowanych.
		    Tworzy dla każdej sieci pliki stref oraz odpowiednie wpisy w named.conf w oparciu
		    o szablony tych plików. Przykładowe szablony znajdują się w katalogu
		    <filename>/modules/dns/sample</filename>.</para>
		    </sect3>
		    <sect3 id="dns-config">
		    <title>Konfiguracja</title>
		    <para></para>
		    <itemizedlist>
			<listitem>
			    <para>forward-patterns</para>
			    <para>Katalog z szablonami stref. Domyślnie: forward.</para>
			    <para>Przykład: <prompt>forward-patterns = /dns/patterns/forward</prompt></para>
			</listitem>
			<listitem>
			    <para>reverse-patterns</para>
			    <para>Katalog z szablonami stref odwrotnych. Domyślnie: reverse.</para>
			    <para>Przykład: <prompt>reverse-patterns = /dns/patterns/revers</prompt></para>
			</listitem>
			<listitem>
			    <para>generic-forward</para>
			    <para>Szablon domyślny. Zostanie wykorzystany jeśli w katalogu określonym
			    'forward-patterns' nie będzie pliku odpowiadającego nazwie domenowej sieci.
			    Domyślnie: modules/dns/sample/forward/generic.</para>
			    <para>Przykład: <prompt>generic-forward = /dns/patterns/forward</prompt></para>
			</listitem>
			<listitem>
			    <para>generic-reverse</para>
			    <para>Szablon domyślny. Zostanie wykorzystany jeśli w katalogu określonym
			    'reverse-patterns' nie będzie pliku odpowiadającego numerowi IP sieci.
			    Domyślnie: modules/dns/sample/reverse/generic.</para>
			    <para>Przykład: <prompt>generic-reverse = /dns/patterns/forward</prompt></para>
			</listitem>
			<listitem>
			    <para>forward-zones</para>
			    <para>Katalog na pliki wynikowe stref.
			    Domyślnie: modules/dns/sample/out/forward.</para>
			    <para>Przykład: <prompt>forward-zones = /dns/forward</prompt></para>
			</listitem>
			<listitem>
			    <para>reverse-zones</para>
			    <para>Katalog na pliki wynikowe stref odwrotnych.
			    Domyślnie: modules/dns/sample/out/reverse.</para>
			    <para>Przykład: <prompt>reverse-zones = /dns/reverse</prompt></para>
			</listitem>
			<listitem>
			    <para>host-reverse</para>
			    <para>Linia w pliku strefy odwr. odpowiadająca każdemu komputerowi w dane sieci.
			    Domyślnie: "%n IN A %i\n".</para>
			    <para>Przykład: <prompt>host-reverse = "\t %n IN A %i\n"</prompt></para>
			</listitem>
			<listitem>
			    <para>host-forward</para>
			    <para>Linia w pliku strefy odpowiadająca każdemu komputerowi w danej sieci.
			    Domyślnie: "%c IN PTR %n.%d.\n".</para>
			    <para>Przykład: <prompt>host-forward = "\t %c IN PTR %n.%d.\n"</prompt></para>
			</listitem>
			<listitem>
			    <para>conf-pattern</para>
			    <para>Lokalizacja szablonu głównego pliku konfiguracyjnego serwera.
			    Domyślnie: modules/dns/sample/named.conf.</para>
			    <para>Przykład: <prompt>conf-pattern = /dns/patterns/named.conf</prompt></para>
			</listitem>
			<listitem>
			    <para>conf-output</para>
			    <para>Lokalizacja głównego pliku konfiguracyjnego serwera.
			    Domyślnie: /tmp/named.conf.</para>
			    <para>Przykład: <prompt>conf-output = /etc/named.conf</prompt></para>
			</listitem>
			<listitem>
			    <para>conf-forward-entry</para>
			    <para>Wpis dla każdej strefy w głównym pliku konfiguracyjnym.
			    Domyślnie: 'zone "%n" {\ntype master;\n file "forward/%n"; \nnotify yes; \n}; \n'.</para>
			    <para>Przykład: <prompt>conf-forward-entry = 'zone "%n" { \n\ttype master; \n\tfile "forward/%n"; \n\tnotify yes; \n}; \n'</prompt></para>
			</listitem>
			<listitem>
			    <para>conf-reverse-entry</para>
			    <para>Wpis dla każdej strefy odwr. w głównym pliku konfiguracyjnym.
			    Domyślnie: 'zone "%c.in-addr.arpa" { \ntype master; \nfile "reverse/%c"; \nnotify yes; \n}; \n'.</para>
			    <para>Przykład: <prompt>conf-revers-entry = 'zone "%c.in-addr.arpa" { \n\ttype master; \n\tfile "reverse/%c"; \n\tnotify yes; \n}; \n'</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Polecenie wykonywane po utworzeniu plików konf. Domyślnie: puste.</para>
			    <para>Przykład: <prompt>command = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>networks</para>
			    <para>Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
			    Domyślnie: pusta (wszystkie sieci).</para>
			    <para>Przykład: <prompt>networks = "lan1 lan2"</prompt></para>
			</listitem>
			<listitem>
			    <para>custmergroups</para>
			    <para>Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
			    Domyślnie: pusta (wszystkie grupy).</para>
			    <para>Przykład: <prompt>customergroups = "grupa1 grupa2"</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-ethers" xreflabel="ethers">
		<title>Ethers</title>
		    <sect3 id="ethers-desc">
		    <title>Opis</title>
		    <para>Moduł tworzący konfigurację tablicy ARP systemu. Ustawiając opcję
		    'dummy_macs' można sprawić, aby komputerom odłączonym został przypisany 
		    mac-adres 00:00:00:00:00:00.</para>
		    </sect3>
		    <sect3 id="ethers-config">
		    <title>Konfiguracja</title>
		    <para>Tutaj są tylko standardowe opcje:</para>
		    <itemizedlist>
			<listitem>
			    <para>file</para>
			    <para>Lokalizacja pliku wynikowego. Domyślnie: /etc/ethers.</para>
			    <para>Przykład: <prompt>file = /tmp/ethers</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Polecenie powłoki wykonywane po wygenerowaniu konfiga. Domyślnie: 'arp -f /etc/ethers'.</para>
			    <para>Przykład: <prompt>command = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>dummy_macs</para>
			    <para>Jeśli ustawimy na 'yes', to komputerom odłączonym zostanie
			    przypisany mac-adres '00:00:00:00:00:00'. Domyślnie: "no".</para>
			    <para>Przykład: <prompt>dummy_macs = yes</prompt></para>
			</listitem>
			<listitem>
			    <para>networks</para>
			    <para>Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia.
			    Domyślnie: pusta (wszystkie sieci).</para>
			    <para>Przykład: <prompt>networks = "lan1 lan2"</prompt></para>
			</listitem>
			<listitem>
			    <para>customergroups</para>
			    <para>Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. 
			    Domyślnie: pusta (wszystkie grupy).</para>
			    <para>Przykład: <prompt>customergroups = "grupa1 grupa2"</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-oident" xreflabel="oident">
		<title>Oident</title>
		    <sect3 id="oident-desc">
		    <title>Opis</title>
		    <para>Moduł do konfiguracji oidentd. W zasadzie można to zrobić modułem
		    'hostfile', ale tutaj masz już gotowe ustawienia domyślne.</para>
		    </sect3>
		    <sect3 id="oident-config">
		    <title>Konfiguracja</title>
		    <para>A oto parametry modułu 'oident'</para>
		    <itemizedlist>
			<listitem>
			    <para>begin</para>
			    <para>Tekst wstawiany na początku pliku. Domyślnie: puste.</para>
			    <para>Przykład: <prompt>begin = "#Generowany automatycznie\n"</prompt></para>
			</listitem>
			<listitem>
			    <para>end</para>
			    <para>Tekst wstawiany na końcu pliku. Domyślnie: puste.</para>
			    <para>Przykład: <prompt>end = ""</prompt></para>
			</listitem>
			<listitem>
			    <para>host</para>
			    <para>Linia tekstu dla każdego komputera. Domyślnie: "%i\t%n\tUNIX".</para>
			    <para>Przykład: <prompt>host = "%i %n WINDOWS"</prompt></para>
			</listitem>
			<listitem>
			    <para>file</para>
			    <para>Nazwa pliku konfiguracyjnego. Domyślnie: /etc/oidentd.conf.</para>
			    <para>Przykład: <prompt>file = /etc/oident/identd.conf</prompt></para>
			</listitem>
			<listitem>
			    <para>networks</para>
			    <para>Lista nazw sieci do uwzględnienia. Domyślnie: pusta (wszystkie sieci).</para>
			    <para>Przykład: <prompt>networks = 'lan1 lan2'</prompt></para>
			</listitem>
			<listitem>
			    <para>command</para>
			    <para>Polecenie do wykonania po utworzeniu pliku. Domyślnie: puste.</para>
			    <para>Przykład: <prompt>command = "killall -HUP midentd"</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-pinger" xreflabel="pinger">
		<title>Pinger</title>
		    <sect3 id="pinger-desc">
		    <title>Opis</title>
		    <para>Moduł pinger to odpowiednik perlowego skryptu lms-fping. Różnice są jednak
		    zasadnicze. Nie potrzebuje zewnętrznego programu i działa przy wykorzystaniu
		    protokołu ARP. Powodem tego jest mniej więcej dwukrotnie szybsze wykonanie
		    skanowania sieci. Nie ma także problemów z komputerami mającymi wyłączone 
		    odpowiadanie na pingi. Po skanowaniu, wszystkim włączonym komputerom jest
		    ustawiany w bazie danych czas skanowania, wykorzystywany do obrazowania
		    aktywności komputerów np. na mapie sieci.</para>
		    <para><note><para>Pinger rozpoznaje interfejsy sieciowe na podstawie
		    nazwy, dlatego (np. gdy do zakładania interfejsów wirtualnych/aliasów 
		    wykorzystujesz program <filename>ip</filename>) musisz nadawać interfejsom etykiety 
		    (ip addr add ... label ...). Pamiętaj także, żeby nie używać w nazwach
		    kropek, ani myślników (mimo, że <filename>ip</filename> na to pozwala), gdyż pinger
		    nie rozpozna poprawnie takiego interfejsu.</para></note></para>
		    </sect3>
		    <sect3 id="pinger-config">
		    <title>Konfiguracja</title>
		    <para>Pinger udostępnia tylko jedną opcję konfiguracyjną:</para>
		    <itemizedlist>
			<listitem>
			    <para>networks</para>
			    <para>Lista nazw sieci, które mają być skanowane. Domyślnie: pusta (wszystkie sieci).</para>
			    <para>Przykład: <prompt>networks = 'lan1 lan2'</prompt></para>
			</listitem>
		    </itemizedlist>
		    </sect3>
		</sect2>
		<sect2 id="daemon-parser" xreflabel="parser">
			<title>Parser</title>
			<sect3 id="daemon-parser-intro">
			<title>Wstęp</title>
				<para>Moduł parser jest oparty na skryptowym języku
				<ulink url="http://silvercoders.com/index.php?page=T_Script">T-Script</ulink>,
				którego głównym zadaniem jest generowanie plików tekstowych. Może być
				używany do przetwarzania szablonów z danymi pobieranymi z różnych
				źródeł np. baz SQL lub plików tekstowych. W naszym przypadku treść
				skryptu (szablon) jest przechowywany w bazie danych, dlatego istnieje
				możliwość jego edycji poprzez <emphasis>LMS-UI</emphasis>.
				W przyszłości moduł parser może zastąpić większość modułów 
				demona.</para>
				<para>Opis języka T-Script znajduje się w rozdziale <xref linkend="tscript">.</para>
				<para>Przed kompilacją modułu upewnij się, że posiadasz w systemie
				pakiety <filename>bison</filename> (co najmniej w wersji 1.875) oraz 
				<filename>flex</filename>.</para>
			</sect3>
			<sect3 id="daemon-parser-config">
			<title>Konfiguracja</title>
				<para>Parser posiada następujące opcje:</para>
				<itemizedlist>
				<listitem>
					<para>script</para>
					<para>Zawartość skryptu (szablonu). Domyślnie: pusta.</para>
					<para>Przykład: <prompt>script = '{var=1}zmienna var={var}'</prompt></para>
				</listitem>
				<listitem>
					<para>file</para>
					<para>Lokalizacja pliku wynikowego. Domyślnie: pusta</para>
					<para>Przykład: <prompt>file = /tmp/parser.out</prompt></para>
				</listitem>
				<listitem>
					<para>command</para>
					<para>Polecenie powłoki do wykonania po kompilacji skryptu. Domyślnie: pusta</para>
					<para>Przykład: <prompt>command = "sh /tmp/parser.out"</prompt></para>
				</listitem>
				</itemizedlist>
			</sect3>
		</sect2>
		<sect2 id="daemon-ewx-pt" xreflabel="ewx-pt">
			<title>Ewx-pt</title>
			<sect3 id="daemon-ewx-pt-intro">
				<title>Wstęp</title>
				<para>Moduł ewx-pt służy do zarządzania urządzeniem PPPoE
				Terminator marki <ulink url="http://etherwerx.com">EtherWerX</ulink>.
				Komunikacja odbywa się z wykorzystaniem protokołu SNMP.</para>
				<para>Moduł podczas pracy tworzy własną kopię konfiguracji urządzenia.
				Konfiguracja urządzenia nie jest w żaden sposób weryfikowana, dlatego 
				korzystając z modułu ewx-pt nie można dokonywać zmian bezpośrednio na
				urządzeniu. W celu rekonfiguracji urządzenia należy wyczyścić konfigurację
				na urządzeniu oraz usunąć zawartość tabeli ewx_pt_config w bazie LMSa.
				<note><para>Pamiętaj o włączeniu opcji konfiguracyjnej <prompt>ewx_support</prompt>
				w sekcji <emphasis>[phpui]</emphasis>.</para></note>
				</para>
			</sect3>
			<sect3 id="daemon-ewx-pt-config">
				<title>Konfiguracja</title>
				<para>Moduł ewx-pt udostępnia następujące opcje:</para>
				<itemizedlist>
					<listitem>
						<para>snmp_host</para>
						<para>Adres urządzenia EtherWerX. Domyślnie: pusty.</para>
						<para>Przykład: <prompt>snmp_host = 192.168.0.1</prompt></para>
					</listitem>
					<listitem>
						<para>snmp_port</para>
						<para>Port urządzenia dla komunikacji SNMP. Domyślnie: 161</para>
						<para>Przykład: <prompt>snmp_port = 2161</prompt></para>
					</listitem>
					<listitem>
						<para>community</para>
						<para>Nazwa community SNMP urządzenia. Domyślnie: private</para>
						<para>Przykład: <prompt>community = public</prompt></para>
					</listitem>
					<listitem>
						<para>offset</para>
						<para>Liczba całkowita o jaką będą zwiększane identyfikatory komputerów
						podczas zapisu na urządzeniu EtherWerX. Domyślnie: 0.</para>
						<para>Przykład: <prompt>offset = 1000</prompt></para>
					</listitem>
					<listitem>
						<para>networks</para>
						<para>Lista nazw sieci, które mają być brane pod uwagę. 
						Uwaga: po zmianie wartości tej opcji zalecana jest rekonfiguracja urządzenia.
						Domyślnie: pusta (wszystkie sieci).</para>
						<para>Przykład: <prompt>networks = 'lan1 lan2'</prompt></para>
					</listitem>
					<listitem>
						<para>dummy_ip_networks</para>
						<para>Lista nazw sieci, dla których komputerom zostanie
							przypisany adres IP 0.0.0.0. Uwaga: po zmianie
							wartości tej opcji zalecana jest rekonfiguracja urządzenia.
							Domyślnie: pusta (żadna sieć).</para>
						<para>Przykład: <prompt>dummy_ip_networks = lan1</prompt></para>
					</listitem>
					<listitem>
						<para>dummy_mac_networks</para>
						<para>Lista nazw sieci, dla których komputerom zostanie
							przypisany adres MAC 00:00:00:00:00:00. Uwaga: po zmianie
							wartości tej opcji zalecana jest rekonfiguracja urządzenia.
							Domyślnie: pusta (żadna sieć).</para>
						<para>Przykład: <prompt>dummy_mac_networks = lan1</prompt></para>
					</listitem>
					<listitem>
						<para>skip_disabled</para>
						<para>Wyłączenie tej opcji spowoduje, że komputery o statusie
						odłączony nie będą pomijane. Należy ją wyłączyć w przypadku gdy
						chcemy aby zablokowani klienci mieli możliwość zalogowania się
						do Terminatora. Domyślnie: włączona.</para>
						<para>Przykład: <prompt>skip_disabled = false</prompt></para>
					</listitem>
				</itemizedlist>
			</sect3>
		</sect2>
		<sect2 id="daemon-ewx-stm" xreflabel="ewx-stm">
			<title>Ewx-stm</title>
			<sect3 id="daemon-ewx-stm-intro">
				<title>Wstęp</title>
				<para>Moduł ewx-stm służy do zarządzania urządzeniem Standalone Traffic
				Manager marki <ulink url="http://etherwerx.com">EtherWerX</ulink>.
				Komunikacja odbywa się z wykorzystaniem protokołu SNMP. Do prawidłowej
				pracy wymagany jest firmware w wersji 1.4.x lub nowszej.</para>
				<para>Moduł podczas pracy tworzy własną kopię konfiguracji urządzenia.
				Konfiguracja urządzenia nie jest w żaden sposób weryfikowana, dlatego 
				korzystając z modułu ewx-stm nie można dokonywać zmian bezpośrednio na
				urządzeniu. W celu rekonfiguracji urządzenia należy wyczyścić konfigurację
				na urządzeniu oraz usunąć zawartość tabel ewx_stm_channels oraz
				ewx_stm_nodes w bazie LMSa.
				<note><para>Pamiętaj o włączeniu opcji konfiguracyjnej <prompt>ewx_support</prompt>
				w sekcji <emphasis>[phpui]</emphasis>.</para></note>
				Należy także zwrócić uwagę na to, iż moduł uwzględnia ustawienia opcji 
				'Sprawdzanie MACa' oraz 'Half duplex' w danych komputera.
				</para>
			</sect3>
			<sect3 id="daemon-ewx-stm-config">
				<title>Konfiguracja</title>
				<para>Moduł ewx-stm udostępnia następujące opcje:</para>
				<itemizedlist>
					<listitem>
						<para>snmp_host</para>
						<para>Adres urządzenia EtherWerX. Domyślnie: pusty.</para>
						<para>Przykład: <prompt>snmp_host = 192.168.0.1</prompt></para>
					</listitem>
					<listitem>
						<para>snmp_port</para>
						<para>Port urządzenia dla komunikacji SNMP. Domyślnie: 161</para>
						<para>Przykład: <prompt>snmp_port = 2161</prompt></para>
					</listitem>
					<listitem>
						<para>community</para>
						<para>Nazwa community SNMP urządzenia. Domyślnie: private</para>
						<para>Przykład: <prompt>community = public</prompt></para>
					</listitem>
					<listitem>
						<para>path</para>
						<para>Numer ścieżki zdefiniowanej na urządzeniu, do której
						zostaną dopisane komputery i kanały z LMSa. Domyślnie: nieustawiona.</para>
						<para>Przykład: <prompt>path = 1</prompt></para>
					</listitem>
					<listitem>
						<para>offset</para>
						<para>Liczba całkowita o jaką będą zwiększane identyfikatory komputerów
						podczas zapisu na urządzeniu EtherWerX. Uwaga: po zmianie
						wartości tej opcji zalecana jest rekonfiguracja urządzenia.
						Domyślnie: 0.</para>
						<para>Przykład: <prompt>offset = 1000</prompt></para>
					</listitem>
					<listitem>
						<para>networks</para>
						<para>Lista nazw sieci, które mają być brane pod uwagę. 
						Uwaga: po zmianie wartości tej opcji zalecana jest rekonfiguracja urządzenia.
						Domyślnie: pusta (wszystkie sieci).</para>
						<para>Przykład: <prompt>networks = 'lan1 lan2'</prompt></para>
					</listitem>
					<listitem>
						<para>excluded_networks</para>
						<para>Lista nazw sieci, które mają zostać pominięte. 
						Uwaga: po zmianie wartości tej opcji zalecana jest rekonfiguracja urządzenia.
						Domyślnie: pusta.</para>
						<para>Przykład: <prompt>excluded_networks = 'lan3 lan4'</prompt></para>
					</listitem>
					<listitem>
						<para>dummy_ip_networks</para>
						<para>Lista nazw sieci, dla których komputerom zostanie
						przypisany adres IP 0.0.0.0. Wartość tej opcji może zawierać 
						specjalny znak '*', oznaczający wszystkie sieci. Uwaga: po zmianie
						wartości tej opcji zalecana jest rekonfiguracja urządzenia.
						Domyślnie: pusta (żadna sieć).</para>
						<para>Przykład: <prompt>dummy_ip_networks = lan1</prompt></para>
					</listitem>
					<listitem>
						<para>dummy_mac_networks</para>
						<para>Lista nazw sieci, dla których komputerom zostanie
						przypisany adres MAC 00:00:00:00:00:00. Wartość tej opcji może 
						zawierać specjalny znak '*', oznaczający wszystkie sieci.
						Uwaga: po zmianie wartości tej opcji zalecana jest rekonfiguracja
						urządzenia. Domyślnie: pusta (żadna sieć).</para>
						<para>Przykład: <prompt>dummy_mac_networks = lan1</prompt></para>
					</listitem>
					<listitem>
						<para>excluded_dummy_ip_networks</para>
						<para>Lista nazw sieci, które zostaną wyłączone z działania 
						opcji dummy_ip_networks, w przypadku użycia w niej znaku '*'.
						Domyślnie: pusta (żadna sieć).</para>
						<para>Przykład: <prompt>excluded_dummy_ip_networks = lan5</prompt></para>
					</listitem>
					<listitem>
						<para>excluded_dummy_mac_networks</para>
						<para>Lista nazw sieci, które zostaną wyłączone z działania 
						opcji dummy_mac_networks, w przypadku użycia w niej znaku '*'. Domyślnie: pusta (żadna sieć).</para>
						<para>Przykład: <prompt>excluded_dummy_mac_networks = lan7</prompt></para>
					</listitem>
					<listitem>
						<para>skip_disabled</para>
						<para>Przy domyślnym ustawieniu tej opcji (true) komputery o statusie
						'odłączony' nie są brane pod uwagę. Domyślnie: włączona.</para>
						<para>Przykład: <prompt>skip_disabled = false</prompt></para>
					</listitem>
					<listitem>
						<para>night_hours</para>
						<para>Zakres godzin nocnych w formacie 24-godzinnym. Np. "22-5" 
						oznacza, że podczas uruchomienia modułu w godzinach od 22:00 do 4:59
						brane będą wartości taryf dla godzin nocnych. Obowiązują
						następujące ograniczenia dla formatu zakresu: nie może zawierać spacji,
						okres nie może zaczynać się przed godziną 18.
						Domyślnie: pusta.</para>
						<para>Przykład: <prompt>night_hours = "24-6"</prompt></para>
					</listitem>
				</itemizedlist>
			</sect3>
		</sect2>
		<sect2 id="daemon-ewx-stm-channels" xreflabel="ewx-stm-channels">
			<title>Ewx-stm-channels</title>
			<sect3 id="daemon-ewx-stm-channels-intro">
				<title>Wstęp</title>
				<para>Moduł ewx-stm-channels to odpowiednik modułu ewx-stm (służącego do zarządzania urządzeniem Standalone Traffic
				Manager marki <ulink url="http://etherwerx.com">EtherWerX</ulink>) zawierający rozbudowaną obsługę kanałów.
				</para>
				<para>Różnica w pracy tych modułów jest następująca. Moduł ewx-stm tworzy kanały
				automatycznie w zależności od ustawień zobowiązań klientów i ich przypisania
				do komputerów. Nie obsługuje kanałów zdefiniowanych w LMS-UI. Z kolei moduł ewx-stm-channels pracuje wyłącznie z kanałami zdefiniowanymi w LMS-UI. Komputery
				powinny być przypisane do urządzeń sieciowych, a te z kolei do kanałów o zdefiniowanych
				parametrach. Komputery nie przypisane do żadnego kanału są pomijane. Można to zmienić
				definiując parametry domyślnego kanału w konfiguracji modułu, do którego trafią
				wszystkie komputery bez powiązania.
				</para>
			</sect3>
			<sect3 id="daemon-ewx-stm-channels-config">
				<title>Konfiguracja</title>
				<para>Moduł ewx-stm-channels oprócz opcji dostępnych dla modułu ewx-stm udostępnia następujące opcje:</para>
				<itemizedlist>
					<listitem>
						<para>default_upceil</para>
						<para>Wartość upceil dla domyślnego kanału. Domyślnie: 0.</para>
						<para>Przykład: <prompt>default_upceil = 10000</prompt></para>
					</listitem>
					<listitem>
						<para>default_downceil</para>
						<para>Wartość downceil dla domyślnego kanału. Domyślnie: 0</para>
						<para>Przykład: <prompt>default_downceil = 20000</prompt></para>
					</listitem>
					<listitem>
						<para>default_halfduplex</para>
						<para>Określa czy domyślny kanał ma pracować w trybie half duplex. Domyślnie: nie</para>
						<para>Przykład: <prompt>default_halfduplex = tak</prompt></para>
					</listitem>
				</itemizedlist>
			</sect3>
		</sect2>
	</sect1>
&tscript;
</chapter>
