mirror of
https://github.com/cytopia/devilbox.git
synced 2024-12-23 14:42:25 +00:00
236 lines
5.0 KiB
PHP
236 lines
5.0 KiB
PHP
<?php
|
|
namespace devilbox;
|
|
|
|
/**
|
|
* @requires devilbox::Logger
|
|
*/
|
|
class Helper
|
|
{
|
|
|
|
/*********************************************************************************
|
|
*
|
|
* Statics
|
|
*
|
|
*********************************************************************************/
|
|
|
|
/**
|
|
* Environmental variables from PHP docker
|
|
* @var array
|
|
*/
|
|
private static $_env = null;
|
|
|
|
|
|
/**
|
|
* Hostname to IP addresses
|
|
* @var array
|
|
*/
|
|
private static $_ip_address = null;
|
|
|
|
|
|
/**
|
|
* Class instance
|
|
* @var object
|
|
*/
|
|
private static $_instance = null;
|
|
|
|
|
|
/**
|
|
* Generic singleton instance getter.
|
|
* Make sure to overwrite this in your class
|
|
* for a more complex initialization.
|
|
*
|
|
* @param string $hostname Hostname
|
|
* @param array $data Additional data (if required)
|
|
* @return object|null
|
|
*/
|
|
public static function getInstance()
|
|
{
|
|
if (self::$_instance === null) {
|
|
self::$_instance = new self();
|
|
}
|
|
return self::$_instance;
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************************
|
|
*
|
|
* Private constructor for singleton
|
|
*
|
|
*********************************************************************************/
|
|
|
|
/**
|
|
* DO NOT CALL ME!
|
|
* Use singleton getInstance() instead.
|
|
*/
|
|
private function __construct()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************************
|
|
*
|
|
* Public Helper Functions
|
|
*
|
|
*********************************************************************************/
|
|
|
|
/**
|
|
* Get Docker environment variables from docker-compose.yml
|
|
* Only values from php docker can be retrieved here, so make
|
|
* sure they are passed to it.
|
|
*
|
|
* Values are cached in static context.
|
|
*
|
|
* @param string $variable Variable name
|
|
* @return string Variable value
|
|
*/
|
|
public function getEnv($variable)
|
|
{
|
|
if (self::$_env === null) {
|
|
|
|
$output = array();
|
|
|
|
// Translate PHP Docker environmental variables to $ENV
|
|
exec('env', $output);
|
|
|
|
foreach ($output as $var) {
|
|
$tmp = explode('=', $var);
|
|
self::$_env[$tmp[0]] = $tmp[1];
|
|
}
|
|
|
|
}
|
|
if (!isset(self::$_env[$variable])) {
|
|
loadClass('Logger')->error('Environment variable not found: \''.$variable.'\'');
|
|
return null;
|
|
}
|
|
return self::$_env[$variable];
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve the IP address of the container.
|
|
*
|
|
* @return string|boolean IP address or false
|
|
*/
|
|
public function getIpAddress($hostname)
|
|
{
|
|
// Request was already done before and is cached
|
|
if (isset(self::$_ip_address[$hostname])) {
|
|
return self::$_ip_address[$hostname];
|
|
}
|
|
|
|
// New request, generic check
|
|
// Note the traiing dot to prevent recursive lookups
|
|
//$ip = $this->exec('ping -c 1 '.$hostname.'. 2>/dev/null | grep -Eo \'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\' | head -1');
|
|
$ip = gethostbyname($hostname.'');
|
|
|
|
if (filter_var($ip, FILTER_VALIDATE_IP) === false) {
|
|
//loadClass('Logger')->error('Retrieving the IP address of host \''.$hostname.'\' failed: '.$ip);
|
|
self::$_ip_address[$hostname] = false;
|
|
} else {
|
|
self::$_ip_address[$hostname] = $ip;
|
|
}
|
|
|
|
return self::$_ip_address[$hostname];
|
|
}
|
|
|
|
|
|
/**
|
|
* Shorter version to regex select a string.
|
|
*
|
|
* @param string $regex Regex
|
|
* @param string $string String to look in to
|
|
* @return bool|string Returns false on error otherwise the string
|
|
*/
|
|
public function egrep($regex, $string)
|
|
{
|
|
$match = array();
|
|
$error = preg_match($regex, $string, $match);
|
|
|
|
if ($error === false) {
|
|
loadClass('Logger')->error('Error matching regex: \''.$regex. '\' in string: \''.$string.'\'');
|
|
return false;
|
|
}
|
|
|
|
return isset($match[0]) ? $match[0] : false;
|
|
}
|
|
|
|
|
|
/**
|
|
* Executes shell commands on the PHP-FPM Host
|
|
*
|
|
* @param string $cmd Command
|
|
* @param integer $exit_code Reference to exit code
|
|
* @return string
|
|
*/
|
|
public function exec($cmd, &$exit_code = -1)
|
|
{
|
|
$output = array();
|
|
|
|
exec($cmd, $output, $exit_code);
|
|
return implode ("\n", $output);
|
|
}
|
|
|
|
|
|
public function redirect($url)
|
|
{
|
|
header('Location: '.$url);
|
|
exit;
|
|
}
|
|
|
|
|
|
/*********************************************************************************
|
|
*
|
|
* Login Helper Functions
|
|
*
|
|
*********************************************************************************/
|
|
|
|
public function login($username, $password)
|
|
{
|
|
$dvl_password = loadClass('Helper')->getEnv('DEVILBOX_UI_PASSWORD');
|
|
|
|
if ($username == 'devilbox' && $password == $dvl_password) {
|
|
$_SESSION['auth'] = 1;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
public function logout()
|
|
{
|
|
if (isset($_SESSION['auth'])) {
|
|
$_SESSION['auth'] = 0;
|
|
unset($_SESSION['auth']);
|
|
}
|
|
}
|
|
public function isLoginProtected()
|
|
{
|
|
// No password protection enabled
|
|
if (loadClass('Helper')->getEnv('DEVILBOX_UI_PROTECT') != 1) {
|
|
return false;
|
|
}
|
|
return true;
|
|
|
|
}
|
|
public function isloggedIn()
|
|
{
|
|
// No password protection enabled
|
|
if (!$this->isLoginProtected()) {
|
|
return true;
|
|
}
|
|
|
|
// Alredy logged in
|
|
if (isset($_SESSION['auth']) && $_SESSION['auth'] == 1) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
public function authPage()
|
|
{
|
|
if (!$this->isloggedIn()) {
|
|
$this->redirect('/login.php');
|
|
}
|
|
}
|
|
}
|