Conky

Door Mar2zz op woensdag 13 april 2011 15:04 - Reacties (5)
CategorieŽn: Addons, Headless onderhoud, Views: 4.598

Onlangs zag ik een screenshot met daarop allemaal gegevens over de pc, temperatuur, harde schijfruimte en dat soort zaken. Dit bleek Conky te zijn. Wat me vooral opviel was dat het er heel mooi uitzag. Ik moest gelijk denken aan Samurize voor windows, wat ik op Windows XP altijd had draaien. De grote vraag was of Conky ook net als Samurize van alles en nog wat kon tonen, dus of het ook andere gegevens dan die over de pc zelf.

Na wat googlen had ik begrepen dat Conky ook bash en python-scripts begrijpt, en dan is dat antwoord dus ja! Aangezien ik redelijk kan bashen ben ik gelijk maar even aan de slag gegaan.

Wat is Conky
Van de website zelf:
Conky is a free, light-weight system monitor for X, that displays any information on your desktop. Conky is licensed under the GPL and runs on Linux and BSD.
Vooral dat informatie is interessant, vooral als het informatie is die je zelf kan kiezen. Als je de screenshotpagina bekijkt dan lijkt het haast of Conky alleen maar info kan weergeven over je eigen systeem. Nu is dat op zich wel handig, maar ik vind dat zelf niet interessant. Mijn pc doet het of doet het niet, en als ie het niet goed doet dan ga ik dan wel kijken waar het mis loopt. Maar als je zoiets wilt, van dit soort configs zijn er zat:
http://conky.sourceforge.net/screenshots.html

Nu kon ik met Samurize zo een beetje alles tonen op de desktop wat ik wilde. Ik had de tvgids paraat, wat weerdingen, veel over de muziek die ik afspeelde en statistieken van last.fm enzovoorts. Aangezien Conky bashscripts verstaat moet dit dus allemaal kunnen. Conky kan zelf die info niet vergaren, maar bash met de juiste commandtools dus weer wel. Het enige wat daarvoor extra geleerd moet worden is de formatting die conky gebruikt, maar die is vrij simpel en kan je afkijken uit andere configs.

Conky installeren
Conky moet geinstalleerd worden met 'sudo apt-get install conky'. Daarna werkt het al. Het enige wat je dan nog moet doen is het starten van een script waarin staat wat er allemaal geladen moet worden en waar het moet komen te staan.

Ik ben zelf begonnen met http://code.google.com/p/conkywizard/. Hiermee maak je vrij simpel een Conky-config over je eigen systeem. Het mooie is dat je gelijk voorbeelden krijgt hoe het werkt als je in die configfiles duikt. En die configfiles kan je dus ook gelijk ombatterijen naar je eigen voorkeur. Zo kun je van dit (ConkyWizard default theme):
ConkyWizard default
Naar dit (mijn huidige theme):
Conky met 3 boards

Conky ombatterijen
Als je Conky een ander uiterlijk wilt geven dan is dat het makkelijkst door in ieder geval een andere afbeelding te laden als achtergrond voor de informatie.

Een conky configfile is als volgt opgebouwd:
Eerst leg je vast waar de config gepresenteerd moet worden. Je legt de dimensies, locatie en presentatie vast. Dit sluit je af met een regel waarop je TEXT zet. Daaronder kun je opschrijven welke informatie gepresenteerd wordt.

Het mooie daarvan is dat je ook scripts kan laten uitvoeren op intervals, bijvoorbeeld elk half uur of elke 10 seconden. Er zijn ontzettend veel commando's om te gebruiken, commando's die positie bepalen (zoals $GOTO) zijn relatief aan de dimensies van de configuratie boven TEXT. Interessante commando's voor scripters zijn exec (execute) en execp (execute and parse) en execi en execpi (hetzelfde als exec/execp maar dan op intervals). execpi 60 ./pad/naar/script zorgt ervoor dat elke 60 seconden het script wordt uitgevoerd en geparsed.

