Pokazywanie postów oznaczonych etykietą myLinux. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą myLinux. Pokaż wszystkie posty

piątek, stycznia 20, 2012

ARP flux problem solution

Jakieś dwa tygodnie temu miałem pewien pomysł jak zutylizować jeden z serwerów, którym zarządzam docelowo rozszerzając usługę DHCP na trzy podsieci. Tak się składa, że maszyna posiada 4 porty gigabitowe i działa na Linuksie, więc nie powinno być problemów. Wymyśliłem sobie, że podepnę serwer do switcha w następujący sposób:


Położyłem kable, podpiąłem wszystko i zadowolony z siebie odpaliłem terminal. Jakie było moje zdziwienie, kiedy po podnoszeniu eth1 rozpoczęły się anomalie sieciowe. Połączenie lagowało, pingi się gdzieś nagle gubiły itd. Pomyślałem, że może to coś z trasowaniem. Długo pytałem wujka Google co by mogło się dziać, przy okazji ucząc się o takich rzeczach jak dostęp rozłączny i agregacja portów. Z dobry tydzień gryzłem się z tym problemem. Głównie dlatego, że na eksperymenty mogłem sobie pozwolić tylko w godzinach wieczorowych, kiedy serwer nie był obłożony. Dopiero dziś natknąłem się na przyczynę i rozwiązanie problemu. Przyczyna była trywialna w swojej naturze - domyślne ustawienia jądra linuksowego do obsługi ARP. Normalnie sieciowa dyskusja protokołem ARP powinna wyglądać tak:

KomputerA: "Szukam adresu 192.168.2.1 do partyjki warcrafta, który z was to?"
KomputerB: "To ja. Mój adres MAC to 00:11:22:33:44:55."

Domyślnie na zapytanie ARP odpowiedź wysyłana jest na wszystkich interface'ach, a ponieważ w moim wypadku oba interface'y są podłączone do tej samej przełącznicy skutkuje to niezłym bigosem. Dyskusja zmienia się w rozmowę z schizofrenikiem:

KomputerA: "Szukam adresu 192.168.2.1 do partyjki warcrafta, który z was to?"
KomputerB: "Cześć, znajdziesz mnie pod adresem MAC 00:11:22:33:44:55, albo AA:BB:CC:DD:EE:FF. A może to było jednak 00:11:22:33:44:55?"

Rozwiązaniem jest wymuszenie odpowiedzi na zapytania ARP tylko na tej karcie sieciowej na której odebrano zapytanie. Całość sprowadza się do wykonania:

sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2


Aby zmiany były trwałe należy zrobić stosowne wpisy w pliku
/etc/sysctl.conf

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2


piątek, września 16, 2011

Selective syslog-ng remote logging with Tomato

Załóżmy, że posiadamy własną sieć (np. 192.168.0.0/24) w której działają między innymi bezprzewodowe rutery oparte o Tomato pełniące funkcję punktów dostępowych z których chcielibyśmy zbierać logi centralnie na jednej maszynie za pomocą syslog-ng. Maszyna na której zbierane będą logi posiada adres IP 192.168.0.50, a rutery adresy odpowiednio 192.168.0.1-15. Oto krótki przepis jak to zrobić.

Konfiguracja routerów


W pierwszej kolejności należy przekierować sysloga routera na zewnętrzny adres. Wybieramy Administration ▶ Logging i zaznaczamy opcję Log To Remote System oraz w polach IP Address / Port wpisujemy adres 192.168.0.50 oraz port 514.

Wpisy w syslog-ng.conf


Samo przekierowanie logów to tylko połowa pracy. Na serwerze dodajemy wpis zbierający zdalne logi:
source tomatoAP {
    internal();
    udp(ip("0.0.0.0")
    port(514));
};

Dodajemy zestaw filtrów do kierowania zapisem logów z każdego rutera. Dla pierwszych dwóch wpisów IP musimy dodać $ po adresie IP, aby ograniczyć filtr tylko do jednego hosta. Jeśli tego nie zrobimy w szablon wpasowane będą także np. takie adresy jak 192.168.0.193, czy 192.168.0.27.

filter f_tom01 { host("192.168.0.1$"); }; 
filter f_tom02 { host("192.168.0.2$"); };
filter f_tom03 { host("192.168.0.3"); };
filter f_tom04 { host("192.168.0.4"); };
filter f_tom05 { host("192.168.0.5"); };

Dodajemy wpisy gdzie mają być zapisywane logi z poszczególnych routerów...

destination d_tom01 { file("/var/log/tomato/ap-01.log"); };
destination d_tom02 { file("/var/log/tomato/ap-02.log"); };
destination d_tom03 { file("/var/log/tomato/ap-03.log"); };
destination d_tom04 { file("/var/log/tomato/ap-04.log"); };
destination d_tom05 { file("/var/log/tomato/ap-05.log"); };

..., a następnie zbieramy wszystko w całość w spójne regułki dla każdego rutera.

log { source(tomatoAP); filter(f_tom01); destination(d_tom01); };
log { source(tomatoAP); filter(f_tom02); destination(d_tom02); };
log { source(tomatoAP); filter(f_tom03); destination(d_tom03); };
log { source(tomatoAP); filter(f_tom04); destination(d_tom04); };
log { source(tomatoAP); filter(f_tom05); destination(d_tom05); };

Na koniec restartujemy syslog-ng i zaparzamy zasłużoną kawę ]:) Finito.

niedziela, lipca 17, 2011

3-city biking

Wraz z dziewczyną postanowiliśmy kupić sobie rowery na lato. Sylwia kupiła sobie rower miejski, a ja górski rekreacyjny. Częściowo nasza decyzja wynikała z chęci aktywnego spędzenia lata, a częściowo z stanu dróg w Gdańsku. Dla niewtajemniczonych powiem, że remontowana jest teraz linia tramwajowa wzdłuż alei Grunwaldzkiej. Szybciej człowiek dojedzie rowerem niż komunikacją miejską (pomijając możliwość wdychania świeżego powietrza, a nie zapachu czyiś spoconych pach w autobusie). Jednej rzeczy jednak nie potrafię zrozumieć. Rower mam już od ok. 2 tygodni, a już dwa razy musiałem łatać dętkę. W porównaniu z góralem, którego zostawiłem na opolskim gruncie to bardzo mnie to dziwi. Tamten rower wytrzymał 8 lat jazdy po polskich drogach, lesie i wyrobisku skały wapiennej, a chyba tylko raz musiałem łatać dętkę. Mój obecny góral ma nieco cieńszą oponę oraz mniejsze bieżniki, ale za to jeżdżę nim po drogach rowerowych w Gdańsku, które są w naprawdę dobrym stanie. Dziś nie wytrzymałem i pojechałem kupić sobie dętkę samouszczelniającą się. W każdym razie mimo problemów technicznych złapała mnie "zajawka" na kolarstwo. W miarę możliwości oglądam też relacje na żywo z Tour de France 2011. Jak już jesteśmy przy temacie TdF to jako geek oczywiście zainstalowałem sobie oficjalną aplikację Tour de France 2011 na androida. Przydatna sprawa dla każdego fana tego wyścigu, ale aplikacja dała mi nieco do myślenia. Skoro mój telefon HTC ma wbudowany odbiornik GPS to może jest jakaś aplikacja na Androida, która by nadawała się do zbierania statystyk jazdy rowerem. Jak się okazało nie musiałem długo szukać i znalazłem całkiem ciekawą aplikację stworzoną przez Google - My Tracks. Aplikacja pozwala na rejestrowanie przejechanej trasy, oblicza czas spędzony w jeździe (dobra opcja przy poruszaniu się po mieście metodą stop-and-go), oraz liczy statystyki takie jak średni czas jazdy, minimalna/maksymalna prędkość itp. Oto kilka zrzutów z jak to wygląda na telefonie: Ciekawą opcją jest możliwość eksportu do Google Maps. No dobrze. Dosyć blogowania na dziś. Trzeba się, wyspać by jutro w pełni sił pojechać do pracy rowerem ]:D

wtorek, czerwca 28, 2011

udev rules for my tv card

Od wczoraj pod chochlika mam podpiętą kamerkę internetową. Jak się dziś okazało, znalezienie dla niej działających sterowników na Linuksa to najmniejszy problem. Ponieważ mam też kartę telewizyjną (Pinnacle PCTV) dla obu urządzeń tworzone są pliki urządzeń o nazwach /dev/video0 oraz /dev/video1. Wszystko ładnie, tylko że po restarcie systemu raz video0 to karta tv, a raz kamerka internetowa. Całe szczęście można to bardzo prosto rozwiązać pisząc własne reguły udev, co też zrobiłem. Najpierw przyda się zdobycie trochę informacji za pomocą narzędzia udevadm:
$ udevadm info -a -p $(udevadm info -q path -n /dev/video1)

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1e.0/0000:04:01.0/video4linux/video1':
    KERNEL=="video1"
    SUBSYSTEM=="video4linux"
    DRIVER==""
    ATTR{name}=="saa7133[0] video (Pinnacle PCTV"
    ATTR{index}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:1e.0/0000:04:01.0':
    KERNELS=="0000:04:01.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="saa7134"
    ATTRS{vendor}=="0x1131"
    ATTRS{device}=="0x7133"
    ATTRS{subsystem_vendor}=="0x11bd"
    ATTRS{subsystem_device}=="0x002e"
    ATTRS{class}=="0x048000"
    ATTRS{irq}=="19"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

  looking at parent device '/devices/pci0000:00/0000:00:1e.0':
    KERNELS=="0000:00:1e.0"
    SUBSYSTEMS=="pci"
    DRIVERS==""
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x244e"
    ATTRS{subsystem_vendor}=="0x1458"
    ATTRS{subsystem_device}=="0x5000"
    ATTRS{class}=="0x060401"
    ATTRS{irq}=="0"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS=="
