--- a/schema2ldif Mon Oct 21 22:27:11 2013 +0200
+++ b/schema2ldif Mon Oct 21 22:44:49 2013 +0200
@@ -1,44 +1,49 @@
#! /usr/bin/perl
# according
# http://www.zytrax.com/books/ldap/ch6/slapd-config.html#use-schemas
+# © 2013 Heiko Schlittermann <hs@schlittermann.de>
+
use 5.010;
use strict;
use warnings;
+use English qw(-no_match_vars);
use File::Temp;
+our $VERSION = 0.01;
+
my $CORE = '/etc/ldap/schema/core.schema';
-die "$0: $CORE: $!\n" if not -r $CORE;
+die "$PROGRAM_NAME: $CORE: $!\n" if not -r $CORE;
+die "Need schema file\n" if not @ARGV == 1;
+(my $name = $ARGV[0]) =~ s/\.schema$//xms;
my $cf = File::Temp->new();
my $cd = File::Temp->newdir();
-$cf->print(<<_EOF);
+# create a short temp config
+$cf->print(<<"_EOF");
include $CORE
-include ./exim.schema
+include $ARGV[0]
_EOF
-
-close $cf;
-
+close $cf or die "Can't close $cf: $!\n";
+# ... convert it
system slaptest => ( -f => $cf ),
( -F => $cd );
-my $ldif;
-open($ldif, '<', $_ = "$cd/cn=config/cn=schema/cn={1}exim.ldif")
+# slurp the generated file
+open(my $ldif, '<', $_ = "$cd/cn=config/cn=schema/cn={1}$name.ldif")
or die "Can't open $_: $!\n";
-
-$_ = do { local $/ = undef; <$ldif> };
+$_ = do { local $RS = undef; <$ldif> };
+close($ldif) or die "Can't close ldif generated ldif file: $!\n";
-s/\n\s+//gms;
-s/^(?!(olc|dn|objectClass|cn)).*?\n//msg;
-s/(?<=^dn: cn=){\d+}(\w+)/$1,cn=schema,cn=config/ms;
-s/(?<=^cn: ){\d+}//msg;
+# some modifications
+s/\n\s+//xgms;
+s/^(?!(?:olc|dn|objectClass|cn)).*?\n//xmsg;
+s/(?<=^dn:\scn=){\d+}(\w+)/$1,cn=schema,cn=config/xms;
+s/(?<=^cn:\s){\d+}//xmsg;
-open($ldif, '>', 'exim.ldif')
- or die "Can't open > exim.ldif: $!\n";
-$ldif->print(<<__);
-# autogenerated by $0
-# do not edit, edit exim.schema instead
+print <<"__", $_;
+# autogenerated by $PROGRAM_NAME
+# do not edit, edit $name.schema instead
+# see https://ssl.schlittermann.de/hg/exim-ldap-schema
__
-$ldif->print($_);
-close $ldif;