Sync from SUSE:SLFO:Main dhcp revision 7e62c3b1602585e643dfe0406e9f085c

This commit is contained in:
Adrian Schröter 2024-08-02 15:13:26 +02:00
parent 563a2e9db6
commit 7ed07a553e
3 changed files with 822 additions and 58 deletions

755
dhclient-script Normal file
View File

@ -0,0 +1,755 @@
#!/bin/bash
#
# Copyright (C) 2010-2013 SUSE LINUX Products GmbH / Novell Inc.
# Copyright (C) 2013-2014 SUSE LINUX GmbH
#
# 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.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses/>.
#
# Author: Marius Tomaschewski <mt@suse.de>
#
# /sbin/dhclient-script for openSUSE / SUSE Linux Enterprise Server
# based on the scripts shipped with the ISC DHCP (4.1.1) client.
#
# Note:
# It is used by sysconfig alias netcontrol alias ifup-dhcp,
# but not by the NetworkManager that is using an own script.
#
# Wicked is using an another dhcp client (runtime conflict).
# As sysconfig-network is gone on sles12 and opensuse > 13.1,
# this script is obsolete and unsupported.
#
##
## check mandatory parameters or ignore & exit
##
test "x$reason" = x -o "x$interface" = x && exit 1
#
# source sysconfig functions
#
SYSCONFIG_CFG_DIR="/etc/sysconfig/network"
if test -f "$SYSCONFIG_CFG_DIR/scripts/functions" ; then
. "$SYSCONFIG_CFG_DIR/scripts/functions"
fi
SYSCONFIG_RUN_DIR=${SYSCONFIG_RUN_DIR:-/dev/.sysconfig/network}
#
# Debugging:
# logs entire run of dhclient-script to /var/log/${dhclient}-script.*.log,
# when DHCLIENT_DEBUG/DHCLIENT6_DEBUG are "yes" in sysconfig/network/dhcp
#
eval `grep '^DHCLIENT6\?_DEBUG=' "$SYSCONFIG_CFG_DIR/dhcp" 2>/dev/null`
case $reason in
*6) DEBUG=$DHCLIENT6_DEBUG ; dhclient=dhclient6 ; ipver=6 ;;
*) DEBUG=$DHCLIENT_DEBUG ; dhclient=dhclient ; ipver=4 ;;
esac
if [ "$DEBUG" = yes ]; then
set -a # allexport
(
echo '****************'
echo "$0 $*"
date
echo '----------------'
env
echo '----------------'
) >> /var/log/${dhclient}-script.$interface.log
exec 2>> /var/log/${dhclient}-script.$interface.log
set +a
set -x
fi
network_service_conflicts()
{
local _id=`/usr/bin/systemctl --no-pager -p Id show network.service 2>/dev/null`
case "${_id#Id=}" in
# wicked is using an another dhcp client - dhclient
# is not supported with enabled wicked and disabled.
wicked.service)
logger -t "${0##*/}" -p daemon.error -- \
"dhclient conflicts with enabled ${_id#Id=} and disabled"
return 1
;;
# NetworkManager is using an another script
# [disarmed except maintainer requests it]
#NetworkManager.service)
# logger -t "${0##*/}" -p daemon.error -- \
# "dhclient-script conflicts with enabled ${_id#Id=} script and disabled"
# return 1
#;;
# sysconfig network [gone] were using it, other?
network.service|*)
return 0
;;
esac
}
network_service_conflicts || exit 1
is_ifup_controlled()
{
test -f "$SYSCONFIG_RUN_DIR/if-${interface}"
}
# netconfig makes all "additional" modifications as DNS or NTP
netconfig_modify() {
if test -x /sbin/netconfig -a -n "$interface" ; then
{
echo "INTERFACE='$interface'"
for v in ${!new_*}; do
case $ipver in
6)
case $v in
(new_ip6_address) k='IPADDR' ;;
(new_ip6_prefixlen) k='PREFIXLEN' ;;
(new_dhcp6_client_id) k='DHCP6CID' ;;
(new_dhcp6_server_id) k='DHCP6SID' ;;
(new_dhcp6_domain_search) k='DNSSEARCH' ;;
(new_dhcp6_name_servers) k='DNSSERVERS' ;;
(new_dhcp6_sntp_servers) k='NTPSERVERS' ;;
#(new_dhcp6_nis_domain) k='NISDOMAIN' ;;
#(new_dhcp6_nis_servers) k='NISSERVERS' ;;
(*) k="dhclient6_${v#new_}" ;;
esac
;;
4)
case $v in
(new_ip_address) k='IPADDR' ;;
(new_subnet_mask) k='NETMASK' ;;
(new_network_number) k='NETWORK' ;;
(new_broadcast_address) k='BROADCAST' ;;
(new_interface_mtu) k='MTU' ;;
(new_rfc3442_classless_static_routes_formatted)
k='ROUTES' ;;
# (new_static_routes) k='ROUTES' ;;
(new_routers) k='GATEWAYS' ;;
(new_host_name) k='HOSTNAME' ;;
(new_domain_search) k='DNSSEARCH' ;;
(new_domain_name) k='DNSDOMAIN' ;;
(new_domain_name_servers) k='DNSSERVERS' ;;
(new_ntp_servers) k='NTPSERVERS' ;;
(new_nis_domain) k='NISDOMAIN' ;;
(new_nis_servers) k='NISSERVERS' ;;
(new_root_path) k='ROOTPATH' ;;
(new_dhcp_server_identifier)k='DHCPSID' ;;
(new_lpr_servers) k='LPRSERVER' ;;
(new_log_servers) k='LOGSERVER' ;;
(new_netbios_dd_server) k='NETBIOSDDSERVER' ;;
(new_netbios_name_servers) k='NETBIOSNAMESERVER' ;;
(new_netbios_node_type) k='NETBIOSNODETYPE' ;;
(new_netbios_scope) k='NETBIOSSCOPE' ;;
(*) k="dhclient_${v#new_}" ;;
esac
esac
[ "k${k}" != k ] && echo "${k}='${!v}'"
done
} | /sbin/netconfig modify -s "dhclient$ipver" -i "$interface"
fi
}
netconfig_remove() {
if test -x /sbin/netconfig -a -n "$interface" ; then
/sbin/netconfig remove -s "dhclient$ipver" -i "$interface" </dev/null
fi
}
prefixlen2netmask()
{
test -n "$1" || return 1
local o i n=0 adr=() len=$(($1))
for o in 0 1 2 3; do
adr[$o]=0
for i in 128 64 32 16 8 4 2 1; do
((n++ < len)) && \
((adr[$o] = ${adr[$o]} + $i))
done
done
echo ${adr[0]}.${adr[1]}.${adr[2]}.${adr[3]}
return 0
}
parse_ipv4_classless_routes()
{
local route_regex='^[0-9]{1,3}([ ][0-9]{1,3}){4,}$'
local rfc_routes=() _routes=()
# check whether it is a list of numbers
[[ $* =~ $route_regex ]] && rfc_routes=($*)
for (( i=0; i < ${#rfc_routes[@]}; )) ; do
net_length=${rfc_routes[$i]}
test $net_length -gt 32 && return 1
((i++))
net_octets=$(($net_length / 8 + ($net_length % 8 ? 1 : 0)))
test ${#rfc_routes[@]} -lt $(( $i + $net_octets + 4 )) && \
return 1
net_netmask=$(prefixlen2netmask $net_length)
net_netmask=(${net_netmask//./ })
net_address=(0 0 0 0)
for(( j=0; j < $net_octets; j++, i++)); do
net_address[$j]=$((${rfc_routes[$i]} & ${net_netmask[$j]}))
done
gateway=(0 0 0 0)
for (( j=0; j < 4; j++, i++ )); do
gateway[$j]=${rfc_routes[$i]}
done
old_IFS=$IFS
IFS='.'
_routes+=("${net_address[*]},${net_netmask[*]},${gateway[*]}")
IFS=$old_IFS
done
echo "${_routes[*]}"
return 0
}
set_ipv4_route()
{
local dest=$1 ; shift
local mask=$1 ; shift
local gate=("$@")
local hops args
hops=()
if [ ${#gate[@]} -gt 1 ] ; then
for((g=0; g<${#gate[@]}; g++)) ; do
hops+=(nexthop ${gate[$g]:+via ${gate[$g]}}
dev $interface weight $((g+1)))
done
elif [ ${#gate[@]} -gt 0 ] ; then
hops+=(${gate[$g]:+via ${gate[$g]}} dev $interface)
fi
[ ${#hops[@]} -eq 0 ] && hops=(dev $interface)
args=("$dest${mask:+/$mask}" $metric_arg ${hops[*]})
err=`LC_ALL=C /sbin/ip route replace ${args[*]} 2>&1` && return 0
case $err in
RTNETLINK*answers:*File*exists) ;;
RTNETLINK*answers:*No*such*process)
#
# The gateway seems to be not reachable via local network
# route (implicitly created by ifconfig based on the IP
# and netmask provided by dhcp).
# Check this, set an explicit host route to the gateway
# over the current interface and try again (bnc#266215).
#
retry=0
for router in ${gate[@]} ; do
matches=$(/sbin/ip -f inet -o route list match $router | \
grep -v ^default | grep -c -v "^$" 2>/dev/null)
if [ -n "$matches" -a $(($matches)) -eq 0 ] ; then
LC_ALL=C /sbin/ip route add $router/32 dev $interface || retry=1
fi
done
if [ $retry -eq 0 ] ; then
LC_ALL=C /sbin/ip route replace ${args[*]} && return 0
fi
;;
esac
return 1
}
get_ipv4_default_gw()
{
if [ "x$new_rfc3442_classless_static_routes_formatted" != x ] ; then
local r route=() gw=()
for r in $new_rfc3442_classless_static_routes_formatted ; do
route=(${r//,/ })
case ${route[0]}/${route[1]} in
0.0.0.0/0.0.0.0)
[ "x${route[2]}" = "x0.0.0.0" ] || \
gw+=(${route[2]})
;;
esac
done
echo "${gw[*]}"
elif [ "$new_routers" != x ] ; then
echo "$new_routers"
fi
}
set_ipv4_routes()
{
if [ "x$new_rfc3442_classless_static_routes_formatted" != x ] ; then
local r route=()
# TODO: multiple gw's to one dest as in $new_routers?
for r in $new_rfc3442_classless_static_routes_formatted ; do
route=(${r//,/ })
case ${route[0]}/${route[1]} in
0.0.0.0/0.0.0.0)
[ "x$DHCLIENT_SET_DEFAULT_ROUTE" = xyes ] || continue ;;
esac
set_ipv4_route ${route[*]}
done
elif [ "$new_routers" != x ] ; then
if [ "x$DHCLIENT_SET_DEFAULT_ROUTE" = xyes ] ; then
set_ipv4_route default "" $new_routers
fi
fi
}
set_hostname()
{
rx_host='^[[:alnum:]][[:alnum:]_-]{0,62}$'
if [ "$DHCLIENT_SET_HOSTNAME" = yes ] ; then
new_host_name="${new_host_name%%.*}"
[[ ${new_host_name} =~ ${rx_host} ]] || unset new_host_name
current_hostname=`hostname`
current_hostname="${current_hostname%%.*}"
[[ ${current_hostname} =~ ${rx_host} ]] || unset current_hostname
if [ "x${current_hostname}" = "x" ] || \
[ "x${current_hostname}" = "xlocalhost" ] || \
[ "x${current_hostname}" != "x${new_host_name}" ]; then
if [ "x${new_host_name}" != "x" ]; then
hostname "${new_host_name}"
else
if [ -x /usr/bin/getent ] ; then
if out=`timeout 2s /usr/bin/getent hosts "$new_ip_address" 2>/dev/null` ; then
_hostname="`echo "$out" | sed 's:^.* ::; s:\..*::; s:.*[)]::'`"
[[ ${_hostname} =~ ${rx_host} ]] || unset _hostname
if [ "x${_hostname}" != "x" -a \
"x${_hostname}" != "x${current_hostname}" ]; then
hostname "${_hostname}"
fi
fi
fi
fi
fi
fi
if is_ifup_controlled ; then
# check regardless the DHCLIENT_SET_HOSTNAME setting
# and whether we've set it above or not, because when
# it changed, we've to handle it anyway...
local OLD_HOSTNAME=`read_cached_config_data hostname $interface`
local CUR_HOSTNAME=`hostname 2>/dev/null`
CUR_HOSTNAME="${CUR_HOSTNAME%%.*}"
if [[ ${CUR_HOSTNAME} =~ ${rx_host} ]] && \
[ "x$OLD_HOSTNAME" != "x$CUR_HOSTNAME" ] ; then
write_cached_config_data hostname "$CUR_HOSTNAME" $interface
commit_cached_config_data $interface
# reload syslog so it knows the new hostname
if test -x /usr/bin/systemctl ; then
/usr/bin/systemctl reload syslog.service
fi
fi
fi
}
dhcp6_dad_check()
{
local ifname="$1" word i
local ipaddr="$2"
local noaddr=1 nodad=0 tentative=0 dadfailed=0
test -n "$ifname" -a -n "$ipaddr" || return 1
while read -a word ; do
test "${word[0]}" != "inet6" && continue
noaddr=0
for((i=2; i<${#word[@]}; ++i)) ; do
case ${word[$i]} in
nodad) nodad=1 ;;
tentative) tentative=1 ;;
dadfailed) dadfailed=1 ;;
flags) ((i++))
rx='^[[:xdigit:]]+$'
[[ "${word[$i]}" =~ $rx ]] || continue
hx="0x${word[$i]}"
((hx & 0x02)) && nodad=1
((hx & 0x08)) && dadfailed=1
((hx & 0x40)) && tentative=1
;;
esac
done
((nodad)) && continue
((dadfailed)) && return 3
((tentative)) && return 2
done < <(LC_ALL=C ip -6 addr show dev "${ifname}" to "${ipaddr}" 2>/dev/null)
# on dad failure of dynamic (non-persistent) address,
# the kernel deletes dad failed addresses
# that is, the address is tentative (2) and vanishes
# (4) and is not visible as dadfailed (3).
((noaddr)) && return 4 || return 0
}
dhcp6_dad_wait()
{
local ifname="$1"
local ipaddr="$2"
local -i wsecs=${3:-0}
local -i uwait=25000
local -i loops=$(((wsecs * 1000000) / uwait))
local -i loop=0 ret=0
dhcp6_dad_check "$ifname" "$ipaddr" ; ret=$?
while ((ret == 2 && loop++ < loops)) ; do
sleep 0.25
dhcp6_dad_check "$ifname" "$ipaddr" ; ret=$?
done
return $ret
}
# Must be used on exit. Invokes the local dhcp client exit hooks, if any.
exit_with_hooks() {
exit_status=$1
if [ -f /etc/${dhclient}-exit-hooks ]; then
. /etc/${dhclient}-exit-hooks
fi
# probably should do something with exit status of the local script
exit $exit_status
}
# Invoke the local dhcp client enter hooks, if they exist.
if [ -f /etc/${dhclient}-enter-hooks ]; then
exit_status=0
. /etc/${dhclient}-enter-hooks
# allow the local script to abort processing of this state
# local script must set exit_status variable to nonzero.
if [ $exit_status -ne 0 ]; then
exit $exit_status
fi
fi
case $dhclient in
dhclient)
if is_ifup_controlled ; then
# STARTMODE
eval `grep --no-filename \
'^[[:space:]]*STARTMODE=' \
"$SYSCONFIG_CFG_DIR/ifcfg-${interface}" 2>/dev/null`
tmp_startmode=`read_cached_config_data startmode $INTERFACE`
[ -n "$tmp_startmode" ] && STARTMODE="$tmp_startmode"
# DHCLIENT_SET_HOSTNAME and DHCLIENT_SET_DEFAULT_ROUTE
if grep -qs '^primary=yes' "$SYSCONFIG_RUN_DIR/if-${interface}" 2>/dev/null ;
then
eval `grep --no-filename \
'^[[:space:]]*DHCLIENT_SET_\(HOSTNAME\|DEFAULT_ROUTE\)=' \
"$SYSCONFIG_CFG_DIR/dhcp" \
"$SYSCONFIG_CFG_DIR/ifcfg-${interface}" 2>/dev/null`
else
eval `grep --no-filename \
'^[[:space:]]*DHCLIENT_SET_\(HOSTNAME\|DEFAULT_ROUTE\)=' \
"$SYSCONFIG_CFG_DIR/ifcfg-${interface}" 2>/dev/null`
fi
else
STARTMODE=manual
eval `grep --no-filename \
'^[[:space:]]*DHCLIENT_SET_\(HOSTNAME\|DEFAULT_ROUTE\)=' \
"$SYSCONFIG_CFG_DIR/dhcp" 2>/dev/null`
fi
if [ "x$new_rfc3442_classless_static_routes" != x ] ; then
new_rfc3442_classless_static_routes_formatted=$(
parse_ipv4_classless_routes $new_rfc3442_classless_static_routes
)
else
unset new_rfc3442_classless_static_routes_formatted
fi
if [ x$new_broadcast_address != x ] ; then
new_broadcast_arg="brd $new_broadcast_address"
elif [ "x$new_subnet_mask" != "x255.255.255.255" ] ; then
new_broadcast_arg="brd +"
fi
if [ x$new_interface_mtu != x -a \
$(( $new_interface_mtu )) -le 576 ] ;
then
# 68 is the minimal legal value, but 576 the real life minimum
unset new_interface_mtu
fi
if [ x$IF_METRIC != x ]; then
metric_arg="metric $IF_METRIC"
fi
;;
dhclient6)
if is_ifup_controlled ; then
# STARTMODE
eval `grep --no-filename \
'^[[:space:]]*STARTMODE=' \
"$SYSCONFIG_CFG_DIR/ifcfg-${interface}" 2>/dev/null`
tmp_startmode=`read_cached_config_data startmode $INTERFACE`
[ -n "$tmp_startmode" ] && STARTMODE="$tmp_startmode"
else
STARTMODE=manual
fi
;;
esac
case $reason in
######################################################################
## DHCPv4 #
######################################################################
MEDIUM)
####################################################################
exit_with_hooks 0
;;
PREINIT)
####################################################################
if [ "x$alias_ip_address" != x ]; then
/sbin/ip addr del $alias_ip_address/$alias_subnet_mask dev $interface
fi
if [ "x$STARTMODE" != "xnfsroot" ] ; then
/sbin/ip -4 addr flush dev $interface
fi
/sbin/ip link set $interface up
# We need to give the kernel some time to get the interface up.
sleep 1
exit_with_hooks 0
;;
ARPCHECK|ARPSEND)
####################################################################
exit_with_hooks 0
;;
BOUND|RENEW|REBIND|REBOOT)
####################################################################
if [ x$alias_ip_address != x -a x$alias_ip_address != x$old_ip_address -a \
x$new_ip_address != x$old_ip_address ] ;
then
# Possible new alias. Remove old alias.
/sbin/ip addr del $alias_ip_address/$alias_subnet_mask dev $interface
fi
if [ x$old_ip_address != x -a x$old_ip_address != x$new_ip_address ]; then
# IP address changed. Flush to clear routes and ARP cache.
if [ "x$STARTMODE" != "xnfsroot" ] ; then
/sbin/ip -4 addr flush dev $interface
fi
fi
if [ x$new_interface_mtu != x ] ; then
/sbin/ip link set $interface mtu $new_interface_mtu
fi
if [ x$new_ip_address != x ] && \
[ x$new_ip_address != x$old_ip_address -o \
x$reason = xBOUND -o x$reason = xREBOOT ]; then
/sbin/ip addr add $new_ip_address/${new_subnet_mask:-32} \
${new_broadcast_arg} \
dev $interface
set_ipv4_routes
fi
if [ x$new_ip_address != x$alias_ip_address -a x$alias_ip_address != x \
-a x$new_ip_address != x$old_ip_address ];
then
/sbin/ip addr add $alias_ip_address/$alias_subnet_mask \
dev $interface
fi
netconfig_modify
if [ x$old_ip_address != x -a x$old_ip_address != x$new_ip_address ]; then
if is_ifup_controlled ; then
ifdown $interface -o dhcp
write_cached_config_data dhcp4_state "up" $interface
commit_cached_config_data $interface
fi
else
if is_ifup_controlled ; then
write_cached_config_data dhcp4_state "new" $interface
commit_cached_config_data $interface
fi
fi
set_hostname
if is_ifup_controlled ; then
# execute ifservice and if-up.d scripts
ifup $interface -o dhcp
write_cached_config_data dhcp4_state "complete" $interface
commit_cached_config_data $interface
fi
exit_with_hooks 0
;;
EXPIRE|FAIL|RELEASE|STOP)
####################################################################
if [ x$old_ip_address != x ]; then
if [ "x$STARTMODE" != "xnfsroot" ] ; then
/sbin/ip -4 addr flush dev $interface
fi
fi
if [ x$alias_ip_address != x ]; then
/sbin/ip addr add $alias_ip_address/$alias_subnet_mask \
dev $interface
fi
if is_ifup_controlled ; then
write_cached_config_data dhcp4_state "down" $interface
commit_cached_config_data $interface
fi
netconfig_remove
exit_with_hooks 0
;;
TIMEOUT)
####################################################################
if [ x$alias_ip_address != x ]; then
/sbin/ip addr del $alias_ip_address/$alias_subnet_mask \
dev $interface
fi
if [ x$new_ip_address != x -a x$old_ip_address != x$new_ip_address ];
then
/sbin/ip addr add $new_ip_address/${new_subnet_mask:-32} \
${new_broadcast_arg} \
dev $interface
set -- $(get_ipv4_default_gw)
if [ -n "$1" ] && /usr/sbin/arping -q -c 1 -w 5 -I $interface $1 ;
then
if [ x$new_ip_address != x$alias_ip_address ] && \
[ x$alias_ip_address != x ]; then
/sbin/ip addr add $alias_ip_address/$alias_subnet_arg
fi
set_ipv4_routes
netconfig_modify
set_hostname
if is_ifup_controlled ; then
# execute ifservice and if-up.d scripts
ifup $interface -o dhcp
write_cached_config_data dhcp4_state "complete" $interface
commit_cached_config_data $interface
fi
exit_with_hooks 0
else
if [ x$old_ip_address != x ]; then
if [ "x$STARTMODE" != "xnfsroot" ] ; then
/sbin/ip -4 addr flush dev $interface
fi
fi
if is_ifup_controlled ; then
write_cached_config_data dhcp4_state "down" $interface
commit_cached_config_data $interface
fi
netconfig_remove
exit_with_hooks 1
fi
fi
;;
######################################################################
## DHCPv6 #
######################################################################
PREINIT6)
####################################################################
if [ "x$STARTMODE" != "xnfsroot" ] ; then
/sbin/ip -6 addr flush dev $interface scope global permanent
fi
/sbin/ip link set $interface up
# We need to give the kernel some time to get the interface up.
sleep 1
exit_with_hooks 0
;;
BOUND6|RENEW6|REBIND6|REBOOT6)
####################################################################
if [ x$old_ip6_address != x -a x$old_ip6_address != x$new_ip6_address ];
then
/sbin/ip addr del "$old_ip6_address/$old_ip6_prefixlen" dev $interface
if is_ifup_controlled ; then
write_cached_config_data dhcp6_state "up" $interface
commit_cached_config_data $interface
fi
else
if is_ifup_controlled ; then
write_cached_config_data dhcp6_state "new" $interface
commit_cached_config_data $interface
fi
fi
if [ "x$new_ip6_address" != x -a "x$new_ip6_prefixlen" != x ] ; then
/sbin/ip addr replace "$new_ip6_address/$new_ip6_prefixlen" \
scope global dev $interface \
${new_max_life:+valid_lft $new_max_life} \
${new_preferred_life:+preferred_lft $new_preferred_life} \
|| exit_with_hooks 2
echo >&2 "Checking DAD results for $new_ip6_address"
if ! dhcp6_dad_wait "$interface" "$new_ip6_address/$new_ip6_prefixlen" 5 ; then
/sbin/ip addr del "$new_ip6_address/$new_ip6_prefixlen" dev $interface 2>/dev/null
exit_with_hooks 3
fi
fi
netconfig_modify
if [ x$old_ip6_address != x -a x$old_ip6_address != x$new_ip6_address ];
then
if is_ifup_controlled ; then
/sbin/ifdown $interface -o dhcp
fi
fi
#set_hostname
if is_ifup_controlled ; then
# execute ifservice and if-up.d scripts
/sbin/ifup $interface -o dhcp
write_cached_config_data dhcp6_state "complete" $interface
commit_cached_config_data $interface
fi
exit_with_hooks 0
;;
DEPREF6)
####################################################################
if [ x$cur_ip6_address = x -o x$cur_ip6_prefixlen = x ] ; then
exit_with_hooks 2
fi
/sbin/ip addr change "$cur_ip6_address/$cur_ip6_prefixlen" \
dev $interface scope global preferred_lft 0
exit_with_hooks 0
;;
EXPIRE6|RELEASE6|STOP6)
####################################################################
if [ x$old_ip6_address != x -a x$old_ip6_prefixlen != x ] ; then
/sbin/ip addr del "$old_ip6_address/$old_ip6_prefixlen" \
dev $interface
fi
if is_ifup_controlled ; then
write_cached_config_data dhcp6_state "down" $interface
commit_cached_config_data $interface
fi
netconfig_remove
exit_with_hooks 0
;;
esac
exit_with_hooks 0

View File

@ -1,3 +1,26 @@
-------------------------------------------------------------------
Fri May 24 13:51:57 UTC 2024 - Thorsten Kukuk <kukuk@suse.com>
- Drop initscripts-legacy support [jsc#PED264]
- Drop rc<service> symlinks [jsc#PED-264], [jsc#PED-266]
-------------------------------------------------------------------
Mon Feb 26 07:45:20 UTC 2024 - Dominique Leuenberger <dimstar@opensuse.org>
- Use %patch -P N instead of deprecated %patchN.
-------------------------------------------------------------------
Thu Dec 7 13:31:06 UTC 2023 - Jorik Cronenberg <jorik.cronenberg@suse.com>
- Revert dhclient-script removal and instead change usleep to sleep
(boo#1216822)
-------------------------------------------------------------------
Tue Dec 5 15:24:29 UTC 2023 - Jorik Cronenberg <jorik.cronenberg@suse.com>
- Add new Kea migration assistant subpackage
- Switch doc subpackage to noarch
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Nov 2 13:53:11 UTC 2023 - Petr Vorel <pvorel@suse.cz> Thu Nov 2 13:53:11 UTC 2023 - Petr Vorel <pvorel@suse.cz>

102
dhcp.spec
View File

@ -1,7 +1,7 @@
# #
# spec file for package dhcp # spec file for package dhcp
# #
# Copyright (c) 2023 SUSE LLC # Copyright (c) 2024 SUSE LLC
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@ -57,6 +57,7 @@ Source21: dhclient6.conf
Source22: dhcpd.conf Source22: dhcpd.conf
Source23: dhcpd6.conf Source23: dhcpd6.conf
Source26: sysconfig.syslog-dhcpd Source26: sysconfig.syslog-dhcpd
Source27: dhclient-script
# #
Source41: dhcp.README Source41: dhcp.README
Source43: DDNS-howto.txt Source43: DDNS-howto.txt
@ -151,6 +152,7 @@ Requires: dhcp = %{version}
%package doc %package doc
Summary: Documentation Summary: Documentation
Group: Productivity/Networking/Boot/Servers Group: Productivity/Networking/Boot/Servers
BuildArch: noarch
%description %description
This package contains common programs used by both the ISC DHCP This package contains common programs used by both the ISC DHCP
@ -167,7 +169,9 @@ configure the network setup. IP address, hostname, routing,
nameserver, netmask, and broadcast can be dynamically assigned while nameserver, netmask, and broadcast can be dynamically assigned while
booting the machine. booting the machine.
It is configurable via the configuration file %{_sysconfdir}/dhclient.conf. It is configurable via the configuration file %{_sysconfdir}/dhclient.conf and
you can define your own 'hooks' to be used by the /sbin/dhclient-script
(which is called by the daemon).
%description relay %description relay
This is the ISC DHCP relay agent. It can be used as a 'gateway' for This is the ISC DHCP relay agent. It can be used as a 'gateway' for
@ -183,6 +187,13 @@ the software. The manual pages are in the corresponding packages.
This package contains all of the libraries and headers for developing This package contains all of the libraries and headers for developing
with the Internet Software Consortium (ISC) dhcpctl API. with the Internet Software Consortium (ISC) dhcpctl API.
%package keama
Summary: Migration assistant from dhcp to kea
%description keama
This package provides a migration assistant for kea, the successor of the ISC
DHCP server.
%prep %prep
if test "%version" != $(echo %isc_version | tr "-" "."); then if test "%version" != $(echo %isc_version | tr "-" "."); then
echo "error: %%version and %%isc_version are not in sync." echo "error: %%version and %%isc_version are not in sync."
@ -190,26 +201,26 @@ if test "%version" != $(echo %isc_version | tr "-" "."); then
fi fi
%setup -q -n %{name}-%{isc_version} -a 44 -a 45 %setup -q -n %{name}-%{isc_version} -a 44 -a 45
## ##
%patch1 -p1 %patch -P 1 -p1
%patch2 -p1 %patch -P 2 -p1
%patch3 -p1 %patch -P 3 -p1
%patch4 -p1 %patch -P 4 -p1
%patch5 -p1 %patch -P 5 -p1
%patch6 -p1 %patch -P 6 -p1
%patch7 -p1 %patch -P 7 -p1
%patch8 -p1 %patch -P 8 -p1
%patch9 %patch -P 9
%patch10 -p1 %patch -P 10 -p1
%patch12 -p1 %patch -P 12 -p1
%patch14 %patch -P 14
%patch15 -p1 %patch -P 15 -p1
%patch16 %patch -P 16
%patch17 -p1 %patch -P 17 -p1
%patch18 -p1 %patch -P 18 -p1
%patch20 %patch -P 20
%patch21 %patch -P 21
%patch22 %patch -P 22
%patch23 %patch -P 23
## ##
find . -type f -name \*.cat\* -exec rm -f {} \; find . -type f -name \*.cat\* -exec rm -f {} \;
dos2unix contrib/ms2isc/* dos2unix contrib/ms2isc/*
@ -268,6 +279,7 @@ export CFLAGS LDFLAGS FFLAGS CXXFLAGS
# SLE-12 compatbility still needed as of October 2021 # SLE-12 compatbility still needed as of October 2021
%define make_build %{__make} %{?_smp_mflags} %define make_build %{__make} %{?_smp_mflags}
%endif %endif
%make_build -j1 -C keama
%make_build -j1 -C bind all %make_build -j1 -C bind all
cat bind/configure.log cat bind/configure.log
cat bind/build.log cat bind/build.log
@ -285,8 +297,10 @@ cat bind/install.log
# check syntax in our scripts # check syntax in our scripts
bash -n $RPM_SOURCE_DIR/dhcpd.script bash -n $RPM_SOURCE_DIR/dhcpd.script
bash -n $RPM_SOURCE_DIR/dhcrelay.script bash -n $RPM_SOURCE_DIR/dhcrelay.script
bash -n $RPM_SOURCE_DIR/dhclient-script
%install %install
%make_install -C keama
%make_install %make_install
# #
# directories # directories
@ -309,13 +323,12 @@ mv -f %{buildroot}%{_sbindir}/dhclient %{buildroot}/sbin/
ln -sf dhcpd %{buildroot}%{_sbindir}/dhcpd6 ln -sf dhcpd %{buildroot}%{_sbindir}/dhcpd6
ln -sf dhcrelay %{buildroot}%{_sbindir}/dhcrelay6 ln -sf dhcrelay %{buildroot}%{_sbindir}/dhcrelay6
ln -sf dhclient %{buildroot}%{sbindir}/dhclient6 ln -sf dhclient %{buildroot}%{sbindir}/dhclient6
# install our adopted config examples: # install our adopted config examples and dhclient-script:
install -m0644 $RPM_SOURCE_DIR/dhcpd.conf %{buildroot}%{_sysconfdir}/ install -m0644 $RPM_SOURCE_DIR/dhcpd.conf %{buildroot}%{_sysconfdir}/
install -m0644 $RPM_SOURCE_DIR/dhcpd6.conf %{buildroot}%{_sysconfdir}/ install -m0644 $RPM_SOURCE_DIR/dhcpd6.conf %{buildroot}%{_sysconfdir}/
install -m0644 $RPM_SOURCE_DIR/dhclient.conf %{buildroot}%{_sysconfdir}/ install -m0644 $RPM_SOURCE_DIR/dhclient.conf %{buildroot}%{_sysconfdir}/
install -m0644 $RPM_SOURCE_DIR/dhclient6.conf %{buildroot}%{_sysconfdir}/ install -m0644 $RPM_SOURCE_DIR/dhclient6.conf %{buildroot}%{_sysconfdir}/
# We don't ship dhclient-script any more (boo#1216822) install -m0754 $RPM_SOURCE_DIR/dhclient-script %{buildroot}%{sbindir}/
rm -f %{buildroot}%{_mandir}/man8/dhclient-script.8
# helper / wrapper scripts # helper / wrapper scripts
install -d -m0755 %{buildroot}%{_libexecdir}/dhcp install -d -m0755 %{buildroot}%{_libexecdir}/dhcp
install -m0755 $RPM_SOURCE_DIR/dhcpd.script \ install -m0755 $RPM_SOURCE_DIR/dhcpd.script \
@ -334,31 +347,6 @@ install -m0644 $RPM_SOURCE_DIR/dhcrelay.service \
install -m0644 $RPM_SOURCE_DIR/dhcrelay6.service \ install -m0644 $RPM_SOURCE_DIR/dhcrelay6.service \
%{buildroot}%{_unitdir}/dhcrelay6.service %{buildroot}%{_unitdir}/dhcrelay6.service
sed -e 's,@LIBEXECDIR@,%{_libexecdir},g' -i %{buildroot}%{_unitdir}/d* sed -e 's,@LIBEXECDIR@,%{_libexecdir},g' -i %{buildroot}%{_unitdir}/d*
# rcservice links
ln -sf %{_sbindir}/service %{buildroot}%{_sbindir}/rcdhcpd
ln -sf %{_sbindir}/service %{buildroot}%{_sbindir}/rcdhcpd6
ln -sf %{_sbindir}/service %{buildroot}%{_sbindir}/rcdhcrelay
ln -sf %{_sbindir}/service %{buildroot}%{_sbindir}/rcdhcrelay6
# rcservice actions
legacy_actionsdir=%{buildroot}%{_libexecdir}/initscripts/legacy-actions
cat >dhcpd.action <<'EOF'
#!/bin/bash
exec %{_libexecdir}/dhcp/dhcpd -4 ${0##*/}
EOF
install -d -m0755 ${legacy_actionsdir}/dhcpd
install -m0755 dhcpd.action ${legacy_actionsdir}/dhcpd/syntax-check
ln -sf syntax-check ${legacy_actionsdir}/dhcpd/check-syntax
ln -sf syntax-check ${legacy_actionsdir}/dhcpd/check-lease
rm -f dhcpd.action
cat >dhcpd.action <<'EOF'
#!/bin/bash
exec %{_libexecdir}/dhcp/dhcpd -6 ${0##*/}
EOF
install -d -m0755 ${legacy_actionsdir}/dhcpd6
install -m0755 dhcpd.action ${legacy_actionsdir}/dhcpd6/syntax-check
ln -sf syntax-check ${legacy_actionsdir}/dhcpd6/check-syntax
ln -sf syntax-check ${legacy_actionsdir}/dhcpd6/check-lease
rm -f dhcpd.action
# sysconfig files # sysconfig files
install -m0644 $RPM_SOURCE_DIR/sysconfig.dhcpd \ install -m0644 $RPM_SOURCE_DIR/sysconfig.dhcpd \
%{buildroot}%{_fillupdir}/ %{buildroot}%{_fillupdir}/
@ -484,17 +472,11 @@ fi
%files server %files server
%{_sbindir}/dhcpd %{_sbindir}/dhcpd
%{_sbindir}/dhcpd6 %{_sbindir}/dhcpd6
%{_sbindir}/rcdhcpd
%{_sbindir}/rcdhcpd6
%{_unitdir}/dhcpd.service %{_unitdir}/dhcpd.service
%{_unitdir}/dhcpd6.service %{_unitdir}/dhcpd6.service
%if %{with sysusers} %if %{with sysusers}
%{_sysusersdir}/dhcp-user.conf %{_sysusersdir}/dhcp-user.conf
%endif %endif
%dir %{_libexecdir}/initscripts/legacy-actions/dhcpd
%{_libexecdir}/initscripts/legacy-actions/dhcpd/*
%dir %{_libexecdir}/initscripts/legacy-actions/dhcpd6
%{_libexecdir}/initscripts/legacy-actions/dhcpd6/*
%config(noreplace) %{_sysconfdir}/dhcpd.conf %config(noreplace) %{_sysconfdir}/dhcpd.conf
%config(noreplace) %{_sysconfdir}/dhcpd6.conf %config(noreplace) %{_sysconfdir}/dhcpd6.conf
%attr(755,root,root) %dir %config(noreplace) %ghost %{_sysconfdir}/dhcpd.d/ %attr(755,root,root) %dir %config(noreplace) %ghost %{_sysconfdir}/dhcpd.d/
@ -537,19 +519,19 @@ fi
%files client %files client
%{sbindir}/dhclient %{sbindir}/dhclient
%{sbindir}/dhclient6 %{sbindir}/dhclient6
%{sbindir}/dhclient-script
%config(noreplace) %{_sysconfdir}/dhclient.conf %config(noreplace) %{_sysconfdir}/dhclient.conf
%config(noreplace) %{_sysconfdir}/dhclient6.conf %config(noreplace) %{_sysconfdir}/dhclient6.conf
%{_mandir}/man5/dhclient.conf.5%{?ext_man} %{_mandir}/man5/dhclient.conf.5%{?ext_man}
%{_mandir}/man5/dhclient.leases.5%{?ext_man} %{_mandir}/man5/dhclient.leases.5%{?ext_man}
%{_mandir}/man8/dhclient.8%{?ext_man} %{_mandir}/man8/dhclient.8%{?ext_man}
%{_mandir}/man8/dhclient-script.8%{?ext_man}
%dir %{_localstatedir}/lib/dhcp %dir %{_localstatedir}/lib/dhcp
%dir %{_localstatedir}/lib/dhcp6 %dir %{_localstatedir}/lib/dhcp6
%files relay %files relay
%{_sbindir}/dhcrelay %{_sbindir}/dhcrelay
%{_sbindir}/dhcrelay6 %{_sbindir}/dhcrelay6
%{_sbindir}/rcdhcrelay
%{_sbindir}/rcdhcrelay6
%dir %{_libexecdir}/dhcp %dir %{_libexecdir}/dhcp
%{_libexecdir}/dhcp/dhcrelay %{_libexecdir}/dhcp/dhcrelay
%{_unitdir}/dhcrelay.service %{_unitdir}/dhcrelay.service
@ -565,4 +547,8 @@ fi
%{_mandir}/man3/omapi.3%{?ext_man} %{_mandir}/man3/omapi.3%{?ext_man}
%{_mandir}/man3/dhcpctl.3%{?ext_man} %{_mandir}/man3/dhcpctl.3%{?ext_man}
%files keama
%{_sbindir}/keama
%{_mandir}/man8/keama.8%{?ext_man}
%changelog %changelog