#!/usr/local/bin/perl -w
###########################################
# minimail - Tunnel-opening SMTP daemon
# Mike Schilli, 2010 (m@perlmeister.com)
###########################################
use strict;
use Sysadm::Install qw(:all);
use App::Daemon qw(daemonize);
use Log::Log4perl qw(:easy);

BEGIN {
  sudo_me();
  $App::Daemon::as_user = "root";
  $App::Daemon::logfile = 
                     "/var/log/minimail.log";
  $App::Daemon::loglevel = $INFO;
  daemonize();
};

use POE;
use PoCoForwarder;
use PoCoTimedProcess;

my $port_from      = 25;
my $port_to        = 25;
my $tunnel_port    = 1025;
my $real_smtp_host = 'host.provider.com';

my $process = PoCoTimedProcess->new(
  heartbeat => 10,
  timeout   => int(rand(25)) + 10,
  command   => ["ssh", '-N', '-L', 
    "$tunnel_port:localhost:$port_to", 
    $real_smtp_host],
);

my $forwarder = PoCoForwarder->new(
    port_from => $port_from,
    port_to   => $tunnel_port,
    port_bound => sub {
       INFO "Dropping privileges";
       $< = $> = getpwnam($ENV{SUDO_USER});
    },
    client_connect => sub {
      $process->launch();
    },
);

$process->spawn();
$poe_kernel->run();
