NetBSD

    Jak długo serwer był niedostępny?

    Po dzisiejszej wichurze, która spowodowała wyłączenie prądu w nocy, chciałem się dowiedzieć jak długo go nie było. Nie jest to takie trudne jeżeli w domu ma się serwer chodzący 24h na dobę i oprócz mierzenia uptime’u monitorujemy także downtime. O paczce downtime przy okazji dodania jej do pkgsr-wip pisałem jakiś czas temu.

    Pierwsze co nam będzie potrzebne to zainstalowanie paczki downtimed – http://dist.epipe.com/downtimed/. Używając pkgsrc paczka jest w wip/downtimed.

    Po wydaniu polecenia downtimes dostajemy listę przerw w działaniu serwera:

    crash 2015-04-01 00:48:28 -> up 2015-04-01 02:22:27 =    01:33:59 (5639 s)

    Do tego czasu w moim przypadku należy dodać 27 minut ponieważ tyle mi UPS podtrzymuje całą szafkę teletechniczną ze switchem serwerem i innymi urządzeniami.

    A teraz pobawmy się bardziej danymi z downtimed. Za pomocą jednego zgrabnego „one-line’ra” możemy przeliczyć jak długo nasz serwer „leżał”.

    downtimes | awk {'print $10'} | sed 's/^.//' | paste -sd+ - | bc | awk '{print $1/60}' | awk '{print $1/60}' | awk '{print $1/24}'

    Robimy co następuje powyższym poleceniem:

    1. Wywołujemy downtimes produkując kolumnę z odnotowanymi przerwami
    2. Wynik przekazujemy do awk, które pokazuje nam tylko 10 pole (pola liczymy co spację) – czyli liczbę sekund ile trwało wyłącznie serwera
    3. Kolumnę z sekundami (i początkowym nawiasem) przekazujemy do sed’a przy pomocy, którego kasujemy nawiaz z pierwszego znaku. Ściślej rzecz ujmują zamieniamy pierwszy znak w każdej linijce na nic, ostatecznie dostajemy kolumnę sekund
    4. Kolumnę z sekundami przekazujemy do polecenia paste z parametrem -sd+ co powoduje sklejenie kolumny w jeden string oddzielony znakami + (znak „-” za -sd+ jest wymagany przy używaniu BSD paste, przy GNU paste można bez -)
    5. Gotowy string który ma postać ciągu sekund oddzielonego plusami przekazujemy do kalkulatora bc, który wykona dodawani.
    6. Otrzymaną sumę liczby sekund dzielimy przy pomocy awk przez 60 otrzymując minuty
    7. Otrzymane minuty ponownie dzielimy przez 60 otrzymując godziny.
    8. Na koniec wynik w minutach dzielimy przez 24 otrzymując ilość dni , kiedy serwer był niedostępny.

    Powyższe polecenie na moim domowym serwerze daje wynik 7.74633 dnia, czyli ponad 7,5 dnia.

    Włóżmy ten wynik w jakiś kontekst, aby się przekonać czy to dobry wynik czy nie. Akurat przeciwieństwem downtimed jest uptimed (surprise, surpise!) , który mierzy czas działania serwera i kilka innych ciekawych rzeczy jak rekordowe uptime’y oraz jaki był w tym momencie zainstalowany system, a także sumaryczną ilość dni ile działał serwer. Przy okazji możemy sprawdzić czy nasze obliczenia przy pomocy downtimed sprawdzą się.

    Na dzień dzisiejszy uprecords (komenda do wywołania statystyk) u mnie wygląda tak:

    dom# uprecords
    #               Uptime | System                                     Boot up
    ----------------------------+---------------------------------------------------
    1   102 days, 14:03:21 | NetBSD 6.1.4_PATCH        Tue Jul  8 16:37:50 2014
    2    81 days, 05:59:55 | NetBSD 6.1.4_PATCH        Fri Apr 18 10:33:21 2014
    3    80 days, 01:40:20 | NetBSD 6.1.5_PATCH        Sat Jan 10 22:07:27 2015
    4    68 days, 12:05:30 | NetBSD 6.1.0_PATCH        Mon Sep  9 21:51:38 2013
    5    44 days, 23:30:13 | NetBSD 6.1.5_PATCH        Wed Nov 26 19:51:24 2014
    6    44 days, 07:09:29 | NetBSD 6.1.0_PATCH        Sat Dec  7 11:02:04 2013
    7    41 days, 14:10:24 | NetBSD 6.1.0_PATCH        Fri Jan 31 22:46:29 2014
    8    38 days, 16:54:02 | NetBSD 6.0.0_PATCH        Sun Nov 25 23:59:36 2012
    9    37 days, 20:55:24 | NetBSD 6.0.0_PATCH        Sat Jan 12 12:13:53 2013
    10    37 days, 14:33:08 | NetBSD 6.1.0_PATCH        Fri Jun 21 23:19:00 2013
    ----------------------------+---------------------------------------------------
    ->  23     6 days, 11:12:42 | NetBSD 6.1.5_PATCH        Wed Apr  1 02:27:59 2015
    ----------------------------+---------------------------------------------------
    1up in     2 days, 21:08:28 | at                        Fri Apr 10 10:49:08 2015
    t10 in    31 days, 03:20:27 | at                        Fri May  8 17:01:07 2015
    no1 in    96 days, 02:50:40 | at                        Sun Jul 12 16:31:20 2015
    up   876 days, 17:53:56 | since                     Sun Nov  4 00:02:44 2012
    down     7 days, 18:44:01 | since                     Sun Nov  4 00:02:44 2012
    %up               99.120 | since                     Sun Nov  4 00:02:44 2012

    Wg uptimed serwer na ponad 876 dni był nieosiągalny przez 7 dni i prawie 19 godzin, co stanowi SLA na poziomie 99.12% :) Całkiem nieźle jak na domowy serwer!

    Sprawdźmy jeszcze czy wyniki downtimed i uptimed nie róźnią się zbytnio, czyli czy 7 dni 18 godzin i 44 minuty to mniej więcej 7.74633. Ponownie przy pomocy bc konwertujemy tym razem godziny do systemu dzisiętnego.

    dom# echo "scale=5; 44/60" | bc
    .73333
    dom# echo .73333+7 | bc
    7.73333

    Całkiem blisko, ale jak blisko? :) Poraz trzeci użyjmy bc aby policzyć procentową różnicę między tymi wartościami:

    dom# bc
    scale=5
    7.74633-7.73333
    .01300
    7.74633+7.73333/2
    11.61299
    .01300/11.61299*100
    .11100

    Różnica 0.11% czyli w zasadzie pomijalna. Za to zabawa w konsoli przednia :)

     

     

    VN:F [1.9.22_1171]
    Rating: 0.0/10 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

    © odwiedź stronę http://maciejewski.org po więcej fajnych postów!

    In English

    Kill It! (UNIX way)

    I’ve got heavy load on one box. What is strange it operate normally, despite this load:

    load averages: 153.11, 152.41, 150.74
    866 processes: 150 runnable, 712 sleeping, 4 on CPU

    This ~720 processes ware snmpd in some strange loop of checking if snmpd is working.

    I can’t kill it globally witk pkill , but kill -9 PID works. I don’t want to manually type 720 pids and don’t want to restart machine, so here comes unix way to kill 720 processess:

    ps uax | grep snmpd | awk '{print $2}' | xargs kill -9

    Results?

    load averages: 0.04, 10.8, 59.5
    98 processes: 95 sleeping, 3 on CPU

    Back to normal state!

    Mondays… ;)

    VN:F [1.9.22_1171]
    Rating: 10.0/10 (1 vote cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

    © odwiedź stronę http://maciejewski.org po więcej fajnych postów!

    Job / Praca

    Hylafax i wiele modemów oraz róźni odbiorcy.

    Mój system faksowy rozrasta się, aktualnie obsługuje 5 numerów a w planach są kolejne dwa. Jak na razie w dwa miesiące odebrał ponad 1500 faksów i działa bez zarzutu.

    Dokładając modemy oczywiście modyfikacji uległ plik z konfiguracjami FaxDispatch i skrypty konstruujące maile z faksami w formacie png.

    Skrypt z tego wpisu teraz jest w osobnych plikach, każdy dla innego numeru. Każdy z tych skryptów wykorzystuje też osobny katalog tymczasowy (/tmp/faxX) aby w przypadku odbierania faksów jednocześnie pliki z obrazkami nie pomieszały się, lub nie zostały nadpisane. Eksportowanie zmiennych $SENDER i $FILE jest także uzupełnione o kolejny numer aby nie było niejasności i błędów w dostarczeniu.

    Teraz najciekawsza zmiana – instrukcja CASE w pliku FaxDispatch.
    FILETYPE=pdf;
    SENDTO=fax_pdf@***.pl;
    TEMPLATE=pl;
    case "$DEVICE" in
    tty00)  echo $FILE > /tmp/FILE; echo $SENDER > /tmp/SENDER; /tmp/convertmime.sh;         SENDTO=fax_pdf@***.pl;;
    ttyU0)  echo $FILE > /tmp/FILE2; echo $SENDER > /tmp/SENDER2; /tmp/convertmime2.sh;      SENDTO=;;
    ttyU1)  echo $FILE > /tmp/FILE3; echo $SENDER > /tmp/SENDER3; /tmp/convertmime3.sh;      SENDTO=;;
    ttyU2)  echo $FILE > /tmp/FILE4; echo $SENDER > /tmp/SENDER4; /tmp/convertmime4.sh;      SENDTO=;;
    ttyU3)  echo $FILE > /tmp/FILE5; echo $SENDER > /tmp/SENDER5; /tmp/convertmime5.sh;      SENDTO=;;
    esac

    Pierwsze 3 linijki to standardowa konfiguracja jeśli nie zachodzi żaden CASE, co właściwie nie powinno się zdarzyć, ale w razie jakby co (np nieoczekiwana zmiana nazwy portu) fax zostanie dostarczony na mail fax_pdf@**.pl jako pdf.

    Następnie CASE działający na zmiennej $DEVICE, która odpowiada portowi RS232 w NetBSD. Każdy CASE wyrzuca nazwe pliku oraz nadawce do właściwego pliku, z którego później korzysta convertmimeX.sh do skonstruowania maila. Dodatkowo modem na tty00 oprócz dostarczenia faksu w formie obrazka wysyła ten sam faks w formacie pdf.

    System działa bardzo stabilnie, duże znaczenie ma zapewne jakość modemów oraz użytych przejściówek USB-RS232. W moim przypadku kable USB wpięte obok siebie, blokowały losowo któryś modem. Kiedy wpięte są co drugi port USB wolny – wszystko działa bez zakłóceń.

    Na razie półka modemowa wygląda jak na zdjęciu poniżej, ale kiedy dojdą dodatkowe dwa modemy trzeba będzie pomyśleć o ładniejszej organizacji :)

    VN:F [1.9.22_1171]
    Rating: 0.0/10 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

    © odwiedź stronę http://maciejewski.org po więcej fajnych postów!

    Job / Praca

    Administrowanie może być ładne i wygodne!

    Szukając alternatywy dla SNORT + BASE natrafiłem na SNORBY. Snorby to tak samo jak Base frontend dla Snorta, z tym, że napisany w rubym i jest po prostu ładny. Wszystko się kręci, przyciemnia, przelatuje z jedno w drugie, dodatkowo ma kilka fajnych funkcji jak generowanie raportów pdf czy wysyłanie powiadomień mailem.

    Co mnie szczególnie zaskoczyło to instalacja, faktycznie (przynajmniej na NetBSD) przebiegła tak jak jest pokazana w kilku krokach na stronie Snorbyego. Klonujemy najnowszą wersję przy pomocy gita, edytujemy podstawowe informacje i dostęp do bazy MySQL, uruchamiamy server na porcie 3000 – gotowe :)

    Oczywiście trzeba dosintalować bardzo dużo składników samego rubiego (to się chyba naywa „gems” ? – nigdy nie miałem do czynienia z rubym :), część znajduje się w pkgsrc, część ruby sam doinstaluje przez wydanie komendy „bundle install”. w katalogu ze snorbym.

    Jedyna rzecz, którą musiałem poprawić ręcznie to zrobić dowiązanie z /usr/pkg/bin/ruby193 do /usr/pkg/bin/ruby ponieważ bez tego snorby mówił że nie wie gdzie jest ruby i nie mógł odpalić „workera”, który co jakiś czas zbiera informację z bazy i aktualizuje dashboard.

    Co do snorta, to konfiguracja łącząca go ze snorbym jest banalnie prosta. Trzeba tylko dodać w konfigu, aby oprócz zapisywania do pliku lub bazy danych, zapisywał też do bazy snorbiego :) To wszystko.

    Po chwili w zależności jakie reguły mamy zainstalowane i co snort nałapie, wszystko powinno być ładnie odwzorowane w snorbym, gdzie już można wygodnie sobie przegladać raporty, zerkać do środka ramek, sprawdzać czy jakiś host nie za bardzo nam bruździ itp.

    Porównując czystą instalację snorta i logowanie do plików a wizualizację przy pomocy Snorbiego właściwie nie ma co porównywać :)

    VN:F [1.9.22_1171]
    Rating: 0.0/10 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
    Internet

    Już nie taki brzydki hack na hylafax i png

    W poprzednim wpisie – http://maciejewski.org/2012/05/16/hack-na-hylafax-i-faksy-w-png-lub-innym/ opisałem jak przerabiać tiffy generowane przez hylafax na png i wysyłać je ludziom na mail.

    Skrypt w FaxDispatch co prawda działał bardzo dobrze ale był dość brzydki i toporny (tworzenie headerów przez echo >> do plików itp).

    Pozatym okazało się że miał jedną zasadniczą wadę. Nie dało się przekazać wiadomości z załącznikami inline. Po naciśnięciu FORWARD wiadomość wyglądała mniej więcej tak:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    Dlatego zrezygnowałem z sendmaila i uuencode na rzecz mime-construct

    Poprzedni skrypt wygląda teraz tak:

    convert /var/spool/hylafax/`cat /tmp/FILE` /tmp/fax/fax.png
    for D in /tmp/fax/*png
    do
    echo -n "--file-attach " >> /tmp/fax/faxy
    echo $D >> /tmp/fax/faxy
    done
    mime-construct --header 'From: Serwer faxów ' --to fax@***.pl --subject "Odebrano fax od $SENDER" `cat /tmp/fax/faxy`
    rm -rf /tmp/fax/*

    Teraz pętla for tworzy listę plików które mime-construct ma załączyć do wiadomości.

    Po zmianie skryptu dostarczanie faksów działa jak dotychczas, natomiast po przekazaniu mamy eleganckie załączniki tam gdzie powinny być :)

     

    VN:F [1.9.22_1171]
    Rating: 0.0/10 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
    Job / Praca

    Hack na hylafax i faksy w png (lub innym formacie graficznym)

    Na początku była euforia. Będziemy mieli firmowy wirtualny faks z pięcioma numerami! Notabene „paczkę” dziesięciu kolejnych numerów od Netii dostaliśmy za darmo, a myślałem, że za darmo nikt już nic nie daje. Zatem, serwer faksów stanął na nogi dość szybko i co również ważne, pierwszy numer udało się uruchomić bez większych problemów. Serwer to hylafax 4.4.7.

    $ faxstat
    HylaFAX scheduler on nidhog.***.pl: Running
    Modem tty00 (+48616******): Running and idle

    Po początkowym (moim) zachwycie jak to dobrze działa i jak stabilnie, zaczęły napływać pytania i prośby o zmianę formatu dostarczania faksów. Tutaj małe wtrącenie jak wygląda u nas dostarczanie faksów. Na jeden numer do księgowości kontrahenci wysyłają faks, który następnie jest dystrybuowany do wszystkich osób którym może być to przydatne. Te kilkadziesiąt osób patrzy sobie w swoje Thunderbirdy a niektóre wybitnie oporne jednostki w Outlooki i im szybciej po łypnięciu okiem można stwierdzić, że ten faks jest potrzebny lub nie tym lepiej.

    I tu właśnie zaczynają się schody bowiem hylafax po odebraniu faksu umie go dostarczyć jako postscript (domyślnie) lub wielostronicowy tiff lub pdf. Niby mamy wszystko co potrzeba, oryginał, obrazek, pdf. Niestety problem tkwi poniekąd w klientach pocztowych, które bez zagłębiania się w szczegóły nie mogą wyświetlić podglądu załącznika w pdf lub tiff.

    Domyślnie hylafax nie ma także opcji dla png, jpg czy gif ponieważ w/g twórców hylafax’a formaty te nie nadają się do odwzorowywania czarno-białych faksów oraz mają problem z wielostronicowymi faksami.

    Po kilkudniowych (naprawdę) poszukiwaniach jakichś pluginów i patchy okazało się, że są co prawda jakieś patche na /var/spool/hylafax/bin/faxrcvd , który jest odpowiedzialny za przyjmowanie faksów istnieją na forum hylafax ale posty są datowane między 1999 a 2004 i teraz ten plik wygląda zupełnie inaczej. Oczywiście przy każdym poście akademicka dyskusja dlaczego nie używać png czy jpg…

    Jak już pisałem, w modelu odbioru faksów, który u nas z powodzeniem funkcjonuje liczy się szybkość – dostajemy kilkanaście/kilkadziesiąt faksów dziennie, który to faks może dotyczyć jednej lub kilku osób z kiludziesięciu. Musi być obrazek dostępny w podglądzie dla programów pocztowych, koniec, kropka.

    Zamiast próbować zaimplementować obsługę png do faxrcvd, który dla mnie jest zbyt pokręcony, poszedłem inną drogą. Hylafax używa pliku /var/spool/hylafax/etc/FaxDispatch do dostosowywania dostarczania faksów. Można tam oprócz predefiniowanych pól dokonywać modyfikacji np przy pomocy CASE (gdy numer taki, dostarcz gdzieś) itp. Mi natomiast rzucił się w oczy przedostatni przykład z jakiegoś FaxDispatcha w cvsie hylafaxa:

    ## To make each received fax saved outside hylafax
    ## ( Don't forget to chown uucp /some/place )

    /bin/cp $FILE /some/place

    Czysty skrypt shellowy w pliku konfiguracyjnym :)

    Po kilkunastu wysłanych faksach testowych i poprawieniu kilku błędów oraz praw urodziło się coś takiego:

    FILETYPE=pdf;
    SENDTO=fax@***.pl;
    TEMPLATE=pl;

    convert $FILE /tmp/fax/fax.png
    echo "To: fax@***.pl" > /tmp/fax/mail_fax
    echo "From: Serwer faxĂłw *** Sp. z o.o. " >> /tmp/fax/mail_fax
    echo "Subject: Odebrano fax od $SENDER" >> /tmp/fax/mail_fax
    echo "MIME-Version: 1.0" >> /tmp/fax/mail_fax
    echo "Content-Type: text" >> /tmp/fax/mail_fax
    echo "Content-Disposition: inline" >> /tmp/fax/mail_fax
    for D in /tmp/fax/*png
    do
    uuencode $D $D >> /tmp/zalaczniki
    done
    cat /tmp/zalaczniki >> /tmp/fax/mail_fax
    sendmail "fax@***.pl" < /tmp/fax/mail_fax rm -rf /tmp/fax/* rm -rf /tmp/zalaczniki

    Do działania potrzebny jest ImageMagic.

    Krótkie objaśnienie

    - pierwsze trzy linijki to najbardziej podstawowa konfiguracja, odbiorca, format i szablon wiadomości. Zostawiłem podczas testowania jak przychodził faks aby przez wadliwy skrypt poniżej nie zostać pozbawionym faksów :)

    - następnie konwertujemy plik tiff który tworzy hylafax w /var/spool/hylafax/recvq na png. Konkretny plik hylafax przechowuje w zmiennej $FILE więc nie musimy nawet szukać tego o którego nam chodzi. Wielostronicowy tiff konwertowany jest na wiele plików png w/g schematu - jeśli dajemy nazwę fax.png jako pliku wyjściowego dostajemy fax-1.png, fax-2.png itd.

    - kolejne 6 linijek tworzy nagłówek maila, bez tego też zadziała, ale odbiorca dostanie fax bez tematu od UNIX-to-UNIX Copy (uucp@domena), założę się, że to się nie spodoba ludziom z poza IT :) Mamy zatem ładnie od kogo dla kogo, z numerem telefonu który do nas wysyłał w temacie.

    - następne 4 linijki to pętla działająca na katalogu gdzie są nasze skonwertowane pliki png. Każdy plik png trzeba zakodować do ascii i dokleić do wcześniej stworzonego pliku z nagłówkiem.

    - ostatecznie wysyłamy mail sendmailem dołączając nagłówki i załączniki z pliku.

    - ostatnie dwie linijki - sprzątamy oczekując następnego faksu :)

    Trzeba pamiętać, aby wszystkie polecenia i katalogi użyte w tym skrypcie mogły być wykonane przez użytkownika uucp.

    Jeśli wszystko gra, adresat maila powinien otrzymać mniej więcej taką wiadomość:

    VN:F [1.9.22_1171]
    Rating: 0.0/10 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
    NetBSD

    wip/downtimed

    Po wip/digitemp dzisiaj dodałem drugą paczkę do wip’a. Downtimed śledzi czasy uruchomienia, rebootów, zawieszeń, braku prądów itp i prowadzi statystyki jak długo system był offline. Co ciekawe, planowe restarty (przynajmniej w przypadku mojego serwera) trwają dokładnie tyle samo – 66 sekund (reboot) przy czym „shutdown -r now” jest o 3 sekundy szybszy (63 sek) niż reboot :)

    Przykładowe statystyki wyglądają tak:

    $ downtimes
    down 2012-02-28 14:57:17 -> up 2012-02-28 14:58:23 = 00:01:06 (66 s)
    down 2012-02-28 15:05:12 -> up 2012-02-28 15:06:18 = 00:01:06 (66 s)
    down 2012-02-28 15:07:25 -> up 2012-02-28 15:08:28 = 00:01:03 (63 s)

    VN:F [1.9.22_1171]
    Rating: 0.0/10 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

    © odwiedź stronę http://maciejewski.org po więcej fajnych postów!

    NetBSD

    wip/digitemp

    Zostałem maintainerem (ah jak to brzmi ;) pierwszej paczki w Work In Progress Pkgsrc (pkgsrc-wip).

    Paczka, którą zacommitowałem to Digitemp. Dzięki której można odczytywać temperatury z termometrów podłączonych przez RS232. Ja używam go do odczytywania temperatury na kotle CO oraz rysowaniu wykresu temperatury przy pomocy RRDTool. Jak to wygląda na żywo można zobaczyć tu: http://maciejewski.org/temperatura/.

    W pkgsrc digitempa niestety nie było, a skompilowany ze źródeł nie za bardzo chciał działać. Utrzymywanie linuksa na osobnej maszynie tylko po to, aby mielił powietrze raz na jakiś czas odczytując temperaturę także było bez sensu. Dlatego przy pomocy tego guide’a, morr’a i bartosza z #netbsd.pl oraz patchy Marka Felskowskiego ostatecznie digitemp zagościł w pkgsrc jako gotowa paczka i działa bez najmniejszych problemów tak jak należy :)

    # uname -mrs
    NetBSD 5.1.0_PATCH amd64
    # digitemp -s /dev/tty00 -a
    DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
    GNU Public License v2.0 - http://www.digitemp.com
    Oct 31 11:16:13 Sensor 0 C: 33.19 F: 91.74
    #

    VN:F [1.9.22_1171]
    Rating: 0.0/10 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

    © odwiedź stronę http://maciejewski.org po więcej fajnych postów!

    Job / Praca

    Bezpieczne filtrowanie poczty przy pomocy imapfilter

    Jeśli dostajecie mnóstwo maili codziennie, zapewne filtrujecie je w tym czy innym programie pocztowym. Jeśli jednak wyłączycie ten program, wszystkie maile trafiają do INBOX i tam czekają na swój los do czasu uruchomienia programu pocztowego który je odfiltruje. Problem pojawia się kiedy odbieramy maile na telefonie, lub na innym komputerze. Na innej maszynie można od biedy przenieść regułki filtrowania, ale robić to przy okazji każdego użycia nowego komputera albo webmaila nie ma sensu. W przypadku telefonu jest jeszcze gorzej, a ikonka koperty z liczbą 900+ zniechęca w ogóle do przeglądania poczty.

    Do sprawy podchodzimy oczywiście kompleksowo, jako Admini wiemy, że trzeba się tak napracować aby się na dłuższą metę nie narobić :) Dlatego najrozsądniejszym rozwiązaniem jest użycie imapfilter‚a na jakiejś UNIXowej maszynie, która i tak ciągle mieli powietrze (oczywiście w przerwach kiedy coś robi pożytecznego ;). Jeśli jesteście adminami własnego serwera pocztowego to już nie ma lepszego miejsca – łączenie do localhost jest najszybsze i najbezpieczniejsze bo nie wychodzimy poza maszynę gdzie mamy pocztę.

    Imapfilter korzysta z języka LUA, którego składnia jest dość prosta a opcje imapfiltra bardzo dobrze opisane w man imapfilter_config.

    Mój przykładowy konfig wygląda tak:

    options.timeout = 120
    options.subscribe = true

    account = IMAP {
    server = 'localhost',
    username = 'login@domena.pl',
    password = 'haslo',
    }

    arpwatch = account.INBOX:contain_from('arpwatch@domena.pl')
    account.INBOX:move_messages(account['Raporty.Arpwatch'], arpwatch)

    vpnok = account.INBOX:contain_subject('VPN Accepted!')
    account.INBOX:move_messages(account['Raporty.VPN.OK'], vpnok)

    vpnbad = account.INBOX:contain_subject('VPN Rejected')
    account.INBOX:move_messages(account['Raporty.VPN.Rejected'], vpnbad)

    eventsentry = account.INBOX:contain_from('eventsentry@domena.pl')
    account.INBOX:move_messages(account['Raporty.Event\ Sentry'], eventsentry)

    potwierdzenia = account.INBOX:contain_subject('Przeczyt') +
    account.INBOX:contain_subject('Potwierdzenie doręczenia wiadomości') +
    account.INBOX:contain_subject('Potwierdzenie dostarczenia wiadomosci') +
    account.INBOX:contain_subject('Read:') +
    account.INBOX:contain_subject('Potwierdzenie otrzymania:') +
    account.INBOX:contain_subject('Potwierdzenie dostarczenia wiadomości') +
    account.INBOX:contain_subject('wietlono)')
    account.INBOX:move_messages(account['Potwierdzenia'], potwierdzenia)

    Na co warto zwrócić uwagę:
    + oznacza OR
    * oznacza AND
    – oznacza NOT

    Jeśli podkatalog w Maildirze zawiera spację, trzeba ją wyESCkejpować – np. Raporty.Event\ Sentry

    Cały konfig zapisujemy w domyślnym katalogu dla imapfiltra czyli $HOME/.imapfilter/config.lua i odpalamy na początek z opcją -v aby zobaczyć więcej komunikatów. Jeśli plik z konfiguracją nazywa się inaczej lub jest w innym miejscu wywołujemy imapfilter -v -c /sciezka/do/konfiga

    Jeśli nie ma błędów możemy przejść do dalszej części.

    W zasadzie to jest gotowe rozwiązanie, jeśli jesteśmy sami na serwerze. Jeśli są inni użytkownicy, którzy dodatkowo posiadają prawa root’a albo po prostu nie pasuje nam pozostawiania swojego hasła gdzieś w postaci jawnego tekstu możemy zrobić taki manewr.

    W przypadku NetBSD instalujemy paczkę:
    wip/ccrypt: Encrypts/decrypts files using Rijndael block cipher
    oraz
    sysutils/shc: Shell script to C compiler

    Piszemy prosty skrypt który będzie:

    – dekryptował nasz konfig
    – wykonywał konfig przy pomocy imapfiltra
    – kryptował konfig z powrotem

    na poczatek kodujemy config:

    ccencrypt -e -K supertajnehaslo! config.lua

    w wyniku dostajemy plik config.lua.cpt

    Teraz skrypt:

    #!/bin/sh
    ccencrypt -d -K supertajnehaslo! config.lua.cpt
    imapfilter -c /sciezka/do/pliku/config.lua
    ccencrypt -e -K supertajnehaslo! config.lua

    Po wykonaniu tego skryptu jeśli ścieżki się w nim zgadzają do programów i do konfiga, uprzednio skonfigurowane filtrowanie powinno zadziałać.

    No dobra, tylko co daje kodowanie pliku jeśli hasło podajemy jako parametr? W takim wypadku nic nie daje, łatwo podejrzeć hasło i zdekodować plik konfiguracji gdzie jest hasło do naszej poczty.

    Należy zatem „skompilować” skrypt przy pomocy shc.

    shc -v -r -T -f skrypt.sh

    W wyniku dostaniemy:

    skrypt.sh.x – binarka gotowa do odpalenia
    skrypt.sh.x.c – kod źródłowy wygenerowany z naszego skryptu w takim jakby C.

    Sprawdzamy czy uruchomienie ./skrypt.sh.x robi dokładnie to samo co odpalenie imapfiltra lub skrypt.sh. Jeśli tak to pozostaje nam skasować skrypt.sh gdzie mamy jawny klucz do zakodowanego pliku z konfigiem do imapfiltra gdzie mamy jawne hasło do naszego konta pocztowego :) oraz kasujemy skrypt.sh.x.c gdzie mamy źródła naszej binarki. Nadajemy prawo x do wykonywanie pliku – chmod 700 skrypt.sh.x

    Na koniec dodajemy do crona wywoływanie programu co ileś tam minut:

    crontab -e
    */1 * * * * /usr/home/cancer/skrypt.sh.x

    Od teraz skrypt będzie dokonywał filtrowania co minutę na chwilę dekodując plik z konfiguracją, po czym będzie go kodował. Oczywiście rozwiązanie nie jest idealne, co prawda w ps hasło się nie pojawi, ale można debugować jakby się ktoś uparł. Lepsze jednak takie rozwiązanie niż żadne.

    VN:F [1.9.22_1171]
    Rating: 0.0/10 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

    © odwiedź stronę http://maciejewski.org po więcej fajnych postów!

    Job / Praca

    tmux FTW!

    W codziennej pracy Administratora, logowanie na wiele maszyn i przeprowadzanie update’ów, przeglądów, testów, audytów to niemal codzienność. Przy paru maszynach nie jest to takie problematyczne, przy kilku albo kilkunastu – codzienne logowanie może być już powoli frustrujące. Z pomocą przychodzi tmux czyli terminal multiplexer. Tmux to coś takiego jak screen, tylko lepszy :) Potrafi oprócz wielu sesji w jednym oknie które można przełączać, także dzielić okno na panele horyzontalnie i wertykalnie czyli dla osób które wytkną mi zaraz „polglisz” pionowo i poziomo. Wszystkie polecenia można podać jako parametr dlatego jedną komendą możemy sobie przygotować całe środowisko. Dla moich potrzeb – czyli logowanie się na bramki VPNowe w ilości 6 najlepszym rozwiązaniem jest siatką 3 wiersze na 2 kolumny. Dodatkowo po odpowiednim podzieleniu okna, następuje automatyczne logowanie przez ssh do odpowiednich maszyn dzięki kluczom bez hasła. Efekt ma być taki, że jedna komenda przygotowuje 6 maszyn do pracy zdalnej :)

    Jedziemy:

    tmux new-session -d 'ssh cancer@10.1.2.6' \; split-window -d 'ssh cancer@10.1.3.6'\; split-window -d 'ssh cancer@10.1.4.6'\; split-window -h 'ssh cancer@10.1.5.6'\; select-pane -t 2\; split-window -h 'ssh cancer@10.1.6.6'\; select-pane -t 4\; split-window -h\; attach

    Krótkie wyjaśnienie:

    new-session -d ‚ssh cancer@10.1.2.6’ – tworzy nową sesję (okno główne i wywołuje komendę systemową w ”) -d powoduje odłączenie wszystkich klientów jeśli byli podłączeni.
    split-window – dzieli okno, domyślnie w poziomie
    select-pane -t n – wybiera okno (licząc od zera i od lewej do prawej)
    attach dołącza do całej sesji.

    Efekt:

    Teraz już można od razu działać, nie tracąc czasu na logowanie się do wszystkich maszyn oddzielnie :)

    VN:F [1.9.22_1171]
    Rating: 5.5/10 (2 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
    Related Posts with Thumbnails

    © odwiedź stronę http://maciejewski.org po więcej fajnych postów!

    Add your widget here