neděle 14. listopadu 2010

Jak zjistit, které síťové zařízení je používáno - Bash, Conky

Postupně si ladím Conky pro svůj netbook a tak jsem narazil na problém, jak zobrazovat statistiku jen pro síťové zařízení, které je právě používáno. Conky sice nabízí proměnnou if_up (interface), tedy můžete podmínit zobrazení bloku kódu tím, že je konkrétní zařízení zapnuté, jenže v tomto případě není zajímavé, zda je zapnuté, ale zda je připojeno, nebo ještě lépe, zda je momentélně používáno jako výchozí pro přístup systému k síti. Jelikož se o připojení k síti stará v Ubuntu Network Manager (NM), začal jsem právě u něj. V Ubuntu 10.10 již NM konečně dostal i cli rozhraní pro správu připojení z příkazové řádky, tak jsem začal se studiem manuálu. ...


Příkaz

$ nm-tool

vypíše stav NM a dostupných sťových zařízení. Příkaz nemá žádné parametry a pro strojové zpracování je výpis nevhodný. Mocnějším nástrojem je příkaz nmcli, pro všechny jeho možnosti se podívejte do manuálu.

$ man nmcli

První nápad byl takový, že se poptám NM na aktivní síťové zařízení a to předám Conky. To vyžaduje přesunutí části conky kódu obsahující zobrazení síťové statistiky do externího skriptu, který Conky zavolá pomocí ${execp cesta/ke/skriptu}, skript se optá NM, upraví jméno zařízení v conky kódu a ten vrátí Conky, které si ho zpracuje. Z příkazu nmcli můžete dostat výpis přizpůsobený pro konkrétní potřeby strojového zpracování, k čemuž slouží přepínače -t a -f jímž můžete ovlivnit, které konkrétní sloupce do výpisu dostanete. Například jsem zjistil, že příkaz  

$ nmcli con status

vypíše aktivní síťová zařízení a ze sloupce DEFAULT se dá vyčíst, které se zrovna používá pro přístup k síti. Pak tedy můžete výpis zjednodušit, aby obsahoval pouze relevantní informace

$ nmcli -t -f DEVICES,DEFAULT con status

Pokud budou například zapnuté zařízení eth0 a wlan0, může výpis vypadat takto

eth0:yes
wlan0:no

eth má standardně přednost a odpojí wlan. Chcete-li dostat pouze název aktivního zařízení, stačí výstup prohnat filtrem

$ nmcli -t -f DEVICES,DEFAULT con status | grep yes | cut -d : -f 1

Nojo, tohle je sice pěkné, ale použití nmcli je neskutečně náročné na výkon procesoru. Jen tento jediný dotaz zabere procesoru Atom N450 skoro sekundu a vytížení procesoru vylítne na deset procent. To je pro Conky nepoužitelné. Můžete to pouštět v delších časových intervalech, ale to zas Conky na změnu připojení nebude reagovat hned a to není dokonalé řešení, které by se mi líbilo.

Proměnná if_up v Conky rozlišuje pouze to, zda je zařízení zapnuté, pokud třeba odpojíte od počítače síťový kabel, ztratíte připojení, ale if_up si toho nevšimne. Ze systému se dá naštěstí vyšťourat více a lepší zdroj se nachází v systémovém adresáři /sys/class/net/, kde jsou informace o stavu všech síťových zařízení v systému

$ ls /sys/class/net

Pokud víte, že používáte pouze zařízení eth0 a wlan0, stačí se podívat, zda jsou připojené k síti

$ cat /sys/class/net/eth0/operstate
$ cat /sys/class/net/wlan0/operstate

Dostanete buď up, nebo down. (Ve zmíněném adresáři je i plno dalších informací, které by vás mohly zajímat). Conky má jednu chytrou proměnnou, která umožňuje testovat existenci konkrétního souboru a dokonce i tento soubor prohledat, zda se v něm nachází zadaný řetězec. Pak je to jednoduché, v Conky skriptu použijete konstrukci

${if_existing /sys/class/net/eth0/operstate up} <zde se nachází kód pro statistiku eth0>  $endif

Zrovna tak vytvoříte blok pro wlan0 a Conky pak zobrazí jen statistiku aktivního zařízení.

I zde je ovšem nějaká ta vada na kráse. Pokud v NM nevypnete drátové připojení, ani nevytáhnete kabel, jen síť v menu odpojíte, tímto postupem to nezjistíte. Tedy zjistíte to třeba tak, že vám Conky místo IP adresy zobrazí No Address. To je ovšem spíše taková malinká muška, která mi náladu nezkazí, neboť při mém způsobu používání netbooku na toto ani nenarazím. Dále (alespoň v mém případě) má NM nastaveno jako výchozí připojení to kabelové a pokud jsem připojen k wifi síti a pak připojím kabel, NM přepne automaticky na kabelové připojení, což tato detekce nezjistí a zobrazí v Conky obě zařízení.

Zatím jsem se k dokonalosti nedostal, ale pokud na něco zajímavého přijdu, informace doplním.

2 komentáře:

  1. Nazdar,
    já jsem problematiku ohledně sítí vyřešil tak, že mám nastaveno zobrazení jak pro eth0, tak pro wlan. Jelikož na koleji jsem připíchnutej na drátu, ale doma nebo v učebnách na wifi, tak se mi to hodí a nevadí mi to.
    Ale zajímalo by mne jak si zobrazit čas do vybití baterie NTB. Procentuální bar tam mám, ale co s časem?

    Díky za odpověď.

    OdpovědětVymazat
  2. Ahoj, na zbývající čas podle ACPI je $battery_time

    http://conky.sourceforge.net/variables.html

    OdpovědětVymazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.