| Sean Dague | e263c82 | 2014-12-05 14:25:28 -0500 | [diff] [blame] | 1 | #!/bin/bash | 
|  | 2 | # | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 3 | # lib/ldap | 
|  | 4 | # Functions to control the installation and configuration of **ldap** | 
|  | 5 |  | 
| Dean Troyer | cc6b443 | 2013-04-08 15:38:03 -0500 | [diff] [blame] | 6 | # ``lib/keystone`` calls the entry points in this order: | 
| Adam Spiers | 6a5aa7c | 2013-10-24 11:27:02 +0100 | [diff] [blame] | 7 | # | 
|  | 8 | # - install_ldap() | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 9 |  | 
|  | 10 | # Save trace setting | 
|  | 11 | XTRACE=$(set +o | grep xtrace) | 
|  | 12 | set +o xtrace | 
|  | 13 |  | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 14 |  | 
|  | 15 | LDAP_DOMAIN=${LDAP_DOMAIN:-openstack.org} | 
|  | 16 | # Make an array of domain components | 
|  | 17 | DC=(${LDAP_DOMAIN/./ }) | 
|  | 18 |  | 
|  | 19 | # Leftmost domain component used in top-level entry | 
|  | 20 | LDAP_BASE_DC=${DC[0]} | 
|  | 21 |  | 
|  | 22 | # Build the base DN | 
|  | 23 | dn="" | 
|  | 24 | for dc in ${DC[*]}; do | 
|  | 25 | dn="$dn,dc=$dc" | 
|  | 26 | done | 
|  | 27 | LDAP_BASE_DN=${dn#,} | 
|  | 28 |  | 
|  | 29 | LDAP_MANAGER_DN="${LDAP_MANAGER_DN:-cn=Manager,${LDAP_BASE_DN}}" | 
|  | 30 | LDAP_URL=${LDAP_URL:-ldap://localhost} | 
|  | 31 |  | 
| Ralf Haferkamp | 704106a | 2013-09-12 14:24:47 +0200 | [diff] [blame] | 32 | LDAP_SERVICE_NAME=slapd | 
| Dean Troyer | cc6b443 | 2013-04-08 15:38:03 -0500 | [diff] [blame] | 33 |  | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 34 | if is_ubuntu; then | 
|  | 35 | LDAP_OLCDB_NUMBER=1 | 
|  | 36 | LDAP_ROOTPW_COMMAND=replace | 
|  | 37 | elif is_fedora; then | 
|  | 38 | LDAP_OLCDB_NUMBER=2 | 
|  | 39 | LDAP_ROOTPW_COMMAND=add | 
|  | 40 | elif is_suse; then | 
|  | 41 | # SUSE has slappasswd in /usr/sbin/ | 
|  | 42 | PATH=$PATH:/usr/sbin/ | 
|  | 43 | LDAP_OLCDB_NUMBER=1 | 
|  | 44 | LDAP_ROOTPW_COMMAND=add | 
|  | 45 | LDAP_SERVICE_NAME=ldap | 
|  | 46 | fi | 
|  | 47 |  | 
|  | 48 |  | 
| Dean Troyer | cc6b443 | 2013-04-08 15:38:03 -0500 | [diff] [blame] | 49 | # Functions | 
|  | 50 | # --------- | 
|  | 51 |  | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 52 | # Perform common variable substitutions on the data files | 
|  | 53 | # _ldap_varsubst file | 
| Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 54 | function _ldap_varsubst { | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 55 | local infile=$1 | 
| Julie Pichon | a3d60c8 | 2014-11-21 14:57:16 +0000 | [diff] [blame] | 56 | local slappass=$2 | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 57 | sed -e " | 
|  | 58 | s|\${LDAP_OLCDB_NUMBER}|$LDAP_OLCDB_NUMBER| | 
| Julie Pichon | a3d60c8 | 2014-11-21 14:57:16 +0000 | [diff] [blame] | 59 | s|\${SLAPPASS}|$slappass| | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 60 | s|\${LDAP_ROOTPW_COMMAND}|$LDAP_ROOTPW_COMMAND| | 
|  | 61 | s|\${BASE_DC}|$LDAP_BASE_DC| | 
|  | 62 | s|\${BASE_DN}|$LDAP_BASE_DN| | 
|  | 63 | s|\${MANAGER_DN}|$LDAP_MANAGER_DN| | 
|  | 64 | " $infile | 
|  | 65 | } | 
|  | 66 |  | 
|  | 67 | # clean_ldap() - Remove ldap server | 
| Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 68 | function cleanup_ldap { | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 69 | uninstall_package $(get_packages ldap) | 
|  | 70 | if is_ubuntu; then | 
|  | 71 | uninstall_package slapd ldap-utils libslp1 | 
|  | 72 | sudo rm -rf /etc/ldap/ldap.conf /var/lib/ldap | 
|  | 73 | elif is_fedora; then | 
|  | 74 | sudo rm -rf /etc/openldap /var/lib/ldap | 
|  | 75 | elif is_suse; then | 
|  | 76 | sudo rm -rf /var/lib/ldap | 
|  | 77 | fi | 
|  | 78 | } | 
|  | 79 |  | 
|  | 80 | # init_ldap | 
|  | 81 | # init_ldap() - Initialize databases, etc. | 
| Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 82 | function init_ldap { | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 83 | local keystone_ldif | 
|  | 84 |  | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 85 | local tmp_ldap_dir=$(mktemp -d -t ldap.$$.XXXXXXXXXX) | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 86 |  | 
|  | 87 | # Remove data but not schemas | 
|  | 88 | clear_ldap_state | 
|  | 89 |  | 
|  | 90 | # Add our top level ldap nodes | 
|  | 91 | if ldapsearch -x -w $LDAP_PASSWORD -D "$LDAP_MANAGER_DN" -H $LDAP_URL -b "$LDAP_BASE_DN" | grep -q "Success"; then | 
|  | 92 | printf "LDAP already configured for $LDAP_BASE_DC\n" | 
|  | 93 | else | 
|  | 94 | printf "Configuring LDAP for $LDAP_BASE_DC\n" | 
|  | 95 | # If BASE_DN is changed, the user may override the default file | 
|  | 96 | if [[ -r $FILES/ldap/${LDAP_BASE_DC}.ldif.in ]]; then | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 97 | local keystone_ldif=${LDAP_BASE_DC}.ldif | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 98 | else | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 99 | local keystone_ldif=keystone.ldif | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 100 | fi | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 101 | _ldap_varsubst $FILES/ldap/${keystone_ldif}.in >$tmp_ldap_dir/${keystone_ldif} | 
|  | 102 | if [[ -r $tmp_ldap_dir/${keystone_ldif} ]]; then | 
|  | 103 | ldapadd -x -w $LDAP_PASSWORD -D "$LDAP_MANAGER_DN" -H $LDAP_URL -c -f $tmp_ldap_dir/${keystone_ldif} | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 104 | fi | 
|  | 105 | fi | 
|  | 106 |  | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 107 | rm -rf $tmp_ldap_dir | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 108 | } | 
|  | 109 |  | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 110 | # install_ldap | 
|  | 111 | # install_ldap() - Collect source and prepare | 
| Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 112 | function install_ldap { | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 113 | echo "Installing LDAP inside function" | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 114 | echo "os_VENDOR is $os_VENDOR" | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 115 |  | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 116 | local tmp_ldap_dir=$(mktemp -d -t ldap.$$.XXXXXXXXXX) | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 117 |  | 
|  | 118 | printf "installing OpenLDAP" | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 119 | if is_ubuntu; then | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 120 | # Ubuntu automatically starts LDAP so no need to call start_ldap() | 
|  | 121 | : | 
| Ralf Haferkamp | 704106a | 2013-09-12 14:24:47 +0200 | [diff] [blame] | 122 | elif is_fedora; then | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 123 | start_ldap | 
| Ralf Haferkamp | 704106a | 2013-09-12 14:24:47 +0200 | [diff] [blame] | 124 | elif is_suse; then | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 125 | _ldap_varsubst $FILES/ldap/suse-base-config.ldif.in >$tmp_ldap_dir/suse-base-config.ldif | 
|  | 126 | sudo slapadd -F /etc/openldap/slapd.d/ -bcn=config -l $tmp_ldap_dir/suse-base-config.ldif | 
| Ralf Haferkamp | 704106a | 2013-09-12 14:24:47 +0200 | [diff] [blame] | 127 | sudo sed -i '/^OPENLDAP_START_LDAPI=/s/"no"/"yes"/g' /etc/sysconfig/openldap | 
|  | 128 | start_ldap | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 129 | fi | 
|  | 130 |  | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 131 | echo "LDAP_PASSWORD is $LDAP_PASSWORD" | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 132 | local slappass=$(slappasswd -s $LDAP_PASSWORD) | 
|  | 133 | printf "LDAP secret is $slappass\n" | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 134 |  | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 135 | # Create manager.ldif and add to olcdb | 
| Julie Pichon | a3d60c8 | 2014-11-21 14:57:16 +0000 | [diff] [blame] | 136 | _ldap_varsubst $FILES/ldap/manager.ldif.in $slappass >$tmp_ldap_dir/manager.ldif | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 137 | sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f $tmp_ldap_dir/manager.ldif | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 138 |  | 
| Brad Topol | 0c2c3fc | 2013-03-19 03:01:30 -0500 | [diff] [blame] | 139 | # On fedora we need to manually add cosine and inetorgperson schemas | 
| Dean Troyer | b9e2513 | 2013-10-01 14:45:04 -0500 | [diff] [blame] | 140 | if is_fedora; then | 
| Brad Topol | 0c2c3fc | 2013-03-19 03:01:30 -0500 | [diff] [blame] | 141 | sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif | 
|  | 142 | sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif | 
|  | 143 | fi | 
|  | 144 |  | 
| Julie Pichon | ac937bc | 2014-09-29 04:55:21 +0100 | [diff] [blame] | 145 | pip_install ldappool | 
|  | 146 |  | 
| Dean Troyer | ef66a77 | 2014-07-25 14:45:34 -0500 | [diff] [blame] | 147 | rm -rf $tmp_ldap_dir | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 148 | } | 
|  | 149 |  | 
|  | 150 | # start_ldap() - Start LDAP | 
| Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 151 | function start_ldap { | 
| Ralf Haferkamp | 704106a | 2013-09-12 14:24:47 +0200 | [diff] [blame] | 152 | sudo service $LDAP_SERVICE_NAME restart | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 153 | } | 
|  | 154 |  | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 155 | # stop_ldap() - Stop LDAP | 
| Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 156 | function stop_ldap { | 
| Ralf Haferkamp | 704106a | 2013-09-12 14:24:47 +0200 | [diff] [blame] | 157 | sudo service $LDAP_SERVICE_NAME stop | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 158 | } | 
|  | 159 |  | 
|  | 160 | # clear_ldap_state() - Clear LDAP State | 
| Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 161 | function clear_ldap_state { | 
| Dean Troyer | b44a8ef | 2014-03-06 11:25:04 -0600 | [diff] [blame] | 162 | ldapdelete -x -w $LDAP_PASSWORD -D "$LDAP_MANAGER_DN" -H $LDAP_URL -r "$LDAP_BASE_DN" || : | 
| Brad Topol | f127e2f | 2013-01-22 10:17:50 -0600 | [diff] [blame] | 163 | } | 
|  | 164 |  | 
|  | 165 | # Restore xtrace | 
|  | 166 | $XTRACE | 
| Sean Dague | 584d90e | 2013-03-29 14:34:53 -0400 | [diff] [blame] | 167 |  | 
| Adam Spiers | 6a5aa7c | 2013-10-24 11:27:02 +0100 | [diff] [blame] | 168 | # Tell emacs to use shell-script-mode | 
|  | 169 | ## Local variables: | 
|  | 170 | ## mode: shell-script | 
|  | 171 | ## End: |