diff --git a/gns3server/modules/docker/resources/bin/busybox b/gns3server/modules/docker/resources/bin/busybox new file mode 100755 index 00000000..e6ac1ed3 Binary files /dev/null and b/gns3server/modules/docker/resources/bin/busybox differ diff --git a/gns3server/modules/docker/resources/bin/udhcpc b/gns3server/modules/docker/resources/bin/udhcpc new file mode 100755 index 00000000..c9d2f2be --- /dev/null +++ b/gns3server/modules/docker/resources/bin/udhcpc @@ -0,0 +1,3 @@ +#!/tmp/gns3/bin/sh + +exec busybox udhcpc -s /gns3/etc/udhcpc/default.script "$@" diff --git a/gns3server/modules/docker/resources/bin/udhcpc6 b/gns3server/modules/docker/resources/bin/udhcpc6 new file mode 100755 index 00000000..3d49d801 --- /dev/null +++ b/gns3server/modules/docker/resources/bin/udhcpc6 @@ -0,0 +1,3 @@ +#!/tmp/gns3/bin/sh + +exec busybox udhcpc6 -s /gns3/etc/udhcpc/default.script "$@" diff --git a/gns3server/modules/docker/resources/etc/udhcpc/default.script b/gns3server/modules/docker/resources/etc/udhcpc/default.script new file mode 100755 index 00000000..404fb190 --- /dev/null +++ b/gns3server/modules/docker/resources/etc/udhcpc/default.script @@ -0,0 +1,138 @@ +#!/tmp/gns3/bin/sh + +# script for udhcpc +# Copyright (c) 2008 Natanael Copa + +UDHCPC="/gns3/etc/udhcpc" +UDHCPC_CONF="$UDHCPC/udhcpc.conf" + +RESOLV_CONF="/etc/resolv.conf" +[ -f $UDHCPC_CONF ] && . $UDHCPC_CONF + +export broadcast +export dns +export domain +export interface +export ip +export mask +export metric +export router +export subnet + +#export PATH=/usr/bin:/bin:/usr/sbin:/sbin + +run_scripts() { + local dir=$1 + if [ -d $dir ]; then + for i in $dir/*; do + [ -f $i ] && $i + done + fi +} + +deconfig() { + ip addr flush dev $interface +} + +is_wifi() { + test -e /sys/class/net/$interface/phy80211 +} + +if_index() { + if [ -e /sys/class/net/$interface/ifindex ]; then + cat /sys/class/net/$interface/ifindex + else + ip link show dev $interface | head -n1 | cut -d: -f1 + fi +} + +calc_metric() { + local base= + if is_wifi; then + base=300 + else + base=200 + fi + echo $(( $base + $(if_index) )) +} + +routes() { + [ -z "$router" ] && return + local gw= num= + while ip route del default via dev $interface 2>/dev/null; do + : + done + num=0 + for gw in $router; do + ip route add 0.0.0.0/0 via $gw dev $interface \ + metric $(( $num + ${IF_METRIC:-$(calc_metric)} )) + num=$(( $num + 1 )) + done +} + +resolvconf() { + local i + [ -n "$IF_PEER_DNS" ] && [ "$IF_PEER_DNS" != "yes" ] && return + if [ "$RESOLV_CONF" = "no" ] || [ "$RESOLV_CONF" = "NO" ] \ + || [ -z "$RESOLV_CONF" ]; then + return + fi + echo -n > "$RESOLV_CONF" + [ -n "$domain" ] && echo "search $domain" >> "$RESOLV_CONF" + for i in $dns; do + echo "nameserver $i" >> "$RESOLV_CONF" + done +} + +bound() { + ip addr add $ip/$mask ${broadcast:+broadcast $broadcast} dev $interface + ip link set dev $interface up + routes + resolvconf +} + +renew() { + if ! ip addr show dev $interface | grep $ip/$mask; then + ip addr flush dev $interface + ip addr add $ip/$mask ${broadcast:+broadcast $broadcast} dev $interface + fi + + local i + for i in $router; do + if ! ip route show | grep ^default | grep $i; then + routes + break + fi + done + + if ! grep "^search $domain"; then + resolvconf + return + fi + for i in $dns; do + if ! grep "^nameserver $i"; then + resolvconf + return + fi + done +} + +case "$1" in + deconfig|renew|bound) + run_scripts $UDHCPC/pre-$1 + $1 + run_scripts $UDHCPC/post-$1 + ;; + leasefail) + echo "udhcpc failed to get a DHCP lease" >&2 + ;; + nak) + echo "udhcpc received DHCP NAK" >&2 + ;; + *) + echo "Error: this script should be called from udhcpc" >&2 + exit 1 + ;; +esac +exit 0 + diff --git a/gns3server/modules/docker/resources/init.sh b/gns3server/modules/docker/resources/init.sh index abd3aa4f..091be2fb 100755 --- a/gns3server/modules/docker/resources/init.sh +++ b/gns3server/modules/docker/resources/init.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/gns3/bin/busybox sh # # Copyright (C) 2016 GNS3 Technologies Inc. # @@ -19,6 +19,16 @@ # This script is injected into the container and launch before # the start command of the container # +OLD_PATH="$PATH" +PATH=/gns3/bin:/tmp/gns3/bin + +# bootstrap busybox commands +if [ ! -d /tmp/gns3/bin ]; then + busybox mkdir -p /tmp/gns3/bin + /gns3/bin/busybox --install -s /tmp/gns3/bin + # remove commands already available in /gns3/bin + (cd /tmp/gns3/bin; rm -f `cd /gns3/bin; echo *`) +fi # Wait 2 seconds to settle the network interfaces sleep 2 @@ -42,5 +52,13 @@ sed -n 's/^ *\(eth[0-9]*\):.*/\1/p' < /proc/net/dev | while read dev; do ip link set dev $dev up done +if [ -n "$INTERFACES" ]; then + mkdir -p /etc/network/if-up.d /etc/network/if-pre-up.d + mkdir -p /etc/network/if-down.d /etc/network/if-post-down.d + echo -e "$INTERFACES" > /etc/network/interfaces + ifup -a -f +fi + # continue normal docker startup +PATH="$OLD_PATH" exec "$@"