Systemd configureren met cme

Een nieuwe service in systemd configureren, vereist dat je bestanden op allerlei plaatsen aanmaakt, secties toevoegt en parameters instelt. Een fout is dan ook al snel gemaakt. Maar met de hulp van cme (Config::Model), een programma om configuratiegegevens te bewerken, verloopt het proces heel wat betrouwbaarder. Het programma toont alle bestaande systemd services, toont documentatie van alle ondersteunde secties en parameters en valideert ook de inhoud die je aan de parameters geeft als dat mogelijk is.

Installeer eerst cme en het configuratiemodel voor systemd. Onder Debian en Ubuntu gaat dat als volgt: 

sudo apt install cme libconfig-model-systemd-perl

Dat tweede pakket is in Ubuntu overigens slechts beschikbaar vanaf versie 16.10 (Yakkety Yak). We slaagden er echter in om het ook op Linux Mint 18 (gebaseerd op Ubuntu 16.04 LTS Xenial Xerus) aan de praat te krijgen. Download daarvoor op https://launchpad.net de versies voor Yakkety Yak van de pakketten libpath-tiny-perl, libconfig-model-perl en libconfig-model-systemd-perl (in die volgorde, want de eerste twee zijn afhankelijkheden van de laatste). We kunnen uiteraard niet garanderen dat alles dan werkt.

Wil je cme niet alleen op de commandline gebruiken, maar ook in een grafische interface, dan installeer je die met:

sudo apt install libconfig-model-tkui-perl

Als je nu cme list uitvoert, krijg je onder andere configuratiemodellen te zien voor systemd (in de systeemconfiguratie) en systemd-user (in de gebruikersconfiguratie). In de versie van libconfig-model-systemd-perl in Yakkety Yak zit een bug, waardoor cme crasht als het de gebruikersdirectory van systemd wil benaderen en die niet bestaat. Maak daarom eerst die directory aan als je ze nog niet hebt:

mkdir -p ~/.config/systemd/user

Met de volgende opdracht controleer je eenvoudig of de systeemconfiguratie van systemd syntactisch correct is:

 cme check systemd

En hetzelfde voor je gebruikersconfiguratie:

cme check systemd-user

Het is ook mogelijk om je configuratie te bekijken en te bewerken in een grafische interface:

cme edit systemd-user

Je hoeft met deze interface niet zelf na te denken op welke locatie je de bestanden moet zoeken. Je kunt gewoon per service secties en parameters bewerken. Klik daarna in het menu File op save. Heb je liever de commandline, dan open je eenvoudig een shell met:

cme shell systemd-user

De opdracht ls toont bijvoorbeeld service en socket en met cd ga je naar een service, zoals met cd service:glib-pacrunner. Meer info over de parameters en hun inhoud krijg je te zien met ll. Typ help in voor een overzicht van de beschikbare opdrachten. Wijzigingen worden overigens pas doorgevoerd nadat je ze bij het afsluiten van het programma bevestigt. Momenteel ondersteunt het configuratiemodel in cme alleen service, socket en time units van systemd. De ontwikkelaar moedigt gebruikers die meer nodig hebben echter aan om een bug report in te dienen.

Link:

https://github.com/dod38fr/config-model/wiki/Using-cme

Monitor bestanden met watchmedo

Het project watchdog is een Python-bibliotheek en bijbehorende tools om gebeurtenissen in een bestandssysteem te monitoren, zoals het openen of aanmaken van een bestand. Een interessante tool waarmee watchdog komt, is watchmedo, dat shellopdrachten kan uitvoeren als reactie op gebeurtenissen.

Installeer watchdog met: 

pip install watchdog

Met watchmedo –help krijg je de mogelijkheden van het programma watchmedo te zien. Een eenvoudige functie is het naar de console loggen van alle gebeurtenissen in het bestandssysteem in de huidige directory:

watchmedo log 

Je krijgt de gebeurtenissen recursief in de huidige directory te zien met:

watchmedo log –recursive

En je beperkt eenvoudig de uitvoer tot bepaalde bestanden:

watchmedo log –recursive –ignore-directories –patterns=”*.txt;*.html” 

