#!/bin/sh #---------------------------------------------------------------------------------- # /var/install/bin/slims-update-phonebook - update phonebook from ldap source # # Copyright (c) 2006-2024 The Eisfair Team, team(at)eisfair(dot)org # # Creation: 2009-08-25 jed # Last Update: $Id$ # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #---------------------------------------------------------------------------------- # read eislib etc. . /var/install/include/eislib # exec 2>./slims-trace-$$.log # set -x debug=0 only_single_entry=0 #------------------------------------------------------------------------------ # print debug message # input : $1 - text string # output: debug message #------------------------------------------------------------------------------ print_debug () { if [ "${debug}" -eq 1 ] then echo "$1" fi } #---------------------------------------------------------------------------------- # decode base64 encoded strings # # input : $1 - base64 string # output: ascii string #---------------------------------------------------------------------------------- decode_base64() { _db64_in="$1" # decode string... # 1. decode BASE64 # 2. decode UTF-8 to ISO-8859-1 _db64_out="`echo "${_db64_in}" | perl -MMIME::Base64 -ne 'print decode_base64($_)' | iconv -f UTF-8 -t ISO-8859-1`" echo "${_db64_out}" } #---------------------------------------------------------------------------------- # decode bas64 encoded ldap string # # input : $1 - encoded ldap string # output: decoded ldap string #---------------------------------------------------------------------------------- decode_ldap_string() { _tls_instr=$1 # check if string is encoded (e.g. dn:: ...) echo "${_tls_instr}" | grep -E -q "[a-zA-Z0-9]+:: " if [ $? -eq 0 ] then # separate ldap field name from value _tls_part1=`echo "${_tls_instr}" | cut -d' ' -f1 | sed 's/::/:/'` _tls_part2=`echo "${_tls_instr}" | cut -d' ' -f2` # decode value _tls_outstr="${_tls_part1} `decode_base64 "${_tls_part2}"`" else _tls_outstr="${_tls_instr}" fi echo "${_tls_outstr}" } #---------------------------------------------------------------------------------- # remove leading country code and extend area code # # input : $1 - phone number in international format # output: shortened phone number #---------------------------------------------------------------------------------- remove_ccode_and_extend_acode() { _rc_inphone=$1 echo "${_rc_inphone}" | grep -E -q "^\+[0-9]+" if [ $? -eq 0 ] then # international number _rc_outphone="`echo "${_rc_inphone}" | sed 's#\+[0-9]\+ \+(#(0#g'`" else _rc_outphone="${_rc_inphone}" fi echo "${_rc_outphone}" } #================================================================================== # main #================================================================================== pgmname=`basename $0` slims_spoolpath=/var/slims # vvv- customize here -vvv - define parameters default_ccode='49' ldap_auth='no' ldap_binddn='cn=cyrus, dc=privatnet,dc=lan' ldap_bindpw='geheim' #ldap_hosturi='ldap://ldap.privatnet.lan:389' ldap_hosturi='ldaps://ldap.privatnet.lan:636' ldap_searchbase='ou=slims-phonebook,ou=Addresses,dc=privatnet,dc=lan' ldap_field_mobile='Mobil' ldap_field_company='Firma' # ^^^- customize here -^^^ # default ldap parameters ldap_debug_str='' ldap_fields='givenName sn homePhone mobile telephoneNumber mozillaCustom4' ldap_sizelimit=0 ldap_query='cn=*' ldap_deref='always' ldap_deref='search' ldap_surname='' ldap_givenname='' ldap_homephone='' ldap_mobile='' ldap_telephonenumber='' ldap_modified='' line_prev='' line_curr='' # other variables ldap_bin=/usr/bin/ldapsearch ldap_passwd=/var/run/ldap.$$ out_tmp1=/tmp/slims-update-phonebook-1.$$ out_tmp2=/tmp/slims-update-phonebook-2.$$ out_file=${slims_spoolpath}/phonebook.txt # ldap debugging if [ "${ldap_debug}" = "yes" ] then # set debug level=2 ldap_debug_str='-d 2' else ldap_debug_str='' fi # ldap authentication if [ "${ldap_auth}" = "yes" ] then # write password to file without LF (0a) touch ${ldap_passwd} chmod 600 ${ldap_passwd} echo -n "${ldap_bindpw}" > ${ldap_passwd} # remove spaces from string ldap_binddn=`echo ${ldap_binddn} | sed 's/ //g'` ldap_auth_str="-D ${ldap_binddn} -y ${ldap_passwd}" else ldap_auth_str='' fi # a - specify how aliases dereferencing is done # p - ldap port # b - search_base # v - verbose # d - debug # x - use simple authentication instead of SASL # D - Distinguished Name to bind to LDAP directory # y - use contents of passwdfile for simple authentication # H - LDAP-URI # z - size limit, return only x results # L - search results are display in LDAP Data Interchange Format # ldap search ${ldap_bin} ${ldap_debug_str} -a ${ldap_deref} -b ${ldap_searchbase} -H ${ldap_hosturi} ${ldap_auth_str} -LLL -x -z ${ldap_sizelimit} "(${ldap_query})" ${ldap_fields} 'objectclass=*' > ${out_tmp1} 2> /dev/null ldap_res=$? if [ ${ldap_res} -eq 0 -a -s ${out_tmp1} ] then # add two empty lines echo >> ${out_tmp1} echo >> ${out_tmp1} ldap_homephone_count=0 ldap_mobile_count=0 ldap_telephonenumber_count=0 _old_ifs=${IFS} while read line do # example record # # dn: cn=Tim Test,ou=public,ou=Addresses,dc=privatnet,dc=lan # givenName: Tim # sn: Test # telephoneNumber: +49 (211) 3344-5566 # homePhone: +49 (2163) 7788 # mobile: +49 (176) 112233 line_prev="${line_curr}" line_curr="${line}" print_debug "---" print_debug "1:${line_prev}" print_debug "2:${line_curr}" # check if line needs to be concatenated echo "${line_curr}" | grep -q "^ " if [ $? -eq 0 ] then # concate line ldap_tmp="${line_prev}`echo "${line_curr}" | sed 's/^ //'`" else ldap_tmp="${line_prev}" fi print_debug "X:${ldap_tmp}" print_debug "---" if [ -z "${ldap_tmp}" ] then ldap_tmp='' ldap_tmp_value='' else # Format:surname, given name (type) | (area) number # last modified ldap_tmp=`decode_ldap_string "${ldap_tmp}"` ldap_tmp_value="`echo "${ldap_tmp}" | cut -d: -f2- | sed 's/^ *//'`" fi case ${ldap_tmp} in # dn:*) # entry not required # echo "DN:${line}" # ;; givenName:*) # given name ldap_givenname="${ldap_tmp_value}" ;; homePhone:*) # home phone number if [ -z "${ldap_tmp_value}" ] then ldap_homephone='' else if [ -z "${ldap_homephone}" ] then ldap_homephone="`remove_ccode_and_extend_acode "${ldap_tmp_value}"`" ldap_homephone_count=1 else ldap_homephone="${ldap_homephone}:`remove_ccode_and_extend_acode "${ldap_tmp_value}"`" ldap_homephone_count=`expr ${ldap_homephone_count} + 1` fi fi ;; mobile:*) # mobile phone number if [ -z "${ldap_tmp_value}" ] then ldap_mobile='' else if [ -z "${ldap_mobile}" ] then ldap_mobile="`remove_ccode_and_extend_acode "${ldap_tmp_value}"`" ldap_mobile_count=1 else ldap_mobile="${ldap_mobile}:`remove_ccode_and_extend_acode "${ldap_tmp_value}"`" ldap_mobile_count=`expr ${ldap_mobile_count} + 1` fi fi ;; mozillaCustom4:*) # record last updated if [ -z "${ldap_tmp_value}" ] then ldap_modified='' else ldap_modified="${ldap_tmp_value}" fi ;; sn:*) # surname ldap_surname="${ldap_tmp_value}" ;; telephoneNumber:*) # company phone number if [ -z "${ldap_tmp_value}" ] then ldap_telephonenumber='' else if [ -z "${ldap_telephonenumber}" ] then ldap_telephonenumber="`remove_ccode_and_extend_acode "${ldap_tmp_value}"`" ldap_telephonenumber_count=1 else ldap_telephonenumber="${ldap_telephonenumber}:`remove_ccode_and_extend_acode "${ldap_tmp_value}"`" ldap_telephonenumber_count=`expr ${ldap_telephonenumber_count} + 1` fi fi ;; '') if [ ${only_single_entry} -ne 0 ] then # restrict output to one entry per field ldap_homephone_count=1 ldap_mobile_count=1 ldap_telephonenumber_count=1 fi if [ -n "${ldap_surname}" ] then # end of record, print it out techo --file --begin 40 2 20 2 14 # surname with spaces, like 'von der Lippe' echo "${ldap_surname}" | grep -q " " if [ $? -eq 0 ] then if [ -n "${ldap_givenname}" ] then # convert surname 'von der Lippe' -> 'Lippe' ldap_out="`echo "${ldap_surname}" | sed 's/^.* //g'`" # convert surname 'von der Lippe' -> 'von der' ldap_givenname="${ldap_givenname} `echo "${ldap_surname}" | sed 's/ [a-zA-Z]*$//'`" else ldap_out="${ldap_surname}" fi else ldap_out="${ldap_surname}" fi if [ -n "${ldap_givenname}" ] then ldap_out="${ldap_out}, ${ldap_givenname}" fi # print home phone number if [ -n "${ldap_homephone}" ] then idx=1 while [ ${idx} -le ${ldap_homephone_count} ] do phone_tmp=`echo "${ldap_homephone}" | cut -d: -f${idx}` techo --file --row "${ldap_out}" "|" "${phone_tmp}" "#" "${ldap_modified}" idx=`expr ${idx} + 1` done fi # print mobile phone number if [ -n "${ldap_mobile}" ] then idx=1 while [ ${idx} -le ${ldap_mobile_count} ] do phone_tmp=`echo "${ldap_mobile}" | cut -d: -f${idx}` techo --file --row "${ldap_out} (${ldap_field_mobile})" "|" "${phone_tmp}" "#" "${ldap_modified}" idx=`expr ${idx} + 1` done fi # print company phone number if [ -n "${ldap_telephonenumber}" ] then idx=1 while [ ${idx} -le ${ldap_telephonenumber_count} ] do phone_tmp=`echo "${ldap_telephonenumber}" | cut -d: -f${idx}` techo --file --row "${ldap_out} (${ldap_field_company})" "|" "${phone_tmp}" "#" "${ldap_modified}" idx=`expr ${idx} + 1` done fi techo --file --end fi ldap_homephone_count=0 ldap_mobile_count=0 ldap_telephonenumber_count=0 ldap_surname='' ldap_givenname='' ldap_homephone='' ldap_mobile='' ldap_telephonenumber='' ldap_modified='' ;; *) # invalid -> ignore ;; esac # sleep 1 done < ${out_tmp1} > ${out_tmp2} IFS=${_old_ifs} # sort file on alphabetical order { echo '#' echo "# Created by ${pgmname} on ${EISDATE} ${EISTIME}" echo '#' sort ${out_tmp2} } > ${out_file} else # error print_debug "- request unsuccessfull." fi # remove temporary files rm -f ${out_tmp1} rm -f ${out_tmp2} rm -f ${tmpfile} anykey #================================================================================== # end #================================================================================== exit 0