getUlimitValues() function sending linux commands to windows

6 posts by 2 authors in: Forums > CMS Builder
Last Post: August 16, 2011   (RSS)

By ITI - August 11, 2011

file: lib/menus/admin/actionHandler.php
function: getUlimitValues()

When CMSB is installed on Windows the following can appear pretty much any where on the "Admin > General Settings" page:
'sh' is not recognized as an internal or external command, operable program or batch file.
This line of text will appear (but not always) anywhere on the page or as the value of input field etc...
In some cases the error isn't actually visible but it's enough to prevent some actions like clicking on buttons.

Partial snippet:
if ($type == 'soft') { $cmd = 'sh -c "ulimit -a -S"'; }
...
// get output
$output = @shell_exec($cmd);


Since "shell_exec()" is succeeding correctly, suppressing the error with the "@" symbol doesn't work because this isn't a php error.
You know its a Linux command so it shouldn't be sent to a Windows interpreter.

To correct this could you add some form of platform validation?
Here is what I have done to temporarily correct till you fix in the next release :)
function getUlimitValues($type = 'soft') {
$maxCpuSeconds = '';
$memoryLimitKbytes = '';
$maxProcessLimit = '';
$output = '';

// get shell command
if ($type == 'soft') { $cmd = 'sh -c "ulimit -a -S"'; }
elseif ($type == 'hard') { $cmd = 'sh -c "ulimit -a -H"'; }
else { die(__FUNCTION__ . ": type must be either hard or soft"); }

if(stripos($_SERVER['SERVER_SOFTWARE'],"Microsoft") === false){
// get output
$output = @shell_exec($cmd);
// parse output
if (preg_match("/^(time|cpu time).*?\s(\S*)$/m", $output, $matches))
{ $maxCpuSeconds = $matches[2]; }
if (preg_match("/^(data|data seg).*?\s(\S*)$/m", $output, $matches))
{ $dataSegLimit = $matches[2]; }
if (preg_match("/^(vmemory|virtual mem).*?\s(\S*)$/m", $output, $matches))
{ $vmemoryLimit = $matches[2]; }
if (preg_match("/^(concurrency|max user processes).*?\s(\S*)$/m", $output, $matches))
{ $maxProcessLimit = $matches[2]; }

if (@$vmemoryLimit > @$dataSegLimit) { $memoryLimitKbytes = @$vmemoryLimit; }
else { $memoryLimitKbytes = @$dataSegLimit; }
}
//
return array($maxCpuSeconds, $memoryLimitKbytes, $maxProcessLimit, $output);
}

Glen







http://www.CanadianDomainRegistry.ca







ITI Internetworking Technologies Inc.

Re: [ITI] getUlimitValues() function sending linux commands to windows

By Dave - August 11, 2011

Hi Glen,

Thanks for the bug report! What PHP version and windows version are you running? We develop on Windows but haven't seen that error to date.
Dave Edis - Senior Developer
interactivetools.com

Re: [Dave] getUlimitValues() function sending linux commands to windows

By ITI - August 11, 2011 - edited: August 11, 2011

Hi Dave
What PHP version and windows version are you running?


Operating System: Windows Server 2003 R2 Standard Edition
PHP Version: PHP v5.2.12

ps. A lot of times the error text is not visible but I would guess that it appears about 30% of the time and as I mentioned its not always the same place. The last time that it occured before I decided to investigate and fix it was when it showed up in the edit list of the "Restore Backup"

Select 'sh' is not recognized as an internal or external command, operable program or batch file. Select version to restore

Glen







http://www.CanadianDomainRegistry.ca







ITI Internetworking Technologies Inc.

Re: [ITI] getUlimitValues() function sending linux commands to windows

By Dave - August 15, 2011

Hi Glen,

That's really odd. shell_exec() actually shouldn't output any errors at all. It's only suppose to return any output and not even return error output unless STDERR is redirected to STDOUT.

I found a few PHP bugs that looked related but nothing conclusive:
https://bugs.php.net/bug.php?id=21065
https://bugs.php.net/bug.php?id=46399

Are you running anything particularly unique or different on the server?

Can you try the attached script and let me know what the output is? Maybe try refreshing a few times to see if you can get the extra error output to appear in the page somewhere.

I'm thinking the simple fix may be to just add 2>&1 to the end of the command to capture any error output. Even though it shouldn't be being output anyways maybe that would prevent the issue.

Let me know what you find out, thanks!
Dave Edis - Senior Developer
interactivetools.com

Re: [ITI] getUlimitValues() function sending linux commands to windows

By Dave - August 16, 2011

Ok, sounds good. I'll add 2>&1 for the next release.

Thanks!
Dave Edis - Senior Developer
interactivetools.com