From 590366639e2ffab2424990008921031fda11b0d8 Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Tue, 26 Apr 2022 20:10:51 +0200 Subject: [PATCH] Fix fresh dirsrv installs on Ubuntu 20.04 --- .../kosmos-dirsrv/attributes/default.rb | 1 - site-cookbooks/kosmos-dirsrv/files/ldif2db | 119 ++++++++++++++++++ .../kosmos-dirsrv/files/template-initconfig | 22 ++++ site-cookbooks/kosmos-dirsrv/metadata.rb | 3 +- .../kosmos-dirsrv/recipes/default.rb | 4 +- .../kosmos-dirsrv/recipes/hostsfile.rb | 15 +++ .../kosmos-dirsrv/resources/instance.rb | 14 +++ 7 files changed, 175 insertions(+), 3 deletions(-) create mode 100755 site-cookbooks/kosmos-dirsrv/files/ldif2db create mode 100644 site-cookbooks/kosmos-dirsrv/files/template-initconfig create mode 100644 site-cookbooks/kosmos-dirsrv/recipes/hostsfile.rb diff --git a/site-cookbooks/kosmos-dirsrv/attributes/default.rb b/site-cookbooks/kosmos-dirsrv/attributes/default.rb index 9da7f6f..e69de29 100644 --- a/site-cookbooks/kosmos-dirsrv/attributes/default.rb +++ b/site-cookbooks/kosmos-dirsrv/attributes/default.rb @@ -1 +0,0 @@ -node.default['kosmos-dirsrv']['master_hostname'] = 'ldap.kosmos.org' diff --git a/site-cookbooks/kosmos-dirsrv/files/ldif2db b/site-cookbooks/kosmos-dirsrv/files/ldif2db new file mode 100755 index 0000000..6e04734 --- /dev/null +++ b/site-cookbooks/kosmos-dirsrv/files/ldif2db @@ -0,0 +1,119 @@ +#!/bin/bash + +. /usr/share/dirsrv/data/DSSharedLib + +libpath_add "/usr/lib/x86_64-linux-gnu/dirsrv/" +libpath_add "" +libpath_add "/usr/lib/x86_64-linux-gnu" +libpath_add "/usr/lib/x86_64-linux-gnu" + +export LD_LIBRARY_PATH +SHLIB_PATH=$LD_LIBRARY_PATH +export SHLIB_PATH + +usage() +{ + echo "Usage: ldif2db [-Z serverID] -n backendname {-s includesuffix}* [{-x excludesuffix}*] {-i ldiffile}*" + echo " [-c chunksize] [-g [string]] [-G namespace_id] [-O] [-E] [-q] [-v] [-h]" + echo "Note: either \"-n backend\", \"-s includesuffix\", and \"-i ldiffile\" are required." + echo "Options:" + echo " -Z serverID - The server instance identifier" + echo " -n backend - Backend database name. Example: userRoot" + echo " -s inclduesuffix - Suffix to include" + echo " -x excludesuffix - Suffix to exclude" + echo " -i ldiffile - LDIF file name" + echo " -c chunksize - Number of entries to process before starting a new pass" + echo " -g [string] - String is \"none\" or \"deterministic\"" + echo " \"none\" - unique id is not generated" + echo " \"deterministic\" - generate name based unique id (-G name)" + echo " By default - generate time based unique id" + echo " -G name - Namespace id for name based uniqueid (-g deterministic)" + echo " -O - Do not index the attributes" + echo " -E - Encrypt attributes" + echo " -q - Quiet mode - suppresses output" + echo " -v - Display version" + echo " -h - Display usage" +} + +handleopts() +{ + while [ "$1" != "" ] + do + if [ "$1" = "-q" ]; then + return 1 + elif [ "$1" = "-Z" ]; then + shift + servid=$1 + elif [ "$1" = "-h" ]; then + usage + exit 0 + fi + shift + done + return 0 +} + +while getopts "Z:vhd:i:g:G:n:s:x:NOCc:St:D:Eq" flag +do + case $flag in + h) usage + exit 0;; + Z) servid=$OPTARG;; + n) args=$args" -n \"$OPTARG\"";; + i) args=$args" -i \"$OPTARG\"";; + s) args=$args" -s \"$OPTARG\"";; + x) args=$args" -x \"$OPTARG\"";; + c) args=$args" -c \"$OPTARG\"";; + d) args=$args" -d \"$OPTARG\"";; + g) args=$args" -g \"$OPTARG\"";; + G) args=$args" -G \"$OPTARG\"";; + t) args=$args" -t \"$OPTARG\"";; + D) args=$args" -D \"$OPTARG\"";; + E) args=$args" -E";; + v) args=$args" -v";; + N) args=$args" -N";; + C) args=$args" -C";; + S) args=$args" -S";; + O) args=$args" -O";; + q) args=$args" -q";; + ?) usage + exit 1;; + esac +done + +if [ $# -lt 4 ] +then + usage + exit 1 +fi + +ARGS=$@ +shift $(($OPTIND - 1)) +if [ $1 ] +then + echo "ERROR - Unknown option: $1" + usage + exit 1 +fi + +# FIXME look up if not master +initfile="/etc/default/dirsrv-master" +if [ $? -eq 1 ] +then + usage + echo "You must supply a valid server instance identifier. Use -Z to specify instance name" + echo "Available instances: $initfile" + exit 1 +fi + +. $initfile + +handleopts $ARGS +quiet=$? +if [ $quiet -eq 0 ]; then + echo importing data ... +fi + +eval /usr/sbin/ns-slapd ldif2db -D $CONFIG_DIR $args 2>&1 + +exit $? diff --git a/site-cookbooks/kosmos-dirsrv/files/template-initconfig b/site-cookbooks/kosmos-dirsrv/files/template-initconfig new file mode 100644 index 0000000..4a99993 --- /dev/null +++ b/site-cookbooks/kosmos-dirsrv/files/template-initconfig @@ -0,0 +1,22 @@ +# This file is sourced by dirsrv upon startup to set +# the default environment for a single specific directory +# server instances. To set defaults for all instances, edit +# the file in the same directory called dirsrv. + +# These settings are used by the start-dirsrv and +# start-slapd scripts (as well as their associates stop +# and restart scripts). Do not edit them unless you know +# what you are doing. + +# This file is in systemd EnvironmentFile format - see man systemd.exec + +SERVER_DIR={{SERVER-DIR}} +SERVERBIN_DIR={{SERVERBIN-DIR}} +CONFIG_DIR={{CONFIG-DIR}} +INST_DIR={{INST-DIR}} +RUN_DIR={{RUN-DIR}} +DS_ROOT={{DS-ROOT}} +PRODUCT_NAME={{PRODUCT-NAME}} + +# Put custom instance specific settings below here. +# if using systemd, omit the "; export VARNAME" at the end diff --git a/site-cookbooks/kosmos-dirsrv/metadata.rb b/site-cookbooks/kosmos-dirsrv/metadata.rb index 34060e5..83cec26 100644 --- a/site-cookbooks/kosmos-dirsrv/metadata.rb +++ b/site-cookbooks/kosmos-dirsrv/metadata.rb @@ -7,8 +7,9 @@ long_description 'Installs/Configures 389 Directory Server' version '0.1.2' chef_version '>= 14.0' -depends "firewall" depends "apt" +depends "firewall" +depends "hostsfile" depends "ulimit" depends "backup" depends "kosmos-base" diff --git a/site-cookbooks/kosmos-dirsrv/recipes/default.rb b/site-cookbooks/kosmos-dirsrv/recipes/default.rb index 9b00066..5ab07bb 100644 --- a/site-cookbooks/kosmos-dirsrv/recipes/default.rb +++ b/site-cookbooks/kosmos-dirsrv/recipes/default.rb @@ -3,10 +3,12 @@ # Recipe:: default # +include_recipe "kosmos-dirsrv::hostsfile" + credentials = data_bag_item("credentials", "dirsrv") dirsrv_instance "master" do - hostname node['kosmos-dirsrv']['master_hostname'] + hostname "ldap.kosmos.local" admin_password credentials['admin_password'] suffix "dc=kosmos,dc=org" end diff --git a/site-cookbooks/kosmos-dirsrv/recipes/hostsfile.rb b/site-cookbooks/kosmos-dirsrv/recipes/hostsfile.rb new file mode 100644 index 0000000..f6e18c5 --- /dev/null +++ b/site-cookbooks/kosmos-dirsrv/recipes/hostsfile.rb @@ -0,0 +1,15 @@ +# +# Cookbook:: kosmos-dirsrv +# Recipe:: hostsfile +# + +dirsrv_primary = search(:node, "role:dirsrv_primary AND chef_environment:#{node.chef_environment}").first + +unless dirsrv_primary.nil? + primary_ip = dirsrv_primary['knife_zero']['host'] + + hostsfile_entry primary_ip do + hostname "ldap.kosmos.local" + unique true + end +end diff --git a/site-cookbooks/kosmos-dirsrv/resources/instance.rb b/site-cookbooks/kosmos-dirsrv/resources/instance.rb index 7fd0374..966e613 100644 --- a/site-cookbooks/kosmos-dirsrv/resources/instance.rb +++ b/site-cookbooks/kosmos-dirsrv/resources/instance.rb @@ -34,6 +34,20 @@ action :create do inst_dir = "/etc/dirsrv/slapd-#{new_resource.instance_name}" service_name = "dirsrv@#{new_resource.instance_name}" + cookbook_file "/etc/dirsrv/config/template-initconfig" do + source "template-initconfig" + mode "0644" + owner "dirsrv" + group "dirsrv" + end + + cookbook_file "/usr/sbin/ldif2db" do + source "ldif2db" + mode "0755" + owner "root" + group "root" + end + unless ::Dir.exists?(inst_dir) setup_config = "#{config[:conf_dir]}/setup-#{new_resource.instance_name}.inf" template setup_config do