]> git.mxchange.org Git - core.git/blobdiff - framework/main/classes/tools/console/class_ConsoleTools.php
Continued:
[core.git] / framework / main / classes / tools / console / class_ConsoleTools.php
index e783dad392eed4fc4d3f7ce53525070176bfcc1b..31be16e58418fff5adf4a000c5a41f6261d4f6e3 100644 (file)
@@ -1,21 +1,25 @@
 <?php
 // Own namespace
-namespace CoreFramework\Console\Tools;
+namespace Org\Mxchange\CoreFramework\Console\Tools;
 
 // Import framework stuff
-use CoreFramework\Configuration\FrameworkConfiguration;
-use CoreFramework\Factory\ObjectFactory;
-use CoreFramework\Filesystem\FileNotFoundException;
-use CoreFramework\Generic\FrameworkException;
-use CoreFramework\Object\BaseFrameworkSystem;
-use CoreFramework\Socket\InvalidSocketException;
+use Org\Mxchange\CoreFramework\Bootstrap\FrameworkBootstrap;
+use Org\Mxchange\CoreFramework\Factory\Object\ObjectFactory;
+use Org\Mxchange\CoreFramework\Filesystem\FileNotFoundException;
+use Org\Mxchange\CoreFramework\Generic\FrameworkException;
+use Org\Mxchange\CoreFramework\Object\BaseFrameworkSystem;
+use Org\Mxchange\CoreFramework\Socket\InvalidSocketException;
+
+// Import SPL stuff
+use \InvalidArgumentException;
+use \SplFileInfo;
 
 /**
  * This class contains static helper functions for console applications
  *
  * @author             Roland Haeder <webmaster@shipsimu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Hub Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2020 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.shipsimu.org
  *
@@ -35,7 +39,12 @@ use CoreFramework\Socket\InvalidSocketException;
 class ConsoleTools extends BaseFrameworkSystem {
        // Constants
        const HTTP_EOL = "\r\n";
-       const HTTP_USER_AGENT = 'ConsoleTools/1.0';
+       const HTTP_USER_AGENT = 'ConsoleTools/1.0.1';
+
+       /**
+        * Default is that this class is noisy
+        */
+       private static $quietResolver = FALSE;
 
        /**
         * Protected constructor
@@ -45,6 +54,9 @@ class ConsoleTools extends BaseFrameworkSystem {
        protected function __construct () {
                // Call parent constructor
                parent::__construct(__CLASS__);
+
+               // Cache configuration entry
+               self::$quietResolver = FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('quiet_dns_resolver');
        }
 
        /**
@@ -56,8 +68,14 @@ class ConsoleTools extends BaseFrameworkSystem {
                // Do we have cache?
                if (!isset($GLOBALS[__METHOD__])) {
                        // Determine it
-                       $GLOBALS[__METHOD__] = (($this->getConfigInstance()->getConfigEntry('proxy_host') != '') && ($this->getConfigInstance()->getConfigEntry('proxy_port') > 0));
-               } // END - if
+                       $GLOBALS[__METHOD__] = (
+                               (
+                                       FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('proxy_host') != ''
+                               ) && (
+                                       FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('proxy_port') > 0
+                               )
+                       );
+               }
 
                // Return cache
                return $GLOBALS[__METHOD__];
@@ -70,10 +88,23 @@ class ConsoleTools extends BaseFrameworkSystem {
         * @param       $port                           Port number to connect to
         * @param       $socketResource         Resource of a socket
         * @return      $response                       Response array
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected function setupProxyTunnel ($host, $port, $socketResource) {
+       protected function setupProxyTunnel (string $host, int $port, $socketResource) {
+               // Validate parameter
+               if (empty($host)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "host" is empty');
+               } elseif ($port < 1) {
+                       // Throw IAE
+                       throw new InvalidArgumentException(sprintf('port=%d is not valid', $port));
+               } elseif (!is_resource($socketResource)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException(sprintf('socketResource[]=%s is not valid', gettype($socketResource)));
+               }
+
                // Initialize array
-               $response = array('', '', '');
+               $response = ['', '', ''];
                $proxyTunnel = '';
 
                // Generate CONNECT request header
@@ -82,15 +113,15 @@ class ConsoleTools extends BaseFrameworkSystem {
                $proxyTunnel .= 'Proxy-Connection: Keep-Alive' . self::HTTP_EOL;
 
                // Use login data to proxy? (username at least!)
-               if ($this->getConfigInstance()->getConfigEntry('proxy_username') != '') {
+               if (FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('proxy_username') != '') {
                        // Add it as well
-                       $encodedAuth = base64_encode($this->getConfigInstance()->getConfigEntry('proxy_username') . ':' . $this->getConfigInstance()->getConfigEntry('proxy_password'));
+                       $encodedAuth = base64_encode(FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('proxy_username') . ':' . FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('proxy_password'));
                        $proxyTunnel .= 'Proxy-Authorization: Basic ' . $encodedAuth . self::HTTP_EOL;
-               } // END - if
+               }
 
                // Add last new-line
                $proxyTunnel .= self::HTTP_EOL;
-               //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONSOLE-TOOLS[' . __METHOD__ . ':' . __LINE__ . ']: proxyTunnel=' . $proxyTunnel);
+               //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONSOLE-TOOLS: proxyTunnel=' . $proxyTunnel);
 
                // Write request
                fwrite($socketResource, $proxyTunnel);
@@ -99,7 +130,7 @@ class ConsoleTools extends BaseFrameworkSystem {
                if (feof($socketResource)) {
                        // No response received
                        return $response;
-               } // END - if
+               }
 
                // Read the first line
                $resp = trim(fgets($socketResource, 10240));
@@ -107,7 +138,7 @@ class ConsoleTools extends BaseFrameworkSystem {
                if (((strtolower($respArray[0]) !== 'http/1.0') && (strtolower($respArray[0]) !== 'http/1.1')) || ($respArray[1] != '200')) {
                        // Invalid response!
                        return $response;
-               } // END - if
+               }
 
                // All fine!
                return $respArray;
@@ -118,8 +149,15 @@ class ConsoleTools extends BaseFrameworkSystem {
         *
         * @param       $rawData        Raw data from /etc/hostname file
         * @return      $hostname       Extracted host name
+        * @throws      InvalidArgumentException        If a parameter is not valid
         */
