vshost-util-vserver

Build script and sources for util-vserver.
git clone https://ccx.te2000.cz/git/vshost-util-vserver
Log | Files | Refs

vps.pathsubst (2831B)


      1 #!/usr/bin/perl
      2 
      3 # Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
      4 # based on vps by Krischan Jodies
      5 #
      6 # This program is free software; you can redistribute it and/or modify
      7 # it under the terms of the GNU General Public License as published by
      8 # the Free Software Foundation; either version 2, or (at your option)
      9 # any later version.
     10 #
     11 # This program is distributed in the hope that it will be useful,
     12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 # GNU General Public License for more details.
     15 #
     16 # You should have received a copy of the GNU General Public License
     17 # along with this program; if not, write to the Free Software
     18 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     19 
     20 # Wrapper for ps. Adds security context number and name
     21 # to the PID column.
     22 #
     23 # (c) 2002 krischan.jodies@sernet.de
     24 # version 1.0
     25 
     26 # 1.1        Added error messages
     27 
     28 if ($ARGV[0] eq "--help") {
     29    exec("ps @ARGV");
     30    exit;
     31 } 
     32 
     33 
     34 $lockdir = "/var/run/vservers";
     35 
     36 $pid_length = 5;
     37 get_server_names();
     38 $context=get_context("self");
     39 
     40 if ($context == -1) {
     41    print "Can not find my security context. Is this a ctx kernel?\n";
     42    exit;
     43 }
     44 if ($context != 1) {
     45    exec("@PKGLIBEXECDIR@/chcontext-compat --silent --ctx 1 $0 @ARGV");
     46    print "Can not execute chcontext\n";
     47    exit; # not reached
     48 } 
     49 
     50 
     51 if (! open PS, "ps @ARGV|") {
     52    print "Can not execute ps\n";
     53    exit;
     54 }
     55 while (<PS>) {
     56   chomp;
     57   push @ps,$_;
     58 }
     59 
     60 $header = shift @ps;
     61 $header =~ /(.*)  PID(.+)/;
     62 $left = $1;
     63 $right = $2;
     64 $left_length  = length($left);
     65 print "${left}  PID CONTEXT       ${right}\n";
     66 foreach $line (@ps) {
     67    $pid =  substr $line,$left_length,$pid_length;
     68    print   substr $line,0,$left_length;
     69    print "$pid";
     70    $context = get_context($pid);
     71    $context_name = getcontextname($context);
     72    printf " %-3s %-10s",$context,$context_name;
     73    print   substr $line,$left_length + $pid_length;
     74    print "\n";
     75    
     76 }
     77 
     78 exit;
     79 
     80 sub get_context
     81 {
     82    my $pid = $_[0];
     83    $pid =~ s/ //g;
     84    open STATUS, "/proc/$pid/status";
     85    while (<STATUS>)
     86    {
     87       chomp;
     88       if (/s_context: (\d+)/) {
     89          close STATUS;   
     90          return $1;
     91       }
     92    }
     93    close STATUS;
     94    return -1;
     95 }
     96 
     97 sub getcontextname {
     98    if (exists $name{$_[0]}) {
     99       return $name{$_[0]};
    100    }
    101    if    ($_[0] == 1) {
    102       return "ALL_PROCS";
    103    }
    104    elsif ($_[0] == 0) {
    105       return "MAIN";
    106    }
    107    return "UNKNOWN";
    108 }
    109 
    110 
    111 sub get_server_names 
    112 {
    113     opendir LOCKDIR, "$lockdir";
    114     while ($file=readdir(LOCKDIR)) {
    115        if (-f "$lockdir/$file") {
    116           open FILE, "$lockdir/$file";
    117           $file =~ s/(.+)\.ctx/$1/;
    118           while (<FILE>) {
    119              if (/S_CONTEXT=(\d+)/) {
    120                 $name{$1} = $file;
    121              }
    122           }
    123        }
    124     }
    125 }