Sophie

Sophie

distrib > Mageia > 5 > i586 > media > core-release > by-pkgid > c031e6b4ec62ed509c3c4c8e7bf7c57d > files > 7

fusiondirectory-plugin-asterisk-1.0.8.1-5.mga5.noarch.rpm

#!/usr/bin/perl

#######################################################################
#
# fusiondirectory-insert-schema -- insert schema needed into the ldap server
#
# Copyright (C) 2011-2013 FusionDirectory project
#
# 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, see <http://www.gnu.org/licenses/>
#
#######################################################################

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 $pathunset   = 1;
my @schemas     = ();
my @gen_files   = ();
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 '-m') || (lc($arg) eq '--modify')) {
    if ($schemalist) {
      usage();
    }
    $modify = 1;
    $schemalist = 1;
  } elsif ((lc($arg) eq '-o') || (lc($arg) eq '--options')) {
    undef $ldap_host_options;
  } 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) {
  # insert the default schemas
  @schemas = ("samba","core-fd","core-fd-conf","ldapns","recovery-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) {
  $path = "";
}

foreach my $schema (@schemas) {
  my $schema_name = "";

  # 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
      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";
      my $attrs   = 0;
      my $classes = 0;
      while (<SCHEMA>) {
        next if m/^#/; # remove comments
        chomp;
        next if m/^$/; # remove empty lines
        if (m/^dn: cn=([^,]+),cn=schema,cn=config$/) {
          print UPDATE "dn: $dn_part,cn=schema,cn=config\n";
          print UPDATE "changetype: modify\n";
          next;
        }
        if (!m/^olcAttributeTypes:/ && !m/^olcObjectClasses:/ && !m/^ /) {
          #skip cn, objectClass, …
          next;
        }

        if (!$attrs && $classes) {
          die "Malformed schema\n";
        }

        if (!$attrs && m/^olcAttributeTypes:/) {
          $attrs = 1;
          print UPDATE "replace: olcAttributeTypes\n";
        }
        if (!$classes && m/^olcObjectClasses:/) {
          $classes = 1;
          print UPDATE "-\n";
          print UPDATE "replace: olcObjectClasses\n";
        }

        print UPDATE;
        print UPDATE "\n";
      }
      close SCHEMA;
      close UPDATE;
      $full_cmd = $mod_cmd.$path.$schema."_update.ldif";
      print "executing '$full_cmd'\n";
      if (system ($full_cmd) != 0) {
        die_with_error ("Insertion failed!\n");
      }
    } else {
      print "$schema_name already exists in the LDAP, skipping…\n";
    }
  }
}

sub remove_ldifs
{
  foreach my $file (@gen_files) {
    unlink "$file.ldif" or print "Could not delete $file.ldif\n";
  }
}

sub die_with_error
{
  my ($error) = @_;
  remove_ldifs();
  die $error;
}

sub list_schemas
{
  my @schemas = `$list_cmd`;
  foreach my $schema (@schemas) {
    if ($schema =~ m/cn:\s*{[0-9]+}(.*)$/) {
      print "$1\n";
    }
  }
}

sub usage
{
  (@_) && print STDERR "\n@_\n\n";

  print STDERR << "EOF";
 usage: $0 [-h] [-l] [-o options] [path] [-i|-m schema1 schema2 …]

  -h, --help    : this (help) message
  path          : where to find the schemas
  -i, --insert  : specify the schemas to insert
  -l, --list    : list inserted schemas
  -m, --modify  : modify exising inserted schemas
  -o, --options : set ldap options used (default is -Y EXTERNAL -H ldapi:///)

EOF
  exit -1;
}

exit 0;

=head1 NAME

fusiondirectory-insert-schema - insert schema needed by FusionDirectory into the ldap server

=head1 SYNOPSIS

fusiondirectory-insert-schema [<path of your schema files>] [-l] [-i|-m schema1 schema2]

=head1 DESCRIPTION

This program will insert the schema needed by FusionDirectory into the ldap server
If -i is specified, insert the given list of schemas instead of the default list
If -m is specified, insert the given list of schemas, replacing already inserted versions of those schemas
If -l is specified, list inserted schemas

=head1 EXAMPLES

 fusion@catbert$ fusiondirectory-insert-schema
   Insert the core schemas in your LDAP directory

 fusion@catbert$ fusiondirectory-insert-schema -i /etc/ldap/otherschema/myschema.ldif
   Insert the schema /etc/ldap/otherschema/myschema.ldif

 fusion@catbert$ fusiondirectory-insert-schema -i /etc/ldap/otherschema/myschema.schema
   Convert /etc/ldap/otherschema/myschema.schema to ldif and insert it

 fusion@catbert$ fusiondirectory-insert-schema -i myschema
   Insert the schema myschema.ldif from working directory

 fusion@catbert$ fusiondirectory-insert-schema -m /etc/ldap/otherschema/myschema.schema
   Convert /etc/ldap/otherschema/myschema.schema to ldif and replace the existing schema by this one

=head1 BUGS

Please report any bugs, or post any suggestions, to the fusiondirectory mailing list fusiondirectory-users or to
<https://forge.fusiondirectory.org/projects/fdirectory/issues/new>

=head1 AUTHOR

Come Bernigaud

=head1 LICENCE AND COPYRIGHT

This code is part of FusionDirectory <http://www.fusiondirectory.org>

=over 1

=item Copyright (C) 2011-2013 FusionDirectory Project

=back

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.

=cut