#!/usr/bin/perl

# Copyright (C) 2014 Mikhael Goikhman <migo@freeshell.org>

use strict;
use warnings;
use sigtrap qw(die untrapped normal-signals  stack-trace any error-signals);

use Getopt::Long qw(:config no_ignore_case bundling);

use FindBin;
use lib "$FindBin::Bin/../lib";
use SMB::Proxy;

my $port = 445;
my $fifo_filename = undef;
my $quiet = 0;
my $verbose = 0;
my $username = undef;
my $password = undef;

sub show_usage (;$) {
	my $is_error = shift || 0;
	my $out = $is_error ? \*STDERR : \*STDOUT;
	my $usage = qq{
		Usage: $0 [OPTIONS] server.host.or.ip[:port]
		Start a simple SMB proxy forwarding traffic to the actual server

		Options:
			-h --help            show this usage
			-p --port PORT       use port different from the default $port
			-f --fifo FILENAME   use named file (fifo) file to listen on instead
			-q --quiet           do not show any messages
			-v --verbose         show more debug messages
			-U --username u[%p]  SMB server username and password (not used)
	};
	$usage =~ s/^\n//; $usage =~ s/^\t\t?//mg;
	print $out $usage;
	exit $is_error;
}

GetOptions(
	'h|help'       => sub { show_usage(0) },
	'p|port=i'     => \$port,
	'f|fifo=s'     => \$fifo_filename,
	'q|quiet'      => \$quiet,
	'v|verbose+'   => \$verbose,
	'U|username:s' => \$username,
) or show_usage(1);

sub prompt ($) {
	my $message = shift;

	$| = 1;
	print "$message: ";
	my $answer = <> || die "Cancelled\n";;
	chomp($answer);
	print "\n";

	return $answer;
}

my $server_addr = shift || show_usage(1);

# server username and password are not really needed for dumb SMB proxy
if ($username) {
	$password = $username =~ s/%(.*)$// ? $1 : undef;
	$password //= prompt("Enter password on server $server_addr for user '$username'");
}

my $proxy = SMB::Proxy->new(
	server_addr     => $server_addr,
	server_username => $username,
	server_password => $password,
	port            => $port,
	fifo_filename   => $fifo_filename,
	quiet           => $quiet,
	verbose         => $verbose,
);

$proxy->run;