rendered paste bodyuse strict;
use warnings;
use IO::Socket;
my $log = undef;
#constants
my %CMNDS = (
'get_all' => \&cmd_get_all,
'login' => \&cmd_login,
'logout' => \&cmd_logout,
);
my $INCOM = new IO::Socket::INET (
LocalHost => $ENV{COMPUTERNAME},
LocalPort => '7070',
Proto => 'tcp',
Listen => 1,
ReuseAddr => 1,
);
my $reply = sub {
my $OUTGO = new IO::Socket::INET (
PeerAddr => $log,
PeerPort => '7070',
Proto => 'tcp',
);
die "Could not fold socks: $!\n" unless $OUTGO;
print $OUTGO shift;
close($OUTGO);
return 1;
};
#progrum
my $cmnd = intro();
while ($cmnd !~ /exit/io) {
my $in = $INCOM->accept();
chomp(my $msg = <$in>);
foreach my $regex (sort keys %CMNDS) {
if($msg =~ /^\s*($regex)(?:\s+(.*))?/i) {
$cmnd = $CMNDS{$1}->($2);
}
}
}
close($INCOM);
#coresubs
sub cmd_login {
$log = shift;
$reply->('1::Log in complete, awaiting commands.') and return 1 if $log;
return 0;
}
sub cmd_logout {
my $check = shift;
$reply->('0::Warning, you aren\'t logged in.') and return 0 if $check ne $log;
$log = undef;
$reply->('1::Log out complete.');
return 1;
}
sub cmd_get_all {
my $data = `net user`;
$data =~ s/\n/ /g;
$data =~ s/\s+/ /g;
$data =~ s/^.*-+\s(.*)/$1/;
$data =~ s/(.*)\sThe command completed successfully\..*/$1/;
$data =~ s/\s+/:/g;
$data = '2::{' . $data . '}' . $ENV{COMPUTERNAME};
$reply->($data) and return 1;
}
#microsubs
sub intro {
print curti(), " Dean's multibox user admin client starting up.\n";
print curti(), " Listening for incomming connections.\n";
return 'start';
}
sub curti {
my @time = @{[ gmtime ]}[2,1,0];
$time[0] = $time[0]-6 < 0 ? $time[0]+6 : $time[0]-6;
return sprintf('%02d:%02d:%02d', @time);
}