FaiTemplates: Difference between revisions

From FAIWiki
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 1: Line 1:
Abstract: i've coded a proof of concept on how to use Template-Toolkit,
Abstract: i've coded a proof of concept on how to use Template-Toolkit,
YAML and Hash::Merge. The code in the attachment should
YAML and Hash::Merge. The code in the attachment should
demonstrate what i mean. Download it and type
demonstrate what i mean. [[Image:FaiTS-0.01.tar.gz|Download]] it and type


  aptitude install libclone-perl libyaml-perl libtemplate-perl
  aptitude install libclone-perl libyaml-perl libtemplate-perl

Revision as of 23:16, 12 November 2006

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. File:FaiTS-0.01.tar.gz 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.