Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use CGI::Minimal;
- use RRDs;
- use Template::Alloy;
- #use Data::Dumper;
- use YAML::Syck qw(LoadFile);
- use DBI;
- use Carp qw(croak);
- __PACKAGE__->main;
- exit;
- sub main {
- my $class = shift;
- my $self = bless {}, $class;
- # Load config from disk
- $self->{'conf_file'} = '/etc/mrtgman.yml';
- my $y = LoadFile($self->{'conf_file'}) if (-e $self->{'conf_file'});
- @$self{keys %$y} = values %$y;
- if ($self->device) {
- if ($self->port) {
- $self->display_detail();
- } else {
- $self->display_device();
- }
- } elsif ($self->search) {
- $self->display_search();
- } elsif ($self->group) {
- $self->display_group();
- } else {
- $self->display_main();
- }
- $self->toTT();
- }
- sub display_main {
- my $self = shift;
- $self->{'swap'} = {
- title => 'Main',
- devices => $self->ports("select ip,port,label from ports where label='uplink' order by ip"),
- };
- $self->template('main');
- }
- sub display_device {
- my $self = shift;
- $self->{'swap'} = {
- title => $self->device,
- ports => $self->ports("select ip,port,label from ports where ip=\'" . $self->device . "\' order by label"),
- };
- $self->template('device');
- }
- sub display_search {
- my $self = shift;
- $self->{'swap'} = {
- title => $self->search,
- ports => $self->ports("select ip,port,label from ports where label like \'\%" . $self->search . "\%\' order by label"),
- };
- $self->template('device');
- }
- sub display_detail {
- my $self = shift;
- $self->{'swap'} = {
- ports => $self->ports("select ip,port,label from ports where ip=\'" . $self->device . "\' and port=\'" . $self->port . "\'"),
- };
- $self->template('detail');
- }
- sub display_group {
- my $self = shift;
- $self->{'swap'} = {
- title => ${$self->group}[0][1],
- gid => ${$self->group}[0][0],
- ports => $self->ports("select ip,port,label from ports where label " . ${$self->group}[0][2] . " order by label"),
- };
- $self->template('group');
- }
- sub display_bw {
- my $self = shift;
- $self->{'swap'} = {
- title => 'Bandwidth Summary',
- ports => $self->ports("select ip,port,label from ports where label " . ${$self->group}[0][2] . " order by label"),
- };
- $self->template('bw_summary');
- }
- sub toTT {
- my $self = shift;
- $self->{'swap'}->{'period'} = $self->period;
- $self->{'swap'}->{'groups'} = $self->groups;
- my $t = Template::Alloy->new(
- INCLUDE_PATH => ['/var/www/lib/templates'],
- WRAPPER => 'wrappers/layout.tt',
- VARIABLES => {
- errors => $self->error,
- },
- );
- print "Content-type: text/html\n\n";
- $t->process($self->template, $self->{'swap'}) || $self->error($t->error);
- }
- sub error {
- my ($self, $error) = @_;
- $self->{'error'} = [] unless $self->{'error'};
- push(@{$self->{'error'}}, $error) if $error;
- return $self->{'error'};
- }
- sub groups {
- my $self = shift;
- my $query = "select g_id,g_name from groups order by g_name";
- return $self->{'groups'} ||= $self->dbh->selectall_arrayref($query, { Columns=>[1,2] });
- }
- sub ports {
- my ($self, $query, $destroy) = @_;
- if ($query =~ m/^select ip,port,label from ports/i && (! $self->{'ports'} || $destroy)) {
- $self->{'ports'} = $self->dbh->selectall_arrayref($query, { Columns=>[1,2,3] });
- }
- return $self->{'ports'};
- }
- sub ports_destroy { ports(@_, 1); }
- sub dbh {
- my $self = shift;
- unless ($self->{'dbh'} && $self->{'dbh'}->ping) {
- my $cs = 'DBI:mysql:database=' . $self->{'mysql_db'} . ':user=' . $self->{'mysql_user'} . ':password=' . $self->{'mysql_pass'};
- my $dbh = DBI->connect( "$cs", { PrintError => 1 } ) or croak;
- $self->{'dbh'} = $dbh;
- }
- return $self->{'dbh'};
- }
- sub cgi { return shift->{'cgi'} ||= CGI::Minimal->new; }
- sub action {
- my $self = shift;
- return $self->{'p_action'} ||= $self->cgi->param('a');
- }
- sub device {
- my $self = shift;
- return $self->{'p_device'} ||= $self->cgi->param('s') if $self->cgi->param('s') =~ m/^(\d{1,3}\.){3}\d{1,3}$/;
- }
- sub port {
- my $self = shift;
- return $self->{'p_port'} ||= $self->cgi->param('p') if $self->cgi->param('p') =~ m/^\d{1,4}$/;
- }
- sub period {
- my $self = shift;
- return $self->{'p_period'} ||= ($self->cgi->param('t') =~ m/^\d{1,4}(m|h|d|w|y)$/i) ? $self->cgi->param('t') : '6h';
- }
- sub search {
- my $self = shift;
- return $self->{'p_search'} ||= $self->cgi->url_decode($self->cgi->param('search')) || undef;
- }
- sub template {
- my ($self, $template) = @_;
- $self->{'template'} = $template . '.tt' if ($template && $template !~ m/\.tt$/i);
- return $self->{'template'};
- }
- sub group {
- my $self = shift;
- unless ($self->{'p_group'}) {
- my $query = "select g_id,g_name,g_query from groups where g_id=" . $self->cgi->param('g');
- $self->{'p_group'} = $self->dbh->selectall_arrayref($query, { Columns=>[1,2,3] });
- }
- return $self->{'p_group'};
- }
- __END__
- TODO: Unify display_search & display_device
- TODO: Get rid of toTT since it is mostly unneccesary.
- TODO: Build in BW summary
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement