use 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); }