-       protected function extractHostnameFromRawData ($rawData) {
+       protected function extractHostnameFromRawData (string $rawData) {
+               // Validate parameter
+               if (empty($rawData)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "rawData" is empty');
+               }
+
                // Default is invalid
                $hostname = 'invalid';
 
@@ -135,7 +173,7 @@ class ConsoleTools extends BaseFrameworkSystem {
                        if (substr($line, 0, 1) == '#') {
                                // Then skip it
                                continue;
-                       } // END - if
+                       }
 
                        // Has an equals sign?
                        if (strpos($line, '=') !== false) {
@@ -146,14 +184,18 @@ class ConsoleTools extends BaseFrameworkSystem {
                                assert(count($hostData) == 2);
 
                                // Try to get it and abort
-                               $hostname = str_replace(array('"', chr(39)), array('', ''), $hostData[1]);
+                               $hostname = str_replace(
+                                       ['"', chr(39)],
+                                       ['', ''],
+                                       $hostData[1]
+                               );
                                break;
                        } else {
                                // Use it directly
                                $hostname = $line;
                                break;
                        }
-               } // END - foreach
+               }
 
                // Return it
                return $hostname;
@@ -165,14 +207,21 @@ class ConsoleTools extends BaseFrameworkSystem {
         *
         * @param       $hostname       Host name we shall resolve
         * @return      $ipAddress      IPv4 address resolved from host name
+        * @throws      InvalidArgumentException        If a parameter is not valid
         * @todo        This should be connected to a caching class to cache DNS requests
         */
-       public static function resolveIpAddress ($hostname) {
-               // Debug message
-               self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:] Host name to resolve is: %s',
-                       __CLASS__,
-                       $hostname
-               ));
+       public static function resolveIpAddress (string $hostname) {
+               // Validate parameter
+               if (empty($hostname)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "hostname" is empty');
+               } elseif (self::$quietResolver !== TRUE) {
+                       // Debug message
+                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:] Host name to resolve is: %s',
+                               __CLASS__,
+                               $hostname
+                       ));
+               }
 
                // Default is false
                $ipAddress = false;
@@ -187,7 +236,7 @@ class ConsoleTools extends BaseFrameworkSystem {
                         * other domain, basically.
                         */
                        $hostname .= '.';
-               } // END - if
+               }
 
                // Resolve it
                // @TODO Here should the cacher be implemented
