package SrvMngr::Controller::Awstats; #---------------------------------------------------------------------- # heading : Investigation # description : Web statistics # navigation : 6000 350 # # menu : A # # name : awstats, method : get, url : /awstats, ctlact : awstats#main # name : awstats2, method : get, url : /awstats2, ctlact : awstats#do_display # name : awstatsc, method : post, url : /awstats, ctlact : awstats#do_display # name : awstatsu, method : post, url : /awstats2, ctlact : awstats#do_update # name : awstats3, method : get, url : /awstats3, ctlact : awstats#do_update # # routes : end #---------------------------------------------------------------------- use strict; use warnings; use Mojo::Base 'Mojolicious::Controller'; use Locale::gettext; use SrvMngr::I18N; use SrvMngr qw(theme_list init_session); use POSIX qw(strftime); use esmith::DomainsDB; use esmith::ConfigDB; our $ddb = esmith::DomainsDB->open || die "Couldn't open domains db"; our $cdb = esmith::ConfigDB->open || die "Couldn't open configuration db"; our $awsdirdata="/home/e-smith/files/users/admin/home/awstats"; our $REGEXP_DOMAIN = qq([a-zA-Z0-9\-\.]+); sub main { my $c = shift; $c->app->log->info($c->log_req); my %aws_datas = (); my $title = $c->l('aws_FORM_TITLE'); $aws_datas{trt} = 'LST'; my $rec = $cdb->get('AWStats'); $aws_datas{status} = $rec->prop('status')|| 'disabled'; $aws_datas{mailstatus} = ( $rec->prop('mailstatus') || 'disabled' ); $aws_datas{ftpstatus} = ( $rec->prop('ftpstatus') || 'disabled' ); $aws_datas{username} = $c->session->{username} || 'unknown'; my @domains; # if ( $aws_datas->{status} ne 'enabled' ) { for ($ddb->domains()) { my $domain = $_->key; next unless ( -d "$awsdirdata/$domain" ); my $ns = $_->prop('Nameservers') || 'internet'; $domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/); my $awstats = 'Empty'; if (system("/bin/ls $awsdirdata/$domain/ | /bin/grep '.txt' > /dev/null 2>&1") == 0 ) { $awstats = 'Show'; } my $status = 'active'; #if ( ????system == 0 ) { // T O D O inactive domains// # $status = 'inactive'; #} push @domains, { Domain => $_->key, $_->props, Nameservers => $ns, AWStats => $awstats, Status => $status } } if (open (ST, "/var/log/httpd/awstats_lr")) { $aws_datas{logres} = ; close (ST); } # } $c->stash( title => $title, aws_datas => \%aws_datas, domains => \@domains ); $c->render(template => 'awstats'); } sub do_display { my $c = shift; $c->app->log->info($c->log_req); my %aws_datas = (); my $title = $c->l('aws_FORM_TITLE'); my $result; my $trt = $c->param('trt') || 'LST'; my $domain = $c->param('Domain'); if ( $trt eq 'SHW' ) { $aws_datas{periodrep} = 'month'; $aws_datas{monthrep} = strftime( "%m", localtime ); $aws_datas{yearrep} = strftime( "%Y", localtime ); $aws_datas{domain} = $domain; $result = _get_awst( $c, \%aws_datas ); } if ( $trt eq 'CNF' ) { my $rec = $cdb->get('AWStats'); if ($rec) { $aws_datas{status} = $rec->prop('status')|| 'disabled'; $aws_datas{mailstatus} = ( $rec->prop('mailstatus') || 'disabled' ); $aws_datas{ftpstatus} = ( $rec->prop('ftpstatus') || 'disabled' ); $aws_datas{freq} = $rec->prop('Freq')|| '5m'; $aws_datas{barSize} = $rec->prop('BarSize')|| 'medium'; $aws_datas{language} = $rec->prop('Language')|| 'auto'; $aws_datas{maxNbOfDomain} = $rec->prop('MaxNbOfDomain')|| '50'; $aws_datas{maxNbOfHosts} = $rec->prop('MaxNbOfHostsShown')|| '100'; $aws_datas{maxNbOfKeywords} = $rec->prop('MaxNbOfKeywordsShown')|| '50'; $aws_datas{maxNbOfPage} = $rec->prop('MaxNbOfPageShown')|| '200'; $aws_datas{maxNbOfReferer} = $rec->prop('MaxNbOfRefererShown')|| '50'; $aws_datas{maxNbOfRobot} = $rec->prop('MaxNbOfRobotShown')|| '25'; $aws_datas{minHitPage} = $rec->prop('MinHitFile')|| '1'; $aws_datas{minHitHost} = $rec->prop('MinHitHost')|| '1'; $aws_datas{minHitKeyword} = $rec->prop('MinHitKeyword')|| '1'; $aws_datas{minHitRefer} = $rec->prop('MinHitRefer')|| '1'; $aws_datas{minHitRobot} = $rec->prop('MinHitRobot')|| '1'; $aws_datas{rawlog} = $rec->prop('Rawlog')|| 'no'; $aws_datas{skipExternalIP} = $rec->prop('SkipExternalIP')|| 'yes'; $aws_datas{skipLocalIP} = $rec->prop('SkipLocalIP')|| 'yes'; $aws_datas{skipLocalNetworks} = $rec->prop('SkipLocalNetworks')|| 'no'; $aws_datas{userFramesWhenCGI} = $rec->prop('UserFramesWhenCGI')|| 'no'; $aws_datas{username} = $c->session->{username} || 'unknown'; } } $aws_datas{trt} = $trt; $aws_datas{domain} = $domain; $c->stash( title => $title .' '. $domain, aws_datas => \%aws_datas, modul => $result ); $c->render(template => 'awstats'); } sub do_update { my $c = shift; $c->app->log->info($c->log_req); my $rt = $c->current_route; my $trt = $c->param('trt') || 'SHWP'; my $title = $c->l('aws_FORM_TITLE'); my %aws_datas = (); $aws_datas{trt} = $trt; my ($res, $result) = ''; if ( $trt eq 'UPD' ) { my $status = $c->param('Status'); my $mailstatus = $c->param('Mailstatus'); my $ftpstatus = $c->param('Ftpstatus'); my $freq = $c->param('Freq'); my $skipLocalIP = $c->param('SkipLocalIP'); my $skipExternalIP = $c->param('SkipExternalIP'); my $skipLocalNetworks = $c->param('SkipLocalNetworks'); my $userFramesWhenCGI = $c->param('UserFramesWhenCGI'); my $language = $c->param('Language'); my $rawlog = $c->param('Rawlog'); my $barSize = $c->param('BarSize'); my $maxNbOfDomain = $c->param('MaxNbOfDomain'); my $maxNbOfHosts = $c->param('MaxNbOfHosts'); my $minHitHost = $c->param('MinHitHost'); my $maxNbOfPages = $c->param('MaxNbOfPages'); my $minHitPage = $c->param('MinHitPage'); my $maxNbOfRobot = $c->param('MaxNbOfRobot'); my $minHitRobot = $c->param('MinHitRobot'); my $maxNbOfReferer = $c->param('MaxNbOfReferer'); my $minHitRefer = $c->param('MinHitRefer'); my $maxNbOfKeywords = $c->param('MaxNbOfKeywords'); my $minHitKeyword = $c->param('MinHitKeyword'); #$result = 'blocked'; if ($maxNbOfDomain =~ /^([0-9]+)$/) { $maxNbOfDomain = $1; } else { $result .= $c->l('FIELD_INVALID_CHARS') .' : '. $maxNbOfDomain .'
'; } if ($maxNbOfHosts =~ /^([0-9]+)$/) { $maxNbOfHosts = $1; } else { $result .= $c->l('FIELD_INVALID_CHARS') .' : '. $maxNbOfHosts .'
'; } if ($minHitHost =~ /^([0-9]+)$/) { $minHitHost = $1; } else { $result .= $c->l('FIELD_INVALID_CHARS') .' : '. $minHitHost .'
'; } $maxNbOfDomain = 1 if $maxNbOfDomain < 1; $maxNbOfHosts = 1 if $maxNbOfHosts < 1; $minHitHost = 1 if $minHitHost < 1; $maxNbOfPages = 1 if $maxNbOfPages < 1; $minHitPage = 1 if $minHitPage < 1; $maxNbOfRobot = 1 if $maxNbOfRobot < 1; $minHitRobot = 1 if $minHitRobot < 1; $maxNbOfReferer = 1 if $maxNbOfReferer < 1; $minHitRefer = 1 if $minHitRefer < 1; $maxNbOfKeywords = 1 if $maxNbOfKeywords < 1; $minHitKeyword = 1 if $minHitKeyword < 1; # controls $res =''; if ( ! $result ) { my $rec = $cdb->get('AWStats'); if ($rec) { $rec->set_prop('status', $status); ; $rec->set_prop('mailstatus', $mailstatus); ; $rec->set_prop('ftpstatus', $ftpstatus); ; $rec->set_prop('Freq', $freq); $rec->set_prop('BarSize',$barSize ); $rec->set_prop('Language', $language); $rec->set_prop('MaxNbOfDomain', $maxNbOfDomain); $rec->set_prop('MaxNbOfHostsShown', $maxNbOfHosts); $rec->set_prop('MaxNbOfKeywordsShown', $maxNbOfKeywords); $rec->set_prop('MaxNbOfPageShown', $maxNbOfPages); $rec->set_prop('MaxNbOfRefererShown', $maxNbOfReferer); $rec->set_prop('MaxNbOfRobotShown', $maxNbOfRobot); $rec->set_prop('MinHitFile', $minHitPage); $rec->set_prop('MinHitHost', $minHitHost); $rec->set_prop('MinHitKeyword', $minHitKeyword); $rec->set_prop('MinHitRefer', $minHitRefer); $rec->set_prop('MinHitRobot', $minHitRobot); $rec->set_prop('Rawlog', $rawlog); $rec->set_prop('SkipExternalIP', $skipExternalIP); $rec->set_prop('SkipLocalIP', $skipLocalIP); $rec->set_prop('SkipLocalNetworks', $skipLocalNetworks); $rec->set_prop('UserFramesWhenCGI', $userFramesWhenCGI); } if ( system( '/sbin/e-smith/signal-event awstats-update &' ) != 0 ) { $result = ($c->l('aws_ERROR_CONFIG_UPDATE') . " $trt"); } else { # sleep (2); $res = 'OK'; $result = $c->l('aws_CONFIG_SUCCESSFULLY_MODIFIED'); } } } if ( $trt eq 'SHWP' ) { $aws_datas{periodrep} = $c->param('databasebreak'); $aws_datas{monthrep} = $c->param('month'); $aws_datas{yearrep} = $c->param('year'); $aws_datas{dayrep} = $c->param('day') || ''; $aws_datas{hourrep} = $c->param('hour') || ''; # does not exist (bug in awstats 7.8-3) $aws_datas{domain} = $c->param('config') || 'None'; $result = _get_awst( $c, \%aws_datas ); $c->stash( title => $title .' '. $aws_datas{domain}, aws_datas => \%aws_datas, modul => $result ); return $c->render( 'awstats' ); } # common parts if ($res ne 'OK') { $c->stash( error => $result ); $c->stash( title => $title, aws_datas => \%aws_datas ); return $c->render( 'awstats' ); } # $cdb = esmith::ConfigDB->open(); my $message = "'AWStats configuration' update ($trt) DONE"; $c->app->log->info($message); $c->flash( success => $result ); $c->redirect_to('/awstats'); } sub _get_awst { my ($c, $aws_datas) = @_; my $periodrep = $aws_datas->{periodrep}; my $yearrep = $aws_datas->{yearrep}; my $monthrep = $aws_datas->{monthrep}; my $dayrep = $aws_datas->{dayrep}; my $hourrep = $aws_datas->{hourrep}; my $domain = $aws_datas->{domain}; my $res; $domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/); $periodrep = $1 if ($periodrep =~ /^([A-Za-z]+)$/); $monthrep = $1 if ($monthrep =~ /^([A-Za-z\-]+)$/); $yearrep = $1 if ($yearrep =~ /^([0-9]+)$/); $dayrep = $1 if ($dayrep and $dayrep =~ /^([0-9]+)$/); $hourrep = $1 if ($hourrep and $hourrep =~ /^([0-9]+)$/); # cli awstats.pl call $res = `/etc/e-smith/web/panels/manager/cgi-bin/.awstats/awstats.pl -databasebreak=$periodrep -month=$monthrep -year=$yearrep -day=$dayrep -hour=$hourrep -config="${domain}" -lang=auto -output`; # change awstats link for this controller $res =~ s|action="/cgi-bin/awstats.pl?|action="/smanager/awstats3?trt=SHWP&|; # change DirIcons for sm2 public one $res =~ s|\.\./\.\./awstats|\./images/awstats/icon|g; return $res; } sub freq_options_list { my $c = shift; return [[ '5 ' . $c->l('MINUTES') => '5m'], [ '10 ' . $c->l('MINUTES') => '10m'], [ '15 ' . $c->l('MINUTES') => '15m'], [ '30 ' . $c->l('MINUTES') => '30m'], [ '1 ' . $c->l('HOUR') => '1h'], [ '2 ' . $c->l('HOURS') => '2h'], [ '4 ' . $c->l('HOURS') => '4h'], [ '8 ' . $c->l('HOURS') => '8h'], [ '12 ' . $c->l('HOURS') => '12h']]; } sub language_options_list { my $c = shift; return [[ 'Auto Detect' => 'auto' ], ['English' => 'en' ], ['French', => 'fr' ], ['Dutch' => 'nl' ], ['Spanish' => 'es' ], ['Italian' => 'it' ], ['German', => 'de' ], ['Polish', => 'pl' ], ['Greek' => 'gr' ], ['Czech' => 'cz' ], ['Portuguese' => 'pt' ]]; } 1