Portál AbcLinuxu, 20. prosince 2025 13:37
V poslední mě zajímá LDAP v pozici zdroje dat pro DHCP, DNS, atd... Do LDAP databáze je potřeba často hromadně sypat data získaná skriptem, ve formátu LDIF. Příklad záznamu v LDIFu:
dn: cn=lenovo,cn=192.168.0.0,cn=DHCP Config,dc=firma,dc=cz cn: lenovo dhcpHWAddress: ethernet XX:YY:XX:YY:XX:YY dhcpStatements: fixed-address 192.168.0.10 objectClass: top objectClass: dhcpHost
Kostru záznamu jednoduše popíšeme šablonou (soubor dhcphost.tpl):
@include base.conf @include net.conf dn: cn=%HOSTNAME%,cn=%SUBNETNUMBER%,cn=DHCP Config,%BASEDN% cn: %HOSTNAME% dhcpHWAddress: ethernet %MACADDRESS% dhcpStatements: fixed-address %IPHOSTNUMBER% objectClass: top objectClass: dhcpHost
... kde proměnné jsou rozlišeny procenty. Některé parametry jako maska podsítě a basedn jsou neměnné, uložíme je do souboru base.conf:
%BASEDN% dc=firma,dc=cz
...a net.conf:
%SUBNETNUMBER% 192.168.0.0 %SUBNETMASK% 255.255.255.0 %DHCPSERVER% server1
Následující skript (soubor makeldif.sh) generuje LDIFy:
#!/bin/bash
#check if file exists
check_file()
{
if [ ! -e $1 ]; then
die "File doesn't exist: $1"
fi
}
#include definitions from file
include()
{
include_file=$1
check_file $include_file
#read line by line
grep -v '#' $include_file | while read line; do
create_regexp "$(echo $line | awk '{print $1}')" \
"$(echo $line | awk '{print $2}')"
done
}
#create regular expression
create_regexp()
{
echo -n "s/$1/$2/g;" >> $regexp_file
}
#Show usage informations and exit
die()
{
echo $1
echo "Usage: $0 [parameters] template_file" > /dev/stderr
echo "Parameters: %VARIABLE1% value1 %VARIABLE2% value2 ..." > /dev/stderr
exit 1
}
regexp_file=regexp.tmp
rm -f $regexp_file
#exclude last param
param_count=$(expr $# - 1)
#check if params count is correct
if [ $(expr $param_count % 2) -ne 0 ]; then
die "Wrong parameters: $@"
fi
#read command-line params and create regexp from them
for param in $(seq 1 2 $param_count); do
create_regexp $1 $2
shift; shift
done
template_file=$1
check_file $template_file
#include all files in this directive: @include filename
include_files="$(grep '@include' $template_file | awk '{print $2}')"
for include_file in $include_files ; do
include $include_file
done
#read template_file and process it using sed and regexp from $regexp_file
grep -v '@include' $template_file | sed "$(cat $regexp_file)"
exit $?
Voláním příkazu:
./makeldif.sh %HOSTNAME% lenovo %MACADDRESS% XX:YY:XX:YY:XX:YY %IPHOSTNUMBER% 192.160.0.10 dhcphost.tpl
... vygenerujeme nahoře uvedený LDIF. Toto je interface pro generování LDIFů. Teď můžeme jednoduše generovat podobné LDIFy např. takto:
#!/bin/bash
ip=$(/sbin/ifconfig | head -2 | grep inet | awk '{print $2}' | cut -d : -f 2)
mac=$(/sbin/ifconfig | head -1 | awk '{print $5}')
./makeldif.sh %HOSTNAME% $HOSTNAME %MACADDRESS% $mac %IPHOSTNUMBER% $ip dhcphost.tpl
Skriptů bylo pro dnešek dost a vy si je můžete všechny stáhnout zde a vyzkoušet. Až mě zas něco napadne, tak to plácnu do blogu... 
Tiskni
Sdílej:
python-ldap? Commandline nástroje z ldap-utils jsou opravdu dosti nepříjemné. ldapsearch umí ten base64 výstup pro non-ascii nějakým switchem vypnout.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.