All pastes #754414 Raw Edit

v0.0.1 useradmin client

public text v1 · immutable
#754414 ·published 2007-10-29 23:51 UTC
rendered paste body
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);
}