Informacje ogólne

Zakładam, że wszyscy, którzy czytają ten tekst wiedzą, co to jest SMS. Tych, którzy nie wiedzą zapraszam na www.smsfaq.w.pl. Ponadto zakładam, że Ci którzy chcą sobie zakładać taką bramkę znają podstawy konfiguracji systemu, pisania skryptów shellowych itp.
Skrypty były pisane dla dowolnego shella sh (bash, zsh, ash, ksh, inne) - jeżeli nim nie dysponujesz (co zdarza się baaardzo rzadko) najpierw zapytaj administratora, czy nie ma możliwości zainstalowania jednej z odmian w/w shella.


Tworzenie skryptu powiadamiającego

Po pierwsze, potrzebny jest dostęp do U**xowego konta, z dostępem do shella. Jeśli nie masz takiego - zapytaj administratora o możliwośc umieszczenia na Twoim serwerze skryptów powiadamiających.
Teraz ściągnij ten plik. On zawiera wszystkie skrypty potrzebne do wysyłania SMSów do różnych sieci GSM. Po ściągnięciu musisz go jeszcze rozpakować w katalogu domowym, poleceniem tar xzf skrypty-sms.tar.gz. Opis wszystkich skryptów wraz ze sposobem ich konfiguracji znajdziesz w pliku README.SKRYPTY. Numer wersji ściągniętego pakietu jest podany w nazwie pliku VERSION-X.XXX. Opis zmian jakie zachodziły w poszczególnych etapach modernizowania pakietu możesz przeczytać w pliku CHANGELOG. A całe drzewo plików, takie jak to które otrzymasz po rozpakowaniu archiwum znajdziesz tutaj
Jest możliwość otrzymywania pocztą informacji o nowych wersjach skryptów: napisz do mnie maila z tematem "SMS-lista", a przy najbliższej zmianie dostaniesz powiadomienie o wprowadzonych modyfikacjach...
Po rozpakowaniu wejdź do katalogu skrypty. Przeedytuj plik powiadom i wpisz do niego numer swojego telefonu (w postaci bez prefiksu miedzynarodowego - czyli np. 602123456). Po wprowadzeniu zmian zmień nazwę pliku na .powiadom (poleceniem mv powiadom ~/.powiadom).
Wybierz potrzebny Ci plik sms.XXX. Opisy wszystkich skryptów znajdziesz w pliku README.SKRYPTY. Zmień jego nazwę na .sms (jak wyżej, poleceniem mv sms.XXX ~/.sms).
Możesz zamieniać w wiadomościach polskie znaki na znaki ASCII oraz wycinać kodowanie Quoted-Printable/Base64 - wystarczy użyć skryptu nopl (możesz go sobie skopiować do katalogu domowego jako .nopl: mv nopl ~/.nopl ) i wpisać ścieżkę do niego do skryptu .powiadom (jest to opisane w pliku README.SKRYPTY)
Teraz możesz przetestować działanie skryptu wysyłającego SMSy - wpisz po kolei . ~/.sms (wcześniej ew. musisz uruchomić sh), a potem wyslij_sms XXXXXXXXX 'wiadomość', gdzie XXXXXXXXX to numer Twojego telefonu, a "wiadomość" to treść wysyłanej wiadomości (co było do przewidzenia). Po jakimś czasie (na ogół krótkim) powinieneś dostać odpowiedź - "Wszystko OK" lub komunikat o błędzie. Dalej poczekasz, to po chwili (czasem, gdy bramki są obciążone, ta "chwila" może trwać nawet i kilka godzin) powinieneś dostać SMSa.
Jeśli wszystko działa, to dobrze. Jeśli pojawia się komunikat o błędzie, to spróbuj się zastanowić co jest nie tak - najczęściej odpowiedź programu pozwala dość jednoznacznie określić przyczynę problemu. Jeśli kiedykolwiek dostaniesz w odpowiedzi komunikat "Nieznana odpowiedź: " i masę tekstu, to poślij to do mnie. Nie jestem w stanie sam wyłapać wszystkich możliwych odpowiedzi, które produkują serwery i dlatego czasem (a w nowszych skryptach znacznie częściej) program natrafi na stronę-odpowiedź której nie będzie w stanie zidentyfikować.
Jeśli zadziałało, to teraz sprawdź, czy zadziała powiadomienie: napisz . ~/.powiadom. Teraz komputer poczeka aż wprowadzisz treść listu, tak jakby go podawał program pocztowy. Wpisz:

