]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Fix lxc-netstat script
authorDaniel Lezcano <daniel.lezcano@free.fr>
Fri, 13 Nov 2009 10:48:29 +0000 (11:48 +0100)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Fri, 13 Nov 2009 10:48:29 +0000 (11:48 +0100)
Recent changes around the configuration tree broke the current
implementation of the lxc-netstat.

Instead of retrieving the init_pid in the /var/lxc/<name>/...,
pick one in the cgroup tasks list.

There is still a restriction with this command making impossible
to run it as non-root, any idea is welcome :(

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/lxc-netstat.in

index 6f4b163086ac76f42e523fd38a3840301c57e501..4ced22da45e1a79f1daca0ab3ecb2c85a962ca23 100644 (file)
@@ -1,7 +1,7 @@
 #!/bin/bash
 # set -ex
 
-lxcpath=@LXCPATH@
+lxcpath=/var/lib/lxc
 exec=""
 
 if [ ! -r $lxcpath ]; then
@@ -15,15 +15,15 @@ fi
 
 for i in $*; do
     case $i in
-       -n)
-           name=$2; shift 2;;
-       --exec)
-           exec="exec"; shift;;
+        -n)
+            name=$2; shift 2;;
+        --exec)
+            exec="exec"; shift;;
     esac
 done
 
 if [ -z "$exec" ]; then
-    exec @BINDIR@/lxc-unshare -s MOUNT -- @BINDIR@/lxc-netstat -n $name --exec $*
+    exec /usr/bin/lxc-unshare -s MOUNT -- /usr/bin/lxc-netstat -n $name --exec $*
 fi
 
 if [ -z "$name" ]; then
@@ -31,20 +31,31 @@ if [ -z "$name" ]; then
     exit 1
 fi
 
-if [ ! -d $lxcpath/$name ]; then
-    echo "'$name' does not exists"
-    exit 1
-fi
+cgroups=$(mount -l -t cgroup)
+cgroup_path=""
+
+for i in "$cgroups"; do
+
+    cgroup_name=$(echo $i | awk ' { print $1 } ')
+    cgroup_path=$(echo $i | awk ' { print $3 } ')
+
+    if [ "$cgroup_name" == "lxc" ]; then
+        break;
+    fi
 
-if [ ! -r $lxcpath/$name ]; then
-    echo "Can not access '$name': permission denied"
+done
+
+if [ -z "$cgroup_path" ]; then
+    echo "no cgroup mount point found"
     exit 1
 fi
 
-if [ ! -f $lxcpath/$name/init ]; then
-    exit 0
+pid=$(head -1 $cgroup_path/$name/tasks)
+
+if [ -z "$pid" ]; then
+    echo "no process found for '$name'"
+    exit 1
 fi
 
-initpid=$(cat $lxcpath/$name/init) && \
-    mount --bind /proc/$initpid/net /proc/$$/net && \
+mount --bind /proc/$pid/net /proc/$$/net && \
     exec netstat $*