Ponieważ mam tylko jedno urządzenie firmy Pinnacle, więc reguła oparta jest o dość prosty atrybut, a mianowicie nazwę widoczną dla systemu. Do pliku /etc/udev/rules.d/10-local.rules dodałem następującą linię: KERNEL=="video*", ATTR{name}=="*Pinnacle PCTV", NAME="%k", SYMLINK="video_tvcard" Po restarcie maszyny w katalogu /dev utworzyło się dowiązanie symboliczne video_tvcard wskazujące na kartę tv. Teraz wystarczyła drobna zmiana konfiguracji programów takich jak tvtime, by odwoływały się do /dev/video_tvcard za każdym razem gdy chcę sobie pooglądać TV. Tych którzy chcą pisać własne reguły odsyłam do artykułu na Arch wiki, który okazał się być bardzo przydatny oraz manuala udevadm.

środa, kwietnia 20, 2011

Bus wardriving

Ta notka leżała u mnie dłuższy czas w szkicach roboczych. Wreszcie znalazłem czas by ją ukończyć.

Od dwóch miesięcy mam nowy telefon, a dokładniej to smartfon HTC Wildfire. Jestem po prostu oczarowany możliwościami jakie daje otwarta architektura jaką jest Android. Najpierw trochę czasu mi zajęło oswojenie się z interfacem dotykowym, a następnie zaczęły się zabawy z testowaniem miliona aplikacji jakie są dostępne na Android Market. Testowałem wszystko począwszy od gier w kulki, a skończywszy na kliencie SSH. Po jakimś czasie uświadomiłem sobie, że skoro smartfon ma wbudowaną kartę wifi oraz czujnik GPS to w zasadzie można by spróbować wardrivingu. Zawsze chciałem spróbować czegoś takiego. Kiedyś nawet podchodziłem do tego tematu z laptopem i nawigacją gps. W zasadzie to pomysł miał ręce i nogi - laptop zbierał dane wifi, a nawigacja miała wysyłać dane gps przez połączenie szeregowe bluetooth. Ktokolwiek miał (nie) przyjemność bawienia się Windowsem CE ten wie ile się trzeba nagimnastykować, by zainstalować oprogramowanie wraz z odpowiednimi bibliotekami na dedykowaną sprzętowo architekturę. Mówiąc krótko za chiny nawigacja nie chciała łyknąć odpowiedniej instalacji .NET Compact Framework, bez której nic nie chciało ruszyć. Wracając do tematu. Poszperałem na markecie, przetestowałem kilka aplikacji i najbardziej do gustu przypadł mi G-MoN. Postanowiłem go przetestować w warunkach polowych. W chwili kiedy to piszę nieczynna jest w Gdańsku linia tramwajowa przebiegająca przez cały Wrzeszcz i kursuje autobusowa linia zastępcza. Jadąc właśnie tym autobusem, siedząc przy oknie odpaliłem niewinnie wyglądający telefon i zacząłem zbierać dane... ]:) Ciekawą funkcją G-MoNa jest możliwość eksportu do formatu KML, który można następnie wczytać do Google Earth. Jednak kiedy to zrobiłem okazało się, że dla zebranych przeze mnie danych niewidoczne są nazwy wykrytych sieci co spowodowane było brakiem tagu <name> dla danej geolokacji. Ale nie ma takiego problemu z konwersją plików tekstowych, których nie można rozwiązać za pomocą odrobiny magii w konsoli. Uwaga, proszę się odsunąć - użyję wyrażeń regularnych ]:P sed 's/<description>\([[:alnum:]]*\)/\<name\>\1\<\/name\>\<description\>/' gmon-orginal.kml > gmon.kml Po ponownym wczytaniu do Google Earth można było już wygodniej oglądać trasę. A na koniec trochę statystyk z całej tej zabawy. Łącznie znalazłem 635 punktów dostępowych. Pocieszające jest, że powyżej 75% z nich używa zabezpieczeń WPA - widać ludzie zaczynają myśleć. Jeśli chodzi o nazwy sieci to wśród domyślnych nazw króluje UPC, linksys oraz wiecznie-żywa neostrada. Jako ciekawostkę powiem, żę tylko 3 AP z neostrady zostały sensownie zabezpieczone poprzez WPA-PSK, a reszta używa domyślnego WEP. Zawsze to powtarzam - telekomuna to zło.

wtorek, września 08, 2009

GPRS on Linux Part 2 - Bluetooth

Było o GPRS przez USB, a teraz czas zabawić się znów Bluetooth'em. Konkretnie to profilem DUN. W tym celu potrzebny będzie włączony protokół rfcomm (ot, taki sobie emulowany port szeregowy, tylko że bezprzewodowy). Zakładam, że BT już zostało skonfigurowane i urządzenia zostały sparowane. Teraz przyda się polecenie sdptool wchodzące w skład pakietu bluez.
# sdptool search DUN
Inquiring ...
Searching for DUN on 00:XX:XX:XX:XX:EA ...
Service Name: Dial-up Networking
Service RecHandle: 0x10002
Service Class ID List:
  "Dialup Networking" (0x1103)
  "Generic Networking" (0x1201)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2
Profile Descriptor List:
  "Dialup Networking" (0x1103)
    Version: 0x0100
Polecenie odpytało wszystkie znajdujące się pobliżu urządzenia BT czy dostarczają usługi Dialup Networking. Jak widać laptop znalazł moją komórkę i wykrył, że może ona działać jako modem używając protokołu rfcomm na kanale 2. Informacja odnośnie kanału na którym pracuje telefon, będzie nam potrzebna. Edytujemy plik /etc/bluetooth/rfcomm.conf wpisując zdobyte informacje.
#
# RFCOMM configuration file.
#

rfcomm0 {
#       # Automatically bind the device at startup
        bind yes;
#
#       # Bluetooth address of the device
        device 00:XX:XX:XX:XX:EA;
#
#       # RFCOMM channel for the connection
        channel 2;
#
#       # Description of the connection
        comment "Lightnirs SE k550";
}
Teraz restartujemy demona bluetooth, aby zastosować zmiany. # /etc/rc.d/bluetooth restart Do komórki będziemy odwoływać się jako urządzenia /dev/rfcomm0. Podobnie jak w przypadku GPRS poprzez USB będą nam potrzebne dwa pliki - jeden do negocjacji połączenia, a drugi do ustawień pracy modemu. Pierwszy plik (/etc/ppp/chat-era) wygląda dokładnie tak samo jak w wersji GPRS poprzez USB, co jest logiczne skoro dostawca internetowy jest ten sam. Ponieważ tym razem modem to inne urządzenie (z punktu widzenia systemu), więc wymaga nieco innych ustawień. Utworzyłem sobie taki oto plik konfiguracyjny /etc/ppp/peers/erabt
/dev/rfcomm0
115200
defaultroute
usepeerdns
crtscts
lock
hide-password
holdoff 3
maxfail 3
ipcp-accept-local
lcp-echo-failure 12
noauth
novj
novjccomp
persist
mtu 1500
mru 1500
linkname erabluetooth
#nodetach
#debug
connect '/usr/sbin/chat -v -f /etc/ppp/chat-era'
Teraz o ile użytkownik posiada odpowiednie uprawnienia (por. "GPRS on Linux Part 1 - USB") może nawiązać połączenie wykonując sudo pon erabt Analogicznie by się rozłączyć wpisujemy sudo poff erabt. Na koniec jeszcze małe zestawienie wad i zalet GPRS przez USB oraz Bluetooth. Zaletą Bluetooth niewątpliwie jest wygoda użytkowania, bo nie trzeba nosić ze sobą dodatkowego kabla by podłączyć telefon. Niestety technologia Bluetooth w porównaniu z np. z Zigbee działającym na tym samym paśmie jest naprawdę prądożercza i zakłada, że urządzenia BT będą w miarę często ładowane. Nie jest to więc optymalne rozwiązanie jeśli jesteśmy w szczerym polu i laptop posiada nie w pełni naładowaną baterię. Wariant z USB jest bardziej korzystny, ale telefon posiada ustawienia fabryczne, które włączają automatyczne ładowanie akumulatora podczas połączenia USB. Całe szczęście można to wyłączyć korzystając z ukrytego menu serwisowego. By się do niego dostać w telefonach Sony Ericsson trzeba wystukać następującą sekwencję na klawiaturze → * ← ← * ← *, gdzie strzałki to ruchy joysticka. W menu serwisowym wybieramy "Ustawienia usług" -> "Ładowanie wył."

Ach, aż mam ochotę wybrać się gdzieś na łono natury. Tylko ja, świeże powietrze, rower, laptop i komórka... ]:)

sobota, września 05, 2009

GPRS on Linux Part 1 - USB

