work in progress, use run_server.php to startup a local webserver and browse to /ui/ pages locally, when -d is specified xdebug is enabled (slow, but functional).

This commit is contained in:
Ad Schellevis 2018-03-04 20:24:02 +01:00
parent 1709a6208f
commit 4e128da70f
8 changed files with 391 additions and 1 deletions

2
.gitignore vendored
View File

@ -5,3 +5,5 @@
*.sass-cache
*.volt.php
/.idea/
/config/config.php
/conf/config.xml

0
conf/.placeholder Normal file
View File

62
config/config.php.sample Normal file
View File

@ -0,0 +1,62 @@
<?php
/**
* Copyright (C) 2018 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
$conf = new \Phalcon\Config(array(
'application' => array(
'controllersDir' => '{plugin_directory}/src/opnsense/mvc/app/controllers/',
'modelsDir' => '{plugin_directory}/src/opnsense/mvc/app/models/',
'viewsDir' => '{plugin_directory}/src/opnsense/mvc/app/views/',
'libraryDir' => '.',
'cacheDir' => '{temp_directory}/cache',
'baseUri' => '/opnsense_gui/',
),
'globals' => array(
'config_path' => __DIR__ . '/../conf/',
'temp_path' => '/tmp/',
'debug' => false,
'simulate_mode' => true
),
'environment' => array(
/* php includes to add */
'includes' => array(
'.'
),
/* location of OPNsense core package */
'coreDir' => '{root_of_OPNsense_core_repo}',
)
));
// Add core views
if (strpos($conf->application->viewsDir, $conf->environment->coreDir) === false) {
$conf->application->viewsDir = array($conf->application->viewsDir,
"{$conf->environment->coreDir}/src/opnsense/mvc/app/views/"
);
}
return $conf;

81
public/.htrouter.php Normal file
View File

@ -0,0 +1,81 @@
<?php
/**
* Copyright (C) 2018 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
$uri = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
// handle local hosted files (js, css, etc)
$hosted_local_patterns = array();
$hosted_local_patterns[] = '/^\/ui\/css\/.*/';
$hosted_local_patterns[] = '/^\/ui\/fonts\/.*/';
$hosted_local_patterns[] = '/^\/ui\/js\/.*/';
$hosted_local_patterns[] = '/^\/ui\/img\/.*/';
$hosted_local_patterns[] = '/^\/ui\/themes\/.*/';
$hosted_local_patterns[] = '/^\favicon.*/';
foreach ($hosted_local_patterns as $pattern) {
if (preg_match($pattern, $uri)) {
if (strpos($uri, '/ui/') === 0) {
$path = __DIR__ . substr($uri, 3);
if (is_file($path)) {
$tmp_ext = explode('.', strtolower($path));
$mimeTypes = [
'css' => 'text/css',
'js' => 'application/javascript',
'jpg' => 'image/jpg',
'png' => 'image/png',
'map' => 'application/json'
];
if (isset($mimeTypes[$tmp_ext[count($tmp_ext)-1]])) {
header("Content-Type: {$mimeTypes[$tmp_ext[count($tmp_ext)-1]]}");
}
readfile($path);
return true;
}
return false;
}
return false;
}
}
// setup environment
global $DEV_WORKDIR;
$DEV_WORKDIR = getenv("DEV_WORKDIR"); // passed through from run_server
// set user to root for local testing
session_start();
$_SESSION["Username"]="root";
session_write_close();
if (preg_match("/^\/ui\/.*/", $uri)) {
$_GET['_url'] = substr($_SERVER['REQUEST_URI'], 3);
require_once "{$DEV_WORKDIR}/stubs/index.php";
} elseif (preg_match("/^\/api\/.*/", $uri)) {
$_GET['_url'] = substr($_SERVER['REQUEST_URI'], 4);
require_once "{$DEV_WORKDIR}/stubs/api.php";
} else {
return false;
}

75
run_server.php Normal file
View File

