18 подписчиков

DHCPD: execute: d.sh exit status 32512

В одной из статей я описал настройку DHCP-сервера. Там был описан обработчик, который должен запускаться, когда DHCP-сервер выдает комп-у ip-адрес. Но: запускаться этот обработчик не будет. И все из-за того, что DHCPD использует chroot, который меняет корневую папку на другую. Плюс делает это так, что даже из этой папки запустить ничего не может. Т.е. после того, как клиенту выдастся адрес, по команде systemctl status dhcp вы увидите ошибку о том, что он файл d.sh не найден и ошибку, которая указана в заголовке. Кстати, меняет он корневую папку на /var/lib/dhcp/dhcpd, но нам это ничего не даст, потому что если вы положите файл туда- ошибка о том, что файл не найден исчезнет(потому что файл-то он найдет), а вот ошибка execute: exit status 32512 так и останется, потому как запустить он его по-прежнему не сможет.

Есть несколько путей решения этой проблемы.

1. Установка DHCP-сервера на другую ОС, например, на Debian- там таких проблем нет. Но не хочется разводить зоопарк из кучи разных ОС.

2. "Костыль". Создаем файл /etc/dhcp/kost.sh с таким вот содержимым:

#!/bin/bash
apt-get remove alterator-dhcp -y
systemctl restart bind
clear
for (( ; ; ))
do
tmp=$(systemctl status dhcpd | grep Commit)
if [ "$pr" != "$tmp" ];then
ip=${tmp##*IP:}
ip=${ip%'DHCID'*}
mac=${tmp%'Name'*}
mac=${mac##*DHCID:}
name=${tmp##*Name:}
ip=${ip%% }
ip=${ip## }
mac=${mac%% }
mac=${mac## }
name=${name%% }
name=${name## }
#echo $ip,$mac,$name
echo $tmp >> /etc/dhcp/add.txt
/etc/dhcp/d.sh add $ip $mac $name
pr=$tmp
fi
rel=$(systemctl status dhcpd | grep Release)
exp=$(systemctl status dhcpd | grep Expired)
if [ ${rel} ]; then
echo $rel >> /etc/dhcp/rel.txt
fi
if [ ${exp} ]; then
echo $exp >> /etc/dhcp/exp.txt
fi
sleep 1
#date >> /etc/dhcp/kost.log
done

Делаем, чтобы он запускался при старте сервера(в инете полно информации на эту тему). Как видно из текста файла, он непрерывно запрашивает статус у DHCP-сервера и ловит появление команд, которые DHCPD шлет обработчику. Недостаток у этого способа, наверное, в том, что если запросов пойдет много, то некоторые из них он может просто пропустить. Ну и вообще- костыль он и есть костыль.

3. Делаем так, чтобы dhcpd не использовал chroot

создаем файл /etc/control.d/facilities/dhcpd-chroot :

#!/bin/sh

. /etc/control.d/functions

CONFIG=/etc/sysconfig/dhcpd

new_summary 'Chrootedness of the ISC DHCPD server'

new_subst disabled \
'^CHROOT="-j / -lf /var/lib/dhcp/dhcpd/state/dhcpd.leases"$' \
's/^#\(CHROOT="-j \/ -lf \/var\/lib\/dhcp\/dhcpd\/state\/dhcpd.leases"\)$/\1/'
new_help disabled 'Disable chrootedness of the ISC DHCPD server'

new_subst enabled \
'^#CHROOT="-j / -lf /var/lib/dhcp/dhcpd/state/dhcpd.leases"$' \
's/^CHROOT=/#&/'
new_help enabled 'Enable chrootedness of the ISC DHCPD server'

control_subst "$CONFIG" "$*"

файл /lib/systemd/system/dhcpd.service - он уже есть, заменяем его содержимое этим:

[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:dhcpd.conf(5)
After=network.target
After=time-sync.target

[Service]
ExecStartPre=/etc/chroot.d/dhcpd.all
EnvironmentFile=/etc/sysconfig/dhcpd
#ExecStart=/usr/sbin/dhcpd -4 -f --no-pid $DHCPDARGS
ExecStart=/usr/sbin/dhcpd -4 -f --no-pid $CHROOT $DHCPDARGS

[Install]
WantedBy=multi-user.target

файл /etc/sysconfig/dhcpd - в нем также заменяем содержимое на это:

DHCPDARGS=
CHROOT="-j / -lf /var/lib/dhcp/dhcpd/state/dhcpd.leases"

Запускаем эти команды:

chmod 755 /etc/control.d/facilities/dhcpd-chroot
control dhcpd-chroot disabled
systemctl daemon-reload
systemctl restart dhcpd

и по systemctl status dhcpd видим нормальную работу обработчика:

execute_statement argv[0] = /etc/dhcp/d.sh
execute_statement argv[1] = add
execute_statement argv[2] = 192.168.0.1
execute_statement argv[3] = 1:52:54:0:7c:6f:fd
execute_statement argv[4] = alt-ww