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; |
|