From: test@test.test
To: ja.sam
Subject: test bramki

Jakastamtresc
[CTRL-D]

CTRL-D trzeba oczywiście nacisnąć, a nie wpisać. Po jakimś czasie powinna dotrzeć wiadomość o treści: Od: test@test.test Temat: test bramki. Jesli dotrze, to wszystko dobrze. Jeśli program "wywali się" wyrzucając jakieś informacje o błędach, to napisz do mnie i prześlij mi to, co wypisał komputer.
Jeśli wiadomość dotarła, to znaczy że wszystko działa.


Programy dodatkowe - nc

Może się zdarzyć tak, że na Twoim koncie nie ma możliwości skorzystania z programu "nc". Jeśli możesz go używać i znasz jego ścieżkę to dobrze - to wystarczy, resztę tej części możesz pominąć. Jeśli nie znasz ścieżki to spróbuj użyć polecenia which nc
Jeśli nie wiesz czy masz taki program to możesz go spróbować znaleźć samodzielnie: wpisz polecenie find / -name nc i czekaj cierpliwie, aż szukanie się zakończy. Obejrzyj pliki, których nazwy wypisał "find" - któryś z nich to może być właśnie poszukiwany program (najprawdopodobniej w katalogu /bin lub /usr/bin, /usr/sbin, itp.). W ostateczności zapytaj się administratora Twojego serwera
No dobrze, więc nie masz netcata. To nic: masz dwa wyjścia. Albo skompilujesz sobie ten program samodzielnie ze źródeł, albo zainstalujesz mój substytut netcata, skrypt nc działający (prawie) tak samo jak oryginalny netcat.
Do kompilacji potrzebujesz: kompilatora, plików nagłówkowych, programu make, oraz prawa do uruchamiania programów z domowego katalogu. Jeśli nie kompilowałeś nigdy żadnego programu i nie wiesz, jak zainstalować nowy program ze źródeł, to chyba lepiej pozostań przy skrypcie, albo zapytaj (jak zwykle) administratora.
Skrypt od "prawdziwego" netcata różni się jedną zasadniczą cechą: wywołuje się go za pomocą polecenia . sciezka/nc zamiast prostego wpisania nazwy (dzięki temu można go uruchomić nawet tam, gdzie użytkownik nie ma prawa do uruchamiania własnych aplikacji. Skrypt nc, odpowiednio zmodyfikowany (jak? to opisane jest w pliku README.SKRYPTY). Ten skrypt możesz umieścić u siebie w katalogu domowym w podkatalogu "bin", lub np. w katalogu domowym pod nazwą .nc (dzięki czemu plik zostanie ukryty i nie będzie "śmiecił" w katalogu).


Programy dodatkowe - config

No cóż... taki program jeszcze nie jest napisany, ale jeśli będą głosy że powinien być do tego jakiś prosty konfigurator który sam wszystko ustawi zadając kilak pytań, to napisze...


Podczepianie skryptu do programu pocztowego

To co teraz będziesz robił zależy od tego, jaki program obsługuje u Ciebie pocztę. Najczęściej będzie to Sendmail, czasem inne: Qmail, Zmail, Smail, Exim... Najlepiej zapytaj swojego administratora. Jeśli masz serwer pocztowy do którego nie przygotowałem opisu, to napisz do mnie, a ja sprónuję wymyślić jak to zrobić dla Twojego systemu.

Wersja dla Qmaila

Sprawdź, czy masz w katalogu domowym plik .qmail. Jeśli nie, to musisz go teraz utworzyć. Przeedytuj ten plik i dopisz na jego początku (w pierwszej linijce) cos takiego: | /bin/sh .powiadom, a w drugiej linijce wpisz ./Mailbox lub odpowiednią nazwę Twojego pliku-skrzynki pocztowej.

Wersja dla Sendmaila

Tu musisz przeedytowac dwa pliki: .forward i .procmailrc. W pierwszym wpisz: | /usr/bin/procmail, czyli ścieżkę dostępu do programu procmail (możesz ją sprawdzić pisząc which procmail). W drugim dopisz na początku następujący fragment:

:0 c
| /bin/sh .powiadom

Czasem potrzebne są jeszcze następujące zmiany:

To już wszystko. Od tej pory powinieneś dostawać powiadomienia o każdym liście.


Tworzenie własnej bramki mail -> SMS

Do postawienia własnej bramki SMS służą zamieszczone pliki bramka-*. Pierwsza rzecz którą należy zrobić to założyć sobie jakiś katalog: np. ~/.sms-bramka, i w nim umieścić wszystkie pliki sms.*, oraz pliki bramka-mail i bramka-common. Dodatkowo może być potrzebny skrypt nc i/lub nopl.
Po przekopiowaniu plików wypełniamy wszystkie pliki potrzebnymi informacjami: lokacja netcata, adres zwrotny dla bramki plusa, pełna ścieżka dostępu do bramka-common itp.
Właściwie to już wszystko (proste, nie? :) ). Zostaje ustawić regułkę dla procmaila. Przykładowy plik .procmailrc:

