Release based on dhcp 4.4.3

driver inclusion
category: feature
bugzilla: https://gitee.com/src-openeuler/ub-dhcp/issues/I86CZH
CVE: NA

----------------------------------------------------------------------

Release based on dhcp 4.4.3

Signed-off-by: Jeiwei Li <lijiewei5@huawei.com>
This commit is contained in:
Jeiwei Li 2023-10-13 16:56:14 +08:00
parent 87c15b0f84
commit 4cd6768970
11 changed files with 1575 additions and 73 deletions

37
11-ub-dhclient Normal file
View File

@ -0,0 +1,37 @@
#!/bin/bash
# run dhclient.d scripts in an emulated environment
PATH=/bin:/usr/bin:/sbin
ETCDIR=/etc/ub-dhcp
SAVEDIR=/var/lib/ub-dhclient
interface=$1
for optname in "${!DHCP4_@}"; do
newoptname=${optname,,};
newoptname=new_${newoptname#dhcp4_};
export "${newoptname}"="${!optname}";
done
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
[ -f /etc/sysconfig/network-scripts/ifcfg-"${interface}" ] && \
. /etc/sysconfig/network-scripts/ifcfg-"${interface}"
if [ -d $ETCDIR/ub-dhclient.d ]; then
for f in $ETCDIR/ub-dhclient.d/*.sh; do
if [ -x "${f}" ]; then
subsystem="${f%.sh}"
subsystem="${subsystem##*/}"
. "${f}"
if [ "$2" = "up" ]; then
"${subsystem}_config"
elif [ "$2" = "dhcp4-change" ]; then
if [ "$subsystem" = "chrony" -o "$subsystem" = "ntp" ]; then
"${subsystem}_config"
fi
elif [ "$2" = "down" ]; then
"${subsystem}_restore"
fi
fi
done
fi

61
56ub-dhclient Normal file
View File

@ -0,0 +1,61 @@
#!/bin/sh
# If we are running ub-dhclient, shutdown running instances cleanly and
# bring them back up on resume.
. "${PM_FUNCTIONS}"
PM_DHCLIENT_RUNDIR="${PM_UTILS_RUNDIR}/network"
PM_DHCLIENT_SUSPEND="${PM_DHCLIENT_RUNDIR}/ub-dhclient.suspend"
suspend_dhclient() {
[ ! -d /etc/sysconfig/network-scripts ] && return
[ ! -x /sbin/ifdown ] && return
[ ! -d ${PM_DHCLIENT_RUNDIR} ] && /bin/mkdir -p ${PM_DHCLIENT_RUNDIR}
[ -f ${PM_DHCLIENT_SUSPEND} ] && /bin/rm -f ${PM_DHCLIENT_SUSPEND}
cd /etc/sysconfig/network-scripts
for ifcfg in ifcfg-* ; do
# Clear relevant parameters set by previous interface
# (lo doesn't set them)
NM_CONTROLLED=
BOOTPROTO=
. ./"${ifcfg}"
if [ "${NM_CONTROLLED}" = "no" ] || [ "${NM_CONTROLLED}" = "n" ] || [ "${NM_CONTROLLED}" = "false" ]; then
if [ "${BOOTPROTO}" = "bootp" ] || [ "${BOOTPROTO}" = "dhcp" ] || [ -z "${BOOTPROTO}" ]; then
# device is not NetworkManager controlled and uses dhcp,
# now see if it's actually up at the moment
/sbin/ip link show ${DEVICE} | /bin/grep -qE "state (UP|UNKNOWN)" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "${DEVICE}" >> ${PM_DHCLIENT_SUSPEND}
/sbin/ifdown ${DEVICE}
fi
fi
fi
done
}
resume_dhclient() {
[ ! -f ${PM_DHCLIENT_SUSPEND} ] && return
[ ! -x /sbin/ifup ] && return
cd /etc/sysconfig/network-scripts
while read device ; do
/sbin/ifup ${device}
done < ${PM_DHCLIENT_SUSPEND}
/bin/rm -f ${PM_DHCLIENT_SUSPEND}
}
case "$1" in
hibernate|suspend)
suspend_dhclient
;;
thaw|resume)
resume_dhclient
;;
*) exit $NA
;;
esac

View File

@ -1,36 +0,0 @@
# ub-dhcp
#### Description
ub-dhcp is an implementation of Linux dhcp for ub device.
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

View File

@ -1,37 +0,0 @@
# ub-dhcp
#### 介绍
ub-dhcp is an implementation of Linux dhcp for ub device.
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

48
README.ub-dhclient.d Normal file
View File

@ -0,0 +1,48 @@
The /etc/ub-dhcp/ub-dhclient.d directory allows other packages and system
administrators to create application-specific option handlers for ub-dhclient.
When ub-dhclient is run, any option listed in the dhcp-options(5) man page can
be requested. ub-dhclient-script does not handle every option available
because doing so would make the script unmaintainable as the components
using those options might change over time. The knowledge of how to handle
those options should be under the responsibility of the package maintainer
for that component (e.g., NTP options belong in a handler in the ntp
package).
To make maintenance easier, application specific DHCP options can be handled
by creating a bash script with two functions and placing it in /etc/ub-dhcp/
ub-dhclient.d
The script must follow a specific form:
(1) The script must be named NAME.sh. NAME can be anything, but it makes
sense to name it for the service it handles. e.g., ntp.sh
(2) The script must provide a NAME_config() function to read the options and
do whatever it takes to put those options in place.
(3) The script must provide a NAME_restore() function to restore original
configuration state when ub-dhclient stops.
(4) The script must be 'chmod +x' or ub-dhclient-script will ignore it.
The scripts execute in the same environment as ub-dhclient-script. That means
all of the functions and variables available to it are available to your
NAME.sh script. Things of note:
${SAVEDIR} is where original configuration files are saved. Save your
original configuration files here before you take the DHCP provided
values and generate new files.
Variables set in /etc/sysconfig/network, /etc/sysconfig/networking/network,
and /etc/sysconfig/network-scripts/ifcfg-$interface are available to
you.
See the scripts in /etc/ub-dhcp/ub-dhclient.d for examples.
NOTE: Do not use functions defined in /usr/sbin/ub-dhclient-script. Consider
ub-dhclient-script a black box. This script may change over time, so the
ub-dhclient.d scripts should not be using functions defined in it.
--
David Cantrell <dcantrell@redhat.com>

975
ub-dhclient-script Normal file
View File