Parsen houdt in dat je Conky taal in de scripts kan zetten (bijvoorbeeld laten echo'en) en dat deze dan gelezen wordt alsof het in je configuratie file staat. Je configuratiefile kan daardoor uit tig verschillende scripts bestaan. Dus Conky is zo flexibel als alles wat je maar kunt echo'en in bash, of printen in python. De mogelijkheden zijn dus eindeloos wat informatievergaring betreft. Gotta love that!

Scrapen voor Conky
Scrapen is hetzelfde als schrapen of vergaren, en meestal wordt daarmee bedoelt informatie schrapen of vergaren van websites. Op linux heb je daar bijvoorbeeld curl en wget voor. curl moet je vaak nog even installeren, maar wget is altijd al wel aanwezig.

Curl leest webpagina's online en met curl kun je bijvoorbeeld een link "aanklikken" als ware het iemand die dat met een muis doet. Zo kan je een optie op een website aanpassen en daarna gaan scrapen. Dit doe ik bijvoorbeeld in mijn sickbeard script. Ik klik de listview van coming episodes aan met curl, scrape de eerstvolgende 3 series die worden uitgezonden, en vervolgens laat ik curl de layout weer terugzetten naar Posterview, zodat ik die zie als ik zelf naar Sickbeard surf.

Wget download de link die je aangeeft. Dit kan gebruikt worden om lokaal een webpagina op te slaan, zodat je dat lokale bestand kan scrapen. Dit heeft als voordeel dat je maar 1 online request hoeft te doen om alle informatie ineens op te halen, terwijl je met curl misschien wel 30 requests moet doen om hetzelfde te bereiken. Bovendien zal een lokaal opgeslagen pagina wat sneller gescraped worden dan een online pagina.

Een voorbeeld:
Ik wil mijn onlangs bekeken series in mijn config, naast die van Sickbeard, welke de 'Coming soon' series toont. De toegevoegde waarde van al dit is mij onbekend, ik kan immers net zo goed de url zelf bezoeken, dus dan maar voor de leuk. Maar het is ook leuk om dat met bash uit een page te peuteren, als oefening, ter leering ende vermaeck om nu weer eens te zien wat voor een lelijke code ik daarvoor ga verzinnen.

De tools die dan nodig zijn zijn curl (of wget), grep en sed. Curl zet de webpagina om in terminaloutput, grep beperkt die output tot die zinnen die ik specificeer met woorden en operators die ik opgeef en met sed haal ik de rest van de overbodige info weg.

LET OP: ONDERSTAANDE IS VEROUDERD.
trakt.tv heeft tegenwoordig een api, waarmee deze info opgehaald kan worden. Meer informatie: http://trakt.tv/api-docs/user-watched-episodes


Deductie:
De pagina is: http://trakt.tv/user/Mar2zz/watched/shows
Als ik in de bron van de pagina kijk dan zie ik dat de regels met recent gekeken afleveringen allemaal beginnen met '<a href="/show/' . Dus als ik nou de output daarop grep en dan maximaal 12 (-m12) regels pak, dan heb ik een kleinere output met 3x een shownaam, seizoen/episode en plaatje) ervan. Dat levert op:
curl -s http://trakt.tv/user/Mar2zz/watched/shows | grep -m12 '<a href=\"/show/'
De | is een pipe, dit houdt in dat de output van voor de pipe wordt gesluisd als argument naar het commando achter de pipe. En dat kun je oneindig blijven doen en dat is maar goed ook, want dit is nog rubbish:
mars@laptop:~$ curl -s http://trakt.tv/user/Mar2zz/watched/shows | grep -m12 '<a href=\"/show/'
																<a href="/show/the-big-bang-theory/season/4/episode/20"><img src="http://vicmackey.trakt.tv/images/episodes/34-4-20-218.jpg" /></a>
					<a href="/show/the-big-bang-theory">The Big Bang Theory</a>
				<h5><a href="/show/the-big-bang-theory/season/4/episode/20"><span>Season 4, Episode 20</span></a></h5>
					<a href="/show/the-big-bang-theory/season/4/episode/20">The Herb Garden Germination</a>
																<a href="/show/sons-of-anarchy/season/3/episode/10"><img src="http://vicmackey.trakt.tv/images/episodes/76-3-10-218.jpg" /></a>
					<a href="/show/sons-of-anarchy">Sons of Anarchy</a>
				<h5><a href="/show/sons-of-anarchy/season/3/episode/10"><span>Season 3, Episode 10</span></a></h5>
					<a href="/show/sons-of-anarchy/season/3/episode/10">Firinne</a>

