various improvements
[distro-setup] / brc2
diff --git a/brc2 b/brc2
index f9acadade2fb7414038b7efb6fbc797a539992b9..d6ff1a401367e8412b3cbd8d1bb90975b4f09b18 100644 (file)
--- a/brc2
+++ b/brc2
@@ -2037,12 +2037,12 @@ apache-strip() {
   for f in $(find . -type f -maxdepth 1); do if head -n1 "$f"| grep -E '^#!/bin/bash\b' &>/dev/null; then { head -n 20 $f | tac | sed '/^# limitations under the License.$/,/^# Copyright.*Ian Kelling$/d' | tac; tail -n+21 $f; } |sponge $f; fi ; done
 }
 
-chrome() {
+chro() {
   if type -p chromium &>/dev/null; then
     cmd=chromium
   else
     cd /
-    cmd="schroot -c bullseye chromium"
+    cmd="schroot -c bookworm chromium"
     CHROMIUM_FLAGS='--enable-remote-extensions' $cmd & r
   fi
 }
@@ -3033,40 +3033,59 @@ EOF
   )
 }
 
+# sudo maybe
+#
+# passes on any initial -* args to sudo.
+sudm() {
+  local arg
+  local -a sudo_opts
+  for arg; do
+    if [[ $arg == -* ]]; then
+      sudo_opts+=("$arg")
+      shift
+    else
+      break
+    fi
+  done
+  if [[ $EUID == 0 ]]; then
+    "$@"
+  else
+    sudo "${sudo_opts[@]}" "$@"
+  fi
+}
 
-mns() { # mount namespace
+mns-setup() {
+  local ns
   ns=$1
-  shift
-  s mkdir -p /root/mount_namespaces
-  if ! sudo mountpoint /root/mount_namespaces >/dev/null; then
-    m sudo mount --bind /root/mount_namespaces /root/mount_namespaces
+  sudm mkdir -p /root/mount_namespaces
+  if ! sudm mountpoint /root/mount_namespaces >/dev/null; then
+    m sudm mount --bind /root/mount_namespaces /root/mount_namespaces
   fi
-  m sudo mount --make-private /root/mount_namespaces
-  if [[ ! -e /root/mount_namespaces/$ns ]]; then
-    m sudo touch /root/mount_namespaces/$ns
+  m sudm mount --make-private /root/mount_namespaces
+  if ! sudm test -e /root/mount_namespaces/$ns; then
+    m sudm touch /root/mount_namespaces/$ns
   fi
-  if ! sudo mountpoint /root/mount_namespaces/$ns >/dev/null; then
-    m sudo unshare --propagation slave --mount=/root/mount_namespaces/$ns /bin/true
+  if ! sudm mountpoint /root/mount_namespaces/$ns >/dev/null; then
+    m sudm unshare --propagation slave --mount=/root/mount_namespaces/$ns /bin/true
   fi
-  m sudo -E /usr/bin/nsenter --mount=/root/mount_namespaces/$ns "$@"
+
+}
+
+mns() { # mount namespace
+  local ns
+  ns=$1
+  shift
+  mns-setup $ns
+  m sudm -E /usr/bin/nsenter --mount=/root/mount_namespaces/$ns "$@"
 }
 
 mnsd() { # mount namespace + systemd namespace
+  local ns unit
   ns=$1
   unit=$2
   shift 2
 
-  s mkdir -p /root/mount_namespaces
-  if ! sudo mountpoint /root/mount_namespaces >/dev/null; then
-    m sudo mount --bind /root/mount_namespaces /root/mount_namespaces
-  fi
-  m sudo mount --make-private /root/mount_namespaces
-  if [[ ! -e /root/mount_namespaces/$ns ]]; then
-    m sudo touch /root/mount_namespaces/$ns
-  fi
-  if ! sudo mountpoint /root/mount_namespaces/$ns >/dev/null; then
-    m sudo unshare --propagation slave --mount=/root/mount_namespaces/$ns /bin/true
-  fi
+  mns-setup $ns
 
   pid=$(servicepid $unit)
   tmpf=$(mktemp --tmpdir $unit.XXXXXXXXXX)
@@ -4104,6 +4123,25 @@ sdncmdroot() { # systemd namespace root command
 }
 
 
+# systemd network namespace (not mount) cmd
+# usage: UNIT CMD...
+sdnncmd() {
+  local unit pid tmpf
+  if (( $# <= 1 )); then
+    echo $0: error wrong number of args >&2
+    return 1
+  fi
+  unit=$1
+  shift
+  pid=$(servicepid $unit)
+  tmpf=$(mktemp --tmpdir $unit.XXXXXXXXXX)
+  export -p >$tmpf
+  printf "%s " "${@@Q}" >>$tmpf
+  echo >>$tmpf
+  m sudo nsenter -t $pid -n sudo -u $USER -i bash -c ". $tmpf & rm $tmpf"
+}
+
+
 mailnnbash() {
   sdnbash mailnn
 }