About

KDialog

Iedereen maakt op zijn tijd wel eens een shell script om iets te automatiseren. Shell scripts zijn eenvoudig te programmeren. Het zijn min of meer een aantal commando regels achter elkaar. De achilleshiel van shell scripts is het gebruikersinterface. Tegenwoordig verwacht iedereen toch wel iets van een grafisch (aantrekkelijk) interface. Dat is nou net het punt waar shell scripts niet in uitblinken.

Arjan ten Hoopen

Maar niet getreurd: er is hulp onderweg. Om heel eerlijk te zijn is het er al een hele tijd, waarom het altijd zo onderbelicht is gebleven is een raadsel. Ik heb het namelijk over KDialog. KDialog is onderdeel van KDE Applicaties. Het geeft de shell script programmeur, dus jij en ik, de mogelijkheid om interactie met de eindgebruiker te hebben op een grafisch aantrekkelijke manier. En het is ook nog eens extreem eenvoudig. Dus op naar je package manager en installeer KDialog en de bijbehorende vertalingen.

Help

De makkelijkste manier om te weten te komen wat KDialog kan is via kdialog –help maar de leukste manier is om te experimenteren. Probeer eens (op de commandoregel)  kdialog –msgbox “Hallo Wereld!”of kdialog –sorry “Volgende keer beter”. Deze twee hebben ook nog een “Fout” broertje: kdialog –error “Foutje bedankt!” 

Maar naast vensters met een enkele regel kun je ook vensters maken waar tekstbestanden in weer gegeven kunnen worden: kdialog –textbox /etc/hosts. Als je ook controle wilt over de afmetingen van de tekstbox, geef deze dan op als aparte argumenten:kdialog –textbox /etc/hosts 600 300

Maar wat nu als je niet iets vertellen wilt maar wat wilt vragen. Bijvoorbeeld een wachtwoord; kdialog –password “Geef het Wachtwoord” hier wordt om een wachtwoord gevraagd maar creëert meteen weer nieuwe uitdagingen. Hoe weet ik op welke toets getoetst is (OK of Annuleren) en waar blijft het wachtwoord dat ingegeven is? Blijkt heel simpel te zijn, het ingetoetste wachtwoord gaat naar stdout en met behulp van de returncode (in de variabele $?) kun je achterhalen op welke toets getoetst is.  Dit geeft in de basis twee mogelijke programmeer oplossingen. Het antwoord, in dit geval het wachtwoord, kun je opvangen in een variabele (Listing 1) of in een bestand (Listing 2).

Om het wat gebruikersvriendelijker te maken kun je het venster ook nog een titel geven met de –title  optie: kdialog –title “Betreden Beveiligde Omgeving” –password “Geef het Wachtwoord”

Zoals je bij een wachtwoord verwacht kun je de ingetoetste karakters niet lezen. Maar je zult ook wel invoer vragen waarbij dit niet belangrijk is. Je wilt bijvoorbeeld de drempelwaarde weten voor een bepaalde instelling: kdialog –title “Drempelwaarde” –inputbox “Wat moet de drempelwaarde zijn voor alarmering?”. Je kunt ook nog een voor ingestelde waarde meegeven: kdialog –title “Drempelwaarde” –inputbox “Wat moet de drempelwaarde zijn voor alarmering?” “21”

In al deze vensters kon de gebruiker kiezen uit twee knoppen namelijk OK en Annuleren. Maar vaak wil je ook andere opties, bijvoorbeeld Ja en Nee knoppen; kdialog –title “Disk Full” –yesno “Disk Full detectie inschakelen?” Of een Ja en Nee melding met een waarschuwingsteken: kdialog –title “Disk Full” –warningyesno “Disk full gedetecteerd, geautomatiseerd opruimen?”

Wie weet wil je verifiëren of de gebruiker door wil gaan of het “huidige” proces wil afbreken: kdialog –title “Proces Instelling” –warningcontinuecancel “Doorgaan met root permissies?” of misschien met Ja, Nee, Annuleren: kdialog –title “Database opschonen” –yesnocancel “Inhoud van de database opschonen?” Door –yesnocancel te vervangen door –warningyesnocancel krijg je er ook nog een waarschuwingsteken bij.