Jak już się bawię tym moim telefonem pod pingwinem to opiszę jeszcze jak można z niego korzystać jako modemu zarówno pod USB, jak i pod Bluetooth. Osobiście uważam to za dość przydatną funkcję, bo już parę razy zdarzyło mi się, że byłem gdzieś głęboko w sercu borneańskiej dżungli i musiałem nagle wysłać kilka ważnych maili, albo zrobić przelew. Przejdźmy jednak do konkretów. Podpięcie SE k550 za pomocą kabla USB do komputera powoduje wykrycie go jako dwóch urządzeń szeregowych: /dev/ttyACM0 i /dev/ttyACM1.
# dmesg | tail
usb 2-2: new full speed USB device using uhci_hcd and address 9
usb 2-2: configuration #3 chosen from 1 choice
cdc_acm 2-2:3.1: ttyACM0: USB ACM device
cdc_acm 2-2:3.3: ttyACM1: USB ACM device
cdc_wdm 2-2:3.7: cdc-wdm-176: USB WDM device
usb0: register 'cdc_ether' at usb-0000:00:1d.0-2, CDC Ethernet Device, 02:80:37:09:03:00
Po podpięciu kabla na telefonie wybieramy "Połączenie USB: Tryb telefonu". Teraz pozostaje jedynie konfiguracja komputera. Niezależnie od metody połączenia (USB, BT) i używanego programu trzeba najpierw skonfigurować sposób negocjowania połączenia zależny od naszego dostawcy. Ponieważ posiadam telefon w Erze utworzyłem sobie plik /etc/ppp/chat-era, który wygląda następująco:
TIMEOUT 5
ECHO OFF
ABORT 'BUSY'
ABORT 'NO ANWSER'
ABORT 'ERROR'
ABORT 'NO CARRIER'
SAY "Ustawianie polaczenia...\n"
'' 'ATZ'
SAY "Ustawiam APN\n"
OK 'AT+CGDCONT=1,"IP","erainternettt"'
SAY 'Wydzwaniam...\n'
OK 'ATD*99***1#'
SAY "Czekam na polaczenie....\n "
CONNECT ""
SAY "POLACZONO. Milej zabawy ]:)\n"
Wytłuszczony fragment jest loginem jaki używamy w danej sieci komórkowej. W Tak Taku jest to "erainternett", w Plusie "www.plusgsm.pl", a w Orange i Play "internet". Następnie zabieramy się za utworzenie pliku konfiguracyjnego dla wywoływania połączenia. Mój /etc/ppp/peers/era wygląda tak:
/dev/ttyACM0
115200
noipdefault
usepeerdns
defaultroute
crtscts
lock
hide-password
holdoff 3
ipcp-accept-local
lcp-echo-failure 12
noauth
novj
novjccomp
persist
#nodetach
#debug
connect '/usr/sbin/chat -v -f /etc/ppp/chat-era'
W zasadzie najważniejsze są cztery pierwsze wiersze oraz ostatni. /dev/ttyACM0 jest ścieżką do modemu, 115200 jest szybkością transferu (baud rate) do urządzenia szeregowego(modemu), noipdefault ustawia oczekiwanie na przydzielenie nam adresu IP przez dostawcę, a usepeerdns włącza pobranie adresów serwerów DNS od dostawcy. W ostatnim wierszu zdefiniowany został sposób w jaki negocjowane ma być połączenie, czyli w tym wypadku program chat pobiera stosowne komendy wywoławcze modemu z utworzonego wcześniej pliku /etc/ppp/chat-era. Wiersze za komentowane są przydatne w poszukiwaniu przyczyny niepowodzenia podczas połączenia - nodetach wyłącza wybieranie jako proces w tle, dzięki czemu można śledzić stan negocjacji połączenia w konsoli, a debug jak sama nazwa wskazuje włącza odrobaczanie. Ostatnią rzeczą jaką należy zrobić to pozwolić użytkownikowi na wykonanie połączeń. W systemach unixowych tak już jest, że interfejsy sieciowe normalnie może uruchamiać i zamykać tylko root. W innych przypadkach potrzebne jest polecenie sudo oraz stosowne wpisy w na liście sudoersów. Logujemy się na konto roota i uruchamiamy polecenie: # visudo Dopisujemy lightnir ALL=NOPASSWD: /usr/bin.pon, /usr/bin/poff, /usr/sbin/pppd a następnie zapisujemy i zamykamy(:wq). Dzięki temu użytkownik lightnir będzie mógł uruchamiać polecenia pon, poff oraz pppd na uprawnieniach roota bez pytania o hasło. Teraz aby nawiązać połączenie wystarczy jedynie wykonać polecenie: sudo pon era lub sudo pppd call era. Analogicznie, by się rozłączyć wykonujemy sudo poff era lub killall pppd.

wtorek, września 01, 2009

The Runes have spoken

ᚼᛒ
Czy powyższe dwie runy (Haglaz i Berkanan) są komuś znajome? W takim zapisie pewnie mało kto je widział na oczy. Wspomniane runy można jednak zapisać w formie runy łączonej, którą niejeden wielokrotnie widział w sklepie multimedialnym i bez problemu rozpoznaje. Chodzi oczywiście o biało-błękitne logo bluetooth. Tak jak Harald I Sinozęby zjednoczył Danię, Szwecję i Norwegię pod jedną koroną, tak technologia bluetooth pozwala na bezprzewodową współpracę wielu urządzeń poczynając od telefonów komórkowych, systemów nawigacji, komputerów, a kończąc na prostetycznych nogach. Jak pisałem wcześniej w końcu udało mi się zintegrować moją komórkę (SE k550) z laptopem (Philips X58) pod moim pingwinem (Archlinux, KDE 4). Postaram się pokrótce(albo i nie) opisać jak tego dokonałem. No to jedziemy.

Standardowo zabrałem się za instalację odpowiednich paczek. pacman -S bluez kbluetooth Krótkie wylistowanie urządzeń usb i widać, że sterownik do wbudowanego w laptopie modułu BT jest załadowany i urządzenie działa w trybie HCI (Host controller interface), ale o tym później. # lsusb|grep -i bluetooth
Bus 004 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Następnie wyedytowałem plik /etc/conf.d/bluetooth odkomentując usługę HID. # Run the bluetooth HID daemon (default: false)
HIDD_ENABLE="true"
Oba urządzenia działają, sterownik jest, więc uruchomiłem usługę bluetooth. # /etc/rc.d/bluetooth start Szybki test za pomocą hcitool, czy aby wszystko idzie jak po maśle.
# hcitool dev
Devices:
        hci0    00:XX:XX:XX:XX:3C
Ok. A więc mam adres BT mojego laptopa. Następnie wyszukałem urządzeń BT (komórki).
# hcitool scan
Scanning ...
        00:XX:XX:XX:XX:EA       Lightnir
OK. No to mam adres BT komórki. Co ciekawe komputer widział telefon, ale wyszukiwanie laptopa za pomocą komórki nie działało. Jak się później dowiedziałem spowodowane było to przez ustawiony na laptopie tryb niewidoczności. Teraz tylko wystarczy sparować oba urządzenia. W tym celu trzeba wykonać połączenie z jednego urządzenia na drugie wykorzystując jeden z 26 profili BT. Ja zdecydowałem się na najprostsze z możliwych rozwiązań, a mianowicie użycie mojego telefonu jako urządzenia HID (Human Interface Device). Ten profil pozwala na korzystanie z komórki jako dodatkowej myszy/klawiatury. Jak wcześniej wspominałem moduł BT w laptopie działa w trybie HCI. By móc korzystać z telefonu w trybie HID potrzebny będzie odpowiedni demon - hidd. # hidd --connect 00:XX:XX:XX:XX:EA Po chwili na telefonie wyświetli się monit: "Nieznane prosi o udostępnienie telefonu jako pilota zdalnego sterowania. Zezwolić?". Z zezwoleniem jeszcze chwilę się wstrzymujemy, odpalamy kolejny terminal logując się na roota i uruchamiamy agenta parowania urządzeń pakietu bluez. # bluez-simple-agent Teraz na komórce zezwalamy na połączenie z laptopa, podajemy pin i zatwierdzamy. Ten sam pin wpisujemy w konsoli z uruchomionym bluez-simple-agent. Powinno to wyglądać mniej więcej tak:
bash-4.0# bluez-simple-agent
Agent registered
RequestPinCode (/org/bluez/3717/hci0/dev_00_XX_XX_XX_XX_EA)
Enter PIN Code: 123456
Authorize (/org/bluez/3717/hci0/dev_00_XX_XX_XX_XX_EA, 00001124-0000-1000-8000-00805f9b34fb)
Po sparowaniu urządzeń można wyłączyć agenta wciskając Control-C. W tej chwili mogę się połączyć z laptopa na komórkę, ale nie w drugą stronę. Wynika to z dwóch rzeczy: a) laptop jest niewidoczny jako urządzenie BT dla komórki oraz b) automatycznie nie zezwala na połączenia przychodzące z danego urządzenia.
Niestety nie znalazłem sposobu jak to obejść w trybie tekstowym, dlatego użyłem graficznej nakładki w środowisku KDE - kbluetooth4. Problem z tym, że w moim przypadku nie działała ona zaraz po instalacji i nie wiem, czy wynikało to z mojej przesiadki z kdemod3 na kdemod i jakiś zalegających wpisach w plikach konfiguracyjnych, czy też najzwyczajniej w świecie paczki zawierały błędy. Po części przyczyną kłopotów było to, że moje konto nie należało do grupy wheel (sudo, PAM i te sprawy...), więc je do niej dodałem. gpasswd -a lightnir wheel To oczywiście nie rozwiązało to problemu. Po trochę dłuższym dłubaniu w konsoli doszedłem do przyczyny problemu. Aplikacje KDE4 wymagają działającej usługi ConsoleKit. Teoretycznie ConsoleKit powinien być uruchamiany automatycznie przez dbus i dla każdego zalogowanego użytkownika automatycznie tworzyć sesje. Teoria teorią, ale praktyka pokazuje, że na moim systemie to nie działa tak z biegu. Oczywiście mógłbym ręcznie uruchamiać sesje consolekit ck-launch-session ale znalazłem inną solucję. Zmieniłem wpisy w /etc/inittab z:
# Boot to console
#id:3:initdefault:
# Boot to X11
id:5:initdefault:

...

# Example lines for starting a login manager
x:5:respawn:/opt/kde/bin/kdm -nodaemon
na:
# Boot to console
id:3:initdefault:
# Boot to X11
#id:5:initdefault:

...

