#49809 Ticket 49808 - Add option to add backend to dscreate
Closed 2 years ago by spichugi. Opened 4 years ago by mreynolds.
mreynolds/389-ds-base ticket49808  into  master

file modified
+1 -1
@@ -33,7 +33,7 @@ 

  

  # Create the example setup inf. It's valid for containers!

  # Build the instance from the new installer tools.

- RUN /usr/sbin/dscreate create-template > /root/ds-setup.inf && /usr/sbin/dscreate -v install /root/ds-setup.inf --IsolemnlyswearthatIamuptonogood --containerised

+ RUN /usr/sbin/dscreate create-template > /root/ds-setup.inf && /usr/sbin/dscreate -v install /root/ds-setup.inf --containerised

  

  # Finally add the volumes, they will inherit the contents of these directories.

  VOLUME /etc/dirsrv

@@ -41,7 +41,7 @@ 

          class="ds-radio cache-role" type="radio" id="manual-cache" name="cache-role" value="manual-cache" checked="checked"> Manual Cache Tuning</label>

        <label title="Set Database/Entry to be set automatically"><input

          class="ds-radio cache-role" type="radio" id="auto-cache" name="cache-role" value="auto-cache"> Automatic Cache Tuning</label>

-     </div>       

+     </div>

      <div id="manual-cache-form" class="ds-margin-left" hidden>

        <label for="nsslapd-dbcachesize" class="ds-config-label-xlrg" title=

          "Specifies the database index cache size in bytes (nsslapd-dbcachesize).">
@@ -174,7 +174,7 @@ 

          </div>

        </div>

      </div>

-     

+ 

      <h4 class="ds-sub-header"><br>Default Database Link Creation Settings</h4>

      <hr>

      <div class="ds-container">
@@ -261,7 +261,7 @@ 

              </ul>

            </li>

          </ul>

-   

+ 

        </div>

        <div>

          <button class="btn btn-default" data-toggle="modal" data-target="#add-suffix-form" id="create-ref-btn" type="button"><span class="glyphicon glyphicon-plus"></span>  Create New Suffix</button>
@@ -448,7 +448,7 @@ 

              <button class="btn btn-default" data-toggle="modal" data-target="#create-ref-form" id="create-ref-btn" type="button">Create Referral</button>

              <p></p>

            </div>

-   

+ 

  

        <button class="accordion ds-accordion" id="db-system-index-accordion" type="button">&#9658 Show System Indexes </button>

        <div class="ds-accordion-panel">
@@ -708,7 +708,7 @@ 

                      "Matching rule(s) (nsMatchingRule).">

                      Matching Rules</label>

                </div>

-               <div>    

+               <div>

                  <input type="text" placeholder="None" id="add-index-matchingrules" size="40"/>

                </div>

                <div>

@@ -288,7 +288,7 @@ 

      </div>

    </div>

  

-   <!-- Restore from backup -->

+   <!-- Manage Backups/restore -->

    <div class="modal fade" id="restore-form" data-backdrop="static" tabindex="-1" role="dialog" aria-labelledby="restore-label" aria-hidden="true">

      <div class="modal-dialog">

        <div class="modal-content ds-modal-wide">
@@ -326,6 +326,7 @@ 

      </div>

    </div>

  

+   <!-- Create database link -->

    <div class="modal fade" id="create-db-link-form" data-backdrop="static" tabindex="-1" role="dialog" aria-labelledby="dblink-label" aria-hidden="true">

      <div class="modal-dialog ds-modal">

        <div class="modal-content">
@@ -436,6 +437,15 @@ 

                  <label for="rootdn-pw-confirm" class="ds-config-label" title="Confirm password">Confirm Password</label><input

                    class="ds-input" type="password" placeholder="Confirm password" id="rootdn-pw-confirm" name="name" required>

                </div>

+               <hr>

+               <div>

+                 <label for="backend-name" class="ds-config-label" title="The backend name, like 'userroot'">Backend Name (optional)</label><input

+                   class="ds-input" type="text" id="backend-name">

+               </div>

+               <div>

+                 <label for="backend-suffix" class="ds-config-label" title="Database suffix, like 'dc=example,dc=com'">Backend Suffix (optional)</label><input

+                   class="ds-input" type="text" id="backend-suffix">

+               </div>

                <div>

                  <p></p>

                  <input type="checkbox" class="ds-config-checkbox" id="create-inst-tls" checked><label
@@ -456,7 +466,6 @@ 

      </div>

    </div>

  

- 

    <!--

        Do Backup

    -->
@@ -489,7 +498,6 @@ 

      </div>

    </div>

  

- 

    <!-- The Nav Tabs  -->

  

    <div class="ds-content">
@@ -529,8 +537,6 @@ 

  

    </div>

  

- 

- 

  </body>

  </html>

  

@@ -1,7 +1,7 @@ 

  var prev_tree_node = null;

  var ref_del_html = "<button class=\"btn btn-default del-ref-btn\" type=\"button\"><span class='glyphicon glyphicon-trash'></span> Delete</button>";

  var attr_encrypt_del_html = "<button class=\"btn btn-default attr-encrypt-delete-btn\" type=\"button\">Remove Attribute</button></td>";

- var index_btn_html = 

+ var index_btn_html =

    '<div class="dropdown"> ' +

       '<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">' +

         'Choose Action...' +
@@ -23,7 +23,7 @@ 

        "action": function (data) {

          popup_confirm("Are you sure you want to delete this Database Link?", "Confirmation", function (yes) {

            if (yes) {

-     

+ 

             // TODO  Delete db link

            }

          });
@@ -149,8 +149,8 @@ 

      }

    });

  

-   $('#db-tree').jstree('select_node', 'ul > li:first'); 

-   

+   $('#db-tree').jstree('select_node', 'ul > li:first');

