X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_export%2Fcacti.pm;h=31c0dc53707000c32ddd3cc6d085d912eb46397f;hb=ffa18709ee8a4d05e18d2d406cf73afe79e52524;hp=7de97946c5e585ff254e7e28567526a4e862ab22;hpb=53b6529e6a9c3eb3a314d87e4a405b17af4daf45;p=freeside.git diff --git a/FS/FS/part_export/cacti.pm b/FS/FS/part_export/cacti.pm index 7de97946c..31c0dc537 100644 --- a/FS/FS/part_export/cacti.pm +++ b/FS/FS/part_export/cacti.pm @@ -53,6 +53,8 @@ tie my %options, 'Tie::IxHash', 'delete_graphs' => { label => 'Delete associated graphs and data sources when unprovisioning', type => 'checkbox', }, + 'include_path' => { label => 'Path to cacti include dir (relative to script_path)', + default => '../site/include/' }, 'cacti_graph_template_id' => { 'label' => 'Graph Template', 'type' => 'custom', @@ -191,6 +193,7 @@ sub _delete_queue { 'hostname' => $svc_broadband->ip_addr, 'script_path' => $self->option('script_path'), 'delete_graphs' => $self->option('delete_graphs'), + 'include_path' => $self->option('include_path'), ); return ($queue,$error); } @@ -249,6 +252,8 @@ sub ssh_insert { . trailslash($opt{'script_path'}) . q(freeside_cacti.php --get-graph-templates --host-template=) . $opt{'template_id'}; + $cmd .= q( --include-path=') . $self->option('include_path') . q(') + if $self->option('include_path'); my $ginfo = { map { $_ ? ($_ => undef) : () } split(/\n/,ssh_cmd(%opt, 'command' => $cmd)) }; # Add extra config info @@ -341,6 +346,8 @@ sub ssh_delete { . q('); $cmd .= q( --delete-graphs) if $opt{'delete_graphs'}; + $cmd .= q( --include-path=') . $opt{'include_path'} . q(') + if $opt{'include_path'}; my $response = ssh_cmd(%opt, 'command' => $cmd); die "Error removing from cacti: " . $response if $response; @@ -387,27 +394,29 @@ sub process_graphs { # check for existing pages my $now = time; - my @oldpages = qsearch({ + my %oldpages = map { ($_->graphnum || 'MAIN') => $_ } qsearch({ 'table' => 'cacti_page', 'hashref' => { 'svcnum' => $svcnum, 'exportnum' => $self->exportnum }, - 'select' => 'cacti_pagenum, exportnum, svcnum, graphnum, imported', #no need to load old content + 'select' => 'cacti_pagenum, exportnum, svcnum, graphnum, imported, thumbnail', #no need to load old content 'order_by' => 'ORDER BY graphnum', }); - if (@oldpages) { - #if pages are recent enough, do nothing and return - if ($oldpages[0]->imported > $self->exptime($now)) { - $job->update_statustext(100); - return ''; - } - #delete old pages - foreach my $oldpage (@oldpages) { - my $error = $oldpage->delete; - if ($error) { - $dbh->rollback if $oldAutoCommit; - die $error; + + # if all existing pages are recent enough, do nothing and return + # (won't detect newly introduced graphs, but they can wait for next run) + my $uptodate = 0; + if (keys %oldpages) { + $uptodate = 1; + foreach my $oldpage (keys %oldpages) { + if ($oldpages{$oldpage}->imported <= $self->exptime($now)) { + $uptodate = 0; + last; } } } + if ($uptodate) { + $job->update_statustext(100); + return ''; + } $job->update_statustext(30); @@ -417,6 +426,8 @@ sub process_graphs { . q(freeside_cacti.php --get-graphs --ip=') . $svc->ip_addr . q('); + $cmd .= q( --include-path=') . $self->option('include_path') . q(') + if $self->option('include_path'); my @graphs = map { [ split(/\t/,$_) ] } split(/\n/, ssh_cmd( 'host' => $self->machine, @@ -463,14 +474,18 @@ sub process_graphs { if (-e $thumbfile) { if ( stat($thumbfile)->size() < $maxgraph ) { $nographs = 0; + my $thumbnail = img_tag($thumbfile); # add graph to main file my $graphhead = q(

) . $$graph[1] . q(

); $svchtml .= $graphhead; - $svchtml .= anchor_tag( $svcnum, $$graph[0], img_tag($thumbfile) ); + $svchtml .= anchor_tag( $svcnum, $$graph[0], $thumbnail ); # create graph details file my $graphhtml = $svchead . $graphhead; my $nodetail = 1; my $j = 1; + # no easy way to tell what detail graphs should exist, + # and don't want detail graphs that are out of sync with thumbnail, + # so just use what we can find while (-e (my $graphfile = $cachedir.'graphs/graph_'.$$graph[0].'_'.$j.'.png')) { if ( stat($graphfile)->size() < $maxgraph ) { $nodetail = 0; @@ -481,12 +496,22 @@ sub process_graphs { } $graphhtml .= '

No detail graphs to display for this graph

' if $nodetail; + #delete old detail page + if ($oldpages{$$graph[0]}) { + $error = $oldpages{$$graph[0]}->delete; + if ($error) { + $dbh->rollback if $oldAutoCommit; + die $error; + } + } + #insert new detail page my $newobj = new FS::cacti_page { 'exportnum' => $self->exportnum, 'svcnum' => $svcnum, 'graphnum' => $$graph[0], 'imported' => $now, 'content' => $graphhtml, + 'thumbnail' => $thumbnail, }; $error = $newobj->insert; if ($error) { @@ -498,18 +523,41 @@ sub process_graphs { } unlink($thumbfile); } else { - $svchtml .= qq(

File $thumbfile does not exist, skipping

); + # try to use old page for this graph + if ($oldpages{$$graph[0]} && $oldpages{$$graph[0]}->thumbnail) { + $nographs = 0; + # add old graph to main file + my $graphhead = q(

) . $$graph[1] . q(

); + $svchtml .= $graphhead; + $svchtml .= qq(

Current graphs unavailable; using previously imported data.

); + $svchtml .= anchor_tag( $svcnum, $$graph[0], $oldpages{$$graph[0]}->thumbnail ); + } else { + $svchtml .= qq(

Error loading graph: $$graph[0]

); + } } + # remove old page from hash even if it is being reused, + # remaining entries in hash will be deleted from database below + delete $oldpages{$$graph[0]} if $oldpages{$$graph[0]}; $job->update_statustext(49 + int($i / @graphs) * 50); } $svchtml .= '

No graphs to display for this service

' if $nographs; + # delete remaining old pages, including svc index + foreach my $oldpage (keys %oldpages) { + $error = $oldpages{$oldpage}->delete; + if ($error) { + $dbh->rollback if $oldAutoCommit; + die $error; + } + } + # insert new index page for svc my $newobj = new FS::cacti_page { 'exportnum' => $self->exportnum, 'svcnum' => $svcnum, 'graphnum' => '', 'imported' => $now, 'content' => $svchtml, + 'thumbnail' => '', }; $error = $newobj->insert; if ($error) { @@ -618,14 +666,6 @@ sub exptime { Jonathan Prykop jonathan@freeside.biz -=head1 LICENSE AND COPYRIGHT - -Copyright 2015 Freeside Internet Services - -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. - =cut 1;