@@ -198,11 +247,14 @@ class ConsoleTools extends BaseFrameworkSystem {
                        // Okay, this works!
                        $ipAddress = $ipResolved;
 
-                       // Debug message
-                       self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:] Resolved IP address is: %s',
-                               __CLASS__,
-                               $ipAddress
-                       ));
+                       // Quiet?
+                       if (self::$quietResolver !== TRUE) {
+                               // Debug message
+                               self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:] Resolved IP address is: %s',
+                                       __CLASS__,
+                                       $ipAddress
+                               ));
+                       }
                } else {
                        // Problem while resolving IP address
                        self::createDebugInstance(__CLASS__, __LINE__)->debugOutput(sprintf('[%s:] Problem resolving IP address for host %s. Please check your /etc/hosts file.',
@@ -221,16 +273,19 @@ class ConsoleTools extends BaseFrameworkSystem {
         *
         * @return      $ipAddress      Aquired IPv4 address
         */
-       public static function acquireSelfIPAddress () {
+       public static function acquireSelfIpAddress () {
                // Local IP by default
                $ipAddress = '127.0.0.1';
 
                // Get a new instance
                $helperInstance = new ConsoleTools();
 
+               // Get SplFileInfo instance
+               $infoInstance = new SplFileInfo(FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('hostname_file'));
+
                try {
                        // Get a file pointer
-                       $fileInstance = ObjectFactory::createObjectByConfiguredName('file_raw_input_class', array($helperInstance->getConfigInstance()->getConfigEntry('hostname_file')));
+                       $fileInstance = ObjectFactory::createObjectByConfiguredName('file_raw_input_class', array($infoInstance));
 
                        // Read the file
                        $rawData = trim($fileInstance->readFromFile());
@@ -267,9 +322,6 @@ class ConsoleTools extends BaseFrameworkSystem {
                        ));
                }
 
-               // Set it in configuration
-               FrameworkConfiguration::getSelfInstance()->setServerAddress($ipAddress);
-
                // Return it
                return $ipAddress;
        }
@@ -301,10 +353,10 @@ class ConsoleTools extends BaseFrameworkSystem {
                // Open connection
                if ($helperInstance->isProxyUsed() === true) {
                        // Resolve hostname into IP address
-                       $ipAddress = self::resolveIpAddress($helperInstance->getConfigInstance()->getConfigEntry('proxy_host'));
+                       $ipAddress = self::resolveIpAddress(FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('proxy_host'));
 
                        // Connect to host through proxy connection
-                       $socketResource = fsockopen($ipAddress, $helperInstance->getConfigInstance()->getConfigEntry('proxy_port'), $errorNo, $errorStr, 30);
+                       $socketResource = fsockopen($ipAddress, FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('proxy_port'), $errorNo, $errorStr, 30);
                } else {
                        // Connect to host directly
                        $socketResource = fsockopen('188.138.90.169', 80, $errorNo, $errorStr, 30);
@@ -314,7 +366,7 @@ class ConsoleTools extends BaseFrameworkSystem {
                if ($errorNo > 0) {
                        // Then throw again
                        throw new InvalidSocketException(array($helperInstance, $socketResource, $errorNo, $errorStr), BaseFrameworkSystem::EXCEPTION_INVALID_SOCKET);
-               } // END - if
+               }
 
                // Prepare the GET request
                $request  = 'GET ' . ($helperInstance->isProxyUsed() === true ? 'http://shipsimu.org' : '') . '/ip.php HTTP/1.0' . self::HTTP_EOL;
@@ -325,7 +377,7 @@ class ConsoleTools extends BaseFrameworkSystem {
                // Do we use proxy?
                if ($helperInstance->isProxyUsed() === true) {
                        // CONNECT method?
-                       if ($helperInstance->getConfigInstance()->getConfigEntry('proxy_connect_method') == 'Y') {
+                       if (FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('proxy_connect_method') == 'Y') {
                                // Setup proxy tunnel
                                $response = $helperInstance->setupProxyTunnel('shipsimu.org', 80, $socketResource);
 
@@ -333,12 +385,12 @@ class ConsoleTools extends BaseFrameworkSystem {
                                if ((count($response) == 3) && (empty($response[0])) && (empty($response[1])) && (empty($response[2]))) {
                                        // Invalid response!
                                        $helperInstance->debugBackTrace('Proxy tunnel not working: response=' . print_r($response, true));
-                               } // END - if
+                               }
                        } else {
                                // Add header for proxy
                                $request .= 'Proxy-Connection: Keep-Alive' . self::HTTP_EOL;
                        }
-               } // END - if
+               }
 
                // Add last HTTP_EOL
                $request .= self::HTTP_EOL;
@@ -358,17 +410,14 @@ class ConsoleTools extends BaseFrameworkSystem {
                        if ((substr($externalAddress, 0, 7) == 'HTTP/1.') && (substr($externalAddress, -6, 6) != '200 OK')) {
                                // Stop processing
                                break;
-                       } // END - if
-               } // END - while
+                       }
+               }
 
                // Close socket
                fclose($socketResource);
 
-
-               // Debug message
-               /* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONSOLE-TOOLS[' . __METHOD__ . ':' . __LINE__ . ']: Resolved external address: ' . $externalAddress);
-
                // Return determined external address
+               /* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('CONSOLE-TOOLS: Resolved external address: ' . $externalAddress);
                return $externalAddress;
        }
 
@@ -387,7 +436,7 @@ class ConsoleTools extends BaseFrameworkSystem {
                if ((isset($_SERVER['REQUEST_METHOD'])) || (isset($_SERVER['QUERY_STRING']))) {
                        // Possibly HTTP request
                        $type = 'http';
-               } // END - if
+               }
 
                // Return it
                return $type;
@@ -414,7 +463,7 @@ class ConsoleTools extends BaseFrameworkSystem {
                if (self::analyzeEnvironmentForType() == 'http') {
                        // Possibly HTTP request
                        $type = 'web';
-               } // END - if
+               }
 
                // Return it
                return $type;