More ldap work
authorJamie Cameron <jcameron@webmin.com>
Sun, 4 Nov 2007 23:47:45 +0000 (23:47 +0000)
committerJamie Cameron <jcameron@webmin.com>
Sun, 4 Nov 2007 23:47:45 +0000 (23:47 +0000)
ldap-server/config-*-linux
ldap-server/config.info
ldap-server/edit_browser.cgi [new file with mode: 0755]
ldap-server/images/acl.gif [new file with mode: 0644]
ldap-server/images/browser.gif [new file with mode: 0644]
ldap-server/images/create.gif [new file with mode: 0755]
ldap-server/images/icon.gif [new file with mode: 0755]
ldap-server/images/schema.gif [new file with mode: 0755]
ldap-server/images/slapd.gif [new file with mode: 0755]
ldap-server/index.cgi [new file with mode: 0644]
ldap-server/ldap-server-lib.pl

index 4f75ed2..4b3c236 100644 (file)
@@ -1,2 +1,3 @@
 config_file=/etc/ldap/slapd.conf
 schema_dir=/etc/ldap/schema
+slapd=slapd
index 4473284..05846f1 100644 (file)
@@ -4,6 +4,7 @@ port=LDAP server port,3,Detect automatically
 user=Login for LDAP server,3,Detect automatically
 pass=Password for LDAP server,3,Detect automatically
 ssl=Use TLS encryption with LDAP server?,1,-Detect automatically,1-Yes,0-No
+slapd=Full path to OpenLDAP server program,8
 config_file=OpenLDAP server configuration file,8
 schema_dir=OpenLDAP schema directory,7
 
