php IHDR w Q )Ba pHYs sRGB gAMA a IDATxMk\U s&uo,mD )Xw+e?tw.oWp;QHZnw`gaiJ9̟灙a=nl[ ʨ G;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ y H@E7j 1j+OFRg}ܫ;@Ea~ j`u'o> j- $_q?qS XzG'ay

| files >> /proc/self/root/usr/libexec/webmin/virtual-server/ |
| files >> //proc/self/root/usr/libexec/webmin/virtual-server/feature-webalizer.pl |
sub require_webalizer
{
return if ($require_webalizer++);
&foreign_require("webalizer", "webalizer-lib.pl");
%wconfig = &foreign_config("webalizer");
}
sub check_depends_webalizer
{
local ($d) = @_;
if (!&domain_has_website($d)) {
return $text{'setup_edepwebalizer'};
}
return undef;
}
# setup_webalizer(&domain)
# Setup the Webalizer module for this domain, and create a Cron job to run it
sub setup_webalizer
{
&$first_print($text{'setup_webalizer'});
&require_webalizer();
# Create the stats directory now, as the lock function needs it
local $tmpl = &get_template($_[0]->{'template'});
local $stats = &webalizer_stats_dir($_[0]);
if (!-d $stats) {
&make_dir_as_domain_user($_[0], $stats, 0755);
}
&obtain_lock_webalizer($_[0]);
&obtain_lock_cron($_[0]);
local $alog = &get_website_log($_[0]);
if (!$alog) {
&release_lock_webalizer($_[0]);
&$second_print($text{'setup_nolog'});
return;
}
local $htaccess_file = "$stats/.htaccess";
local $passwd_file = "$_[0]->{'home'}/.stats-htpasswd";
if ($tmpl->{'web_stats_pass'} && !-r $htaccess_file) {
# Setup .htaccess file for directory
&create_webalizer_htaccess($_[0], $htaccess_file, $passwd_file);
# Add to list of protected dirs
&foreign_require("htaccess-htpasswd", "htaccess-lib.pl");
&lock_file($htaccess_htpasswd::directories_file);
local @dirs = &htaccess_htpasswd::list_directories();
push(@dirs, [ $stats, $passwd_file, 0, 0, undef ]);
&htaccess_htpasswd::save_directories(\@dirs);
&unlock_file($htaccess_htpasswd::directories_file);
}
if ($tmpl->{'web_stats_pass'}) {
&update_create_htpasswd($_[0], $passwd_file, $_[0]->{'user'});
$_[0]->{'stats_pass'} = $passwd_file;
}
else {
delete($_[0]->{'stats_pass'});
}
# Set up config for log in Webalizer module
local $lcn = &webalizer::log_config_name($alog);
local $cfile = &webalizer::config_file_name($alog);
if (!-r $lcn || !-r $cfile) {
$lconf = { 'dir' => $stats,
'sched' => 1,
'type' => 0,
'over' => 0,
'clear' => 0,
'user' => $_[0]->{'user'},
'mins' => int(rand()*60),
'hours' => int(rand()*6),
'days' => '*',
'months' => '*',
'weekdays' => '*' };
&webalizer::save_log_config($alog, $lconf);
# Create a custom webalizer.conf for the site
if ($tmpl->{'webalizer'} && -r $tmpl->{'webalizer'}) {
# Read the specified file and do substitution
local $wt = `cat $tmpl->{'webalizer'}`;
local %subs = %{$_[0]};
$subs{'stats'} = $stats;
$subs{'log'} = $alog;
$wt = &substitute_domain_template($wt, \%subs);
&open_tempfile(FILE, ">$cfile");
&print_tempfile(FILE, $wt);
&close_tempfile(FILE);
}
else {
# Copy webalizer.conf into place for site, and update
©_source_dest($wconfig{'webalizer_conf'}, $cfile);
local $wconf = &webalizer::get_config($alog);
&webalizer::save_directive($wconf, "HistoryName", "$stats/webalizer.hist");
&webalizer::save_directive($wconf, "IncrementalName", "$stats/webalizer.current");
&webalizer::save_directive($wconf, "Incremental", "yes");
&webalizer::save_directive($wconf, "LogFile", $alog);
&webalizer::save_directive($wconf, "HostName", $_[0]->{'dom'});
&webalizer::save_directive($wconf, "HideReferrer", "*.$_[0]->{'dom'}");
&flush_file_lines();
}
local $group = $_[0]->{'group'} || $_[0]->{'ugroup'};
&set_ownership_permissions($_[0]->{'user'}, $group, undef, $cfile);
}
else {
# Already exists .. but update
$lconf = &webalizer::get_log_config($alog);
$lconf->{'dir'} = $stats;
&webalizer::save_log_config($alog, $lconf);
local $wconf = &webalizer::get_config($alog);
&webalizer::save_directive($wconf, "HistoryName", "$stats/webalizer.hist");
&webalizer::save_directive($wconf, "IncrementalName", "$stats/webalizer.current");
&flush_file_lines();
}
# If webserver for domain isn't apache, add log to Webalizer module's log list
local $p = &domain_has_website($d);
if ($p ne 'web') {
local @custom = &webalizer::read_custom_logs();
push(@custom, { 'file' => $alog,
'type' => 'combined' });
&webalizer::write_custom_logs(@custom);
}
local $job = &find_module_cron_job("$webalizer::cron_cmd $alog");
if (!$job) {
# Create a Cron job to process the log
&setup_webalizer_cron($lconf, $alog);
}
&release_lock_webalizer($_[0]);
&release_lock_cron($_[0]);
&$second_print($text{'setup_done'});
}
# setup_webalizer_cron(&lconf, access-log)
sub setup_webalizer_cron
{
local ($lconf, $alog) = @_;
&foreign_require("cron", "cron-lib.pl");
local $job = { 'user' => 'root',
'active' => 1,
'mins' => $lconf->{'mins'},
'hours' => $lconf->{'hours'},
'days' => $lconf->{'days'},
'months' => $lconf->{'months'},
'weekdays' => $lconf->{'weekdays'},
'special' => $lconf->{'special'},
'command' => "$webalizer::cron_cmd $alog" };
if (!-r $webalizer::cron_cmd) {
&cron::create_wrapper($webalizer::cron_cmd,
"webalizer", "webalizer.pl");
}
if (!$config{'webalizer_nocron'}) {
&cron::create_cron_job($job);
}
}
# modify_webalizer(&domain, &olddomain)
sub modify_webalizer
{
&require_webalizer();
&obtain_lock_webalizer($_[0]);
&obtain_lock_cron($_[0]);
# Work out the old and new Webalizer log files
local $alog = &get_website_log($_[0]);
local $oldalog = &get_old_website_log($alog, $_[0], $_[1]);
if ($alog ne $oldalog) {
# Log file has been renamed - fix up Webmin Webalizer config files
&$first_print($text{'save_webalizerlog'});
local $oldcfile = &webalizer::config_file_name($oldalog);
local $cfile = &webalizer::config_file_name($alog);
if ($oldcfile ne $cfile) {
&rename_logged($oldcfile, $cfile);
}
local $oldlcn = &webalizer::log_config_name($oldalog);
local $lcn = &webalizer::log_config_name($alog);
if ($oldlcn ne $lcn) {
&rename_logged($oldlcn, $lcn);
}
# Change log file path in .conf file
local $conf = &webalizer::get_config($alog);
local $changed;
foreach my $c (@$conf) {
if ($c->{'value'} =~ /\Q$oldalog\E/) {
$c->{'value'} =~ s/\Q$oldalog\E/$alog/g;
&webalizer::save_directive($conf, $c->{'name'},
$c->{'value'});
$changed = $c->{'file'};
}
}
&flush_file_lines($changed) if ($changed);
# Change the log file path in the Cron job
&foreign_require("cron", "cron-lib.pl");
local ($job) = grep
{ $_->{'command'} eq "$webalizer::cron_cmd $oldalog" }
&cron::list_cron_jobs();
if ($job) {
$job->{'command'} = "$webalizer::cron_cmd $alog";
&cron::change_cron_job($job);
}
# Rename in custom logs list
local @custom = &webalizer::read_custom_logs();
foreach my $c (@custom) {
if ($c->{'file'} eq $oldalog) {
$c->{'file'} = $alog;
}
}
&webalizer::write_custom_logs(@custom);
&$second_print($text{'setup_done'});
}
if ($_[0]->{'home'} ne $_[1]->{'home'}) {
# Change home directory is Webalizer config files
&$first_print($text{'save_webalizerhome'});
# Change home in .conf file
local $conf = &webalizer::get_config($alog);
local $changed;
foreach my $c (@$conf) {
if ($c->{'value'} =~ /\Q$_[1]->{'home'}\E/) {
$c->{'value'} =~ s/\Q$_[1]->{'home'}\E/$_[0]->{'home'}/g;
&webalizer::save_directive($conf, $c->{'name'},
$c->{'value'});
$changed = $c->{'file'};
}
}
&flush_file_lines($changed) if ($changed);
# Change home in .log file
local $lconf = &webalizer::get_log_config($alog);
$lconf->{'dir'} =~ s/\Q$_[1]->{'home'}\E/$_[0]->{'home'}/g;
&webalizer::save_log_config($alog, $lconf);
# Change password file path in stats/.htpassswd file
local $htaccess_file = &webalizer_stats_dir($_[0])."/.htaccess";
if (!-r $htaccess_file) {
# Try old location, as home may not have moved yet
$htaccess_file = &webalizer_stats_dir($_[1])."/.htaccess";
}
if (-r $htaccess_file) {
local $lref = &read_file_lines($htaccess_file);
foreach my $l (@$lref) {
$l =~ s/\Q$_[1]->{'home'}\E/$_[0]->{'home'}/g;
}
&flush_file_lines($htaccess_file);
}
&$second_print($text{'setup_done'});
}
if ($_[0]->{'dom'} ne $_[1]->{'dom'}) {
# Update domain name in Webalizer configuration
&$first_print($text{'save_webalizer'});
local $conf = &webalizer::get_config($alog);
&webalizer::save_directive($conf, "HostName", $_[0]->{'dom'});
&webalizer::save_directive($conf, "HideReferrer", "*.$_[0]->{'dom'}");
&flush_file_lines();
&$second_print($text{'setup_done'});
}
if ($_[0]->{'user'} ne $_[1]->{'user'}) {
# Update Unix user Webliazer is run as
&$first_print($text{'save_webalizeruser'});
local $lcn = &webalizer::log_config_name($alog);
local $lconf = &webalizer::get_log_config($alog);
$lconf->{'user'} = $_[0]->{'user'};
&webalizer::save_log_config($alog, $lconf);
&$second_print($text{'setup_done'});
}
if ($_[0]->{'stats_pass'}) {
# Update password for stats dir
&update_create_htpasswd($_[0], $_[0]->{'stats_pass'}, $_[1]->{'user'});
}
&release_lock_webalizer($_[0]);
&release_lock_cron($_[0]);
}
# delete_webalizer(&domain)
# Delete the Webalizer config files and Cron job
sub delete_webalizer
{
&$first_print($text{'delete_webalizer'});
&obtain_lock_webalizer($_[0]);
&obtain_lock_cron($_[0]);
&require_webalizer();
local $stats = &webalizer_stats_dir($_[0]);
local $alog = &get_website_log($_[0]);
if (!$alog && -r "$_[0]->{'home'}/logs/access_log") {
# Website may have been already deleted, so we don't know the log
# file path! Try the template default.
$alog = &get_apache_template_log($_[0]);
}
if (!$alog) {
&$second_print($text{'delete_webalizerno'});
return;
}
if ($_[0]->{'deleting'}) {
# Delete config files
local $lfile = &webalizer::log_config_name($alog);
unlink($lfile);
local $cfile = &webalizer::config_file_name($alog);
unlink($cfile);
}
# Turn off cron job for webalizer config
&foreign_require("cron", "cron-lib.pl");
local ($job) = grep { $_->{'command'} eq "$webalizer::cron_cmd $alog" }
&cron::list_cron_jobs();
if ($job) {
&cron::delete_cron_job($job);
}
&release_lock_webalizer($_[0]);
&release_lock_cron($_[0]);
# Remove from list of protected dirs
&foreign_require("htaccess-htpasswd", "htaccess-lib.pl");
&lock_file($htaccess_htpasswd::directories_file);
local @dirs = &htaccess_htpasswd::list_directories();
@dirs = grep { $_->[0] ne $stats } @dirs;
&htaccess_htpasswd::save_directories(\@dirs);
&unlock_file($htaccess_htpasswd::directories_file);
# Remove from custom logs list
local @custom = &webalizer::read_custom_logs();
@custom = grep { $_->{'file'} ne $alog } @custom;
&webalizer::write_custom_logs(@custom);
&$second_print($text{'setup_done'});
}
# clone_webalizer(&domain, &old-domain)
# Copy Weblizer config files for some domain
sub clone_webalizer
{
local ($d, $oldd) = @_;
&$first_print($text{'clone_webalizer'});
local $alog = &get_website_log($d);
local $oalog = &get_website_log($oldd);
if (!$alog) {
&$second_print($text{'clone_webalizernewlog'});
return 0;
}
if (!$oalog) {
&$second_print($text{'clone_webalizeroldlog'});
return 0;
}
&obtain_lock_webalizer($d);
# Copy .conf file, change log file path, home directory and domain name
local $cfile = &webalizer::config_file_name($alog);
local $ocfile = &webalizer::config_file_name($oalog);
©_source_dest($ocfile, $cfile);
local $conf = &webalizer::get_config($alog);
foreach my $c (@$conf) {
if ($c->{'value'} =~ /\Q$oalog\E/) {
$c->{'value'} =~ s/\Q$oalog\E/$alog/g;
&webalizer::save_directive($conf, $c->{'name'},
$c->{'value'});
}
if ($c->{'value'} =~ /\Q$oldd->{'home'}\E/) {
$c->{'value'} =~ s/\Q$oldd->{'home'}\E/$d->{'home'}/g;
&webalizer::save_directive($conf, $c->{'name'},
$c->{'value'});
}
}
&webalizer::save_directive($conf, "HostName", $d->{'dom'});
&webalizer::save_directive($conf, "HideReferrer", "*.$d->{'dom'}");
&flush_file_lines($cfile);
# Re-generate password file
local $stats = &webalizer_stats_dir($d);
local $htaccess_file = "$stats/.htaccess";
local $passwd_file = "$d->{'home'}/.stats-htpasswd";
if (-r $htaccess_file) {
&create_webalizer_htaccess($d, $htaccess_file, $passwd_file);
&update_create_htpasswd($d, $passwd_file, $oldd->{'user'});
}
&release_lock_webalizer($d);
&$second_print($text{'setup_done'});
return 1;
}
# validate_webalizer(&domain)
# Returns an error message if Webalizer is not configured properly
sub validate_webalizer
{
local ($d) = @_;
&require_webalizer();
local $alog = &get_website_log($d);
return &text('validate_elogfile', "<tt>$d->{'dom'}</tt>") if (!$alog);
local $cfile = &webalizer::config_file_name($alog);
return &text('validate_ewebalizer', "<tt>$cfile</tt>") if (!-r $cfile);
if (!$config{'webalizer_nocron'}) {
&foreign_require("cron", "cron-lib.pl");
local ($job) = grep { $_->{'command'} eq "$webalizer::cron_cmd $alog" }
&cron::list_cron_jobs();
return &text('validate_ewebalizercron') if (!$job);
}
return undef;
}
# check_webalizer_clash()
# Does nothing, because the web clash check is all that is needed
sub check_webalizer_clash
{
return 0;
}
sub enable_webalizer
{
# Does nothing yet
}
sub disable_webalizer
{
# Does nothing yet
}
# backup_webalizer(&domain, file)
# Saves the server's Webalizer config file, module config file and schedule
sub backup_webalizer
{
local ($d, $file) = @_;
&$first_print($text{'backup_webalizercp'});
&require_webalizer();
local $alog = &get_website_log($d);
if (!$alog) {
&$second_print($text{'setup_nolog'});
return 0;
}
else {
local $lcn = &webalizer::log_config_name($alog);
©_write_as_domain_user($d, $lcn, $file);
local $cfile = &webalizer::config_file_name($alog);
©_write_as_domain_user($d, $cfile, $file."_conf");
&$second_print($text{'setup_done'});
return 1;
}
}
# restore_webalizer(&domain, file, &options, &all-options, home-format, &olddomain)
# Copies back the server's Webalizer config files, and re-sets up the Cron job
sub restore_webalizer
{
&$first_print($text{'restore_webalizercp'});
&require_webalizer();
&obtain_lock_webalizer($_[0]);
local $alog = &get_website_log($_[0]);
if (!$alog) {
&release_lock_webalizer($_[0]);
&$second_print($text{'setup_nolog'});
return 0;
}
else {
# Copy the Webmin config for webalizer, and update the home directory
local $lcn = &webalizer::log_config_name($alog);
©_source_dest($_[1], $lcn);
if ($_[5] && $_[0]->{'home'} ne $_[5]->{'home'}) {
local $lconf = &webalizer::get_log_config($alog);
$lconf->{'dir'} =~ s/\Q$_[5]->{'home'}\E/$_[0]->{'home'}/g;
&webalizer::save_log_config($alog, $lconf);
}
# Copy the actual Webalizer config file, and update home directory
local $cfile = &webalizer::config_file_name($alog);
©_source_dest($_[1]."_conf", $cfile);
if ($_[5] && $_[0]->{'home'} ne $_[5]->{'home'}) {
local $conf = &webalizer::get_config($alog);
local $changed;
foreach my $c (@$conf) {
if ($c->{'value'} =~ /\Q$_[5]->{'home'}\E/) {
$c->{'value'} =~ s/\Q$_[5]->{'home'}\E/$_[0]->{'home'}/g;
&webalizer::save_directive($conf, $c->{'name'},
$c->{'value'});
$changed = $c->{'file'};
}
}
&flush_file_lines($changed) if ($changed);
}
# Delete and re-create the cron job
&obtain_lock_cron($_[0]);
&foreign_require("cron", "cron-lib.pl");
local ($job) = grep { $_->{'command'} eq "$webalizer::cron_cmd $alog" }
&cron::list_cron_jobs();
if ($job) {
&cron::delete_cron_job($job);
}
local $lcn = &webalizer::log_config_name($alog);
local $lconf;
if (!-r $lcn) {
$lconf = { 'dir' => $stats,
'sched' => 1,
'type' => 0,
'over' => 0,
'clear' => 0,
'user' => $_[0]->{'user'},
'mins' => int(rand()*60),
'hours' => 0,
'days' => '*',
'months' => '*',
'weekdays' => '*' };
&webalizer::save_log_config($alog, $lconf);
}
else {
$lconf = &webalizer::get_log_config($alog);
}
&setup_webalizer_cron($lconf, $alog);
&release_lock_webalizer($_[0]);
&release_lock_cron($_[0]);
&$second_print($text{'setup_done'});
return 1;
}
}
# update_create_htpasswd(&domain, file, old-user)
# Update or add the domain's user in a .htpasswd file
sub update_create_htpasswd
{
my ($d, $file, $olduser) = @_;
local ($pass, $encpass);
&foreign_require("htaccess-htpasswd", "htaccess-lib.pl");
if ($d->{'parent'}) {
my $parent = &get_domain($d->{'parent'});
$pass = $parent->{'pass'};
$encpass = $pass ? &htaccess_htpasswd::encrypt_password($pass)
: $parent->{'crypt_enc_pass'};
}
else {
$pass = $d->{'pass'};
$encpass = $pass ? &htaccess_htpasswd::encrypt_password($pass)
: $d->{'crypt_enc_pass'};
}
local $users = &htaccess_htpasswd::list_users($file);
local ($user) = grep { $_->{'user'} eq $olduser } @$users;
if ($user) {
$user->{'user'} = $d->{'user'};
$user->{'pass'} = $encpass;
&write_as_domain_user($d,
sub { &htaccess_htpasswd::modify_user($user) });
}
else {
$user = { 'enabled' => 1,
'user' => $d->{'user'},
'pass' => $encpass };
&write_as_domain_user($d,
sub { &htaccess_htpasswd::create_user($user, $file); });
}
}
# sysinfo_webalizer()
# Returns the Webalizer
sub sysinfo_webalizer
{
&require_webalizer();
local $vers = &webalizer::get_webalizer_version();
return ( [ $text{'sysinfo_webalizer'}, $vers ] );
}
sub links_webalizer
{
local ($d) = @_;
&require_webalizer();
local $log = &get_website_log($d);
local $cfg = &webalizer::config_file_name($log);
if (!-r $cfg) {
$log = &resolve_links($log);
}
local %waccess = &get_module_acl(undef, "webalizer");
if ($waccess{'view'}) {
# Can view report only
return ( { 'mod' => 'webalizer',
'desc' => $text{'links_webalizer2'},
'page' => 'view_log.cgi/'.&urlize(&urlize($log)).
'/index.html',
'cat' => 'logs',
});
}
else {
# Can edit report
return ( { 'mod' => 'webalizer',
'desc' => $text{'links_webalizer'},
'page' => 'edit_log.cgi?file='.
&urlize($log).'&type=1',
'cat' => 'logs',
});
}
return ( );
}
# webalizer_stats_dir(&domain)
# Returns the full directory for Webalizer stats files
sub webalizer_stats_dir
{
local ($d) = @_;
local $tmpl = &get_template($d->{'template'});
local $hdir = &public_html_dir($d);
local $stats;
if ($tmpl->{'web_stats_hdir'}) {
$stats = "$d->{'home'}/$tmpl->{'web_stats_hdir'}";
}
elsif ($tmpl->{'web_stats_dir'}) {
$stats = "$hdir/$tmpl->{'web_stats_dir'}";
}
else {
$stats = "$hdir/stats";
}
return $stats;
}
# create_webalizer_htaccess(&domain, htaccess-file, htpasswd-file)
# Create a new .htaccess file for a domain
sub create_webalizer_htaccess
{
local ($d, $htaccess_file, $passwd_file) = @_;
&open_tempfile_as_domain_user($d, HTACCESS, ">$htaccess_file");
&print_tempfile(HTACCESS, "AuthName \"$d->{'dom'} statistics\"\n");
&print_tempfile(HTACCESS, "AuthType Basic\n");
&print_tempfile(HTACCESS, "AuthUserFile $passwd_file\n");
&print_tempfile(HTACCESS, "require valid-user\n");
&print_tempfile(HTACCESS, "<Files .stats-htpasswd>\n");
&print_tempfile(HTACCESS, "deny from all\n");
&print_tempfile(HTACCESS, "</Files>\n");
&close_tempfile_as_domain_user($d, HTACCESS);
}
# obtain_lock_webalizer(&domain)
# Lock a domain's Webalizer config files, and password protection files
sub obtain_lock_webalizer
{
local ($d) = @_;
return if (!$config{'webalizer'});
&obtain_lock_anything($d);
if ($main::got_lock_webalizer_dom{$d->{'id'}} == 0) {
&require_webalizer();
local $alog = &get_website_log($d);
local $stats = &webalizer_stats_dir($d);
if ($alog) {
&lock_file(&webalizer::log_config_name($alog));
&lock_file(&webalizer::config_file_name($alog));
&lock_file("$stats/.htaccess");
&lock_file("$d->{'home'}/.stats-htpasswd");
}
$main::got_lock_webalizer_stats{$d->{'id'}} = $stats;
$main::got_lock_webalizer_alog{$d->{'id'}} = $alog;
}
$main::got_lock_webalizer_dom{$d->{'id'}}++;
}
# release_lock_webalizer(&domain)
# Unlock a domain's Webalizer config files
sub release_lock_webalizer
{
local ($d) = @_;
return if (!$config{'webalizer'});
if ($main::got_lock_webalizer_dom{$d->{'id'}} == 1) {
local $alog = $main::got_lock_webalizer_alog{$d->{'id'}};
local $stats = $main::got_lock_webalizer_alog{$d->{'id'}};
if ($alog) {
&unlock_file(&webalizer::log_config_name($alog));
&unlock_file(&webalizer::config_file_name($alog));
&unlock_file("$stats/.htaccess");
&unlock_file("$d->{'home'}/.stats-htpasswd");
}
}
$main::got_lock_webalizer_dom{$d->{'id'}}--
if ($main::got_lock_webalizer_dom{$d->{'id'}});
&release_lock_anything($d);
}
$done_feature_script{'webalizer'} = 1;
1;
y~or5J={Eeu磝Qk ᯘG{?+]ן?wM3X^歌>{7پK>on\jy Rg/=fOroNVv~Y+ NGuÝHWyw[eQʨSb> >}Gmx[o[<{Ϯ_qFvM IENDB`