summaryrefslogtreecommitdiff
path: root/torrus/bin/nodeid.in
diff options
context:
space:
mode:
Diffstat (limited to 'torrus/bin/nodeid.in')
-rw-r--r--torrus/bin/nodeid.in252
1 files changed, 252 insertions, 0 deletions
diff --git a/torrus/bin/nodeid.in b/torrus/bin/nodeid.in
new file mode 100644
index 000000000..b362a955b
--- /dev/null
+++ b/torrus/bin/nodeid.in
@@ -0,0 +1,252 @@
+#!@PERL@ -w
+# Copyright (C) 2010 Stanislav Sinyagin
+#
+# 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 of the License, 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.
+
+# $Id: nodeid.in,v 1.1 2010-12-27 00:04:03 ivan Exp $
+# Stanislav Sinyagin <ssinyagin@yahoo.com>
+
+BEGIN { require '@torrus_config_pl@'; }
+
+use strict;
+use Getopt::Long;
+use JSON;
+use File::Copy;
+
+use Torrus::ConfigTree;
+use Torrus::SiteConfig;
+use Torrus::Renderer;
+use Torrus::Log;
+
+exit(1) if not Torrus::SiteConfig::verify();
+
+
+my %commands =
+ ('info' => \&do_info,
+ 'search' => \&do_search,
+ 'render' => \&do_render);
+
+
+
+my $tree;
+my $cmd;
+
+my $nodeid;
+my $print_details;
+my $search_prefix;
+my $search_substring;
+my $render_view;
+my $render_out;
+
+
+my $help_needed;
+
+
+my $ok = GetOptions('tree=s' => \$tree,
+ 'cmd=s' => \$cmd,
+ 'nodeid=s' => \$nodeid,
+ 'details' => \$print_details,
+ 'prefix=s' => \$search_prefix,
+ 'substring=s' => \$search_substring,
+ 'view=s' => \$render_view,
+ 'out=s' => \$render_out,
+ 'help' => \$help_needed);
+
+if( not $ok or
+ not $tree or not $cmd or not $commands{$cmd} or
+ ( ($cmd eq 'info' or $cmd eq 'render') and not $nodeid ) or
+ ( $cmd eq 'search' and not ($search_prefix or $search_substring) ) or
+ $help_needed or scalar(@ARGV) > 0 )
+{
+ print STDERR "Usage: $0 --tree=NAME --cmd=CMD [options...]\n",
+ "Options:\n",
+ " --tree=NAME tree name\n",
+ " --cmd=CMD Command (info|search|render)\n",
+ " --nodeid=NODEID nodeid (mandatory for info and render)\n",
+ " --details print nodeid details (valid with info and search)\n",
+ " --prefix=STR search prefix\n",
+ " --substring=STR search substring\n",
+ " --view=VIEW render view (optional)\n",
+ " --out=FILE render output\n",
+ " --help this help message\n";
+ exit 1;
+}
+
+
+if( not Torrus::SiteConfig::treeExists( $tree ) )
+{
+ Error('Tree ' . $tree . ' does not exist');
+ exit 1;
+}
+
+
+&Torrus::DB::setSafeSignalHandlers();
+
+{
+ my $config_tree = new Torrus::ConfigTree( -TreeName => $tree );
+ if( not defined($config_tree) )
+ {
+ Error("Configuration is not ready");
+ exit 1;
+ }
+
+ if( $cmd eq 'info' or $cmd eq 'render' )
+ {
+ my $token = $config_tree->getNodeByNodeid($nodeid);
+ if( not defined( $token ) )
+ {
+ Error('nodeid not found: ' . $nodeid);
+ exit(1);
+ }
+
+ if( $cmd eq 'info' )
+ {
+ print_nodeid($config_tree, [$token], $print_details);
+ }
+ else
+ {
+ render_node($config_tree, $token, $render_view, $render_out);
+ }
+ }
+ elsif( $cmd eq 'search' )
+ {
+ my $results;
+ if( defined($search_prefix) )
+ {
+ $results = $config_tree->searchNodeidPrefix($search_prefix);
+ }
+ else
+ {
+ $results = $config_tree->searchNodeidSubstring($search_substring);
+ }
+
+ if( defined( $results ) and scalar(@{$results}) > 0 )
+ {
+ my $tokens = [];
+ # results are pairs [nodeid,token]
+ foreach my $res ( @{$results} )
+ {
+ push(@{$tokens}, $res->[1]);
+ }
+ print_nodeid($config_tree, $tokens, $print_details);
+ }
+ else
+ {
+ print STDERR "Nothing found\n";
+ exit(1);
+ }
+ }
+ else
+ {
+ printf STDERR ("Unknown command: %s\n", $cmd);
+ exit(1);
+ }
+}
+
+exit(0);
+
+
+sub print_nodeid
+{
+ my $config_tree = shift;
+ my $tokens = shift;
+ my $details = shift;
+
+ my $json = new JSON;
+ $json->pretty();
+ $json->canonical();
+
+ my @all;
+
+ foreach my $token ( @{$tokens} )
+ {
+ my $info = {
+ 'nodeid' => $config_tree->getNodeParam($token, 'nodeid', 1),
+ };
+
+ if( $details )
+ {
+ $info->{'path'} = $config_tree->path($token);
+ $info->{'is_leaf'} = $config_tree->isLeaf($token) ? 1:0;
+ $info->{'tree'} = $config_tree->treeName();
+ if( $info->{'is_leaf'} )
+ {
+ my $dsType = $config_tree->getNodeParam( $token, 'ds-type' );
+ $info->{'param:ds-type'} = $dsType;
+ if( $dsType eq 'collector' )
+ {
+ foreach my $param
+ ('collector-type', 'collector-period',
+ 'storage-type', 'data-file', 'data-dir', 'rrd-ds',
+ 'ext-service-id',
+ 'snmp-host', 'domain-name', 'snmp-object')
+ {
+ my $val = $config_tree->getNodeParam($token, $param);
+
+ if( defined( $val ) )
+ {
+ $info->{'param:' . $param} = $val;
+ }
+ }
+ }
+ }
+ }
+
+ push(@all, $info);
+ }
+
+ print $json->encode(\@all);
+}
+
+
+
+sub render_node
+{
+ my $config_tree = shift;
+ my $token = shift;
+ my $view = shift;
+ my $out = shift;
+
+ my $r = new Torrus::Renderer;
+
+ my($fname, $mimetype) = $r->render($config_tree, $token, $view);
+
+ if( defined($out) )
+ {
+ if( not copy( $fname, $out ) )
+ {
+ printf STDERR ("Failed to write to %s: %s\n", $out, $!);
+ exit(1);
+ }
+
+ $fname = $out;
+ }
+
+ my $json = new JSON;
+ $json->pretty();
+
+ print $json->encode({'Content-type' => $mimetype,
+ 'Filename' => $fname});
+}
+
+
+
+
+
+# Local Variables:
+# mode: perl
+# indent-tabs-mode: nil
+# perl-indent-level: 4
+# End: