warewulf4/config-ww4.sh
Egbert Eich e76a9480c0 - Warewulf v4.5.8 simplifies the wwinit boot process for SELinux
and configures tmpfs to spread the node image across all
  available NUMA nodes. It also improves the detection of kernels
  in the container image to more reliably detect the newest
  available kernel and to avoid debug / rescue kernels.
- Warewulf v4.5.7 fixes the ability to override overlay files
  configured in profiles with overlays configured per-node; fixes
  a template processing bug bug in development-time overlay
  rendering; and improves the preview dracut-based boot process to
  better support a "secure" boot process.
- removed added-cow-option-to-bind.patch as now in upstream
  * Show more information during `wwctl container <shell|exec>`
    about when and if the container image will be rebuilt.
  * Command-line completion for `wwctl overlay <edit|delete|chmod|chown>`.
  * Display an error during boot if no container is defined.
  * `wwctl container list --kernel` shows the kernel detected for
    each container.
  *  `wwctl container list --size` shows the uncompressed size of
     each container. `--compressed` shows the compressed size, and
     `--chroot` shows the size of the container source on the server.
  * Add a logrotate config for `warewulfd.log`.

OBS-URL: https://build.opensuse.org/package/show/network:cluster/warewulf4?expand=0&rev=95
2025-01-13 12:20:47 +00:00

100 lines
2.8 KiB
Bash

#!/bin/bash
# Configure warewulf with the primary network of the host
WW4CONF=/etc/warewulf/warewulf.conf
# Get the mask from prefix
cdr2mask()
{
# Number of args to shift, 255..255, first non-255 byte, zeroes
set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
[ $1 -gt 1 ] && shift $1 || shift
echo ${1-0}.${2-0}.${3-0}.${4-0}
}
# Get the ip4 address of the netork
network_address() {
declare address prefix_length
IFS=/ read address prefix_length <<< "$1"
declare -a octets
IFS=. read -a octets <<< "$address"
declare mask
mask=$( printf "%08x" $(( (1 << 32) - (1 << (32 - prefix_length)) )) )
declare -i i
for i in {0..3}; do octets[$i]=$(( octets[i] & 16#${mask:2*i:2} )); done
echo $( IFS=.; echo "${octets[*]}" )
}
# Check if last Octed is in range
function is_ip_in_range() {
# split the ip addresses into their octets.
local ip_start_octets=($(echo $DYNSTART | tr "." " "))
local ip_end_octets=($(echo $DYNEND | tr "." " "))
local ip_address_octets=($(echo $1 | tr "." " "))
# compare the octets one at a time to see if the ip address is within the range.
if [[ ${ip_address_octets[3]} -lt ${ip_start_octets[3]} || ${ip_address_octets[3]} -gt ${ip_end_octets[3]} ]]; then
return 1
fi
# if we reach this point, the ip address is in the range.
return 0
}
echo "-- WW4 CONFIGURAION $* --"
# Make sure that a ip address was defined for out network so that
# we can configure dhcpd correctly
IP4CIDR=`ip addr | awk '/scope global/ {print $2;exit}'`
IP4=${IP4CIDR%/*}
IP4PREFIX=${IP4CIDR#*/}
IP4MASK=$(cdr2mask $IP4PREFIX)
IP4NET=$(network_address "$IP4/$IP4PREFIX")
if [ "$IP4PREFIX" -gt 25 ] ; then
echo "ERROR: warewulf does at least a /25 network for dynamic addresses"
cat << EOF
ipaddr: $IP4
netmask: $IP4MASK
network: $IP4NET
range start: $DYNSTART
range end: $DYNEND
EOF
exit 0
fi
DYNSIZE=20
DYNSTART=${IP4#*.*.*.}
DYNSTART=$(( $DYNSTART + 2))
DYNPRE=${IP4%.*}
DYNEND=$(( $DYNSTART + $DYNSIZE + 1 ))
if [ $DYNEND -gt 254 ] ; then
DYNEND=$(( $IPNET + 2 + $DYNSIZE ))
DYNSTART=$(( $IPNET + 2 ))
fi
DYNSTART="${DYNPRE}.${DYNSTART}"
DYNEND="${DYNPRE}.${DYNEND}"
if is_ip_in_range $IP4 ; then
echo "ERROR: ip address is in range for dynamic address, please set this manually"
exit 0
fi
if [ -e $WW4CONF ] ; then
test -n $IP4 && sed -i 's/^ipaddr:.*/ipaddr: '$IP4'/' $WW4CONF
test -n $IP4MASK && sed -i 's/^netmask:.*/netmask: '$IP4MASK'/' $WW4CONF
test -n $IP4NET && sed -i 's/^network:.*/network: '$IP4NET'/' $WW4CONF
test -n $DYNSTART && sed -i 's/^ range start:.*/ range start: '$DYNSTART'/' $WW4CONF
test -n $DYNEND && sed -i 's/^ range end:.*/ range end: '$DYNEND'/' $WW4CONF
cat << EOF
ipaddr: $IP4
netmask: $IP4MASK
network: $IP4NET
range start: $DYNSTART
range end: $DYNEND
EOF
fi