/src/_h5ai/private/php/core/class-setup.php
https://gitlab.com/billyprice1/h5ai · PHP · 185 lines · 151 code · 34 blank · 0 comment · 18 complexity · 3f0bfce23796c371d15f7b61157362de MD5 · raw file
- <?php
- class Setup {
- private $store;
- private $refresh;
- public function __construct($refresh = false) {
- $this->store = [];
- $this->refresh = $refresh;
- $this->add_globals_and_envs();
- $this->add_php_checks();
- $this->add_app_metadata();
- $this->add_server_metadata_and_check();
- $this->add_paths();
- $this->add_sys_cmd_checks();
- }
- private function set($key, $value) {
- if (array_key_exists($key, $this->store)) {
- Logger::log('setup key already taken', [
- 'key' => $key,
- 'value' => $value,
- 'found' => $this->store[$key]
- ]);
- exit;
- }
- if (!is_string($value) && !is_bool($value)) {
- Logger::log('setup value neither string nor boolean', [
- 'key' => $key,
- 'value' => $value
- ]);
- exit;
- }
- $this->store[$key] = $value;
- }
- public function get($key) {
- if (!array_key_exists($key, $this->store)) {
- Logger::log('setup key not found', ['key' => $key]);
- exit;
- }
- return $this->store[$key];
- }
- private function add_globals_and_envs() {
- $this->set('PHP_VERSION', PHP_VERSION);
- $this->set('MIN_PHP_VERSION', MIN_PHP_VERSION);
- $this->set('PHP_ARCH', (PHP_INT_SIZE * 8) . '-bit');
- $this->set('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']);
- $this->set('REQUEST_HREF', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
- $this->set('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
- $this->set('SERVER_SOFTWARE', $_SERVER['SERVER_SOFTWARE']);
- $this->set('HTTP_USER_AGENT', $_SERVER['HTTP_USER_AGENT']);
- }
- private function add_php_checks() {
- $this->set('HAS_PHP_EXIF', function_exists('exif_thumbnail'));
- $has_php_jpeg = false;
- if (function_exists('gd_info')) {
- $infos = gd_info();
- $has_php_jpeg = array_key_exists('JPEG Support', $infos) && $infos['JPEG Support'];
- }
- $this->set('HAS_PHP_JPEG', $has_php_jpeg);
- }
- private function add_app_metadata() {
- $this->set('NAME', 'h5ai');
- $this->set('VERSION', H5AI_VERSION);
- $this->set('FILE_PREFIX', '_h5ai');
- }
- private function add_server_metadata_and_check() {
- $server_software = $this->get('SERVER_SOFTWARE');
- $server_name = null;
- $server_version = null;
- if ($server_software && preg_match('#^(.*?)(?:/(.*?))?(?: |$)#', strtolower($server_software), $matches)) {
- $server_name = $matches[1];
- $server_version = count($matches) > 2 ? $matches[2] : '';
- }
- $this->set('SERVER_NAME', $server_name);
- $this->set('SERVER_VERSION', $server_version);
- $this->set('HAS_SERVER', in_array($server_name, ['apache', 'lighttpd', 'nginx', 'cherokee']));
- }
- private function add_paths() {
- $script_name = $this->get('SCRIPT_NAME');
- if ($this->get('SERVER_NAME') === 'lighttpd') {
- $script_name = preg_replace('#^.*?//#', '/', $script_name);
- }
- $this->set('H5AI_HREF', Util::normalize_path(dirname(dirname($script_name)), true));
- $this->set('H5AI_PATH', Util::normalize_path(dirname(dirname(dirname(dirname(__FILE__)))), false));
- $this->set('ROOT_HREF', Util::normalize_path(dirname($this->get('H5AI_HREF')), true));
- $this->set('ROOT_PATH', Util::normalize_path(dirname($this->get('H5AI_PATH')), false));
- $this->set('PUBLIC_HREF', Util::normalize_path($this->get('H5AI_HREF') . '/public/', true));
- $this->set('PUBLIC_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/public/', false));
- $this->set('INDEX_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/index.php', false));
- $this->set('CACHE_PUB_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/cache', true));
- $this->set('CACHE_PUB_PATH', Util::normalize_path($this->get('PUBLIC_PATH') . '/cache', false));
- $this->set('HAS_WRITABLE_CACHE_PUB', @is_writable($this->get('CACHE_PUB_PATH')));
- $this->set('PRIVATE_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/private', false));
- $this->set('CONF_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/conf', false));
- $this->set('CACHE_PRV_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/cache', false));
- $this->set('HAS_WRITABLE_CACHE_PRV', @is_writable($this->get('CACHE_PRV_PATH')));
- }
- private function add_sys_cmd_checks() {
- $cmds_cache_path = Util::normalize_path($this->get('CACHE_PRV_PATH') . '/cmds.json', false);
- $cmds = Json::load($cmds_cache_path);
- if (sizeof($cmds) === 0 || $this->refresh) {
- $cmds['command'] = Util::exec_0('command -v command');
- $cmds['which'] = Util::exec_0('which which') || Util::exec_0('which which.exe');
- $cmd = false;
- if ($cmds['command']) {
- $cmd = 'command -v';
- } else if ($cmds['which']) {
- $cmd = 'which';
- }
- foreach (['avconv', 'convert', 'du', 'ffmpeg', 'gm', 'tar', 'zip'] as $c) {
- $cmds[$c] = ($cmd !== false) && (Util::exec_0($cmd . ' ' . $c) || Util::exec_0($cmd . ' ' . $c . '.exe'));
- }
- Json::save($cmds_cache_path, $cmds);
- }
- foreach ($cmds as $c => $has) {
- $this->set('HAS_CMD_' . strtoupper($c), $has);
- }
- }
- public function to_jsono($as_admin = false) {
- $keys = [
- 'PUBLIC_HREF',
- 'ROOT_HREF'
- ];
- if ($as_admin) {
- $keys = array_merge($keys, [
- 'VERSION',
- 'PHP_VERSION',
- 'MIN_PHP_VERSION',
- 'PHP_ARCH',
- 'HAS_PHP_EXIF',
- 'HAS_PHP_JPEG',
- 'SERVER_NAME',
- 'SERVER_VERSION',
- 'HAS_SERVER',
- 'INDEX_HREF',
- 'HAS_WRITABLE_CACHE_PUB',
- 'HAS_WRITABLE_CACHE_PRV',
- 'HAS_CMD_AVCONV',
- 'HAS_CMD_CONVERT',
- 'HAS_CMD_DU',
- 'HAS_CMD_FFMPEG',
- 'HAS_CMD_GM',
- 'HAS_CMD_TAR',
- 'HAS_CMD_ZIP'
- ]);
- }
- $jsono = ['AS_ADMIN' => $as_admin];
- foreach ($keys as $key) {
- $jsono[$key] = $this->get($key);
- }
- return $jsono;
- }
- }