X-Git-Url: https://iankelling.org/git/?p=newns;a=blobdiff_plain;f=newns;h=5075181714569a1d6e8980bb27af27e0b3eb4ddc;hp=34e4ca5da3454a8f4c4460e80f7a8fdef8917546;hb=HEAD;hpb=4c177e45b9aa0c9b26aefaabbc8acac767ac294f diff --git a/newns b/newns index 34e4ca5..9a7a6ff 100755 --- a/newns +++ b/newns @@ -1,5 +1,12 @@ #!/bin/bash -# Copyright (C) 2017 Ian Kelling +# I, Ian Kelling, follow the GNU license recommendations at +# https://www.gnu.org/licenses/license-recommendations.en.html. They +# recommend that small programs, < 300 lines, be licensed under the +# Apache License 2.0. This file contains or is part of one or more small +# programs. If a small program grows beyond 300 lines, I plan to switch +# its license to GPL. + +# Copyright 2024 Ian Kelling # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -220,6 +227,18 @@ find-network() { fi } +# ip add idempotent (if it doesn't exist already) +ip-add() { + local cmd net dev + cmd=$1 + net=$2 + dev=$3 + if ! $cmd addr show dev $dev | sed 's/^ *//;s/ *$//' | grep -xF "inet $net scope global $dev"; then + $cmd addr add $net dev $dev + fi + +} + start() { find-network @@ -257,7 +276,9 @@ start() { if $create; then - ip netns add $nn + if ! ip netns | grep -xF $nn &>/dev/null; then + ip netns add $nn + fi ip -n $nn link set dev lo up fi @@ -271,10 +292,10 @@ start() { err-cleanup() { stop; } ipnn link add $v0 type veth peer name $v1 ipnn link set $v0 netns default - ipd addr add $network.1/24 dev $v0 + ip-add ipd $network.1/24 $v0 ipd link set $v0 up nat -C &>/dev/null || nat -A - ipnn addr add $network.2/24 dev $v1 + ip-add ipnn $network.2/24 $v1 ipnn link set $v1 up cmd="ipnn route add default via $network.1" $cmd