xcat-core/xCAT-client/bin/wcons
jbjohnso 39d6a2e0d4 start fixing wcons
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@15954 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
2013-04-11 18:01:37 +00:00

169 lines
5.4 KiB
Perl
Executable File

#!/usr/bin/env perl
#A placeholder wcons, a fuller port from 1.3 is needed
use Getopt::Long qw(:config getopt_compat pass_through);
use File::Basename;
BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr'; }
use lib "$::XCATROOT/lib/perl";
use xCAT::Client;
#use Data::Dumper;
use strict;
unless ($ENV{DISPLAY}) {
print '$DISPLAY not set';
exit 1;
}
my $mydir = dirname($0);
my $sb;
my $tilefact;
my $xrm="-xrm xterm.mainMenu.*.font:fixed -xrm xterm.vtMenu.*.font:fixed -xrm xterm.fontMenu.*.font:fixed -xrm xterm -xrm xterm.vt100.font6:grvga.737";
my $font = "5x7";
GetOptions(
#'sb' => \$sb,
'tile|t:i' => \$tilefact,
#'font|f=s' => \$font
);
my $noderange = $ARGV[$#ARGV];
my %noderangeref = (command => 'noderange', noderange => $noderange);
my %conserverref = (command => 'nodels', noderange => $noderange, arg => ['nodehm.conserver']);
unless ($ARGV[$#ARGV]) {
print "Usage: wcons <options> <noderange>\n";
exit 1;
}
my $nodes=`nodels $ARGV[$#ARGV]`;
unless ($nodes) {
exit 1;
}
my $conservers=`nodels $ARGV[$#ARGV] nodehm.conserver`;
pop @ARGV;
my @conservers=split /\n/,$conservers;
my %conservers;
foreach (@conservers) {
(my $nd,my $col,my $val) = split /:/,$_,3;
$conservers{$nd}=$val;
}
my @nodes = split /\n/,$nodes;
foreach (@nodes) {
if ($conservers{$_}) {
next;
}
if ($ENV{XCATHOST}) {
$conservers{$_} = $ENV{XCATHOST};
$conservers{$_} =~ s/:.*//;
next;
}
$conservers{$_} = 'localhost';
}
my $firstnode = shift @nodes;
unless ($firstnode) {
exit 1;
}
my $currx;
my $curry;
my $wmxo;
my $wmyo;
my $currx;
my $screenwidth;
my $screenheight;
my $window_width;
my $window_height;
my $panel_pad=0;
my $top_pad;
if (defined($tilefact)) {
my $rootinf = `xwininfo -root`;
foreach (split /\n/,$rootinf) {
if (/.*Width:\s+([0-9]*).*/) {
$screenwidth=$1;
} elsif (/.*Height:\s+([0-9]*).*/) {
$screenheight=$1;
}
}
$rootinf = `xwininfo -name "Top Panel"`;
foreach (split /\n/,$rootinf) {
if (/-geometry\s+([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)/) {
if ($1 > 640 and $2 < 480 and $3 == 0 and $4 == 0) {
$panel_pad=$2;
}
}
}
if ($panel_pad == 0) {
$rootinf = `xwininfo -name "Top Expanded Edge Panel"`;
foreach (split /\n/,$rootinf) {
if (/-geometry\s+([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)/) {
if ($1 > 640 and $2 < 480 and $3 == 0 and $4 == 0) {
$panel_pad=$2;
}
}
}
}
system("xterm $xrm -bg black -fg white -title $firstnode -n $firstnode -geometry +0+0 ".join(" ",@ARGV)." -e /bin/bash -c \"$mydir/xtcd.pl ".$ENV{DISPLAY}." $firstnode $firstnode & let SDATE=`date +%s`+5; $mydir/rcons $firstnode ".$conservers{$firstnode}."; if [ \\\$SDATE -gt \\`date +%s\\` ]; then echo Press enter to close; read SDATE; fi \" &");
sleep(2); #Give time for window manager to figure out everything
my $xinfo = `xwininfo -name $firstnode`;
my @xinfl = split(/\n/,$xinfo);
my $side_pad;
my $wmxo;
my $wmyo;
foreach (@xinfl) {
if (/.*Absolute upper-left X:\s*([0-9]*).*/) {
$side_pad = $1;
} elsif (/.*Absolute upper-left Y:\s*([0-9]*).*/) {
$top_pad = $1-$panel_pad;
} elsif (/.*Width:\s*([0-9]*).*/) {
$window_width = $1;
} elsif (/.*Height:\s*([0-9]*).*/) {
$window_height = $1;
} elsif (/.*-gemotery \d+x\d+\+(\d+)(\d+)/) {
$wmxo=$1;
$wmyo=$2;
}
}
$window_width += $side_pad*2; #add the side border, assuming symmetric left and right borders
$window_height += $side_pad+$top_pad; #Add the titlebar and bottom border, which is guessed to probably be equal to the sides, doesn't hold true in all cases, i.e. window maker, but it's the currently best approximation
$screenwidth-=$wmxo; #Subtract a factor that 1.3 did, not sure why precisely
$screenheight-=$wmyo;
$currx=$window_width;
$curry=$panel_pad; #+$top_pad;
my $maxcol = int($screenwidth/$window_width);
unless ($tilefact or $tilefact > $maxcol) {
$tilefact=$maxcol;
}
if ($tilefact==1) {
$curry+=$window_height;
$currx=0;
}
} else {
system("xterm $xrm -bg black -fg white -title $firstnode -n $firstnode ".join(" ",@ARGV)." -e /bin/bash -c \"$mydir/xtcd.pl ".$ENV{DISPLAY}." $firstnode $firstnode & let SDATE=`date +%s`+5; $mydir/rcons $firstnode ".$conservers{$firstnode}."; if [ \\\$SDATE -gt \\`date +%s\\` ]; then echo Press enter to close; read SDATE; fi\" &");
}
my $geometry="";
foreach (@nodes) {
if ($tilefact) {
my $corrected_x=$currx+$wmxo;
my $corrected_y=$curry+$wmyo;
$geometry="-geometry +$corrected_x+$corrected_y";
$currx+=$window_width;
if ($currx >= ($tilefact * $window_width)) {
$currx=0;
$curry+=$window_height;
if (($curry+$window_height) > $screenheight) {
$curry = $panel_pad; #+$top_pad;
}
}
}
system("xterm $xrm -bg black -fg white ".join(" ",@ARGV)." -title $_ -n $_ $geometry -e /bin/bash -c \"$mydir/xtcd.pl .".$ENV{DISPLAY}." $_ $_ & let SDATE=`date +%s`+5; $mydir/rcons $_ ".$conservers{$_}."; if [ \\\$SDATE -gt \\`date +%s\\` ]; then echo Press enter to close; read SDATE; fi\" &");
}
#print Dumper(\@ARGV);
#MYDIR=`dirname $0`
#for n in $NODES
#do
# xterm -bg black -fg white ".join(" ",@ARGV)." -T $n -n $n -e $MYDIR/rcons $n &
#done