+ 

  

    $('#db-tree').on("changed.jstree", function (e, data) {

      var node_type = data.selected[0];
@@ -296,7 +296,7 @@ 

  

  

      /*

-       We need logic to see if autocaching (import and db) is being used, and disable fields, 

+       We need logic to see if autocaching (import and db) is being used, and disable fields,

        and set radio buttons, et

      */

  
@@ -584,9 +584,9 @@ 

        // Update oids

        var chaining_oids = $("#avail-chaining-oid-list").val();

        for (var i = 0; chaining_oids && i < chaining_oids.length; i++) {

-         $('#chaining-oid-list').append($('<option/>', { 

+         $('#chaining-oid-list').append($('<option/>', {

            value: chaining_oids[i],

-           text : chaining_oids[i] 

+           text : chaining_oids[i]

          }));

          $("#avail-chaining-oid-list option[value='" + chaining_oids[i] + "']").remove();

        }
@@ -620,12 +620,12 @@ 

        sort_list($('#avail-chaining-comp-list') );

      });

      $("#chaining-comp-save").on("click", function() {

-       // Update comps      

+       // Update comps

        var chaining_comps = $("#avail-chaining-comp-list").val();

        for (var i = 0; chaining_comps && i < chaining_comps.length; i++) {

-         $('#chaining-comp-list').append($('<option/>', { 

+         $('#chaining-comp-list').append($('<option/>', {

            value: chaining_comps[i],

-           text : chaining_comps[i] 

+           text : chaining_comps[i]

          }));

          $("#avail-chaining-comp-list option[value='" + chaining_comps[i] + "']").remove();

        }
@@ -642,14 +642,14 @@ 

      });

      $("#chaining-save").on("click", function() {

        // Create DB link, if LDAPS is selected replace remotefarmUrl "ldap://" with "ldaps://", and visa versa to remove ldaps://

-       var chaining_name = $("#chaining-name").val(); 

+       var chaining_name = $("#chaining-name").val();

        var parent_suffix = $("#db-tree").jstree().get_selected(true)[0];

        var suffix = $("#db-tree").jstree().get_selected(true)[0].text.replace(/(\r\n|\n|\r)/gm,"");

  

        // TODO - create db link in DS

  

-       $('#db-tree').jstree().create_node(parent_suffix,  

-                                          { "id" : "dblink-" + suffix, "text" : chaining_name, "icon" : "glyphicon glyphicon-link" }, 

+       $('#db-tree').jstree().create_node(parent_suffix,

+                                          { "id" : "dblink-" + suffix, "text" : chaining_name, "icon" : "glyphicon glyphicon-link" },

                                           "last");

        $("#create-db-link-form").css('display', 'none');

      });
@@ -666,7 +666,7 @@ 

        var add_attr_type_sub = '<input type="checkbox" id="' + attr_name + '-sub">';

        var add_attr_type_approx = '<input type="checkbox" id="' + attr_name + '-approx">';

        var add_index_matchingrules = $("#add-index-matchingrules").val();

-   

+ 

        if ( $("#add-index-type-eq").is(":checked") ){

          add_attr_type_eq = '<input type="checkbox" id="' + attr_name + '-eq" checked>';

        }
@@ -679,7 +679,7 @@ 

        if ( $("#add-index-type-approx").is(":checked") ){

          add_attr_type_approx = '<input type="checkbox" id="' + attr_name + '-approx" checked>';

        }

-   

+ 

        // TODO - add index to DS

  

        // Update table on success
@@ -692,7 +692,7 @@ 

          add_index_matchingrules,

          index_btn_html

        ] ).draw( false );

-   

+ 

        $("#add-index-form").css('display', 'none');

        clear_index_form();

        // Do the actual save in DS
@@ -705,7 +705,7 @@ 

        clear_attr_encrypt_form();

      })

      $("#add-encrypted-attr-save").on("click", function() {

-       

+ 

        // Do the actual save in DS

        // Update html

  
@@ -731,8 +731,8 @@ 

  

        // TODO - create suffix in DS

  

-       $('#db-tree').jstree().create_node('db-root', 

-                                          { "id" : "suffix-" + suffix, "text" : suffix, "icon" : "glyphicon glyphicon-tree-conifer" }, 

+       $('#db-tree').jstree().create_node('db-root',

+                                          { "id" : "suffix-" + suffix, "text" : suffix, "icon" : "glyphicon glyphicon-tree-conifer" },

                                           "last");

        $("#add-suffix-form").css('display', 'none');

      });
@@ -751,8 +751,8 @@ 

  

        // TODO - create suffix in DS

  

-       $('#db-tree').jstree().create_node(parent_suffix,  

-                                          { "id" : "subsuffix-" + suffix, "text" : suffix, "icon" : "glyphicon glyphicon-leaf" }, 

+       $('#db-tree').jstree().create_node(parent_suffix,

+                                          { "id" : "subsuffix-" + suffix, "text" : suffix, "icon" : "glyphicon glyphicon-leaf" },

                                           "last");

        $("#add-subsuffix-form").css('display', 'none');

      });
@@ -824,7 +824,7 @@ 

        popup_confirm("Are you sure you want to reindex attribute: <b>" + reindex_name + "</b>", "Confirmation", function (yes) {

          if (yes) {

            // TODO reindex attr

-  

+ 

          }

        });

      });

@@ -260,14 +260,11 @@ 

  

  $(window.document).ready(function() {

  

-   if(navigator.userAgent.toLowerCase().indexOf('firefoxf') > -1) {  

-     $("select@@@").focus( function() {     

+   if(navigator.userAgent.toLowerCase().indexOf('firefoxf') > -1) {

+     $("select@@@").focus( function() {

        this.style.setProperty( 'outline', 'none', 'important' );

        this.style.setProperty( 'color', 'rgba(0,0,0,0)', 'important' );

        this.style.setProperty( 'text-shadow', '0 0 0 #000', 'important' );

      });

    }

- 

- 

-   

  });

@@ -108,9 +108,9 @@ 

  function refresh_auditfail_log () {

    var auditfail_log = "/var/log/dirsrv/" + server_id + "/auditfail";  // TODO - get actual log location from config

    var lines = $("#auditfaillog-lines").val();

-   var logging = cockpit.spawn(["tail", "-" + lines, auditfail_log], 

+   var logging = cockpit.spawn(["tail", "-" + lines, auditfail_log],

                                { "superuser": "try" }).done(function(data) {

-     $("#auditfaillog-area").text(data); 

+     $("#auditfaillog-area").text(data);

    });

  }

  
@@ -167,8 +167,8 @@ 

      $("#monitor-db-btn").on("click", function() {

        $(".all-pages").hide();

        $("#monitor-content").show();

-       

-       // TODO - NDN cache prior to 1.4.0 is duplicated under each suffix/backend monitor - 

+ 

+       // TODO - NDN cache prior to 1.4.0 is duplicated under each suffix/backend monitor -

        // so we need to bring it forward to the global database stats here

        var db_hitratio = '99';

        var ndn_hitratio = '83';
@@ -238,7 +238,7 @@ 

        var tree_node = data.selected;

        if (tree_node == "monitor-db-main") {

  

-         // TODO - NDN cache prior to 1.4.0 is duplicated under each suffix/backend monitor - 

+         // TODO - NDN cache prior to 1.4.0 is duplicated under each suffix/backend monitor -

          // so we need to bring it forward to the global database stats here

          var db_hitratio = '99';

          var ndn_hitratio = '83';
@@ -264,7 +264,7 @@ 

          var dn_hitratio = '89';

          var dn_maxsize = '51200';

          var dn_cursize = '51200';

-         

+ 

          // Generate the donut charts

          gen_ratio_chart(entry_hitratio, '#monitor-entry-cache-hitratio-chart');

          gen_util_chart(entry_cursize, entry_maxsize, entry_hitratio, '#monitor-entry-cache-util-chart');
@@ -367,7 +367,7 @@ 

        var agmt_status = "";

        if (agmt_enabled == "off") {

            agmt_status = "&nbsp;<font size=\"2\" color=\"red\"><b>(Agreement Disabled)</b></font>";

-       } 

+       }

        // clear_agmt_form();

  

        $("#monitor-agmt-header").html("<b>Replication Agreement Details:</b>&nbsp;&nbsp; " + agmt_name + " " + agmt_status);
@@ -386,7 +386,7 @@ 

        var agmt_status = "";

        if (agmt_enabled == "off") {

            agmt_status = "&nbsp;<font size=\"2\" color=\"red\"><b>(Agreement Disabled)</b></font>";

-       } 

+       }

        // clear_agmt_form();

  

        $("#repl-winsync-agmt-header").html("<b>Winsync Agreement Details:</b>&nbsp;&nbsp; " + agmt_name + " " + agmt_status);
@@ -394,6 +394,6 @@ 

        $("#monitor-winsync-agmt-form").css('display', 'block');

      });

  

-     

+ 

    });

  });