etc etc.....
Omdat curl relatief langzaam (tov lokaal greppen) is wil ik dat niet te vaak doen. Daarom zorg ik ervoor dat deze output in een file verdwijnt, waarna ik met sed alle gegevens eruit kan extraheren en opschonen. Dit kan door '> bestandsnaam' achter het commando te zetten. Ik gooi dit maar in /tmp/trakt

Met sed kun je in een file alles vervangen. Het is flexibel, maar er zijn ook erg veel voorstanders van awk om dit soort zaken te doen. Ik gebruik sed omdat ik het onder de knie heb. De syntax is: sed -i 's/ongewenst/doorditvervangen/' bestandsnaam, wat betekent vervang in het bestand alle ongewenst met gewenst.

Aangezien ik heel specifiek kon greppen hoef ik maar weinig vervangingen te doen en bij opschoningen vervang ik ongewenst spul met niets (sed 's/ongewenst//' bestandsnaam). .* is een wildcard, wat betekent alles voor de tekens die ervoor staan vervangen (*. is erachter vervangen). Dit haalt grote lappen tekst weg, dus ik maak er gebruik van.
Dit stukje code schoont het helemaal op:
code:
1
2
3
4
5
6
7
8
9
sed -i '
    s/<\/.*//
    s/.*\">//
    s/\" \/>//
    s/<span>//
    s/<img src=\"//
    s/Season //
    s/, Episode /x/ 
' /tmp/trakt

en maakt van bovenstaande terminaloutput het volgende in /tmp/trakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
http://vicmackey.trakt.tv/images/episodes/34-4-20-218.jpg
The Big Bang Theory
4x20
The Herb Garden Germination
http://vicmackey.trakt.tv/images/episodes/76-3-10-218.jpg
Sons of Anarchy
3x10
Firinne
http://vicmackey.trakt.tv/images/episodes/76-3-9-218.jpg
Sons of Anarchy
3x9
Turas



Nu ik de gegevens heb opgeschoond laat ik het omzetten naar conkyformatting en neem ik het op in de config. Dat is een kwestie van aangeven welke regel uit /tmp/trakt waar moet komen. De plaatjes download ik dan met wget zodat die ook getoond kunnen. Dit alles wordt dus met een bashscript afgehandeld in een paar seconden en ik laat conky dan 1x in de zes uur ofzo deze gegevens vernieuwen.

Nu hoef ik dus alleen nog maar een background ervoor te maken. Omdat ik steeds dezelfde mishandelde foto van een moederbord gebruik als achtergrond hoef ik alleen maar het traktlogo eraan toe te voegen.

Het uiteindelijke resultaat:
http://tweakers.net/ext/f/aTiGxtYfyx64Jc4zY6uiOiSE/medium.png

Tot slot
't Is wat prutsen, maar dan heb je ook wat. Je kunt er verder niets mee, dus echt nut is niet aanwezig, maar je hebt iets zelfgemaakts en je kan jezelf makkelijk informeren door ff alles te minimaliseren, want Conky minimaliseert niet mee. Conky kan met de pc mee opstarten door een bashscriptje toe te voegen aan startups met daarin zoiets als:
'conky -c $HOME/pad_naar_conky_config/conky_confignaam'

Het ontrafelen van webpagina's is een leuke puzzel, dus ideaal als je weer eens flauw bent van je Rubiks Cube. Als je bash of python kan schrijven kun je heel veel met Conky, waarschijnlijk kun je het hele internet op je bureaublad weergeven (dan moet je veel rouleren). RSS-feeds zijn daar ook leuke slachtoffers voor.

Op het web rouleren erg veel conky-configs, maar ik ben nog niet echt tegengekomen dat ze volledig misbruikt worden zoals op deze manier. Terwijl het er een ideaal programma voor is. Als ik nu ook nog eens een beetje kon designen dan zag het er ook nog eens piekfijn uit, ik ben al blij dat het functioneel is en niet al te lelijk.

