collection3: fix multiple hosts selection issue
[collectd.git] / contrib / collection3 / lib / Collectd / Graph / Common.pm
index 6f26fd8..c6e2508 100644 (file)
@@ -5,9 +5,11 @@ use warnings;
 
 use vars (qw($ColorCanvas $ColorFullBlue $ColorHalfBlue));
 
+use Collectd::Unixsock ();
 use Carp (qw(confess cluck));
 use CGI (':cgi');
 use Exporter;
+use Collectd::Graph::Config (qw(gc_get_scalar));
 
 $ColorCanvas   = 'FFFFFF';
 $ColorFullBlue = '0000FF';
@@ -34,6 +36,7 @@ $ColorHalfBlue = 'B7B7F7';
   get_timespan_selection
   get_host_selection
   get_plugin_selection
+  get_random_color
   get_faded_color
   sort_idents_by_type_instance
   type_to_module_name
@@ -41,7 +44,7 @@ $ColorHalfBlue = 'B7B7F7';
   flush_files
 ));
 
-our $DataDir = '/var/lib/collectd/rrd';
+our $DefaultDataDir = '/var/lib/collectd/rrd';
 
 return (1);
 
@@ -103,7 +106,9 @@ sub group_files_by_plugin_instance
   for (my $i = 0; $i < @files; $i++)
   {
     my $file = $files[$i];
-    my $key = $file->{'plugin_instance'} || '';
+    my $key1 = $file->{'hostname'} || '';
+    my $key2 = $file->{'plugin_instance'} || '';
+    my $key = "$key1-$key2";
 
     $data->{$key} ||= [];
     push (@{$data->{$key}}, $file);
@@ -144,6 +149,7 @@ sub filename_to_ident
 sub ident_to_filename
 {
   my $ident = shift;
+  my $data_dir = gc_get_scalar ('DataDir', $DefaultDataDir);
 
   my $ret = '';
 
@@ -153,7 +159,7 @@ sub ident_to_filename
   }
   else
   {
-    $ret .= "$DataDir/";
+    $ret .= "$data_dir/";
   }
 
   if (!$ident->{'hostname'})
@@ -212,6 +218,7 @@ sub get_files_from_directory
   my $recursive = @_ ? shift : 0;
   my $dh;
   my @directories = ();
+  my @files = ();
   my $ret = [];
 
   opendir ($dh, $dir) or die ("opendir ($dir): $!");
@@ -227,15 +234,13 @@ sub get_files_from_directory
     }
     elsif (-f $entry)
     {
-      my $ident = filename_to_ident ($entry);
-      if ($ident)
-      {
-       push (@$ret, $ident);
-      }
+      push (@files, $entry);
     }
   }
   closedir ($dh);
 
+  push (@$ret, map { filename_to_ident ($_) } sort (@files));
+
   if ($recursive > 0)
   {
     for (@directories)
@@ -243,7 +248,7 @@ sub get_files_from_directory
       my $temp = get_files_from_directory ($_, $recursive - 1);
       if ($temp && @$temp)
       {
-       push (@$ret, @$temp);
+        push (@$ret, @$temp);
       }
     }
   }
@@ -255,12 +260,14 @@ sub get_all_hosts
 {
   my $dh;
   my @ret = ();
+  my $data_dir = gc_get_scalar ('DataDir', $DefaultDataDir);
 
-  opendir ($dh, "$DataDir") or confess ("opendir ($DataDir): $!");
+  opendir ($dh, "$data_dir") or confess ("opendir ($data_dir): $!");
   while (my $entry = readdir ($dh))
   {
     next if ($entry =~ m/^\./);
-    next if (!-d "$DataDir/$entry");
+    next if (!-d "$data_dir/$entry");
+    next if (!-r "$data_dir/$entry" or !-x "$data_dir/$entry");
     push (@ret, sanitize_hostname ($entry));
   }
   closedir ($dh);
@@ -284,6 +291,7 @@ sub get_all_plugins
   my @hosts = @_;
   my $ret = {};
   my $dh;
+  my $data_dir = gc_get_scalar ('DataDir', $DefaultDataDir);
 
   if (!@hosts)
   {
@@ -293,14 +301,14 @@ sub get_all_plugins
   for (@hosts)
   {
     my $host = $_;
-    opendir ($dh, "$DataDir/$host") or next;
+    opendir ($dh, "$data_dir/$host") or next;
     while (my $entry = readdir ($dh))
     {
       my $plugin;
       my $plugin_instance = '';
 
       next if ($entry =~ m/^\./);
-      next if (!-d "$DataDir/$host/$entry");
+      next if (!-d "$data_dir/$host/$entry");
 
       if ($entry =~ m#^([^-]+)-(.+)$#)
       {
@@ -336,7 +344,8 @@ sub get_all_plugins
 sub get_files_for_host
 {
   my $host = sanitize_hostname (shift);
-  return (get_files_from_directory ("$DataDir/$host", 2));
+  my $data_dir = gc_get_scalar ('DataDir', $DefaultDataDir);
+  return (get_files_from_directory ("$data_dir/$host", 2));
 } # get_files_for_host
 
 sub _filter_ident
@@ -382,6 +391,7 @@ sub get_files_by_ident
   my $ident = shift;
   my $all_files;
   my @ret = ();
+  my $data_dir = gc_get_scalar ('DataDir', $DefaultDataDir);
 
   #if ($ident->{'hostname'})
   #{
@@ -389,7 +399,7 @@ sub get_files_by_ident
   #}
   #else
   #{
-    $all_files = get_files_from_directory ($DataDir, 3);
+    $all_files = get_files_from_directory ($data_dir, 3);
     #}
 
   @ret = grep { _filter_ident ($ident, $_) == 0 } (@$all_files);
@@ -509,6 +519,26 @@ sub _color_to_string
   return (sprintf ('%02hx%02hx%02hx', map { int (255.0 * $_) } @{$_[0]}));
 } # _color_to_string
 
+sub get_random_color
+{
+  my ($r, $g, $b) = (rand (), rand ());
+  my $min = 0.0;
+  my $max = 1.0;
+
+  if (($r + $g) < 1.0)
+  {
+    $min = 1.0 - ($r + $g);
+  }
+  else
+  {
+    $max = 2.0 - ($r + $g);
+  }
+
+  $b = $min + (rand () * ($max - $min));
+
+  return (_color_to_string ([$r, $g, $b]));
+} # get_random_color
+
 sub get_faded_color
 {
   my $fg = shift;