login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Handige scripts > Skynet ADSL Monitor

Skynet ADSL Monitor

Auteur: Maarten - 12 augustus 2006 - 21:47 - Gekeurd door: Gerard - Hits: 3380 - Aantal punten: 4.33 (3 stemmen)




Citaat:
PHP 5 met CURL extensie vereist!

Dit is een volledig standalone systeem om de status van ADSL-accounts van de Belgische provider Skynet op te vragen.

Het is volledig standalone, dat houdt in dat de preloader en de afbeeldingen volledig in 1 bestand zitten.

Of je dit systeem echt zelf kan gebruiken is niet zozeer belangerijk, het is vooral een goed voorbeeld hoe je de CURL-functies van PHP kan gebruikt, hoe je als base64 gecodeerde afbeeldingen in 1 bestand kan uitlezen, of hoe je in 1 bestand een preloader kan maken door middel van AJAX.

Instellingen zoals gebruikers & ADSL accounts worden bovenaan ingesteld. Met SHOW_PASSWORDS en HIDE_PASSWORDS kan je de wachtwoorden van de ADSL accounts in kwestie weergeven of verbergen.

Wat je van het 'design' vind kan mij niks schelen 

Opmerking:
Bij het uploaden naar een online webserver heb ik vastgesteld dat het stuk buiten de preloader (de meters zelf dus) niet weergegeven werd, maar als download geforceerd werd. Ik ben niet zeker hoe dit komt, maar ik vermoed dat dit door het grote aantal requests en eventuele veiligheidsinstellingen veroorzaakt werd. Als je dit werkelijk wilt gaan gebruiken (wtf), is het best om dit op localhost te draaien.

Screenshots:
Preloader
Stats