In plaats van een patroon te definiëren van bestanden die watchmedo monitort, kun je het programma ook vragen om alle bestanden te monitoren behalve als ze aan een patroon voldoen. Dat doe je met de optie –ignore-pattern. Nog interessanter is dat je watchmedo willekeurige shellopdrachten kunt laten uitvoeren als reactie op gebeurtenissen in het bestandssysteem. Dat gaat als volgt:

watchmedo shell-command –recursive –ignore-directories –command=’echo “${watch_src_path}”‘

Dit voorbeeld toont niet de volledige informatie over de gebeurtenis, maar alleen het bestand waar iets mee gebeurt. Uiteraard zijn bij –command veel ingewikkelder opdrachten mogelijk. Naast ${watch_src_path} herkent het programma ook de variabelen ${watch_dest_path}, ${watch_event_type} en ${watch_object}. Voor meer informatie over de mogelijkheden, raad ik je aan  de helpfunctie van shell-command te bekijken met watchmedo shell-command –help.

Het interessante aan watchdog is dat het een cross-platform bibliotheek is. Het monitoren van bestandsgebeurtenissen is immers een heel besturingssysteem-specifieke taak. Watchdog abstraheert die verschillende mechanismes, zodat je in je Python-code de details van je besturingssysteem niet hoeft te kennen. Watchdog ondersteunt Linux vanaf versie 2.6 (inotify), macOS (FSEvents, kqueue), FreeBSD (kqueue) en Windows (ReadDirectoryChangesW). Wil je in je Python-programma op bestandsgebeurtenissen reageren, bekijk dan zeker eens de documentatie van watchdog.

Link:

https://github.com/gorakhargosh/watchdog

Doorzoek je logbestanden met lnav

Logbestanden bekijken en doorzoeken kun je met opdrachten zoals less, tail en grep of desnoods door ze in je favoriete editor te openen. Maar voor wat ingewikkeldere zoekopdrachten is dat nogal onoverzichtelijk. In bedrijfsomgevingen heb je voor dit soort taken allerlei servers, bijvoorbeeld logstash of Splunk, maar voor thuisgebruik zijn die overkill. Je wilt niet dat je allerlei serversoftware moet installeren en configureren om wat van je logbestanden te analyseren.

Het ncurses-programma lnav is een mooi alternatief: je start het gewoon met als argument een directory en het programma begint de logbestanden in te laden. Gecomprimeerde logbestanden worden automatisch gedecomprimeerd. En lnav ordent alle log entry’s van de bestanden in één venster op hun tijdstempel, zodat je zelf niet meer verschillende logbestanden naast elkaar hoeft te leggen.

Lnav geeft ook kleuren aan de inhoud van de logbestanden en het herkent diverse logformaten. Zo verschijnen waarschuwingen in het geel en foutmeldingen in het rood, zodat je onmiddellijk de belangrijkste informatie ziet. Met w ga je naar de volgende waarschuwing en shift-w naar de vorige. Met e ga je naar de volgende foutmelding en shift-e naar de vorige. Met d ga je naar de volgende dag en met shift-d naar de vorige.

Zoeken doe je met / en dan een reguliere expressie. Met n en shift-n ga je naar het volgende en vorige zoekresultaat. Maar de krachtigste functionaliteit van lnav is dat je de logbestanden kunt doorzoeken met SQL-query’s. Begin met ; en voer dan een SQL-query in. Zo krijg je met:

;select * from logline

alle log entry’s te zien. Lnav gebruikt SQLite en heeft wat extensies ingevoerd. Bekijk zeker de documentatie voor de mogelijkheden.

Ook zonder SQL kun je al heel wat analyses doen met enkele ingebouwde opdrachten van lnav. Zo toont de opdracht:

:summarize log_procname

een histogram van alle mogelijke waardes van de kolom log_procname. Die namen van de kolommen vind je door in de standaardview op p te drukken. Na de histogramview ga je met q terug naar de standaardview. Met i krijg je een histogram te zien van de activiteit op elke dag, zodat je onmiddellijk ziet op welke dagen de meeste log entry’s, waarschuwingen en foutmeldingen gebeurd zijn. Tot slot filter je met de opdracht:

:filter-in Access denied

de log entry’s op de reguliere expressie Access denied, zodat je eenvoudig ziet op welke momenten die foutmelding voorkwam.

Link:

http://lnav.org/