# Example lines for starting a login manager
#x:5:respawn:/opt/kde/bin/kdm -nodaemon
oraz dodałem uruchamianie kdm jako demona w /etc/rc.conf DAEMONS=(syslog-ng dbus hal network bluetooth kdm @autowifi netfs @crond) Taka konfiguracja działa bezproblemowo. Uruchomiłem więc kbluetooth4 i skonfigurowałem resztę brakujących rzeczy. Przede wszystkim zmieniłem tryb pracy adaptera BT na laptopie z ukrytego na wykrywalny: A następnie ustawiłem akceptację połączeń przychodzących z komórki (Tasks -> Set Trusted). Teraz komunikacja telefon-laptop działa w obie strony. Czas zabawić się telefonem ]:) SE k550 posiada wbudowaną aplikację zwaną "Sterowanie zdalne", która korzysta właśnie z profilu HID BT. Domyślnie posiada ona 3 konfiguracje: Presenter, MediaPlayer oraz Desktop. Jak się można domyśleć służą one do sterowaniem za pomocą komórki prezentacją multimedialną, odtwarzaczem multimedialnym, czy też używaniem jej jako myszki wzbogaconej o kilka dodatkowych klawiszy. Jak to działa? W skrócie to klawiszom telefonu przypisane są zdarzenia (skróty klawiszowe, ruch myszki), które wysyłane są do komputera i tam przetwarzane tak jakby pochodziły z klawiatury/myszki. Mnie jednak nie zadowalają dostępne konfiguracje, więc postanowiłem sobie zrobić kilka własnych. Problem w tym, że nie ma dedykowanej dla Linuksa aplikacji generującej pliki konfiguracyjne, a używanie poprzez wine Windowsowego programu nie pozwala na złożone kombinacje klawiszy. Jeśli pobierzemy sobie pliki konfiguracyjne z komórki przekonamy się, że tak naprawdę są to tarowane archiwa posiadające rozszerzenie .hid. W środku znajduje się zdjęcie (dowolny format, który komórka rozpoznaje) oraz plik .kcf, który tak naprawdę jest plikiem XML. Przykładowo mój plik sterujący amarokiem wygląda następująco:
amarok.kcf(Toggle Plain Text)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<!-- Lightnir was hare ]:) -->
<SONY_ERICSSON_REMOTE_CONTROL_CONFIGURATION VERSION = "1.0">
  <KEYMAP>

    <KEY_JOY>
      <ACTION>
        <KEYBOARD MODIFIERS = "0A" USAGEID = "2B"/> <!-- Focus Player -->
      </ACTION>
    </KEY_JOY>
    <KEY_CAM>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "06"/> <!-- PLAY -->
      </ACTION>
    </KEY_CAM>
    <KEY_1>
      <ACTION>
        <KEYBOARD MODIFIERS = "0A" USAGEID = "2D"/> <!-- REWIND -->
      </ACTION>
    </KEY_1>
    <KEY_2>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "06"/> <!-- PLAY -->
      </ACTION>
    </KEY_2>
    <KEY_3>
      <ACTION>
        <KEYBOARD MODIFIERS = "0A" USAGEID = "2E"/> <!-- FAST FORWARD -->
      </ACTION>
    </KEY_3>
    <KEY_4>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "1D"/> <!-- PREV -->
      </ACTION>
    </KEY_4>
    <KEY_5>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "19"/> <!-- STOP -->
      </ACTION>
    </KEY_5>
    <KEY_6>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "05"/> <!-- NEXT -->
      </ACTION>
    </KEY_6>
    
    <KEY_STAR>
      <ACTION>
        <KEYBOARD MODIFIERS = "0A" USAGEID = "1C"/> <!-- RANDOM -->
      </ACTION>
    </KEY_STAR>

    <KEY_HASH>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "10"/> <!-- MUTE -->
      </ACTION>
    </KEY_HASH>

    <KEY_VOL_UP>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "2E"/> <!-- VOL UP -->
      </ACTION>
    </KEY_VOL_UP>
    <KEY_VOL_DOWN>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "2D"/> <!-- VOL DOWN -->
      </ACTION>
    </KEY_VOL_DOWN>
  </KEYMAP>
</SONY_ERICSSON_REMOTE_CONTROL_CONFIGURATION>
Jak widać plik .kcf zawiera serię wpisów o podobnej treści. Dla przykładu:
1
2
3
4
5
    <KEY_2>
      <ACTION>
        <KEYBOARD MODIFIERS = "08" USAGEID = "06"/> <!-- PLAY -->
      </ACTION>
    </KEY_2>
Taki wpis oznacza, że wciśnięcie na telefonie klawisza "2" generuje skrót klawiszowy Win+C, który tak się akurat składa jest globalnym skrótem klawiszowym w amaroku, który uruchamia odtwarzanie. Wartość wpisu "MODIFIERS" określa kombinację klawiszy modyfikujących (Alt, Ctrl, Shift, GUI). W tym wypadku szesnastkowe "08" odnosi się do lewego klawisza GUI, czyli po prostu Win. Szczegółowy opis można znaleźć w dokumentacji HID dla Sony Ericssonów (str. 18). Z kolei wartość USAGEID określa wciśnięty niemodyfikujący klawisz na klawiaturze, w tym wypadku C. Wartości USAGEID można sobie wyszukać w oficjalnej dokumentacji USB HID począwszy od strony 53. Teraz wystarczy tylko stworzyć sobie plik amarok.hid tar -cvvf amarok.tar amarok.kcf amarok.jpg
mv amarok.tar amarok.hid
i wysłać go na telefon używając OBEX. Telefon automatycznie rozpozna format i doda do obecnych konfiguracji aplikacji "Sterowanie zdalne". Mam nadzieję, że tekst okaże się pomocny nie tylko mnie jako "przypominajka".

Pozdrawiam runicznie,
ᛚᛁᚷᚼᛐᚿᛁᚱ

wtorek, czerwca 09, 2009

Catalyst on Archlinux

Recently I bought myself a laptop - Acer Aspire 5670 - with a ATI Radeon Mobility x1400 graphic card. Although the open-source drivers radeon and radeonhd worked I was still unsatisfied with their performance. So I had to go the long, stony road of installing ATI's proprietary Catalyst driver. Why long and stony? Because ATI dropped support for my graphic card (I think since Catalyst 9.4). As a long-time NVIDIA user on a Linux box I was used to that regardless if it was an old GeForce 3 or an GeForce 9600 GSO that I'm currently using on my pc the drivers worked perfectly. All that TV-out, cloning, TwinView etc. worked on the fly. On this laptop however, everything xorg & drivers related that you could possibly imagine to go wrong, went wrong since the beginning. But finally I managed to make everything to work as I wanted. Here's how I did it. I encountered two major problems so I had to ask myself:
  1. How do I fix the wrong DPI settings?
  2. How do I install a working for my card catalyst driver?
What do I mean by "wrong DPI"? It's better I explain It by showing a screenshot of my desktop. Those really big fonts are actually icon labels. And yes, that thing that takes more then the half of the panel is the clock. Well, actually it's only 1/8 of the clock... I experienced this with both the proprietary and the open-source drivers. To fix this I followed the ArchWiki entry on Xorg. First I modified /etc/X11/xinit/xserverrc so it now looks so: exec /usr/bin/X -nolisten tcp -dpi 96 This didn't help. After adding this two entries to xorg.conf
Section "Device"
 Identifier "Card1"
        ...
        Option   "NoDDC" "true"
        ...
EndSection

Section "Monitor"
        Identifier "Monitor0"
        ...
        DisplaySize 336 210 # 96 DPI @ 1280x800
        ...
EndSection
and restarting X my desktop finally looked normal again. Now for the difficult part - installation of catalyst. There are two packages in the AUR I've downloaded - catalyst-old and catalyst-utils-old. The problem is they depend on xorg-server-1.5, but currently there is a newer version, xorg-server-1.6, in the repositories. I tried to figure out how to downgrade when I stumbled on the Project ARM site. ARM stands for Arch Rollback Machine. It's a mirror that syncs every day with other mirrors but keeps the old packages so a rollback can be made very easy. Package snapshots are ordered by date. I wanted to revert my xorg packages to the state of this years April's Fools Day and because xorg packages are in the extra repo all I had to do was make some temporary changes in /etc/pacman.conf.
#[extra]
# Add your preferred servers here, they will be used first
#Include = /etc/pacman.d/mirrorlist

[extra::2009-4-1]
Server = http://arm.kh.nu/$repo/os/i686/
After that I had to remove the xorg-server package # pacman -Rd xorg-server and synchronize with the new mirror # pacman -Sy xorg-server xf86-input-keyboard xf86-input-mouse xf86-video-v4l After that I restored the original pacman.conf file and added xorg-server to the list of ignored packages
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
IgnorePkg   = xorg-server libgl                                                   
IgnoreGroup = xorg
Then I builded the two packages from AUR and was almost ready to go. Just a quick new Device section entry in /etc/X11/xorg.conf
Section "Device"
        Identifier  "Card0"
        Driver      "radeonhd"
        VendorName  "All"
        BoardName   "All"
EndSection

Section "Device"
        Identifier  "Card1"
        Driver      "fglrx"
        VendorName  "ATI Technologies Inc"
        BoardName   "Radeon Mobility X1400"
        BusID       "PCI:1:0:0"
        Option      "NoDDC" "true"
        Option      "Centermode" "off"
        Option      "VideoOverlay" "on"
        Option      "OpenGLOverlay" "off"
        Option      "OverlayOnCRTC2" "0"
        Option      "PseudoColorVisuals" "off"
        Option      "UseFastTLS" "off"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card1"
        ...
EndSection
With all that trouble with the drivers I decided to have two Device sections - one for the proprietary and one for the open-source driver - just in case something goes wrong again. Ok, here is a summary of the performance of those 3 drivers: radeon (xf86-video-ati)
[lightnir@chochlik2 ~]$ glxgears
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
3990 frames in 5.0 seconds = 797.868 FPS
4216 frames in 5.0 seconds = 843.131 FPS
4220 frames in 5.0 seconds = 843.895 FPS
4437 frames in 5.0 seconds = 887.220 FPS
4117 frames in 5.0 seconds = 823.276 FPS
4162 frames in 5.0 seconds = 832.351 FPS
radeonhd (xf86-video-radeonhd)
[lightnir@chochlik2 ~]$ glxgears
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
493 frames in 5.0 seconds = 98.524 FPS
567 frames in 5.0 seconds = 113.289 FPS
564 frames in 5.0 seconds = 112.653 FPS
561 frames in 5.0 seconds = 112.165 FPS
567 frames in 5.0 seconds = 113.364 FPS
566 frames in 5.0 seconds = 113.013 FPS
583 frames in 5.0 seconds = 116.580 FPS
564 frames in 5.0 seconds = 112.645 FPS
fglrx (catalyst-old)
[lightnir@chochlik2 ~]$ glxgears
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
Xlib:  extension "Generic Event Extension" missing on display ":0.0".
Running synchronized to the vertical refresh.  The frame rate should be
approximately 1/1103892 the monitor refresh rate.
5782 frames in 5.0 seconds = 1155.215 FPS
5648 frames in 5.0 seconds = 1129.482 FPS
5983 frames in 5.0 seconds = 1196.399 FPS
6010 frames in 5.0 seconds = 1201.413 FPS
6024 frames in 5.0 seconds = 1204.585 FPS
5910 frames in 5.0 seconds = 1181.958 FPS
I also tested the catalyst driver performance with Neverwinter Nights Diamond Edition running in wine. The frame rate was about 25 FPS with full-screen and all graphic options set to max.

piątek, czerwca 05, 2009

one... two... three

