diff --git a/ffrouter_parsen.function.php b/ffrouter_parsen.function.php index 22ab452..605f20d 100644 --- a/ffrouter_parsen.function.php +++ b/ffrouter_parsen.function.php @@ -4,107 +4,249 @@ * @copyright 2016 Caspar Armster, Freifunk Hennef/Freie Netzwerker e.V. (www.freifunk-hennef.de / www.freie-netzwerker.de) * @license Licensed under GPLv3 */ -if(!is_dir($firmware_download_path)) { - throw new Exception("Firmwareverzeichnis existiert nicht!"); +function remoteFileExists($url) { + $curl = curl_init($url); + + //don't fetch the actual page, you only want to check the connection is ok + curl_setopt($curl, CURLOPT_NOBODY, true); + + //do request + $result = curl_exec($curl); + + $ret = false; + + //if request did not fail + if ($result !== false) { + //if request was ok, check response code + $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + if ($statusCode == 200) { + $ret = true; + } + } + + curl_close($curl); + + return $ret; } -$err = 0; -for( $i=0; $ihersteller, $router_tmp[$x]['hersteller']) == 0) && (strcasecmp($router[$z]->modell, $router_tmp[$x]['modell']) == 0) && (strcasecmp($router[$z]->version, $router_tmp[$x]['version']) == 0)) { - $entinst = $entwicklung[$i].$installation[$j]; - $entinstlink = $entwicklung[$i].$installation[$j]."link"; - $router[$z]->$entinst = 1; - $router[$z]->$entinstlink = $firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/".$files[$entwicklung[$i]][$installation[$j]][$x]; - $router_neu = 0; - break; + } else { + $pos = stripos($files[$entwicklung[$i]][$installation[$j]][$x], 'manifest'); + if($pos !== false) { + array_splice($files[$entwicklung[$i]][$installation[$j]], $x, 1); + $x--; } } } - if($router_neu == 1) { - $z = count($router); - $router[$z] = new ffrouter(); - $router[$z]->hersteller = $router_tmp[$x]['hersteller']; - $router[$z]->version = $router_tmp[$x]['version']; - $router[$z]->modell = $router_tmp[$x]['modell']; - $entinst = $entwicklung[$i].$installation[$j]; - $entinstlink = $entwicklung[$i].$installation[$j]."link"; - $router[$z]->$entinst = 1; - $router[$z]->$entinstlink = $firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/".$files[$entwicklung[$i]][$installation[$j]][$x]; - } } } } - $router_tmp = array(); + } + for( $i=0; $i<$entwicklung_count; $i++ ) { + for( $j=0; $j<$installation_count; $j++ ) { + if($variante[$entwicklung[$i]][$installation[$j]] == 1) { + $x = 0; + while($files[$entwicklung[$i]][$installation[$j]][$x] !== false) { + $pos_hersteller[$entwicklung[$i]][$installation[$j]] = stripos($files[$entwicklung[$i]][$installation[$j]][$x], "tp-link"); + if ($pos_hersteller[$entwicklung[$i]][$installation[$j]] !== false) { + break; + } + $x++; + } + } else { + $pos_hersteller[$entwicklung[$i]][$installation[$j]] = 0; + } + } + } + $router = array(); + for( $i=0; $i<$entwicklung_count; $i++ ) { + for( $j=0; $j<$installation_count; $j++ ) { + if($variante[$entwicklung[$i]][$installation[$j]] == 1) { + $file_count = count($files[$entwicklung[$i]][$installation[$j]]); + for( $x=0; $x<$file_count; $x++) { + for( $y=0; $y<$anzahl_hersteller; $y++) { + if($pos = stripos($files[$entwicklung[$i]][$installation[$j]][$x], $hersteller[$y]['filename'], $pos_hersteller[$entwicklung[$i]][$installation[$j]]-1) !== false) { + $router_tmp[$x]['hersteller'] = $hersteller[$y]['name']; + switch($router_tmp[$x]['hersteller']) { + case "D-Link": + $router_tmp[$x]['version'] = substr($files[$entwicklung[$i]][$installation[$j]][$x], strripos($files[$entwicklung[$i]][$installation[$j]][$x], "rev"), -4-$offset_sysupgrade[$j]); + break; + case "GL-Inet (alt)": + $router_tmp[$x]['version'] = substr($files[$entwicklung[$i]][$installation[$j]][$x], strripos($files[$entwicklung[$i]][$installation[$j]][$x], "v"), -4-$offset_sysupgrade[$j]); + break; + case "TP-Link": + $router_tmp[$x]['version'] = substr($files[$entwicklung[$i]][$installation[$j]][$x], strripos($files[$entwicklung[$i]][$installation[$j]][$x], "v"), -4-$offset_sysupgrade[$j]); + break; + default: + $router_tmp[$x]['version'] = "Alle"; + } + $router_tmp[$x]['modell'] = strtoupper(substr($files[$entwicklung[$i]][$installation[$j]][$x], $pos_hersteller[$entwicklung[$i]][$installation[$j]]+$hersteller[$y]['offset_modell'], strripos($files[$entwicklung[$i]][$installation[$j]][$x], ".", -4)-strlen($files[$entwicklung[$i]][$installation[$j]][$x])-strlen($router_tmp[$x]['version'])+$hersteller[$y]['offset_version']-$offset_sysupgrade[$j])); + } + } + if(isset($router_tmp[$x]['hersteller']) != true) { + $error_text[$err]="Unbekannten Hersteller im Dateinamen gefunden, bitte Script updaten! (".$files[$entwicklung[$i]][$installation[$j]][$x].")"; + $err++; + } else { + $router_neu = 1; + $router_count = count($router); + for( $z=0; $z<$router_count; $z++) { + if(isset($router[$z])) { + if((strcasecmp($router[$z]->hersteller, $router_tmp[$x]['hersteller']) == 0) && (strcasecmp($router[$z]->modell, $router_tmp[$x]['modell']) == 0) && (strcasecmp($router[$z]->version, $router_tmp[$x]['version']) == 0)) { + $entinst = $entwicklung[$i].$installation[$j]; + $entinstlink = $entwicklung[$i].$installation[$j]."link"; + $router[$z]->$entinst = 1; + $router[$z]->$entinstlink = $firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/".$files[$entwicklung[$i]][$installation[$j]][$x]; + $router_neu = 0; + break; + } + } + } + if($router_neu == 1) { + $z = count($router); + $router[$z] = new ffrouter(); + $router[$z]->hersteller = $router_tmp[$x]['hersteller']; + $router[$z]->version = $router_tmp[$x]['version']; + $router[$z]->modell = $router_tmp[$x]['modell']; + $entinst = $entwicklung[$i].$installation[$j]; + $entinstlink = $entwicklung[$i].$installation[$j]."link"; + $router[$z]->$entinst = 1; + $router[$z]->$entinstlink = $firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/".$files[$entwicklung[$i]][$installation[$j]][$x]; + } + } + } + } + $router_tmp = array(); + } + } +}else{ + //Check if URL is reachable + if (!remoteFileExists($firmware_download_path)) { + throw new Exception("Firmwareverzeichnis offline oder nicht existent!"); + } + + $err = 0; + $entwicklung_count = count($entwicklung); + $installation_count = count($installation); + for( $i=0; $i<$entwicklung_count; $i++ ) { + if (remoteFileExists($firmware_download_path.$entwicklung[$i]."/")) { + for( $j=0; $j<$installation_count; $j++ ) { + //Check if URL has index file (refer to https://forums.phpfreaks.com/topic/112764-using-scandir-on-other-websites/?p=579166 <- scandir has problem with index files) + if ((@remoteFileExists($firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/index.htm"))||(@remoteFileExists($firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/index.html"))||(@remoteFileExists($firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/index.php"))) { + throw new Exception("Firmwareverzeichnis darf keine index files besitzen!"); + } + $variante[$entwicklung[$i]][$installation[$j]] = 1; + preg_match_all('/href=[\'"]?([^\'" >]+)/', file_get_contents($firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/"), $files_in_HTTP); + foreach($files_in_HTTP["0"] as $key=>$value){ + if (strpos($value, 'manifest') !== false) { + unset($files_in_HTTP["0"][$key]); + } + } + foreach($files_in_HTTP["0"] as $key=>$value){ + $files_in_HTTP["0"][$key]=substr($value, 6); + } + $files[$entwicklung[$i]][$installation[$j]] = array_slice($files_in_HTTP["0"], 1); + } + } + } + + for( $i=0; $i<$entwicklung_count; $i++ ) { + for( $j=0; $j<$installation_count; $j++ ) { + if($variante[$entwicklung[$i]][$installation[$j]] == 1) { + $x = 0; + while($files[$entwicklung[$i]][$installation[$j]][$x] !== false) { + $pos_hersteller[$entwicklung[$i]][$installation[$j]] = stripos($files[$entwicklung[$i]][$installation[$j]][$x], "tp-link"); + if ($pos_hersteller[$entwicklung[$i]][$installation[$j]] !== false) { + break; + } + $x++; + } + } else { + $pos_hersteller[$entwicklung[$i]][$installation[$j]] = 0; + } + } + } + $router = array(); + for( $i=0; $i<$entwicklung_count; $i++ ) { + for( $j=0; $j<$installation_count; $j++ ) { + if($variante[$entwicklung[$i]][$installation[$j]] == 1) { + $file_count = count($files[$entwicklung[$i]][$installation[$j]]); + for( $x=0; $x<$file_count; $x++) { + $anzahl_hersteller = count($hersteller); + for( $y=0; $y<$anzahl_hersteller; $y++) { + if($pos = stripos($files[$entwicklung[$i]][$installation[$j]][$x], $hersteller[$y]['filename'], $pos_hersteller[$entwicklung[$i]][$installation[$j]]-1) !== false) { + $router_tmp[$x]['hersteller'] = $hersteller[$y]['name']; + switch($router_tmp[$x]['hersteller']) { + case "D-Link": + $router_tmp[$x]['version'] = substr($files[$entwicklung[$i]][$installation[$j]][$x], strripos($files[$entwicklung[$i]][$installation[$j]][$x], "rev"), -4-$offset_sysupgrade[$j]); + break; + case "GL-Inet (alt)": + $router_tmp[$x]['version'] = substr($files[$entwicklung[$i]][$installation[$j]][$x], strripos($files[$entwicklung[$i]][$installation[$j]][$x], "v"), -4-$offset_sysupgrade[$j]); + break; + case "TP-Link": + $router_tmp[$x]['version'] = substr($files[$entwicklung[$i]][$installation[$j]][$x], strripos($files[$entwicklung[$i]][$installation[$j]][$x], "v"), -4-$offset_sysupgrade[$j]); + break; + default: + $router_tmp[$x]['version'] = "Alle"; + } + $router_tmp[$x]['modell'] = strtoupper(substr($files[$entwicklung[$i]][$installation[$j]][$x], $pos_hersteller[$entwicklung[$i]][$installation[$j]]+$hersteller[$y]['offset_modell'], strripos($files[$entwicklung[$i]][$installation[$j]][$x], ".", -4)-strlen($files[$entwicklung[$i]][$installation[$j]][$x])-strlen($router_tmp[$x]['version'])+$hersteller[$y]['offset_version']-$offset_sysupgrade[$j])); + } + } + if(isset($router_tmp[$x]['hersteller']) != true) { + $error_text[$err]="Unbekannten Hersteller im Dateinamen gefunden, bitte Script updaten! (".$files[$entwicklung[$i]][$installation[$j]][$x].")"; + $err++; + } else { + $router_neu = 1; + $router_count = count($router); + for( $z=0; $z<$router_count; $z++) { + if(isset($router[$z])) { + if((strcasecmp($router[$z]->hersteller, $router_tmp[$x]['hersteller']) == 0) && (strcasecmp($router[$z]->modell, $router_tmp[$x]['modell']) == 0) && (strcasecmp($router[$z]->version, $router_tmp[$x]['version']) == 0)) { + $entinst = $entwicklung[$i].$installation[$j]; + $entinstlink = $entwicklung[$i].$installation[$j]."link"; + $router[$z]->$entinst = 1; + $router[$z]->$entinstlink = $firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/".$files[$entwicklung[$i]][$installation[$j]][$x]; + $router_neu = 0; + break; + } + } + } + if($router_neu == 1) { + $z = count($router); + $router[$z] = new ffrouter(); + $router[$z]->hersteller = $router_tmp[$x]['hersteller']; + $router[$z]->version = $router_tmp[$x]['version']; + $router[$z]->modell = $router_tmp[$x]['modell']; + $entinst = $entwicklung[$i].$installation[$j]; + $entinstlink = $entwicklung[$i].$installation[$j]."link"; + $router[$z]->$entinst = 1; + $router[$z]->$entinstlink = $firmware_download_path.$entwicklung[$i]."/".$installation[$j]."/".$files[$entwicklung[$i]][$installation[$j]][$x]; + } + } + } + } + $router_tmp = array(); + } } } -for( $i=0; $ihersteller))) { if(is_file(strtolower("router_images/".$router[$i]->hersteller."/".$router[$i]->modell."-".$router[$i]->version.".jpg"))) { $router[$i]->imagefront = strtolower("router_images/".$router[$i]->hersteller."/".$router[$i]->modell."-".$router[$i]->version.".jpg");