OpenSource CLI-App to install and handle stuff related to Web-Server
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.

194 lines
4.5 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. <?php
  2. namespace App\Helpers;
  3. /**
  4. * hande nginx vhosts
  5. *
  6. * @author Björn Hase, Tentakelfabrik
  7. * @license http://opensource.org/licenses/MIT The MIT License
  8. * @link https://gitea.tentakelfabrik.de/Tentakelfabrik/mcp
  9. *
  10. */
  11. class NginxVhostHelper
  12. {
  13. // path for available files
  14. const SITES_AVAILABLE = '/etc/nginx/sites-available';
  15. // path for enabled files
  16. const SITES_ENABLED = '/etc/nginx/sites-enabled';
  17. // regex to get files for
  18. const REGEX_SSL_CERTIFICATE = '/\bssl_certificate\s+\K\S+/';
  19. const REGEX_SSL_CERTIFICATE_KEY = '/\bssl_certificate_key\s+\K\S+/';
  20. // ignore files
  21. const IGNORE_FILES = [
  22. '.', '..'
  23. ];
  24. /**
  25. * get sites that are in sites-available
  26. *
  27. *
  28. * @return array
  29. *
  30. */
  31. private function getSitesAvailable()
  32. {
  33. return scandir(self::SITES_AVAILABLE);
  34. }
  35. /**
  36. * get sites that are in sites-enabled
  37. *
  38. *
  39. * @return array
  40. *
  41. */
  42. private function getSitesEnabled()
  43. {
  44. return scandir(self::SITES_ENABLED);
  45. }
  46. /**
  47. * find path for certificates in .conf-files
  48. *
  49. *
  50. * ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
  51. * ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;
  52. *
  53. * @param string $filename
  54. *
  55. */
  56. private function getCertificate($path)
  57. {
  58. $result = [
  59. 'ssl' => false,
  60. 'ssl_certificate_exists' => false,
  61. 'ssl_certificate_expired_at' => false
  62. ];
  63. // getting .conf-file
  64. $content = file_get_contents($path);
  65. // check for path of sites
  66. preg_match(self::REGEX_SSL_CERTIFICATE, $content, $certificates);
  67. $matches = array_merge([], $certificates);
  68. preg_match(self::REGEX_SSL_CERTIFICATE_KEY, $content, $certificates);
  69. $matches = array_merge($matches, $certificates);
  70. // check ssl certificates
  71. if (count($matches) >= 2) {
  72. $result['ssl'] = true;
  73. // @TODO find a regex that ignore the ";"
  74. foreach($matches as $index => $match) {
  75. $matches[$index] = str_replace(';', '', $match);
  76. }
  77. if (file_exists($matches[0]) && file_exists($matches[1])) {
  78. $result['ssl_certificate_exists'] = true;
  79. }
  80. // getting expired
  81. exec('openssl x509 -noout -dates -in '.$matches[0], $openssl);
  82. var_dump($openssl); die();
  83. if (isset($openssl[1])) {
  84. $openssl = str_replace('notAfter=', '', $openssl[1]);
  85. }
  86. }
  87. return $result;
  88. }
  89. /**
  90. *
  91. * @return
  92. */
  93. private function getRedirect($path, $domain)
  94. {
  95. // getting .conf-file
  96. $content = file_get_contents($path);
  97. // result
  98. $result = false;
  99. preg_match('/server_name www.'.$domain.'/', $content, $matches);
  100. if (count($matches) > 0) {
  101. $result = true;
  102. }
  103. return $result;
  104. }
  105. /**
  106. * get vhost
  107. *
  108. * @param string $filename
  109. * @param array $enabled
  110. * @return array
  111. */
  112. private function getVhost($filename, $enabled)
  113. {
  114. // getting full path
  115. $path = self::SITES_AVAILABLE.'/'.$filename;
  116. // getting certificates from a configuration
  117. $certificate = $this->getCertificate($path);
  118. // domain
  119. $domain = str_replace('.conf', '', $filename);
  120. $result = array_merge([
  121. 'domain' => $domain,
  122. 'path' => $path,
  123. 'file' => $filename,
  124. 'redirect_www' => $this->getRedirect($path, $domain),
  125. 'enabled' => in_array($filename, $enabled),
  126. ], $certificate);
  127. return $result;
  128. }
  129. /**
  130. * find single vhost by filename
  131. *
  132. * @param string $filename
  133. * @return array
  134. */
  135. public function findOneByFilename($filename)
  136. {
  137. // getting enabled
  138. $enabled = $this->getSitesEnabled();
  139. return $this->getVhost($filename, $enabled);
  140. }
  141. /**
  142. * find all vhost
  143. *
  144. * @return array
  145. */
  146. public function find()
  147. {
  148. $results = [];
  149. // getting available
  150. $available = $this->getSitesAvailable();
  151. // getting enabled
  152. $enabled = $this->getSitesEnabled();
  153. foreach($available as $filename)
  154. {
  155. if (!in_array($filename, self::IGNORE_FILES)) {
  156. $results[] = $this->getVhost($filename, $enabled);
  157. }
  158. }
  159. return $results;
  160. }
  161. }