Trójka to w wielu kulturach liczba magiczna. Jest liczbą pierwszą, liczbą Fibonacciego, liczbą Fermata oraz liczbą Mersenne'a. Przez wielu starożytnych filozofów poczytywana była za doskonałą. Pitagorejczycy wierzyli w istnienie trzech światów - Niższego, Wyższego, Najwyższego, a uczniowie Sokratesa i Platona wyznawali trzy wielkie zasady: Materię, Ideę, Boga. W wielu religiach bóstwa były związane z tą liczbą: Trójca Święta, Trimurti, 3 Mojry/Parki, Hekate itd. Żyjemy w przestrzeni trójwymiarowej. Atomy są zbudowane z trzech cząstek elementarnych. Możemy tak sobie wyliczać bez końca przykłady na obecność trójki w wszechświecie. Ja jednak skończę na przykładzie powiedzenia "do trzech razy sztuka". Czemu? Ano temu, że tyle razy w ubiegłym tygodniu instalowałem Linuksa na tym laptopie. Zrządzenie losu? Złośliwość rzeczy martwych? Błąd ludzki? Ja bym powiedział, że kombinacja wszystkich tych czynników. Przede wszystkim problemy zaczęły się od tego, że chciałem mieć Windowsa i Linuksa. Instalację Windows XP argumentowałem tak:
  1. tworząc strony internetowe muszę też sprawdzić jak wyglądają na takich gównianych przeglądarkach jak Internet Explorer 6
  2. mam słabość do Diablo 2 oraz Neverwinter Nights
Gdy kupiłem maszynę była na niej tylko jedna partycja zajmująca cały dysk. Jak dla mnie to chory pomysł chociażby ze względów utraty danych w przypadku zajechania win-grozy i konieczności formatowania partycji. Chciałem sobie ułatwić pracę z instalacją pingwina, więc poszedłem po najmniejszej linii oporu - chciałem skurczyć partycję NTFS używając stosownych narzędzi. Niestety jak się okazało dysk miał parę badsectorów i system się już nie podniósł po nieudanej próbie zmiany rozmiaru partycji. Olałem Windowsa i zainstalowałem Archa tworząc podczas instalacji miejsce na dwie partycje na potrzeby Windowsa (systemowa i dane). Zawsze przecież można zainstalować Windowsa później, prawda? A właśnie, że nie! Instalator Windows zawieszał się zaraz na starcie (czarny ekran). Zajęło mi to sporo czasu zanim doszedłem do tego czemu się tak dzieje (włączając w to wymontowanie dysku). Instalatorowi nie podobały się po prostu partycje stworzone przez cfdisk. Skończyło się na tym, że musiałem nadpisać MBR # dd if=/dev/zero of=/dev/sda bs=512 count=1 niszcząc sobie pieczołowicie skonfigurowanego pingwina tylko po to by przekonać się, że ten durny system po instalacji nie ma nawet sterowników do karty sieciowej. Wszystkie sterowniki musiałem pobrać na pingwinku. To właśnie w nim lubię - może nie być trybu graficznego, dźwięk może nie działać, pendrive'y mogą nie być montowane automatycznie, ale na działającym terminalu i sterownikach do kart ethernetowych można zawsze polegać. Co prawda jest to dość wyboista droga, ale jest ona do przejścia. W każdym razie teraz mam już oba działające systemy. Tak podsumowując. Dowiedziałem się na własnej skórze, dlaczego w przypadku dual-bootu należy instalować systemy poczynając od Windowsa, a kończąc na Linuksie. Szkoda po prostu nerwów i czasu.

poniedziałek, kwietnia 13, 2009

Imp on the balcony

Na święta znów przywiało mnie na opolski grunt. Tym razem na trochę dłużej. Ponieważ wybieram się z referatem w języku angielskim na XXX OSCh organizowaną z ramienia ASSChem mam podwójną motywację by podsumować moją dotychczasową pracę badawczą. Święta świętami, ale popracować też bym nad tym trochę chciał. Zabunkrowałem się więc z laptopem na balkonie. Znam na tyle swoją rodzinę, by nie mówić im gdzie się schowałem - najlepiej pracuje mi się jak wokoło nikt się nie kręci. Wyjątkiem jest moja kotka Hilda (patrz zdj. wyż.). Zwykle jestem w domu tylko na kilka dni, ale skoro mam trochę czasu to dziś zabrałem się za konfigurację domowej sieci opartej o neostradowy router Livebox. Topologia mojej sieci wygląda następująco: Komputer matki oraz siostry mają internet poprzez kartę ethernetową. Na moim komputerze stacjonarnym(developer) oraz laptopie(chochlik) używam na co dzień Archlinuksa z bezprzewodowym połączeniem do rutera. Do tej pory nie miałem czasu "babrać się w konfigach" na pingwinie, więc postawiłem sieć bezprzewodową z szyfrowaniem WEP. Tak, wiem - szyfrowanie sieci bezprzewodowej za pomocą WEP to jest prawie żadne zabezpieczenie, ale gdy to robiłem miałem inne rzeczy na głowie. Teraz postanowiłem to poprawić.

Playing with the fire

Nawet jeśli dziecku powiemy, że ogniem można się poparzyć, będzie się ono nim bawiło dopóki samo się nie oparzy i nie poczuje bólu. Z zabezpieczeniami komputerów jest podobnie. W zasadzie mamy je w d... domyśle dopóki się nam ktoś nie włamie, nie utracimy danych, nie zawirusujemy sobie maszyny... You get the point? Zgodnie z starą hackerską zasadą postanowiłem sprawdzić zabezpieczenia mojej domowej sieci... włamując się do niej! Bardzo się zdziwiłem wynikiem mojego eksperymentu (robiłem to po raz pierwszy). W pierwszej kolejności potrzebne mi były odpowiednie narzędzia - zainstalowałem więc pakiet aircrack-ng # pacman -S aircrack-ng i przystąpiłem do zabawy. Pierwszym krokiem jest przełączenie interface'u sieciowego(w moim wypadku jest to wlan0) z trybu zarządzanego(Managed) na tryb monitoringu(Monitor), co pozwala na nasłuchiwanie ruchu w sieci bezprzewodowej. Ja w tym celu uruchomiłem polecenie airmon-ng, które tworzy wirtualny interface mon0 działający w trybie monitoringu.
bash-3.2# airmon-ng start wlan0


Interface       Chipset         Driver

wlan0           Ralink 2573 USB rt73usb - [phy0]
                                (monitor mode enabled on mon0)

bash-3.2# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wmaster0  no wireless extensions.

wlan0     IEEE 802.11g  ESSID:""
          Mode:Managed  Frequency:2.427 GHz  Access Point: Not-Associated
          Tx-Power=27 dBm
          Retry min limit:7   RTS thr:off   Fragment thr=2352 B
          Encryption key:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

mon0      IEEE 802.11g  Mode:Monitor  Frequency:2.427 GHz  Tx-Power=27 dBm
          Retry min limit:7   RTS thr:off   Fragment thr=2352 B
          Encryption key:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
Kolejnym krokiem jest nasłuch ruchu sieciowego. Odpaliłem w tym celu airodump-ng z odpowiednimi opcjami: bash-3.2# airodump-ng -i -w zapis_ruchu -c 4 mon0
  • -i zapisuje tylko pakiety z IV'ami.
  • -w zapisuje pakiety do pliku (zapis_ruchu.ivs).
  • -c 4 włącza nasłuch odpowiedniego kanału wifi (na 4 działa moja sieć).
