FaiTemplates

From FAIWiki
Revision as of 23:11, 12 November 2006 by Iw (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Abstract: i've coded a proof of concept on how to use Template-Toolkit, YAML and Hash::Merge. The code in the attachment should demonstrate what i mean. Download it and type

aptitude install libclone-perl libyaml-perl libtemplate-perl
tar xzf FaiTS-0.01.tar.gz
cd FaiTS-0.01/
perl Makefile.PL
make test

If you get lots of errors and a final "All tests successful" then the code should work ...

To see something happen, you can set CLEANUP to 0 in line 27 of the file t/FaiTS.t and then run

make test 

again

If you then type

find -ls

and you'll see the .yml' (YAML) files with config data, .tt ( Template-Toolkit) templates and a target directory with a freshly created etc/network/interfaces file.

Long Version in German, sorry ...

Ich hab diese Woche mal ein wenig gebastelt und drei Ideen in ein kleines Programm eingebaut. Ist im Moment noch mehr ein proof-of-concept, aber ich bin von meiner Idee völlig begeistert  ;-)

1. Template-Toolkit:

========================================================

Templates zu schreiben geht einfacher als Configdateien mit perl & co nachzubearbeiten. Beispiel /etc/network/interfaces:

# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

# The loopback interface
auto lo
iface lo inet loopback

[% FOREACH name = interfaces.keys.sort %]
[% i = interfaces.$name -%]
auto [% name %]
iface [% name %] inet static
        address   [% i.address %]
        netmask   [% i.netmask %]
       [% IF i.network   %] network   [% i.network   %] [% END %]
       [% IF i.broadcast %] broadcast [% i.broadcast %] [% END %]
       [% IF i.gateway   %] gateway   [% i.gateway   %] [% END %] 

[% END %]


2. YAML:

========================================================

Über Shell-Variablen kann man nur flache Datenstrukturen transportieren. Das engt manchmal etwas ein. Z.B. wenn ich die Daten für eine /etc/network/interfaces eines Routers in /class/KLASSE.var unterbringen möchte, muß ich ganz schön Klimmzüge machen. Wahrscheinlich löst man es besser, in dem man dann doch für jeden Router eine eigene Datei /files/etc/network/interfaces/* schreibt.

Mit YAML gibt es ein Dateiformat, für das es in jeder gängigen Skriptsprache einen Parser gibt. Die Informationen für die interfaces Datei könnten dann so aussehen:

interfaces:
  eth0:
    address: 172.16.240.5
    netmask: 255.255.255.0
    network: 172.16.240.0
    broadcast: 172.16.240.255
  eth1:
    address: 192.168.1.5
    netmask: 255.255.255.0
    network: 192.168.1.0
    broadcast: 192.168.1.255
  eth2:
    address: 192.168.1.5
    netmask: 255.255.255.0
    network: 192.168.1.0
    broadcast: 192.168.1.255
    gateway: 212.202.236.177


3. Config-Daten klassenbasiert zusammenführen

==================================

Bei den Variablen in class/*.var ist es einfach sie klassenbasiert zusammenzuführen. Später definierte Klassen überschreiben Variablen von früher definierten Klassen.

Ich dachte erst, bei tiefer strukturierten Daten sei das kompliziert. Isses wahrscheinlich auch, aber das Perl Modul Hash::Merge hat mir die Arbeit abgenommen.