159 lines
5.0 KiB
Perl
159 lines
5.0 KiB
Perl
|
#!/usr/bin/perl
|
||
|
|
||
|
use JMX::Jmx4Perl;
|
||
|
use strict;
|
||
|
use Data::Dumper;
|
||
|
use Getopt::Std;
|
||
|
|
||
|
my %opts;
|
||
|
getopts('s',\%opts);
|
||
|
|
||
|
|
||
|
my $url = $ARGV[0] || die "No url given\n";
|
||
|
|
||
|
my $jmx = JMX::Jmx4Perl->new(url => $url,verbose => 0);
|
||
|
|
||
|
my $MODULE_HANDLER = init_handler($jmx);
|
||
|
my %VISITED = ();
|
||
|
|
||
|
my $product = $jmx->product;
|
||
|
print "Product: ",$product->name," ",$product->version,"\n";
|
||
|
print "JSR77 : ",$product->jsr77 ? "Yes" : "No","\n\n";
|
||
|
|
||
|
my $domains = $jmx->search("*:j2eeType=J2EEDomain,*");
|
||
|
$domains = [ "(none)" ] unless $domains;
|
||
|
# Special fix for geronimo which seems to have a problem with properly spelling
|
||
|
# the domain name
|
||
|
#push @$domains,"Geronimo:j2eeType=J2EEDomain,name=Geronimo" if grep { /^geronimo:/ } @$domains;
|
||
|
for my $d (@{$domains || []}) {
|
||
|
my $dn = $d eq "(none)" ? "*" : _print(1,$d,"Domain");
|
||
|
my $servers = $jmx->search("$dn:j2eeType=J2EEServer,*");
|
||
|
if (!$servers && $d eq "(none)") {
|
||
|
# That's probably not a real jsr77 container
|
||
|
# We are looking up all J2EEObject on our own without server and domain
|
||
|
my $objects = [ grep { /j2eeType/ } @{$jmx->search("*:*")} ];
|
||
|
print_modules(1,$objects);
|
||
|
} elsif (!$servers) {
|
||
|
print " == No servers defined for domain $dn ==\n";
|
||
|
} else {
|
||
|
for my $s (@{$servers || []}) {
|
||
|
my $sn = _print(2,$s,"Server");
|
||
|
for my $o (qw(deployedObjects resources javaVMs)) {
|
||
|
my $objects = $jmx->get_attribute($s,$o);
|
||
|
print_modules(3,$objects);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
print "\n";
|
||
|
}
|
||
|
|
||
|
# Special JBoss handling, since it seems than deployed WARs (WebModules)
|
||
|
# don't appear below a server but stand on their own (despite the rules
|
||
|
# layed out in JSR77)
|
||
|
if ($product->id eq "jboss" || $product->id eq "weblogic") {
|
||
|
my $web_modules = $jmx->search("*:j2eeType=WebModule,*");
|
||
|
if ($web_modules) {
|
||
|
print "\n=============================================\nJBoss WebModules:\n";
|
||
|
my $new = [ grep { !$VISITED{$_} } @$web_modules ];
|
||
|
print_modules(1,$new);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sub init_handler {
|
||
|
my $jmx = shift;
|
||
|
return {
|
||
|
"J2EEApplication" => "modules",
|
||
|
"AppClientModule" => 0,
|
||
|
"ResourceAdapterModule" => "resourceAdapters",
|
||
|
"WebModule" => "servlets",
|
||
|
"Servlet" => 0,
|
||
|
"EJBModule" => "ejbs",
|
||
|
"MessageDrivenBean" => 0,
|
||
|
"EntityBean" => 0,
|
||
|
"StatelessSessionBean" => 0,
|
||
|
"StatefulSessionBean" => 0,
|
||
|
"JCAResource" => "connectionFactories",
|
||
|
"JCAConnectionFactory" => "managedConnectionFactory",
|
||
|
"JCAManagedConnectionFactory" => 0,
|
||
|
"JavaMailResource" => 0,
|
||
|
"JDBCResource" => "jdbcDataSources",
|
||
|
"JDBCDataSource" => "jdbcDriver",
|
||
|
"JDBCDriver" => 0,
|
||
|
"JMSResource" => 0,
|
||
|
"JNDIResource" => 0,
|
||
|
"JTAResource" => 0,
|
||
|
"RMI_IIOPResource" => 0,
|
||
|
"URLResource" => 0,
|
||
|
"JVM" => sub {
|
||
|
my ($l,$mod) = @_;
|
||
|
print " ",
|
||
|
join(", ",map { $jmx->get_attribute($mod,$_) } qw(javaVendor javaVersion node)),"\n";
|
||
|
},
|
||
|
# JBoss specific:
|
||
|
"ServiceModule" => 0,
|
||
|
"MBean" => 0
|
||
|
};
|
||
|
}
|
||
|
|
||
|
sub print_modules {
|
||
|
my ($l,$objects) = @_;
|
||
|
for my $k (sort keys %$MODULE_HANDLER) {
|
||
|
my @mods = grep { $_ =~ /j2eeType=$k/ } @$objects;
|
||
|
if (@mods) {
|
||
|
my $handler = $MODULE_HANDLER->{$k};
|
||
|
for my $mod (@mods) {
|
||
|
_print($l,$mod);
|
||
|
if (ref($handler) eq "CODE") {
|
||
|
$handler->($l,$mod);
|
||
|
} elsif ($handler && !ref($handler)) {
|
||
|
my $modules = $jmx->get_attribute($mod,$handler);
|
||
|
if ($modules) {
|
||
|
$modules = ref($modules) eq "ARRAY" ? $modules : [ $modules ];
|
||
|
# Fix for Jonas 4.1.2 with jetty, which includes the
|
||
|
# WebModule itself in the list of contained Servlets
|
||
|
$modules = [ grep { $_ !~ /j2eeType=$k/} @$modules ];
|
||
|
print_modules($l+1,$modules) if scalar(@$modules);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
sub _print {
|
||
|
my ($i,$s,$t) = @_;
|
||
|
$VISITED{$s} = $s;
|
||
|
my $n = extract_name($s);
|
||
|
unless ($t) {
|
||
|
$t = $1 if $s =~ /j2eeType=(\w+)/;
|
||
|
}
|
||
|
my $can_stat = check_for_statistics($s);
|
||
|
print " " x $i,$t,": ",$n,($can_stat ? " [S] " : ""),"\n";
|
||
|
print " " x $i," " x length($t)," ",$s,"\n";
|
||
|
if ($opts{s} && $can_stat) {
|
||
|
eval {
|
||
|
my $ret = $jmx->get_attribute($s,"stats");
|
||
|
print Dumper($ret);
|
||
|
};
|
||
|
}
|
||
|
return $n;
|
||
|
}
|
||
|
|
||
|
sub check_for_statistics {
|
||
|
my $mbean = shift;
|
||
|
my $ret;
|
||
|
eval {
|
||
|
$ret = $jmx->get_attribute($mbean,"statisticsProvider");
|
||
|
};
|
||
|
return $@ ? undef : lc($ret) eq "true";
|
||
|
}
|
||
|
|
||
|
sub extract_name {
|
||
|
my $s = shift;
|
||
|
$s =~ /.*:.*name=([^,]+)/;
|
||
|
return $1;
|
||
|
}
|