#!/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; use Net::LDAP::Util qw(ldap_error_text); #unless ($> == 0) { # die "You are not root Exiting\n"; #} my $o = { name => N("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"), ); $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 'check_conffile'; } }, data => [ { label => N("Your choice:") . "\n\n", val => \$o->{var}{wiz_level}, type => 'list', list => [ keys %level ], format => sub { $level{$_[0]} } }, ], next => 'set_srv', }, check_conffile => { name => N("Config Server "), data => [ { label => N("Server Name: "), val => \$o->{var}{srv} }, { label => N("Server RootDN: "), val => \$o->{var}{rootdn} }, { label => N("RootDN Password: "), val => \$o->{var}{rootpass}, hidden => 1 }, { label => N("Server Suffix: "), val => \$o->{var}{suffix} }, { label => N("Server Default Users OU: "), val => \$o->{var}{defou} }, ], next => 'add_userposix' }, add_userposix => { name => N("LDAP User Add") . "\n\n" . N("User Create in: ") . $o->{var}{defou} . "," . $o->{var}{suffix}, 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("Password for Users: ").$o->{var}{sn}.",".$o->{var}{sn}.",". $o->{var}{cn} . $o->{var}{defou} . "," . $o->{var}{suffix}, data => [ { label => N("Password:"), val => \$o->{var}{uidpass}, hidden => 1 }, { label => N("Password (again):"), val => \$o->{var}{uidpass2}, hidden => 1 }, ], complete => sub { if (!$o->{var}{uidpass}) { $::in->ask_warn(N("Error"), N("You must enter a password for LDAP.")); return 1; } if (!($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 => N("Configuring LDAP"), data => [ { label => N("LDAP Suffix:"), val => \$o->{var}{suffix} }, { label => N("LDAP Administrator:"), val => \$o->{var}{rootdn} }, { label => N("LDAP Password:"), hidden => 1, val => \$o->{var}{rootpass} }, { label => N("LDAP Password (again):"), hidden => 1, val => \$o->{var}{rootpass2} }, ], complete => sub { if (!$o->{var}{suffix}) { $::in->ask_warn(N("Error"), N("You must enter a suffix for LDAP.")); return 1; } if (!$o->{var}{rootpass}) { $::in->ask_warn(N("Error"), N("You must enter a password for LDAP.")); return 1; } if (!($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"), data => [ { label => N("Name:"), type => 'field', fixed_val => \$o->{var}{sn} }, { label => N("First name:"), type => 'field', fixed_val => \$o->{var}{cn} }, { label => N("User Name:"), type => 'field', fixed_val => \$o->{var}{uid} }, { label => N("Create in:"), type => 'field', val => $o->{var}{defou}.$o->{var}{suffix} }, ], post => \&do_it_user_add, next => 'endadd' }, summary_set_srv => { name => N("Confirmation de l'utilisateur a creer"), data => [ { label => N("LDAP Suffix:"), 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, qq(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, qq(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} 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]; my $LDAP; open($LDAP, "| ldapadd -x -D 'cn=$o->{var}{rootdn},$o->{var}{suffix}' -w $o->{var}{rootpass}"); print $LDAP <{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=Users,$o->{var}{suffix} ou: Users description: OU Users 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); my $mesg = add_user($o); } sub new { my ($class) = @_; bless { o => $o, }, $class; } 1;