rendered paste body#!/usr/bin/perl
use strict;
use warnings;
use IO::Select;
use IO::Socket;
$|++;
my ($server_port,$server_ver,$server_userdb,$server_cfgpath,$server_event,$serve_escape,$server_info,$server_help,$server_masterpw,$server_ident); # Server based
my ($user_welcome); # User based
my ($client,$client_recv,$client_send); # Client based
my ($new,$addr,$tmp1,$tmp2,$tmp,$x,$server_cfg,$line); # Tmps etc...
my (@ready,@data,@USERS); # Arrays
## Error & OK Messages ###
my ($error_userfile,$error_serverstart,$error_send);
my ($ok_serverstart,$ok_oneuser,$ok_nouser,$ok_mooreuser,$ok_useraccess,$ok_send);
my ($msg_dbuserlist,$msg_dbuseraccess,$msg_dbuserdelok,$msg_dbuserdelerror,$msg_dbuseraddok,$msg_dbuseradderror,$msg_unkown,$msg_info,$msg_connect,$msg_disconnect,$msg_help);
if ($#ARGV==0)
{
if ($ARGV[0] =~ /^\s*(\w+\.\w+)\s*$/)
{
$server_cfg = $1;
}
else
{
cancel("Aborting... Valid Argumments? \nUsage: \<this file\> \<general file\>\n");
}
}
else
{
cancel("Aborting... Not enough Argumments for Runnings this File! \nUsage: \<this file\> \<general file\>\n");
}
$server_cfg = $ARGV[0];
$server_ver = 1337;
# Open Config Files (general,error,ok)
open(CONFIG, "<$server_cfg") or cancel("Can't open $server_cfg: $!\n");
@data = <CONFIG>;
foreach $line (@data)
{
if ($line =~ /^\s*Server User Database\s*\=\s*\"(.+)\"\s*$/) { $server_userdb = $1; }
if ($line =~ /^\s*Server TCP Port\s*\=\s*\"(.+)\"\s*$/) { $server_port = $1; }
if ($line =~ /^\s*Server Escape\s*\=\s*\"(.+)\"\s*$/) { $serve_escape = $1; }
if ($line =~ /^\s*User Welcome Message\s*\=\s*\"(.+)\"\s*$/) { $user_welcome = $1; }
if ($line =~ /^\s*Server Config Path\s*\=\s*\"(.+)\"\s*$/) { $server_cfgpath = $1; }
if ($line =~ /^\s*Server Event\s*\=\s*\"(.+)\"\s*$/) { $server_event = $1;}
if ($line =~ /^\s*Server Information\s*\=\s*\"(.+)\"\s*$/) { $server_info = $1; }
if ($line =~ /^\s*Server Help\s*\=\s*\"(.+)\"\s*$/) { $server_help = $1; }
if ($line =~ /^\s*Server Master Password\s*\=\s*\"(.+)\"\s*$/) { $server_masterpw = $1; }
if ($line =~ /^\s*Server Ident\s*\=\s*\"(.+)\"\s*$/) { $server_ident = $1; }
}
close(CONFIG);
open(CONFIG, "<".$server_cfgpath."".$server_event) or cancel("Can't open $server_event: $!\n");
@data = <CONFIG>;
foreach $line (@data)
{
if ($line =~ /^\s*Userfile\s*\=\s*\"(.+)\"\s*$/i) { $error_userfile = convert($1);}
if ($line =~ /^\s*Server Start Error\s*\=\s*\"(.+)\"\s*$/i) { $error_serverstart = convert($1);}
if ($line =~ /^\s*Server Start Ok\s*\=\s*\"(.+)\"\s*$/i) { $ok_serverstart = convert($1);}
if ($line =~ /^\s*One User Found\s*\=\s*\"(.+)\"\s*$/i) { $ok_oneuser = convert($1);}
if ($line =~ /^\s*Moore User Found\s*\=\s*\"(.+)\"\s*$/i) { $ok_mooreuser = convert($1);}
if ($line =~ /^\s*No User Found\s*\=\s*\"(.+)\"\s*$/i) { $ok_nouser = convert($1);}
if ($line =~ /^\s*Send User Access\s*\=\s*\"(.+)\"\s*$/i) { $ok_useraccess = convert($1);}
if ($line =~ /^\s*DB User List\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuserlist = convert($1);}
if ($line =~ /^\s*DB User Access\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuseraccess = convert($1);}
if ($line =~ /^\s*DB User Del Ok\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuserdelok = convert($1);}
if ($line =~ /^\s*DB User Del Error\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuserdelerror = convert($1);}
if ($line =~ /^\s*DB User Add Ok\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuseraddok = convert($1);}
if ($line =~ /^\s*DB User Add Error\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuseradderror = convert($1);}
if ($line =~ /^\s*Unkown Request\s*\=\s*\"(.+)\"\s*$/i) { $msg_unkown = convert($1);}
if ($line =~ /^\s*Information\s*\=\s*\"(.+)\"\s*$/i) { $msg_info = convert($1);}
if ($line =~ /^\s*Help\s*\=\s*\"(.+)\"\s*$/i) { $msg_help = convert($1);}
if ($line =~ /^\s*Connect\s*\=\s*\"(.+)\"\s*$/i) { $msg_connect = convert($1);}
if ($line =~ /^\s*Disconnect\s*\=\s*\"(.+)\"\s*$/i) { $msg_disconnect = convert($1);}
if ($line =~ /^\s*Ok\s*\=\s*\"(.+)\"\s*$/i) { $ok_send = convert($1);}
if ($line =~ /^\s*Error\s*\=\s*\"(.+)\"\s*$/i) { $error_send = convert($1);}
}
close(CONFIG);
sub convert
{
if ($#_==0 or $#_ > 0)
{
my $tmp_convert_match;
my $tmp_convert = $_[0];
foreach $line (@_)
{
if ($line =~ /^\s*COUNTER\:(.*)/)
{
$tmp_convert_match = $1;
$tmp_convert =~ s/\%\%/$tmp_convert_match/g;
undef $tmp_convert_match;
}
if ($line =~ /^\s*USER_ADDR\:(.*)/)
{
$tmp_convert_match = $1;
$tmp_convert =~ s/\%USER_ADDR\%/$tmp_convert_match/g;
undef $tmp_convert_match;
}
if ($line =~ /^\s*USER_NAME\:(.*)/)
{
$tmp_convert_match = $1;
$tmp_convert =~ s/\%USER_NAME\%/$tmp_convert_match/g;
undef $tmp_convert_match;
}
if ($line =~ /^\s*USER_ACCESS\:(.*)/)
{
$tmp_convert_match = $1;
$tmp_convert =~ s/\%USER_ACCESS\%/$tmp_convert_match/g;
undef $tmp_convert_match;
}
if ($line =~ /^\s*STDIN\:(.*)/)
{
$tmp_convert_match = $1;
$tmp_convert =~ s/\%STDIN\%/$tmp_convert_match/g;
undef $tmp_convert_match;
}
}
$tmp_convert =~ s/\%SERVER_PORT\%/$server_port/g;
$tmp_convert =~ s/\%SERVER_VER\%/$server_ver/g;
return $tmp_convert;
}
else
{
return 0;
}
}
sub cancel
{
if ($#_==0)
{
$tmp = $_[0];
print "$tmp\n";
sleep 2;
exit;
}
else
{
return 0;
}
}
sub send_client
{
my $tmp_send_client;
if ($#_==1)
{
$tmp_send_client = $_[0];
print $tmp_send_client "$_[1]\r\n";
}
else
{
return 0;
}
undef $tmp_send_client;
}
sub send_client_file
{
if ($#_==1)
{
my $file = $_[1];
$tmp = $_[0];
open(FILE, "<".$server_cfgpath."".$file) or cancel("Can't open $file : $!\n");
@data = <FILE>;
foreach $line (@data)
{
chomp($line);
send_client($tmp,$line);
}
close(FILE);
}
else
{
return 0;
}
}
sub console
{
my $TIME_String;
if ($#_==0)
{
$tmp = $_[0];
$TIME_String = localtime(time);
if ($TIME_String =~ /(\d+\d+\:\d+\d+:\d+\d+)/)
{
print "\[$1\] $tmp\n";
}
undef $tmp;
}
else
{
return 0;
}
}
sub read_users
{
if ($#_==0)
{
my $userfile = $_[0];
my $line;
my (@USERS_TMP,@USERS_RETURN);
open(USER_FILE, "<$userfile") or cancel($error_userfile);
@USERS_TMP = <USER_FILE>;
foreach $line (@USERS_TMP)
{
if ($line =~ /^(.+)\;\;(\w+)\;\;(\d+)/)
{
push (@USERS_RETURN,$1);
}
}
close(USER_FILE);
return @USERS_RETURN;
}
else
{
return 0;
}
}
sub check_user_pw
{
if ($#_==2)
{
my $userfile = $_[0];
my $check_name = $_[1];
my $check_pw = $_[2];
my $line;
my (@USERS_TMP,@USERS_RETURN);
open(USER_FILE, "<$userfile") or cancel($error_userfile);
@USERS_TMP = <USER_FILE>;
foreach $line (@USERS_TMP)
{
if ($line =~ /^$check_name\;\;$check_pw\;\;/)
{
return 1;
}
}
close(USER_FILE);
}
else
{
return 0;
}
}
sub read_user_access
{
if ($#_==1)
{
my $userfile = $_[0];
my $search_user = $_[1];
my ($line,$tmp1,$tmp2);
my (@USERS_TMP,@USERS);
open(USER_FILE, "<$userfile") or cancel($error_userfile);
@USERS_TMP = <USER_FILE>;
foreach $line (@USERS_TMP)
{
if ($line =~ /^(.+)\;\;(\w+)\;\;(\d+)/)
{
$tmp2 = $1;
$tmp1 = $3;
if ($1 =~ /$search_user/i)
{
return ($tmp1,$tmp2);
}
}
}
close(USER_FILE);
return (0,0);
}
else
{
return 0;
}
}
sub user_add
{
if ($#_==3)
{
my ($userfile,$name,$pass,$right) = @_;
open(USER_FILE,">>$userfile") or cancel($error_userfile);
print USER_FILE "\n$name\;\;$pass\;\;$right";
close(USER_FILE);
return 1;
}
else
{
return 0;
}
}
sub user_del
{
if ($#_==1)
{
my (@USERS,@tmp);
my ($line,$state);
open(USER_FILE,$_[0]) or die cancel($error_userfile);
while (<USER_FILE>)
{
push @USERS, $_;
}
close(USER_FILE);
foreach $line (@USERS)
{
if (not($line =~ /^$_[1]\;\;(\w+)\;\;(\d+)/))
{
push (@tmp,$line);
}
else
{
$state = 1;
}
}
open(USER_FILE,">$_[0]") or cancel($error_userfile);
foreach $line (@tmp)
{
print USER_FILE $line;
}
close(USER_FILE);
if ($state)
{
return 1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
my $socket = new IO::Socket::INET(Listen => 1, LocalPort => $server_port);
my $sel = new IO::Select( $socket );
if ($socket)
{
console $ok_serverstart;
}
else
{
cancel($error_serverstart);
}
while(@ready = $sel->can_read)
{
foreach $client (@ready)
{
if($client == $socket)
{
# Create a new socket
$new = $socket->accept;
$sel->add($new);
$addr = $new->peerhost;
# push(@data,($addr,));
$tmp = convert($msg_connect,"USER_ADDR\:".$addr);
console $tmp;
send_client($new,$user_welcome);
}
else
{
$client_recv = <$client>;
if ($client_recv)
{
chomp($client_recv);
if ($client_recv =~ /^\s*info\s*$/i)
{
$tmp = convert($msg_info,"USER_ADDR\:".$addr);
console $tmp;
send_client_file($client,$server_info);
}
elsif ($client_recv =~ /^\s*help\s*$/i)
{
$tmp = convert($msg_help,"USER_ADDR\:".$addr);
console $tmp;
send_client_file($client,$server_help);
}
elsif ($client_recv =~ /^\s*dbuseraccess\s*(\w+)\s*$/i)
{
console "$addr Request: dbuseraccess (Database User Access Information)";
($tmp1,$tmp2) = read_user_access($server_userdb,$1);
if ($tmp1 and $tmp2)
{
$tmp = convert($ok_useraccess,"USER_NAME\:".$tmp2,"USER_ACCESS\:".$tmp1);
send_client($client,$tmp);
}
else
{
send_client($client,$ok_nouser);
}
}
elsif ($client_recv =~ /^\s*dbuserlist\s*$/i)
{
$tmp = convert($msg_dbuserlist,"USER_ADDR\:".$addr);
console $tmp;
@USERS = read_users($server_userdb);
$x = 0;
foreach $tmp (@USERS)
{
chomp ($tmp);
send_client($client,$tmp);
$x++;
}
if ($x < 1)
{
$tmp = convert($ok_nouser,"COUNTER\:".$x);
send_client($client,$tmp);
}
elsif ($x == 1)
{
$tmp = convert($ok_oneuser,"COUNTER\:".$x);
send_client($client,$tmp);
}
else
{
$tmp = convert($ok_mooreuser,"COUNTER\:".$x);
send_client($client,$tmp);
}
}
elsif ($client_recv =~ /^\s*dbuserdel\s*(\w+)\s*$/i)
{
my $tmp = user_del($server_userdb,$1);
if ($tmp)
{
$tmp = convert($ok_mooreuser,"COUNTER\:".$x);
send_client($client,$tmp);
$tmp = convert($msg_dbuserdelok,"USER_ADDR\:".$addr);
console $tmp;
}
else
{
$tmp = convert($ok_nouser,"COUNTER\:".$x);
send_client($client,$tmp);
$tmp = convert($msg_dbuserdelerror,"USER_ADDR\:".$addr);
console $tmp;
}
}
elsif ($client_recv =~ /^\s*dbuseradd\s*(\w+)\s*(\w+)\s*(\d+)\s*$/i)
{
my $tmp = user_add($server_userdb,$1,$2,$3);
if ($tmp)
{
send_client($client,$ok_send);
$tmp = convert($msg_dbuseraddok,"USER_ADDR\:".$addr);
console $tmp;
}
else
{
send_client($client,$error_send);
$tmp = convert($msg_dbuseradderror,"USER_ADDR\:".$addr);
console $tmp;
}
}
elsif ($client_recv eq "\r")
{
}
else
{
$tmp = convert($msg_unkown,"USER_ADDR\:".$addr);
console $tmp;
}
}
else
{
$tmp = convert($msg_disconnect,"USER_ADDR\:".$addr);
console $tmp;
$sel->remove($client);
$client->close;
}
}
}
}