#!/usr/bin/perl
#WHMADDON:configstatselect:Configure Statistics Software
# richg@cpanel.net
###################################################################

BEGIN {
   push(@INC,"/usr/local/cpanel");
   push(@INC,"/usr/local/cpanel/whostmgr/docroot/cgi");
}
use whmlib;
require "parseform.pl";
my %FORM = parseform();
my $URCHIN = findurchin();
my @LOGGERS = qw(webalizer awstats analog);

print "Content-type: text/html\n\n";

defheader("Statistics Software Configuration");

use Cpanel;
Cpanel::initcp($ENV{'REMOTE_USER'});

#defaults added by nick@cpanel.net
if ($Cpanel::CONF{'skipanalog'} eq "") { $Cpanel::CONF{'skipanalog'} = 0; }
if ($Cpanel::CONF{'skipwebalizer'} eq "") { $Cpanel::CONF{'skipwebalizer'} = 0; }
if ($Cpanel::CONF{'skipawstats'} eq "") { $Cpanel::CONF{'skipawstats'} = 1; }
if ($Cpanel::CONF{'keepstatslog'} eq "") { $Cpanel::CONF{'keepstatslog'} = 0; }

if ($URCHIN eq "") {
   $Cpanel::CONF{'skipurchin'} = 1;
}
else { push @LOGGERS,"urchin"; }


# Default Action
if ($FORM{'cgiaction'} eq "") {
   printForm();
}
# Save User Override
elsif ($FORM{'cgiaction'} eq "saveover") {
   saveOverride();
   printForm();
}
# Modify Runnable Programs
elsif ($FORM{'cgiaction'} eq "modprogs") {
   modifyPrograms();
   printForm();
}
# Modify the default generators
elsif ($FORM{'cgiaction'} eq "moddefault") {
   modifyDefaults();
   printForm();
}
# Switch to user permission view
elsif ($FORM{'cgiaction'} eq "modusers") {
   printUserForm();
}
# Delete a user from the ACL
elsif ($FORM{'cgiaction'} eq "deleteuser") {
   my $ret = deleteUser($FORM{'user'});
   if ($ret == 0) { print "<h2>User Removed.</h2>"; }
   elsif ($ret == 1) { print "<h2>Invalid User.</h2>"; }
   elsif ($ret == 2) {
      print "<h2>User not found in allowed user list.</h2>";
   }
   printUserForm();
}
# Delete ALL users from the ACL
elsif ($FORM{'cgiaction'} eq "deleteall") {
   deleteAllUsers();
   print "<h2>All Users Removed</h2>";
   printUserForm();
}
# Add A User to the ACL
elsif ($FORM{'cgiaction'} eq "adduser") {
   my $ret = addUser($FORM{'user'});
   if ($ret == 0) { print "<h2>User Added.</h2>"; }
   elsif ($ret == 1) { print "<h2>Unable to add user.</h2>"; }
   printUserForm();
}
# Add ALL Users to the ACL
elsif ($FORM{'cgiaction'} eq "addall") {
   addAllUsers();
   printUserForm();
}
# Show user configuration screen.
elsif ($FORM{'cgiaction'} eq "showuser") {
   printConfigForm();
}
# Configure a User in the ACL
elsif ($FORM{'cgiaction'} eq "confuser") {
   configureUser(); 
   printUserForm();
}
else {
   print "<h2>You actioned.. And I don't know how to handle it.</h2>";
}

##############################################################################
#
##############################################################################
sub printForm {
   my %conf = loadStatsConf();

   # Allow users to change, and save button
   print "<form action='addon_statselect.cgi'>";
   print "<input type=hidden name=cgiaction value=saveover>";
   print "<input type=checkbox name=useroverride value='yes' ";
   if ($Cpanel::CONF{'userstatsoverride'} == 1) { print "CHECKED"; }
   print ">";
   print " Allow users to change their web statistics generating software.";
   print "<input type=submit value=Save>";
   print "</form>";
   
   if ($Cpanel::CONF{'userstatsoverride'} == 0) { return; }
  
   # Stat program activation
   print "Allow the following statistics generating programs to run.";
   print "<form action='addon_statselect.cgi'>";
   print "<input type=hidden name=cgiaction value=modprogs>";
   print "<blockquote>";
   foreach my $log (@LOGGERS) {
      print "<input type=checkbox name=",lc(${log});
      if ($Cpanel::CONF{'skip'.lc($log)} == 0) { print " CHECKED"; }
      print "> ",ucfirst(${log}),"<br>";
   }
   print "<input type=submit value=Save></form>";
   print "</blockquote>";
   
   # Default Generators
   my %stats = loadStatsConf();
   my @defaults = split(/,/,$stats{'DEFAULTGENS'});
   print "<br/><br/>";
   print "Run the following generators by default. (Until modified by the user)";
   print "<form action='addon_statselect.cgi'>";
   print "<input type=hidden name=cgiaction value=moddefault>";
   print "<blockquote>";
   foreach my $log (@LOGGERS) {
        if ($Cpanel::CONF{'skip'.lc($log)} == 0) {
            print "<input type=checkbox name=".lc(${log});
            if (grep(/^${log}$/i,@defaults)) { print " CHECKED"; }
            print "> ",ucfirst(${log}),"<br/>";
        }
   }
   print "<input type=submit value=Save></form>";
   print "</blockquote>";

   # Sub Tab buttons 
   print "<br/><br/>";
   print "<table align=left cellspacing=0 cellpadding=1 border=0>";
   print "<tr><td><form action='addon_statselect.cgi'>";
   print "<input type=hidden name=cgiaction value=modusers>";
   print "<input type=submit value='User Permissions'></form></td><td></tr></table>";
}

