fix regression
[newns] / newns
diff --git a/newns b/newns
index 34e4ca5da3454a8f4c4460e80f7a8fdef8917546..9a7a6ff10fff25a11056d681fb4ad70826b77b2e 100755 (executable)
--- 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