X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=inc%2Fclasses%2Fmain%2Fconsole%2Fclass_ConsoleTools.php;h=e00e757e8100211028ed9c0c16dc5051ae697420;hb=8c1bdfb7ad5d15f6d390b6c7b57e47aecac26a01;hp=855cd0c3bb36d8d04f226c5ce64387a8e0d7aaec;hpb=1bab7970103f55529e9404259df946a9ddf98e5b;p=core.git
diff --git a/inc/classes/main/console/class_ConsoleTools.php b/inc/classes/main/console/class_ConsoleTools.php
index 855cd0c3..e00e757e 100644
--- a/inc/classes/main/console/class_ConsoleTools.php
+++ b/inc/classes/main/console/class_ConsoleTools.php
@@ -32,6 +32,50 @@ class ConsoleTools extends BaseFrameworkSystem {
parent::__construct(__CLASS__);
}
+ /**
+ * Tries to resolve an IP address from given hostname. Currently only IPv
+ * addresses are resolved.
+ *
+ * @param $hostname Host name we shall resolve
+ * @return $ip IP address resolved from host name
+ * @todo We should connect this to a caching class to cache DNS requests
+ */
+ protected function resolveIpAddress ($hostname) {
+ // Debug message
+ $this->debugOutput(sprintf("[%s:] Our host name is: %s",
+ $this->__toString(),
+ $hostname
+ ));
+
+ // Default is an invalid one
+ $ip = '0.0.0.0';
+
+ // Resolve it
+ // @TODO Here should the cacher be implemented
+ $ipResolved = gethostbyname($hostname);
+
+ // Was it fine?
+ if (($ipResolved !== false) && ($ipResolved != $hostname)) {
+ // Okay, this works!
+ $ip = $ipResolved;
+
+ // Debug message
+ $this->debugOutput(sprintf("[%s:] Resolved IP address is: %s\n",
+ $this->__toString(),
+ $ip
+ ));
+ } else {
+ // Problem while resolving IP address
+ $this->debugOutput(sprintf("[%s:] Problem resolving IP address for host %s. Please check your /etc/hosts file.",
+ $this->__toString(),
+ $hostname
+ ));
+ }
+
+ // Return resolved IP
+ return $ip;
+ }
+
/**
* Aquires the IP address of this host by reading the /etc/hostname file and solving it
*
@@ -39,44 +83,82 @@ class ConsoleTools extends BaseFrameworkSystem {
*/
public static function acquireSelfIPAddress () {
// Local IP by default
- $ip = "127.0.0.1";
+ $ip = '127.0.0.1';
// Get a new instance
$helper = new ConsoleTools();
try {
// Get a file pointer
- $io = FrameworkFileInputPointer::createFrameworkFileInputPointer("/etc/hostname");
+ $io = FrameworkFileInputPointer::createFrameworkFileInputPointer('/etc/hostname');
// Read the file
$hostname = trim($io->readFromFile());
- $helper->debugOutput(sprintf("[%s:] Our host name is: %s",
- $helper->__toString(),
- $hostname
- ));
// Close the file
$io->closeFile();
- // Resolve it
- $ipResolved = gethostbyname($hostname);
- if (($ipResolved !== false) && ($ipResolved != $hostname)) {
- // Okay, this works!
- $ip = $ipResolved;
-
- // Debug message
- $helper->debugOutput(sprintf("[%s:] Resolved IP address is: %s\n",
- $helper->__toString(),
- $ip
+ // Resolve the IP number
+ $ip = $helper->resolveIpAddress($hostname);
+ } catch (FileNotFoundException $e) {
+ // Fall-back to 'SESSION_SVR' which found on my Sun Station
+ if (isset($_SERVER['SESSION_SVR'])) {
+ // Resolve it
+ $ip = $helper->resolveIpAddress($_SERVER['SESSION_SVR']);
+ } else {
+ // Could not find our hostname
+ $helper->debugOutput(sprintf("[%s:] WARNING: Cannot resolve my own IP address.",
+ $helper->__toString()
));
}
} catch (FrameworkException $e) {
- // Do nothing here
+ // Output debug message
+ $helper->debugOutput(sprintf("[%s:] Problem while resolving own IP address: [%s|%s]:%s",
+ $helper->__toString(),
+ $e->__toString(),
+ $e->getHexCode(),
+ $e->getMessage()
+ ));
}
// Return the IP address
return $ip;
}
+
+ /**
+ * Determines own remote IP address (e.g. can be used to probe if we are
+ * reachable from outside by determining external IP and then connect to it.
+ * This is accomblished by connecting to the IP of www.ship-simu.org which
+ * should default to 217.172.186.31.
+ *
+ * This method is taken and lightly rewritten from a user comment on php.net:
+ * http://de.php.net/manual/en/function.socket-create.php#49368
+ *
+ * @param $dest IP destination we should connect to
+ * @param $port Port destination we should connect to
+ * @return $externalAddress The determined external IP address
+ * @throws InvalidSocketException If socket initialization wents wrong
+ */
+ public function determineExternalIp ($dest = '217.172.186.31', $port = 80) {
+ // First get a socket
+ $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+ if (!is_resource($socket)) {
+ // Throw InvalidSocketException
+ throw new InvalidSocketException (array($this, gettype($socket), 0, 'unknown'));
+ } // END - if
+
+ // Connect to the destination
+ socket_connect($socket, $dest, $port);
+
+ // Get the socket address (our external IP) and port (ignored)
+ socket_getsockname($socket, $externalAddress, $ourPort);
+
+ // Close the socket
+ socket_close($socket);
+
+ // Return determined external IP
+ return $externalAddress;
+ }
}
// [EOF]