| | 168 | # Make array of what services |
|---|
| | 169 | my $work_array = []; |
|---|
| | 170 | if (@limit_hosts) { # Limit what to update if needed |
|---|
| | 171 | foreach my $nodename (@limit_hosts) { |
|---|
| | 172 | push @$work_array, map { @{munin_find_field ($_->{$nodename}, "graph_title")} } @{munin_find_field($config, $nodename)}; |
|---|
| | 173 | } |
|---|
| | 174 | } else { # ...else just search for all adresses to update |
|---|
| | 175 | push @$work_array, @{munin_find_field($config, "graph_title")}; |
|---|
| | 176 | } |
|---|
| | 177 | |
|---|
| | 178 | # For timestamping graphs |
|---|
| | 179 | my $timestamp = strftime("%Y-%m-%d T %T", localtime); |
|---|
| | 180 | |
|---|
| | 181 | # Draw service pages |
|---|
| | 182 | for my $service (@$work_array) { |
|---|
| | 183 | |
|---|
| | 184 | next unless munin_get_bool ($service, "graph", 1); |
|---|
| | 185 | |
|---|
| | 186 | my %srv; |
|---|
| | 187 | my $fieldnum = 0; |
|---|
| | 188 | my @graph_info; |
|---|
| | 189 | my @field_info; |
|---|
| | 190 | my @loc = munin_get_node_loc ($service); |
|---|
| | 191 | my $pathnodes = get_path_nodes ($service); |
|---|
| | 192 | my $peers = get_peer_nodes ($service, lc munin_get ($service, "graph_category", "other")); |
|---|
| | 193 | (my $csspath = $pathnodes->[0]->{'link'}) =~ s/index.html$/style.css/; |
|---|
| | 194 | |
|---|
| | 195 | $srv{'node'} = munin_get_node_name ($service); |
|---|
| | 196 | logger("processing service: $srv{node}"); |
|---|
| | 197 | $srv{'service'} = $service; |
|---|
| | 198 | $srv{'label'} = munin_get ($service, "graph_title"); |
|---|
| | 199 | $srv{'category'} = lc( munin_get ($service, "graph_category", "other") ); |
|---|
| | 200 | |
|---|
| | 201 | my $method = munin_get ($service, "graph_strategy", "cron"); |
|---|
| | 202 | |
|---|
| | 203 | $srv{'url'} = "$srv{node}.html"; |
|---|
| | 204 | |
|---|
| | 205 | my $path = join ('/', @loc); |
|---|
| | 206 | |
|---|
| | 207 | if ($method eq "cgi") { |
|---|
| | 208 | $srv{'imgday'} =$config->{'cgiurl_graph'}."/$path-day.png"; |
|---|
| | 209 | $srv{'imgweek'} =$config->{'cgiurl_graph'}."/$path-week.png"; |
|---|
| | 210 | $srv{'imgmonth'}=$config->{'cgiurl_graph'}."/$path-month.png"; |
|---|
| | 211 | $srv{'imgyear'} =$config->{'cgiurl_graph'}."/$path-year.png"; |
|---|
| | 212 | |
|---|
| | 213 | if (munin_get_bool ($service, "graph_sums", 0)) { |
|---|
| | 214 | $srv{'imgweeksum'} = $config->{'cgiurl_graph'}."/$path-week-sum.png"; |
|---|
| | 215 | $srv{'imgyearsum'} = $config->{'cgiurl_graph'}."/$path-year-sum.png"; |
|---|
| | 216 | } |
|---|
| | 217 | } else { |
|---|
| | 218 | # graph strategy cron |
|---|
| | 219 | |
|---|
| | 220 | $srv{'imgday'} ="$srv{node}-day.png"; |
|---|
| | 221 | $srv{'imgweek'} ="$srv{node}-week.png"; |
|---|
| | 222 | $srv{'imgmonth'}="$srv{node}-month.png"; |
|---|
| | 223 | $srv{'imgyear'} ="$srv{node}-year.png"; |
|---|
| | 224 | |
|---|
| | 225 | for my $scale (@times) { |
|---|
| | 226 | if (my ($w, $h) = get_png_size(munin_get_picture_filename($service, $scale))) { |
|---|
| | 227 | $srv{"img".$scale."width"} = $w; |
|---|
| | 228 | $srv{"img".$scale."height"} = $h; |
|---|
| | 229 | } |
|---|
| | 230 | } |
|---|
| | 231 | |
|---|
| | 232 | if (munin_get_bool ($service, "graph_sums", 0)) { |
|---|
| | 233 | $srv{imgweeksum} = "$srv{node}-week-sum.png"; |
|---|
| | 234 | $srv{imgyearsum} = "$srv{node}-year-sum.png"; |
|---|
| | 235 | for my $scale (["week", "year"]) { |
|---|
| | 236 | if (my ($w, $h) = get_png_size (munin_get_picture_filename($service, $scale, 1))) { |
|---|
| | 237 | $srv{"img".$scale."sumwidth"} = $w; |
|---|
| | 238 | $srv{"img".$scale."sumheight"} = $h; |
|---|
| | 239 | } |
|---|
| | 240 | } |
|---|
| | 241 | } |
|---|
| | 242 | } |
|---|
| | 243 | |
|---|
| | 244 | # Do "help" section |
|---|
| | 245 | if (my $info = munin_get ($service, "graph_info")) { |
|---|
| | 246 | my %graph_info; |
|---|
| | 247 | $graph_info{info} = $info; |
|---|
| | 248 | push @{$srv{graphinfo}}, \%graph_info; |
|---|
| | 249 | } |
|---|
| | 250 | |
|---|
| | 251 | $srv{fieldlist} .= "<tr><th align='left' valign='top'>Field</th><th align='left' valign='top'>Type</th><th align='left' valign='top'>Warn</th><th align='left' valign='top'>Crit</th><th></tr>"; |
|---|
| | 252 | foreach my $f (@{munin_get_field_order ($service)}) { |
|---|
| | 253 | $f =~ s/=(.*)$//; |
|---|
| | 254 | my $path = $1; |
|---|
| | 255 | next if (!defined $service->{$f}); |
|---|
| | 256 | my $fieldobj = $service->{$f}; |
|---|
| | 257 | next if (ref ($fieldobj) != "HASH" or !defined $fieldobj->{'label'}); |
|---|
| | 258 | next if (!munin_draw_field ($fieldobj)); |
|---|
| | 259 | |
|---|
| | 260 | logger ("DEBUG: single_value: Checking field \"$f\" ($path).") |
|---|
| | 261 | if $DEBUG; |
|---|
| | 262 | |
|---|
| | 263 | if (defined $path) { |
|---|
| | 264 | # This call is to make sure field settings are copied |
|---|
| | 265 | # for aliases, .stack, et al. Todo: put that part of |
|---|
| | 266 | # munin_get_rrd_filename into its own functino. |
|---|
| | 267 | munin_get_rrd_filename ($f, $path); |
|---|
| | 268 | } |
|---|
| | 269 | |
|---|
| | 270 | my %field_info; |
|---|
| | 271 | $fieldnum++; |
|---|
| | 272 | |
|---|
| | 273 | $field_info{'hr'} = 1 unless ($fieldnum % 3); |
|---|
| | 274 | $field_info{'field'} = $f; |
|---|
| | 275 | $field_info{'label'} = munin_get ($fieldobj, "label", $f); |
|---|
| | 276 | $field_info{'type'} = lc( munin_get ($fieldobj, "type", "GAUGE") ); |
|---|
| | 277 | $field_info{'warn'} = munin_get ($fieldobj, "warning"); |
|---|
| | 278 | $field_info{'crit'} = munin_get ($fieldobj, "critical"); |
|---|
| | 279 | $field_info{'info'} = munin_get ($fieldobj, "info"); |
|---|
| | 280 | |
|---|
| | 281 | my $state = munin_field_status ($config, $limits, 1); |
|---|
| | 282 | |
|---|
| | 283 | if (defined $state) { |
|---|
| | 284 | $field_info{'state_warning'} = 1 if $state eq "warning"; |
|---|
| | 285 | $field_info{'state_critical'} = 1 if $state eq "critical"; |
|---|
| | 286 | $field_info{'state_unknown'} = 1 if $state eq "unknown"; |
|---|
| | 287 | } |
|---|
| | 288 | push @{$srv{'fieldinfo'}}, \%field_info; |
|---|
| | 289 | } |
|---|
| | 290 | |
|---|
| | 291 | my $state = munin_service_status ($service, $limits, 1); |
|---|
| | 292 | if (defined $state) { |
|---|
| | 293 | $srv{'state_warning'} = 1 if $state eq "warning"; |
|---|
| | 294 | $srv{'state_critical'} = 1 if $state eq "critical"; |
|---|
| | 295 | $srv{'state_unknown'} = 1 if $state eq "unknown"; |
|---|
| | 296 | } |
|---|
| | 297 | |
|---|
| | 298 | $servicetemplate->param(SERVICES => [\%srv], |
|---|
| | 299 | PATH => $pathnodes, |
|---|
| | 300 | PEERS => $peers, |
|---|
| | 301 | CSS => $csspath, |
|---|
| | 302 | CATEGORY => ucfirst $srv{'category'}, |
|---|
| | 303 | TIMESTAMP => $timestamp); |
|---|
| | 304 | my $filename = munin_get_html_filename ($service); |
|---|
| | 305 | open (FILE, ">$filename") or |
|---|
| | 306 | die "Cannot open $filename for writing: $!"; |
|---|
| | 307 | print FILE $servicetemplate->output; |
|---|
| | 308 | close FILE; |
|---|
| | 309 | } |
|---|
| | 310 | |
|---|
| | 311 | exit 0; |
|---|
| 202 | | for my $service (@serviceorder) { |
|---|
| 203 | | logger("processing service: $service"); |
|---|
| 204 | | next unless |
|---|
| 205 | | defined($config->{domain}->{$domain}->{node}->{$node}->{client}->{$service} ) |
|---|
| 206 | | && $config->{domain}->{$domain}->{node}->{$node}->{client}->{$service} ne ""; |
|---|
| 207 | | |
|---|
| 208 | | next unless |
|---|
| 209 | | munin_get_bool ($config, "graph", 1, $domain, $node, $service); |
|---|
| 210 | | |
|---|
| 211 | | my @service; |
|---|
| 212 | | my %service; |
|---|
| 213 | | my $fieldnum = 0; |
|---|
| 214 | | my @graph_info; |
|---|
| 215 | | my @field_info; |
|---|
| 216 | | $service{service}=$service; |
|---|
| 217 | | $service{label}= |
|---|
| 218 | | $config->{domain}->{$domain}->{node}->{$node}->{client}-> |
|---|
| 219 | | {$service}->{graph_title}; |
|---|
| 220 | | |
|---|
| 221 | | my $method = &munin_get ($config, "graph_strategy", "cron"); |
|---|
| 222 | | if ($method eq "cgi") { |
|---|
| 223 | | $service{imgday}=$config->{'cgiurl_graph'}. |
|---|
| 224 | | "/$domain/$node/$service-day.png"; |
|---|
| 225 | | $service{imgweek}=$config->{'cgiurl_graph'}. |
|---|
| 226 | | "/$domain/$node/$service-week.png"; |
|---|
| 227 | | $service{imgmonth}=$config->{'cgiurl_graph'}. |
|---|
| 228 | | "/$domain/$node/$service-month.png"; |
|---|
| 229 | | $service{imgyear}=$config->{'cgiurl_graph'}. |
|---|
| 230 | | "/$domain/$node/$service-year.png"; |
|---|
| 231 | | |
|---|
| 232 | | if (&munin_get_bool_val($config->{domain}->{$domain}-> |
|---|
| 233 | | {node}->{$node}-> |
|---|
| 234 | | {client}->{$service}->{"graph_sums"}, 0)) { |
|---|
| 235 | | $service{imgweeksum} = |
|---|
| 236 | | $config->{'cgiurl_graph'}."/$domain/$node/$service-week-sum.png"; |
|---|
| 237 | | $service{imgyearsum} = |
|---|
| 238 | | $config->{'cgiurl_graph'}."/$domain/$node/$service-year-sum.png"; |
|---|
| 239 | | } |
|---|
| 240 | | |
|---|
| 241 | | # There is a disturbance in the force here, the sizes are off. |
|---|
| 242 | | # if (my ($w, $h) = |
|---|
| 243 | | # &calculate_png_size ($config, $domain, $node, $service)) { |
|---|
| 244 | | # for my $scale (@times) { |
|---|
| 245 | | # $service{"img".$scale."width"} = $w; |
|---|
| 246 | | # $service{"img".$scale."height"} = $h; |
|---|
| 247 | | # } |
|---|
| 248 | | # if (&munin_get_bool_val($config->{domain}->{$domain}-> |
|---|
| 249 | | # {node}->{$node}-> |
|---|
| 250 | | # {client}->{$service}->{"graph_sums"}, 0)) { |
|---|
| 251 | | # for my $scale (["week", "year"]) { |
|---|
| 252 | | # $service{"img".$scale."sumwidth"} = $w; |
|---|
| 253 | | # $service{"img".$scale."sumheight"} = $h; |
|---|
| 254 | | # } |
|---|
| 255 | | # } |
|---|
| 256 | | # } |
|---|
| 257 | | } else { |
|---|
| 258 | | # graph strategy cron |
|---|
| 259 | | $service{imgday}="$node-$service-day.png"; |
|---|
| 260 | | $service{imgweek}="$node-$service-week.png"; |
|---|
| 261 | | $service{imgmonth}="$node-$service-month.png"; |
|---|
| 262 | | $service{imgyear}="$node-$service-year.png"; |
|---|
| 263 | | |
|---|
| 264 | | for my $scale (@times) { |
|---|
| 265 | | if (my ($w, $h) = |
|---|
| 266 | | &get_png_size(&munin_get_picture_filename($config, $domain, |
|---|
| 267 | | $node, $service, |
|---|
| 268 | | $scale))) { |
|---|
| 269 | | $service{"img".$scale."width"} = $w; |
|---|
| 270 | | $service{"img".$scale."height"} = $h; |
|---|
| 271 | | } |
|---|
| 272 | | } |
|---|
| 273 | | |
|---|
| 274 | | if (&munin_get_bool_val ($config->{domain}->{$domain}-> |
|---|
| 275 | | {node}->{$node}->{client}-> |
|---|
| 276 | | {$service}->{"graph_sums"}, 0)) { |
|---|
| 277 | | $service{imgweeksum} = "$node-$service-week-sum.png"; |
|---|
| 278 | | $service{imgyearsum} = "$node-$service-year-sum.png"; |
|---|
| 279 | | for my $scale (["week", "year"]) { |
|---|
| 280 | | if (my ($w, $h) = |
|---|
| 281 | | &get_png_size (&munin_get_picture_filename($config,$domain, |
|---|
| 282 | | $node, $service, |
|---|
| 283 | | $scale, 1))) { |
|---|
| 284 | | $service{"img".$scale."sumwidth"} = $w; |
|---|
| 285 | | $service{"img".$scale."sumheight"} = $h; |
|---|
| 286 | | } |
|---|
| 287 | | } |
|---|
| 288 | | } |
|---|
| 289 | | } |
|---|
| 290 | | $service{url}="$node-$service.html"; |
|---|
| 291 | | $service{domain}="$domain"; |
|---|
| 292 | | $service{node}=$node; |
|---|
| 293 | | $service{category}= lc( $config->{domain}->{$domain}-> |
|---|
| 294 | | {node}->{$node}->{client}-> |
|---|
| 295 | | {$service}->{graph_category} || "other" ); |
|---|
| 296 | | |
|---|
| 297 | | # Do "help" section |
|---|
| 298 | | if (defined($config->{domain}->{$domain}-> |
|---|
| 299 | | {node}->{$node}-> |
|---|
| 300 | | {client}->{$service}->{graph_info})) { |
|---|
| 301 | | my %graph_info; |
|---|
| 302 | | |
|---|
| 303 | | $graph_info{info} = $config->{domain}->{$domain}-> |
|---|
| 304 | | {node}->{$node}->{client}->{$service}->{graph_info}; |
|---|
| 305 | | |
|---|
| 306 | | push @{$service{graphinfo}}, \%graph_info; |
|---|
| 307 | | } |
|---|
| 308 | | |
|---|
| 309 | | $service{fieldlist} .= "<tr><th align='left' valign='top'>Field</th><th align='left' valign='top'>Type</th><th align='left' valign='top'>Warn</th><th align='left' valign='top'>Crit</th><th></tr>"; |
|---|
| 310 | | # foreach my $field (keys %{$config->{domain}->{$domain}->{node}->{$node}->{client}->{$service}}) |
|---|
| 311 | | foreach my $f (@{&munin_get_field_order ($config->{domain}->{$domain}->{node}->{$node}, $config, $domain, $node, $service)}) { |
|---|
| 312 | | $f =~ s/=(.*)$//; |
|---|
| 313 | | my $path = $1; |
|---|
| 314 | | next unless &munin_draw_field ($config->{domain}->{$domain}-> |
|---|
| 315 | | {node}->{$node}, $service, $f); |
|---|
| 316 | | |
|---|
| 317 | | print "DEBUG: single_value: Checking field \"$f\" ($path).\n" |
|---|
| 318 | | if $DEBUG; |
|---|
| 319 | | |
|---|
| 320 | | if (defined $path) { |
|---|
| 321 | | # HUH? Get the filename and then forget? Some side effect here? |
|---|
| 322 | | munin_get_rrd_filename ($config->{domain}->{$domain}-> |
|---|
| 323 | | {node}->{$node}, $config, $domain, |
|---|
| 324 | | $node, $service, $f, $path); |
|---|
| 325 | | } |
|---|
| 326 | | |
|---|
| 327 | | my %field_info; |
|---|
| 328 | | $fieldnum++; |
|---|
| 329 | | |
|---|
| 330 | | $field_info{'hr'} = 1 unless ($fieldnum % 3); |
|---|
| 331 | | $field_info{'field'} = $f; |
|---|
| 332 | | $field_info{'label'} = $config->{domain}->{$domain}-> |
|---|
| 333 | | {node}->{$node}->{client}->{$service}->{$f.".label"} || $f; |
|---|
| 334 | | |
|---|
| 335 | | $field_info{'type'} = lc( $config->{domain}->{$domain}-> |
|---|
| 336 | | {node}->{$node}->{client}->{$service}-> |
|---|
| 337 | | {$f.".type"} || "GAUGE" ); |
|---|
| 338 | | |
|---|
| 339 | | $field_info{'warn'} = $config->{domain}->{$domain}-> |
|---|
| 340 | | {node}->{$node}->{client}->{$service}->{$f.".warning"} || "None"; |
|---|
| 341 | | $field_info{'crit'} = $config->{domain}->{$domain}-> |
|---|
| 342 | | {node}->{$node}->{client}->{$service}->{$f.".critical"} || "None"; |
|---|
| 343 | | $field_info{'info'} = $config->{domain}->{$domain}-> |
|---|
| 344 | | {node}->{$node}->{client}->{$service}->{$f.".info"} || ""; |
|---|
| 345 | | |
|---|
| 346 | | my $state = &munin_field_status ($config, $limits, $domain, |
|---|
| 347 | | $node, $service, $f, 1); |
|---|
| 348 | | |
|---|
| 349 | | if (defined $state) { |
|---|
| 350 | | $field_info{'state_warning'} = 1 if $state eq "warning"; |
|---|
| 351 | | $field_info{'state_critical'} = 1 if $state eq "critical"; |
|---|
| 352 | | $field_info{'state_unknown'} = 1 if $state eq "unknown"; |
|---|
| 353 | | } |
|---|
| 354 | | push @{$service{fieldinfo}}, \%field_info; |
|---|
| 355 | | } |
|---|
| 356 | | |
|---|
| 357 | | { |
|---|
| 358 | | my $state = &munin_service_status ($config, $limits, $domain, |
|---|
| 359 | | $node, $service, 1); |
|---|
| 360 | | if (defined $state) { |
|---|
| 361 | | $service{'state_warning'} = 1 if $state eq "warning"; |
|---|
| 362 | | $service{'state_critical'} = 1 if $state eq "critical"; |
|---|
| 363 | | $service{'state_unknown'} = 1 if $state eq "unknown"; |
|---|
| 364 | | } |
|---|
| 365 | | } |
|---|
| 366 | | |
|---|
| 367 | | push @services, \%service; |
|---|
| 368 | | push @service, \%service; |
|---|
| 369 | | push @{$tmp_cats{$service{'category'}}}, \%service; |
|---|
| 370 | | $servicetemplate->param(SERVICES => \@service, |
|---|
| 371 | | SERVICE => $service, |
|---|
| 372 | | NODE => $node, |
|---|
| 373 | | DOMAIN => $domain, |
|---|
| 374 | | DOMAINS => \@domainlist, |
|---|
| 375 | | TIMESTAMP => $timestamp); |
|---|
| 376 | | open (FILE, ">$config->{htmldir}/$domain/$node-$service.html") or |
|---|
| 377 | | die "Cannot open $config->{htmldir}/$domain/$node-$service.html: $!"; |
|---|
| 378 | | print FILE $servicetemplate->output; |
|---|
| 379 | | close FILE; |
|---|
| 380 | | } |
|---|