fix CS
[linksys-wrt3g-tools.git] / Wrt3g.php
index 1b554164c476b097798fcbbe02688c26edfe3040..2fe0db850fb7a68e1adcf978261c8c1cb495be71 100644 (file)
--- a/Wrt3g.php
+++ b/Wrt3g.php
 <?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
 {
     /**
-     * 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;
 
 
 
     /**
-     * Returns the base URL to use for requests.
+     * 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 getBaseUrl()
+    protected function getAuthBaseUrl()
     {
         return 'http://'
-            . $this->user
-            . ':' . $this->password
-            . '@' . $this->host;
+            . $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
-    */
+     * 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->getBaseUrl() . '/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 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->getBaseUrl();
+        $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";
+        $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