*
* @author Roland Haeder <webmaster@ship-simu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Core Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.ship-simu.org
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class ConsoleTools extends BaseFrameworkSystem {
+ // Constants
+ const HTTP_EOL = "\r\n";
+ const HTTP_USER_AGENT = 'ConsoleTools/1.0';
+
/**
* Protected constructor
*
}
/**
- * Aquires the IP address of this host by reading the /etc/hostname file and solving it
+ * 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: <span class=\"data\">%s</span>",
+ $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: <span class=\"data\">%s</span>\n",
+ $this->__toString(),
+ $ip
+ ));
+ } else {
+ // Problem while resolving IP address
+ $this->debugOutput(sprintf("[%s:] Problem resolving IP address for host <span class=\"data\">%s</span>. 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. It is now stored in configuration
*
- * @return $ip The resolved IP address
+ * @return void
*/
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();
+ $helperInstance = 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: <span class=\"data\">%s</span>",
- $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: <span class=\"data\">%s</span>\n",
- $helper->__toString(),
- $ip
+ // Resolve the IP number
+ $ip = $helperInstance->resolveIpAddress($hostname);
+ } catch (FileIoException $e) {
+ // Fall-back to 'SESSION_SVR' which found on my Sun Station
+ if (isset($_SERVER['SESSION_SVR'])) {
+ // Resolve it
+ $ip = $helperInstance->resolveIpAddress($_SERVER['SESSION_SVR']);
+ } else {
+ // Could not find our hostname
+ $helperInstance->debugOutput(sprintf("[%s:] WARNING: Cannot resolve my own IP address.",
+ $helperInstance->__toString()
));
}
} catch (FrameworkException $e) {
- // Do nothing here
+ // Output debug message
+ $helperInstance->debugOutput(sprintf("[%s:] Problem while resolving own IP address: [%s|%s]:%s",
+ $helperInstance->__toString(),
+ $e->__toString(),
+ $e->getHexCode(),
+ $e->getMessage()
+ ));
}
- // Return the IP address
- return $ip;
+ // Set it in configuration
+ FrameworkConfiguration::getSelfInstance()->setServerAddress($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 188.138.90.169 and requesting /ip.php which does only
+ * return the content of $_SERVER['REMOTE_ADDR']. Of course, this method
+ * requires a working Internet connection.
+ *
+ * This method is taken from a user comment on php.net and heavily rewritten.
+ * Compare to following link:
+ * http://de.php.net/manual/en/function.socket-create.php#49368
+ *
+ * @return $externalAddress The determined external IP address
+ * @throws InvalidSocketException If socket initialization wents wrong or if an errors occurs
+ * @todo This should be moved out to an external class, e.g. HttpClient
+ * @todo Make IP, host name, port and script name configurable
+ */
+ public static function determineExternalIp () {
+ // Get helper instance
+ $helperInstance = new ConsoleTools();
+
+ // First get a socket
+ // @TODO Add some DNS caching here
+ $socketResource = fsockopen('188.138.90.169', 80, $errorNo, $errorStr, 5);
+
+ // Check if there was an error else
+ if ($errorNo > 0) {
+ // Then throw again
+ throw new InvalidSocketException(array($helperInstance, gettype($socketResource), $errorNo, $errorStr), BaseListener::EXCEPTION_INVALID_SOCKET);
+ } // END - if
+
+ // Prepare the GET request
+ $request = 'GET /ip.php HTTP/1.0' . self::HTTP_EOL;
+ $request .= 'Host: ship-simu.org' . self::HTTP_EOL;
+ $request .= 'User-Agent: ' . self::HTTP_USER_AGENT . self::HTTP_EOL;
+ $request .= 'Connection: close' . self::HTTP_EOL;
+ $request .= self::HTTP_EOL;
+
+ // Send it to the socket
+ fwrite($socketResource, $request);
+
+ // Init IP (this will always be the last line)
+ $externalAddress = 'invalid';
+
+ // And read the reply
+ while (!feof($socketResource)) {
+ $externalAddress = fgets($socketResource, 128);
+ } // END - while
+
+ // Close socket
+ fclose($socketResource);
+
+ // Return determined external IP
+ return $externalAddress;
+ }
+
+ /**
+ * Analyzes the 'environment', mostly $_SERVER, for presence of elements
+ * which indicates clearly that e.g. this script has been executed from
+ * console or web.
+ *
+ * @return $type The analyzed type, can be 'http' or 'console'
+ */
+ public static function analyzeEnvironmentForType () {
+ // Default is the console
+ $type = 'console';
+
+ // Now, do we have a request method, or query string set?
+ if ((isset($_SERVER['REQUEST_METHOD'])) || (isset($_SERVER['QUERY_STRING']))) {
+ // Possibly HTTP request
+ $type = 'http';
+ } // END - if
+
+ // Return it
+ return $type;
+ }
+
+ /**
+ * Analyzes the 'environment', mostly $_SERVER, for presence of elements
+ * which indicates clearly that e.g. this script has been executed from
+ * console or web. This method should be used for class names, they
+ * currently are named differently. Here is a list to clarify this:
+ *
+ * Request type | Class type
+ * -----------------------------
+ * http | web
+ * console | console
+ *
+ * @return $type The analyzed type, can be 'http' or 'console'
+ */
+ public static function analyzeEnvironmentForClassType () {
+ // Default is the console
+ $type = 'console';
+
+ // Now, do we have a request method, or query string set?
+ if ((isset($_SERVER['REQUEST_METHOD'])) || (isset($_SERVER['QUERY_STRING']))) {
+ // Possibly HTTP request
+ $type = 'web';
+ } // END - if
+
+ // Return it
+ return $type;
}
}