You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.9 KiB
95 lines
2.9 KiB
<?php
|
|
|
|
class CliServerModule extends Module {
|
|
var $prologue = "Run a CLI server for osTicket";
|
|
|
|
var $options = array(
|
|
'port' => array('-p','--port',
|
|
'default'=>'8000',
|
|
'help'=>'Specify the listening port number. Default is 8000',
|
|
),
|
|
'host' => array('-h','--host',
|
|
'default'=>'localhost',
|
|
'help'=>'Specify the bind address. Default is "localhost"',
|
|
),
|
|
);
|
|
|
|
function make_router() {
|
|
$temp = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
|
$router_path = $temp
|
|
. substr(md5('osticket-router'.getcwd()), -12)
|
|
. '.php';
|
|
|
|
// Ensure that the router file is cleaned up on exit
|
|
$cleanup = function() use ($router_path) {
|
|
@unlink($router_path);
|
|
};
|
|
if (function_exists('pcntl_signal'))
|
|
pcntl_signal(SIGINT, $cleanup);
|
|
|
|
// This will very likely not fire
|
|
register_shutdown_function($cleanup);
|
|
|
|
$fp = fopen($router_path, 'wt');
|
|
fwrite($fp, <<<EOF
|
|
<?php
|
|
\$full_path = \$_SERVER["DOCUMENT_ROOT"] . \$_SERVER["REQUEST_URI"];
|
|
# Ensure trailing slash on folders
|
|
if (is_dir(\$full_path)
|
|
&& rtrim(\$full_path, '/') == \$full_path
|
|
) {
|
|
header("Location: " . \$_SERVER["REQUEST_URI"] . '/');
|
|
}
|
|
elseif (file_exists(\$_SERVER['SCRIPT_FILENAME'])) {
|
|
return false;
|
|
}
|
|
// Support various dispatchers
|
|
elseif (\$offs = stripos(\$_SERVER["REQUEST_URI"], 'scp/apps/')) {
|
|
\$_SERVER["PATH_INFO"] = substr(\$_SERVER["REQUEST_URI"], \$offs + 8);
|
|
chdir('scp/');
|
|
require "apps/dispatcher.php";
|
|
}
|
|
elseif (\$offs = stripos(\$_SERVER["REQUEST_URI"], 'pages/')) {
|
|
\$_SERVER["PATH_INFO"] = substr(\$_SERVER["REQUEST_URI"], \$offs + 5);
|
|
require "pages/index.php";
|
|
}
|
|
elseif (\$offs = stripos(\$_SERVER["REQUEST_URI"], 'api/')) {
|
|
\$_SERVER["PATH_INFO"] = substr(\$_SERVER["REQUEST_URI"], \$offs + 3);
|
|
require "api/http.php";
|
|
}
|
|
EOF
|
|
);
|
|
fclose($fp);
|
|
|
|
return $router_path;
|
|
}
|
|
|
|
function run($args, $options) {
|
|
$router = $this->make_router();
|
|
$pipes = array();
|
|
$php = proc_open(
|
|
sprintf("php -S %s:%s -t %s %s", $options['host'], $options['port'],
|
|
ROOT_DIR, $router),
|
|
array(
|
|
1 => array('pipe', 'w'),
|
|
2 => array('pipe', 'w'),
|
|
), $pipes);
|
|
|
|
stream_set_blocking($pipes[1], 0);
|
|
stream_set_blocking($pipes[2], 0);
|
|
|
|
while (true) {
|
|
if (feof($pipes[1]) || feof($pipes[2])) {
|
|
fclose($pipes[1]);
|
|
fclose($pipes[2]);
|
|
break;
|
|
}
|
|
if ($block = fgets($pipes[1], 1024))
|
|
fwrite(STDOUT, $block);
|
|
if ($block = fgets($pipes[2], 1024))
|
|
fwrite(STDERR, $block);
|
|
usleep(100);
|
|
}
|
|
}
|
|
}
|
|
Module::register('serve', 'CliServerModule');
|