Revision 04a6764e
Added by Hamish Coleman over 16 years ago
- ID 04a6764e32e837bfb2265e0bdfa1b9ff02fa8abd
| indexmrtg.cgi | ||
|---|---|---|
|  | ||
| use FileHandle;
 | ||
|  | ||
| use JSON;
 | ||
|  | ||
| use Data::Dumper;
 | ||
| $Data::Dumper::Indent = 1;
 | ||
| $Data::Dumper::Sortkeys = 1;
 | ||
| ... | ... | |
| $db->{mrtg}{default}{post}{ysize} = 135;
 | ||
|  | ||
| sub config_save_val($$$$) {
 | ||
| 	my ($filename,$target,$var,$val) = @_;
 | ||
| 	my ($filename,$name,$var,$val) = @_;
 | ||
|  | ||
| 	my $this_ysize;
 | ||
| 	my $this_xsize;
 | ||
| ... | ... | |
| 	}
 | ||
|  | ||
| 	# Save any default initializers
 | ||
| 	if ($target eq '_') {
 | ||
| 	if ($name eq '_') {
 | ||
| 		$db->{mrtg}{default}{post}{$var} = $val;
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	if ($target eq '^') {
 | ||
| 	if ($name eq '^') {
 | ||
| 		$db->{mrtg}{default}{pre}{$var} = $val;
 | ||
| 		return;
 | ||
| 	}
 | ||
|  | ||
| 	# Check for target name collision, and uniqueify
 | ||
| 	my $unique_target = $target;
 | ||
| 	# Check for name name collision, and uniqueify
 | ||
| 	my $unique_name = $name;
 | ||
| 	my $unique_id = 1;
 | ||
| 	while (defined $db->{target}->{$unique_target}
 | ||
| 		 && $db->{target}->{$unique_target}->{_cfgfile} ne $filename) {
 | ||
| 		$unique_target = $target . '_' . $unique_id;
 | ||
| 	while (defined $db->{graph}->{$unique_name}
 | ||
| 		 && $db->{graph}->{$unique_name}->{srcfile} ne $filename) {
 | ||
| 		$unique_name = $name . '_' . $unique_id;
 | ||
| 		$unique_id++;
 | ||
| 	}
 | ||
|  | ||
| 	if (!defined $db->{target}->{$unique_target}) {
 | ||
| 		# initialize a new target
 | ||
| 	if (!defined $db->{graph}->{$unique_name}) {
 | ||
| 		# initialize a new name
 | ||
|  | ||
| 		#TODO - instantiate new tests from all of the "_"/"^" defaults
 | ||
|  | ||
| 		push @{$db->{sequence}}, $unique_target;
 | ||
| 		push @{$db->{sequence}}, $unique_name;
 | ||
|  | ||
| 		$db->{target}->{$unique_target}->{_target} = $target;
 | ||
| 		$db->{target}->{$unique_target}->{_cfgfile} = $filename;
 | ||
| 		$db->{target}->{$unique_target}->{_sequence} = @{$db->{sequence}};
 | ||
| 		$db->{graph}->{$unique_name}->{name} = $name;
 | ||
| 		$db->{graph}->{$unique_name}->{srcfile} = $filename;
 | ||
| 		$db->{graph}->{$unique_name}->{sequence} = @{$db->{sequence}};
 | ||
|  | ||
| 		$db->{target}{$unique_target}{xsize} = $db->{mrtg}{default}{post}{xsize};
 | ||
| 		$db->{target}{$unique_target}{ysize} = $db->{mrtg}{default}{post}{ysize};
 | ||
| 		$db->{graph}{$unique_name}{img}{xsize} = $db->{mrtg}{default}{post}{xsize};
 | ||
| 		$db->{graph}{$unique_name}{img}{ysize} = $db->{mrtg}{default}{post}{ysize};
 | ||
|  | ||
| 	}
 | ||
| 	$db->{target}{$unique_target}{mrtg}{$var} = $val;
 | ||
| 	$db->{graph}{$unique_name}{mrtg}{$var} = $val;
 | ||
| }
 | ||
|  | ||
| # Load one or more files
 | ||
| ... | ... | |
| 			# Is this a standard MRTG setting?
 | ||
| 			if ( $_ =~ /^([^#[][^[]+)\[(.*)\]:\s*(.+)$/ ) {
 | ||
| 				my $var=lc $1;
 | ||
| 				my $target=lc $2;
 | ||
| 				my $name=lc $2;
 | ||
| 				my $val=$3;
 | ||
|  | ||
| 				config_save_val($filename,$target,$var,$val);
 | ||
| 				config_save_val($filename,$name,$var,$val);
 | ||
|  | ||
| 			}
 | ||
| 			# TODO - Handle extra statements:
 | ||
| ... | ... | |
| 	}
 | ||
| }
 | ||
|  | ||
| # Itterate through the loaded targets and read their mtime and
 | ||
| # Itterate through the loaded name and read their mtime and
 | ||
| # any other filesystem details for them.
 | ||
| #
 | ||
| sub config_read_filesystem() {
 | ||
| 	# check and update details for all known tests;
 | ||
| 	for my $i (keys %{$db->{target}}) {
 | ||
| 		my $target = $db->{target}->{$i};
 | ||
| 		my $testname = $target->{_target};
 | ||
| 	for my $i (keys %{$db->{graph}}) {
 | ||
| 		my $name = $db->{graph}->{$i};
 | ||
| 		my $testname = $name->{name};
 | ||
|  | ||
| 		# TODO - check workdir and validate it here
 | ||
|  | ||
| 		# Default is GIF, unless a PNG file exists
 | ||
| 		$target->{_imagetype} = 'gif';
 | ||
| 		$name->{mrtg}{_imagetype} = 'gif';
 | ||
| 		if ( -e "$testname-day.png" ) {
 | ||
| 			$target->{_imagetype} = "png";
 | ||
| 			$name->{mrtg}{_imagetype} = "png";
 | ||
| 		}
 | ||
|  | ||
| 		# TODO - change the filename based on the displayed period
 | ||
| 		my $filename = $testname . "-day." . $target->{_imagetype};
 | ||
| 		my $filename = $testname . "-day." . $name->{mrtg}{_imagetype};
 | ||
|  | ||
| 		my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
 | ||
| 			$atime,$mtime,$ctime,$blksize,$blocks)
 | ||
| ... | ... | |
| 			next;
 | ||
| 		}
 | ||
|  | ||
| 		$target->{_mtime} = $mtime;
 | ||
| 		$name->{_mtime} = $mtime;
 | ||
|  | ||
| 		# FIXME - global
 | ||
| 		# find the newest file
 | ||
| ... | ... | |
| 	return ($group,$host,$test);
 | ||
| }
 | ||
|  | ||
| # Read through the list of targets and find common hostname prefixes,
 | ||
| # Read through the list of name and find common hostname prefixes,
 | ||
| # so that we can group these hosts together
 | ||
| # (a hosttype entry)
 | ||
| #
 | ||
| sub maketree_find_hosttypes() {
 | ||
|  | ||
| 	for my $name (keys %{$db->{target}}) {
 | ||
| 	for my $name (keys %{$db->{graph}}) {
 | ||
| 		my ($group,$host,$test) = extract_grouphosttest($name);
 | ||
| 		if (!defined($group)) {
 | ||
| 			next;
 | ||
| ... | ... | |
| 			next;
 | ||
| 		}
 | ||
|  | ||
| 		$db->{target}->{$name}->{_hosttype} = $hosttype;
 | ||
| 		$db->{graph}->{$name}->{_hosttype} = $hosttype;
 | ||
| 		$db->{hosttype}->{$hosttype}->{$host}++;
 | ||
| 	}
 | ||
|  | ||
| ... | ... | |
| 	}
 | ||
|  | ||
| 	# a valid hosttype both:
 | ||
| 	#	defined($db->{target}->{$name}->{hosttype}) &&
 | ||
| 	#	defined($db->{graph}->{$name}->{hosttype}) &&
 | ||
| 	#	defined($db->{hosttype}->{$hosttype})
 | ||
| 	my $hosttype = $db->{target}->{$name}->{_hosttype};
 | ||
| 	my $hosttype = $db->{graph}->{$name}->{_hosttype};
 | ||
| 	if (defined($hosttype) && !defined($db->{hosttype}->{$hosttype})) {
 | ||
| 		$hosttype=undef;
 | ||
| 	}
 | ||
| ... | ... | |
| 	}
 | ||
| }
 | ||
|  | ||
| sub maketree_cfgfile($$) {
 | ||
| sub maketree_srcfile($$) {
 | ||
| 	my ($name,$sequence) = @_;
 | ||
|  | ||
| 	# config files
 | ||
| 	my $cfgfile = $db->{target}->{$name}->{_cfgfile};
 | ||
| 	my $srcfile = $db->{graph}->{$name}->{srcfile};
 | ||
|  | ||
| 	my @cfgpath = split /\//,$cfgfile;
 | ||
| 	my @srcpath = split /\//,$srcfile;
 | ||
|  | ||
| 	shift @cfgpath;	# remove initial slash
 | ||
| 	shift @srcpath;	# remove initial slash
 | ||
|  | ||
| 	unshift @cfgpath,"config";	# ensure that the config node exists
 | ||
| 	unshift @srcpath,"config";	# ensure that the config node exists
 | ||
| 	my $node = $db->{tree};
 | ||
|  | ||
| 	while (@cfgpath ) {
 | ||
| 		if (!defined $node->{$cfgpath[0]}) {
 | ||
| 			$node->{$cfgpath[0]} = {};
 | ||
| 	while (@srcpath ) {
 | ||
| 		if (!defined $node->{$srcpath[0]}) {
 | ||
| 			$node->{$srcpath[0]} = {};
 | ||
| 		}
 | ||
| 		$node = $node->{$cfgpath[0]};
 | ||
| 		shift @cfgpath;
 | ||
| 		$node = $node->{$srcpath[0]};
 | ||
| 		shift @srcpath;
 | ||
| 	}
 | ||
|  | ||
| 	# assign a target name and sequence to the final node
 | ||
| 	# assign a name name and sequence to the final node
 | ||
| 	$node->{$name} = $sequence;
 | ||
| }
 | ||
|  | ||
| # Look through the target database and create tree entries for each cfgfile
 | ||
| # Look through the name database and create tree entries for each cfgfile
 | ||
| #
 | ||
| sub maketree() {
 | ||
| 	maketree_find_hosttypes();
 | ||
|  | ||
| 	for my $name (keys %{$db->{target}}) {
 | ||
| 		my $sequence = $db->{target}->{$name}->{_sequence};
 | ||
| 		maketree_cfgfile($name,$sequence);
 | ||
| 	for my $name (keys %{$db->{graph}}) {
 | ||
| 		my $sequence = $db->{graph}->{$name}->{sequence};
 | ||
| 		maketree_srcfile($name,$sequence);
 | ||
| 		maketree_grouphosttest($name,$sequence);
 | ||
| 		# TODO - parse the Target setting and create trees
 | ||
| 		# TODO - parse magic comments and create trees here
 | ||
| ... | ... | |
| 	print "\n",Dumper(\$db),"\n";
 | ||
| }
 | ||
|  | ||
| print "\n",JSON->new->utf8(1)->pretty(1)->encode($db),"\n";
 | ||
|  | ||
Also available in: Unified diff
output indexmrtg to json, start renaming fields