-
-
Save fbartels/7a67182274d233ef436d to your computer and use it in GitHub Desktop.
PHP Script to wake a defined system (WoL).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
################################################## | |
## php WoL with port check - PRThomasUK. ## | |
## blog.pete-thomas.me.uk ## | |
################################################## | |
// | |
// ################## user variables... ################## | |
// Friendly name for device, example "My Computer". | |
$device = "NAS"; | |
// IP address of device, example "x.x.x.x". | |
$deviceip = "192.168.178.11"; | |
// TCP Port on device to check, example "3389" = RDP, "80" = WebServer. | |
$deviceport = "5000";1 | |
// MAC address of NIC1 on device, example "00:00:00:00:00:00" or "00-00-00-00-00-00". | |
$devicemac1 = "xx:xx:xx:xx:xx:xx"; | |
// MAC address of NIC2 on device, example "00:00:00:00:00:00" or "00-00-00-00-00-00". - Optional set to "" if NIC2 not required. | |
$devicemac2 = ""; | |
// Number of times to attempt to connect to port on device after magic packet sent, example "10" | |
$maxtries = "10"; | |
// Broadcast address of network, example ""x.x.x.x". ("255.255.255.255" works in most cases.) | |
$broadcast = "255.255.255.255"; | |
// ICMP port number, default "7". | |
$udport = "7"; | |
// Timeout value for re-tries (in seconds), default "10". | |
$timeout = "10"; | |
// ####################################################### | |
// | |
// ##### Read in variables from url ##### | |
// | |
// $frame - used to determine which content to display when executed. | |
$frame = $_GET[ "frame" ]; | |
// $tries - used to determine number of attempts at checking port beetween reloads, compared with maxtries. | |
$tries = $_GET[ "tries" ]; | |
// $pageurl - obtain URL used to access file, used when creating frameset & setting reloads. | |
$pageurl = pageurl(); | |
// Process variables used in frame2, increments tries & sets status to Success(1) or Failed(2) | |
if ( $frame == 2 ) { | |
processurl(); | |
} | |
// ###### Functions ###### | |
// | |
// function pageurl( ) - Returns URL of page via PHP variables. | |
function pageurl( ) | |
{ | |
$pageurl = "HTTP"; | |
if ( $_SERVER[ "HTTPS" ] == "on" ) { | |
$pageurl .= "S"; | |
} | |
$pageurl .= "://"; | |
if ( $_SERVER[ "SERVER_PORT" ] != "80" ) { | |
$pageurl .= $_SERVER[ "SERVER_NAME" ] . ":" . $_SERVER[ "SERVER_PORT" ] . $_SERVER[ "REQUEST_URI" ]; | |
} else { | |
$pageurl .= $_SERVER[ "SERVER_NAME" ] . $_SERVER[ "REQUEST_URI" ]; | |
} | |
$urlarts = explode( "?", $pageurl ); | |
$pageurl = $urlarts[ "0" ]; | |
return $pageurl; | |
} | |
// function processurl( ) - Processes variables used in frame2, increments tries & sets status to Success(1) or Failed(2) | |
function processurl( ) | |
{ | |
global $status, $tries, $maxtries; | |
if ( $status == 0 && $tries < $maxtries - 1 ) { | |
$tries = $tries + 1; | |
} else { | |
$status = 2; | |
} | |
if ( portcheck() == 0 ) { | |
$status = 1; | |
} | |
} | |
// function wakeonlan() - Attempts to send WoL packet and returns outcome. | |
function wakeonlan( $device, $mac ) | |
{ | |
global $broadcast, $udport; | |
$mac = ereg_replace( "[^A-Za-z0-9]", ":", $mac ); | |
$broadcast_byte = explode( ':', $mac ); | |
$hw_addr = ''; | |
for ( $a = 0; $a < 6; $a++ ) | |
$hw_addr .= chr( hexdec( $broadcast_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 ) { | |
$content = "Error creating socket!\n"; | |
} else { | |
// setting a broadcast option to socket: | |
$opt_ret = socket_set_option( $s, 1, 6, true ); | |
if ( $opt_ret < 0 ) { | |
$content = "setsockopt() failed, error: " . strerror( $opt_ret ) . "\n"; | |
} | |
if ( socket_sendto( $s, $msg, strlen( $msg ), 0, $broadcast, $udport ) ) { | |
$content = "WoL packet sent to mac address " . $mac . "...\n"; | |
socket_close( $s ); | |
} else { | |
$content = "Failed to send WoL packet!"; | |
} | |
} | |
return $content; | |
} | |
// function portcheck( ) - Attempts to connect to TCP port on the device via a Socket, returns $errno. | |
function portcheck( ) | |
{ | |
global $deviceip, $deviceport; | |
$file = fsockopen( $deviceip, $deviceport, $errno, $errstr, 50 ); | |
if ( $errno == 0 ) { | |
fclose( $file ); | |
} | |
return $errno; | |
} | |
// function htmlheader( ) - Returns HTML Header for TITLE and if Frame2 REFRESH set. | |
function htmlheader( ) | |
{ | |
global $device, $frame, $tries, $maxtries, $status, $pageurl, $timeout; | |
// global "custom" header settings | |
$content = "<TITLE>Wake on Lan ($device)</TITLE>\n"; | |
//generate refresh header for frame2. | |
if ( $frame == 2 && $status == 0 ) { | |
$content .= "<META HTTP-EQUIV=\"refresh\" CONTENT=\"$timeout;url=$pageurl?frame=$frame&tries=$tries\">\n"; | |
} | |
return $content; | |
} | |
// function htmlheader( ) - Returns HTML content for mainpage, frame1 & frame2 based on value of $frame. | |
function htmlcontent( ) | |
{ | |
global $pageurl, $device, $deviceip, $deviceport, $devicemac1, $devicemac2, $frame, $tries, $maxtries, $status; | |
if ( $frame == 2 ) { | |
if ( $status == 0 ) { | |
$content = "<H3>$tries/$maxtries attempts to connect to $deviceip:$deviceport completed.</H3>\n"; | |
} elseif ( $status == 1 ) { | |
$content = "<FONT COLOR=\"green\">\n"; | |
$content .= "<H1>SUCCESS!!!</H1>\n"; | |
$content .= "</FONT>\n"; | |
$content .= "<H3>Connection made to $device ($deviceip:$deviceport).</H3>\n"; | |
$content .= "<a href='../' target='_top'>back to the portal</a>"; | |
} else { | |
$content = "<FONT COLOR=\"red\">\n"; | |
$content .= "<H1>FAILED...</H1>\n"; | |
$content .= "</FONT>\n"; | |
$content .= "<H3>Unable to connect to $device ($deviceip:$deviceport).</H3>\n"; | |
} | |
} elseif ( $frame == 1 ) { | |
$content = "<FONT COLOR=\"navy\">\n"; | |
$content .= "<H1>Wake on Lan ($device)</H1>\n"; | |
$content .= "</FONT>\n"; | |
$content .= wakeonlan( $device, $devicemac1 ); | |
if ( $devicemac2 ) { | |
$content .= "<BR>\n"; | |
$content .= wakeonlan( $device, $devicemac2 ); | |
} | |
} else { | |
$content = "<FRAMESET rows=\"130,*\" frameborder=0 border=0 framespacing=5>\n"; | |
$content .= "<FRAME SRC=\"$pageurl?frame=1\">\n"; | |
$content .= "<FRAME SRC=\"$pageurl?frame=2\">\n"; | |
$content .= "<NOFRAMES>\n"; | |
$content .= "<FONT COLOR=\"navy\">\n"; | |
$content .= "<H1>Wake on Lan ($device)</H1>\n"; | |
$content .= "</FONT>\n"; | |
$content .= wakeonlan( $device, $devicemac1 ); | |
if ( $devicemac2 ) { | |
$content .= "<BR>\n"; | |
$content .= wakeonlan( $device, $devicemac2 ); | |
} | |
$content .= "<BR>\n"; | |
$content .= "<BR>\n"; | |
$content .= "<FONT COLOR=\"red\">\n"; | |
$content .= "<H2>Your browser does not support frames...</H2>\n"; | |
$content .= "</FONT>\n"; | |
$content .= "<H3>Status of $device will not be monitored!</H3>\n"; | |
$content .= "</NOFRAMES>\n"; | |
$content .= "</FRAMESET>\n"; | |
} | |
return $content; | |
} | |
?> | |
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> | |
<HTML> | |
<HEAD> | |
<?php | |
echo htmlheader(); | |
?> | |
<META NAME="author" CONTENT="Felix Bartels"> | |
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8"> | |
<META HTTP-EQUIV="cache-control" CONTENT="no-cache"> | |
<META HTTP-EQUIV="pragma" CONTENT="no-cache"> | |
<META NAME="robots" CONTENT="none"> | |
<META NAME="rating" CONTENT="safe for kids"> | |
</HEAD> | |
<?php | |
echo htmlcontent(); | |
?> | |
</HTML> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment