#!/usr/local/bin/perl
# Update both enabled core features and plugin modules

require './virtual-server-lib.pl';
&error_setup($text{'features_err'});
&can_edit_templates() || &error($text{'features_ecannot'});
&ReadParse();

# Validate plugins
@newplugins = split(/\0/, $in{'mods'});
foreach $p (@newplugins) {
	&foreign_require($p, "virtual_feature.pl");
	$err = &plugin_call($p, "feature_check");
	$name = &plugin_call($p, "feature_name");
	if ($err) {
		&error(&text('newplugin_emod', $name, $err));
		}
	}

# Work out which plugins are not on by default
%active = map { $_, 1 } split(/\0/, $in{'active'});
foreach $p (split(/\0/, $in{'allplugins'})) {
	push(@inactive, $p) if (!$active{$p});
	}

# Update module config with features and plugins
%factive = map { $_, 1 } split(/\0/, $in{'factive'});
%fselected = map { $_, 1 } split(/\0/, $in{'fmods'});
foreach $f (@features) {
	if (&indexof($f, @vital_features) >= 0) {
		# Features that are never disabled can only be switched
		# to be not selected by default
		$config{$f} = $factive{$f} ? 3 : 1;
		}
	else {
		# Other features may be active, active but not selected by
		# default, or disabled
		if (!$fselected{$f}) {
			# Totally disabled
			$config{$f} = 0;
			}
		elsif ($factive{$f}) {
			# Enabled by default
			if ($f eq "logrotate" && $config{$f} != 1) {
				# For logrotate, use always mode unless the user
				# had it on enabled but optional
				$config{$f} = 3;
				}
			else {
				$config{$f} = 1;
				}
			}
		else {
			# Enabled, but not on by default
			$config{$f} = 2;
			}
		}
	}
$oldplugins = $config{'plugins'};
$config{'plugins'} = join(" ", @newplugins);
$config{'plugins_inactive'} = join(" ", @inactive);

# Validate new settings with a config check
@plugins = @newplugins;
&set_all_null_print();
$cerr = &check_virtual_server_config();
&error($cerr) if ($cerr);

# Update the procmail setting for default delivery, turn on logging, and 
# create cron job to link up files
if ($config{'spam'}) {
	&setup_lookup_domain_daemon();
	&setup_default_delivery();
	&enable_procmail_logging();
	&setup_spam_config_job();
	}

# Fix up old procmail scripts that don't call the clam wrapper
if ($config{'virus'}) {
	&fix_clam_wrapper();
	}

# Save the config
&lock_file($module_config_file);
if ($config{'last_check'} < time()) {
	$config{'last_check'} = time()+1;
	}
&save_module_config();
&unlock_file($module_config_file);

# Update the miniserv preload list, which includes plugins
if ($oldplugins ne $config{'plugins'}) {
	&update_miniserv_preloads($config{'preload_mode'});
	&restart_miniserv();
	}

&webmin_log("features");
&redirect("");