Wygląda to tak:

 CH  4 ][ Elapsed: 28 s ][ 2009-04-13 19:56

 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID

 00:11:22:33:44:55  -66 100      270        0    0   4  54   WEP  WEP    OPN  LightnirsAP

 BSSID              STATION            PWR   Rate   Lost  Packets  Probe

By efektywnie łamać sieci szyfrowane za pomocą WEP trzeba przechwycić sporą ilość pakietów. Oczywiście istnieją techniki do generowania odpowiedniego ruchu, ale ponieważ to raczej kwestia czasu postanowiłem sobie sprawę nieco ułatwić. Włączyłem na developerze transfer wyników moich obliczeń z uczelni. Po jakiś 40 minutach nazbierałem około 70 tysięcy pakietów i przystąpiłem do crackowania klucza. bash-3.2# aircrack-ng -a 1 zapis_ruchu.ivs -n 128 Dla porównania tak wyglądał mój wpis odnośnie tego accespointa w pliku wpa_suplicant.conf
# LightnirsAP

network={
 ssid="LightnirsAP"
 key_mgmt=NONE
 wep_key0=345e2f6fcdfde135e9e7d9f4fe
 wep_tx_keyidx=0
 priority=5
}
Ładnie, ładnie - klucz złamany. Skoro ja jako nowicjusz w niecałą godzinę złamałem zabezpieczenia własnej sieci to co dopiero wprawiony w wojennej sztuce penetracji sieci haker mógłby zrobić? Zaczynam się bać.

Securing the net

W pierwszej kolejności za pomocą panelu administracyjnego zmieniłem szyfrowanie sieci na WPA-PSK-TKIP i ustawiłem nowy klucz. Zmieniłem też hasło dostępowe do samego panelu administracyjnego. Oczywiście jak przystało na produkty "Tepsy" podczas zapisu ustawień ruter się zawiesił i trzeba go było zrebootować... Ponieważ na obu maszynach używam wpa_suplicant + autowifi do konfiguracji sieci bezprzewodowej musiałem tylko wprowadzić stosowne zmiany w pliku /etc/wpa_suplicant.conf. Wygodnym narzędziem jest tutaj skrypt wpa_passphrase generujące klucze na podstawie hasła np. truskawka.
bash-3.2# wpa_passphrase LightnirsAP truskawka
network={
        ssid="LightnirsAP"
        #psk="truskawka"
        psk=c0a02ad935c3878facff559837d3f395d999f53d8e6eba5c74f95145066896c8
}
Poniższy wpis dla przykładowego hasła "truskawka" sprawdza się w moim przypadku.
# LightnirsAP

network={
 ssid="LightnirsAP"    
 key_mgmt=WPA-PSK
 pairwise=TKIP
 group=TKIP
 #psk="truskawka"
 psk=c0a02ad935c3878facff559837d3f395d999f53d8e6eba5c74f95145066896c8
 priority=5
}
Dodatkowo włączyłem filtrowanie adresów MAC dla sieci bezprzewodowej - zawsze to dodatkowe zabezpieczenie. Zastanawiam się co można by jeszcze zrobić by zapewnić dodatkowe bezpieczeństwo. W prawdzie obecne zabezpieczenia w zupełności wystarczą, ale zawsze warto dbać o usprawnianie zabezpieczeń sieci, w szczególności tych bezprzewodowych.

sobota, marca 14, 2009

/var/log/temperatura.log

Obecny tydzień zrobiłem sobie niejako wolne i odwiedziłem rodzinę. Plan był taki by wypocząć, odwiedzić znajomych i popracować trochę w domowym zaciszu nad pracą badawczą popijając kawę. Plan się rypnął. To człowiek jedzie te 680 km z Gdańska na Opolszczyznę tylko po to by się rozchorować i zdenerwować. Ale może tak po kolei. Przed moim wyjazdem mieliśmy problemy z klimatyzacją w wydziałowej serwerowni. Jak klima świrowała to klaster generował taką ilość ciepła, że temperatura skakała do 44 °C. Jakby wstawić jeszcze lampy UV, leżak i podawać koktajle w łupinach kokosów to można by nabrać klimatu wysp Bahama... W każdym razie powstał projekt monitoringu temperatury w serwerowni. Korzystając z mojego offtime'u postanowiłem zbudować stosowny sensor temperaturowy w oparciu o mikrokontroler DS18B20. Głównie opierałem się na tej stronie. Wybierając się rowerem do dziadków zahaczając o sklep elektroniczny. Jak na polską marcową aurę oczywiście padało i wiało. Jak można się domyśleć rozchorowałem się już następnego dnia.
- Spisujecie głupoty z internetu, a potem dziwicie się, że nie działa... Takiej diody nie ma. Dla Diody Schottky'ego zawsze podaje się, oprócz napięcia, moc... Kabel telefoniczny jak sama nazwa wskazuje nie służy do transmisji danych tylko do innych celów... Na czujniki to tym bardziej kabel powinien być ekranowany. Bierzesz Pan ekran i podłączasz do masy i działa...

Co ja się nasłuchałem przy zakupie tych części. Miałem ich tylko trochę na liście, a w sklepie przesiedziałem dłużej niż w kolejce za chlebem. Nie twierdzę, że pozjadałem wszystkie rozumy. Wystarczy mi tytuł magistra chemii oraz fakt, że znam się co nieco na programowaniu i systemach unixowych. Przytaknąłem milcząco głową i z pokorą przyjąłem te informacje wychodząc z sklepu z portfelem lżejszym o trzy dychy. Tego samego wieczoru przystąpiłem do zabawy z lutownicą i skleciłem taki oto układzik: Moje pierwsze próby sensora opóźniły jednak choroba oraz rodzina/sąsiedzi. Informatyk się zjawi raz na parę miesięcy i od razu do niego ludzie lgną ze swoimi pseudo-problemami jak muchy do lepu. A to siostra ma problemy z reinstalacją swojej Wingrozy. A to sąsiad ma problem z włączeniem nowo zakupionego laptopa (tak, to prawda - niektórzy jeszcze nie słyszeli o hibernacji...). A to matka ma problem z wypaleniem płyty pod Ubuntu. Ach... Ostatnią rzeczą jaką chcę robić w gorączce to grzebać przy czyimś komputerze (memo na przyszłość - zamówić sobie taki T-Shirt, koniecznie po polsku). Wracając do pomiaru temperatury - użyłem programu digitemp.
# ./digitemp_DS9097 -q -s /dev/ttyS1 -a -n0 -d30 -o "%Y/%m/%d/%H:%M:%S %.2C" -l /var/log/temperatura.log & Pierwsze wyniki wyglądały tak: Zdziwiły mnie te nagłe skoki temperatur. Zakłócenia elektromagnetyczne raczej mogę wykluczyć, bo ekranowanie podłączyłem do masy. Poza tym w pobliżu nie było takiej ilości źródeł zakłóceń. Zabezpieczyłem, więc czujnik przed wilgocią używając gorącego kleju i taśmy izolującej (teraz wystaje tylko sam czubek mikrokontrolera). Powtórzyłem pomiar przez dwie doby i tym razem takich skoków nie było. Przy okazji nauczyłem się trochę gnuplota i odświeżyłem pisanie skryptów w Pythonie. Wyniki wyglądają obiecująco:
Już nie mogę się doczekać, by przetestować to w "warunkach polowych" tj. wydziałowej serwerowni ]:)

sobota, stycznia 31, 2009

Hatless

Wspominałem już, że nie znoszę "redhatów"? Mam takie powiedzenie: Red Haty - czerwone szmaty. Zostało mi to chyba po moim pierwszym Linuksie - Red Hat 6.1. W zasadzie to każda dystrybucja bazująca na rpmach zyskała u mnie negatywną opinię (no może za wyjątkiem FC2, ale to było dawno, dawno temu), a miałem ich trochę - RH 6.1, RH 7.0, FC 3, FC4, Aurox 9-10. Z chwilą kiedy trzeba coś upgrade'ować, mając wgrane niestandardowe paczki zawsze zaczynały się schody. Zawsze. Na chochliku (tak nazwałem laptop na którym chwilowo pracuję) początkowo miałem postawioną Fedorę 8. Upgradowałem ją z każdym wyjściem nowszej wersji i za każdym razem kłopotów było więcej. Ostatni upgrade do wersji 10 skończył się tym, że instalowałem pakiety w sesji awaryjnej (por. fot.) po tym jak musiałem wywalić większość, jak nie wszystkie programy jakie instalowałem w wersji FC9. Dodam, że cały proces doprowadzania systemu do stanu użytkowania zajął mi 2 dni. Myślałem, że się będzie opłacało. Myliłem się. Same bootowanie zajmowało dobre 5-10 minut. Gnome mulił jeszcze bardziej niż zwykle, a dźwięk odtwarzany przez PulseAudio "szarpał" do tego stopnia, że odechciewa się słuchać muzyki. O czymś bardziej zaawansowanym takim jak chociażby tworzenie grafiki wektorowej nie wspomnę. Wtedy przemówił przeze mnie głos rozsądku. Fuck it! Instaluję Archa. Słowo się rzekło, gorzej z czynem. Przyznam się, że trochę się bałem tej instalacji, po tym jak parę dni wcześniej poległem sromotnie przy instalacji Archlinuxa na Toshibie Satellite jednej z doktorantek w ZMM (konkretnie to xorg nie chciał wstać). Po zrobieniu stosownych backupów przystąpiłem do pracy. Sam proces instalacji i aktualizacji nie był problemem. Zajęło mi to w sumie 1h - vive la światłowody TASKu. Problemy pojawiły się po zaktualizowaniu kernela i ponownym uruchomieniu maszyny. System mulił podobnie jak na fedorze (może niepotrzebnie tak po niej pojechałem). Pomyślałem, że może to przez nowy kernel. Na szczęście downgrade w Archlinuksie jest naprawdę prosty. Wyszperałem paczkę z cache'a i zrobiłem co trzeba pacmanem: # cd /var/cache/pacman/pkg/ # pacman -U kernel26-2.6.25.6-1-i686.pkg.tar.gz Po restarcie system wrócił do ponad-świetlnej prędkości pracy(czyt. normalnej). Zrobiłem, więc stosowny wpis w pacman.conf by mi już nie aktualizował kernela. Tyle jeśli chodzi o problem pierwszy. Problem drugi to raczej linuksowa klasyka tylko w nieco nowszym, jak dla mnie wydaniu - dźwięku brak. Używam zewnętrznej karty dźwiękowej pod usb, bo chipset zintegrowanej jest uszkodzony. System wykrywał obie karty i ładował stosowne sterowniki, ale alsa używała domyślnie tej zintegrowanej. W końcu wygooglowałem, że wystarczą odpowiednie wpisy w modprobe.conf by przydzielić kolejność używania kilku kart dźwiękowych: #/etc/modprobe.conf (for v2.6 kernels)
#
options snd_usb_audio index=0
options snd_intel8x0m index=1
Voilà! Praca na pingwinie znów jest przyjemnością.

wtorek, grudnia 23, 2008

Building Pymol SVN on Archlinux

Lately I've been neglecting my blog for the sake of my work as a Ph.D. student (programming in Fortran). I'm going to catch up on this. Writing some Fortran code isn't that hard even if you are starting to learn the language from scratch like I do, but definitely it isn't the type of "coding is fun" programming language like Python for example. Speaking of Python, since 3rd of December your python scripts are getting old, because Python 3.0 is out. The new version brings major changes in the language that make you previous HelloWorld.py program stop working (print is now a function and should be called out print("Hello World!") instead of print "Hello World!"). Many programs I use require Python 2.4 or 2.5, some like OpenOffice.org Python 2.6 and soon some will require Python 3.0. Keeping compatibility on a system is getting problematic. Luckily I've installed Archlinux on my desktop at work which makes life easier if you know how to use it. I wanted to install the latest Pymol version from svn, but I've found it's incompatible with Python 2.6 which was required as I mentioned above for OO.o. So here's what I've done.

First I've installed a separate python version from the repositories - Python 2.4 # pacman -Sy python24
After this I needed Pmw for the GUI. It can be done by building from source like this:
# wget http://downloads.sourceforge.net/pmw/Pmw.1.3.2.tar.gz
# tar -xvzf Pmw.1.3.2.tar.gz
# cd Pmw.1.3.2/src
# python2.4 setup.py build
# python2.4 setup.py install
of by using a modified python-pmw PKGBUILD from the AUR. Just make sure it uses python 2.4 by changing in the build function the default python:
build() {
cd $startdir/src/Pmw.$pkgver/src
python setup.py build
python setup.py install --prefix=/usr --root=${startdir}/pkg
}
to python2.4:

build() {
cd $startdir/src/Pmw.$pkgver/src
python2.4 setup.py build
python2.4 setup.py install --prefix=/usr --root=${startdir}/pkg
}

