ignore releases dir
[linksys-wrt3g-tools.git] / Wrt3g.php
1 <?php
2 /**
3  * Part of Linksys WRT3G tools
4  *
5  * PHP version 5
6  *
7  * @category Tools
8  * @package  linksys-wrt3g-tools
9  * @author   Christian Weiske <cweiske@cweiske.de>
10  * @license  AGPL v3
11  * @link     http://cweiske.de/linksys-wrt3g-tools.htm
12  */
13 require_once 'HTTP/Request2.php';
14 require_once 'Wrt3g/Config.php';
15 require_once 'Wrt3g/HtmlParser.php';
16 require_once 'Wrt3g/RequestObserver.php';
17
18 /**
19  * Main class to interact with the router.
20  *
21  * @category Tools
22  * @package  linksys-wrt3g-tools
23  * @author   Christian Weiske <cweiske@cweiske.de>
24  * @license  AGPL v3
25  * @link     http://cweiske.de/linksys-wrt3g-tools.htm
26  */
27 class Wrt3g
28 {
29     /**
30      * Logging verbosity
31      * 0 - no debug logging
32      * 1 - show important details (connected URLs)
33      * 2 - show internal details
34      * 3 - show HTTP requests and responses
35      *
36      * @var integer
37      */
38     public $verbosity = 0;
39
40     /**
41      * Class to send HTTP Requests with.
42      * Needs to be compatible with HTTP_Request2
43      *
44      * @var string
45      */
46     public $requestClass = 'HTTP_Request2';
47
48     /**
49      * Configuration object
50      *
51      * @var Wrt3g_Config
52      */
53     public $config;
54
55
56
57     /**
58      * Loads the configuration from file and cmdline options
59      *
60      * @param array $options Command line options array
61      *
62      * @return void
63      *
64      * @see Wrt3g_Config
65      */
66     public function loadConfig($options = array())
67     {
68         $this->config = new Wrt3g_Config($this);
69         $this->config->load($options);
70     }
71
72
73
74     /**
75      * Returns the base URL to use for requests that require authentification.
76      * Includes username, password and host.
77      *
78      * @return string URL without trailing slash after the host
79      */
80     protected function getAuthBaseUrl()
81     {
82         return 'http://'
83             . $this->config->user
84             . ':' . $this->config->password
85             . '@' . $this->config->host;
86     }
87
88
89
90     /**
91      * Returns the base URL to use for requests that do
92      * not require authentification.
93      *
94      * @return string URL without trailing slash after the host
95      */
96     protected function getAnonBaseUrl()
97     {
98         return 'http://' . $this->config->host;
99     }
100
101
102
103     /**
104      * Creates a new HTTP_Request2 object, attaches an observer
105      * if necessary and returns it.
106      *
107      * @return HTTP_Request2
108      */
109     protected function createRequest()
110     {
111         $r = new $this->requestClass();
112         if ($this->verbosity >= 3) {
113             //register observer
114             $r->attach(new Wrt3g_RequestObserver($this));
115         }
116         return $r;
117     }
118
119
120
121     /**
122      * Reboots the router.
123      *
124      * @return HTTP_Request2_Response
125      *
126      * @throws Exception When the router can't be reached, or unauthorized
127      */
128     public function reboot()
129     {
130         $url = $this->getAuthBaseUrl() . '/apply.cgi';
131         $this->log('Connecting to ' . $url);
132
133         $r = $this->createRequest();
134         $r->setMethod(HTTP_Request2::METHOD_POST);
135         $r->setUrl($url);
136         $r->addPostParameter('action', 'Reboot');
137         $r->addPostParameter('submit_button', 'Diagnostics');
138         $r->addPostParameter('wait_time', 1);
139
140         $resp = $r->send();
141         $this->checkResponseStatus($resp);
142         return $resp;
143     }//public function reboot()
144
145
146
147     /**
148      * Retrieves basic connection status information about the router
149      *
150      * @return array Array with several key-value pairs
151      *               connection => connecting, disconnected, connected
152      *
153      * @throws Exception When the router can't be reached
154      */
155     public function getConnectionStatus()
156     {
157         return array_intersect_key(
158             $this->loadStatus_NoAuth(),
159             array(
160                 'connection'      => 0,
161                 'type'            => 0,
162                 'network'         => 0,
163                 'signal strength' => 0,
164                 'connection time' => 0,
165                 'session usage'   => 0
166             )
167         );
168     }
169
170
171
172     /**
173      * Retrieves connection status information about the router.
174      * Uses pages that can only be reached with authentication.
175      *
176      * @return array Array with several key-value pairs
177      *               connection => connecting, disconnected, connected
178      *
179      * @throws Exception When the router can't be reached, or unauthorized
180      */
181     public function getConnectionStatusAuth()
182     {
183         $arRetval = array();
184
185         $strUrlBase = $this->getAuthBaseUrl();
186         $parser = new Wrt3g_HtmlParser();
187
188         /**
189          * Connection status
190          */
191         $r = $this->createRequest();
192         $r->setMethod(HTTP_Request2::METHOD_GET);
193         $r->setUrl($strUrlBase . '/index_wstatus2.asp');
194         $this->log('Connecting to ' . $strUrlBase . '/index_wstatus2.asp', 1);
195         $resp = $r->send();
196         $this->checkResponseStatus($resp);
197         $arRetval = $parser->index_wstatus2($resp->getBody());
198
199         /**
200         * GPRS/UMTS Status
201         */
202         $r->setUrl($strUrlBase . '/index_wstatus1.asp');
203         $this->log('Connecting to ' . $strUrlBase . '/index_wstatus1.asp', 1);
204         $resp = $r->send();
205         $this->checkResponseStatus($resp);
206         $body = $resp->getBody();
207         $arRetval = array_merge($arRetval, $parser->index_wstatus1($body));
208
209         return $arRetval;
210     }//public function getConnectionStatus()
211
212
213
214     /**
215      * Loads "Status_NoAuth.asp" page and parses the body.
216      *
217      * @return array Associative array with connection status.
218      *
219      * @throws Exception When something goes wrong, i.e. router not
220      *                   reachable
221      */
222     protected function loadStatus_NoAuth()
223     {
224         $strUrlBase = $this->getAnonBaseUrl();
225
226         $url = $strUrlBase . '/Status_NoAuth.asp';
227         $this->log('Connecting to ' . $url, 1);
228
229         $r = $this->createRequest();
230         $r->setMethod(HTTP_Request2::METHOD_GET);
231         $r->setUrl($url);
232         $resp = $r->send();
233         $this->checkResponseStatus($resp);
234
235         $parser = new Wrt3g_HtmlParser();
236
237         return $parser->status_noauth(
238             $resp->getBody()
239         );
240     }
241
242
243
244     /**
245      * Checks the HTTP response code and throws an exception if it
246      * is not in the 200 range.
247      *
248      * @param HTTP_Request2_Response $resp HTTP response object
249      *
250      * @return void
251      *
252      * @throws Exception When the status is not 200-299
253      */
254     protected function checkResponseStatus(HTTP_Request2_Response $resp)
255     {
256         $nStatus = $resp->getStatus();
257         $this->log($nStatus . ' ' . $resp->getReasonPhrase(), 1);
258         if (intval($nStatus / 100) == 2) {
259             //2xx status is fine
260             return;
261         }
262
263         throw new Exception(
264             'HTTP Error: ' . $nStatus . ' ' . $resp->getReasonPhrase()
265         );
266     }
267
268
269
270     /**
271      * Retrieves pc card/SIM status information
272      *
273      * @return array Array with several key-value pairs
274      *               connection => connecting, disconnected, connected
275      *
276      * @throws Exception When the router can't be reached
277      */
278     public function getCardStatus()
279     {
280         $arRetval = $this->loadStatus_NoAuth();
281
282         return array_intersect_key(
283             $arRetval,
284             array(
285                 'card model'    => 0,
286                 'card revision' => 0,
287                 'card firmware' => 0,
288                 'IMSI'          => 0
289             )
290         );
291     }
292
293
294
295     /**
296      * Retrieves all status information one can get.
297      *
298      * @return array Array with several key-value pairs
299      *               connection => connecting, disconnected, connected
300      *
301      * @throws Exception When the router can't be reached
302      */
303     public function getFullStatus()
304     {
305         return $this->loadStatus_NoAuth();
306     }
307
308
309
310     /**
311      * Log a message to stdout.
312      *
313      * @param string|object $msg   Message to display. May even be a response
314      *                             object
315      * @param integer       $level Log level, see $verbosity
316      *
317      * @return void
318      */
319     public function log($msg, $level = 1)
320     {
321         if ($this->verbosity >= $level) {
322             echo $msg . "\n";
323         }
324     }
325 }
326 ?>