diff --git a/ldap-server/edit_browser.cgi b/ldap-server/edit_browser.cgi
new file mode 100755 (executable)
index 0000000..696e232
--- /dev/null
@@ -0,0 +1,156 @@
+#!/usr/local/bin/perl
+# Show the LDAP server's data tree
+
+require './ldap-server-lib.pl';
+&ui_print_header(undef, $text{'browser_title'}, "", "browser");
+&ReadParse();
+
+# Connect to LDAP server, or die trying
+$ldap = &connect_ldap_db();
+if (!ref($ldap)) {
+       print &text('browser_econn', $ldap),"<p>\n";
+       &ui_print_footer("", $text{'index_return'});
+       exit;
+       }
+
+# Work out the base (current navigation level)
+if ($in{'goparent'}) {
+       $base = $in{'parent'};
+       }
+elsif (!$in{'base'}) {
+       $conf = &get_config();
+       $base = &find_value("suffix", $conf);
+       }
+else {
+       $base = $in{'base'};
+       }
+
+# Show current base (with option to change), and parent button
+print &ui_form_start("edit_browser.cgi"),"\n";
+print "<b>$text{'browser_base'}</b>\n";
+print &ui_textbox("base", $base, 60)," ",&ui_submit($text{'browser_ok'}),"\n";
+$parent = $base;
+$parent =~ s/^[^,]+,\s*//;
+if ($parent =~ /\S/) {
+       print &ui_hidden("parent", $parent),"\n";
+       print "&nbsp;&nbsp;\n";
+       print &ui_submit($text{'browser_parent'}, "goparent"),"\n";
+       }
+print &ui_form_end();
+
+# Show list of objects under the base, and its attributes
+$rv = $ldap->search(base => $base,
+                   filter => '(objectClass=*)',
+                   scope => 'one');
+if ($rv->code) {
+       # Search failed
+       print &text('browser_esearch', $rv->error),"<p>\n";
+       }
+else {
+       # Table for layout
+       print "<table width=100%><tr>\n";
+       print "<td width=50%><b>$text{'browser_subs'}</b></td>\n";
+       print "<td width=50%><b>$text{'browser_attrs'}</b></td>\n";
+       print "</tr> <tr><td width=50% valign=top>\n";
+
+       # Show sub-objects
+       @tds = ( undef, "width=10%" );
+       if ($in{'rename'}) {
+               print &ui_form_start("rename_browser.cgi", "post");
+               }
+       else {
+               print &ui_form_start("sdelete_browser.cgi", "post");
+               @tds = ( "width=5", @tds );
+               }
+       print &ui_hidden("base", $base);
+       print &ui_links_row(\@links);
+       print &ui_columns_start([ "",
+                                 $text{'browser_sub'},
+                                 $text{'browser_acts'},
+                               ], 100, 0, \@tds);
+       foreach $dn (sort { lc($a->dn()) cmp lc($b->dn()) } $rv->all_entries) {
+               print "<a href='edit_browser.cgi?base=".&urlize($dn->dn())."'>".
+                     &html_escape($dn->dn())."</a><br>\n";
+               }
+       print &ui_columns_end();
+       if (!$rv->all_entries) {
+               print "<i>$text{'browser_none'}</i><br>\n";
+               }
+       
+       print "</td><td width=50% valign=top>\n";
+       print "<table>\n";
+
+       # Show attributes
+       $rv2 = $ldap->search(base => $base,
+                            filter => '(objectClass=*)',
+                            score => 'base');
+       ($bo) = $rv2->all_entries;
+       @attrs = sort { lc($a) cmp lc($b) } $bo->attributes();
+       if (@attrs) {
+               # Show all attributes
+               @tds = ( "valign=top", "valign=top", "width=5% valign=top" );
+               if ($in{'edit'}) {
+                       print &ui_form_start("save_browser.cgi", "post");
+                       @links = ( );
+                       }
+               else {
+                       print &ui_form_start("delete_browser.cgi", "post");
+                       @links = ( &select_all_link("d", 1),
+                                  &select_invert_link("d", 1),
+                                  "<a href='edit_browser.cgi?base=".
+                                   &urlize($bo->dn())."&add=1'>".
+                                  "$text{'browser_add'}</a>" );
+                       @tds = ( "width=5", @tds );
+                       }
+               print &ui_hidden("base", $bo->dn());
+               print &ui_links_row(\@links);
+               print &ui_columns_start([ $in{'edit'} ? ( ) : ( "" ),
+                                         $text{'browser_name'},
+                                         $text{'browser_value'},
+                                         $text{'browser_acts'} ],
+                                       100, 0, \@tds);
+               foreach $a (@attrs) {
+                       @v = $bo->get_value($a);
+                       @alinks = ( "<a href='edit_browser.cgi?base=".
+                                   &urlize($bo->dn()).
+                                   "&edit=$a'>$text{'browser_edit'}</a>" );
+                       @cols = ( $a, join(", ", @v),
+                                 &ui_links_row(\@alinks),
+                               );
+                       if ($in{'edit'} eq $a) {
+                               # Edit this one
+                               @alinks = ( "<a href='edit_browser.cgi?base=".
+                                           &urlize($bo->dn()).
+                                           "'>$text{'browser_cancel'}</a>" );
+                               print &ui_columns_row([
+                                 $a, &ui_textarea($a, join("\n", @v),
+                                                  scalar(@v)+1, 40),
+                                 &ui_links_row(\@alinks),
+                                 ], \@tds);
+                               }
+                       elsif ($in{'edit'}) {
+                               # Display, no delete
+                               print &ui_columns_row(\@cols, \@tds);
+                               }
+                       else {
+                               # Edit or select for delete
+                               print &ui_checked_columns_row(
+                                       \@cols, \@tds, "d", $a);
+                               }
+                       }
+               print &ui_columns_end();
+               print &ui_links_row(\@links);
+               print &ui_form_end([ [ undef, $in{'edit'} ? $text{'save'} :
+                                               $text{'browser_delete'} ] ]);
+               }
+       else {
+               print "<tr> <td><i>$text{'browser_none'}</i></td> </tr>\n";
+               }
+       print "</table>\n";
+
+       print "</td></tr></table><br>\n";
+       }
+
+$ldap->disconnect();
+&ui_print_footer("", $text{'index_return'});
+
diff --git a/ldap-server/images/acl.gif b/ldap-server/images/acl.gif
new file mode 100644 (file)
index 0000000..e7f05b4
Binary files /dev/null and b/ldap-server/images/acl.gif differ
diff --git a/ldap-server/images/browser.gif b/ldap-server/images/browser.gif
new file mode 100644 (file)
index 0000000..e5aebb8
Binary files /dev/null and b/ldap-server/images/browser.gif differ
diff --git a/ldap-server/images/create.gif b/ldap-server/images/create.gif
new file mode 100755 (executable)
index 0000000..c3e4d74
Binary files /dev/null and b/ldap-server/images/create.gif differ
diff --git a/ldap-server/images/icon.gif b/ldap-server/images/icon.gif
new file mode 100755 (executable)
index 0000000..4645db3
Binary files /dev/null and b/ldap-server/images/icon.gif differ
diff --git a/ldap-server/images/schema.gif b/ldap-server/images/schema.gif
new file mode 100755 (executable)
index 0000000..c0412ef
Binary files /dev/null and b/ldap-server/images/schema.gif differ
diff --git a/ldap-server/images/slapd.gif b/ldap-server/images/slapd.gif
new file mode 100755 (executable)
index 0000000..4645db3
Binary files /dev/null and b/ldap-server/images/slapd.gif differ
diff --git a/ldap-server/index.cgi b/ldap-server/index.cgi
new file mode 100644 (file)
index 0000000..f220f9d
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/local/bin/perl
+# Show icons for LDAP server configuration options
+
+require './ldap-server-lib.pl';
+
+# Try to get OpenLDAP version
+$ver = &get_ldap_server_version();
+$vermsg = &text('index_version', $ver) if ($ver);
+
+# Show title
+&ui_print_header(undef, $module_info{'desc'}, "", "intro", 1, 1, 0,
+                undef, undef, undef, $vermsg);
+
+# Is it installed and usable?
+$local = &local_ldap_server();
+if ($local == -1) {
+       &ui_print_endpage(&text('index_eslapd', "<tt>$config{'slapd'}</tt>",
+                               "../config.cgi?$module_name"));
+       }
+elsif ($local == -2) {
+       &ui_print_endpage(&text('index_econfig',
+                               "<tt>$config{'config_file'}</tt>",
+                               "../config.cgi?$module_name"));
+       }
+elsif ($local == 0) {
+       # Can we connect?
+       $ldap = &connect_ldap_db();
+       if (!ref($ldap)) {
+               &ui_print_endpage(&text('index_econnect', $ldap,
+                                       "../config.cgi?$module_name"));
+               }
+       }
+
+# Check if need to init new install
+# XXX
+
+# Work out icons
+if ($local) {
+       # All local server icons
+       @pages = ( "slapd", "schema", "acl", "browser", "create" );
+       }
+else {
+       # Just browser and DN creator?
+       @pages = ( "browse", "create" );
+       }
+@links = map { "edit_".$_.".cgi" } @pages;
+@titles = map { $text{$_."_title"} } @pages;
+@icons = map { "images/$_.gif" } @pages;
+&icons_table(\@links, \@titles, \@icons);
+
+if ($local == 1) {
+       # Show stop/restart buttons
+       print "<hr>\n";
+       print &ui_buttons_start();
+       if (&is_ldap_server_running()) {
+               print &ui_buttons_row("apply.cgi", $text{'index_apply'},
+                                     $text{'index_applydesc'});
+               print &ui_buttons_row("stop.cgi", $text{'index_stop'},
+                                     $text{'index_stopdesc'});
+               }
+       else {
+               print &ui_buttons_row("start.cgi", $text{'index_start'},
+                                     $text{'index_startdesc'});
+               }
+
+       # Start at boot button
+       # XXX
+       print &ui_buttons_end();
+       }
+
+&ui_print_footer("/", $text{'index'});
index ba1999d..5ede2d0 100644 (file)
@@ -1,5 +1,5 @@
 # Functions for configuring and talking to an LDAP server
-# XXX icon
+# XXX ldap browser should allow searching / limit list size
 
 do '../web-lib.pl';
 &init_config();
@@ -59,13 +59,14 @@ foreach $ssl (@ssls) {
                }
        if ($ssl) {
                # Switch to TLS mode
-               local $mesg = $ldap->start_tls();
-               if (!$mesg || $mesg->code) {
+               local $mesg;
+               eval { $mesg = $ldap->start_tls(); };
+               if ($@ || !$mesg || $mesg->code) {
                        next if (@ssls);  # Try non-SSL
                        }
                else {
                        return &text('connect_essl', "<tt>$server</tt>",
-                                    $mesg ? $mesg->code : "Unknown error");
+                            $@ ? %@ : $mesg ? $mesg->code : "Unknown error");
                        }
                }
        }
@@ -82,6 +83,38 @@ $connect_ldap_db = $ldap;
 return $ldap;
 }
 
+# local_ldap_server()
+# Returns 1 if OpenLDAP is installed locally and we are configuring it, 0 if
+# remote, or -1 the binary is missing, -2 if the config is missing
+sub local_ldap_server
+{
+if (!$config{'server'} || &to_ipaddress($config{'server'}) eq '127.0.0.1' ||
+    &to_ipaddress($config{'server'}) eq &to_ipaddress(&get_system_hostname())) {
+       # Local .. but is it installed?
+       return !&has_command($config{'slapd'}) ? -1 :
+              !-r $config{'config_file'} ? -2 : 1;
+       }
+return 0;
+}
+
+# get_ldap_server_version()
+# Returns the local LDAP server version number
+sub get_ldap_server_version
+{
+return undef if (&local_ldap_server() != 1);
+local $out = &backquote_command("$config{'slapd'} -V 2>&1 </dev/null");
+if ($out =~ /slapd\s+([0-9\.]+)/) {
+       return $1;
+       }
+# Fall back to -d flag
+local $out = &backquote_with_timeout("$config{'slapd'} -d 255 2>&1 </dev/null",
+                                    1, 1, 1);
+if ($out =~ /slapd\s+([0-9\.]+)/) {
+       return $1;
+       }
+return undef;
+}
+
 # get_config([file])
 # Returns an array ref of LDAP server configuration settings
 sub get_config
@@ -102,7 +135,7 @@ while(<CONF>) {
                               'line' => $lnum,
                               'file' => $file };
                local $value = $2;
-               $dir->{'values'} = &split_quoted_string($value);
+               $dir->{'values'} = [ &split_quoted_string($value) ];
                push(@rv, $dir);
                }
        $lnum++;
@@ -138,12 +171,16 @@ sub apply_configuration
 {
 }
 
+# is_ldap_server_running()
+# Returns the process ID of the running LDAP server, or undef
 sub is_ldap_server_running
 {
-}
-
-sub get_ldap_server_pid
-{
+local $conf = &get_config();
+local $pidfile = &find_value("pidfile", $conf);
+if ($pidfile) {
+       return &check_pid_file($pidfile);
+       }
+return undef;
 }
 
 1;