@@ -4,7 +4,7 @@ 

  var prev_rid = "";

  var binddn_list_color = "";

  

- var agmt_action_html = 

+ var agmt_action_html =

    '<div class="dropdown">' +

       '<button class="btn btn-default dropdown-toggle ds-agmt-dropdown-button" type="button" data-toggle="dropdown">' +

        ' Choose Action...' +
@@ -20,7 +20,7 @@ 

      '</ul>' +

    '</div>';

  

- var winsync_agmt_action_html = 

+ var winsync_agmt_action_html =

    '<div class="dropdown">' +

       '<button class="btn btn-default dropdown-toggle ds-agmt-dropdown-button" type="button" id="dropdownMenu2" data-toggle="dropdown">' +

        ' Choose Action...' +
@@ -41,7 +41,7 @@ 

    $('#repl-tree').jstree( {

      "plugins" : [ "wholerow" ]

    });

-   

+ 

    // Set rid for each suffix if applicable

    prev_rid = "1";

  
@@ -117,9 +117,9 @@ 

  

  $(document).ready( function() {

    $("#replication-content").load("replication.html", function () {

-     

+ 

      // Load the dropdown TODO

-     

+ 

      binddn_list_color = $("#repl-managers-list").css("border-color");

  

      // Load existing replication config (if any), set role, etc
@@ -149,7 +149,7 @@ 

        $("#repl-cleanallruv").show();

      });

  

-     

+ 

      $("#nsds5replicaid").on("change", function() {

        prev_rid = $("#nsds5replicaid").val();

      });
@@ -157,15 +157,15 @@ 

      $("#save-repl-cfg-btn").on('click', function () {

         // validate values

  

-        // Do the save in DS 

+        // Do the save in DS

  

         // In case we updated the bind group...

         check_repl_binddn_list();

      });

  

  

-     /* 

-      * Setting/Changing the replication role 

+     /*

+      * Setting/Changing the replication role

       */

      $("#nsds5replicaid").on('click', function () {

        if ( $("#nsds5replicaid").prop('disabled') == false ) {
@@ -214,7 +214,7 @@ 

            // TODO - if prev_role is not "disabled" after for confirmation before demoting replica

            $('#repl-agmts').hide();

            $("#nsds5replicaid").val("");

-           $("#repl-settings-header").html("Consumer Replication Settings");   

+           $("#repl-settings-header").html("Consumer Replication Settings");

          }

        }

        if (role == "no-repl") {
@@ -535,7 +535,7 @@ 

          $(this).blur();

        }

      });

-  

+ 

      /*

       * Handle the repl agmt wizard select lists

       */
@@ -757,7 +757,7 @@ 

          popup_msg("Attention!", "Invalid DN for Replication Manager");

          return;

        }

-  

+ 

  

        // Do the actual save in DS

  

@@ -1,4 +1,4 @@ 

- var attr_btn_html = 

+ var attr_btn_html =

    '<div class="dropdown">' +

      '<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">' +

        '  Choose Action...' +
@@ -10,7 +10,7 @@ 

       '</ul>' +

    '</div>';

  

- var oc_btn_html = 

+ var oc_btn_html =

    '<div class="dropdown">' +

      '<button class="btn btn-default dropdown-toggle" type="button"data-toggle="dropdown">' +

        ' Choose Action...' +
@@ -141,12 +141,12 @@ 

        // TODO - Do the actual save in DS

  

        // Update html

-       // If save successful close down form, otherwise keep form up and return      

+       // If save successful close down form, otherwise keep form up and return

        $("#add-edit-oc-form").modal('toggle');

  

        $("#oc-name").attr('disabled', false);

-   

-   

+ 

+ 

        // Convert allowed/requires list to html format

        var oc_required_list = $('#oc-required-list option').map(function() { return $(this).val(); }).get().join(', ');

        var oc_allowed_list = $('#oc-allowed-list option').map(function() { return $(this).val(); }).get().join(', ');
@@ -288,7 +288,7 @@ 

          $("#attr-name").attr('disabled', true);

  

          $("#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()
@@ -323,12 +323,12 @@ 

        $("#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

  

        // Update modal html header and fields and show()

        $("#add-edit-oc-form").modal('toggle');

-       

+ 

      });

  

      $(document).on('click', '.oc-del-btn', function(e) {

@@ -40,7 +40,7 @@ 

        $("#security-content").show();

        $("#sec-ciphers-page").show();

      });

-     

+ 

      $("#sec-config").show();

  

      // Clear forms as theyare clicked
@@ -50,7 +50,7 @@ 

  

      });

  