Dat design kan je beter aan anderen overlaten, er zijn conky-design-contests af en toe, die conky ten volle benutten en enorm geavanceerd zijn en ongelooflijk mooi gemaakt. Hier staat daar een enorm mooi voorbeeld van.

Volgende: Headphones 06-'11 Headphones
Volgende: Terminal 03-'11 Terminal

Reacties


Door Tweakers user wheez50, donderdag 14 april 2011 00:17

Ik las echt net een blog over het gebrek van diepgang over tweakers. Nu ik dit lees (en zin krijg weer eens diep in ubuntu te duiken) moet ik er een beetje om grinniken. Thanks!

Om toch het niveau iets naar het gemiddelde (lagere) niveau te halen: Werkt dit ook onder windows 7? :+

Door Tweakers user Mercatres, donderdag 14 april 2011 00:31

Nee, helaas is Conky Linux-only. Je zou iets vergelijkbaars wel met Rainmeter kunnen bereiken :)
Ik las trouwens met hetzelfde, en ik moest toch ook eventjes glimlachen.

Door Tweakers user Mar2zz, donderdag 14 april 2011 07:19

Artikel ook gelezen inderdaad. Ergens heeft hij wel een punt, vroegah was het beteh! ;)

Windows heeft Rainlendar om dit te kunnen doen. Bovendien werkt Rainlendar ook op mac en linux. Wat dat betreft is Rainlendar crossplatform en had ik beter voor Rainlendar kunnen gaan. Maar ik doe alles in bash en dat werkt weer niet op windows dus zou het geen toegevoegde waarde voor mij hebben, *nix only here. Maar met Rainlendar kan je geloof ik hetzelfde doen, dat is m.i. net zo flexibel, als je maar ergens de info netjes krijgt kun je het met Rainlendar op je bureaublad zetten.

Het is overigens niet zo vergaand/ingewikkeld als het lijkt. Als je bash kunt dan heb je binnen 10 minuten de info bij elkaar die je hebben wilt. Deze trakt-conky heb ik gemaakt tijdens het schrijven van de blog en heeft me denk ik 5 minuten terminalspammen gekost. Aan het bashscript kun je wel zien dat het weinig code is en niet ontzettend ingewikkeld, er zijn maar 4 commando's gebruikt immers. Met een beetje gepruts en gegoogle heb je het zo voor elkaar.

Door Tweakers user wheez50, donderdag 14 april 2011 11:28

Zoals je zelf al typte: samurize is een goed windows alternatief. Heb ik onder windowsXP veel gebruikt. En ook rainlendar ken ik. Ikzelf doe vergelijkbaar spul met 'standaard' windows7 gadgets.

Dit soort dingen is trouwens ook erg leuk op een tweede scherm.

Door Tweakers user Mar2zz, donderdag 14 april 2011 13:37

Samurize wordt al heel lang niet meer ontwikkeld. De rechten liggen bij de originele ontwikkelaar, maar die laat nooit wat van zich horen. Nu is Uziq (pluginschrijver) daar veel mee bezig, maar hij kan Samurize zelf niet verbeteren omdat het closed source is. En de source is dus niet te krijgen blijkbaar. Op XP werkt samurize prima, op Vista had ik er wat problemen mee, maar weet niet meer precies wat.

Maar ik ben nu op weg om dezelfde client opnieuw te gaan maken. Ik heb al een script wat de laatste 20 recent afgespeelde tracks van last.fm haalt inclusief albumcover.

code:
1
2
3
4
5
6
7
8
9
10
curl -s http://www.last.fm/user/mar2zz | grep -m20 '<a href="/music/.*.</a> ' > /tmp/lastfm

##clean up last.fm info
sed -i '
    s/.*src=\"//
    s/<\/a> &#8211; <a.*\">/ - /
    s/.*\">//
    s/\" .*//
    s/<\/a>.*//
' /tmp/lastfm



Hmmm, die codebox kan niet omgaan met s/<\/a> – <a.*\">/ - /

[Reactie gewijzigd op donderdag 14 april 2011 13:39]


Reageren is niet meer mogelijk