After this you are ready to build pymol from the SVN:
# svn co https://pymol.svn.sourceforge.net/svnroot/pymol/trunk/pymol pymol
# cd pymol
# python2.4 setup.py install
# python2.4 setup2.py install
# cp ./pymol /usr/local/bin/pymol

Thats It!
Now an upgrade of Python to 3.0 will not mess up with your Pymol installation.

czwartek, listopada 06, 2008

Linux Teatime

Dewiacje bywają różne, ja też mam swoje - Linux. Swego czasu wygrałem w konkursie z Dragonii drewniane pudełeczko z Tuxem, które teraz stoi u mnie na biurku w zakładzie modelowania molekularnego. O te: Trzymam w nim sobie herbatę, a od środka to wygląda tak: Tyle odnośnie wprowadzenia. Ostatnio miałem taką rozmowę z moim ulubionym administratorem sieci.
Lightnir: Hej. Dzieki za tą kawę.
Blakrose: Nie ma sprawy.
Lightnir: Jakby co to mam tu herbatę. Częstuj się śmiało. Jest o smaku Debiana, Red Hata, SuSe, Slackware'a... Niestety nie mam o smaku waszej ulubionej Fedory.
Blakrose: O_o (Szok) There... IS... some other life out there! (Śmiech)
Lightnir: ];D

Widać jak na nasze zakładowe linuksowe klimaty to jestem dość ekstremalną odmianą użytkownika.

poniedziałek, września 01, 2008

Ennui

Nie ma nic gorszego niż piątkowa nuda. W takim wypadku trzeba sobie znaleźć zajęcie, które wymaga nieco wysiłku umysłowego. Dla mnie nadarzyła się ta okazja kiedy zobaczyłem opis znajomego na gadu:
Wordpress, o zmoro!

Hmm... Ciekawe. Jak do tej pory to słyszałem tylko same dobrze rzeczy na temat WordPressa (pewnie dlatego, że się specjalnie tym nie interesowałem). Jak się okazało mój znajomy próbował postawić WP na jakimś serwerku. Ot, taka zwykła sytuacja typu Windows-user vs evil allmighty *nix server, Dawid vs Goliat, King Kong vs Godzilla, kawa vs herbata, ogórek vs pomidor... Anyway. Jakie jest najgłupsze rozwiązanie, które z reguły pomaga jeśli coś nie działa poprawnie na serwerze http? Pewnie...
(L)ighnir: uprawnienia plików zmień
L: by wygląda że wp nie ma uprawnień do zapisu
(K)olega: a gdzie to zrobic? w sensie jak?
K: bo ja dopiero wczoraj o WP sie dowiedzialem ze istnieje :D
L: siedzisz na windowsie?
K: tak
L: czy na linuksie?
L: aha
K: winda
L: i stawiasz zdalnie
K: tak
L: ale zdalny system to linux
L: więc zmień rekurencyjnie uprawnienia plików
L: chmod -R 777
K: to ja sobie dam na luz :D
K: nie znam sie na tym :P

Hmm. Taka myśl mi teraz przyszła, by kiedyś przylepić sobie na blacie biurka nalepkę z tarczą i napisem "Hit with forhead here". Byłoby praktyczne. W każdym razie spokojnie zacząłem tłumaczyć, pomagać, ale i moja cierpliwość się kiedyś kończy...
L: jaki status WP?
L: nie musisz zmieniać uprawnień wszystkich plików
K: cicho.. zmieniam ten shit... reczine to tak nie idzie..
L: idzie
L: oki pobieram WP standard i stawiam u siebie - zobaczymy jak to wolno idzie :D

Tak też zrobiłem. Pobrałem WordPress 2.5.1 PL Standard, po czym w półtorej godziny postawiłem LAMP-kę od podstaw, przy czym najwięcej czasu zajęło mi uruchomienie MyPhpAdmina. Ale jak już zaczęło działać to instalacja WP przeszła w dosłownie 5 minut. I tutaj niespodzianka, bo konfiguracja WP by działał za ruterem okazała się cięższa niż się to początkowo wydawało. Problem w tym, że WP przekierunkowuje stronę na adres, który się wpisało w panelu administratora. Jeśli jest to nazwa domeny z przypisanym dynamicznie IP strona jest dostępna z internetu, ale nie z komputera na którym działa. I na odwrót jeśli jest ustawiony localhost jako nazwa domeny WP działa tylko na lokalnym komputerze. Jak to się mówi - nie można jednym tyłkiem być na dwóch kiermaszach jednocześnie... A właśnie, że można! I to nawet na trzech! ]:) Oto rozwiązanie, które pozwala na odpowiednie przekierunkowanie w zależności od stosowanej domeny. Poniższy fragment codu PHP wystarczy dopisać do wp-config.php:

wp-config.php redirection fix(Toggle Plain Text)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$hostname = $_SERVER['SERVER_NAME'];
$hostname = str_replace('www.', '', $hostname);
// Wejście z mojego PC
if ($hostname == 'localhost') { 
    define('WP_SITEURL', 'http://localhost/blog');
    define('WP_HOME', 'http://localhost/blog');
// Wejście przez LAN
} elseif ($hostname == '192.168.1.2') { 
    define('WP_SITEURL', 'http://192.168.1.2/blog');
    define('WP_HOME', 'http://192.168.1.2/blog');
// Wejście z Internetu
} elseif ($hostname == 'lightnir.no-ip.org') {
    define('WP_SITEURL', 'http://lightnir.no-ip.org/blog');
    define('WP_HOME', 'http://lightnir.no-ip.org/blog');
}


Przez pewien czas pobawię się jeszcze Wordpressem na własnym serwerku, a potem trzeba będzie wrócić do bardziej poważnych spraw. A co do tego problemu mojego kolegi z jego instalacją WP - problem też rozwiązałem. Wystarczyło przekonwertować wp-config.php z dosowego pliku tekstowego na unixowy i pousuwać śmieci poza tagami PHP. A wszystko dokonałem w jeden wieczór ot tak dla zabicia nudy. Cóż chyba wracam po wakacjach do swej "złej formy" ]:P

poniedziałek, sierpnia 11, 2008

Fighting the future

Kiedyś wyczytałem w sieci taką metaforę odnośnie linuksa:
Używanie linuksa jest jak życie w domu w którym dziennie ściany się przesuwają. Czasem drzwi są w innym miejscu, czasem schody prowadzą gdzie indziej, a czasem człowiek wstaje z łóżka i nie ma podłogi..

Rozwijając dalej tą metaforę ujmę to tak:
Dwa dni temu to wstałem z linuksowego łóżka, a że podłogi akurat dziś nie było poleciałem parę pięter w dół... Spadając walnąłem o poręcz schodów i złamałem trzy żebra oraz obojczyk... Jak już się pozbierałem, wyleczyłem rany i odbudowałem podłogę to się okazało, że pokoj już nie ma okien i drzwi, bo są przestarzałe...

Co mnie skłoniło do zrobienie pełnej aktualizacji systemu? No co? Przecież działało wszystko dobrze, a złota zasada mówi "if it works fine - don't try to fix it". W Archlinuksie którego używam zarządzanie pakietami nie odbywa się automatycznie jak w przypadku takich dystrybucji jak Ubuntu. Nie ma tu żadnych wyskakujących baloników z komunikatem "dostępne są aktualizacje". W zamian jest Pacman - prosty, ale solidny menadżer pakietów. Dawno nic nie aktualizowałem tak więc wykonanie # pacman -Syu && shutdown -h now okazało się mieć poważne konsekwencje. Dodam, że był to środek nocy, parę minut wcześniej sam pacman został zaktualizowany do najnowszej wersji, a ja zostawiłem komputer by robił swoje. No i bigos się zaczął... Nadpisał mi się config GRUBa w taki sposób, że został tylko wpis z linuksa i to w dodatku z podmienionym wpisem partycji bootowalnej /dev/hda7 na /dev/sda3. Tak więc pingwin nie startował w ogóle. Odpaliłem płytkę instalacyjną i w 2 minuty miałem z powrotem system dualboot (Arch & XP). Zaletą pacmana jest m.in. to, że nigdy nie kasuje plików tylko zawsze robi albo backup (nazwapliku.pacsave), albo wogóle nie nadpisuje plików (nazwapliku.pacnew). Sam nie wiem jak to się stało, że mi rozwalił GRUBa na łopatki, ale w każdym razie szybko przywróciłem stary menu.lst
Po uruchomieniu systemu okazało się, że X się nie podnosi. Przyczyna była dość prozaiczna. Ktoś zadecydował, że KDE będzie teraz domyślnie instalowane w innym katalogu, a że ja używam KDM jako menadżera logowania, więc przy próbach uruchomienia trybu graficznego wyskakiwały błędy związane z KDM. Uruchomiłem sobie WindowMakera i poszukałem jakiejś solucji na tą bolączkę. Przy okazji dowiedziałem się o istnieniu projektu KDEmod. KDEmod to środowisko KDE zoptymalizowane pod architekturę i686 i podzielone na większą liczbę pakietów, dzięki czemu jest bardziej modułowe i system można sobie dostroić do własnych potrzeb, bez konieczności pobierania całego KDE. Postanowiłem to wypróbować. Wcześniej jednak musiałem usunąć wszystkie ślady poprzedniego KDE. Gdy się z tym uporałem i ponownie odpaliłem tryb graficzny moim oczom ukazał się KDE w wersji 4.1 (wcześniej miałem 3.5), a wyglądało to tak:

