From 1fe3f3243481d67e0af1e359f0bb77f68afccb3a Mon Sep 17 00:00:00 2001 From: Enrico Scholz Date: Thu, 30 Oct 2003 17:27:57 +0000 Subject: [PATCH] initial check (was: vps) git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@337 94cd875c-1c1d-0410-91d2-eb244daf1a30 --- util-vserver/scripts/vps.pathsubst | 125 +++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100755 util-vserver/scripts/vps.pathsubst diff --git a/util-vserver/scripts/vps.pathsubst b/util-vserver/scripts/vps.pathsubst new file mode 100755 index 0000000..195ede0 --- /dev/null +++ b/util-vserver/scripts/vps.pathsubst @@ -0,0 +1,125 @@ +#!/usr/bin/perl + +# Copyright (C) 2003 Enrico Scholz +# based on vps by Krischan Jodies +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Wrapper for ps. Adds security context number and name +# to the PID column. +# +# (c) 2002 krischan.jodies@sernet.de +# version 1.0 + +# 1.1 Added error messages + +if ($ARGV[0] eq "--help") { + exec("ps @ARGV"); + exit; +} + + +$lockdir = "/var/run/vservers"; + +$pid_length = 5; +get_server_names(); +$context=get_context("self"); + +if ($context == -1) { + print "Can not find my security context. Is this a ctx kernel?\n"; + exit; +} +if ($context != 1) { + exec("@SBINDIR@/chcontext --silent --ctx 1 $0 @ARGV"); + print "Can not execute chcontext\n"; + exit; # not reached +} + + +if (! open PS, "ps $ARGV[0]|") { + print "Can not execute ps\n"; + exit; +} +while () { + chomp; + push @ps,$_; +} + +$header = shift @ps; +$header =~ /(.*) PID(.+)/; +$left = $1; +$right = $2; +$left_length = length($left); +print "${left} PID CONTEXT ${right}\n"; +foreach $line (@ps) { + $pid = substr $line,$left_length,$pid_length; + print substr $line,0,$left_length; + print "$pid"; + $context = get_context($pid); + $context_name = getcontextname($context); + printf " %-3s %-10s",$context,$context_name; + print substr $line,$left_length + $pid_length; + print "\n"; + +} + +exit; + +sub get_context +{ + my $pid = $_[0]; + $pid =~ s/ //g; + open STATUS, "/proc/$pid/status"; + while () + { + chomp; + if (/s_context: (\d+)/) { + close STATUS; + return $1; + } + } + close STATUS; + return -1; +} + +sub getcontextname { + if (exists $name{$_[0]}) { + return $name{$_[0]}; + } + if ($_[0] == 1) { + return "ALL_PROCS"; + } + elsif ($_[0] == 0) { + return "MAIN"; + } + return "UNKNOWN"; +} + + +sub get_server_names +{ + opendir LOCKDIR, "$lockdir"; + while ($file=readdir(LOCKDIR)) { + if (-f "$lockdir/$file") { + open FILE, "$lockdir/$file"; + $file =~ s/(.+)\.ctx/$1/; + while () { + if (/S_CONTEXT=(\d+)/) { + $name{$1} = $file; + } + } + } + } +} -- 1.8.1.5