getEnv('HTTPD_DOCROOT_DIR');
$docroot = $this->_docRoot . DIRECTORY_SEPARATOR . $vhost . DIRECTORY_SEPARATOR . $htdocs;
$domain = $vhost . '.' . $this->getTldSuffix();
$url = 'http://'.$domain;
$error = array();
// 1. Check htdocs folder
if (!$this->_is_valid_dir($docroot)) {
$error[] = 'error';
$error[] = 'Missing '.$htdocs.' directory in: '.loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vhost.'/';
}
// 2. Check internal DNS server
$err = false;
if (!$this->canConnect($err, $domain)) {
$error[] = 'warning';
$error[] = 'DNS server not running.
You won\'t be able to work inside the PHP container.';
}
if (is_array($error) && count($error)) {
return implode('
', $error);
} else {
return '';
}
}
/**
* Get all mass virtual Hosts by directories
*
* @return mixed[]
*/
public function getVirtualHosts()
{
$docRoot = $this->_docRoot;
$vhosts = array();
if ($handle = opendir($docRoot)) {
while (false !== ($directory = readdir($handle))) {
if ($this->_is_valid_dir($docRoot . DIRECTORY_SEPARATOR . $directory) && $directory != '.' && $directory != '..') {
$vhosts[$directory] = array(
'name' => $directory,
'domain' => $directory .'.' . $this->getTldSuffix(),
'href' => 'http://' . $directory . '.' . $this->getTldSuffix()
);
}
}
}
ksort($vhosts);
return $vhosts;
}
public function getTldSuffix()
{
return loadClass('Helper')->getEnv('TLD_SUFFIX');
}
/**
* Get HTTP port.
*
* @return string
*/
public function getPort()
{
$port = loadClass('Helper')->getEnv('HOST_PORT_HTTPD');
if ( empty($port) ) {
return '';
}
if ( $port == 80 ) {
return '';
}
return ":$port";
}
/*********************************************************************************
*
* Interface required functions
*
*********************************************************************************/
private $_can_connect = array();
private $_can_connect_err = array();
public function canConnect(&$err, $hostname, $data = array())
{
$err = false;
// Return if already cached
if (isset($this->_can_connect[$hostname])) {
// Assume error for unset error message
$err = isset($this->_can_connect_err[$hostname]) ? $this->_can_connect_err[$hostname] : true;
return $this->_can_connect[$hostname];
}
// Silence errors and try to connect
$url = 'http://'.$hostname.'/'.$GLOBALS['DEVILBOX_API_PAGE'];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 0) {
$err = 'Failed to connect to Httpd host on '.$hostname;
$this->_can_connect[$hostname] = false;
} else {
$this->_can_connect[$hostname] = true;
}
$this->_can_connect_err[$hostname] = $err;
return $this->_can_connect[$hostname];
}
public function getName($default = 'Httpd')
{
$name = loadClass('Helper')->egrep('/[a-zA-Z0-9]+/', $_SERVER['SERVER_SOFTWARE']);
if (!$name) {
loadClass('Logger')->error('Could not get Httpd name');
return $default;
}
return $name;
}
public function getVersion()
{
$version = loadClass('Helper')->egrep('/[.0-9]+/', $_SERVER['SERVER_SOFTWARE']);
if (!$version) {
loadClass('Logger')->error('Could not get Httpd version');
return '';
}
return $version;
}
public function getVhostgenTemplateName()
{
$httpd = strtolower($this->getName());
if ($httpd == 'nginx') {
return 'nginx.yml';
}
$version = $this->getVersion();
if (preg_match('/^2\.2.*/', $version)) {
return 'apache22.yml';
} elseif (preg_match('/^2\.4.*/', $version)) {
return 'apache24.yml';
} else {
return false;
}
}
public function getVhostgenTemplatePath($vhost)
{
if (!($name = $this->getVhostgenTemplateName())) {
return false;
}
$dir = loadClass('Helper')->getEnv('HTTPD_TEMPLATE_DIR');
$cfg = '/shared/httpd/'.$vhost.'/'.$dir.'/'.$name;
if (is_file($cfg)) {
return $cfg;
}
return false;
}
/*********************************************************************************
*
* Private functions
*
*********************************************************************************/
/**
* Check if the directory exists or
* in case of a symlink the target is an
* existing directory.
*
* @param string $path The path.
* @return boolean
*/
private function _is_valid_dir($path)
{
return (is_dir($path) || (is_link($path) && is_dir(readlink($path))));
}
}