Skip to content

Commit

Permalink
feat: Generate unique MAC address (#611)
Browse files Browse the repository at this point in the history
  • Loading branch information
kroese authored Jan 30, 2024
1 parent 72141ba commit 3c31bc9
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 12 deletions.
4 changes: 3 additions & 1 deletion src/display.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ if [[ "$GPU" != [Yy1]* ]] || [[ "$ARCH" != "amd64" ]]; then

fi

DISPLAY_OPTS="-display egl-headless,rendernode=/dev/dri/renderD128 -vga $VGA"
[[ "${VGA,,}" == "virtio" ]] && VGA="virtio-vga"
DISPLAY_OPTS="-display egl-headless,rendernode=/dev/dri/renderD128"
DISPLAY_OPTS="$DISPLAY_OPTS -vga none -device $VGA"

[ ! -d /dev/dri ] && mkdir -m 755 /dev/dri

Expand Down
28 changes: 17 additions & 11 deletions src/network.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ set -Eeuo pipefail

# Docker environment variables

: "${MAC:=""}"
: "${DHCP:="N"}"
: "${MAC:="02:11:32:AA:BB:CC"}"

: "${VM_NET_DEV:=""}"
: "${VM_NET_TAP:="dsm"}"
Expand Down Expand Up @@ -33,7 +33,7 @@ configureDHCP() {
fi

while ! ip link set "$VM_NET_TAP" up; do
info "Waiting for address to become available..."
info "Waiting for MAC address $VM_NET_MAC to become available..."
sleep 2
done

Expand Down Expand Up @@ -128,15 +128,15 @@ configureNAT() {
ip address add ${VM_NET_IP%.*}.1/24 broadcast ${VM_NET_IP%.*}.255 dev dockerbridge

while ! ip link set dockerbridge up; do
info "Waiting for address to become available..."
info "Waiting for IP address to become available..."
sleep 2
done

# QEMU Works with taps, set tap to the bridge created
ip tuntap add dev "$VM_NET_TAP" mode tap

while ! ip link set "$VM_NET_TAP" up promisc on; do
info "Waiting for tap to become available..."
info "Waiting for TAP to become available..."
sleep 2
done

Expand Down Expand Up @@ -211,14 +211,20 @@ getInfo() {
error "$ADD_ERR -e \"VM_NET_DEV=NAME\" to specify another interface name." && exit 27
fi

VM_NET_MAC="${VM_NET_MAC//-/:}"
if [ -z "$VM_NET_MAC" ]; then
# Generate MAC address based on Docker container ID in hostname
VM_NET_MAC=$(echo "$HOST" | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:11:32:\3:\4:\5/')
fi

VM_NET_MAC="${VM_NET_MAC,,//-/:}"

if [[ ${#VM_NET_MAC} == 12 ]]; then
m="$VM_NET_MAC"
VM_NET_MAC="${m:0:2}:${m:2:2}:${m:4:2}:${m:6:2}:${m:8:2}:${m:10:2}"
fi

if [[ ${#VM_NET_MAC} != 17 ]]; then
error "Invalid mac address: '$VM_NET_MAC', should be 12 or 17 digits long!" && exit 28
error "Invalid MAC address: '$VM_NET_MAC', should be 12 or 17 digits long!" && exit 28
fi

GATEWAY=$(ip r | grep default | awk '{print $3}')
Expand All @@ -242,15 +248,15 @@ getInfo
html "Initializing network..."

if [[ "$DEBUG" == [Yy1]* ]]; then
info "Container IP is $IP with gateway $GATEWAY on interface $VM_NET_DEV" && echo
info "Host: $HOST IP: $IP Gateway: $GATEWAY Interface: $VM_NET_DEV MAC: $VM_NET_MAC"
[ -f /etc/resolv.conf ] && cat /etc/resolv.conf
echo
fi

if [[ "$DHCP" == [Yy1]* ]]; then

if [[ "$GATEWAY" == "172."* ]]; then
if [[ "$DEBUG" != [Yy1]* ]]; then
error "You can only enable DHCP while the container is on a macvlan network!" && exit 26
fi
if [[ "$GATEWAY" == "172."* ]] && [[ "$DEBUG" != [Yy1]* ]]; then
error "You can only enable DHCP while the container is on a macvlan network!" && exit 26
fi

# Configuration for DHCP IP
Expand Down
1 change: 1 addition & 0 deletions src/reset.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ TEMPLATE="/var/www/index.html"
FOOTER1="$APP for Docker v$(</run/version)"
FOOTER2="<a href='$SUPPORT'>$SUPPORT</a>"

HOST=$(hostname -s)
KERNEL=$(uname -r | cut -b 1)
MINOR=$(uname -r | cut -d '.' -f2)
ARCH=$(dpkg --print-architecture)
Expand Down
15 changes: 15 additions & 0 deletions src/serial.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,21 @@ set -Eeuo pipefail
: "${HOST_MODEL:=""}"
: "${GUEST_SERIAL:=""}"

if [ -n "$HOST_MAC" ]; then

HOST_MAC="${HOST_MAC//-/:}"

if [[ ${#HOST_MAC} == 12 ]]; then
m="$HOST_MAC"
HOST_MAC="${m:0:2}:${m:2:2}:${m:4:2}:${m:6:2}:${m:8:2}:${m:10:2}"
fi

if [[ ${#HOST_MAC} != 17 ]]; then
error "Invalid HOST_MAC address: '$HOST_MAC', should be 12 or 17 digits long!" && exit 28
fi

fi

HOST_ARGS=()
HOST_ARGS+=("-cpu=$CPU_CORES")
HOST_ARGS+=("-cpu_arch=$HOST_CPU")
Expand Down

0 comments on commit 3c31bc9

Please sign in to comment.