In einem vorherigen Artikel habe ich beschrieben, wie man ein eigenes LDAP-Schemas erstellen kann [1]. Im letzten Schritt muss dabei die von slaptest erzeugte LDIF-Datei von Hand angepasst werden. Diesen Vorgang habe ich mittlerweile durch ein sed Skript autmatisiert. Geholfen hat mir dabei die Vorlage von Vishal Goenka [2]. Neben dem Einfügen von Kommentaren wurde das Skript noch ergänzt, damit alle von OpenLDAP eingefügten Nummerierungen und unnötigen Zeilen am Schluss entfernt werden. Als sed-Neuling haben mit dabei folgende Webseiten weitergeholfen:
- Dokumentation von gnu sed [3] insbesondere Kapitel 3 [4]
- Einführung in sed von Linux für alle [5]
- Ausgabe von Text zwischen zwei Wörtern [6]
- Ersetzen von Text über mehrere Zeilen hinweg mit sed [7]
Nach Aufrufen des Skriptes von der Shell mit
unldif.sed original_cn_config_file.ldif > modified_cn_config_file.ldif
muss man lediglich noch wie gehabt die erste Zeile mit dn anpassen, die sich von Fall zu Fall unterscheiden kann. Zum Schluss nun das Skript:
#!/bin/sed -nf
# Disclaimer and Terms: You may use these scripts for commercial or
# non-commercial use at your own risk, as long as you retain the
# copyright statements in the source code. These scripts are provided
# "AS IS" with no warranty whatsoever and are FREE for as long as you
# want to use them. You can edit and adapt them to your requirements
# without seeking permission from me. I only ask that you retain the
# credits where they are due.
#
# Adapted by Markus Effinger <blog[at-nospam]effinger.org>
#
# Original Author: Vishal Goenka <vgoenka@hotmail.com>
#
# Unfold LDIF (LDAP Data Interchange Format) lines for scheme files
# Version 1.0
#
# Usage: unldif.sed <ldif file>
# or
# cat <ldif file> | unldif.sed
# and if /usr/bin/sed is not available,
# sed -nf unldif.sed <ldif file>
#
# Most LDIF generators will fold a long field on multiple lines by
# inserting a line separator (either a linefeed or carriage
# return/linefeed pair) followed by a space. Processing such ldif
# files through another script becomes much easier if such lines were
# unfolded. That is exactly what this script does. It unfolds ldif
# entries that are folded (broken) across lines and writes them on a
# single line.
#
# This Line
# Replace any "{2}" numbering that was added by slaptest
s/\(^[^:]*: \){[^}]*}\(.*\)$/\1\2/;
{
# Append first line to hold space and
# put the next line into the pattern space
1{
h;
n;
};
# Delete anything after structuralObjectClass
/^structuralObjectClass/,$ {
# These commands get run for each line after
# structuralObjectClass - Therefore we have to make
# sure, that the hold buffer gets only printed once
# Get content from hold buffer to pattern buffer
g;
# Remove a newline followed by a space
s/\n //;
# Print the pattern buffer if not empty
/^$/!p;
# Make pattern buffer empty and save in hold buffer
s/^.*$//;
h;
# Continue with next line
d;
};
# If line starts not with space
/^ /!{
# Append a newline to the hold space and add the current line
H;
# Replace the content of the pattern space with the hold space
g;
# Print the first line of the pattern space
# Delete everything after the first line in the pattern space
# and print the rest (first line)
s/\n.*//p;
# Fill the pattern space again with the hold space
g;
# Delete the first line which has just been printed
s/.*\n//;
# Put the result in the hold space
h;
};
/^ /{
# Append a newline to the hold space and add the current line
H;
# Replace the content of the pattern space with the hold space
g;
# Remove a newline followed by a space
s/\n //;
# Write the result to hold space
h;
};
${
# Replace the content of the pattern space with the hold space
g;
# Remove a newline followed by a space
s/\n //;
# Print the result
p;
};
};