fusiondirectory-insert-schema 12.62 KiB
#!/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";