:0
* !^FROM_MAILER
| /bin/sh $HOME/.sms-bramka/bramka-mail


Tworzenie własnej bramki WWW -> SMS

Jest odrobinę bardziej skomplikowane od stawiania zwykłej bramki mail->SMS. Podobnie jak dla mail->SMS, najpierw tworzymy osobny katalog na potrzebne pliki. Możemy wykorzystać ten sam katalog w którym już działa nasza bramka mail->SMS. Dodatkowy warunek: każdy użytkownik musi mieć dostęp do tego katalogu i do wszystkich plików (prawo +r dla plików i +x dla katalogów dla wszystkich użytkowników) - ponieważ serwer WWW pracuje nie jako nasz użytkownik, a najczęściej jako "nobody" albo "root" (rzadziej), to właśnie "nobody" musi mieć możliwość dotarcia do plików.
Załóżmy tak jak wyżej, że utworzyliśmy katalog ~/.sms-bramka. Teraz trzeba do niego przekopiować: pliki sms.*, bramka-common, ew. nopl i/lub nc. Nie kopiujemy pliku bramka-www. Ten plik będzie leżał w zupełnie innym miejscu... Pamiętaj: pliki muszą mieć atrybut +r (czytanie) dla wszystkich użytkowników.
Dalej: jak w poprzednim przypadku najpierw należy wyedytować wszystkie pliki, wpisując potrzebne dane. Wypełniając nie można bazować na zmiennej "$HOME" lub znaczku "~" - użytkownik "nobody" ma dla tych zmiennych zupełnie inne wartości niż my. Należy podać bezwzględną ścieżkę: /home/...
Teraz tworzymy własną stronę WWW dla bramki - przykładowa strona jest dostępna tutaj. Warto przejrzeć sobie jej źródło. W katalogu ze stroną umieszczamy dodatkowo plik bramka-www, zmieniając jego nazwę na bramka-www.cgi (to jest dość istotne) nadając mu prawa +rx dla wszystkich (chmod a+rx bramka-www.cgi). Musimy mieć możliwość uruchamiania skryptów CGI w tym katalogu w którym umieszczamy nasz plik. Wypełniamy w nim potrzebne dane, podobnie jak poprzednio podając ścieżki bezwzględne. W pliku ze stroną wpisujemy jako parametr "ACTION" formularza lokację pliku z bramką: np. http://moj.serwer.com/nazwa_usera/bramka-www.cgi. Jako metodę formularza wybieramy "POST". I znowu właściwie na tym koniec - po wypełnieniu formularza na naszej stronie i naciśnięciu "Wyślij" zostanie uruchomiony skrypt bramka-www.cgi, który odpowiednio wywoła potrzebne dalej skrypty i wyśle wiadomość. Krótka informacja pokaże się na ekranie - czy wiadomość została wysłana itp.