Na verloop van tijd raak je vanzelf bedreven in het schrijven van shell scripts. Je zult dan mogelijk ook kdialog in “loopjes” gaan gebruiken. Het kan dan zijn dat de gebruiker, wanneer die eenmaal in zo’n loopje terecht is gekomen, heel vaak “hetzelfde” venster (van kdialog) te zien krijgt. Dat kan doordat bijvoorbeeld een bepaalde actie (steeds) mislukt. KDialog geeft je de mogelijkheid om dergelijke repeterende meldingen te onderdrukken. Dit gebeurt door middel van de –dontagain optie. Deze optie heeft twee argumenten; een bestandsnaam en een “entry” naam.

Een voorbeeld; stel je hebt een script (genaamd setupscript) gemaakt die een serie van instellingsbestanden doorloopt. Echter bij het uitvoeren gaat het een beetje fout, steeds kan het gevraagde instellings bestand niet gevonden worden. Een kdialog met de melding dat het gevraagde bestand niet gevonden kan worden ligt dan voor de hand: kdialog –msgbox “Instellingen Bestand niet gevonden” maar die krijg je dan heel vaak.

Met –dontagain los je dit op: kdialog –dontagain setupscript:nofilemsg –msgbox “Instellingen Bestand niet gevonden” De twee argumenten die dontagain verwacht zijn een bestandsnaam, mogelijk is de bestandsnaam van je script een goede kandidaat. En het “entry” point is het label van de kdialog die niet steeds herhaald moet worden (in dit voorbeeld “nofilemsg”). Je kunt ze beide vrij kiezen. Blijft alleen de vraag over, hoe wordt het onthouden?

In ~/.config zal (automatisch) een bestand gemaakt worden met de naam van het opgegeven bestand (in dit geval setupscript). In dit bestand wordt opgeslagen of de kdialog behorende bij het “entry” punt nogmaals weergegeven moet worden (zie Listing 3). Let op, de tweede keer dat je het script (hier setupscript) doorloopt zal het gedrag zijn zoals aangeven in het opgeslagen bestand (~/.config/setupscript). Dus mogelijk geen melding! Voor een nette afhandeling en goede gebruikers ervaring is het verstandig dit bestand weg te gooien als een van de eerste acties in je script (setupscript) zodat altijd met een schone lei wordt begonnen.

We weten nu hoe we de gebruikers informatie kunnen geven en vragen, maar wat als we de gebruiker een keuze willen laten maken.

Simpel, gebruik een menu: kdialog –menu “Selecteer Mail Client Setup:” k “KMail” t “Thunderbird” m “Mailspring”. Naar stdout zal het karakter voorafgaande aan de optie die je gekozen hebt verzonden worden. En zoals we al eerder besproken hebben zal de returncode aangeven of op OK of Annuleren getoetst is. Heb je liever een checklist dan kan dat ook: kdialog –checklist “Selecteer Mail Client Setup:” k “KMail” on t “Thunderbird” off m “Mailspring” off. Met “on” en “off” geef je de initiële status weer. De gebruiker kan vervolgens 1 of meerde items selecteren. Naar stdout zullen alle geselecteerde (“on”) items, of beter, het karakter voor het item, verzonden worden. Wil je liever dat elk geselecteerd item op een aparte regel naar stdout wordt verzonden, voeg dan de optie –seperate-output toe.

Toch liever een “radio” lijst? Geen probleem, verander in bovenstaand voorbeeld –checklist in –radiolist en klaar is Kees. Let wel op, bij een check lijst kun je meerdere items kiezen, bij een radio lijst slechts één.

Doe eens gek, ga voor een combobox: kdialog –combobox “Selecteer je Mail Client:” “KMail” “Thunderbird” “Mailspring” . Bij een combobox wordt geen gebruik gemaakt van selectie karakters. Het gekozen item wordt verzonden naar stdout.

In shell scripts moet de gebruiker mogelijk ook een bestand selecteren om te openen. Dit kan ook met kdialog. Er zijn twee alternatieven, de ervaring voor de gebruiker is hetzelfde alleen de wijze waarop het geselecteerde bestand aan het script wordt terug gegeven is verschillend. De twee alternatieven zijn kdialog –getopenfilename /etc en kdialog –getopenurl /etc (zie Listing 4) In beide gevallen wordt een Open dialoog venster geopend waarbij het argument (hier /etc) gebruikt wordt als startmap. De naam van het geselecteerde bestand (of url) wordt op stdout terug gegeven.