##############################################################################
#
##############################################################################
sub printUserForm {
   my %conf = loadStatsConf();
   
   print "<script language='javascript'>";
   print "function fillConfig() { document.conf.user.value = document.acl.user.options[document.acl.user.selectedIndex].value; } ";
   print "</script>";


   print "<table align=center width=300 cellspacing=0 cellpadding=2 border=0>";
   print "<tr><td width=3 colspan=3>Select which users you wish to be able to change their statistical software.</td></tr>";
   print "<tr align=center><td background='",getbggif(),"'>Allowed</td><td width=100 rowspan=3 valign=middle><b>OR</b></td><td background='",
         getbggif(),"'>Users</td></tr>";
   print "<tr><td align=right>";

   # Allowed Users Box, and Delete
   print "<form action='addon_statselect.cgi' name='acl'>";
   print "<input type=hidden name=cgiaction value='deleteuser'>";
   print "<select name='user' size=7 align=top onChange='fillConfig();'>";
   foreach $user (split(/,/,$conf{'VALIDUSERS'})) {
      print "<option value='${user}'>${user}</option>";
   }
   print "</select><br/><input type=submit value='Remove'></form>";
   print "<form action='addon_statselect.cgi'><input type=hidden name=cgiaction value='deleteall'>";
   print "<input type=submit Value='Remove All'></form>";
   print "</td></td><td align=right>";

   # All users box, and Add
   print "<form action='addon_statselect.cgi'>";
   print "<input type=hidden name=cgiaction value=adduser>";
   print "<select size=7 name='user'>";
   my @userlist = getUserList();
   print join("\n",map("<option name='$_'>$_</option>",@userlist));
   print "</select><br/>";
   print "<input type=submit value=Add></form>";
   print "<form action='addon_statselect.cgi'><input type=hidden name=cgiaction value=addall>";
   print "<input type=submit value='Add All'></form>";
   print "</td></tr>";

   # Configure User.
   print "<tr><td colspan=3>&nbsp;<br/></td></tr>";
   print "<tr><td colspan=3><form action='addon_statselect.cgi' name='conf'><input type=hidden name=cgiaction value=showuser>";
   print "Configure User: <input type=text value='' name='user'>";
   print "<input type=submit value='Configure'></form></td></tr>";


   print "</table>";
   # Go Back..
   print "<br><br><br><a href='addon_statselect.cgi'>Go Back</a>";
}

##############################################################################
#
##############################################################################
sub printConfigForm {
   my $string = "";
   my %l_conf = loadUserConf($FORM{'user'});
   my @loggers = ();
   if (defined($l_conf{'STATGENS'})) {  
      @loggers = split(/,/,$l_conf{'STATGENS'});
   }
   else { 
      %s_conf = loadStatsConf();
      @loggers = split(/,/,$s_conf{'DEFAULTGENS'});
   }
   print "<form action='addon_statselect.cgi'>";
   print "<input type=hidden name=cgiaction value=confuser>";
   print "<input type=hidden name=user value='",$FORM{'user'},"'>";
   print "<table align=center width=500 cellspacing=0 cellpadding=0 border=0>";
   print "<tr><td colspan=5 align=center><h2>ACL Configuration</h2></td></tr>";
   print "<tr bgcolor=#dddddd><td width=100>User</td>";
   foreach $log (@LOGGERS) {
       if ($Cpanel::CONF{'skip'.$log} == 0) {
           print "<td align=center>",ucfirst($log),"</td>";
           $string .= "<td align=center><input type=checkbox name='${log}'";
           if (grep(/^${log}$/i,@loggers)) { $string .= " CHECKED"; }
           $string .= "></td>";
       }
   }
   print "</tr>";
   print "<tr><td>",$FORM{'user'},"</td>${string}</tr>";
   print "<tr><td>&nbsp;</td></tr>";
   print "<tr><td colspan=5 align=right><input type=Submit Value=Save></td></tr>";
   print "</table>"; 
   print "</form>";

   # Go Back..
   print "<br><br><br><a href='addon_statselect.cgi'>Go Back</a>";
}

##############################################################################
#
##############################################################################
sub loadStatsConf {
    my %conf;
    open(CONF,"<","/etc/stats.conf");
    while (<CONF>) {
        chomp;
        my ($var,$val) = split(/=/,$_);
        $conf{uc($var)} = $val;
    }
    close(CONF);
    return %conf;
}


