Open Source im professionellen Einsatz

Filter gegen Trommelfeuer

Neben der Zuordnung der Buddies zu den Geräuschen unter dem Eintrag »sound_map« setzt die YAML-Datei auch noch den Parameter »interval«, damit das System nicht bei jeder eintrudelnden Nachricht ein Geräusch abspielt. Steht »interval« auf 60, ist die Mindestzeitspanne zwischen zwei Geräuscheinspielungen 60 Sekunden. Kommen in diesem Zeitraum mehrere Nachrichten an, unterdrückt das System das abzuspielende Geräusch, denn schließlich soll der arme User kein akustisches Trommelfeuer ertragen, sondern arbeiten.

YAML-Daten lassen sich eins zu eins in Perl importieren, die Funktion »LoadFile()« aus dem YAML-Modul wandelt sie in die in Abbildung 4 gezeigte Struktur um. In dem darauf folgenden Schritt steht nun die Konvertierung der Daten in aufgeblähtes XML an.

Abbildung 4: Mit »LoadFile()« eingelesen ergeben die YAML-Daten aus der Abbildung 3 diese Datenstruktur in Perl.

Abbildung 4: Mit »LoadFile()« eingelesen ergeben die YAML-Daten aus der Abbildung 3 diese Datenstruktur in Perl.

Von YAML nach XML

Das von Pidgin verwendete XML-Format (Abbildung 2) definiert für jeden Pounce ein Konstrukt, das in »<pounce>«-Tags eingeschlossen ist. Die Gesamtheit aller dieser Tags steht innerhalb eines Sammel-Tags mit dem Namen »<pounces>«. Dies ist einfach mittels Reverse Engineering herauszufinden, in dem man mehrere Pounces mit Pidgins grafischer Oberfläche definiert und anschließend die automatisch neu geschriebene XML-Datei inspiziert.

Das Skript »pounce-yml-to-xml« in Listing 1 wandelt nun die kompakte YAML-Datei in Abbildung 3 in ausführliche XML-Instruktionen für Pidgin um, die es anschließend in »~/.purple/pounces.xml« speichert. Die For-Schleife ab Zeile 17 iteriert über die Einträge im »sound_map«-Hash der YAML-Datei, die allesamt im Format »protocol:account« vorliegen. Darunter befindet sich ein weiterer Hash, der den Onlinepartnern (Buddies) Geräusche zuordnet.

Listing 1:
»pounce-yml-to-xml«

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Sysadm::Install qw(:all);
04
05 use YAML qw(LoadFile);
06 use Template;
07
08 my($home) = glob "~";
09 my $path = "$home/.pidgin-pounce";
10 my $yaml = LoadFile( "$path/pounce.yml" );
11
12 my $xml_file = "$home/.purple/pounces.xml";
13 my $SOUND_CMD = "~/bin/pounce-sound";
14
15 my @pounces = ();
16
17 for my $account (
18 keys %{ $yaml->{sound_map} }) {
19
20 my($proto, $recv) = spl it /:/, $account;
21
22 for my $buddy (keys %{
23 $yaml->{sound_map}->{$account} }) {
24
25 push @pounces,
26 mk_pounce($buddy, $recv, $proto);
27 }
28 }
29
30 binmode STDOUT, ":utf8";
31
32 my $xml = q{
33 <?xml version='1.0' encoding='UTF-8' ?>
34 <pounces version='1.0'>
35 [% FOR pounce IN pounces %]
36 [% pounce %]
37 [% END %]
38 </pounces>
39 };
40
41 my $tmpl = Template->new();
42
43 mv $xml_file, "$xml_file.old" if
44 -f $xml_file;
45
46 $tmpl->process( $xml,
47 { pounces => @pounces },
48 $xml_file ) or die $tmpl->error;
49
50 ###########################################
51 sub mk_pounce {
52 ###########################################
53 my($buddy, $recv, $prot) = @_;
54
55 return qq{
56 <pounce ui='gtk-gaim'>
57 <account
58 protocol='prpl-$prot'>$recv</account>
59 <pouncee>$buddy</pouncee>
60 <options/>
61 <events>
62 <event type='sign-on'/>
63 <event type='message-received'/>
64 </events>
65 <actions>
66 <action type='execute-command'>
67 <param name='command'
68 >$SOUND_CMD $prot:$recv $buddy</param>
69 </action>
70 </actions>
71 <save/>
72 </pounce>
73 }
74 }

Die Keys-Funktion gibt eine Liste dieser Partner zurück. Zeile 26 ruft für jeden die ab Zeile 51 definierte Funktion »mk_pounce()« auf. Als Parameter erhält sie den Namen des Buddy, den Namen des Accounts (»recv« genannt, weil dieser später Nachrichten von den Buddies empfängt) sowie das verwendete Protokoll (»yahoo«, »aim« oder dergleichen). Die Funktion gibt dann jeweils einen XML-String zurück, der einem Eintrag in Pidgins Konfigurationsdatei »pounces.xml« entspricht.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook