From efa39cbc6768db545b6f87aeafa18cf281eb1458 Mon Sep 17 00:00:00 2001 From: Simon Pichugin Date: Sep 21 2018 14:26:38 +0000 Subject: Issue 49928 - WebUI schema functionality and improve CLI part Description: Add schema functionality for add/edit/remove for for attributes and objectClasses. Add get_attr_syntaxes funciton. Fix small CLI schema issues and lib389 API part. Set LogCapture level on the init. Add copyright for cli/conf_backup_test.py. https://pagure.io/389-ds-base/issue/49928 Reviewed by: mreynolds, mhonek (Thanks!) --- diff --git a/src/cockpit/389-console/css/ds.css b/src/cockpit/389-console/css/ds.css index 833dfa3..f809ed8 100644 --- a/src/cockpit/389-console/css/ds.css +++ b/src/cockpit/389-console/css/ds.css @@ -525,7 +525,7 @@ Zbutton:focus { color: #181818 !important; padding: 0px !important; line-height: 0 !important; - height: 40px; + height: 30px; max-height: 200px !important; width: 315px !important; text-align: left; diff --git a/src/cockpit/389-console/js/ds.js b/src/cockpit/389-console/js/ds.js index f86b8e9..fdce016 100644 --- a/src/cockpit/389-console/js/ds.js +++ b/src/cockpit/389-console/js/ds.js @@ -266,6 +266,7 @@ function load_config (){ get_and_set_config(); // cn=config stuff get_and_set_sasl(); get_and_set_localpwp(); + get_and_set_schema_tables(); // Security page // Database page diff --git a/src/cockpit/389-console/js/schema.js b/src/cockpit/389-console/js/schema.js index 13d2478..ed89a5b 100644 --- a/src/cockpit/389-console/js/schema.js +++ b/src/cockpit/389-console/js/schema.js @@ -22,11 +22,17 @@ var oc_btn_html = '' + ''; +var schema_oc_table; +var schema_at_table; +var schema_mr_table; + function clear_oc_form() { // Clear input fields and reset dropboxes $("#add-edit-oc-header").html('Add Objectclass'); + $(".ds-modal-error").hide(); $("#oc-name").attr('disabled', false); $("#oc-name").val(""); + $(".ds-input").css("border-color", "initial"); $("#oc-oid").val(""); $("#oc-parent").prop('selectedIndex',0); $("#schema-list").prop('selectedIndex',-1); @@ -37,8 +43,10 @@ function clear_oc_form() { function clear_attr_form() { // Clear input fields and reset dropboxes $("#add-edit-attr-header").html('Add Attribute'); + $(".ds-modal-error").hide(); $("#attr-name").attr('disabled', false); $("#attr-name").val(""); + $(".ds-input").css("border-color", "initial"); $("#attr-syntax").val(""); $("#attr-desc").val(""); $("#attr-oid").val(""); @@ -49,14 +57,79 @@ function clear_attr_form() { $("#attr-sub-mr-select").prop('selectedIndex',0); }; +function load_schema_objects_to_select(object, select_id) { + var cmd = [DSCONF, '-j', 'ldapi://%2fvar%2frun%2f' + server_id + '.socket', 'schema', object, 'list']; + cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}).done(function(data) { + var obj = JSON.parse(data); + var data = [] + for (var idx in obj['items']) { + item = obj['items'][idx]; + if (item.name) { + data.push.apply(data, [item.name]); + } else { + data.push.apply(data, [item.oid]); + } + } + // Update html select + $.each(data, function (i, item) { + $("#" + select_id).append($('').attr("value", oc_name).text(oc_name); + $("#oc-parent").append(option); + } + $("#add-edit-oc-form").modal('toggle'); + }). + fail(function(data) { + $("#save-oc-spinner").hide(); + popup_err("Error", "Failed to save the objectClass\n" + data.message); + $("#add-edit-oc-form").modal('toggle'); + }) }); // Required Attributes @@ -225,85 +384,155 @@ $(document).ready( function() { */ $("#create-attr-button").on("click", function() { clear_attr_form(); - }) $("#save-attr-button").on("click", function() { var attr_name = $("#attr-name").val(); - var multiple = "no"; + var attr_oid = $("#attr-oid").val(); + var attr_syntax = $("#attr-syntax").val(); + var attr_desc = $('#attr-desc').val(); + var attr_aliases = $('#attr-alias').val().split(" "); var eq_mr= $('#attr-eq-mr-select').val(); var order_mr = $('#attr-order-mr-select').val(); var sub_mr = $('#attr-sub-mr-select').val(); - var multiple = "no"; + var multiple = 'no'; if ( $("#attr-multivalued").is(":checked") ) { - multiple = "yes"; + multiple = 'yes'; }; + var action = 'add'; var edit = false; if ( $("#add-edit-attr-header").text().indexOf("Edit Attribute") != -1){ edit = true; + action = 'edit'; } - // Do the actual save in DS - - // if save in DS successful close down form, otherwise keep form visible and return ^^^ - $("#add-edit-attr-form").modal('toggle'); - $("#attr-name").attr('disabled', false); + if (attr_name == '') { + report_err($("#attr-name"), 'You must provide an attribute name'); + return; + } + if (attr_syntax == '') { + report_err($("#attr-syntax"), 'You must provide an attribute syntax'); + return; + } - // Update html table (if edit: delete old then add new) - if ( edit ) { - var selector = $('tr:contains(' + attr_name + ')'); - at_table.row(selector).remove().draw(false); + var cmd = [DSCONF, server_inst, 'schema', 'attributetypes', action, attr_name]; + // Process and validate parameters + if (attr_aliases) { + cmd.push.apply(cmd, ["--aliases"]); + cmd.push.apply(cmd, attr_aliases); } + if (attr_syntax) { + cmd.push.apply(cmd, ["--syntax", attr_syntax]); + } + if (multiple == 'no') { + cmd.push.apply(cmd, ["--single-value"]); + } else { + cmd.push.apply(cmd, ["--multi-value"]); + } + cmd.push.apply(cmd, ["--oid", attr_oid]); + cmd.push.apply(cmd, ["--desc", attr_desc]); + cmd.push.apply(cmd, ["--equality", eq_mr]); + cmd.push.apply(cmd, ["--substr", order_mr]); + cmd.push.apply(cmd, ["--ordering", sub_mr]); + $("#save-attr-spinner").show(); + cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}). + done(function(data) { + $("#save-attr-spinner").hide(); + popup_success("The attribute was saved in DS"); + $("#attr-name").attr('disabled', false); + // Update html table (if edit: delete old then add new) + if ( edit ) { + var selector = $('tr:contains(' + attr_name + ')'); + schema_at_table.row(selector).remove().draw(false); + } - // Create attribute row to dataTable - at_table.row.add( [ - attr_name, - $("#attr-oid").val(), - $("#attr-syntax").val(), - multiple, - eq_mr, - order_mr, - sub_mr, - attr_btn_html - ] ).draw( false ); + // Create attribute row to dataTable + schema_at_table.row.add( [ + attr_name, + attr_oid, + attr_syntax, + multiple, + eq_mr, + order_mr, + sub_mr, + attr_btn_html, + attr_desc, + attr_aliases + ] ).draw( false ); + if (!edit) { + var option = $('').attr("value", attr_name).text(attr_name); + $("#schema-list").append(option); + } + $("#add-edit-attr-form").modal('toggle'); + }). + fail(function(data) { + $("#save-attr-spinner").hide(); + popup_err("Error", "Failed to save the attribute\n" + data.message); + $("#add-edit-attr-form").modal('toggle'); + }) }); $(document).on('click', '.attr-edit-btn', function(e) { e.preventDefault(); clear_attr_form(); - var data = at_table.row( $(this).parents('tr') ).data(); + var data = schema_at_table.row( $(this).parents('tr') ).data(); var edit_attr_name = data[0]; - var edit_attr_oid = ""; - var edit_attr_desc = ""; - var edit_attr_alias = ""; - var edit_attr_syntax = ""; - var edit_attr_multivalued = ""; - var edit_attr_eq_mr = ""; - var edit_attr_order_mr = ""; - var edit_attr_sub_mr = ""; + var edit_attr_oid = data[1]; + var edit_attr_syntax = data[2]; + var edit_attr_multivalued = data[3]; + var edit_attr_eq_mr = data[4]; + var edit_attr_order_mr = data[5]; + var edit_attr_sub_mr = data[6]; + var edit_attr_desc = data[8]; + var edit_attr_aliases = data[9]; + if (edit_attr_eq_mr) { + edit_attr_eq_mr = data[4] + } + if (edit_attr_order_mr) { + edit_attr_order_mr = data[5] + } + if (edit_attr_sub_mr) { + edit_attr_sub_mr = data[6] + } $("#add-edit-attr-header").html('Edit Attribute: ' + edit_attr_name); $("#attr-name").val(edit_attr_name); $("#attr-name").attr('disabled', true); + $("#attr-oid").val(edit_attr_oid); + $("#attr-desc").val(edit_attr_desc); + if (edit_attr_aliases) { + $("#attr-alias").val(edit_attr_aliases.join(" ")); + } + $("#attr-syntax").val(edit_attr_syntax); + $("#attr-multivalued").val(edit_attr_syntax); + $("#attr-multivalued").prop('checked', false); + if (edit_attr_multivalued == "yes") { + $("#attr-multivalued").prop('checked', true); + } + $("#save-attr-spinner").show(); + $("#attr-eq-mr-select")[0].value = edit_attr_eq_mr; + $("#attr-order-mr-select")[0].value = edit_attr_order_mr; + $("#attr-sub-mr-select")[0].value = edit_attr_sub_mr; + $("#save-attr-spinner").hide(); $("#add-edit-attr-form").modal('toggle'); - - // TODO Get fresh copy of attr to fill in edit form - - // Update modal html header and fields and show() } ); $(document).on('click', '.attr-del-btn', function(e) { e.preventDefault(); - var data = at_table.row( $(this).parents('tr') ).data(); + var data = schema_at_table.row( $(this).parents('tr') ).data(); var del_attr_name = data[0]; var at_row = $(this); popup_confirm("Are you sure you want to delete attribute: " + del_attr_name + "", "Confirmation", function (yes) { if (yes) { - // TODO Delete attr from DS - - // Update html table - at_table.row( at_row.parents('tr') ).remove().draw( false ); + var cmd = [DSCONF, '-j', 'ldapi://%2fvar%2frun%2f' + server_id + '.socket', 'schema', 'attributetypes', 'remove', del_attr_name]; + cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}).done(function(data) { + popup_success("Attribute was successfully removed!") + schema_at_table.row( at_row.parents('tr') ).remove().draw( false ); + $("#schema-list option[value='" + del_attr_name + "']").remove(); + }).fail(function(data) { + popup_err("Attribute removal error", del_attr_name + " removal has failed: " + data.message); + }); } }); }); @@ -311,19 +540,35 @@ $(document).ready( function() { $(document).on('click', '.oc-edit-btn', function(e) { e.preventDefault(); clear_oc_form(); - var data = oc_table.row( $(this).parents('tr') ).data(); + var data = schema_oc_table.row( $(this).parents('tr') ).data(); var edit_oc_name = data[0]; - var edit_oc_oid = ""; - var edit_oc_desc = ""; - var edit_oc_parent = ""; - var edit_oc_required = ""; - var edit_oc_allowed = ""; + var edit_oc_oid = data[1]; + var edit_oc_parent = data[2] + var edit_oc_required = data[3].split(" "); + var edit_oc_allowed = data[4].split(" "); + if (edit_oc_parent) { + edit_oc_parent = data[2] + } + $("#save-oc-spinner").show(); + $("#add-edit-oc-header").html('Edit Objectclass: ' + edit_oc_name); $("#oc-name").attr('disabled', true); $("#oc-name").val(edit_oc_name); - $("#add-edit-oc-header").html('Edit Objectclass: ' + edit_oc_name); - - // TODO Get fresh copy of objectclass for edit form + $("#oc-oid").val(edit_oc_oid); + $("#oc-parent")[0].value = edit_oc_parent; + $.each(edit_oc_required, function (i, item) { + $("#oc-required-list").append($('