Instalacja powiadomień w sieci za firewallem/maskaradą

Potrzebne będą pewne zmiany w konfiguracji serwera. Istnieje kilka możliwych rozwiązań dla takiego przypadku:
Pierwszy sposób: instalujemy na firewallu coś co będzie przekazywało dane z naszego skryptu do odpowiedniego komputera w sieci zewnętrznej. Na początku musimy wybrać sobie port, do którego odwołania będą przekazywane do bramki SMS. Wybrany port wpisujemy w pliku /etc/services, nazywając go np. sms-idea:

sms-idea	999/tcp

W tym wypadku wybraliśmy port 999. Dalej musimy ustawić nasz "przekaźnik" połączeń. Robimy to w pliku /etc/inetd.conf:

sms-idea stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/nc
sms.centertel.pl 80

Dzięki takiemu wpisowi każde połączenie z portem 999 na naszym firewallu będzie przekazywane do portu 80 (HTTP) bramki sms.centertel.pl.
Ostatnia rzecz do zrobienia na firewallu to zablokowanie dostępu do bramki dla wszystkich oprócz naszego komputera (albo kilku komputerów): w pliku /etc/hosts.deny wpisujemy:

sms-idea: ALL

a w pliku /etc/hosts.allow:

sms-idea: nazwa.mojego.komputera

lub coś podobnego. Podane ścieżki są przykładowe (takie jak na moim komputerze) i w rzeczywistości mogą się nieznacznie różnić. Więcej informacji na temat konfigurowania demona inetd można znaleźć w manualach albo na mojej stronie głównej ("Security-HOWTO", czyli jak zabezpieczać sieć pod Linuxem).
Teraz żeby móc skorzystać z naszego "tunelu" ustawiamy skrypt na korzystanie z firewalla: w miejscu gdzie w skrypcie pojawia sie wywołanie "$NETCAT sms.centertel.pl 80" powinno być wpisane "$NETCAT nasz.firewall 999".
To rozwiązanie zostało podsunięte przez Mariusza Potockiego.
Druga metoda to zainstalowanie na firewallu małej bramki mail->SMS, która po połączeniu się z nią będzie w pierwszym wierszu danych otrzymywała numer na który ma wysłać SMSa, a dalej treść tego SMSa. Po czym samodzielnie łączyła by się z odpowiednim serwerem, i wysyłała wiadomość. To rozwiązanie jest o tyle prostsze, że nie wymaga ustawiania przekazywania połączeń na konkretne porty, inne dla wszystkich bramek.


Co robić gdy coś nie działa?

Najpierw obejrzeć rozdział "Najczęściej zadawane pytania". Jeśli nie pomoże: pisać do mnie, starając się zamieścić w liście jak najdokładniejszy opis problemu, wypisywane komunikaty, opis sytuacji w jakiej błąd wystąpił itp. Spróbuję odpowiedzieć na każdy list...
Bardzo pomagają mi logi z uruchamiania skryptów. Można je wygenerować w ten sposób: wywoływać .powiadom za pomocą polecenia "/bin/sh -x ~/.powiadom 2>plik.z.logami". Dokładna lista wykonywanych poleceń zostanie zachowana w "pliku.z.logami", który można mi przesłać.


Najczęściej zadawane pytania

1. Dostaję zwroty listów z treścią "adress ... is unsafe for mailing to ...
Zapomniałeś o ustawieniu praw dostępu do pliku: .procmailrc i/lub .forward
2. Nie wiem czy mogę uruchamiać programu w katalogu domowym
Utwórz plik tekstowy w katalogu domowym, nazwij go np. "test", a wpisz do niego:

#!/bin/sh echo "działa"

Potem użyj komendy chmod u+x test. I na koniec spróbuj wywołać polecenie ./test. Jeśli zobaczysz "działa" - to znaczy że możesz. Jeśli zobaczysz coś w rodzaju "access denied" - to nie możesz.


Powrót do strony głównej