schema2ldif
changeset 5 b6923b230915
parent 4 5b0accae98a7
child 7 41c5575ed210
equal deleted inserted replaced
4:5b0accae98a7 5:b6923b230915
     1 #! /usr/bin/perl
     1 #! /usr/bin/perl
     2 # according
     2 # according
     3 # http://www.zytrax.com/books/ldap/ch6/slapd-config.html#use-schemas
     3 # http://www.zytrax.com/books/ldap/ch6/slapd-config.html#use-schemas
       
     4 # © 2013 Heiko Schlittermann <hs@schlittermann.de>
       
     5 
     4 use 5.010;
     6 use 5.010;
     5 use strict;
     7 use strict;
     6 use warnings;
     8 use warnings;
       
     9 use English qw(-no_match_vars);
     7 use File::Temp;
    10 use File::Temp;
       
    11 
       
    12 our $VERSION = 0.01;
     8 
    13 
     9 my $CORE = '/etc/ldap/schema/core.schema';
    14 my $CORE = '/etc/ldap/schema/core.schema';
    10 
    15 
    11 die "$0: $CORE: $!\n" if not -r $CORE;
    16 die "$PROGRAM_NAME: $CORE: $!\n" if not -r $CORE;
       
    17 die "Need schema file\n" if not @ARGV == 1;
    12 
    18 
       
    19 (my $name = $ARGV[0]) =~ s/\.schema$//xms;
    13 my $cf = File::Temp->new();
    20 my $cf = File::Temp->new();
    14 my $cd = File::Temp->newdir();
    21 my $cd = File::Temp->newdir();
    15 
    22 
    16 $cf->print(<<_EOF);
    23 # create a short temp config
       
    24 $cf->print(<<"_EOF");
    17 include $CORE
    25 include $CORE
    18 include ./exim.schema
    26 include $ARGV[0]
    19 _EOF
    27 _EOF
    20 
    28 close $cf or die "Can't close $cf: $!\n";
    21 close $cf;
    29 # ... convert it
    22 
       
    23 system slaptest => ( -f => $cf ),
    30 system slaptest => ( -f => $cf ),
    24 		   ( -F => $cd );
    31 		   ( -F => $cd );
    25 
    32 
    26 my $ldif;
    33 # slurp the generated file
    27 open($ldif, '<', $_ = "$cd/cn=config/cn=schema/cn={1}exim.ldif")
    34 open(my $ldif, '<', $_ = "$cd/cn=config/cn=schema/cn={1}$name.ldif")
    28     or die "Can't open $_: $!\n";
    35     or die "Can't open $_: $!\n";
       
    36 $_ = do { local $RS = undef; <$ldif> };
       
    37 close($ldif) or die "Can't close ldif generated ldif file: $!\n";
    29 
    38 
    30 $_ = do { local $/ = undef; <$ldif> };
    39 # some modifications
       
    40 s/\n\s+//xgms;
       
    41 s/^(?!(?:olc|dn|objectClass|cn)).*?\n//xmsg;
       
    42 s/(?<=^dn:\scn=){\d+}(\w+)/$1,cn=schema,cn=config/xms;
       
    43 s/(?<=^cn:\s){\d+}//xmsg;
    31 
    44 
    32 s/\n\s+//gms;
    45 print <<"__", $_;
    33 s/^(?!(olc|dn|objectClass|cn)).*?\n//msg;
    46 # autogenerated by $PROGRAM_NAME
    34 s/(?<=^dn: cn=){\d+}(\w+)/$1,cn=schema,cn=config/ms;
    47 # do not edit, edit $name.schema instead
    35 s/(?<=^cn: ){\d+}//msg;
    48 # see https://ssl.schlittermann.de/hg/exim-ldap-schema
    36 
       
    37 open($ldif, '>', 'exim.ldif') 
       
    38     or die "Can't open > exim.ldif: $!\n";
       
    39 $ldif->print(<<__);
       
    40 # autogenerated by $0
       
    41 # do not edit, edit exim.schema instead
       
    42 __
    49 __
    43 $ldif->print($_);
       
    44 close $ldif;