<?php
/**
-* Functions to access the router
-*
-* PHP version 5
-*
-* @category Tools
-* @package linksys-wrt3g-tools
-* @author Christian Weiske <cweiske@cweiske.de>
-* @license AGPL v3
-* @link http://cweiske.de/linksys-wrt3g-tools.htm
-*/
+ * Part of Linksys WRT3G tools
+ *
+ * PHP version 5
+ *
+ * @category Tools
+ * @package linksys-wrt3g-tools
+ * @author Christian Weiske <cweiske@cweiske.de>
+ * @license AGPL v3
+ * @link http://cweiske.de/linksys-wrt3g-tools.htm
+ */
require_once 'HTTP/Request2.php';
+require_once 'Wrt3g/Config.php';
+require_once 'Wrt3g/HtmlParser.php';
+require_once 'Wrt3g/RequestObserver.php';
-
+/**
+ * Main class to interact with the router.
+ *
+ * @category Tools
+ * @package linksys-wrt3g-tools
+ * @author Christian Weiske <cweiske@cweiske.de>
+ * @license AGPL v3
+ * @link http://cweiske.de/linksys-wrt3g-tools.htm
+ */
class Wrt3g
{
- protected static $arTranslations = array(
- 'GPRS_MSG.WWBEAR' => 'type',
- 'GPRS_MSG.NNAME' => 'network',
- 'GPRS_MSG.STRENGTH' => 'signal strength',
- 'GPRS_MSG.ACQUIRING' => 'aquiring',
- 'GPRS_MSG.WWBEAR_GPRS' => 'GPRS',
- 'GPRS_MSG.WWBEAR_UMTS' => 'UMTS',
- );
+ /**
+ * Logging verbosity
+ * 0 - no debug logging
+ * 1 - show important details (connected URLs)
+ * 2 - show internal details
+ * 3 - show HTTP requests and responses
+ *
+ * @var integer
+ */
+ public $verbosity = 0;
+
+ /**
+ * Class to send HTTP Requests with.
+ * Needs to be compatible with HTTP_Request2
+ *
+ * @var string
+ */
+ public $requestClass = 'HTTP_Request2';
+
+ /**
+ * Configuration object
+ *
+ * @var Wrt3g_Config
+ */
+ public $config;
+
+
+
+ /**
+ * Loads the configuration from file and cmdline options
+ *
+ * @param array $options Command line options array
+ *
+ * @return void
+ *
+ * @see Wrt3g_Config
+ */
+ public function loadConfig($options = array())
+ {
+ $this->config = new Wrt3g_Config($this);
+ $this->config->load($options);
+ }
+
+
+
+ /**
+ * Returns the base URL to use for requests that require authentification.
+ * Includes username, password and host.
+ *
+ * @return string URL without trailing slash after the host
+ */
+ protected function getAuthBaseUrl()
+ {
+ return 'http://'
+ . $this->config->user
+ . ':' . $this->config->password
+ . '@' . $this->config->host;
+ }
+
+
+
+ /**
+ * Returns the base URL to use for requests that do
+ * not require authentification.
+ *
+ * @return string URL without trailing slash after the host
+ */
+ protected function getAnonBaseUrl()
+ {
+ return 'http://' . $this->config->host;
+ }
+
+
/**
- * Reboots the router.
- *
- * @return HTTP_Request2_Response
- *
- * @throws Exception When the router can't be reached, or unauthorized
- */
- function reboot()
+ * Creates a new HTTP_Request2 object, attaches an observer
+ * if necessary and returns it.
+ *
+ * @return HTTP_Request2
+ */
+ protected function createRequest()
{
- $r = new HTTP_Request2();
+ $r = new $this->requestClass();
+ if ($this->verbosity >= 3) {
+ //register observer
+ $r->attach(new Wrt3g_RequestObserver($this));
+ }
+ return $r;
+ }
+
+
+
+ /**
+ * Reboots the router.
+ *
+ * @return HTTP_Request2_Response
+ *
+ * @throws Exception When the router can't be reached, or unauthorized
+ */
+ public function reboot()
+ {
+ $url = $this->getAuthBaseUrl() . '/apply.cgi';
+ $this->log('Connecting to ' . $url);
+
+ $r = $this->createRequest();
$r->setMethod(HTTP_Request2::METHOD_POST);
- $r->setUrl(
- 'http://'
- . $GLOBALS['linksys-wrt3g-tools']['user']
- . ':' . $GLOBALS['linksys-wrt3g-tools']['password']
- . '@' . $GLOBALS['linksys-wrt3g-tools']['ip']
- . '/apply.cgi'
- );
+ $r->setUrl($url);
$r->addPostParameter('action', 'Reboot');
$r->addPostParameter('submit_button', 'Diagnostics');
$r->addPostParameter('wait_time', 1);
$resp = $r->send();
+ $this->checkResponseStatus($resp);
return $resp;
- }//function reboot()
+ }//public function reboot()
/**
- * Retrieves status information about the router
- *
- * @return array Array with several key-value pairs
- * connection => connecting, disconnected, connected
- *
- * @throws Exception When the router can't be reached, or unauthorized
- */
- function getStatus()
+ * Retrieves status information about the router
+ *
+ * @return array Array with several key-value pairs
+ * connection => connecting, disconnected, connected
+ *
+ * @throws Exception When the router can't be reached, or unauthorized
+ */
+ public function getConnectionStatus()
{
$arRetval = array();
- $strUrlBase = 'http://'
- . $GLOBALS['linksys-wrt3g-tools']['user']
- . ':' . $GLOBALS['linksys-wrt3g-tools']['password']
- . '@' . $GLOBALS['linksys-wrt3g-tools']['ip'];
+ $strUrlBase = $this->getAuthBaseUrl();
+ $parser = new Wrt3g_HtmlParser();
/**
- * Connection status
- */
- $r = new HTTP_Request2();
+ * Connection status
+ */
+ $r = $this->createRequest();
$r->setMethod(HTTP_Request2::METHOD_GET);
$r->setUrl($strUrlBase . '/index_wstatus2.asp');
+ $this->log('Connecting to ' . $strUrlBase . '/index_wstatus2.asp', 1);
$resp = $r->send();
- echo $resp->getStatus() . ' ' . $resp->getReasonPhrase() . "\n";
- $body = $resp->getBody();
- preg_match('/var status2 = "(.+)"/', $body, $arMatches);
-
- $strStatus = $arMatches[1];
- //Connecting
- //Disconnected
- //Connected
- $arRetval['connection'] = strtolower($strStatus);
+ $this->checkResponseStatus($resp);
+ $arRetval = $parser->index_wstatus2($resp->getBody());
/**
* GPRS/UMTS Status
*/
$r->setUrl($strUrlBase . '/index_wstatus1.asp');
+ $this->log('Connecting to ' . $strUrlBase . '/index_wstatus1.asp', 1);
$resp = $r->send();
+ $this->checkResponseStatus($resp);
$body = $resp->getBody();
- $arRetval = array_merge($arRetval, $this->parseStatus($body));
+ $arRetval = array_merge($arRetval, $parser->index_wstatus1($body));
return $arRetval;
- }//function getStatus()
+ }//public function getConnectionStatus()
/**
- * Parses the body and returns extracted values
- *
- * @param string $body HTML document to parse
- *
- * @return array Array of key-value pairs
- */
- function parseStatus($body)
+ * Loads "Status_NoAuth.asp" page and parses the body.
+ *
+ * @return array Associative array with connection status.
+ *
+ * @throws Exception When something goes wrong, i.e. router not
+ * reachable
+ */
+ protected function loadStatus_NoAuth()
{
- $arRetval = array();
- $arMatches = array();
- preg_match_all('#>Capture\(([^)]+)\)</#', $body, $arMatches);
- $arData = array();
- reset($arMatches[1]);
- while (current($arMatches[1])) {
- $key = current($arMatches[1]);
- $value = next($arMatches[1]);
- if (isset(self::$arTranslations[$key])) {
- $key = self::$arTranslations[$key];
- }
- if (isset(self::$arTranslations[$value])) {
- $value = self::$arTranslations[$value];
- }
- $arRetval[$key] = $value;
- next($arMatches[1]);
+ $strUrlBase = $this->getAnonBaseUrl();
+
+ $url = $strUrlBase . '/Status_NoAuth.asp';
+ $this->log('Connecting to ' . $url, 1);
+
+ $r = $this->createRequest();
+ $r->setMethod(HTTP_Request2::METHOD_GET);
+ $r->setUrl($url);
+ $resp = $r->send();
+ $this->checkResponseStatus($resp);
+
+ $parser = new Wrt3g_HtmlParser();
+
+ return $parser->status_noauth(
+ $resp->getBody()
+ );
+ }
+
+
+
+ /**
+ * Checks the HTTP response code and throws an exception if it
+ * is not in the 200 range.
+ *
+ * @param HTTP_Request2_Response $resp HTTP response object
+ *
+ * @return void
+ *
+ * @throws Exception When the status is not 200-299
+ */
+ protected function checkResponseStatus(HTTP_Request2_Response $resp)
+ {
+ $nStatus = $resp->getStatus();
+ $this->log($nStatus . ' ' . $resp->getReasonPhrase(), 1);
+ if (intval($nStatus / 100) == 2) {
+ //2xx status is fine
+ return;
}
- return $arRetval;
+ throw new Exception(
+ 'HTTP Error: ' . $nStatus . ' ' . $resp->getReasonPhrase()
+ );
+ }
+
+
+
+ /**
+ * Retrieves pc card/SIM status information
+ *
+ * @return array Array with several key-value pairs
+ * connection => connecting, disconnected, connected
+ *
+ * @throws Exception When the router can't be reached
+ */
+ public function getCardStatus()
+ {
+ $arRetval = $this->loadStatus_NoAuth();
+
+ return array_intersect_key(
+ $arRetval,
+ array(
+ 'card model' => 0,
+ 'card revision' => 0,
+ 'card firmware' => 0,
+ 'IMSI' => 0
+ )
+ );
+ }
+
+
+
+ /**
+ * Retrieves all status information one can get.
+ *
+ * @return array Array with several key-value pairs
+ * connection => connecting, disconnected, connected
+ *
+ * @throws Exception When the router can't be reached
+ */
+ public function getFullStatus()
+ {
+ return $this->loadStatus_NoAuth();
+ }
+
+
+
+ /**
+ * Log a message to stdout.
+ *
+ * @param string|object $msg Message to display. May even be a response
+ * object
+ * @param integer $level Log level, see $verbosity
+ *
+ * @return void
+ */
+ public function log($msg, $level = 1)
+ {
+ if ($this->verbosity >= $level) {
+ echo $msg . "\n";
+ }
}
}
?>
\ No newline at end of file