Hi,
Hi, I have a problem when I turn the daemon and will perform several times a command by php script, a script crashes the system.
Throws an error:
fork() failed: Cannot allocate memory at Frontier/Daemon/Forking.pm line 40.
Maybe too many connections at once in php script?
Daemon:
use warnings;
use strict;
use Frontier::Daemon::Forking;
use Crypt::XXTEA;
use Cfg::Config;
use Unix::PasswdFile;
use MIME::Base64;
use constant DEMON_PASS => $Cfg::Config{demonpass};
use constant DEMON_PORT => $Cfg::Config{demonport};
print "Uruchamianie demona.\n";
my $demon = Frontier::Daemon::Forking->new(
methods => {
sprawdz => \&sprawdz,
instaluj => \&instaluj,
start => \&start,
stop => \&stop,
konsola => \&konsola,
send => \&send,
ftp => \&ftp,
reinstall => \&reinstall,
delete => \&delete,
status => \&status,
},
LocalPort => DEMON_PORT,
LocalAddr => '0.0.0.0',
) or die "Nie mozna uruchomic demona, sprobuj za chwile.\nKod bledu: $
+!";
sub decrypt_params
{
my @params;
foreach my $param (@_)
{
$param = decode_base64($param);
$param = Crypt::XXTEA::decrypt($param,DEMON_PASS);
$param = decode_base64($param);
return $param;
push(@params,$param);
}
return @params;
}
sub sprawdz
{
my ($spr) = @_;
my $sprawdz = decrypt_params($spr);
if($spr ne 'spr')
{
return 1;
}
return 0;
}
sub instaluj
{
my($katalogins, $loginftp, $hasloftp) = @_;
decrypt_params($katalogins);
decrypt_params($loginftp);
decrypt_params($hasloftp);
system("screen -A -m -d -S c".$loginftp." cp -r ".$katalogins." /home/
+srv".$loginftp."/;");
system("useradd -d /home/srv".$loginftp."/ ".$loginftp."");
my $pw = new Unix::PasswdFile "/etc/passwd";
$pw->passwd("".$loginftp."", $pw->encpass("".$hasloftp.""));
$pw->commit();
undef $pw;
}
sub start
{
my($katalog, $komenda, $loginftp) = @_;
decrypt_params($katalog);
decrypt_params($loginftp);
decrypt_params($komenda);
system("cd ".$katalog.";screen -A -m -d -L -S srv".$loginftp." ".$kome
+nda.";");
}
sub stop
{
my($loginftp) = @_;
decrypt_params($loginftp);
system("kill -3 `screen -list | grep srv".$loginftp." | cut -d . -f1`;
+");
system("screen -wipe;");
}
sub konsola
{
my ($loginftp) = @_;
decrypt_params($loginftp);
system("cd /home/srv".$loginftp.";rm screenlog;tail -n 200 screenlog.0
+ > screenlog;");
}
sub send
{
my ($loginftp, $komenda) = @_;
decrypt_params($loginftp);
decrypt_params($komenda);
system("screen -A -m -d -S tmp".$loginftp." screen -x srv".$loginftp."
+;");
sleep 1;
system("screen -s srv".$loginftp." -X stuff '".$komenda."
';");
system("kill -9 `screen -list | grep tmp".$loginftp." | cut -d . -f1`;
+");
}
sub ftp
{
my($loginftp, $hasloftp) = @_;
decrypt_params($loginftp);
decrypt_params($hasloftp);
my $pw = new Unix::PasswdFile "/etc/passwd";
$pw->passwd("".$loginftp."", $pw->encpass("".$hasloftp.""));
$pw->commit();
undef $pw;
}
sub reinstall
{
my($loginftp, $katalogins) = @_;
decrypt_params($katalogins);
decrypt_params($loginftp);
system("rm -r /home/srv".$loginftp."/ && cp -R ".$katalogins." /home/s
+rv".$loginftp."/;");
}
sub delete
{
my($loginftp) = @_;
decrypt_params($loginftp);
system("rm -r /home/srv".$loginftp."/;");
}
sub status
{
my($screen) = @_;
decrypt_params($screen);
my $stat = `screen -list | grep $screen`;
if ( $stat =~ /^\s*$/ )
{
return 0;
}
else
{
return 1;
}
}