fix DHCP calculation again

This commit is contained in:
2026-03-09 10:39:27 +01:00
parent 4870b0c7d6
commit 6c4f1f339a

View File

@@ -587,13 +587,11 @@ fi
if [ "$external_access_method" -eq 2 ] || [ "$external_access_method" -eq 3 ]; then if [ "$external_access_method" -eq 2 ] || [ "$external_access_method" -eq 3 ]; then
echo "Configuring DHCP on PiHole..." echo "Configuring DHCP on PiHole..."
echo "Gathering network information..." echo "Gathering network information..."
# Get network information # Get network information
gateway=$(ip route | awk '/default/ {print $3}') gateway=$(ip route | awk '/default/ {print $3}')
interface=$(ip route | awk '/default/ {print $5}') interface=$(ip route | awk '/default/ {print $5}')
netmask=$(ifconfig $interface | awk '/netmask/ {print $4}') netmask=$(ifconfig $interface | awk '/netmask/ {print $4}')
localip=$(hostname -I | awk '{print $1}') localip=$(hostname -I | awk '{print $1}')
echo " Gateway: $gateway" echo " Gateway: $gateway"
echo " Interface: $interface" echo " Interface: $interface"
echo " Netmask: $netmask" echo " Netmask: $netmask"
@@ -617,21 +615,47 @@ if [ "$external_access_method" -eq 2 ] || [ "$external_access_method" -eq 3 ]; t
echo "$(echo "ibase=2; $octet1" | bc).$(echo "ibase=2; $octet2" | bc).$(echo "ibase=2; $octet3" | bc).$(echo "ibase=2; $octet4" | bc)" echo "$(echo "ibase=2; $octet1" | bc).$(echo "ibase=2; $octet2" | bc).$(echo "ibase=2; $octet3" | bc).$(echo "ibase=2; $octet4" | bc)"
} }
# Function to add a number to a binary IP string # Function to add a binary value to a binary IP string
add_to_bin_ip() { add_binary_to_ip() {
local bin_ip=$1
local bin_add=$2 # e.g., "1010" for 10, "1100100" for 100
# Pad the binary addition to 8 bits (e.g., "1010" → "00001010")
bin_add=$(printf "%08d" "$bin_add")
# Split the IP into 4 octets (8 bits each)
local octet1=${bin_ip:0:8}
local octet2=${bin_ip:8:8}
local octet3=${bin_ip:16:8}
local octet4=${bin_ip:24:8}
# Add the binary value to the last octet
local new_octet4=$((2#$octet4 + 2#$bin_add))
# Handle overflow (if new_octet4 > 255)
if [ "$new_octet4" -gt 255 ]; then
new_octet4=$((new_octet4 - 256))
octet3=$((2#$octet3 + 1)) # Carry over to the third octet
octet3=$(printf "%08d" "$(echo "obase=2; $octet3" | bc)") # Convert back to 8-bit binary
fi
# Update the last octet
octet4=$(printf "%08d" "$(echo "obase=2; $new_octet4" | bc)")
# Reconstruct the binary IP string
echo "${octet1}${octet2}${octet3}${octet4}"
}
# Function to subtract 1 from a binary IP string
subtract_one_from_ip() {
local bin_ip=$1 local bin_ip=$1
local num=$2
# Convert binary IP to decimal
local dec_ip=$((2#${bin_ip:0:8} * 256**3 + 2#${bin_ip:8:8} * 256**2 + 2#${bin_ip:16:8} * 256 + 2#${bin_ip:24:8})) local dec_ip=$((2#${bin_ip:0:8} * 256**3 + 2#${bin_ip:8:8} * 256**2 + 2#${bin_ip:16:8} * 256 + 2#${bin_ip:24:8}))
# Add the number dec_ip=$((dec_ip - 1))
dec_ip=$((dec_ip + num)) printf "%08d%08d%08d%08d" \
# Convert back to binary IP
local new_bin_ip=$(printf "%08d%08d%08d%08d" \
"$(echo "obase=2; ($dec_ip >> 24) & 255" | bc)" \ "$(echo "obase=2; ($dec_ip >> 24) & 255" | bc)" \
"$(echo "obase=2; ($dec_ip >> 16) & 255" | bc)" \ "$(echo "obase=2; ($dec_ip >> 16) & 255" | bc)" \
"$(echo "obase=2; ($dec_ip >> 8) & 255" | bc)" \ "$(echo "obase=2; ($dec_ip >> 8) & 255" | bc)" \
"$(echo "obase=2; $dec_ip & 255" | bc)") "$(echo "obase=2; $dec_ip & 255" | bc)"
echo "$new_bin_ip"
} }
# Calculate network and broadcast addresses using binary operations # Calculate network and broadcast addresses using binary operations
@@ -661,44 +685,41 @@ if [ "$external_access_method" -eq 2 ] || [ "$external_access_method" -eq 3 ]; t
network_address=$(bin_to_ip "$network_bin") network_address=$(bin_to_ip "$network_bin")
broadcast_address=$(bin_to_ip "$broadcast_bin") broadcast_address=$(bin_to_ip "$broadcast_bin")
echo " Network Address: $network_address" echo " Network Address: $network_address"
echo " Broadcast Address: $broadcast_address" echo " Broadcast Address: $broadcast_address"
# Calculate DHCP range using binary operations # Calculate DHCP start: network_address + 10
# Start DHCP 10 IPs after the gateway (but not before network+1) dhcp_start_bin=$(add_binary_to_ip "$network_bin" "1010") # 10 in binary
dhcp_start_bin=$(add_to_bin_ip "$gateway_bin" 10)
network_dec=$((2#${network_bin:0:8} * 256**3 + 2#${network_bin:8:8} * 256**2 + 2#${network_bin:16:8} * 256 + 2#${network_bin:24:8}))
dhcp_start_dec=$((2#${dhcp_start_bin:0:8} * 256**3 + 2#${dhcp_start_bin:8:8} * 256**2 + 2#${dhcp_start_bin:16:8} * 256 + 2#${dhcp_start_bin:24:8}))
if [ "$dhcp_start_dec" -le "$network_dec" ]; then # Ensure DHCP start is not before network+1
dhcp_start_bin=$(add_to_bin_ip "$network_bin" 1) if [ "$(bin_to_ip "$dhcp_start_bin")" = "$(bin_to_ip "$network_bin")" ]; then
dhcp_start_bin=$(add_binary_to_ip "$network_bin" "1") # network + 1
fi fi
# End DHCP 100 IPs after start (but not after broadcast-1) # Calculate DHCP end: dhcp_start + 100
dhcp_end_bin=$(add_to_bin_ip "$dhcp_start_bin" 100) dhcp_end_bin=$(add_binary_to_ip "$dhcp_start_bin" "1100100") # 100 in binary
broadcast_dec=$((2#${broadcast_bin:0:8} * 256**3 + 2#${broadcast_bin:8:8} * 256**2 + 2#${broadcast_bin:16:8} * 256 + 2#${broadcast_bin:24:8}))
dhcp_end_dec=$((2#${dhcp_end_bin:0:8} * 256**3 + 2#${dhcp_end_bin:8:8} * 256**2 + 2#${dhcp_end_bin:16:8} * 256 + 2#${dhcp_end_bin:24:8}))
if [ "$dhcp_end_dec" -ge "$broadcast_dec" ]; then # Ensure DHCP end is not after broadcast-1
dhcp_end_bin=$(add_to_bin_ip "$broadcast_bin" -1) broadcast_minus_1_bin=$(subtract_one_from_ip "$broadcast_bin")
if [ "$(printf "%d" "$(bin_to_ip "$dhcp_end_bin" | tr '.' ' ')")" -ge "$(printf "%d" "$(bin_to_ip "$broadcast_bin" | tr '.' ' ')")" ]; then
dhcp_end_bin="$broadcast_minus_1_bin"
fi fi
# Ensure we don't include the local IP in the DHCP range # Exclude local IP from range
localip_dec=$((2#${localip_bin:0:8} * 256**3 + 2#${localip_bin:8:8} * 256**2 + 2#${localip_bin:16:8} * 256 + 2#${localip_bin:24:8})) localip_dec=$(printf "%d" "$(bin_to_ip "$localip_bin" | tr '.' ' ')")
dhcp_start_dec=$((2#${dhcp_start_bin:0:8} * 256**3 + 2#${dhcp_start_bin:8:8} * 256**2 + 2#${dhcp_start_bin:16:8} * 256 + 2#${dhcp_start_bin:24:8})) dhcp_start_dec=$(printf "%d" "$(bin_to_ip "$dhcp_start_bin" | tr '.' ' ')")
dhcp_end_dec=$((2#${dhcp_end_bin:0:8} * 256**3 + 2#${dhcp_end_bin:8:8} * 256**2 + 2#${dhcp_end_bin:16:8} * 256 + 2#${dhcp_end_bin:24:8})) dhcp_end_dec=$(printf "%d" "$(bin_to_ip "$dhcp_end_bin" | tr '.' ' ')")
if [ "$localip_dec" -ge "$dhcp_start_dec" ] && [ "$localip_dec" -le "$dhcp_end_dec" ]; then if [ "$localip_dec" -ge "$dhcp_start_dec" ] && [ "$localip_dec" -le "$dhcp_end_dec" ]; then
# If local IP is in the range, adjust the range echo "Local IP is in DHCP range. Adjusting..."
if [ $((localip_dec - dhcp_start_dec)) -lt $((dhcp_end_dec - localip_dec)) ]; then if [ $((localip_dec - dhcp_start_dec)) -lt $((dhcp_end_dec - localip_dec)) ]; then
dhcp_start_bin=$(add_to_bin_ip "$localip_bin" 1) dhcp_start_bin=$(add_binary_to_ip "$localip_bin" "1") # Move start above local IP
else else
dhcp_end_bin=$(add_to_bin_ip "$localip_bin" -1) dhcp_end_bin=$(subtract_one_from_ip "$localip_bin") # Move end below local IP
fi fi
fi fi
# Convert back to IP format # Convert to IP format
dhcp_start=$(bin_to_ip "$dhcp_start_bin") dhcp_start=$(bin_to_ip "$dhcp_start_bin")
dhcp_end=$(bin_to_ip "$dhcp_end_bin") dhcp_end=$(bin_to_ip "$dhcp_end_bin")
@@ -725,7 +746,6 @@ if [ "$external_access_method" -eq 2 ] || [ "$external_access_method" -eq 3 ]; t
# Restart PiHole to apply changes # Restart PiHole to apply changes
echo "Restarting PiHole to apply changes..." echo "Restarting PiHole to apply changes..."
docker restart pihole docker restart pihole
echo "DHCP configuration applied successfully." echo "DHCP configuration applied successfully."
fi fi