-
Côme Chilliet authoredbc703d93
#!/usr/bin/perl
########################################################################
#
# fusiondirectory-insert-schema
#
# Manipulate and insert the needed schema into the ldap server
#
# This code is part of FusionDirectory (http://www.fusiondirectory.org/)
# Copyright (C) 2011-2015 FusionDirectory
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
#
########################################################################
use strict;
use warnings;
use 5.008;
my $ldap_host_options = '-Y EXTERNAL -H ldapi:///';
my $path = "/etc/ldap/schema/fusiondirectory/";
my $full_cmd = "";
my $schema2ldif = "schema2ldif";
my $listschemas = 0;
my $modify = 0;
my $schemalist = 0;
my $yes_flag = 0;
my $pathunset = 1;
my $continue = 0;
my @schemas = ();
my @gen_files = ();
my $delete_ldif = 1;
foreach my $arg ( @ARGV ) {
if (not defined $ldap_host_options) {
$ldap_host_options = $arg;
} elsif ((lc($arg) eq '-i') || (lc($arg) eq '--insert')) {
if ($schemalist) {
usage();
}
$schemalist = 1;
} elsif ((lc($arg) eq '-l') || (lc($arg) eq '--list')) {
$listschemas = 1;
} elsif ((lc($arg) eq '-c') || (lc($arg) eq '--continue')) {
$continue = 1;
} elsif ((lc($arg) eq '-e') || (lc($arg) eq '--empty')) {
if ($schemalist) {
usage();
}
$modify = 2;
$schemalist = 1;
} elsif ((lc($arg) eq '-m') || (lc($arg) eq '--modify')) {
if ($schemalist) {
usage();
}
$modify = 1;
$schemalist = 1;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
} elsif ((lc($arg) eq '-o') || (lc($arg) eq '--options')) {
undef $ldap_host_options;
} elsif ((lc($arg) eq '-n') || (lc($arg) eq '--nodelete')) {
$delete_ldif = 0;
} elsif ((lc($arg) eq '-y') || (lc($arg) eq '--yes')) {
$yes_flag = 1;
} elsif ((lc($arg) eq '-h') || (lc($arg) eq '--help')) {
usage();
} elsif ($schemalist) {
if ($arg =~ /(.*).ldif/) { # ignore ".ldif" if it is there
push @schemas, $1;
} elsif ($arg =~ /(.*).schema/) {
if (system("$schema2ldif $arg > $1.ldif") == 0) {
push @schemas, $1;
push @gen_files, $1;
} else {
die_with_error("Something went wrong while trying to convert $arg to ldif\n");
}
} else {
push @schemas, $arg;
}
} elsif ($pathunset) {
$path = $arg."/";
$pathunset = 0;
} else {
usage();
}
}
# if --options is used with no value
usage () if (not defined $ldap_host_options);
# die if user is not "root"
die_with_error ("! You have to run this script as root\n") if ($<!=0);
my $add_cmd = "ldapadd $ldap_host_options -f ";
my $mod_cmd = "ldapmodify $ldap_host_options -f ";
my $ldapsearch = "ldapsearch $ldap_host_options ";
my $search_cmd = $ldapsearch." -b \"cn=schema,cn=config\" cn={*}";
my $list_cmd = $search_cmd."* cn 2>/dev/null";
my $cnconfig_cmd = $ldapsearch." -b \"cn=config\" cn=config dn 2>/dev/null | grep dn:";
if ($listschemas) {
list_schemas();
exit 0;
}
# die if the path doesn't exists
die_with_error ("! $path doesn't seems to exists\n") if (!-e $path);
#die if we are not in cn=config
my $cnconfig = `$cnconfig_cmd`;
if (!($cnconfig =~ m/^dn:\s*cn=config$/)) {
die_with_error ("! This tool is only intended to be with with a cn=config backend, cn=config could not be found in the LDAP");
}
if (scalar(@schemas) == 0) {
if ($modify == 2) {
usage("Missing schema list for -e option\n");
}
# insert the default schemas
@schemas = ("core-fd","core-fd-conf","ldapns","template-fd");
foreach my $schema (@schemas) {
if (system("$schema2ldif $path$schema.schema > $path$schema.ldif") == 0) {
push @gen_files, $path.$schema;
} else {
die_with_error ("Something went wrong while trying to convert $path$schema.schema to ldif\n");
}
}
} elsif ($pathunset) {
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
$path = "";
}
if ($modify == 2) {
unless (ask_yn_question("Are you sure you want to empty schema(s) ".join(", ",@schemas)."?"))
{
die_with_error("Aborting…\n");
}
}
$continue++; # activating continue feature only for insertions
foreach my $schema (@schemas) {
my $schema_name = "";
if ($modify < 2) {
# Searching schema name in ldif file first line.
open FILE, '< '.$path.$schema.".ldif" or die "Count not open ldif file : $!\n";
my $dn = "";
while ($dn eq "") {
chomp($dn = <FILE>);
}
if ($dn =~ /^dn: cn=([^,]+),/) {
$schema_name = $1;
}
close(FILE);
}
# Fallback on file name
if ($schema_name eq "") {
$schema_name = $schema;
$schema_name =~ s|^.*/||;
}
insert_schema($schema, $schema_name);
}
remove_ldifs();
sub insert_schema
{
my($schema, $schema_name) = @_;
$full_cmd = $search_cmd.$schema_name." cn";
print ("\n");
my $search = `$full_cmd`;
if ($search !~ /# numEntries: 1/m) {
if ($modify) {
print "$schema_name does not exists in the LDAP, skipping…\n";
} else {
# if the schema doesn't already exists in the LDAP server, adding it
$full_cmd = $add_cmd.$path.$schema.".ldif";
print "executing '$full_cmd'\n";
if (system ($full_cmd) != 0) {
die_with_error ("Insertion failed!\n");
}
}
} else {
if ($modify) {
if ($search !~ m/dn: ([^,]+),cn=schema,cn=config/) {
print "Could not parse existing dn for $schema_name, skipping…\n";
return;
}
my $dn_part = $1;
# if the schema already exists in the LDAP server, modify it
if ($modify == 1) {
open(SCHEMA, "<".$path.$schema.".ldif") or die_with_error('Could not open '."<".$path.$schema.".ldif: $!");
open(UPDATE, ">".$path.$schema."_update.ldif") or die_with_error('Could not open '.">".$path.$schema."_update.ldif: $!");
push @gen_files, $path.$schema."_update";