You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
collectd/debian/bin/check_plugins.pl

159 lines
3.6 KiB

#! /usr/bin/perl --
#
# collectd - check_plugins.pl
# Copyright (C) 2006, 2007 Sebastian Harl
#
# 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; only version 2 of the License is applicable.
#
# 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.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# Author:
# Sebastian Harl <sh at tokkee.org>
# This script checks each plugin and reports the address of each plugin's
# registered functions. It uses src/.libs/*.so for its checks. This can be
# used to check what kind of operations each plugin supports after it has been
# built.
use strict;
use warnings;
my $srcdir = 'src/';
my $libdir = 'src/.libs';
my $plugins = {};
my ($srcs, $libs) = (undef, undef);
if (! opendir($srcs, $srcdir)) {
print STDERR "Could not open directory '$srcdir': $!\n"
. "Make sure you are in the toplevel source directory.\n";
exit 1;
}
while (my $dirent = readdir($srcs)) {
if ($dirent !~ m/^(.*)\.c$/) {
next;
}
my $name = $1;
my $src = undef;
if (! open($src, "<", "$srcdir/$dirent")) {
print STDERR "Unable to open '$srcdir/$dirent': $!\n";
next;
}
while (my $line = <$src>) {
if ($line =~ m/plugin_register_(\w+)\s*\("([^"]+)",\s*(\w+)/) {
my ($t, $n, $f) = ($1, $2, $3);
$plugins->{$name}->{$n}->{$t} = $f;
}
}
close($src);
} # while (my $dirent = readdir($srcs))
closedir($srcs);
if (! opendir($libs, $libdir)) {
print STDERR "Could not open directory '$libdir': $!\n"
. "Make sure you ran 'make'.\n";
exit 1;
}
while (my $dirent = readdir($libs)) {
if ($dirent !~ m/^(.*)\.so$/) {
next;
}
my $name = $1;
my $nm = undef;
if (! defined $plugins->{$name}) {
print STDERR "No information available for plugin '$name'!\n";
next;
}
if (! open($nm, "-|", "nm $libdir/$dirent")) {
print STDERR "Unable to open pipe from nm(1): $!\n";
next;
}
while (my $line = <$nm>) {
if ($line !~ m/^([0-9a-fA-F]{8,}) [tT] (\w+)$/) {
next;
}
my $adr = $1;
my $sym = $2;
for my $n (keys %{$plugins->{$name}}) {
for my $t (keys %{$plugins->{$name}->{$n}}) {
if (defined $plugins->{$name}->{$n}->{$t}
&& ($sym eq $plugins->{$name}->{$n}->{$t})) {
$plugins->{$name}->{$n}->{$t} = "0x" . $adr;
}
}
}
}
close($nm);
} # while (my $dirent = readdir($libs))
closedir($libs);
print 'plugin name config init read write log shutdown';
print $/ . '-' x 70 . $/;
for my $name (sort keys %$plugins) {
if (! -f "$libdir/$name.so") {
print "$name.c has not been compiled.\n";
next;
}
for my $n (sort keys %{$plugins->{$name}}) {
dump_plugin_data($n, $plugins->{$name}->{$n});
}
}
exit 0;
sub dump_plugin_data {
my $name = shift || return;
my $funcs = shift || return;
if (length($name) > 15) {
$name = substr($name, 0, 12) . '...';
}
printf '%-15s ', $name;
foreach my $t ("config", "init", "read", "write", "log", "shutdown") {
if (! defined $funcs->{$t}) {
print '- ';
}
elsif ($funcs->{$t} =~ m/^0x[A-Fa-f0-9]{8,}$/) {
print substr($funcs->{$t}, -8, 8) . " ";
}
else {
print 'nA ';
}
}
print $/;
return 1;
} # sub dump_plugin_data
# vim: set sw=4 ts=4 tw=78 noexpandtab :