#!/usr/pkg/bin/perl
# disable-proxy - Reverse/remove the configuration options set by enable-proxy.
use strict;
use warnings;
BEGIN { $Pod::Usage::Formatter = 'Pod::Text::Color'; }
use 5.010; # Version in CentOS 6

use Getopt::Long qw(:config permute pass_through);
use Pod::Usage;
use Term::ANSIColor qw(:constants);
use Fcntl qw( :flock );
use Sys::Hostname;

sub main {
    my %opt;
    GetOptions(
        'help|h' => \$opt{'help'},
        'config|c=s' => \$opt{'config'},
    );
    pod2usage(0) if ( $opt{'help'} );

    $opt{'config'} ||= "/etc/webmin";

    enable_proxy( \%opt );
    
    return 0;
}
exit main( \@ARGV ) if !caller(0);

sub enable_proxy {
    my ($optref) = @_;

    my @config_lines;
    my $file = "$optref->{'config'}/config";

    my $referer;
    if ($optref->{'referer'}) {
        $referer = $optref->{'referer'};
    } else {
        $referer = hostname;
    }

    # Setup Webmin
    if ($optref->{'prefix'}) {
        # Set'em up for proxying on https://domain.tld/prefix
        set_config('webprefix', '', $file);
        set_config('webprefix_noredir', '', $file);
        set_config('ssl_redirect', '1', "$optref->{'config'}/miniserv.conf");
        set_config('ssl', '1', "$optref->{'config'}/miniserv.conf");
    } else {
        # No prefix, just proxying at the root level: https://domain.tld/
        set_config('ssl_redirect', '1', "$optref->{'config'}/miniserv.conf");
        set_config('ssl', '1', "$optref->{'config'}/miniserv.conf");
    }

    # Setup the local web server?

    # Restart Webmin
    say "Restarting Webmin to apply changes...";
    system("$optref->{'config'}/restart");
    exit 0;
}

sub set_config {
    my ($key, $value, $file, $module, $force) = @_;
    $key or die RED, "An --option must be specified", RESET;

    my @config_lines;
    open my $fh, '+<', $file
      or die RED, "Unable to open $file", RESET;
    flock($fh, LOCK_EX) or die RED, "Unable to lock $file", RESET;
    chomp(@config_lines = <$fh>);
    # Change'em
    my $found = 0;
    my $exit_code = 0;
    # Validate it against the config.info if this is a module and
    if ($module && !$force) {
        validate_config_option($key, $value, $module);
    }
    for (@config_lines) {
        if (/^${key}=(.*)/) {
            s/^${key}=(.*)/${key}=${value}/;
            $found++;
        }
    }
    unless ($found > 0) {
        push(@config_lines, "$key=$value");
        $exit_code++;
    }
    # Write'em
    seek($fh, 0, 0);
    print $fh qq|$_\n| for @config_lines;
    close $fh;
}

sub root {
    my ($config) = @_;
    open(my $CONF, "<", "$config/miniserv.conf") || die RED,
        "Failed to open $config/miniserv.conf", RESET;
    my $root;
    while (<$CONF>) {
        if (/^root=(.*)/) {
            $root = $1;
        }
    }
    close($CONF);
    # Does the Webmin root exist?
    if ( $root ) {
        die "$root is not a directory. Is --config correct?" unless (-d $root);
    } else {
        # Try to guess where Webmin lives, since config file didn't know.
        die "Unable to determine Webmin installation directory from $ENV{'WEBMIN_CONFIG'}";
    }

    return $root;
}

1;

=pod

=head1 NAME

disable-proxy

=head1 DESCRIPTION

Disable proxy-related features in Webmin.

=head1 SYNOPSIS

disable-proxy [options]

=head1 OPTIONS

=over

=item --help, -h

Print this usage summary and exit.

=item --config, -c

Specify the full path to the Webmin configuration directory. Defaults to
C</etc/webmin>

=back

=head1 EXIT CODES

0 on success

non-0 on error

=head1 LICENSE AND COPYRIGHT

Copyright 2018 Jamie Cameron <jcameron@webmin.com>, Joe Cooper
<joe@virtualmin.com>.