##############################################################################
#
##############################################################################
sub loadUserConf {
    my ($user) = @_;

    if (! -e "/var/cpanel/users/".$user) { return undef; }
    
    open(CONF,"/var/cpanel/users/".$user) or return undef;
    my @lconf = <CONF>;
    close(CONF);
    @lconf = map { chomp; $_ } @lconf;
    my %conf;
    foreach $line (@lconf) {
       my ($var,$val) = split(/=/,$line);
       $conf{uc($var)} = $val; 
    }
    return %conf;
}

##############################################################################
#
##############################################################################
sub saveOverride {
   if (lc($FORM{'useroverride'}) eq "yes") {
      $Cpanel::CONF{'userstatsoverride'} = 1;
   }
   else { $Cpanel::CONF{'userstatsoverride'} = 0; }

   flushConfig(\%Cpanel::CONF,"/var/cpanel/cpanel.config");
                                                                                                                                                             
   print "<h2>Configuration Saved.</h2>";
   restartCpanelLogd();
}

##############################################################################
#
##############################################################################
sub deleteUser {
   my ($user) = @_;
   return 1 if ($user eq ""); 
   my %conf = loadStatsConf();
   my @users = split(/,/,$conf{'VALIDUSERS'});
   if (!grep(/^${user}$/,@users)) { return 2; }
   my @newusers = grep(!/^${user}$/i,@users);
   $conf{'VALIDUSERS'} = join(',',@newusers);

   flushConfig(\%conf,"/etc/stats.conf"); 

   return 0;
}

#############################################################################
#
#############################################################################
sub deleteAllUsers {
    my %conf = loadStatsConf();
    
    # Easy Removal...
    $conf{'VALIDUSERS'} = "";
    
    flushConfig(\%conf,"/etc/stats.conf");
}

##############################################################################
#
##############################################################################
sub addUser {
    my ($user) = @_;
    return 1 if ($user eq "");

    my %conf = loadStatsConf();
    my @users = split(/,/,$conf{'VALIDUSERS'});
    push @users, $user;
    $conf{'VALIDUSERS'} = join(',',@users);

    flushConfig(\%conf,"/etc/stats.conf");

    return 0;
}

##############################################################################
#
##############################################################################
sub addAllUsers {
    my @users = getUserList();
    my %conf = loadStatsConf();
    my @cusers = split(/,/,$conf{'VALIDUSERS'});
    
    push @cusers,@users;
    $conf{'VALIDUSERS'} = join(',',@cusers); 
    flushConfig(\%conf,"/etc/stats.conf");

    return 0;
}


##############################################################################
#
##############################################################################
sub getUserList {
    my @users = `ls -1 /var/cpanel/users/`;
    @users = map { chomp($_); $_; } @users;
    return @users;
}

##############################################################################
#
##############################################################################
sub modifyPrograms {
    foreach $log (@LOGGERS) {
         if ($FORM{$log} eq "on") {
            $Cpanel::CONF{'skip'.$log} = 0;
         } else { $Cpanel::CONF{'skip'.$log} = 1; }
    }

    flushConfig(\%Cpanel::CONF,"/var/cpanel/cpanel.config");

    restartCpanelLogd();
}

##############################################################################
#
##############################################################################
sub restartCpanelLogd {
   system("/scripts/ckillall","-9","cpanellogd");
   system("/usr/local/cpanel/cpanellogd >/dev/null");
   print "<h2>cpanellogd Restarted.</h2>";
}

##############################################################################
#
##############################################################################
sub flushConfig {
   my ($conf,$filename) = @_;

   my @aconf = map("$_=$$conf{$_}",sort keys %$conf);
   open(CONF,">",$filename) or return 0;
   flock(CONF,2); # Ask for an exclusive lock.. Though it's only a suggestion, why not..?
   print CONF join("\n",@aconf);
   flock(CONF,8); # Release the lock..
   close(CONF);
   return 1;
}

##############################################################################
#
##############################################################################
sub configureUser {
    return 1 if ($FORM{'user'} eq "");
    my %u_config = loadUserConf($FORM{'user'});
    my @loggers = ();
    foreach $log (@LOGGERS) {
        if (lc($FORM{$log}) eq "on") {
            push @loggers,uc($log);
        }
    }
    $u_config{'STATGENS'} = join(",",@loggers);
    flushConfig(\%u_config,"/var/cpanel/users/".$FORM{'user'});
    print "<h2>User Updated</h2>";
}

##############################################################################
#
##############################################################################
sub modifyDefaults {
      my @defaults = ();
      foreach my $log (@LOGGERS) {
         if ($FORM{$log} eq 'on') {
            push @defaults,uc($log);
         }
      }    
      my %g_conf = loadStatsConf();
      $g_conf{'DEFAULTGENS'} = join(',',@defaults);
      flushConfig(\%g_conf,"/etc/stats.conf");
}

##############################################################################
#
##############################################################################
sub findurchin {
  my(@LOC,$loc);
                                                                                                                                                             
  @LOC = ("/usr/local/urchin",
          "/usr/local/urchin5",
          "/usr/local/urchin4");
   foreach $loc (@LOC) {
      if (-e $loc) { return $loc; }
   }
   return "";
}

