Těžko život administrátora aneb skriptujeme pro BFU

October 23rd, 2007 by Jakub Lucký

Moje matka po půl roce, co máme doma desktop, projevila reálný zájem o připojovat se přes něj na internet. Běžný linuxák prohlásí, ale to je snadné, připojí se na svůj Linuxový router, nastaví Iptables, povolí ICQ na firewallu, provrtá tři zdi, zapojí síťové kabely, třikrát se pomodlí k Linusovi a je to. Jednoduché, že? Ale u mě je tomu jinak…

Situace

Největší problém je v tom, že nebydlím v Praze, ale daleko na horách (čtěte na vesnici 30 km za Prahou), kde je dostupnost internetu shodná s dostupností multikin uprostřed Sahary nebo dobrého piva v Americe. Proto jsem nucen doma používat nevalně rychlý a nevalně stabilní CDMA modem. Jde o USB modem a připojení je vytáčené, což přináší spoustu radostí s připojováním.

Vytočíte, spadne, vytočíte, spadne, vypnete a zapnete modem, vytočíte, spadne, dáte modem do ledničky, vytočíte,
spadne, vytočíte se vy a jdete si číst

Cožpak já, já už vím jak na to a nějak se postarám, abych ten internet měl, ačkoliv občas s pingem 16 sekund. Ale co právě moji rodiče, otec počítače neznalý manager a matka, byť počítačově zdatná, něco jako shell naposledy viděla v době, kdy v práci používala Cobol a Algol. Od té doby pochopitelně trošku zpohodlněla, minimálně co se počítačů týče, dneska už jen provozuje makra ve Visual Basicu, která jsou trošku něco jiného než shell. Taky bych jí mohl něco naučit, ale to je moc práce a málo výzva ;)

Řešení

Takže nakonec padlo řešení na bashovský skript s grafickými dialogy pomocí zenity. Zenity je bashový zobrazovač GTK+ dialogů, mající spoustu voleb a hodina češtiny mi přišla ideální ke zkoumání jeho možností. Brzo jsem objevil, jak se vytváří všechna praktická okénka.

zenity error

Tím jsem vyřešil mou binární komunikaci s matkou ( Ti všímavější už pochopili komunikace probíhá na signálové úrovni, socketově bude probíhat pouze první ukázka)

Samotné připojení ovšem taková legrace není, neboť připojování probíhá pomocí pppd. Celý problém spočívá v detailu, že pppd je pěkný filuta, špatně se z něj získávají libovolné údaje o čemkoliv.

Vyzkoušel jsem leccos, ale všechno troskotalo na jedné základní věci, jak odchytit celý výstup, když se pppd při úspěšném spojení neumí “vymáčknout” a svůj výstup nedokončí. Zkoušel jsem různé pajpy do souborů a podobně, ale pořád to někde haprovalo, výstup se prostě nechtěl číst.

Až jednoho dne (respektive ještě ten den, asi 8 hodin poté) jsem při hledání parametrů v manuálových stránkách příkazu pon objevil jiný příkaz, plog. Plog se sice jmenuje stejně jako zvuk, který vydá záchodový zvon při běžném používání, ale je mnohem užitečnější. Umí totiž vypisovat několik posledních výstupů z démona pppd. Když jsem se pustil do zkoumání, objevil jsem že celé slavné plog je sedmiřádkový skript

1
2
3
4
5
6
7
#!/bin/sh
if [ -s /var/log/ppp.log ]; then
    exec tail "$@" /var/log/ppp.log
 
else
    exec tail "$@" /var/log/syslog | grep ' \(pppd\|chat\)\['
fi

V čem je ten skript tak převratný? Poradil mi, že můžu data vytahovat ze syslogu, kam mi pppd loguje. Výsledkem všeho je v podstatě genitální skript, který můžu matka (případně babička, dědeček, pes, papoušek nebo želva) v klidu spustit a vědět, zda internet opravdu funguje. Jak to celé vypadá?

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
#!/bin/bash
#Provedeme připojení přes CDMu
pon cdma & &> /dev/null
 
#Počkáme si, až se CDMA určitě připojí
sleep 8
 
#Vezmeme poslední řádek ze syslogu
vystup=`tail -n /var/log/syslog | grep ' \(pppd\|chat\)\[' | tail -n1 `
 
#!!!!!! POZOR !!!!!!!!!!
# !!! Od tohoto místa prosím slabší povahy, aby dále nečetli, neboť půjde o velmi brutální prasečiny !!!
#!!!!!! POZOR !!!!!!!!!!
 
#zkusíme grepnout  jeden z obvyklých errorů
echo $vystup | grep "unrecognized option" - > /dev/null
 
#proměnná $? obsahuje exit kód posledního příkazu (u nás grep)
#Pokud je exit kód  0 (tedy jsem úspěšně grepli) pak
if [ $? -eq 0 ];then
    zenity --error --text="Modem není zapojen, nebo se to tak alespoň zdá";
    exit 1
fi;
 
#a dále grepáme
echo $vystup | grep "locked" - > /dev/null
 
if [ $? -eq 0 ];then
    zenity --error --text="Internet se tváří, že je již připojen";
    exit 1
fi;
 
echo $vystup | grep --ignore-case "Failed" - > /dev/null
 
if [ $? -eq 0 ];then
    zenity --error --text="Nepodařilo se připojit";
    exit 1
fi;
 
#Pokud se nic zvláštního nestalo
zenity --info  --text="Spojení se pravděpodobně zdařilo";

Ještě jsem neměl čas předhodit to betatesterům (tj. matce), ale i na to brzy dojde a já budu moct celý skript prohlásit za funkční (a časem snad i bugu-vzdorný a blbu-vzdorný)

Leave a Reply