X-Git-Url: https://git.cweiske.de/linksys-wrt3g-tools.git/blobdiff_plain/db09f59478dcc4a92771d28e043a173462150433..d5acd59f15dd093735036899d8e5fc0e62777398:/Wrt3g.php diff --git a/Wrt3g.php b/Wrt3g.php index 131f626..07a6821 100644 --- a/Wrt3g.php +++ b/Wrt3g.php @@ -11,8 +11,9 @@ * @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. @@ -26,25 +27,47 @@ require_once 'Wrt3g/HtmlParser.php'; class Wrt3g { /** - * Router hostname/IP + * Logging verbosity + * 0 - no debug logging + * 1 - show important details (connected URLs) + * 2 - show internal details + * 3 - show HTTP requests and responses * - * @var string + * @var integer */ - public $host; + public $verbosity = 0; /** - * Name of user with administration privileges + * Class to send HTTP Requests with. + * Needs to be compatible with HTTP_Request2 * * @var string */ - public $user; + public $requestClass = 'HTTP_Request2'; /** - * Password for $user + * Configuration object * - * @var string + * @var Wrt3g_Config */ - public $password; + 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); + } @@ -57,9 +80,9 @@ class Wrt3g protected function getAuthBaseUrl() { return 'http://' - . $this->user - . ':' . $this->password - . '@' . $this->host; + . $this->config->user + . ':' . $this->config->password + . '@' . $this->config->host; } @@ -72,44 +95,90 @@ class Wrt3g */ protected function getAnonBaseUrl() { - return 'http://' . $this->host; + return 'http://' . $this->config->host; } /** - * Reboots the router. - * - * @return HTTP_Request2_Response - * - * @throws Exception When the router can't be reached, or unauthorized - */ + * Creates a new HTTP_Request2 object, attaches an observer + * if necessary and returns it. + * + * @return HTTP_Request2 + */ + protected function createRequest() + { + $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() { - $r = new HTTP_Request2(); + $url = $this->getAuthBaseUrl() . '/apply.cgi'; + $this->log('Connecting to ' . $url); + + $r = $this->createRequest(); $r->setMethod(HTTP_Request2::METHOD_POST); - $r->setUrl( - $this->getAuthBaseUrl() . '/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; }//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 - */ - public function getStatus() + * Retrieves basic connection 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 + */ + public function getConnectionStatus() + { + return array_intersect_key( + $this->loadStatus_NoAuth(), + array( + 'connection' => 0, + 'type' => 0, + 'network' => 0, + 'signal strength' => 0, + 'connection time' => 0, + 'session usage' => 0 + ) + ); + } + + + + /** + * Retrieves connection status information about the router. + * Uses pages that can only be reached with authentication. + * + * @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 getConnectionStatusAuth() { $arRetval = array(); @@ -117,24 +186,141 @@ class Wrt3g $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"; + $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, $parser->index_wstatus1($body)); return $arRetval; - }//public function getStatus() + }//public function getConnectionStatus() + + + + /** + * 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() + { + $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; + } + + 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