Mogelijk moet er ook een bestand worden opgeslagen, dit gaat met –-getsavefilename en –-getsaveurl. Deze zullen beide een “Opslaan als” dialoog venster openen en zijn verder gelijkwaardig aan –-getopenfilename en –getopenurl.

Je kunt ook vragen naar een (bestaande) map:  kdialog –getexistingdirectory /etc Het laatste argument geeft een voorgeselecteerde map aan. Is deze niet opgegeven dan wordt de huidige map genomen.

Stel dat je een script hebt dat het nodige moet doen, en dat dat nog al wat tijd kost. Om de gebruiker te informeren dat het script nog steeds loopt, en de gebruiker dus niet in paniek hoeft te raken, is het verstandig om een indicatie op het scherm te projecteren. Ook dit kan met kdialog, je gebruikt hiervoor de optie –progressbar. Alleen voor dit trucje heeft kdialog een beetje hulp nodig van qdbus. In Listing 5 vind je de voorbeeld code.

Laten we er even doorheen lopen. We beginnen met het makkelijkste; overal waar sleep 2 staat komt natuurlijk je code te staan die “veel” tijd nodig heeft. In de eerste regel roepen we kdialog aan met een tekstregel om weer te geven in het voortgangs venster. De voortgang gaan we aangeven in 4 stappen. De returncode van kdialog vangen we op in een variabele genaamd dbusRef (maar je mag elke mogelijk naam kiezen). De volgende regel zet de voortgang op 1 (van 4) en de derde regel zet er een duidelijke tekst bij. Dan volgt een sleep 2. Hier zou dus normaal gesproken code staan die behoorlijk tijd consumerend is. Vervolgens herhalen we dit trucje een aantal malen. We passen steeds de tekst aan zodat de gebruiker een duidelijke indicatie krijgt waar het systeem mee bezig is. De laatste regel sluit het dialoogvenster. Op deze manier kun je dus met kdialog een duidelijke voortgangsindicatie maken.

Alle bovenstaande voorbeelden pakken in de gebruikersinterface de “focus”. Met andere woorden; het wordt het actieve venster. Je kunt ook “popups” maken die geen “focus” pakken. Dit doe je met de optie –passivepopup plus een getal dat aangeeft hoelang het zichtbaar moet zijn (in seconden): kdialog  –title “Configuratie Check” –passivepopup “NFS configuratie controle wordt uitgevoerd” 10

Hopelijk heb je na het lezen van dit artikel (hernieuwde) belangstelling gekregen voor shell scripts. Veel plezier met het maken van shell scripts, en maak er wat “moois” van!

 

LISTING 1

wachtwoord=$(kdialog --password "Geef het wachtwoord")
if [ $? = 0 ] ; then
echo "OK geselecteerd"
else
echo "Annuleren geselecteerd"
fi
echo ${wachtwoord}

LISTING 2

kdialog --password "Geef het wachtwoord" > wachtwoord.txt
if [ $? = 0 ] ; then
echo "OK geselecteerd"
else
echo "Annuleren geselecteerd"
fi
cat wachtwoord.txt

LISTING 3
arjan@arjanpc:~> cat ~/.config/setupscript
[Notification Messages]
nofilemsg=false
arjan@arjanpc:~>

LISTING 4

arjan@arjanpc:~> kdialog --getopenfilename /etc
/etc/autofs.conf
arjan@arjanpc:~> kdialog --getopenurl /etc
file:///etc/autofs.conf
arjan@arjanpc:~>

LISTING 5

dbusRef=`kdialog --progressbar "Systeem Instellingen Verificatie" 4`
qdbus $dbusRef Set "" value 1
qdbus $dbusRef setLabelText "Controle Mail server instellingen..."
sleep 2
qdbus $dbusRef Set "" value 2
qdbus $dbusRef setLabelText "Controle van de Bestandssystemen..."
sleep 2
qdbus $dbusRef Set "" value 3
qdbus $dbusRef setLabelText "Controle Netwerk Instellingen..."
sleep 2
qdbus $dbusRef Set "" value 4
qdbus $dbusRef setLabelText "Systeem Instellingen geverifieerd"
sleep 2
qdbus $dbusRef close

 

Share
December 2024
January 2025
No event found!

Related Topics