File: //kunden/sbin/sendmail
#!/usr/bin/env perl
#
# sendmail wrapper to support multiple sendmail solutions in customer
# context (chroots) on infongs.
#
use strict;
use warnings;
use 5.010;
use Config::Tiny;
my $DEBUG = $ENV{UI_DEBUG} // 0;
use constant {
    CONFIGFILE => '/etc/ui-sendmail-wrapper.conf',
    EXITCODE => 127,
};
sub error {
    my $errmsg = shift;
    print STDERR "Error: $errmsg\n";
    exit EXITCODE;
}
sub debug {
    my $msg = shift;
    print STDERR "[DEBUG] $msg\n" if $DEBUG;
}
sub call {
    my @args = @_;
    my $cmd = shift @args;
    debug("Executing command: $cmd " . join(' ', @args));
    no warnings;
    exec { $cmd } "/usr/sbin/sendmail", @args  or  error("could not execute $cmd: $!");
}
##
## MAIN
##
#
# Read config file
my $config;
if (-r CONFIGFILE) {
    $config = Config::Tiny->read(CONFIGFILE)
        or error("could not read config from " . CONFIGFILE);
}
$config //= {};
#
# Initialize sendmail clients from config with defaults
my $msmtp_exe = $config->{msmtp}->{executable} // '/usr/bin/msmtp';
debug("Sendmail Clients: msmtp=$msmtp_exe");
#
# Get space owner (reverse uid lookup)
my $spaceowner;
{
    delete local @ENV{qw/USER LOGNAME/};  # this ensures we do not get back an account name
    $spaceowner = getpwuid($<) or error "could not resolve uid $<";
}
debug("Space Owner: $spaceowner");
#
# Get customer msmtp config
my $msmtp_configfile_pattern = ( $config->{msmtp}->{configfile_pattern}
                                     // '/homepages/config/smtp/msmtprc.%s' );
my $msmtp_customer_config = sprintf($msmtp_configfile_pattern, $spaceowner);
debug("Checking msmtp config file at $msmtp_customer_config.");
#
# Execute msmtp if customer msmtp config exists
if (-r $msmtp_customer_config) {
    debug("Config found. Will execute msmtp with custom config");
    call($msmtp_exe, "-C", $msmtp_customer_config, @ARGV);
}
else {
  error("This webspace is not enabled to use sendmail due to missing configuration.");
}
1;