@ -0,0 +1,975 @@
#!/bin/bash
#
# ub-dhclient-script: Network interface configuration script run by
# ub-dhclient based on DHCP client communication
#
# Copyright (C) 2008-2014 Red Hat, Inc.
#
# 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(s): David Cantrell <dcantrell@redhat.com>
# Jiri Popelka <jpopelka@redhat.com>
#
# ----------
# This script is a rewrite/reworking on ub-dhclient-script originally
# included as part of dhcp-970306:
# ub-dhclient-script for Linux. Dan Halbert, March, 1997.
# Updated for Linux 2.[12] by Brian J. Murrell, January 1999.
# Modified by David Cantrell <dcantrell@redhat.com> for Fedora and RHEL
# ----------
#
PATH=/bin:/usr/bin:/sbin
# scripts in ub-dhclient.d/ use $SAVEDIR (#833054)
export SAVEDIR=/var/lib/ub-dhclient
LOGFACILITY="local7"
LOGLEVEL="notice"
ETCDIR="/etc/ub-dhcp"
RESOLVCONF="/etc/resolv.conf"
logmessage() {
msg="${1}"
logger -p "${LOGFACILITY}.${LOGLEVEL}" -t "NET" "ub-dhclient: ${msg}"
}
eventually_add_hostnames_domain_to_search() {
# For the case when hostname for this machine has a domain that is not in domain_search list
# 1) get a hostname with `ipcalc --hostname` or `hostnamectl --transient`
# 2) get the domain from this hostname
# 3) add this domain to search line in resolv.conf if it's not already
# there (domain list that we have recently added there is a parameter of this function)
# We can't do this directly when generating resolv.conf in make_resolv_conf(), because
# we need to first save the resolv.conf with obtained values before we can call `ipcalc --hostname`.
# See bug 637763
search="${1}"
if need_hostname; then
status=1
OLD_HOSTNAME=$HOSTNAME
if [ -n "${new_ip_address}" ]; then
eval $(/usr/bin/ipcalc --silent --hostname "${new_ip_address}" ; echo "status=$?")
elif [ -n "${new_ip6_address}" ]; then
eval $(/usr/bin/ipcalc --silent --hostname "${new_ip6_address}" ; echo "status=$?")
fi
if [ ${status} -eq 0 ]; then
domain=$(echo "${HOSTNAME}" | cut -s -d "." -f 2-)
fi
HOSTNAME=$OLD_HOSTNAME
else
domain=$(hostnamectl --transient 2>/dev/null | cut -s -d "." -f 2-)
fi
if [ -n "${domain}" ] &&
[ ! "${domain}" = "localdomain" ] &&
[ ! "${domain}" = "localdomain6" ] &&
[ ! "${domain}" = "(none)" ] &&
[[ ! "${domain}" = *\ * ]]; then
is_in="false"
for s in ${search}; do
if [ "${s}" = "${domain}" ] ||
[ "${s}" = "${domain}." ]; then
is_in="true"
fi
done
if [ "${is_in}" = "false" ]; then
# Add domain name to search list (#637763)
sed -i -e "s/${search}/${search} ${domain}/" "${RESOLVCONF}"
fi
fi
}
make_resolv_conf() {
[ "${PEERDNS}" = "no" ] && return
if [ "${reason}" = "RENEW" ] &&
[ "${new_domain_name}" = "${old_domain_name}" ] &&
[ "${new_domain_name_servers}" = "${old_domain_name_servers}" ]; then
return
fi
if [ -n "${new_domain_name}" ] ||
[ -n "${new_domain_name_servers}" ] ||
[ -n "${new_domain_search}" ]; then
rscf="$(mktemp "${TMPDIR:-/tmp}/XXXXXX")"
[[ -z "${rscf}" ]] && return
echo "; generated by /usr/sbin/ub-dhclient-script" > "${rscf}"
if [ -n "${SEARCH}" ]; then
search="${SEARCH}"
else
if [ -n "${new_domain_search}" ]; then
# Remove instaces of \032 (#450042)
search="${new_domain_search//\\032/ }"
elif [ -n "${new_domain_name}" ]; then
# Note that the DHCP 'Domain Name Option' is really just a domain
# name, and that this practice of using the domain name option as
# a search path is both nonstandard and deprecated.
search="${new_domain_name}"
fi
fi
if [ -n "${search}" ]; then
echo "search ${search}" >> "${rscf}"
fi
if [ -n "${RES_OPTIONS}" ]; then
echo "options ${RES_OPTIONS}" >> "${rscf}"
fi
if [ -n "${new_domain_name_servers}" ]; then
for nameserver in ${new_domain_name_servers} ; do
echo "nameserver ${nameserver}" >> "${rscf}"
done
else # keep 'old' nameservers
sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p "${RESOLVCONF}" >> "${rscf}"
fi
change_resolv_conf "${rscf}"
rm -f "${rscf}"
if [ -n "${search}" ]; then
eventually_add_hostnames_domain_to_search "${search}"
fi
elif [ -n "${new_dhcp6_name_servers}" ] ||
[ -n "${new_dhcp6_domain_search}" ]; then
rscf="$(mktemp "${TMPDIR:-/tmp}/XXXXXX")"
[[ -z "${rscf}" ]] && return
echo "; generated by /usr/sbin/ub-dhclient-script" > "${rscf}"
if [ -n "${SEARCH}" ]; then
search="${SEARCH}"
else
if [ -n "${new_dhcp6_domain_search}" ]; then
search="${new_dhcp6_domain_search//\\032/ }"
fi
fi
if [ -n "${search}" ]; then
echo "search ${search}" >> "${rscf}"
fi
if [ -n "${RES_OPTIONS}" ]; then
echo "options ${RES_OPTIONS}" >> "${rscf}"
fi
shopt -s nocasematch
if [ -n "${new_dhcp6_name_servers}" ]; then
for nameserver in ${new_dhcp6_name_servers} ; do
# If the nameserver has a link-local address
# add a <zone_id> (interface name) to it.
if [[ "$nameserver" =~ ^fe80:: ]]
then
zone_id="%${interface}"
else
zone_id=
fi
echo "nameserver ${nameserver}$zone_id" >> "${rscf}"
done
else # keep 'old' nameservers
sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p "${RESOLVCONF}" >> "${rscf}"
fi
shopt -u nocasematch
change_resolv_conf "${rscf}"
rm -f "${rscf}"
if [ -n "${search}" ]; then
eventually_add_hostnames_domain_to_search "${search}"
fi
fi
}
# run given script
run_hook() {
local script
local exit_status
script="${1}"
if [ -f ${script} ]; then
. ${script}
fi
if [ -n "${exit_status}" ] && [ "${exit_status}" -ne 0 ]; then
logmessage "${script} returned non-zero exit status ${exit_status}"
fi
return ${exit_status}
}
# run scripts in given directory
run_hookdir() {
local dir
dir="${1}"
if [ -d "${dir}" ]; then
for script in $(find $dir -executable ! -empty); do
run_hook ${script} || return $?
done
fi
return 0
}
exit_with_hooks() {
# Source the documented exit-hook script, if it exists
run_hook "${ETCDIR}/ub-dhclient-exit-hooks" || exit $?
# Now run scripts in the hooks directory.
run_hookdir "${ETCDIR}/ub-dhclient-exit-hooks.d" || exit $?
exit ${1}
}
quad2num() {
if [ $# -eq 4 ]; then
let n="${1} << 24 | ${2} << 16 | ${3} << 8 | ${4}"
echo "${n}"
return 0
else
echo "0"
return 1
fi
}
ip2num() {
IFS='.' quad2num ${1}
}
num2ip() {
let n="${1}"
let o1="(${n} >> 24) & 0xff"
let o2="(${n} >> 16) & 0xff"
let o3="(${n} >> 8) & 0xff"
let o4="${n} & 0xff"
echo "${o1}.${o2}.${o3}.${o4}"
}
get_network_address() {
# get network address for the given IP address and (netmask or prefix)
ip="${1}"
nm="${2}"
if [ -n "${ip}" -a -n "${nm}" ]; then
if [[ "${nm}" = *.* ]]; then
ipcalc -s -n "${ip}" "${nm}" | cut -d '=' -f 2
else
ipcalc -s -n "${ip}/${nm}" | cut -d '=' -f 2
fi
fi
}
get_prefix() {
# get prefix for the given IP address and mask
ip="${1}"
nm="${2}"
if [ -n "${ip}" -a -n "${nm}" ]; then
ipcalc -s -p "${ip}" "${nm}" | cut -d '=' -f 2
fi
}
class_bits() {
let ip=$(IFS='.' ip2num "${1}")
let bits=32
let mask='255'
for ((i=0; i <= 3; i++, 'mask<<=8')); do
let v='ip&mask'
if [ "$v" -eq 0 ] ; then
let bits-=8
else
break
fi
done
echo $bits
}
is_router_reachable() {
# handle DHCP servers that give us a router not on our subnet
router="${1}"
routersubnet="$(get_network_address "${router}" "${new_subnet_mask}")"
mysubnet="$(get_network_address "${new_ip_address}" "${new_subnet_mask}")"
if [ ! "${routersubnet}" = "${mysubnet}" ]; then
# TODO: This function should not have side effects such as adding or
# removing routes. Can this be done with "ip route get" or similar
# instead? Are there cases that rely on this route being created here?
ip -4 route replace "${router}/32" dev "${interface}"
if [ "$?" -ne 0 ]; then
logmessage "failed to create host route for ${router}"
return 1
fi
fi
return 0
}
add_default_gateway() {
router="${1}"
if is_router_reachable "${router}" ; then
if [ $# -gt 1 ] && [ -n "${2}" ] && [[ "${2}" -gt 0 ]]; then
ip -4 route replace default via "${router}" dev "${interface}" metric "${2}"
else
ip -4 route replace default via "${router}" dev "${interface}"
fi
if [ $? -ne 0 ]; then
logmessage "failed to create default route: ${router} dev ${interface} ${metric}"
return 1
else
return 0
fi
fi
return 1
}
execute_client_side_configuration_scripts() {
# execute any additional client side configuration scripts we have
if [ "${1}" == "config" ] || [ "${1}" == "restore" ]; then
for f in ${ETCDIR}/ub-dhclient.d/*.sh ; do
if [ -x "${f}" ]; then
subsystem="${f%.sh}"
subsystem="${subsystem##*/}"
. "${f}"
"${subsystem}_${1}"
fi
done
fi
}
flush_dev() {
# Instead of bringing the interface down (#574568)
# explicitly clear ARP cache and flush all addresses & routes.
ip -4 addr flush dev "${1}" >/dev/null 2>&1
ip -4 route flush dev "${1}" >/dev/null 2>&1
ip -4 neigh flush dev "${1}" >/dev/null 2>&1
}
remove_old_addr() {
if [ -n "${old_ip_address}" ]; then
if [ -n "${old_prefix}" ]; then
ip -4 addr del "${old_ip_address}/${old_prefix}" dev "${interface}" >/dev/null 2>&1
else
ip -4 addr del "${old_ip_address}" dev "${interface}" >/dev/null 2>&1
fi
fi
}
dhconfig() {
if [ -n "${old_ip_address}" ] && [ -n "${alias_ip_address}" ] &&
[ ! "${alias_ip_address}" = "${old_ip_address}" ]; then
# possible new alias, remove old alias first
ip -4 addr del "${old_ip_address}" dev "${interface}" label "${interface}:0"
fi
if [ -n "${old_ip_address}" ] &&
[ ! "${old_ip_address}" = "${new_ip_address}" ]; then
# IP address changed. Delete all routes, and clear the ARP cache.
flush_dev "${interface}"
fi
# make sure the interface is up
ip link set dev "${interface}" up
# replace = add if it doesn't exist or override (update lifetimes) if it's there
ip -4 addr replace "${new_ip_address}/${new_prefix}" broadcast "${new_broadcast_address}" dev "${interface}" \
valid_lft "${new_dhcp_lease_time}" preferred_lft "${new_dhcp_lease_time}" >/dev/null 2>&1
if [ "${reason}" = "BOUND" ] || [ "${reason}" = "REBOOT" ] ||
[ ! "${old_ip_address}" = "${new_ip_address}" ] ||
[ ! "${old_subnet_mask}" = "${new_subnet_mask}" ] ||
[ ! "${old_network_number}" = "${new_network_number}" ] ||
[ ! "${old_broadcast_address}" = "${new_broadcast_address}" ] ||
[ ! "${old_routers}" = "${new_routers}" ] ||
[ ! "${old_interface_mtu}" = "${new_interface_mtu}" ]; then
# The 576 MTU is only used for X.25 and dialup connections
# where the admin wants low latency. Such a low MTU can cause
# problems with UDP traffic, among other things. As such,
# disallow MTUs from 576 and below by default, so that broken
# MTUs are ignored, but higher stuff is allowed (1492, 1500, etc).
if [ -n "${new_interface_mtu}" ] && [ "${new_interface_mtu}" -gt 576 ]; then
ip link set dev "${interface}" mtu "${new_interface_mtu}"
fi
# static routes
if [ -n "${new_classless_static_routes}" ] ||
[ -n "${new_static_routes}" ]; then
if [ -n "${new_classless_static_routes}" ]; then
IFS=', |' static_routes=(${new_classless_static_routes})
# If the DHCP server returns both a Classless Static Routes option and
# a Router option, the DHCP client MUST ignore the Router option. (RFC3442)
new_routers=""
else
IFS=', |' static_routes=(${new_static_routes})
fi
route_targets=()
for((i=0; i<${#static_routes[@]}; i+=2)); do
target=${static_routes[$i]}
if [ -n "${new_classless_static_routes}" ]; then
if [ "${target}" = "0" ]; then
new_routers="${static_routes[$i+1]}"
continue
else
prefix=${target%%.*}
target=${target#*.}
IFS="." target_arr=(${target})
unset IFS
((pads=4-${#target_arr[@]}))
for j in $(seq $pads); do
target="${target}.0"
done
# Client MUST zero any bits in the subnet number where the corresponding bit in the mask is zero.
# In other words, the subnet number installed in the routing table is the logical AND of
# the subnet number and subnet mask given in the Classless Static Routes option. (RFC3442)
target="$(get_network_address "${target}" "${prefix}")"
fi
else
prefix=$(class_bits "${target}")
fi
gateway=${static_routes[$i+1]}
# special case 0.0.0.0 to allow static routing for link-local addresses
# (including IPv4 multicast) which will not have a next-hop (#769463, #787318)
if [ "${gateway}" = "0.0.0.0" ]; then
valid_gateway=0
scope='scope link'
else
is_router_reachable "${gateway}"
valid_gateway=$?
scope=''
fi
if [ "${valid_gateway}" -eq 0 ]; then
metric=''
for t in "${route_targets[@]}"; do
if [ "${t}" = "${target}" ]; then
if [ -z "${metric}" ]; then
metric=1
else
((metric=metric+1))
fi
fi
done
if [ -n "${metric}" ]; then
metric="metric ${metric}"
fi
ip -4 route replace "${target}/${prefix}" proto static via "${gateway}" dev "${interface}" ${metric} ${scope}
if [ $? -ne 0 ]; then
logmessage "failed to create static route: ${target}/${prefix} via ${gateway} dev ${interface} ${metric}"
else
route_targets=(${route_targets[@]} ${target})
fi
fi
done
fi
# gateways
if [[ ( "${DEFROUTE}" != "no" ) &&
(( -z "${GATEWAYDEV}" ) || ( "${GATEWAYDEV}" = "${interface}" )) ]]; then
if [[ ( -z "${GATEWAY}" ) ||
(( -n "${DHCLIENT_IGNORE_GATEWAY}" ) && ( "${DHCLIENT_IGNORE_GATEWAY}" = [Yy]* )) ]]; then
metric="${METRIC:-}"
let i="${METRIC:-0}"
default_routers=()
for router in ${new_routers} ; do
added_router=-
for r in "${default_routers[@]}" ; do
if [ "${r}" = "${router}" ]; then
added_router=1
fi
done
if [ -z "${router}" ] ||
[ "${added_router}" = "1" ] ||
[ "$(IFS='.' ip2num ${router})" -le 0 ] ||
[[ ( "${router}" = "${new_broadcast_address}" ) &&
( "${new_subnet_mask}" != "255.255.255.255" ) ]]; then
continue
fi
default_routers=(${default_routers[@]} ${router})
add_default_gateway "${router}" "${metric}"
let i=i+1
metric=${i}
done
elif [ -n "${GATEWAY}" ]; then
routersubnet=$(get_network_address "${GATEWAY}" "${new_subnet_mask}")
mysubnet=$(get_network_address "${new_ip_address}" "${new_subnet_mask}")
if [ "${routersubnet}" = "${mysubnet}" ]; then
ip -4 route replace default via "${GATEWAY}" dev "${interface}"
fi
fi
fi
fi
if [ ! "${new_ip_address}" = "${alias_ip_address}" ] &&
[ -n "${alias_ip_address}" ]; then
# Reset the alias address (fix: this should really only do this on changes)
ip -4 addr flush dev "${interface}" label "${interface}:0" >/dev/null 2>&1
ip -4 addr replace "${alias_ip_address}/${alias_prefix}" broadcast "${alias_broadcast_address}" dev "${interface}" label "${interface}:0"
ip -4 route replace "${alias_ip_address}/32" dev "${interface}"
fi
# After ub-dhclient brings an interface UP with a new IP address, subnet mask,
# and routes, in the REBOOT/BOUND states -> search for "ub-dhclient-up-hooks".
if [ "${reason}" = "BOUND" ] || [ "${reason}" = "REBOOT" ] ||
[ ! "${old_ip_address}" = "${new_ip_address}" ] ||
[ ! "${old_subnet_mask}" = "${new_subnet_mask}" ] ||
[ ! "${old_network_number}" = "${new_network_number}" ] ||
[ ! "${old_broadcast_address}" = "${new_broadcast_address}" ] ||
[ ! "${old_routers}" = "${new_routers}" ] ||
[ ! "${old_interface_mtu}" = "${new_interface_mtu}" ]; then
if [ -x "${ETCDIR}/ub-dhclient-${interface}-up-hooks" ]; then
. "${ETCDIR}/ub-dhclient-${interface}-up-hooks"
elif [ -x ${ETCDIR}/ub-dhclient-up-hooks ]; then
. ${ETCDIR}/ub-dhclient-up-hooks
fi
fi
make_resolv_conf
if [ -n "${new_host_name}" ] && need_hostname; then
hostnamectl set-hostname --transient --no-ask-password "${new_host_name}"
fi
if [[ ( "${DHCP_TIME_OFFSET_SETS_TIMEZONE}" = [yY1]* ) &&
( -n "${new_time_offset}" ) ]]; then
# DHCP option "time-offset" is requested by default and should be
# handled. The geographical zone abbreviation cannot be determined
# from the GMT offset, but the $ZONEINFO/Etc/GMT$offset file can be
# used - note: this disables DST.
((z=new_time_offset/3600))
((hoursWest=$(printf '%+d' $z)))
if (( $hoursWest < 0 )); then
# tzdata treats negative 'hours west' as positive 'gmtoff'!
((hoursWest*=-1))
fi
tzfile=/usr/share/zoneinfo/Etc/GMT$(printf '%+d' ${hoursWest})
if [ -e "${tzfile}" ]; then
cp -fp "${tzfile}" /etc/localtime
touch /etc/localtime
fi
fi
execute_client_side_configuration_scripts "config"
}
wait_for_link_local() {
# we need a link-local address to be ready (not tentative)
for i in $(seq 50); do
linklocal=$(ip -6 addr show dev "${interface}" scope link)
# tentative flag means DAD is still not complete
tentative=$(echo "${linklocal}" | grep tentative)
[[ -n "${linklocal}" && -z "${tentative}" ]] && exit_with_hooks 0
sleep 0.1
done
}
# Section 18.1.8. (Receipt of Reply Messages) of RFC 3315 says:
# The client SHOULD perform duplicate address detection on each of
# the addresses in any IAs it receives in the Reply message before
# using that address for traffic.
add_ipv6_addr_with_DAD() {
ip -6 addr replace "${new_ip6_address}/${new_ip6_prefixlen}" \
dev "${interface}" scope global valid_lft "${new_max_life}" \
preferred_lft "${new_preferred_life}"
# repeatedly test whether newly added address passed
# duplicate address detection (DAD)
for i in $(seq 5); do
sleep 1 # give the DAD some time
addr=$(ip -6 addr show dev "${interface}" \
| grep "${new_ip6_address}/${new_ip6_prefixlen}")
# tentative flag == DAD is still not complete
tentative=$(echo "${addr}" | grep tentative)
# dadfailed flag == address is already in use somewhere else
dadfailed=$(echo "${addr}" | grep dadfailed)
if [ -n "${dadfailed}" ] ; then
# address was added with valid_lft/preferred_lft 'forever', remove it
ip -6 addr del "${new_ip6_address}/${new_ip6_prefixlen}" dev "${interface}"
exit_with_hooks 3
fi
if [ -z "${tentative}" ] ; then
if [ -n "${addr}" ]; then
# DAD is over
return 0
else
# address was auto-removed (or not added at all)
exit_with_hooks 3
fi
fi
done
return 0
}
dh6config() {
if [ -n "${old_ip6_prefix}" ] ||
[ -n "${new_ip6_prefix}" ]; then
echo "Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix}"
exit_with_hooks 0
fi
case "${reason}" in
BOUND6)
if [ -z "${new_ip6_address}" ] ||
[ -z "${new_ip6_prefixlen}" ]; then
exit_with_hooks 2
fi
add_ipv6_addr_with_DAD
make_resolv_conf
;;
RENEW6|REBIND6)
if [[ -n "${new_ip6_address}" ]] &&
[[ -n "${new_ip6_prefixlen}" ]]; then
if [[ ! "${new_ip6_address}" = "${old_ip6_address}" ]]; then
[[ -n "${old_ip6_address}" ]] && ip -6 addr del "${old_ip6_address}" dev "${interface}"
fi
# call it even if new_ip6_address = old_ip6_address to update lifetimes
add_ipv6_addr_with_DAD
fi
if [ ! "${new_dhcp6_name_servers}" = "${old_dhcp6_name_servers}" ] ||
[ ! "${new_dhcp6_domain_search}" = "${old_dhcp6_domain_search}" ]; then
make_resolv_conf
fi
;;
DEPREF6)
if [ -z "${new_ip6_prefixlen}" ]; then
exit_with_hooks 2
fi
ip -6 addr change "${new_ip6_address}/${new_ip6_prefixlen}" \
dev "${interface}" scope global preferred_lft 0
;;
esac
execute_client_side_configuration_scripts "config"
}
# Functions from /etc/sysconfig/network-scripts/network-functions
need_hostname ()
{
CHECK_HOSTNAME=$(hostnamectl --transient)
if [[ "${CHECK_HOSTNAME}" = "(none)" ]] ||
[[ "${CHECK_HOSTNAME}" = "localhost" ]] ||
[[ "${CHECK_HOSTNAME}" = "localhost.localdomain" ]]; then
return 0
else
return 1
fi
}
# Takes one argument - temporary resolv.conf file
change_resolv_conf ()
{
options=$(grep '^[\ \ ]*option' "${RESOLVCONF}" 2>/dev/null);
if [[ -n "${options}" ]]; then
# merge options from existing resolv.conf with specified resolv.conf content
newres="${options}"$'\n'$(grep -vF "${options}" "${1}");
else
newres=$(cat "${1}");
fi;
eval $(echo "${newres}" > "${RESOLVCONF}"; echo "status=$?")
if [[ $status -eq 0 ]]; then
logger -p local7.notice -t "NET" -i "${0} : updated ${RESOLVCONF}";
[[ -e /var/run/nscd/socket ]] && /usr/sbin/nscd -i hosts; # invalidate cache
fi;
return $status;
}
get_config_by_name ()
{
LANG=C grep -E -i -l \
"^[[:space:]]*NAME=\"(Auto |System )?${1}\"" \
/etc/sysconfig/network-scripts/ifcfg-* \
| LC_ALL=C sed -e "$__sed_discard_ignored_files"
}
get_hwaddr ()
{
if [ -f /sys/class/net/${1}/address ]; then
awk '{ print toupper($0) }' < /sys/class/net/${1}/address
elif [ -d "/sys/class/net/${1}" ]; then
LC_ALL= LANG= ip -o link show ${1} 2>/dev/null | \
awk '{ print toupper(gensub(/.*link\/[^ ]* ([[:alnum:]:]*).*/,
"\\1", 1)); }'
fi
}
validate_resolv_conf()
{
# It's possible to have broken symbolic link $RESOLVCONF -> <some_nm_dir>
# https://bugzilla.redhat.com/1475279
# Remove broken link and hope NM will survive
if [ -h "${RESOLVCONF}" -a ! -e "${RESOLVCONF}" ];
then
logmessage "${RESOLVCONF} is broken symlink. Recreating..."
unlink "${RESOLVCONF}"
touch "${RESOLVCONF}"
fi;
}
get_config_by_hwaddr ()
{
LANG=C grep -il "^[[:space:]]*HWADDR=\"\?${1}\"\?\([[:space:]#]\|$\)" /etc/sysconfig/network-scripts/ifcfg-* \
| LC_ALL=C sed -e "$__sed_discard_ignored_files"
}
get_config_by_device ()
{
LANG=C grep -l "^[[:space:]]*DEVICE=\"\?${1}\"\?\([[:space:]#]\|$\)" \
/etc/sysconfig/network-scripts/ifcfg-* \
| LC_ALL=C sed -e "$__sed_discard_ignored_files"
}
need_config ()
{
# A sed expression to filter out the files that is_ignored_file recognizes
__sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
local nconfig
CONFIG="ifcfg-${1}"
[ -f "${CONFIG}" ] && return
CONFIG="${1##*/}"
[ -f "${CONFIG}" ] && return
nconfig=$(get_config_by_name "${1}")
if [ -n "$nconfig" ] && [ -f "$nconfig" ]; then
CONFIG=${nconfig##*/}
return
fi
local addr=$(get_hwaddr ${1})
if [ -n "$addr" ]; then
nconfig=$(get_config_by_hwaddr ${addr})
if [ -n "$nconfig" ] ; then
CONFIG=${nconfig##*/}
[ -f "${CONFIG}" ] && return
fi
fi
nconfig=$(get_config_by_device ${1})
if [ -n "$nconfig" ] && [ -f "$nconfig" ]; then
CONFIG=${nconfig##*/}
return
fi
}
# We need this because of PEERDNS
source_config ()
{
CONFIG=${CONFIG##*/}
. /etc/sysconfig/network-scripts/$CONFIG
}
#
# ### MAIN
#
# Invoke the local dhcp client enter hooks, if they exist.
run_hook "${ETCDIR}/ub-dhclient-enter-hooks" || exit $?
run_hookdir "${ETCDIR}/ub-dhclient-enter-hooks.d" || exit $?
[ "${PEERDNS}" = "no" ] || validate_resolv_conf
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [ -f /etc/sysconfig/networking/network ]; then
. /etc/sysconfig/networking/network
fi
## it's possible initscripts package is not installed
## for example in container. Don't flood stderr then
if [ -d /etc/sysconfig/network-scripts ]; then
cd /etc/sysconfig/network-scripts
CONFIG="${interface}"
need_config "${CONFIG}"
source_config >/dev/null 2>&1
fi;
# In case there's some delay in rebinding, it might happen, that the valid_lft drops to 0,
# address is removed by kernel and then re-added few seconds later by ub-dhclient-script.
# With this work-around the address lives a minute longer.
# "4294967235" = infinite (forever) - 60
[[ "${new_dhcp_lease_time}" -lt "4294967235" ]] && new_dhcp_lease_time=$((new_dhcp_lease_time + 60))
[[ "${new_max_life}" -lt "4294967235" ]] && new_max_life=$((new_max_life + 60))
new_prefix="$(get_prefix "${new_ip_address}" "${new_subnet_mask}")"
old_prefix="$(get_prefix "${old_ip_address}" "${old_subnet_mask}")"
alias_prefix="$(get_prefix "${alias_ip_address}" "${alias_subnet_mask}")"
case "${reason}" in
MEDIUM|ARPCHECK|ARPSEND)
# Do nothing
exit_with_hooks 0
;;
PREINIT)
if [ -n "${alias_ip_address}" ]; then
# Flush alias, its routes will disappear too.
ip -4 addr flush dev "${interface}" label "${interface}:0" >/dev/null 2>&1
fi
# upstream ub-dhclient-script removes (ifconfig $interface 0 up) old adresses in PREINIT,
# but we sometimes (#125298) need (for iSCSI/nfs root to have a dhcp interface) to keep the existing ip
# flush_dev ${interface}
ip link set dev "${interface}" up
if [ -n "${DHCLIENT_DELAY}" ] && [ "${DHCLIENT_DELAY}" -gt 0 ]; then
# We need to give the kernel some time to get the interface up.
sleep "${DHCLIENT_DELAY}"
fi
exit_with_hooks 0
;;
PREINIT6)
# ensure interface is up
ip link set dev "${interface}" up
# Removing stale addresses from aborted clients shouldn't be needed
# since we've been adding addresses with lifetimes.
# Which means that kernel eventually removes them automatically.
# ip -6 addr flush dev "${interface}" scope global permanent
wait_for_link_local
exit_with_hooks 0
;;
BOUND|RENEW|REBIND|REBOOT)
if [ -z "${interface}" ] || [ -z "${new_ip_address}" ]; then
exit_with_hooks 2
fi
if arping -D -q -c2 -I "${interface}" "${new_ip_address}"; then
dhconfig
exit_with_hooks 0
else # DAD failed, i.e. address is already in use
ARP_REPLY=$(arping -D -c2 -I "${interface}" "${new_ip_address}" | grep reply | awk '{print toupper($5)}' | cut -d "[" -f2 | cut -d "]" -f1)
OUR_MACS=$(ip link show | grep link | awk '{print toupper($2)}' | uniq)
if [[ "${OUR_MACS}" = *"${ARP_REPLY}"* ]]; then
# the reply can come from our system, that's OK (#1116004#c33)
dhconfig
exit_with_hooks 0
else
exit_with_hooks 1
fi
fi
;;
BOUND6|RENEW6|REBIND6|DEPREF6)
dh6config
exit_with_hooks 0
;;
EXPIRE6|RELEASE6|STOP6)
if [ -z "${old_ip6_address}" ] || [ -z "${old_ip6_prefixlen}" ]; then
exit_with_hooks 2
fi
ip -6 addr del "${old_ip6_address}/${old_ip6_prefixlen}" \
dev "${interface}"
execute_client_side_configuration_scripts "restore"
if [ -x "${ETCDIR}/ub-dhclient-${interface}-down-hooks" ]; then
. "${ETCDIR}/ub-dhclient-${interface}-down-hooks"
elif [ -x ${ETCDIR}/ub-dhclient-down-hooks ]; then
. ${ETCDIR}/ub-dhclient-down-hooks
fi
exit_with_hooks 0
;;
EXPIRE|FAIL|RELEASE|STOP)
execute_client_side_configuration_scripts "restore"
if [ -x "${ETCDIR}/ub-dhclient-${interface}-down-hooks" ]; then
. "${ETCDIR}/ub-dhclient-${interface}-down-hooks"
elif [ -x ${ETCDIR}/ub-dhclient-down-hooks ]; then
. ${ETCDIR}/ub-dhclient-down-hooks
fi
if [ -n "${alias_ip_address}" ]; then
# Flush alias
ip -4 addr flush dev "${interface}" label "${interface}:0" >/dev/null 2>&1
fi
# upstream script sets interface down here,
# we only remove old ip address
#flush_dev ${interface}
remove_old_addr
if [ -n "${alias_ip_address}" ]; then
ip -4 addr replace "${alias_ip_address}/${alias_prefix}" broadcast "${alias_broadcast_address}" dev "${interface}" label "${interface}:0"
ip -4 route replace "${alias_ip_address}/32" dev "${interface}"
fi
exit_with_hooks 0
;;
TIMEOUT)
if [ -n "${new_routers}" ]; then
if [ -n "${alias_ip_address}" ]; then
ip -4 addr flush dev "${interface}" label "${interface}:0" >/dev/null 2>&1
fi
ip -4 addr replace "${new_ip_address}/${new_prefix}" \
broadcast "${new_broadcast_address}" dev "${interface}" \
valid_lft "${new_dhcp_lease_time}" preferred_lft "${new_dhcp_lease_time}"
set ${new_routers}
if ping -q -c 1 -w 10 -I "${interface}" "${1}"; then
dhconfig
exit_with_hooks 0
fi
#flush_dev ${interface}
remove_old_addr
exit_with_hooks 1
else
exit_with_hooks 1
fi
;;
*)
logmessage "unhandled state: ${reason}"
exit_with_hooks 1
;;
esac
exit_with_hooks 0

