$force_load_features = 1; # so that the latest feature-* files are used
$done_virtual_server_lib_funcs = 0;
do 'virtual-server-lib.pl';
sub module_install
{
&foreign_require("cron", "cron-lib.pl");
# Make sure the remote.cgi page is accessible in non-session mode
local %miniserv;
&get_miniserv_config(\%miniserv);
if ($virtualmin_pro) {
local @sa = split(/\s+/, $miniserv{'sessiononly'});
if (&indexof("/$module_name/remote.cgi", @sa) < 0) {
# Need to add
push(@sa, "/$module_name/remote.cgi");
$miniserv{'sessiononly'} = join(" ", @sa);
&put_miniserv_config(\%miniserv);
}
}
# Setup the default templates
foreach my $tf (@all_template_files) {
&ensure_template($tf);
}
# Perform a module config check, to ensure that quota and interface settings
# are correct.
&set_all_null_print();
$cerr = &html_tags_to_text(&check_virtual_server_config());
#if ($cerr) {
# print STDERR "Warning: Module Configuration problem detected: $cerr\n";
# }
if ($virtualmin_pro) {
# Convert all existing domains with PHP to use new per-version .inis,
# if they don't exist yet
foreach my $d (&list_domains()) {
next if (!$d->{'web'} || !$d->{'dir'});
local $mode = &get_domain_php_mode($d);
next if ($mode eq "mod_php");
if (!-r "$d->{'home'}/etc/php4/php.ini" &&
!-r "$d->{'home'}/etc/php5/php.ini") {
&save_domain_php_mode($d, $mode);
}
}
}
# Force update of all Webmin users, to set new ACL options
&modify_all_webmin();
if ($virtualmin_pro) {
&modify_all_resellers();
}
# Setup the licence cron job
&setup_licence_cron();
# Fix up Procmail default delivery
if ($config{'spam'} && $virtualmin_pro) {
&setup_default_delivery();
}
# Enable logging in Procmail, if we are using it
if ($config{'spam'} && $virtualmin_pro) {
&enable_procmail_logging();
# And setup cron job to periodically process logs
# Disabled, as it is generating too much load on big sites
#local $job = &find_virtualmin_cron_job($maillog_cron_cmd);
#if (!$job) {
# # Create, and run for the first time
# $job = { 'mins' => int(rand()*60),
# 'hours' => '0',
# 'days' => '*',
# 'months' => '*',
# 'weekdays' => '*',
# 'user' => 'root',
# 'active' => 1,
# 'command' => $maillog_cron_cmd };
# &cron::create_cron_job($job);
# &cron::create_wrapper($maillog_cron_cmd, $module_name,
# "maillog.pl");
# }
}
# Setup Cron job to periodically re-sync links in domains' spamassassin config
# directories.
if ($config{'spam'} && $virtualmin_pro) {
local $job = &find_virtualmin_cron_job($spamconfig_cron_cmd);
if (!$job) {
# Create, and run for the first time
$job = { 'mins' => int(rand()*60),
'hours' => '*',
'days' => '*',
'months' => '*',
'weekdays' => '*',
'user' => 'root',
'active' => 1,
'command' => $spamconfig_cron_cmd };
&cron::create_cron_job($job);
&cron::create_wrapper($spamconfig_cron_cmd, $module_name,
"spamconfig.pl");
}
# And run now, just in case spamassassin was upgraded recently
foreach my $d (grep { $_->{'spam'} } &list_domains()) {
&create_spam_config_links($d);
}
}
# Fix up old procmail scripts that don't call the clam wrapper
if ($config{'virus'} && $virtualmin_pro) {
&fix_clam_wrapper();
}
# Check if we have enough memory to preload
local $lowmem;
&foreign_require("proc", "proc-lib.pl");
if (defined(&proc::get_memory_info)) {
local ($real) = &proc::get_memory_info();
if ($real*1024 <= 256*1024*1024) {
# Less that 256 M .. don't preload
$lowmem = 1;
}
}
if (&running_in_zone() || defined(&running_in_vserver) &&
&running_in_vserver()) {
# Assume that zones and vservers don't have a lot of memory
$lowmem = 1;
}
if ($virtualmin_pro) {
# Decide whether to preload, and then do it
if ($config{'preload_mode'} eq '') {
$config{'preload_mode'} = $lowmem ? 0 : 2;
}
if ($gconfig{'no_virtualmin_preload'}) {
$config{'preload_mode'} = 0;
}
&save_module_config();
&update_miniserv_preloads($config{'preload_mode'});
}
# Run in package eval mode, to avoid loading the same module twice
local %miniserv;
&get_miniserv_config(\%miniserv);
if ($virtualmin_pro) {
$miniserv{'eval_package'} = 1;
}
&put_miniserv_config(\%miniserv);
&restart_miniserv();
# Setup lookup domain daemon
if ($virtualmin_pro) {
&foreign_require("init", "init-lib.pl");
&foreign_require("proc", "proc-lib.pl");
local $pidfile = "$ENV{'WEBMIN_VAR'}/lookup-domain-daemon.pid";
&init::enable_at_boot(
"lookup-domain",
"Daemon for quickly looking up Virtualmin ".
"servers from procmail",
"$module_root_directory/lookup-domain-daemon.pl",
"kill `cat $pidfile`",
undef);
if (&check_pid_file($pidfile)) {
&init::stop_action("lookup-domain");
sleep(5); # Let port free up
}
&init::start_action("lookup-domain");
}
# Force a restart of Apache, to apply writelogs.pl changes
if ($config{'web'}) {
&require_apache();
&restart_apache();
}
if ($virtualmin_pro && !$config{'done_fix_autoreplies'}) {
# Create links for existing autoreply aliases
&set_alias_programs();
foreach my $d (&list_domains()) {
if ($d->{'mail'}) {
&create_autoreply_alias_links($d);
}
}
$config{'done_fix_autoreplies'} = 1;
&save_module_config();
}
# If installing for the first time, enable backup of all features by default
local @doms = &list_domains();
if (!@doms && !defined($config{'backup_feature_all'})) {
$config{'backup_feature_all'} = 1;
&save_module_config();
}
# Build quick domain-lookup maps
&build_domain_maps();
# If supported by OpenSSH, create a group of users to deny SSH for
if (&foreign_installed("sshd")) {
# Add to SSHd config
&foreign_require("sshd", "sshd-lib.pl");
local $conf = &sshd::get_sshd_config();
local @denyg = &sshd::find_value("DenyGroups", $conf);
local $commas = $sshd::version{'type'} eq 'ssh' &&
$sshd::version{'number'} >= 3.2;
if ($commas) {
@denyg = split(/,/, $denyg[0]);
}
if (&indexof($denied_ssh_group, @denyg) < 0) {
push(@denyg, $denied_ssh_group);
&sshd::save_directive("DenyGroups", $conf,
join($commas ? "," : " ", @denyg));
&flush_file_lines($sshd::config{'sshd_config'});
&sshd::restart_sshd();
}
# Create the actual group, if missing
&require_useradmin();
local @allgroups = &list_all_groups();
local ($group) = grep { $_->{'group'} eq $denied_ssh_group } @allgroups;
if (!$group) {
local (%gtaken, %ggtaken);
&build_group_taken(\%gtaken, \%ggtaken, \@allgroups);
$group = { 'group' => $denied_ssh_group,
'members' => '',
'gid' => &allocate_gid(\%gtaken) };
&foreign_call($usermodule, "lock_user_files");
&foreign_call($usermodule, "set_group_envs", $group,
'CREATE_GROUP');
&foreign_call($usermodule, "making_changes");
&foreign_call($usermodule, "create_group", $group);
&foreign_call($usermodule, "made_changes");
&foreign_call($usermodule, "unlock_user_files");
}
}
&build_denied_ssh_group();
if ($virtualmin_pro) {
# Create the cron job for sending in script ratings
local $job = &find_virtualmin_cron_job($ratings_cron_cmd);
if (!$job) {
# Create, and run for the first time
$job = { 'mins' => int(rand()*60),
'hours' => int(rand()*24),
'days' => '*',
'months' => '*',
'weekdays' => '*',
'user' => 'root',
'active' => 1,
'command' => $ratings_cron_cmd };
&cron::create_cron_job($job);
&cron::create_wrapper($ratings_cron_cmd, $module_name,
"sendratings.pl");
&execute_command($ratings_cron_cmd);
}
}
# Create the cron job for collecting system info
local $job = &find_virtualmin_cron_job($collect_cron_cmd);
if (!$job) {
# Create, and run for the first time
$job = { 'mins' => '0,5,10,15,20,25,30,35,40,45,50,55',
'hours' => '*',
'days' => '*',
'months' => '*',
'weekdays' => '*',
'user' => 'root',
'active' => 1,
'command' => $collect_cron_cmd };
&cron::create_cron_job($job);
&cron::create_wrapper($collect_cron_cmd, $module_name,
"collectinfo.pl");
}
# Decide if sub-domains should be allowed, by checking if any exist
if ($config{'allow_subdoms'} eq '') {
local @subdoms = grep { $_->{'subdom'} } &list_domains();
$config{'allow_subdoms'} = @subdoms ? 1 : 0;
&save_module_config();
}
# Create the cron job for killing orphan php*-cgi processes
if ($virtualmin_pro) {
local $job = &find_virtualmin_cron_job($fcgiclear_cron_cmd);
if (!$job) {
# Create, and run for the first time
$job = { 'mins' => '0',
'hours' => '*',
'days' => '*',
'months' => '*',
'weekdays' => '*',
'user' => 'root',
'active' => 1,
'command' => $fcgiclear_cron_cmd };
&cron::create_cron_job($job);
&cron::create_wrapper($fcgiclear_cron_cmd, $module_name,
"fcgiclear.pl");
}
}
# Add ftp user to the groups for all domains that have FTP enabled
foreach my $d (&list_domains()) {
if ($d->{'ftp'}) {
local $ftp_user = &get_proftpd_user($d);
if ($ftp_user) {
&add_user_to_domain_group($d, $ftp_user, undef);
}
}
}
}
syntax highlighted by Code2HTML, v. 0.9.1