Code:
  1. <?php
  2. //
  3. // Config: see line 16
  4. //
  5. if(isset($_GET['img'])) {
  6. // Image requested
  7. $img = array(
  8. 'logo' => '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',
  9. 'account' => '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');
  10.  
  11. header('Content-type: image/png');
  12. echo base64_decode($img[$_GET['img']]);
  13. exit();
  14. }
  15.  
  16. // If your file is called 'index.php', you can leave this blank too
  17. $filename = 'index.php';
  18.  
  19. // Do not touch these constants!
  20. define('HIDE_PASSWORDS', 0);
  21. define('SHOW_PASSWORDS', 1);
  22.  
  23. // Users
  24. $users = array(
  25. 'gebruikersnaam' => array('md5 hash', SHOW_PASSWORDS),
  26. );
  27.  
  28. // Adsl accounts
  29. $adsl_accounts = array(
  30. 'login1' => 'pass1',
  31. 'login2' => 'pass2'
  32. );
  33.  
  34. // This part is the preloader
  35. if(!isset($_GET['load'])) {
  36. ?>
  37. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  38. <html xmlns="http://www.w3.org/1999/xhtml">
  39. <head>
  40. <meta http-equiv="content-Type" content="text/html; charset=iso-8859-1" />
  41. <title>Murfy's ADSL Monitor</title>
  42. <link rel="stylesheet" href="/css/default/global.css" type="text/css" />
  43. <style type="text/css">
  44. body {
  45. background-color: #000000;
  46. color: #FFFFFF;
  47. font-family: Verdana;
  48. font-size: 10pt;
  49. }
  50.  
  51. h1 {
  52. margin-left: auto;
  53. margin-right: auto;
  54. padding: 5px;
  55. border: 1px solid #CCCCCC;
  56. background-color: #333333;
  57. }
  58.  
  59. h2 {
  60. margin: 0;
  61. }
  62.  
  63. .account {
  64. float: left;
  65. width: 460px;
  66. padding: 5px;
  67. margin: 10px;
  68. border: 1px solid #777777;
  69. background-color: #222222;
  70. }
  71.  
  72. .account table {
  73. width: 440px;
  74. }
  75.  
  76. .free {
  77. border: 1px solid #CCCCCC;
  78. border-left: none;
  79. float: right;
  80. }
  81.  
  82. .used {
  83. border: 1px solid #CCCCCC;
  84. background-color: #eeca4d;
  85. float: right;
  86. }
  87. </style>
  88. <script type="text/javascript">
  89. function loadMeter() {
  90. var req;
  91. if(window.XMLHttpRequest){
  92. req = new XMLHttpRequest();
  93. } else if(window.ActiveXObject) {
  94. req = new ActiveXObject("Microsoft.XMLHTTP");
  95. } else {
  96. alert('Problem creating the XMLHttpRequest object');
  97. }
  98.  
  99. req.open('get', '<?=$filename?>?load');
  100. req.onreadystatechange = function() {
  101. if(req.readyState == 4 && req.status == 200){
  102. if(req.responseText) {
  103. document.getElementById('container').innerHTML = req.responseText;
  104. }
  105. }
  106. }
  107. req.send(null);
  108. }
  109. </script>
  110. </head>
  111. <body>
  112. <h1><img src="<?=$filename?>?img=logo" alt="" /> ADSL Monitor</h1>
  113. <div id="container">
  114. The ADSL monitor is loading. This may take some time, please wait while the statistics are being gathered from the server.
  115. </div>
  116. <script type="text/javascript">
  117. loadMeter();
  118. </script>
  119. </body>
  120. </html>
  121. <?php
  122. exit();
  123. }
  124.  
  125. if(!isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {
  126. // Niet ingelogged, homo's
  127. header('WWW-Authenticate: Basic realm="Murfy\'s ADSL monitor"');
  128. header('HTTP/1.0 401 Unauthorized');
  129. echo 'Access denied for '.$_SERVER['PHP_AUTH_USER'].':'.$_SERVER['PHP_AUTH_PW'];
  130. exit();
  131. } else {
  132. // Wel dus
  133. if(!array_key_exists($_SERVER['PHP_AUTH_USER'], $users) || $users[$_SERVER['PHP_AUTH_USER']][0] != md5($_SERVER['PHP_AUTH_PW'])) {
  134. echo 'Access denied for '.$_SERVER['PHP_AUTH_USER'].':'.$_SERVER['PHP_AUTH_PW'];
  135. exit();
  136. } else {
  137. $user = $_SERVER['PHP_AUTH_USER'];
  138. }
  139. }
  140.  
  141. function strtokb($string) {
  142. /* Mogelijke input:
  143. 30 GB
  144. 23 GB 830 MB
  145. 31 MB
  146. 65 MB 297 KB
  147. */
  148. $num = '([0-9]{1,3})';
  149. $match = array();
  150. if(preg_match('#'.$num.' GB '.$num.' MB#', $string, $match)) {
  151. // 23 GB 830 MB
  152. $ret = $match[1]*1024*1024 + $match[2]*1024;
  153. } elseif(preg_match('#'.$num.' GB#', $string, $match)) {
  154. // 30 GB
  155. $ret = $match[1]*1024*1024;
  156. } elseif(preg_match('#'.$num.' MB '.$num.' KB#', $string, $match)) {
  157. // 65 MB 297 KB
  158. $ret = $match[1]*1024 + $match[2];
  159. } elseif(preg_match('#'.$num.' MB#', $string, $match)) {
  160. // 31 M
  161. $ret = $match[1]*1024;
  162. } else {
  163. $ret = false;
  164. }
  165.  
  166. return $ret;
  167.  
  168. }
  169.  
  170. function getVolume($user, $pass) {
  171. // First logout, just to be sure
  172. file_get_contents('https://e-care.skynet.be/index.cfm?function=login.logoff');
  173.  
  174. $curl = curl_init('https://e-care.skynet.be/index.cfm?function=connection.getVolume');
  175. curl_setopt($curl, CURLOPT_POST, true);
  176. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  177. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  178. curl_setopt($curl, CURLOPT_POSTFIELDS, 'form_login='.$user.'&form_password='.$pass.'&Submit=Inloggen');
  179. $ret = curl_exec($curl);
  180. curl_close($curl);
  181.  
  182. $ret = str_replace(array("\n", "\r", "\t"), '', $ret);
  183. // Match against:
  184. // Monthly volume used 23 GB 830 MB out of 30 GB
  185. $pattern = '#Monthly volume used <strong>([A-Z0-9 ]+)<\/strong> out of <strong>([A-Z0-9 ]+)<\/strong>#si';
  186. $match = array();
  187. preg_match($pattern, $ret, $match);
  188. $basic_used = strtokb($match[1]);
  189. $basic_total = strtokb($match[2]);
  190.  
  191. // Match against:
  192. // You used 973 MB out of 5 GB available in the current Volume Pack
  193. $extra = false;
  194. $pattern = '#You used <strong>([A-Z0-9 ]+)<\/strong> out of<strong>([A-Z0-9 ]+)<\/strong>#si';
  195. preg_match($pattern, $ret, $match);
  196. if(count($match) > 0) {
  197. $extra = array('used' => strtokb($match[1]), 'total' => strtokb($match[2]));
  198. }
  199.  
  200. return array(
  201. 'basic' => array('used' => $basic_used, 'total' => $basic_total),
  202. 'extra' => $extra
  203. );
  204. }
  205.  
  206. $total_total = 0;
  207. $total_used = 0;
  208. $max = 170; // Meter
  209.  
  210. foreach($adsl_accounts as $adsl_user => $adsl_pass) {
  211. $volume = getVolume($adsl_user, $adsl_pass);
  212. $total_total += $volume['basic']['total'];
  213. $total_used += $volume['basic']['used'];
  214. // Meter
  215. $used = $max/$volume['basic']['total']*$volume['basic']['used'];
  216. $free = $max-$used;
  217. ?>
  218. <div class="account">
  219. <h2><img src="<?=$filename?>?img=account" alt="" /> <?=$adsl_user?>@SKYNET</h2>
  220. <?php if($users[$user][1] == 1) { echo '<em><small>'.$adsl_pass.'</small></em><br />'; } ?>
  221. <br />
  222. <table>
  223. <tr>
  224. <td>Monthly volume:</td>
  225. <td><?=round($volume['basic']['used']/1024)?> / <?=round($volume['basic']['total']/1024)?> MB</td>
  226. <td>
  227. <div class="free" style="width: <?=$free?>px; ">&nbsp;</div>
  228. <div class="used" style="width: <?=$used?>px; ">&nbsp;</div>
  229. </td>
  230. </tr>
  231. <?php
  232. if($volume['extra'] != false) {
  233. $total_total += $volume['extra']['total'];
  234. $total_used += $volume['extra']['used'];
  235. // Meter
  236. $used = $max/$volume['extra']['total']*$volume['extra']['used'];
  237. $free = $max-$used;
  238. ?>
  239. <tr>
  240. <td>Extra volume:</td>
  241. <td><?=round($volume['extra']['used']/1024)?> / <?=round($volume['extra']['total']/1024)?> MB</td>
  242. <td>
  243. <div class="free" style="width: <?=$free?>px; ">&nbsp;</div>
  244. <div class="used" style="width: <?=$used?>px; background-color: #4D7AEE; ">&nbsp;</div>
  245. </td>
  246. </tr>
  247. <?php
  248. } else {
  249. ?>
  250. <tr><td colspan="3"><div style="border: 1px solid #222222; ">&nbsp;</div></td></tr>
  251. <?php
  252. }
  253. ?>
  254. </table>
  255. </div>
  256. <?php
  257. }
  258.  
  259. $used = $max/$total_total*$total_used;
  260. $free = $max-$used;
  261. ?>
  262. <div class="account">
  263. <h2><img src="<?=$filename?>img=account" alt="" /> Total</h2>
  264. <br />
  265. <table>
  266. <tr>
  267. <td>Overall volume:</td>
  268. <td><?=round($total_used/1024/1024,1)?> / <?=round($total_total/1024/1024,1)?> GB</td>
  269. <td>
  270. <div class="free" style="width: <?=$free?>px; ">&nbsp;</div>
  271. <div class="used" style="width: <?=$used?>px; background-color: #EE4D4D; ">&nbsp;</div>
  272. </td>
  273. </tr>
  274. </table>
  275. </div>
  276. </body>
  277. </html>
Download code! Download code (.txt)

 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (3)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.036s