Advertisement
Guest User

Untitled

a guest
Jun 6th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 7.57 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use CGI::Minimal;
  5. use RRDs;
  6. use Template::Alloy;
  7. #use Data::Dumper;
  8. use YAML::Syck qw(LoadFile);
  9. use DBI;
  10. use Carp qw(croak);
  11.  
  12. __PACKAGE__->main;
  13. exit;
  14.  
  15. sub main {
  16.    my $class = shift;
  17.    my $self  = bless {}, $class;
  18.  
  19.    # Load config from disk
  20.    $self->{'conf_file'} = '/etc/mrtgman.yml';
  21.    my $y = LoadFile($self->{'conf_file'}) if (-e $self->{'conf_file'});
  22.    @$self{keys %$y} = values %$y;
  23.  
  24.    if ($self->device) {
  25.       if ($self->port) {
  26.          $self->display_detail();
  27.       } else {
  28.          $self->display_device();
  29.       }                                                                                                                                                                                                        
  30.    } elsif ($self->search) {                                                                                                                                                                                  
  31.       $self->display_search();                                                                                                                                                                                
  32.    } elsif ($self->group) {                                                                                                                                                                                    
  33.       $self->display_group();                                                                                                                                                                                  
  34.    } else {                                                                                                                                                                                                    
  35.       $self->display_main();                                                                                                                                                                                  
  36.    }                                                                                                                                                                                                          
  37.                                                                                                                                                                                                                
  38.    $self->toTT();                                                                                                                                                                                              
  39. }                                                                                                                                                                                                              
  40.                                                                                                                                                                                                                
  41. sub display_main {                                                                                                                                                                                            
  42.    my $self = shift;
  43.    $self->{'swap'} = {
  44.       title => 'Main',
  45.       devices => $self->ports("select ip,port,label from ports where label='uplink' order by ip"),
  46.    };
  47.    $self->template('main');
  48. }
  49.  
  50. sub display_device {
  51.    my $self = shift;
  52.    $self->{'swap'} = {
  53.       title => $self->device,
  54.       ports => $self->ports("select ip,port,label from ports where ip=\'" . $self->device . "\' order by label"),
  55.    };
  56.    $self->template('device');
  57. }
  58.  
  59. sub display_search {
  60.    my $self = shift;
  61.    $self->{'swap'} = {
  62.       title => $self->search,
  63.       ports => $self->ports("select ip,port,label from ports where label like \'\%" . $self->search . "\%\' order by label"),
  64.    };
  65.    $self->template('device');
  66. }
  67.  
  68. sub display_detail {
  69.    my $self = shift;
  70.    $self->{'swap'} = {
  71.       ports => $self->ports("select ip,port,label from ports where ip=\'" . $self->device . "\' and port=\'" . $self->port . "\'"),
  72.    };
  73.    $self->template('detail');
  74. }
  75.  
  76. sub display_group {
  77.    my $self = shift;
  78.    $self->{'swap'} = {
  79.       title => ${$self->group}[0][1],
  80.       gid => ${$self->group}[0][0],
  81.       ports => $self->ports("select ip,port,label from ports where label " . ${$self->group}[0][2] . " order by label"),
  82.    };
  83.    $self->template('group');
  84. }
  85.  
  86. sub display_bw {
  87.    my $self = shift;
  88.    $self->{'swap'} = {
  89.       title => 'Bandwidth Summary',
  90.       ports => $self->ports("select ip,port,label from ports where label " . ${$self->group}[0][2] . " order by label"),
  91.    };
  92.    $self->template('bw_summary');
  93. }
  94.  
  95. sub toTT {
  96.    my $self = shift;
  97.    $self->{'swap'}->{'period'} = $self->period;
  98.    $self->{'swap'}->{'groups'} = $self->groups;
  99.  
  100.    my $t = Template::Alloy->new(
  101.       INCLUDE_PATH => ['/var/www/lib/templates'],
  102.       WRAPPER => 'wrappers/layout.tt',
  103.       VARIABLES => {
  104.          errors => $self->error,
  105.       },
  106.    );
  107.  
  108.    print "Content-type: text/html\n\n";
  109.    $t->process($self->template, $self->{'swap'}) || $self->error($t->error);
  110. }
  111.  
  112. sub error {
  113.    my ($self, $error) = @_;
  114.    $self->{'error'} = [] unless $self->{'error'};
  115.    push(@{$self->{'error'}}, $error) if $error;
  116.    return $self->{'error'};
  117. }
  118.  
  119. sub groups {
  120.    my $self = shift;
  121.    my $query = "select g_id,g_name from groups order by g_name";
  122.    return $self->{'groups'} ||= $self->dbh->selectall_arrayref($query, { Columns=>[1,2] });
  123. }
  124.  
  125. sub ports {
  126.    my ($self, $query, $destroy) = @_;
  127.    
  128.    if ($query =~ m/^select ip,port,label from ports/i && (! $self->{'ports'} || $destroy)) {
  129.       $self->{'ports'} = $self->dbh->selectall_arrayref($query, { Columns=>[1,2,3] });
  130.    }
  131.  
  132.    return $self->{'ports'};
  133. }
  134.  
  135. sub ports_destroy { ports(@_, 1); }
  136.  
  137. sub dbh {
  138.    my $self = shift;
  139.  
  140.    unless ($self->{'dbh'} && $self->{'dbh'}->ping) {
  141.       my $cs = 'DBI:mysql:database=' . $self->{'mysql_db'} . ':user=' . $self->{'mysql_user'} . ':password=' . $self->{'mysql_pass'};
  142.       my $dbh = DBI->connect( "$cs", { PrintError => 1 } ) or croak;
  143.       $self->{'dbh'} = $dbh;
  144.    }
  145.  
  146.    return $self->{'dbh'};
  147. }
  148.  
  149. sub cgi { return shift->{'cgi'} ||= CGI::Minimal->new; }
  150.  
  151. sub action {
  152.    my $self = shift;
  153.    return $self->{'p_action'} ||= $self->cgi->param('a');
  154. }
  155.  
  156. sub device {
  157.    my $self = shift;
  158.    return $self->{'p_device'} ||= $self->cgi->param('s') if $self->cgi->param('s') =~ m/^(\d{1,3}\.){3}\d{1,3}$/;
  159. }
  160.  
  161. sub port {
  162.    my $self = shift;
  163.    return $self->{'p_port'} ||= $self->cgi->param('p') if $self->cgi->param('p') =~ m/^\d{1,4}$/;
  164. }
  165.  
  166. sub period {
  167.    my $self = shift;
  168.    return $self->{'p_period'} ||= ($self->cgi->param('t') =~ m/^\d{1,4}(m|h|d|w|y)$/i) ? $self->cgi->param('t') : '6h';
  169. }
  170.  
  171. sub search {
  172.    my $self = shift;
  173.    return $self->{'p_search'} ||= $self->cgi->url_decode($self->cgi->param('search')) || undef;
  174. }
  175.  
  176. sub template {
  177.    my ($self, $template) = @_;
  178.    $self->{'template'} = $template . '.tt' if ($template && $template !~ m/\.tt$/i);
  179.    return $self->{'template'};
  180. }
  181.  
  182. sub group {
  183.    my $self = shift;
  184.  
  185.    unless ($self->{'p_group'}) {
  186.       my $query = "select g_id,g_name,g_query from groups where g_id=" . $self->cgi->param('g');
  187.       $self->{'p_group'} = $self->dbh->selectall_arrayref($query, { Columns=>[1,2,3] });      
  188.    }
  189.    return $self->{'p_group'};
  190. }
  191.  
  192. __END__
  193.  
  194.  
  195. TODO: Unify display_search & display_device
  196. TODO: Get rid of toTT since it is mostly unneccesary.
  197. TODO: Build in BW summary
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement