config.php file is not needed anymore
[linksys-wrt3g-tools.git] / Wrt3g.php
index c71ae1904a5a7c258dc313669112bc7f07ada47e..6b12ac5c7b7fac167876c8d1fc1c8c645ea7547d 100644 (file)
--- 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.
@@ -25,32 +26,12 @@ require_once 'Wrt3g/HtmlParser.php';
  */
 class Wrt3g
 {
-    /**
-     * Router hostname/IP
-     *
-     * @var string
-     */
-    public $host;
-
-    /**
-     * Name of user with administration privileges
-     *
-     * @var string
-     */
-    public $user;
-
-    /**
-     * Password for $user
-     *
-     * @var string
-     */
-    public $password;
-
     /**
      * Logging verbosity
      * 0 - no debug logging
      * 1 - show important details (connected URLs)
      * 2 - show internal details
+     * 3 - show HTTP requests and responses
      *
      * @var integer
      */
@@ -64,6 +45,30 @@ class Wrt3g
      */
     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)
+    {
+        $this->config = new Wrt3g_Config($this);
+        $this->config->load($options);
+    }
+
 
 
     /**
@@ -75,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;
     }
 
 
@@ -90,7 +95,25 @@ class Wrt3g
      */
     protected function getAnonBaseUrl()
     {
-        return 'http://' . $this->host;
+        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;
     }
 
 
@@ -107,7 +130,7 @@ class Wrt3g
         $url = $this->getAuthBaseUrl() . '/apply.cgi';
         $this->log('Connecting to ' . $url);
 
-        $r = new $this->requestClass();
+        $r = $this->createRequest();
         $r->setMethod(HTTP_Request2::METHOD_POST);
         $r->setUrl($url);
         $r->addPostParameter('action', 'Reboot');
@@ -115,6 +138,7 @@ class Wrt3g
         $r->addPostParameter('wait_time', 1);
 
         $resp = $r->send();
+        $this->checkResponseStatus($resp);
         return $resp;
     }//public function reboot()
 
@@ -138,12 +162,12 @@ class Wrt3g
         /**
          * Connection status
          */
-        $r = new $this->requestClass();
+        $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->log($resp->getStatus() . ' ' . $resp->getReasonPhrase(), 1);
+        $this->checkResponseStatus($resp);
         $arRetval = $parser->index_wstatus2($resp->getBody());
 
         /**
@@ -152,6 +176,7 @@ class Wrt3g
         $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));
 
@@ -175,12 +200,11 @@ class Wrt3g
         $url = $strUrlBase . '/Status_NoAuth.asp';
         $this->log('Connecting to ' . $url, 1);
 
-        $r = new $this->requestClass();
+        $r = $this->createRequest();
         $r->setMethod(HTTP_Request2::METHOD_GET);
         $r->setUrl($url);
         $resp = $r->send();
-        $this->log($resp->getStatus() . ' ' . $resp->getReasonPhrase(), 1);
-        //FIXME: check status
+        $this->checkResponseStatus($resp);
 
         $parser = new Wrt3g_HtmlParser();
 
@@ -191,6 +215,32 @@ class Wrt3g
 
 
 
+    /**
+     * 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
      *
@@ -234,8 +284,9 @@ class Wrt3g
     /**
      * Log a message to stdout.
      *
-     * @param string  $msg   Message to display
-     * @param integer $level Log level, see $verbosity
+     * @param string|object  $msg   Message to display. May even be a response
+     *                              object
+     * @param integer        $level Log level, see $verbosity
      *
      * @return void
      */