BIN
ub-dhcp-1.0.0.tar.gz Normal file

Binary file not shown.

410
ub-dhcp.spec Normal file
View File

@ -0,0 +1,410 @@
%global nmconfdir %{_sysconfdir}/NetworkManager
%global dhcpconfdir %{_sysconfdir}/ub-dhcp
Name: ub-dhcp
Version: 1.0.0
Release: 1
Summary: Dynamic host configuration protocol software
#Please don't change the epoch on this package
Epoch: 12
License: ISC
Source0: ub-dhcp-%{version}.tar.gz
Source1: ub-dhclient-script
Source2: README.ub-dhclient.d
Source3: 11-ub-dhclient
Source5: 56ub-dhclient
Source6: ub-dhcpd.service
Source7: ub-dhcpd6.service
Source8: ub-dhcrelay.service
BuildRequires: gcc autoconf automake libtool openldap-devel krb5-devel libcap-ng-devel
BuildRequires: systemd systemd-devel
# run tests need
BuildRequires: kyua atf-tests
Requires: shadow-utils coreutils grep sed systemd gawk ipcalc iproute iputils
Provides: %{name}-common %{name}-libs %{name}-server %{name}-relay %{name}-compat %{name}-client
Obsoletes: %{name}-common %{name}-libs %{name}-server %{name}-relay %{name}-compat %{name}-client
Provides: ub-dhcp = %{epoch}:%{version}-%{release}
Obsoletes: ub-dhcp < %{epoch}:%{version}-%{release}
Provides: ub-dhclient = %{epoch}:%{version}-%{release}
Obsoletes: ub-dhclient < %{epoch}:%{version}-%{release}
%description
The Dynamic Host Configuration Protocol (DHCP) is a network management protocol used on UDP/IP networks whereby a DHCP server dynamically assigns an IP address and other network configuration parameters to each device on a network so they can communicate with other IP networks.
%package devel
Summary: Development headers and libraries for interfacing to the DHCP server
Requires: %{name} = %{epoch}:%{version}-%{release}
%description devel
Header files for using the ISC DHCP libraries. The
libub-dhcpctl and libub-omapi static libraries are also included in this package.
%package_help
%prep
%setup -n %{name}-%{version}
pushd bind
tar -xvf bind.tar.gz
ln -s bind-9* bind
popd
#rm bind/bind.tar.gz
sed -i -e 's|/var/db/|%{_localstatedir}/lib/ub-dhcpd/|g' contrib/ub-dhcp-lease-list.pl
%build
CFLAGS="%{optflags} -fno-strict-aliasing" \
%configure --with-srv-lease-file=%{_localstatedir}/lib/ub-dhcpd/ub-dhcpd.leases \
--with-srv6-lease-file=%{_localstatedir}/lib/ub-dhcpd/ub-dhcpd6.leases \
--with-cli-lease-file=%{_localstatedir}/lib/ub-dhclient/ub-dhclient.leases \
--with-cli6-lease-file=%{_localstatedir}/lib/ub-dhclient/ub-dhclient6.leases \
--with-srv-pid-file=%{_localstatedir}/run/ub-dhcpd.pid \
--with-srv6-pid-file=%{_localstatedir}/run/ub-dhcpd6.pid \
--with-cli-pid-file=%{_localstatedir}/run/ub-dhclient.pid \
--with-cli6-pid-file=%{_localstatedir}/run/ub-dhclient6.pid \
--with-relay-pid-file=%{_localstatedir}/run/ub-dhcrelay.pid \
--with-ldap --with-ldapcrypto --with-ldap-gssapi --enable-log-pid --enable-paranoia --enable-early-chroot \
--enable-binary-leases --with-systemd \
--with-atf
# define LDAP_CONFIGURATION when run common tests
sed -i "s/ATF_CFLAGS =/ATF_CFLAGS = -DLDAP_CONFIGURATION/g" common/tests/Makefile
make
%install
%make_install
install -D -p -m 0755 %{SOURCE1} $RPM_BUILD_ROOT%{_sbindir}/ub-dhclient-script
install -p -m 0644 %{SOURCE2} .
mkdir -p $RPM_BUILD_ROOT%{dhcpconfdir}/ub-dhclient.d
mkdir -p $RPM_BUILD_ROOT%{nmconfdir}/dispatcher.d
install -p -m 0755 %{SOURCE3} $RPM_BUILD_ROOT%{nmconfdir}/dispatcher.d
install -D -p -m 0755 %{SOURCE5} $RPM_BUILD_ROOT%{_libdir}/pm-utils/sleep.d/56ub-dhclient
mkdir -p $RPM_BUILD_ROOT%{_unitdir}
install -m 644 %{SOURCE6} $RPM_BUILD_ROOT%{_unitdir}
install -m 644 %{SOURCE7} $RPM_BUILD_ROOT%{_unitdir}
install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_unitdir}
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/ub-dhcpd/
touch $RPM_BUILD_ROOT%{_localstatedir}/lib/ub-dhcpd/ub-dhcpd.leases
touch $RPM_BUILD_ROOT%{_localstatedir}/lib/ub-dhcpd/ub-dhcpd6.leases
mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/ub-dhclient/
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
cat <<EOF > %{buildroot}%{_sysconfdir}/sysconfig/ub-dhcpd
# WARNING: This file is NOT used anymore.
# If you are here to restrict what interfaces should dhcpd listen on,
# be aware that dhcpd listens *only* on interfaces for which it finds subnet
# declaration in dhcpd.conf. It means that explicitly enumerating interfaces
# also on command line should not be required in most cases.
# If you still insist on adding some command line options,
# copy dhcpd.service from /lib/systemd/system to /etc/systemd/system and modify
# it there.
# https://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
# example:
# $ cp /usr/lib/systemd/system/ub-dhcpd.service /etc/systemd/system/
# $ vi /etc/systemd/system/ub-dhcpd.service
# $ ExecStart=/usr/sbin/ub-dhcpd -f -cf /etc/ub-dhcp/ub-dhcpd.conf -user ub-dhcpd -group ub-dhcpd --no-pid <your_interface_name(s)>
# $ systemctl --system daemon-reload
# $ systemctl restart ub-dhcpd.service
EOF
mkdir -p $RPM_BUILD_ROOT%{dhcpconfdir}
cat << EOF > %{buildroot}%{dhcpconfdir}/ub-dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp-server/ub-dhcpd.conf.example
# see dhcpd.conf(5) man page
#
EOF
cat << EOF > %{buildroot}%{dhcpconfdir}/ub-dhcpd6.conf
#
# DHCPv6 Server Configuration file.
# see /usr/share/doc/ub-dhcp-server/ub-dhcpd6.conf.example
# see ub-dhcpd.conf(5) man page
#
EOF
rm -f $RPM_BUILD_ROOT/usr/lib/debug/usr/sbin/ub-dhcrelay-4.3.6-28.7.aarch64.debug
mkdir -p $RPM_BUILD_ROOT%{_datadir}/doc/ub-dhcp-client
mkdir -p $RPM_BUILD_ROOT%{_datadir}/doc/ub-dhcp-server
mv -f $RPM_BUILD_ROOT%{_sysconfdir}/ub-dhclient.conf.example doc/examples/ub-dhclient-dhcpv4.conf
mv -f $RPM_BUILD_ROOT%{_sysconfdir}/ub-dhcpd.conf.example doc/examples/ub-dhcpd-dhcpv4.conf
install -p -m 0755 doc/examples/ub-dhclient-dhcpv4.conf $RPM_BUILD_ROOT%{_datadir}/doc/ub-dhcp-client/ub-dhclient.conf.example
install -p -m 0755 doc/examples/ub-dhcpd-dhcpv4.conf $RPM_BUILD_ROOT%{_datadir}/doc/ub-dhcp-server/ub-dhcpd.conf.example
install -p -m 0755 doc/examples/ub-dhclient-dhcpv6.conf $RPM_BUILD_ROOT%{_datadir}/doc/ub-dhcp-client/ub-dhclient6.conf.example
install -p -m 0755 doc/examples/ub-dhcpd-dhcpv6.conf $RPM_BUILD_ROOT%{_datadir}/doc/ub-dhcp-server/ub-dhcpd6.conf.example
install -D -p -m 0644 contrib/ldap/ub-dhcp.schema $RPM_BUILD_ROOT%{_sysconfdir}/openldap/schema/ub-dhcp.schema
find $RPM_BUILD_ROOT -type f -name "*.la" -delete -print
%check
make check
%pre
%global gid_uid 177
if ! getent group dhcpd > /dev/null ; then
groupadd --force --gid %{gid_uid} --system ub-dhcpd
fi
if ! getent passwd dhcpd >/dev/null ; then
if ! getent passwd %{gid_uid} >/dev/null ; then
useradd --system --uid %{gid_uid} --gid ub-dhcpd --home / --shell /sbin/nologin --comment "DHCP server" ub-dhcpd
else
useradd --system --gid ub-dhcpd --home / --shell /sbin/nologin --comment "DHCP server" ub-dhcpd
fi
fi
exit 0
%preun
%systemd_preun ub-dhcpd.service ub-dhcpd6.service ub-dhcrelay.service
%post
/sbin/ldconfig
%systemd_post ub-dhcpd.service ub-dhcpd6.service ub-dhcrelay.service
for servicename in ub-dhcpd ub-dhcpd6 ub-dhcrelay; do
etcservicefile=%{_sysconfdir}/systemd/system/${servicename}.service
if [ -f ${etcservicefile} ]; then
grep -q Type= ${etcservicefile} || sed -i '/\[Service\]/a Type=notify' ${etcservicefile}
sed -i 's/After=network.target/Wants=network-online.target\nAfter=network-online.target/' ${etcservicefile}
fi
done
exit 0
%postun
/sbin/ldconfig
%systemd_postun_with_restart ub-dhcpd.service ub-dhcpd6.service ub-dhcrelay.service
%files
%defattr(-,root,root)
%license LICENSE
%doc README RELNOTES doc/References.txt
%doc README.ub-dhclient.d
%doc contrib/ldap/ contrib/ub-dhcp-lease-list.pl
%{_datadir}/doc/ub-dhcp-client/ub-dhclient.conf.example
%{_datadir}/doc/ub-dhcp-server/ub-dhcpd.conf.example
%{_datadir}/doc/ub-dhcp-client/ub-dhclient6.conf.example
%{_datadir}/doc/ub-dhcp-server/ub-dhcpd6.conf.example
%dir %{_sysconfdir}/openldap/schema
%config(noreplace) %{_sysconfdir}/openldap/schema/ub-dhcp.schema
%attr(0750,root,root) %dir %{dhcpconfdir}
%dir %{_localstatedir}/lib/ub-dhclient
%dir %{dhcpconfdir}/ub-dhclient.d
%dir %{_sysconfdir}/NetworkManager
%dir %{_sysconfdir}/NetworkManager/dispatcher.d
%{_sysconfdir}/NetworkManager/dispatcher.d/11-ub-dhclient
%attr(0644,root,root) %{_unitdir}/ub-dhcpd.service
%attr(0644,root,root) %{_unitdir}/ub-dhcpd6.service
%attr(0644,root,root) %{_unitdir}/ub-dhcrelay.service
%attr(0755,dhcpd,dhcpd) %dir %{_localstatedir}/lib/ub-dhcpd
%attr(0644,dhcpd,dhcpd) %verify(mode) %config(noreplace) %{_localstatedir}/lib/ub-dhcpd/ub-dhcpd.leases
%attr(0644,dhcpd,dhcpd) %verify(mode) %config(noreplace) %{_localstatedir}/lib/ub-dhcpd/ub-dhcpd6.leases
%config(noreplace) %{_sysconfdir}/sysconfig/ub-dhcpd
%config(noreplace) %{dhcpconfdir}/ub-dhcpd.conf
%config(noreplace) %{dhcpconfdir}/ub-dhcpd6.conf
%{_sbindir}/ub-dhcpd
%{_sbindir}/ub-dhclient
%{_sbindir}/ub-dhclient-script
%{_sbindir}/ub-dhcrelay
%{_bindir}/ub-omshell
%attr(0755,root,root) %{_libdir}/pm-utils/sleep.d/56ub-dhclient
%files devel
%defattr(-,root,root)
%doc doc/IANA-arp-parameters doc/api+protocol
%{_includedir}/dhcpctl
%{_includedir}/omapip
%{_libdir}/libub-dhcp*.a
%{_libdir}/libub-omapi.a
%files help
%defattr(644,root,root)
%doc doc/*
%{_mandir}/man1/ub-omshell.1.gz
%{_mandir}/man5/ub-dhcpd.conf.5.gz
%{_mandir}/man5/ub-dhcpd.leases.5.gz
%{_mandir}/man8/ub-dhcpd.8.gz
%{_mandir}/man5/ub-dhcp-options.5.gz
%{_mandir}/man5/ub-dhcp-eval.5.gz
%{_mandir}/man5/ub-dhclient.conf.5.gz
%{_mandir}/man5/ub-dhclient.leases.5.gz
%{_mandir}/man8/ub-dhclient.8.gz
%{_mandir}/man8/ub-dhclient-script.8.gz
%{_mandir}/man8/ub-dhcrelay.8.gz
%{_mandir}/man3/ub-dhcpctl.3.gz
%{_mandir}/man3/ub-omapi.3.gz
%changelog
* Fri Oct 13 2023 Jeiwei Li <lijiewei5@huawei.com> - 12:1.0.0-1
- Release based on dhcp 4.4.3.
* Thu Jun 29 2023 renmingshuai <renmingshuai@huawei.com> - 12:4.4.3-3
- Type:bugfix
- ID:
- SUG:restart
- DESC:revert the correction about the logic in dhclient
* Sat May 27 2023 renmingshuai <renmingshuai@huawei.com> - 12:4.4.3-2
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:add Restart in dhcpd.service
* Tue Nov 1 2022 renmingshuai <renmingshuai@huawei.com> - 12:4.4.3-1
- Type:requirement
- ID:NA
- SUG:restart
- DESC:update to 4.4.3
* Thu Aug 25 2022 renmingshuai <renmingshuai@huawei.com> - 4.4.2-13
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:add dhX.conf.example in doc
* Wed Aug 24 2022 renmingshuai <renmingshuai@huawei.com> - 4.4.2-12
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:add a test case for PXE to support ipv6
support lease time config for ipv6
* Tue Feb 8 2022 renmingshuai <renmingshuai@huawei.com> - 4.4.2-11
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:fix error message display
* Mon Feb 7 2022 renmingshuai <renmingshuai@huawei.com> - 4.4.2-10
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:fix coredump when client active is NULL
* Wed Jan 12 2022 renmingshuai <renmingshuai@huawei.com> - 4.4.2-9
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:modofy upstream patches name and add reference
* Wed Jan 05 2022 renmingshuai <renmingshuai@huawei.com> - 4.4.2-8
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:remove build require bind-export-devel and add buildin bind
* Fri Jul 30 2021 renmingshuai <renmingshuai@huawei.com> - 4.4.2-7
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:fix multiple defination with gcc 10
* Mon May 31 2021 renmingshuai <renmingshuai@huawei.com> - 4.4.2-6
- Type:CVE
- ID:NA
- SUG:restart
- DESC:CVE-2021-25217
* Sat Feb 20 2021 hanzhijun <hanzhijun1@huawei.com> - 4.4.2-5
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:dhcp remove buildin bind
* Tue Dec 29 2020 quanhongfei <quanhongfei@huawei.com> - 4.4.2-4
- Type:bugfix
- ID:NA
- SUG:restart
- DESC:fix dhcp 64_bit lease parse
* Thu Sep 10 2020 gaihuiying <gaihuiying1@huawei.com> - 4.4.2-3
- Type:bugfix
- ID:NA
- SUG:restart
- DESC: change ownership of /var/lib/dhcpd/ to dhcpd:dhcpd
* Tue Sep 01 2020 yuboyun <yuboyun@huawei.com> - 4.4.2-2
- Type:NA
- ID:NA
- SUG:NA
- DESC: add yaml file
* Wed Jul 22 2020 gaihuiying<gaihuiying1@huawei.com> - 4.4.2-1
- Type:requirement
- ID:NA
- SUG:restart
- DESC: update to 4.4.2
* Tue Mar 3 2020 zhanglu<zhanglu37@huawei.com> - 4.3.6-37
- Type:bugfix
- ID:NA
- SUG:restart
- DESC: recheck if last pid was held by other process
* Thu Feb 27 2020 zhanglu<zhanglu37@huawei.com> - 4.3.6-36
- Type:bugfix
- ID:NA
- SUG:restart
- DESC: check if last pid when held by other process
* Wed Jan 22 2020 zhanglu<zhanglu37@huawei.com> - 4.3.6-35
- Type:bugfix
- ID:NA
- SUG:restart
- DESC: modify dhcpd coredump when discover interfaces
* Sat Jan 11 2020 openEuler Buildteam <buildteam@openeuler.org> - 4.3.6-34
- Type:enhancement
- ID:NA
- SUG:NA
- DESC: delete patches
* Tue Dec 24 2019 openEuler Buildteam <buildteam@openeuler.org> - 4.3.6-33
- rename doc subpackage as help subpackage
* Sat Dec 21 2019 openEuler Buildteam <buildteam@openeuler.org> - 4.3.6-32
- Type:bugfix
- ID:NA
- SUG:NA
- DESC:Fix dhcpd 2038 problem;
Adds address prefix len to dhclient cli
* Wed Sep 25 2019 openEuler Buildteam <buildteam@openeuler.org> - 4.3.6-31
- Type:bugfix
- ID:NA
- SUG:restart
- DESC: reducing getifaddrs calls and improving code performance
* Mon Sep 9 2019 openEuler Buildteam <buildteam@openeuler.org> - 4.3.6-30
- Type:bugfix
- Id:NA
- SUG:NA
- DESC:Fix dhcp package installation failed
* Thu Sep 5 2019 hufeng <solar.hu@huawei.com> - 4.3.6-29
-Create dhcp spec

16
ub-dhcpd.service Normal file
View File

@ -0,0 +1,16 @@
[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:ub-dhcpd.conf(5)
Wants=network-online.target
After=network-online.target
After=time-sync.target
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/dhcpd
ExecStart=/usr/sbin/ub-dhcpd -f -cf /etc/ub-dhcp/ub-dhcpd.conf -user ub-dhcpd -group ub-dhcpd --no-pid $DHCPDARGS
StandardError=null
Restart=on-failure
[Install]
WantedBy=multi-user.target

15
ub-dhcpd6.service Normal file
View File

@ -0,0 +1,15 @@
[Unit]
Description=DHCPv6 Server Daemon
Documentation=man:dhcpd(8) man:ub-dhcpd.conf(5)
Wants=network-online.target
After=network-online.target
After=time-sync.target
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/ub-dhcpd6
ExecStart=/usr/sbin/ub-dhcpd -f -6 -cf /etc/ub-dhcp/ub-dhcpd6.conf -user ub-dhcpd -group ub-dhcpd --no-pid $DHCPDARGS
StandardError=null
[Install]
WantedBy=multi-user.target

13
ub-dhcrelay.service Normal file
View File

@ -0,0 +1,13 @@
[Unit]
Description=DHCP Relay Agent Daemon
Documentation=man:ub-dhcrelay(8)
Wants=network-online.target
After=network-online.target
[Service]
Type=notify
ExecStart=/usr/sbin/ub-dhcrelay -d --no-pid
StandardError=null
[Install]
WantedBy=multi-user.target