Jabber Shell

Nápad použít jabber jako příkazovou řádku k živému systému nás napadl asi před dvěma lety. Přestože se nám naše idea zdála velmi originální, jak se později zjistilo, nebyli jsme sami, koho podobná věc napadla. Existuje například implementace použití SSH přes Jabber protokol (JabSh) a možná by bylo možné při detailnějším hledání najít další.

Co nás vůbec motivovalo o nějaké takové věci vůbec přemýšlet?

Předně jsme vývojáři, kterým je příkazová řádka často bližší než sebelepší klikátka. Navíc klikátka umí milion věcí, které běžně nepotřebujeme - nám stačí jen pár základních úloh, které ovšem chceme provést velmi rychle a odkudkoliv. Ve firmě máme zprovozněný interní Jabber server (Openfire Jabber Server) integrovaný s naším LDAP (s odpovídající politikou hesel), který je provozován přes SSL protokol a tudíž splňuje všechny bezpečnostní požadavky definované naším TA oddělením pro přístup zvenčí. Svůj jabber účet má každý zaměstnanec Forresta, a mají ho také všichni po ruce (jeden klik nebo klávesová zkratka obvykle stačí) a to nejen ve firmě, ale i z domova. Klientů pro jabber protokoly je nepřeberné množství pro všechny platformy, a to i dokonce pro platformy mobilní (Android, iPhone, Symbian). XMPP má řadu použitelných knihoven v Javě - konkrétně autoři Openfire Jabber Serveru dodávají i velmi kvalitní klientskou knihovnu Smack, kterou jsme si pro naše účely vybrali. Všechno tedy hrálo do karet nápadu použít jabber protokol jako bránu k našim interním systémům.

Náš přítel _VYKAZOVANI

První implementací bylo naše vykazování práce, které se přímo promítá do fakturace klientům. Pro vykázání práce bylo nutné v prohlížeči otevřít stránku našeho IS, přihlásit se, kliknout v menu na záložku vykázání práce a následně pomocí standardního formulářového dialogu vykazovat. Odezvy IS nebyly nejrychlejší a proto nám denní vykazování zabíralo víc času než většina z nás chtěla (morna to byla především pro mě, který si na vykazování vzpomenu vždy až ve chvíli, kdy už bych měl pomalu vyrážet na autobus).

Proto jsme si vytvořili jednoduchý protokol pro vykazování práce právě přes jabber. Mezi naše firemní kontakty jsme zařadili nový systémový účet _VYKAZOVÁNÍ, na kterém naslouchá Java aplikace zpracovávající vstupní příkazy. Pro vykázání stačí navázat kontakt s _VYKAZOVANIm a napsat mu:

[JNO 29/04/2011 at 19:42:58 says]: vloz 0.5 VDF18 APP “Implementace správy Android aplikací.” 29780

[_VYKAZOVANI 29/04/2011 at 19:42:58 says]: Příkaz byl úspěšně proveden: vloz 0.5 VDF18 APP “Implementace správy Android aplikací.” 29780 Celkem za 29.05.2011 odpracováno: 4,50 hodin (4 h 30 m) Bylo úspěšně provedeno 1 příkaz(ů), neúspěšně 0 příkaz(ů)

Což představuje jednoduchý příkaz, ve kterém systému předáme žádost o zaznamenání nové činnosti na projektu VDF18 v délce trvání 12 hodiny, programování úkolu číslo 29780 s konkrétním komentářem. Automat nám pošle odpověď zda naši žádost zpracoval, nebo jsme se někde uklepli. Výkaz mé dnešní práce si vypíšu také jednoduše:

[JNO 29/04/2011 at 19:42:58 says]: vypis bm

[_VYKAZOVANI 29/04/2011 at 09:42:58 says]: Výpis vykázané práce ze systému Bílý Motýl: 8,00 FG OSZ “ ” Darování krve.
0,50 KB191 POR “Status JSL, JPR, LSU.”
4,00 BDI57 APP “Implementace šablon.”
Celkem za 29.04.2011 odpracováno: 12,50 hodin (12 h 30 m)

Díky tomuto přístupu dokáže většina z nás vykázat celodenní práci během minuty nebo dvou. Jediné čeho lituji je, že Jabber klienti nemají funkci podobnou Linuxovému shellu, kde přes klávesu šipka nahoru vyvolám poslední provedené příkazy v něm.

Je jasné, že tento způsob vykazování není pro každého a po nějakém roce a půl provozu máme poměr lidí používající původní “klikací” způsob oproti vykazování přes jabber asi 3:2. Nicméně poměr se stále hýbe dál ve směru k jabber protokolu (spolu s tím, jak se rozrůstá jeho funkcionalita).

