* @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 * @license AGPL v3 * @link http://cweiske.de/linksys-wrt3g-tools.htm */ class Wrt3g { /** * 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; } /** * 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() { $url = $this->getAuthBaseUrl() . '/apply.cgi'; $this->log('Connecting to ' . $url); $r = $this->createRequest(); $r->setMethod(HTTP_Request2::METHOD_POST); $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 getConnectionStatus() { $arRetval = array(); $strUrlBase = $this->getAuthBaseUrl(); $parser = new Wrt3g_HtmlParser(); /** * 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(); $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 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"; } } } ?>