-     $("#add-crl-btn").on('click', function () {   

+     $("#add-crl-btn").on('click', function () {

        // Add CRL/CKL

  

        // Close form

@@ -134,6 +134,7 @@ 

  }

  

  function clear_inst_input() {

+   // Reset the color of the fields

    $("#create-inst-serverid").css("border-color", "initial");

    $("#create-inst-port").css("border-color", "initial");

    $("#create-inst-secureport").css("border-color", "initial");
@@ -142,6 +143,8 @@ 

    $("#create-inst-group").css("border-color", "initial");

    $("#rootdn-pw").css("border-color", "initial");

    $("#rootdn-pw-confirm").css("border-color", "initial");

+   $("#backend-name").css("border-color", "initial");

+   $("#backend-suffix").css("border-color", "initial");

  }

  

  function clear_inst_form() {
@@ -154,6 +157,8 @@ 

    $("#create-inst-group").val("dirsrv");

    $("#rootdn-pw").val("");

    $("#rootdn-pw-confirm").val("");

+   $("#backend-suffix").val("");

+   $("#backend-name").val("");

    $("#create-inst-tls").prop('checked', true);

    clear_inst_input();

  }
@@ -1155,6 +1160,30 @@ 

          setup_inf = setup_inf.replace('ROOTPW', root_pw);

        }

  

+       // Backend/Suffix

+       var backend_name = $("#backend-name").val();

+       var backend_suffix = $("#backend-suffix").val();

+       if ( (backend_name != "" && backend_suffix == "") || (backend_name == "" && backend_suffix != "") ) {

+         if (backend_name == ""){

+           report_err($("#backend-name"), 'If you specify a backend suffix, you must also specify a backend name');

+           return;

+         } else {

+           report_err($("#backend-suffix"), 'If you specify a backend name, you must also specify a backend suffix');

+           return;

+         }

+       }

+       if (backend_name != ""){

+         // We definitely have a backend name and suffix, next validate the suffix is a DN

+         if (valid_dn(backend_suffix)) {

+           // It's valid, add it

+           setup_inf += "\n[backend-" + backend_name + "]\nsuffix = " + backend_suffix + "\n";

+         } else {

+           // Not a valid DN

+           report_err($("#backend-suffix"), 'Invalid DN for Backend Suffix');

+           return;

+         }

+       }

+ 

        /*

         * Here are steps we take to create the instance

         *

@@ -52,7 +52,7 @@ 

          </div>

          <div>

            <label for="nsslapd-disk-monitoring-grace-period" class="ds-config-diskmon-label disk-monitoring" title=

-             "How many minute to wait to allow an admin to clean up disk space before shutting slapd down. The default is 60 minute. (nsslapd-disk-monitoring-grace-period).">

+             "How many minutes to wait to allow an admin to clean up disk space before shutting slapd down. The default is 60 minutes. (nsslapd-disk-monitoring-grace-period).">

              Disk Monitoring Grace Period </label><input

              class="ds-input disk-monitoring" type="text" id="nsslapd-disk-monitoring-grace-period" size="10"/>

          </div>
@@ -446,7 +446,7 @@ 

      ---------------------------------------- -->

      <div id="local-password-policy" class="all-pages" hidden>

        <h3 class="ds-config-header">Local Password Policies  </h3>

-       <label class="ds-config-label-med" for="local-pwp-suffix">Database Suffix</Label> <select 

+       <label class="ds-config-label-med" for="local-pwp-suffix">Database Suffix</Label> <select

          class="btn btn-default dropdown ds-select" id="local-pwp-suffix">

          <option>dc=example,dc=com</option>

          <option>o=ipaca</option>
@@ -511,7 +511,7 @@ 

            <div>

              <label for="nsslapd-accesslog" class="ds-config-label" title="The access log location and name (nsslapd-accesslog).">Access Log Location</label><input

                class="ds-input" type="text" id="nsslapd-accesslog" size="40"/>

-           </div> 

+           </div>

            <div>

              <input type="checkbox" class="ds-server-checkbox" id="nsslapd-accesslog-logbuffering"><label

                for="nsslapd-accesslog-logbuffering" class="ds-label" title="Disable access log buffering for faster troubleshooting (nsslapd-accesslog-logbuffering)."> Disable Access Log Buffering</label>
@@ -601,9 +601,9 @@ 

            <label for="nsslapd-auditlog" class="ds-config-label" title="The audit log location and name (nsslapd-auditlog).">Audit Log Location</label><input

              class="ds-input" type="text" id="nsslapd-auditlog" size="40"/>

          </div>

-         <div> 

+         <div>

            <input type="checkbox" class="ds-server-checkbox" id="nsslapd-auditfaillog-logging-enabled2"><label

-             for="nsslapd-auditfaillog-logging-enabled2" class="ds-label" title="Log failed operations in the audit log (nsslapd-auditfaillog-logging-enabled)."> 

+             for="nsslapd-auditfaillog-logging-enabled2" class="ds-label" title="Log failed operations in the audit log (nsslapd-auditfaillog-logging-enabled).">

              Log Failed Operations</label>

          </div>

        </div>
@@ -1015,6 +1015,8 @@ 

  

    <!-- Modals/Popups/Wizards -->

  

+ 

+   <!-- Create SASL Mapping -->

    <div class="modal fade" id="sasl-map-form" data-backdrop="static" data-backdrop="static" tabindex="-1" role="dialog" aria-labelledby="sasl-header" aria-hidden="true">

      <div class="modal-dialog ds-modal">

        <div class="modal-content">
@@ -1061,6 +1063,7 @@ 

    </div>

  

  

+   <!-- Create Local PA\assword Policy -->

    <div class="modal fade" id="local-pwp-form" data-backdrop="static" tabindex="-1" role="dialog" aria-labelledby="local-pwp-label" aria-hidden="true">

      <div class="modal-dialog ds-modal-wide">

        <div class="modal-content">
@@ -1090,7 +1093,7 @@ 

                  </div>

                  <hr>

                <div>

-                 

+ 

                </div>

              </div>

              <div class="ds-container">
@@ -1198,7 +1201,7 @@ 

                  <p></p>

                </div>

              </div>

-       

+ 

              <h4><br>Password Syntax Settings</h4>

              <hr class="ds-hr">

              <input type="checkbox" class="ds-config-checkbox" id="local-passwordchecksyntax"><label

file modified
+6 -10
@@ -20,22 +20,18 @@ 

  

  parser = argparse.ArgumentParser()

  parser.add_argument('-v', '--verbose',

-         help="Display verbose operation tracing during command execution",

-         action='store_true', default=False, dest='verbose'

-     )

+                     help="Display verbose operation tracing during command execution",

+                     action='store_true', default=False, dest='verbose')

  subparsers = parser.add_subparsers(help="action")

+ 

  install_parser = subparsers.add_parser('install', help="Create an instance of Directory Server from an inf answer file")

  install_parser.add_argument('file', help="Inf file to use with prepared answers. You can generate an example of this with 'dscreate create-template'")

  install_parser.add_argument('-n', '--dryrun', help="Validate system and configurations only. Do not alter the system.",

-                              action='store_true', default=False)

- install_parser.add_argument('--IsolemnlyswearthatIamuptonogood', dest="ack",

-                              help="""You are here likely here by mistake! You want setup-ds.pl!

- By setting this value you acknowledge and take responsibility for the fact this command is UNTESTED and NOT READY. You are ON YOUR OWN!

- """,

-                              action='store_true', default=False)

+                             action='store_true', default=False)

  install_parser.add_argument('-c', '--containerised', help="Indicate to the installer that this is running in a container. Used to disable systemd native components, even if they are installed.",

-                              action='store_true', default=False)

+                             action='store_true', default=False)

  install_parser.set_defaults(func=cli_instance.instance_create)

+ 

  template_parser = subparsers.add_parser('create-template', help="Display an example inf answer file, or provide a file name to write it to disk.")

  template_parser.add_argument('template_file', nargs="?", default=None, help="Write example template to this file")

  template_parser.set_defaults(func=cli_instance.instance_example)

@@ -16,7 +16,7 @@ 

  import time

  import sys

  

- from lib389.instance.options import General2Base, Slapd2Base

+ from lib389.instance.options import General2Base, Slapd2Base, Backend2Base

  

  

  def instance_list(inst, log, args):
@@ -88,9 +88,12 @@ 

  ; To use an INF file with dscreate, you must at least set the parameters

  ; flagged with [REQUIRED].

  

-     """

+ """

+ 

      g2b = General2Base(log)

      s2b = Slapd2Base(log)

+     b2b = Backend2Base(log, "backend-userroot")

+ 

      if args.template_file:

          try:

              # Create file and set permissions
@@ -103,6 +106,7 @@ 

              template_file.write(gpl_copyright)

              template_file.write(g2b.collect_help())

              template_file.write(s2b.collect_help())

+             template_file.write(b2b.collect_help())

              template_file.close()

          except OSError as e:

              log.error("Failed trying to create template file ({}), error: {}".format(args.template_file, str(e)))
@@ -111,6 +115,7 @@ 

          print(gpl_copyright)

          print(g2b.collect_help())

          print(s2b.collect_help())

+         print(b2b.collect_help())

      return True

  

  

@@ -11,6 +11,7 @@ 

  from .config_001003006 import c001003006, c001003006_sample_entries

  from .config_001004000 import c001004000, c001004000_sample_entries

  

+ 

  def get_config(version):

      # We do this to avoid test breaking on older version that may

      # not expect the new default layout.
@@ -24,6 +25,7 @@ 

          return c001003006

      raise Exception('version %s no match' % version)

  

+ 

  def get_sample_entries(version):

      if (version == INSTALL_LATEST_CONFIG):

          return c001004000_sample_entries

@@ -54,7 +54,6 @@ 

          self._options = {}  # this takes the default

          self._type = {}  # Lists the type the item should be.

          self._helptext = {}  # help text for the option, MANDATORY.

-         self._example_comment = {}  # If this is a commented value in the example.

          self._valid_func = {}  # options verification function.

          self._section = None

          self.log = log
@@ -70,13 +69,12 @@ 

                  elif self._type[k] == str:

                      v = config.get(self._section, k)

                  # How does this handle wrong types?

-             except ValueError:

-                 # Should we raise an assertion error?

-                 # No, the sectons don't exist, continue

-                 self.log.debug('%s:%s not in inf, or incorrect type, using default' % (self._section, k))

-                 continue

+             except ValueError as e:

+                 # Invalid type

+                 err_msg = ('Invalid value in section "%s", "%s" has incorrect type (%s)' % (self._section, k, str(e)))

+                 raise ValueError(err_msg)

              except configparser.NoOptionError:

-                 self.log.debug('%s:%s not in inf, or incorrect type, using default' % (self._section, k))

+                 self.log.debug('%s:%s not in inf, using default' % (self._section, k))

                  continue

              self._options[k] = v

  
@@ -89,19 +87,13 @@ 

      def collect(self):

          return self._options

  

-     def collect_help(self):

+     def collect_help(self, comment=False):

          helptext = "[%s]\n" % self._section

          for k in sorted(self._options.keys()):

-             if self._example_comment[k]:

-                 helptext += "# %s (%s) [optional]\n" % (k, self._type[k].__name__)

-                 helptext += "# Description: %s\n" % (self._helptext[k])

-                 helptext += "# Default value: %s \n" % (self._options[k])

-                 helptext += ";%s = %s\n\n" % (k, self._options[k])

-             else:

-                 helptext += "# %s (%s) [REQUIRED]\n" % (k, self._type[k].__name__)

-                 helptext += "# Description: %s\n" % (self._helptext[k])

-                 helptext += "# Default value: %s \n" % (self._options[k])

-                 helptext += ";%s = %s\n\n" % (k, self._options[k])

+             helptext += "# %s (%s)\n" % (k, self._type[k].__name__)

+             helptext += "# Description: %s\n" % (self._helptext[k])

+             helptext += "# Default value: %s \n" % (self._options[k])

+             helptext += ";%s = %s\n\n" % (k, self._options[k])

          return helptext

  

  #
@@ -117,35 +109,29 @@ 

          self._options['config_version'] = 2

          self._type['config_version'] = int

          self._helptext['config_version'] = "Sets the format version of this INF file. To use the INF file with dscreate, you must set this parameter to \"2\"."

-         self._example_comment['config_version'] = False

  

-         self._options['full_machine_name'] = socket.gethostname()

+         self._options['full_machine_name'] = socket.getfqdn()

          self._type['full_machine_name'] = str

          self._helptext['full_machine_name'] = "Sets the fully qualified hostname (FQDN) of this system. When installing this instance with GSSAPI authentication behind a load balancer, set this parameter to the FQDN of the load balancer and, additionally, set \"strict_host_checking\" to \"false\"."

-         self._example_comment['full_machine_name'] = False

  

          self._options['strict_host_checking'] = True

          self._type['strict_host_checking'] = bool

          self._helptext['strict_host_checking'] = "Sets whether the server verifies the forward and reverse record set in the \"full_machine_name\" parameter. When installing this instance with GSSAPI authentication behind a load balancer, set this parameter to \"false\"."

-         self._example_comment['strict_host_checking'] = True

  

          self._options['selinux'] = True

          self._type['selinux'] = bool

          self._helptext['selinux'] = "Enables SELinux detection and integration during the installation of this instance. If set to \"True\", dscreate auto-detects whether SELinux is enabled. Set this parameter only to \"False\" in a development environment."

-         self._example_comment['selinux'] = True

  

          self._options['systemd'] = ds_paths.with_systemd

          self._type['systemd'] = bool

          self._helptext['systemd'] = "Enables systemd platform features. If set to \"True\", dscreate auto-detects whether systemd is installed. Set this only to \"False\" in a development environment."

-         self._example_comment['systemd'] = True

  

          self._options['defaults'] = INSTALL_LATEST_CONFIG

          self._type['defaults'] = str

          self._helptext['defaults'] = "Directory Server enables administrators to use the default values for cn=config entries from a specific version. If you set this parameter to \"{LATEST}\", which is the default, the instance always uses the default values of the latest version. For example, to configure that the instance uses default values from version 1.3.5, set this parameter to \"001003005\". The format of this value is XXXYYYZZZ, where X is the major version, Y the minor version, and Z the patch level. Note that each part of the value uses 3 digits and must be filled with leading zeros if necessary.".format(LATEST=INSTALL_LATEST_CONFIG)

-         self._example_comment['defaults'] = True

  

  #

- # This module contains the base options and configs for Director Server

+ # This module contains the base options and configs for Directory Server

  # setup and install. This allows

  #

  
@@ -158,144 +144,120 @@ 

          self._options['instance_name'] = 'localhost'

          self._type['instance_name'] = str

          self._helptext['instance_name'] = "Sets the name of the instance. You can refer to this value in other parameters of this INF file using the \"{instance_name}\" variable. Note that this name cannot be changed after the installation!"

-         self._example_comment['instance_name'] = False

  

          self._options['user'] = ds_paths.user

          self._type['user'] = str

          self._helptext['user'] = "Sets the user name the ns-slapd process will use after the service started."

-         self._example_comment['user'] = True

  

          self._options['group'] = ds_paths.group

          self._type['group'] = str

          self._helptext['group'] = "Sets the group name the ns-slapd process will use after the service started."

-         self._example_comment['group'] = True

  

          self._options['root_dn'] = ds_paths.root_dn

          self._type['root_dn'] = str

          self._helptext['root_dn'] = "Sets the Distinquished Name (DN) of the administrator account for this instance."

-         self._example_comment['root_dn'] = True

  

-         self._options['root_password'] = 'directory manager password'

+         self._options['root_password'] = 'Directory_Manager_Password'

          self._type['root_password'] = str

-         self._helptext['root_password'] = "Sets the password of the account specified in the \"root_dn\" parameter. You can either set this parameter to a plain text password dscreate hashes during the installation or to a \"{algorithm}hash\" string generated by the pwdhash utility. Note that setting a plain text password can be a security risk if unprivileged users can read this INF file!"

-         self._example_comment['root_password'] = False

+         self._helptext['root_password'] = ("Sets the password of the account specified in the \"root_dn\" parameter. " +

+                                            "You can either set this parameter to a plain text password dscreate hashes " +

+                                            "during the installation or to a \"{algorithm}hash\" string generated by the " +

+                                            "pwdhash utility. Note that setting a plain text password can be a security " +

+                                            "risk if unprivileged users can read this INF file!")

  

          self._options['prefix'] = ds_paths.prefix

          self._type['prefix'] = str

          self._helptext['prefix'] = "Sets the file system prefix for all other directories. You can refer to this value in other fields using the {prefix} variable or the $PREFIX environment variable. Only set this parameter in a development environment."

-         self._example_comment['prefix'] = True

  

          self._options['port'] = 389

          self._type['port'] = int

          self._helptext['port'] = "Sets the TCP port the instance uses for LDAP connections."

-         self._example_comment['port'] = True

  

          self._options['secure_port'] = 636

          self._type['secure_port'] = int

          self._helptext['secure_port'] = "Sets the TCP port the instance uses for TLS-secured LDAP connections (LDAPS)."

-         self._example_comment['secure_port'] = True

  

          self._options['self_sign_cert'] = True

          self._type['self_sign_cert'] = bool

          self._helptext['self_sign_cert'] = "Sets whether the setup creates a self-signed certificate and enables TLS encryption during the installation. This is not suitable for production, but it enables administrators to use TLS right after the installation. You can replace the self-signed certificate with a certificate issued by a Certificate Authority."

-         self._example_comment['self_sign_cert'] = True

  

          self._options['self_sign_cert_valid_months'] = 24

          self._type['self_sign_cert_valid_months'] = int

          self._helptext['self_sign_cert_valid_months'] = "Set the number of months the issued self-signed certificate will be valid."

-         self._example_comment['self_sign_cert_valid_months'] = True

  

          # In the future, make bin and sbin /usr/[s]bin, but we may need autotools assistance from Ds

          self._options['bin_dir'] = ds_paths.bin_dir

          self._type['bin_dir'] = str

          self._helptext['bin_dir'] = "Sets the location where the Directory Server binaries are stored. Only set this parameter in a development environment."

-         self._example_comment['bin_dir'] = True

  

          self._options['sbin_dir'] = ds_paths.sbin_dir

          self._type['sbin_dir'] = str

          self._helptext['sbin_dir'] = "Sets the location where the Directory Server administration binaries are stored. Only set this parameter in a development environment."

-         self._example_comment['sbin_dir'] = True

  

          self._options['sysconf_dir'] = ds_paths.sysconf_dir

          self._type['sysconf_dir'] = str

          self._helptext['sysconf_dir'] = "Sets the location of the system's configuration directory. Only set this parameter in a development environment."

-         self._example_comment['sysconf_dir'] = True

  

          self._options['initconfig_dir'] = ds_paths.initconfig_dir

          self._type['initconfig_dir'] = str

          self._helptext['initconfig_dir'] = "Sets the directory of the operating system's rc configuration directory. Only set this parameter in a development environment."

-         self._example_comment['initconfig_dir'] = True

  

          # In the future, make bin and sbin /usr/[s]bin, but we may need autotools assistance from Ds

          self._options['data_dir'] = ds_paths.data_dir

          self._type['data_dir'] = str

          self._helptext['data_dir'] = "Sets the location of Directory Server shared static data. Only set this parameter in a development environment."

-         self._example_comment['data_dir'] = True

  

          self._options['local_state_dir'] = ds_paths.local_state_dir

          self._type['local_state_dir'] = str

          self._helptext['local_state_dir'] = "Sets the location of Directory Server variable data. Only set this parameter in a development environment."

-         self._example_comment['local_state_dir'] = True

  

          self._options['lib_dir'] = ds_paths.lib_dir

          self._type['lib_dir'] = str

          self._helptext['lib_dir'] = "Sets the location of Directory Server shared libraries. Only set this parameter in a development environment."

-         self._example_comment['lib_dir'] = True

  

          self._options['cert_dir'] = ds_paths.cert_dir

          self._type['cert_dir'] = str

          self._helptext['cert_dir'] = "Sets the directory of the instance's Network Security Services (NSS) database."

-         self._example_comment['cert_dir'] = True

  

          self._options['config_dir'] = ds_paths.config_dir

          self._type['config_dir'] = str

          self._helptext['config_dir'] = "Sets the configuration directory of the instance."

-         self._example_comment['config_dir'] = True

  

          self._options['inst_dir'] = ds_paths.inst_dir

          self._type['inst_dir'] = str

          self._helptext['inst_dir'] = "Sets the directory of instance-specific scripts."

-         self._example_comment['inst_dir'] = True

  

          self._options['backup_dir'] = ds_paths.backup_dir

          self._type['backup_dir'] = str

          self._helptext['backup_dir'] = "Set the backup directory of the instance."

-         self._example_comment['backup_dir'] = True

  

          self._options['db_dir'] = ds_paths.db_dir

          self._type['db_dir'] = str

          self._helptext['db_dir'] = "Sets the database directory of the instance."

-         self._example_comment['db_dir'] = True

  

          self._options['ldif_dir'] = ds_paths.ldif_dir

          self._type['ldif_dir'] = str

          self._helptext['ldif_dir'] = "Sets the LDIF export and import directory of the instance."

-         self._example_comment['ldif_dir'] = True

  

          self._options['lock_dir'] = ds_paths.lock_dir

          self._type['lock_dir'] = str

          self._helptext['lock_dir'] = "Sets the lock directory of the instance."

-         self._example_comment['lock_dir'] = True

  

          self._options['log_dir'] = ds_paths.log_dir

          self._type['log_dir'] = str

          self._helptext['log_dir'] = "Sets the log directory of the instance."

-         self._example_comment['log_dir'] = True

  

          self._options['run_dir'] = ds_paths.run_dir

          self._type['run_dir'] = str

          self._helptext['run_dir'] = "Sets PID directory of the instance."

-         self._example_comment['run_dir'] = True

  

          self._options['schema_dir'] = ds_paths.schema_dir

          self._type['schema_dir'] = str

          self._helptext['schema_dir'] = "Sets schema directory of the instance."

-         self._example_comment['schema_dir'] = True

  

          self._options['tmp_dir'] = ds_paths.tmp_dir

          self._type['tmp_dir'] = str

          self._helptext['tmp_dir'] = "Sets the temporary directory of the instance."

-         self._example_comment['tmp_dir'] = True

  

      def _format(self, d):

          new_d = {}
@@ -317,3 +279,24 @@ 

          return self._format(self._options)

  

  

+ class Backend2Base(Options2):

+     def __init__(self, log, section):

+         super(Backend2Base, self).__init__(log)

+         self._section = section

+ 

+         self._options['suffix'] = 'dc=example,dc=com'

+         self._type['suffix'] = str

+         self._helptext['suffix'] = "Sets the root suffix stored in this database."

+ 

+         self._options['sample_entries'] = "no"

+         self._type['sample_entries'] = str

+         self._helptext['sample_entries'] = ("Set this parameter to 'yes' to add latest version of sample " +

+                                             "entries to this database.  Or, use '001003006' to use the " +

+                                             "1.3.6 version sample entries.  Use this option, for example, " +

+                                             "to create a database for testing purposes.")

+ 

+         self._options['require_index'] = False

+         self._type['require_index'] = bool

+         self._helptext['require_index'] = "Sets this parameter to \"True\" to refuse unindexed searches in this database."

+ 

+         # TODO - Add other backend settings

@@ -26,7 +26,7 @@ 

  

  from lib389.configurations import get_config

  

- from lib389.instance.options import General2Base, Slapd2Base

+ from lib389.instance.options import General2Base, Slapd2Base, Backend2Base

  

  # The poc backend api

  from lib389.backend import Backends
@@ -139,12 +139,35 @@ 

          backends = []

          for section in config.sections():

              if section.startswith('backend-'):

-                 be = {}

-                 # TODO: Add the other BACKEND_ types

-                 be[BACKEND_NAME] = section.replace('backend-', '')

-                 be[BACKEND_SUFFIX] = config.get(section, 'suffix')

-                 be[BACKEND_SAMPLE_ENTRIES] = config.get(section, 'sample_entries')

-                 backends.append(be)

+                 backend_options = Backend2Base(self.log, section)

+                 backend_options.parse_inf_config(config)

+ 

+                 suffix = config.get(section, 'suffix', fallback='')

+                 if suffix != '':

+                     be = {}

+ 

+                     # Suffix

+                     be[BACKEND_NAME] = section.replace('backend-', '')

+                     be[BACKEND_SUFFIX] = config.get(section, 'suffix')

+ 

+                     # Sample entries

+                     sample_entries = config.get(section, 'sample_entries', fallback='no')

+                     if sample_entries.lower() != 'no':

+                         if sample_entries.lower() == 'yes':

+                             be[BACKEND_SAMPLE_ENTRIES] = INSTALL_LATEST_CONFIG

+                         elif (sample_entries != '001003006' and sample_entries != '001004000'):

+                             # invalid value

+                             raise ValueError('Invalid value for sample_entries ({}), you must use "yes", "no", "001003006", or "001004000"'.format(sample_entries))

+                         else:

+                             be[BACKEND_SAMPLE_ENTRIES] = sample_entries

+ 

+                     # Require index

+                     req_idx = config.getboolean(section, 'require_index', fallback=False)

+                     if req_idx:

+                         be[BACKEND_REQ_INDEX] = "on"

+ 

+                     # Add this backend to the list

+                     backends.append(be)

  

          if self.verbose:

              self.log.info("Configuration backends %s" % backends)
@@ -156,9 +179,7 @@ 

          # Check we have all the sections.

          # Make sure we have needed keys.

          assert_c(config.has_section('general'), "Missing configuration section [general]")

-         assert_c(config.has_option('general', 'config_version'), "Missing configuration config_version in section [general]")

-         assert_c(config.get('general', 'config_version') >= '2', "config_version in section [general] should be 2 or greater")

-         if config.get('general', 'config_version') == '2':

+         if config.get('general', 'config_version', fallback='2') == '2':

              # Call our child api to validate itself from the inf.

              self._validate_config_2(config)

              return self._validate_ds_2_config(config)
@@ -244,7 +265,8 @@ 

          assert_c(slapd['root_dn'] is not None, "Configuration root_dn in section [slapd] not found")

          # Assert this is a valid DN

          assert_c(is_a_dn(slapd['root_dn']), "root_dn in section [slapd] is not a well formed LDAP DN")

-         assert_c(slapd['root_password'] is not None, "Configuration root_password in section [slapd] not found")

+         assert_c(slapd['root_password'] is not None and slapd['root_password'] != '',

+                  "Configuration attribute 'root_password' in section [slapd] not found")

          # Check if pre-hashed or not.

          # !!!!!!!!!!!!!!

  

Description: Added new directives to the inf file to create multiple
backends. Also update the UI for the new options.

          Did some other minor code cleanup

https://pagure.io/389-ds-base/issue/49808

Reviewed by: ?

With True I get

[root@server ds]# dscreate install test1
READY: Preparing installation for localhost
READY: Beginning installation for localhost
Created symlink /etc/systemd/system/multi-user.target.wants/dirsrv@localhost.service → /usr/lib/systemd/system/dirsrv@.service.
Error: version True no match

According to src/lib389/lib389/configurations/__init__.py it should be a numerical value matching DS version, for example '001004000'

Hmm yeah I need to look into this. I'm not sure I like this numerical format...

Beside the Viktor's concern, the code looks good to me.

rebased onto 870f0a0c3d2dda80360ab8bcce377f2479f66112

3 years ago

rebased onto f899937c4a1260addb9275c46da532d819f3893f

3 years ago

rebased onto 22c485345dcea440f9c2d82328ec374cf0ba2482

3 years ago

@spichugi @vashirov I made some more changes to this one so if you don't mind revewing it again I'd appreciate it!

rebased onto 6d1a2fb95021daca1338e8b68050a10b23187819

3 years ago

rebased onto 76326412b5ea361dabbd687272b683ca52c83c8c

3 years ago

rebased onto f80d8e7bd971fa7969b11983ff171697f633ea1f

3 years ago

You should not assert this by default as it causes more issues than good.

You shouldn't change this from the default, because people may not want randomly named instances. If I setup a prd cluster I don't want an instance on one calle "slapd-penny" and the other being "slapd-flower" or something. It's better to let people just choose, and have a sane default otherwise.

Also this needs to stay as localhost else it breaks the containerisation.

You need a default password here else you berka container builds

There is already support for mulitple backends in the installer and inf format. I'm not sure what you're trying to do here .....

This is just for the template - people can name it whatever they want. Every customer case I've ever looked at is using the hostname as the server id. That makes the most sense for a default value instead of defaulting to 'localhost' which no one uses except for development. But how does this break containers?

I just made this optional, not required. What is the concern here? That getfqdn() will fail or is unreliable? Apparently gethostnmae() is not the best option for getting the fqdn, so I switch it to getfqdn(). Just curious what issues you are concerned about.

This has been made into a required value. So there really is no default. How does this break containers?

These template files are meant to be edited, so I don't understand how anything done here in this PR is breaking containers. You still have to edit the template file regardless if it's in a container or not. With this PR there is less to edit actually.

There is already support for mulitple backends in the installer and inf format. I'm not sure what you're trying to do here .....

Ummm, it didn't work, and there was no validation of values/types ;-) This was also for the UI changes as well - don't be so quick to dismiss this work.

Going back to containers...

Okay, so now I see why you were having some issues with the changes to the options in the example template. In your docker file you just create template, do not edit it, and then install from it.

The issue we had was that this does not work. We get errors trying to just create template, not edit it, and install it (missing required settings, etc). So we assumed that it was NOT meant to work that way, and that it was expected that you HAVE to edit the template. So from our standpoint once you have to edit it, does it really matter what the instance name defaults to? :-)

Now that I looked at the dockerfile I understand what you were saying and I will make some changes to this PR so that it does not break the container model.

rebased onto 10baf1ca6f44fd60beadfef1e9d8feda2ff0bcab

3 years ago

The code looks good to me.
CLI backend creation works, and sample entries too.

but when I try create it through Web UI - it fails:

Error: No option 'require_index' in section: 'backend-userroot'

I didn't find the field for 'require_index'.
And when I create the backend in CLI (I uncomment and change 'sample_entries' and 'suffix') it does complain about 'require_index'. I think it should use the default if we don't specify it overwise.

The code looks good to me.
CLI backend creation works, and sample entries too.
but when I try create it through Web UI - it fails:
Error: No option 'require_index' in section: 'backend-userroot'

I didn't find the field for 'require_index'.
And when I create the backend in CLI (I uncomment and change 'sample_entries' and 'suffix') it does complain about 'require_index'. I think it should use the default if we don't specify it overwise.

It's supposed to, I'll investigate....

rebased onto 31633a710c70fe53e11e4dd3bf8ceba33383dbb2

3 years ago

rebased onto ea7e989

3 years ago

Pull-Request has been merged by mreynolds

3 years ago

389-ds-base is moving from Pagure to Github. This means that new issues and pull requests
will be accepted only in 389-ds-base's github repository.

This pull request has been cloned to Github as issue and is available here:
- https://github.com/389ds/389-ds-base/issues/2868

If you want to continue to work on the PR, please navigate to the github issue,
download the patch from the attachments and file a new pull request.

Thank you for understanding. We apologize for all inconvenience.

Pull-Request has been closed by spichugi

2 years ago