V současné době se náš protokol rozrostl o řadu dalších “příkazů”. Ve firmě velmi bedlivě udržujeme informace o tom, kdy je kdo na dovolené / schůzce / na jiné pobočce atd., aby vás mohli ostatní kolegové rychle lokalizovat a přizpůsobit vaší aktuální dostupnosti. Sem tam se mi ovšem stane, že zapomenu informaci o tom, že daný den budu třeba pracovat na pobočce v Praze zapsat do systému včas a vzpomenu si na to až cestou do Prahy. Aktuálně nemám problém tuto informaci pomocí příkazu v jabberu vykázat ve vlaku za pár vteřin (někteří kolegové taky často píší záznam o nepřítomnosti až na schůzce u zákazníka):

[JNO29/04/2011 at 06:24:25 says]: nepritomnost mimo “Na prazske pobocce” 29.4.2011

[_VYKAZOVANI 29/04/2011 at 06:24:25 says]: Záznam o Vaší plánované nepřítomnosti byl vložen do BM.

Aktuálně si, kromě výše uvedeného, dokážeme přes jabber velmi rychle vyhledat, na kterém serveru sídlí aplikace pro konkrétního zákazníka (dle domény, kódu projektu, kódu zákazníka), najít ten správný tomcat a apache, který aplikaci obsluhuje, najít konkrétní lidi, kteří jsou za různá oddělení za projekt odpovědní a kdo je jeho PM nebo zjistit telefonní číslo kolegy na jiné pobočce. S rostoucími možnosti stoupá i počet uživatelů a naše “závislost” na kamarádu se jménem _VYKAZOVANI pomalu roste.

Kolik to stojí

Díky tomu, jak je infrastruktura lehce dostupná (většinu toho skutečně získáte zdarma), jde jen o implementaci vlastní business logiky nad XMPP protokolem. V našem případě zabrala implementace napojení na IS v úvodní fázi cca 7 dní a společně s dalšími rozšířeními jsme se vyšplhali cca na 15 dní práce. Čas ušetřený 20 zaměstnanci (25 firmy), kteří denodenně protokol využívají, vynaložené náklady rychle nahradil.

Naše tetka švitořilka _TWITTER

Přestože máme cool vymakaný intranet, chyběla nám určitá forma krátké hromadné komunikace. Na intranet se obvykle píší články přinášející větší souvislejší sadu informací a napsání takového článku na intranet pár desítek minut trvá. E-mail ani hromadné zprávy v twitteru se k podobné věci nehodí, protože časem zapadnou.

V týmu existuje plno informací, které se dají říci jedinou (důležitou) větu a které se nikde hromadně nekomunikují / neukládají. Tento druh informací se obvykle předává na chodbách u kafe nebo na balkónech u cigarety a zřídkakdy opouští místnost, kde se na ně někdo vyptal. Přesto mohou být některé z nich pro ostatní kolegy na jiných pobočkách důležité.

Proto jsme si vyrobili nového kamaráda _TWITTERa, který nám umožňuje tento druh informací sdílet, aniž by opustily brány firmy. Princip je v podstatě kopie toho, na co jsme zvyklí v Twitteru - tj. základem je používání tagů, které umožňují slinkovávat podobné věci dohromady. Nerozeznáváme mezi uživatelem a tagem, tj. zkratka každého z nás je zároveň tagem, pod kterým je možné vyhledat tweety od daného člověka. A zapsání nového tweetu je opravdu jednoduché:

[JNO 20/04/2011 at 10:17:03 says]: @ #Patch #MailModule verze 4.7.2 opravuje problém nenaběhnutí modulu při touchování sitemap. První naběhnutí je ok, po touchích už nenabíhal. #fix
[JNO 25/04/2011 at 16:10:43 says]: @ #JNO #Release #Adam v. 2.9.0 ADaM - oprava Blobů na Oracle, další vylepšení (viz. release notes)
[JNO 29/04/2011 at 09:52:19 says]: @ #JNO nově umí #RamJet jednoduše duplikovat celé oblasti s vstupními polemi pro zadávání 1:N dat

Zprávy jsou rozeslány do stejné skupiny, do které patří autor zprávy (tj. od vývojáře dalším vývojářům), ale je možné sadu příjemců rozšířit zadáním tagů dalších oddělení firmy. Příjemci dostanou zprávu na svůj jabber klient. Zároveň je zpráva uložena do databáze a zobrazí se na firemním intranetu, kde je zaindexována. Informace je možné zpětně dohledat přes fulltextové vyhledávání a je zde také dostupná jednoduchá prohlížečka zpráv podle použitých tagů. Tj. na jedno kliknutí je možné si nechat vypsat zprávy od konkrétního autora, zprávy týkající se konkrétní knihovny, seznam releasů, fixy atp.

Implementace interního twitteru zabrala celkově asi 5 dní práce, což považuji za přiměřené náklady, jejichž návratnost je sice těžko měřitelná ale kterých ani v nejmenším nelitujeme.

Pár obrazovek na závěr

Aby nebylo povídání příliš suché přikládám pár obrazovek nasnímaných z různých klientů a našeho intranetu. Seznamte se s našimi “kovovými” přáteli _VYKAZOVANI a _TWITTER …

[gallery link=“file” orderby=“ID” exclude=“1410”]