#!/usr/bin/perl # version 0.1 # GPL like # aginies@mandrakesoft.com package MDK::Wizard::Ldap; use lib qw(/usr/lib/libDrakX); use ugtk2; use strict; use ldapdef; use common; use standalone; use MDK::Wizard::Varspaceval; use MDK::Wizard::Wizcommon; use Expect; require Net::LDAP; #unless ($> == 0) { # die "You are not root Exiting\n"; #} my $o = { name => 'Add POSIX account', var => { defou => 'ou=Users', srv => '', dom => 'mandrakesoft.com', suffix => '', rootdn => '', rootpass => '', rootpass2 => '', cn => '', sn => '', uid => '', uidpass => '', lshell => '/bin/bash', home => '/home/', uidnb => '1004', gidnb => '1004', container => 'container', objectclass => 'top,account,posixaccount', shadowmax => '99999', shadowmin => '-1', plop => '', tmp => '', nom => '', prenom => '', }, needed_rpm => [ 'squid' ], defaultimage => "/usr/share/wizards/proxy_wizard/images/proxy.png" }; my $ldap_suffix=join(',dc=',split(/\./,`hostname -f`)); $ldap_suffix=~ s/[^,]*,//; my $conf_file = "/etc/sysconfig/ldapconf"; my $LDAPCONF = "/etc/openldap/slapd.conf"; ##### Read conf file is exist my $hostname = `hostname`; $o->{var}{srv} = $hostname; if (-f $conf_file) { my %conf = getVarsFromSh($conf_file); $o->{var}{suffix}= "$conf{suffix}"; $o->{var}{rootdn}= "$conf{rootdn}"; $o->{var}{rootpass}= "$conf{rootpass}"; $o->{var}{srv}= "$conf{srv}"; $o->{var}{defou}= "$conf{users}"; } else { my $hostname = `hostname`; $o->{var}{srv} = $hostname; $o->{var}{suffix} = $ldap_suffix; } my %level = ( 1 => N("Server - Set configuration of LDAP server"), 2 => N("Add - Add user in LDAP server"), ); my $cn; $o->{pages} = { welcome => { name => N("LDAP configuration wizard") . "\n\n" . N("Setup a ldap server."), no_back => 1, pre => sub { $o->{var}{wiz_level} ||= 1; }, post => sub { if ($o->{var}{wiz_level} == 2) { return 'add_userposix'; } }, data => [ { label => N("Votre choix "). "\n\n" , val => \$o->{var}{wiz_level}, type => 'list', list => [ keys %level ], format => sub { $level{$_[0]} } }, ], next => 'set_srv', }, add_userposix => { name => N("Ldap User Add") . "\n\n" . N("Bla Bla Bla ") . "\n\n" . N("User Create in : ") . $o->{var}{defou} . "," . $o->{var}{suffix} . "\n\n", data => [ { label => N("First Name:"), val => \$o->{var}{sn} }, { label => N("Name:"), val => \$o->{var}{cn} }, { label => N("User Name:"), val => \$o->{var}{uid} }, ], next => 'password' }, password => { name => N("Ldap User Password") . "\n\n" . N("Bla Bla Bla ") . "\n\n" . N("Password for Users : ") . $o->{var}{cn} . $o->{var}{defou} . "," . $o->{var}{suffix} . "\n\n", data => [ { label => N("Password:):"), val => \$o->{var}{uidpass}, hidden => 1 }, { label => N("Password (again):"), val => \$o->{var}{uidpass2}, hidden => 1 }, ], complete => sub { if (not ($o->{var}{uidpass})) { $::in->ask_warn(N("Error"), "Il faut entrer un mot de passe pour Ldap."); return 1; } if (not ($o->{var}{uidpass} eq $o->{var}{uidpass2})) { $::in->ask_warn(N("Error"), N("The passwords do not match")); return 1; } }, next => 'summary_add_user' }, set_srv => { name => "Configuration de Ldap\n\n", data => [ { label => "Suffixe LDAP", val => \$o->{var}{suffix} }, { label => "Administrateur Ldap", val => \$o->{var}{rootdn} }, { label => "Mot de passe LDAP", hidden => 1, val => \$o->{var}{rootpass} }, { label => "Vérification du mot de passe LDAP", hidden => 1, val => \$o->{var}{rootpass2} }, ], complete => sub { if (not ($o->{var}{suffix})) { $::in->ask_warn(N("Error"), "Il faut indiquer un suffixe Ldap."); return 1; } if (not ($o->{var}{rootpass})) { $::in->ask_warn(N("Error"), "Il faut entrer un mot de passe pour Ldap."); return 1; } if (not ($o->{var}{rootpass} eq $o->{var}{rootpass2})) { $::in->ask_warn(N("Error"), N("The passwords do not match"°); return 1; } }, next => 'summary_set_srv', }, summary_add_user => { name => N("Confirmation de l'utilisateur a creer ") . "\n\n", data => [ { label => N("Name:"), type => 'field', fixed_val => \$o->{var}{sn} }, { label => N("Firt name: "), type => 'field', fixed_val => \$o->{var}{cn} }, { label => N("User Name: "), type => 'field', fixed_val => \$o->{var}{uid} }, { label => N("Utilisteur : "), type => 'field', fixed_val => $o->{var}{cn} }, ], post => \&do_it_user_add, next => 'endadd' }, summary_set_srv => { name => N("Confirmation de l'utilisateur a creer ") . "\n\n", data => [ { label => N("Suffixe LDAP : "), type => 'field', val => $o->{var}{suffix} }, ], post => \&do_it_setldap, next => 'end' }, end => { name => N("Congratulations"), data => [ { label => N("The wizard successfully configured the LDAP.") } ], no_back => 1, end => 1, next => 0 }, endadd => { name => N("Successfully added User"), data => [ { label => N("The wizard successfully added an user in ldap") } ], no_back => 1, end => 1, next => 0, }, }; sub do_it_setldap { if (!-f $LDAPCONF) { die "no $LDAPCONF found"}; cp_af($LDAPCONF, $LDAPCONF . '.save'); if (!-f "$LDAPCONF.example") { cp_af($LDAPCONF, $LDAPCONF . '.example') }; cp_af($LDAPCONF . '.example', $LDAPCONF); print "$o->{var}{suffix}\n"; # set suffix if (any { /^suffix/ } cat_($LDAPCONF)) { substInFile { s/suffix.*/suffix\t\"$o->{var}{suffix}\"/; } $LDAPCONF; } else { append_to_file($LDAPCONF, "suffix\t\"$o->{var}{suffix}\""); } # s/example/$dcall substInFile { s/example/$o->{var}{suffix}/g; } $LDAPCONF; # set rootdn if (any { /^rootdn/ } cat_($LDAPCONF)) { substInFile { s/rootdn.*/rootdn\t\"cn=$o->{var}{rootdn},$o->{var}{suffix}\"/; } $LDAPCONF; } else { append_to_file($LDAPCONF, "rootdn\t\"$o->{var}{rootdn},$o->{var}{suffix}\""); } # set rootpass my $cryptpass = crypt($o->{var}{rootpass}, "crypt"); if (any { /^rootpw/ } cat_($LDAPCONF)) { substInFile { #s/rootpw.*/rootpw $cryptpass/; s/rootpw.*/rootpw $o->{var}{rootpass}/; } $LDAPCONF; }else { #append_to_file($LDAPCONF, "rootpw {CRYPT}$cryptpass"); append_to_file($LDAPCONF, "rootpw $o->{var}{rootpass}"); } # create config file in /etc/sysconfig/ldapconf output($conf_file, <{var}{srv} suffix=$o->{var}{suffix} rootdn=$o->{var}{rootdn} rootpass=$o->{var}{rootpass} rootpass=$o->{var}{rootpass} users=$o->{var}{defou} EOF # reset premisions system("chown -R root.ldap /etc/openldap"); system("service ldap restart"); init_ldap(); } sub init_ldap { my $root_cn=(split(/\=/,(split(/,/,$o->{var}{rootdn}))[0]))[1]; my $ldap_dc=(split(/\=/,(split(/,/,$o->{var}{suffix}))[0]))[1]; open(LDAP,"| ldapadd -x -D 'cn=$o->{var}{rootdn},$o->{var}{suffix}' -w $o->{var}{rootpass}"); print LDAP << "RootLdif"; dn: $o->{var}{suffix} dc: $ldap_dc objectClass: dcObject objectClass: organization o: Company dn: cn=$o->{var}{rootdn},$o->{var}{suffix} objectClass: organizationalRole cn: $o->{var}{rootdn} dn: ou=Hosts,$o->{var}{suffix} ou: Hosts description: OU Hosts objectClass: top objectClass: organizationalUnit dn: ou=People,$o->{var}{suffix} ou: People description: OU People objectClass: top objectClass: organizationalUnit dn: ou=Group,$o->{var}{suffix} ou: Group description: OU Group objectClass: top objectClass: organizationalUnit RootLdif close(LDAP) } sub do_it_user_add { return if $::testing; my $ldap = ldap_connect($o); add_user($o); } sub new { my ($class, $conf) = @_; bless { o => $o, }, $class; } 1;