X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=contrib%2Fcollection3%2Fbin%2Findex.cgi;h=4723af964e9ecf7f6ae5a965b00855748a8adcfc;hb=82e27678f8972d2625b466e7e7ba9daaa6395c98;hp=ba5b48a0937b8c42bd2557142fbe33565ab156c8;hpb=d37ebe6eb6dd2bbf8213a924dfbce6e91945aab8;p=collectd.git diff --git a/contrib/collection3/bin/index.cgi b/contrib/collection3/bin/index.cgi index ba5b48a0..4723af96 100755 --- a/contrib/collection3/bin/index.cgi +++ b/contrib/collection3/bin/index.cgi @@ -1,6 +1,7 @@ #!/usr/bin/perl -# Copyright (C) 2008 Florian octo Forster +# Copyright (C) 2008-2011 Florian Forster +# Copyright (C) 2011 noris network AG # # 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 @@ -14,14 +15,28 @@ # 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Authors: +# Florian "octo" Forster use strict; use warnings; -use lib ('../lib'); use utf8; +use vars (qw($BASE_DIR)); + +BEGIN +{ + if (defined $ENV{'SCRIPT_FILENAME'}) + { + if ($ENV{'SCRIPT_FILENAME'} =~ m{^(/.+)/bin/[^/]+$}) + { + $::BASE_DIR = $1; + unshift (@::INC, "$::BASE_DIR/lib"); + } + } +} use Carp (qw(cluck confess)); -use FindBin ('$RealBin'); use CGI (':cgi'); use CGI::Carp ('fatalsToBrowser'); use HTML::Entities ('encode_entities'); @@ -35,8 +50,6 @@ use Collectd::Graph::Common (qw(get_files_from_directory get_all_hosts get_plugin_selection flush_files)); use Collectd::Graph::Type (); -our $Debug = param ('debug') ? 1 : 0; - our $TimeSpans = { Hour => 3600, @@ -46,23 +59,90 @@ our $TimeSpans = Year => 366 * 86400 }; -my $action = param ('action') || 'list_hosts'; -our %Actions = +my %Actions = ( list_hosts => \&action_list_hosts, show_selection => \&action_show_selection ); -if (!exists ($Actions{$action})) +sub base_dir +{ + if (defined $::BASE_DIR) + { + return ($::BASE_DIR); + } + + if (!defined ($ENV{'SCRIPT_FILENAME'})) + { + return; + } + + if ($ENV{'SCRIPT_FILENAME'} =~ m{^(/.+)/bin/[^/]+$}) + { + $::BASE_DIR = $1; + return ($::BASE_DIR); + } + + return; +} + +sub lib_dir { - print STDERR "No such action: $action\n"; - exit 1; + my $base = base_dir (); + + if ($base) + { + return "$base/lib"; + } + else + { + return "../lib"; + } } -gc_read_config ("$RealBin/../etc/collection.conf"); +sub sysconf_dir +{ + my $base = base_dir (); -$Actions{$action}->(); -exit (0); + if ($base) + { + return "$base/etc"; + } + else + { + return "../etc"; + } +} + +sub init +{ + my $lib_dir = lib_dir (); + my $sysconf_dir = sysconf_dir (); + + if (!grep { $lib_dir eq $_ } (@::INC)) + { + unshift (@::INC, $lib_dir); + } + + gc_read_config ("$sysconf_dir/collection.conf"); +} + +sub main +{ + my $Debug = param ('debug') ? 1 : 0; + my $action = param ('action') || 'list_hosts'; + + if (!exists ($Actions{$action})) + { + print STDERR "No such action: $action\n"; + return (1); + } + + init (); + + $Actions{$action}->(); + return (1); +} # sub main sub can_handle_xhtml { @@ -104,7 +184,7 @@ sub can_handle_xhtml } } # can_handle_xhtml -{my $html_started; +my $html_started; sub start_html { return if ($html_started); @@ -119,9 +199,8 @@ sub start_html if (can_handle_xhtml ()) { + print header (-Content_Type => 'application/xhtml+xml; charset=UTF-8'); print < @@ -133,9 +212,8 @@ HTML } else { + print header (-Content_Type => 'text/html; charset=UTF-8'); print < @@ -151,7 +229,7 @@ HTML HTML $html_started = 1; -}} +} sub end_html { @@ -159,6 +237,29 @@ sub end_html HTML + $html_started = 0; +} + +sub contains_invalid_chars +{ + my $str = shift; + + for (split (m//, $str)) + { + my $n = ord ($_); + + # Whitespace is allowed. + if (($n >= 9) && ($n <= 13)) + { + next; + } + elsif ($n < 32) + { + return (1); + } + } + + return; } sub show_selector @@ -175,6 +276,7 @@ sub show_selector HTML for (sort (keys %$host_selection)) { + next if contains_invalid_chars ($_); my $host = encode_entities ($_); my $selected = $host_selection->{$_} ? ' selected="selected"' @@ -187,6 +289,7 @@ HTML HTML for (sort (keys %$plugin_selection)) { + next if contains_invalid_chars ($_); my $plugin = encode_entities ($_); my $selected = $plugin_selection->{$_} ? ' selected="selected"' @@ -199,6 +302,7 @@ HTML HTML for (sort { $TimeSpans->{$a} <=> $TimeSpans->{$b} } (keys (%$TimeSpans))) { + next if contains_invalid_chars ($_); my $name = encode_entities ($_); my $value = $TimeSpans->{$_}; my $selected = ($value == $timespan_selection) @@ -225,6 +329,7 @@ sub action_list_hosts for (sort @hosts) { my $url = encode_entities (script_name () . "?action=show_selection;hostname=$_"); + next if contains_invalid_chars ($_); my $name = encode_entities ($_); print qq#
  • $name
  • \n#; } @@ -282,7 +387,7 @@ sub action_show_selection $all_files = get_selected_files (); $timespan = get_timespan_selection (); - if ($Debug) + if (param ('debug')) { print "
    ", Data::Dumper->Dump ([$all_files], ['all_files']), "
    \n"; } @@ -299,15 +404,15 @@ sub action_show_selection my $file = $_; my $type = ucfirst (lc ($file->{'type'})); - $type =~ s/[^A-Za-z_]//g; - $type =~ s/_([A-Za-z])/\U$1\E/g; + $type =~ s/[^A-Za-z0-9_]//g; + $type =~ s/_([A-Za-z0-9])/\U$1\E/g; if (!defined ($types->{$type})) { $types->{$type} = tl_load_type ($file->{'type'}); if (!$types->{$type}) { - cluck ("tl_load_type (" . $file->{'type'} . ") failed"); + warn ("tl_load_type (" . $file->{'type'} . ") failed"); next; } } @@ -320,6 +425,12 @@ sub action_show_selection for (sort (keys %$types)) { my $type = $_; + + if (!defined ($types->{$type})) + { + next; + } + my $graphs_num = $types->{$type}->getGraphsNum (); for (my $i = 0; $i < $graphs_num; $i++) @@ -374,6 +485,8 @@ EOF end_html (); } +main (); + =head1 SEE ALSO L