sto cercando di scrivere una piccola utility per utilizzare il WoL (Wake On Lan) coil mio router...
L'ho scritta stupidamente in PHP sperando che l'apache installato nel router avesse il modulo PHP ma non è così...
Purtroppo sono MOLTO arrugginito in C e non ho mai scritto una CGI per cui mi risulta piuttosto complicato proseguire da solo...
C'è qualcuno che molto gentilmente mi farebbe la conversione o per lo meno mi instraderebbe???
Codice:
Codice: Seleziona tutto
<?php
flush();
function WakeOnLan($addr, $mac,$socket_number) {
$addr_byte = explode(':', $mac);
$hw_addr = '';
for ($a=0; $a <6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));
$msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;
$s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($s == false) {
echo "Imposibile creare il socket!\n";
echo "Codice errore: '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
return FALSE;
} else {
$opt_ret = socket_set_option($s, 1, 6, TRUE);
if($opt_ret <0) {
echo "setsockopt() fallita con errore: " . strerror($opt_ret) . "\n";
return FALSE;
}
if(socket_sendto($s, $msg, strlen($msg), 0, $addr, $socket_number)) {
echo "Magic Packet inviato correttamente!";
socket_close($s);
return TRUE;
} else {
echo "Invio del Magic packet fallito!";
return FALSE;
}
}
}
function validateMAC($MAC){
$MACregEx = '[0-9a-fA-F]{12}';
$MACSize = strlen($MAC);
if ($MACSize < 12){
$errSize = 12-$MACSize;
$res['MAC']['result'] = false;
$res['MAC']['Error'] = "Indirizzo MAC(".$MAC.") troppo corto! Mancano ".$errSize." caratteri.";
}
elseif ($MACSize > 12){
$errSize = $MACSize-12;
$res['MAC']['result'] = false;
$res['MAC']['Error'] = "Indirizzo MAC(".$MAC.") troppo lungo! ".$errSize." caratteri di troppo.";
}else{
if (!ereg($MACregEx, $MAC)){
$res['MAC']['result'] = false;
$res['MAC']['Error'] = "L'indirizzo MAC(".$MAC.") contine caratteri non validi!";
}else{
$res['MAC']['result'] = true;
$res['MAC']['Error'] = "Indirizzo MAC(".$MAC.") valido!";
}
}
return $res['MAC'];
}
// check an IP is valid
function validateIP($IP, $except = false){
// except is used for Addresses that can have their 4th octate set to 255
$pieces = explode(".", $IP);
if (count($pieces) < 4) {// check that there is not less than 4 octates{
$res['IP']['Error'] = "Indirizzo IP troppo corto";
$res['IP']['result'] = false;
}elseif (count($pieces) > 4){// check that there is not more than 4 octates
$res['IP']['Error'] = "Indirizzo IP troppo lungo";
$res['IP']['result'] = false;
}
else
{
for($i = 0; $i < 4; $i++){
if (!is_numeric($pieces[$i])) // check each octate is numeric
{
$res['IP']['Error'] = "L'indirizzo IP contiene caratteri non numerici!";
$res['IP']['result'] = false;
break;
}
if ((($pieces[$i] > 255 ) || ($pieces[$i] == "")) && ($i < "3")){
$res['IP']['Error'] = "Parte dell'indirizzo IP è maggiore di 255 o non è NULL";
$res['IP']['result'] = false;
break;
}else{
if ($except){
if (($pieces[$i] > 255 ) || ($pieces[$i] == "")){
$res['IP']['Error'] = "La parte finale dell'indirizzo IP è maggiore di 255 o non è NULL";
$res['IP']['result'] = false;
break;
}else{
$res['IP']['result'] = true;
}
}else{
if (($pieces[$i] > 254 ) || ($pieces[$i] == "")){
$res['IP']['Error'] = "La parte finale dell'indirizzo IP è maggiore di 254 o non è NULL";
$res['IP']['result'] = false;
break;
} else {
$res['IP']['result'] = true;
}
}
}
}
}
return $res['IP'];
}
//Porta di ascolto del WoL
$socket_number = "7";
//MAC della scheda di rete
$mac_addy = @$_REQUEST['mac'];
//IP del computer
$ip_addy = gethostbyname(@$_REQUEST['ip']);
//Controllo MAC
$confirm = validateMAC(str_replace(':','',$mac_addy));
if($confirm['result']==false){
echo $confirm['Error'];
exit(1);
}
//Controllo IP
$confirm = validateip($ip_addy);
if($confirm['result']==false){
echo $confirm['Error'];
exit(1);
}
//Invio il pacchetto!
WakeOnLan($ip_addy, $mac_addy,$socket_number);
?>
