Initial commit
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
# Copyright 2021 Google LLC
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
# A list of functions which get executed for each bound DHCP lease.
|
||||
# These are configured by the files included below.
|
||||
# Shellcheck does not understand how this gets referenced
|
||||
# shellcheck disable=SC2034
|
||||
GBMC_BR_DHCP_HOOKS=()
|
||||
|
||||
# A dict of outstanding items that should prevent DHCP completion
|
||||
declare -A GBMC_BR_DHCP_OUTSTANDING=()
|
||||
|
||||
# SC can't find this path during repotest
|
||||
# shellcheck disable=SC1091
|
||||
source /usr/share/network/lib.sh || exit
|
||||
# SC can't find this path during repotest
|
||||
# shellcheck disable=SC1091
|
||||
source /usr/share/gbmc-br-lib.sh || exit
|
||||
|
||||
# Load configurations from a known location in the filesystem to populate
|
||||
# hooks that are executed after each event.
|
||||
gbmc_br_source_dir /usr/share/gbmc-br-dhcp || exit
|
||||
|
||||
# Write out the current PID and cleanup when complete
|
||||
trap 'rm -f /run/gbmc-br-dhcp.pid' EXIT
|
||||
echo "$$" >/run/gbmc-br-dhcp.pid
|
||||
|
||||
if [ "$1" = bound ]; then
|
||||
# Variable is from the environment via udhcpc6
|
||||
# shellcheck disable=SC2154
|
||||
echo "DHCPv6(gbmcbr): $ipv6/128" >&2
|
||||
|
||||
pfx_bytes=()
|
||||
ip_to_bytes pfx_bytes "$ipv6"
|
||||
# Ensure we are a BMC and have a suffix nibble, the 0th index is reserved
|
||||
if (( pfx_bytes[8] != 0xfd || pfx_bytes[9] & 0xf == 0 )); then
|
||||
echo "Invalid address" >&2
|
||||
exit 1
|
||||
fi
|
||||
# Ensure we don't have more than a /80 address
|
||||
for (( i = 10; i < 16; ++i )); do
|
||||
if (( pfx_bytes[i] != 0 )); then
|
||||
echo "Invalid address" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
pfx="$(ip_bytes_to_str pfx_bytes)"
|
||||
gbmc_br_set_ip "$pfx" || exit
|
||||
|
||||
if [ -n "${fqdn-}" ]; then
|
||||
echo "Using hostname $fqdn" >&2
|
||||
hostnamectl set-hostname "$fqdn" || true
|
||||
fi
|
||||
|
||||
gbmc_br_run_hooks GBMC_BR_DHCP_HOOKS || exit
|
||||
|
||||
# If any of our hooks had expectations we should fail here
|
||||
if [ "${#GBMC_BR_DHCP_OUTSTANDING[@]}" -gt 0 ]; then
|
||||
echo "Not done with DHCP process: ${!GBMC_BR_DHCP_OUTSTANDING[*]}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Ensure that the installer knows we have completed processing DHCP by
|
||||
# running a service that reports completion
|
||||
echo 'Start DHCP Done' >&2
|
||||
systemctl start dhcp-done@DONE --no-block
|
||||
fi
|
||||
Reference in New Issue
Block a user