@ -0,0 +1,75 @@
<?php
/**
* Copyright (C) 2018 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
// construct "run server" command
$run_command = array();
$run_command[] = PHP_BINARY;
// enable xdebug when requested
if (in_array('-d', $argv)) {
$run_command[] = "-d xdebug.remote_autostart=1";
$run_command[] = "-d xdebug.remote_enable=1";
$run_command[] = "-d xdebug.remote_host=localhost";
$run_command[] = "-d xdebug.remote_port=9000";
$run_command[] = "-d xdebug.remote_handler=dbgp";
}
$config = include __DIR__ . "/config/config.php";
// copy our ht access router to the core www directory
copy(__DIR__ . '/public/.htrouter.php', "{$config->environment->coreDir}/src/opnsense/www/.htrouter.php");
// copy default config when there is no config found
if (!is_file("{$config->globals->config_path}/config.xml")) {
copy("{$config->environment->coreDir}/src/etc/config.xml.sample", "{$config->globals->config_path}/config.xml");
}
// gather php include paths and add to run command
$include_paths = array();
foreach ($config->environment->includes as $include) {
$include_paths[] = trim($include);
}
$run_command[] = '-d include_path="'.implode(':', $include_paths).'"';
// listen to localhost
$run_command[] = "-S localhost:8000";
// set document root
$run_command[] = str_replace('//', '/', "-t {$config->environment->coreDir}/src/opnsense/www");
// .htaccess alternative routing
$run_command[] = ".htrouter.php";
// set our working directory in the php environment in which the server runs
putenv("DEV_WORKDIR=".__DIR__);
// show executed command
$cmd_action = implode(' ', $run_command) ;
echo "{$cmd_action}\n";
exec($cmd_action);

68
stubs/api.php Normal file
View File

@ -0,0 +1,68 @@
<?php
/**
* Copyright (C) 2018 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
error_reporting(E_ALL);
try {
/**
* Read the configuration
*/
$config = include __DIR__ . "/../config/config.php";
/**
* Read auto-loader
*/
include __DIR__ . "/loader.php";
/**
* Read services
*/
include $config->environment->coreDir . "/src/opnsense/mvc/app/config/services_api.php";
/**
* local webserver might have moved Authorization header, move it back
*/
if (!empty($_SERVER['PHP_AUTH_USER']) && !empty($_SERVER['PHP_AUTH_PW'])) {
$_SERVER['HTTP_AUTHORIZATION'] = "Basic " .base64_encode($_SERVER['PHP_AUTH_USER'].":".$_SERVER['PHP_AUTH_PW']);
}
/**
* Handle the request
*/
$application = new \Phalcon\Mvc\Application($di);
echo $application->handle()->getContent();
} catch (\Exception $e) {
$response = array();
$response['errorMessage'] = $e->getMessage();
header('HTTP', true, 500);
header("Content-Type: application/json;charset=utf-8");
echo htmlspecialchars(json_encode($response), ENT_NOQUOTES);
error_log($e);
}

59
stubs/index.php Normal file
View File

@ -0,0 +1,59 @@
<?php
/**
* Copyright (C) 2018 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
error_reporting(E_ALL);
try {
/**
* Read the configuration
*/
$config = include __DIR__ . "/../config/config.php";
/**
* Read auto-loader
*/
include __DIR__ . "/loader.php";
/**
* Read services
*/
include $config->environment->coreDir . "/src/opnsense/mvc/app/config/services.php";
/**
* Handle the request
*/
$application = new \Phalcon\Mvc\Application($di);
// always flush caches for local testing
(new \OPNsense\Base\Menu\MenuSystem())->invalidateCache();
(new \OPNsense\Core\ACL())->invalidateCache();
echo $application->handle()->getContent();
} catch (\Exception $e) {
echo $e->getMessage();
}

43
stubs/loader.php Normal file
View File

@ -0,0 +1,43 @@
<?php
/**
* Copyright (C) 2018 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
$loader = new \Phalcon\Loader();
/**
* We're a registering a set of directories taken from the configuration file
*/
$loader->registerDirs(
array(
$config->application->controllersDir,
$config->application->modelsDir,
$config->application->libraryDir,
"{$config->environment->coreDir}/src/opnsense/mvc/app/controllers",
"{$config->environment->coreDir}/src/opnsense/mvc/app/models",
"{$config->environment->coreDir}/src/opnsense/mvc/app/library",
)
)->register();