Co się rzuca od razu w oczy to tzw. "eyecandy". Graficznie środowisko KDE4 się naprawdę ładnie prezentuje. Tapety, ikony, styl okien - nie można temu nic zarzucić. Poza tym menu główne jest naprawdę funkcjonalne. Ma to ręce i nogi, a opcja przeszukiwania menu pozwala szybko znaleźć co się chce. No i tyle na temat zalet. Plasma mimo swojego ładnego wyglądu i nowej koncepcji ikon strasznie mnie irytowała. Ok, może i pulpit z minimum ikon wygląda ładnie, schludnie i zadbany, ale ja wolę mieć swój pulpit zasyfiony kilkunastoma ikonami i wszystko nad czym aktualnie siedzę mieć w zasięgu "klik-klik". Funkcjonalność nad estetyką. To takie proste. Przy moim sprzęcie, chodziło to za wolno jak na moje oczekiwania. Nie wszystkie plasmoidy działały poprawnie oraz aplikacje zależne od bibliotek kde3 przestały działać. Dopiero jak doinstalowałem kdelibs3 coś drgnęło. Ja się uważam za osobę mało wymagającą, co nie znaczy że nie mam żadnych wymagań. Jednym z nich jest Amarok sterowany pilotem TV. Niestety odpalanie amaroka pod KDE4 okazuje się kłopotliwe jeśli nie ma się bibliotek z KDE3. Ja ich wtedy jeszcze nie doinstalowałem. Postanowiłem porwać się na wypróbowanie wersji alfa amarok 2. Znalazłem sobie odpowiednią paczkę w AUR, ale około godzinna kompilacja sprawiła, że miałem już dość jak na jeden dzień. Poszedłem, więc ładować mitochondria w ATP mając nadzieję, że będę miał długą fazę NREM...

Po raz kolejny się rozczarowałem. Odtwarzacz chodził bardzo niestabilnie i miałem wrażenie, że połowa opcji nie jest dostępna. Po namyśle stwierdziłem, że wracam do KDE 3.5, ale ponieważ w oficjalnych repozytoriach już jest tylko KDE4 pozostała mi instalacja kdemod 3. No i poleciało wszystko: # pacman -Rcs kde
# pacman -Rcs kdemod
# pacman -Rcs kdelibs3
Dodałem odpowiednie repozytorium do pacman.conf: [kdemod-legacy]
Server = http://kdemod.ath.cx/repo/legacy/i686
i rozpocząłem kolejną próbę. # pacman -Syu
# pacman -S kdemod3
# pacman -S amarok-base
Okazało się to całkiem dobrym posunięciem, bo wreszcie mam działające KDE, które szybciej śmiga niż domyślna instalacja. Amarok znów działa pod kontrolą LIRCa. Bilans walki z przyszłością KDE jest taki:
  • straciłem dwa dni
  • dwa razy pojechałem rowerem przełożyć frustrację na kilometry i endorfiny
  • mam szybsze i ładniejsze środowisko niż sprzed 3 dni
  • przy okazji HAL zaczął ponownie działać + pozbyłem się kilku innych błędów psujących mi siedzenie na koncie zwykłego użytkownika
Ogólnie rzecz biorąc to jestem zadowolony z obecnego stanu, chociaż szkoda mi tych dwóch dni. Co do KDE4 to na razie poczekam, aż się dostatecznie rozwinie. Może kiedyś na niego przejdę, ale to się będzie wiązać z upgradem sprzętu. Póki co zostaję przy KDE 3.5.

sobota, lipca 19, 2008

Keyboard slamming

Dawno mnie tak ręce nie bolały od wciskania klawiszy klawiatury jak dziś. Całkiem przypadkiem znalazłem grę open source która wprost powaliła mnie na kolana. Dawno nie miałem takiej dziecęcej frajdy podczas grania w jakąś grę komputerową (ostatni raz to chyba było przy partyjce Dungeon Keeper 2). Anyway. Mowa jest o Frets on Fire, całkiem dobrym klonie gier na konsolę Guitar Hero. Gra się trzymając klawiaturę tak jak na zdjęciu obok i wciskając w odpowiednim momencie klawisze aby zagrać odpowiednią nutę. O ile jest to względnie proste dla trzech utworów Tommiego Inkila dołączonych wraz z standardową instalacją, o tyle nieźle można się napocić przy kawałkach stworzonych przez fanów gry. Ujmę to może tak - piosenka "Highway to hell" powinna się nazywać tej grze "Highway through hell", bo nawet najprostsze akordy stają się wyzwaniem. Gorąco polecam tą grę każdemu fanowi rocka - zabawa gwarantowana.

Turning SE K550i into mp4 player

Przez ten weekend pobawiłem się trochę moją nową komórką - Sony-Ericssonem K550i. Jedną z jego funkcji jest możliwość odtwarzania filmów wideo w formacie MP4. Tak sobie pomyślałem, że fajnie by było zgrać trochę ulubionych klipów z YouTube na komórkę jako empeczwórki. Pytanie tylko jak albo za pomocą czego? Dodam, że chciałem to zrobić na Linuksie, więc wszystkie konwertery dostępne w takich pakietach jak PC Suite dostarczanych wraz telefonem odpadają. Najpierw poszperałem trochę po necie by się doszkolić (google najlepszym nauczycielem). Szybko znalazłem sobie rozszerzenie do Firefoksa spełniające moje oczekiwania - DownloadHelper. Za pomocą niego można łatwo pobrać klipy w formacie Flash Video (FLV). Teraz trzeba ulubiony klip tylko prze konwertować. Najpierw próbowałem skryptów znalezionych w sieci, ale już po pierwszych niepowodzeniach postanowiłem napisać własny. Początkowo próbowałem sił w bashu, ale najpóźniej przy obliczeniach rozdzielczości z zastosowaniem zmiennych zmiennoprzecinkowych stwierdziłem, że chyba lepszym rozwiązaniem będzie skrypt pisany w pythonie. Poza tym odświeżyłem sobie używanie wyrażeń regularnych w Pythonie. No dobrze, ale wracając do skryptu. Wymaga on zainstalowanych dwóch programów w systemie:
  • exiftool (pobiranie metadanych z pliku video)
  • ffmpeg (konwersja do formatu MP4)

mp4-for-SE.py(Toggle Plain Text)

#!/usr/bin/python
# -*- coding: utf-8 -*-
# FLV-to-MP4 converter for Sony-Ericsson K550i
#
# Depends on ffmpeg and exiftool

import sys
import os
import re

add=0
episode = 300   # 5 minutes
width=220
height=176
DONT_SPLIT=False

# Get input & output
try:
    fin=sys.argv[1]
    p=re.compile(r'\.\w*$')
    m=p.search(fin)
    fout=fin.replace(m.group(0),"")
except:
    fin=""

if fin=="":
    print "Usage: mp4-for-SE.py INPUT"
else:
    # Get aspect ratio
    stdout_handle = os.popen("exiftool -Image\Width "+fin, "r")
    iwidth = stdout_handle.read()
    stdout_handle = os.popen("exiftool -Image\Height "+fin, "r")
    iheight = stdout_handle.read()
    try:
        p1=re.compile(r'Image Width\s*:\s*')
        p2=re.compile(r'Image Height\s*:\s*')
        m1=p1.match(iwidth)
        m2=p2.match(iheight)
        iwidth=iwidth.replace(m1.group(0),"")
        iheight=iheight.replace(m2.group(0),"")
        iwidth=iwidth.replace("\n","")
        iheight=iheight.replace("\n","")
        src_aspect=float(iwidth)/float(iheight)
        dest_aspect=float(width)/float(height)
        if src_aspect>dest_aspect:
            height=int(float(width)/src_aspect)
            if (height % 2 <> 0):
                height+=1
        else:
            width=int(float(height)/src_aspect)
            if (width % 2 <> 0):
                width+=1
    except:
        pass

    stdout_handle = os.popen("exiftool -Duration "+fin, "r")
    str_duration = stdout_handle.read()
    # Basic preparation
    try:
        p=re.compile(r'Duration\s*:\s*')
        m=p.match(str_duration)
        str_duration=str_duration.replace(m.group(0),"")
        str_duration=str_duration.replace("\n","")
    except:
        print "Error: Can't get movie duration. Converting whole movie."
        DONT_SPLIT=True
        exit
    if DONT_SPLIT:
        counter=0
    else:
        # Format some youtube movies outputing duration as "xx:xx.xxxx s"
        p=re.compile(r'\.\d*\s*s')
        m=p.search(str_duration)
        try:
            str_duration=str_duration.replace(m.group(0),"")
            add=1
        except:
            pass
        duration=str_duration.split(":")
        s=int(duration[-1])
        try:
            m=int(duration[-2])
        except:
            m=0
        try:
            h=int(duration[-3])
        except:
            h=0
        total=h*3600+m*60+s+add
        print "\033[1;32mTotal time:\033[1;31m",total,"\033[1;39ms"
        counter = total/episode

    print "\033[1;32mTotal parts:\033[1;31m",counter+1,"\033[1;39m"
    for i in range(0,counter+1):
        if counter==0:
            os.system("ffmpeg -i "+fin+" -s "+str(width)+"x"+str(height)+" -ss "+str(i*episode)+" -t "+str(episode)+" -vcodec mpeg4 "+fout+".mp4")
        else:
            os.system("ffmpeg -i "+fin+" -s "+str(width)+"x"+str(height)+" -ss "+str(i*episode)+" -t "+str(episode)+" -vcodec mpeg4 "+fout+"["+str(i+1)+"].mp4")


Użycie ffmpega rozumie się samo przez się. Czemu exiftool? W celu wydobycia informacji o długości filmu. Problem był następujący. Komórka ma ograniczone zasoby pamięci i mocy obliczeniowej z tego powodu większe (ok. 10 minutowe) klipy nie zostają odtworzone. Wpadłem więc na pomysł, by ciąć film na 5-minutowe kawałki, a ponieważ wewnętrzny odtwarzać automatycznie przeskakuje do następnego klipu na liście po zakończeniu odtwarzania poprzedniego takie rozwiązanie się nawet sprawdza. Teoretycznie za pomocą tego skryptu można przerabiać nawet większe filmy np. divixy na serię 5 minutowych klipów, ale ja jedynie skrypt testowałem na filmach maksimum 15 minutowych. Jeśli dostępne są informacje o wymiarach kadru klip jest skalowany z zachowaniem proporcji do rozmiarów wyświetlacza telefonu. Zmniejsza to dodatkowo rozmiar filmu jeśli mamy do czynienia z ujęciem panoramicznym. Całość się nawet ładnie prezentuje i można spokojnie sobie obejrzeć jakiś film pełnometrażowy o ile wcześniej bateria nie wyzionie ducha ]:)

A tak to wygląda na telefonie (przepraszam za wygląd, ale blogger mi zmasakrował aspekt):



Na wypadek gdyby ktoś nie zauważył. Ta przerwa w filmie zanim bałwan płaci zielonymi portierowi to właśnie przeskok do następnego klipu.