FritzBox PHP API - WOL-Modul
Moinmoin!
Für ein kleines Projekt von mir brauchte ich ein Script das mir einen Rechner aus dem Standby holt.
Da es entweder generell oder nur bei mir nicht möglich ist ein WOL-Paket von einem WLAN-Rechner aus zu senden musste ich mich an die Funktion der FritzBox halten und ich bin sehr dankbar das ich diese API gefunden habe die mit zeigte wie ich diese anzusprechen habe.
Um etwas zurück zu geben habe ich meinen Code an das Format der PHP-API angepast und möchte hier das FritzBox-WOL-Modul vorstellen.
Nocheinmal vielen Dank für die schöne API und viel Spaß mit dem WOL-Modul )
Gruß,
-whirpool
-------------------------------------------------------------------------------
Anmerkungen:
-Getestet ist es mit einer FritzBox 7390. Wenn sich andere Modelle in den Bezeichnungen unterscheiden müsste da natürlich nachgebessert werden.
-Ich bin nicht mit dem Error-Handling vertraut und habe mich einfach an die verwendete Schablone gehalten.
-Es existiert kein Check ob eine übergebene DeviceID auch tatsächlich existiert, bei einem übergebenen Namen hingegen schon.
-Ich erhebe keinen Anspruch auf den Code. Tüftelt nach herzenswusch daran rum!
-------------------------------------------------------------------------------
Anhang anzeigen fritzbox_wol.php.zip
Moinmoin!
Für ein kleines Projekt von mir brauchte ich ein Script das mir einen Rechner aus dem Standby holt.
Da es entweder generell oder nur bei mir nicht möglich ist ein WOL-Paket von einem WLAN-Rechner aus zu senden musste ich mich an die Funktion der FritzBox halten und ich bin sehr dankbar das ich diese API gefunden habe die mit zeigte wie ich diese anzusprechen habe.
Um etwas zurück zu geben habe ich meinen Code an das Format der PHP-API angepast und möchte hier das FritzBox-WOL-Modul vorstellen.
Nocheinmal vielen Dank für die schöne API und viel Spaß mit dem WOL-Modul )
Gruß,
-whirpool
-------------------------------------------------------------------------------
Anmerkungen:
-Getestet ist es mit einer FritzBox 7390. Wenn sich andere Modelle in den Bezeichnungen unterscheiden müsste da natürlich nachgebessert werden.
-Ich bin nicht mit dem Error-Handling vertraut und habe mich einfach an die verwendete Schablone gehalten.
-Es existiert kein Check ob eine übergebene DeviceID auch tatsächlich existiert, bei einem übergebenen Namen hingegen schon.
-Ich erhebe keinen Anspruch auf den Code. Tüftelt nach herzenswusch daran rum!
-------------------------------------------------------------------------------
Anhang anzeigen fritzbox_wol.php.zip
PHP:
<?php
/**
* Fritz!Box PHP tools CLI script to start a suspended PC via WakeOnLan
*
* Must be called via a command line, shows a help message if called without any or an invalid argument
* Can log to the console or a logfile or be silent
*
* Check the config file fritzbox.conf.php!
*
* @author whirpool <contact me via PM at http://www.ip-phone-forum.de>
* @author Gregor Nathanael Meyer <Gregor [at] der-meyer.de>
* @license http://creativecommons.org/licenses/by-sa/3.0/de/ Creative Commons cc-by-sa
* @version 0.2 2014-04-16
* @package Fritz!Box PHP tools
*/
try
{
// load the fritzbox_api class
require_once('fritzbox_api.class.php');
$fritz = new fritzbox_api();
// init the output message
@$message = date('Y-m-d H:i') . ' ';
// Process the 'list' argument
if( isset($argv[1]) and strtolower($argv[1]) == "list")
{
// read the current settings
$formfields = array('getpage' => '/net/network_user_devices.lua');
$output = $fritz->doGetRequest($formfields);
// Magically match the fields we need
preg_match_all("|\{[^\}]*?\[\"UID\"\][^\"]+\"([^\"]+)\"". // this is the FritzBox internal DeviceID
"[^\}]*?\[\"ethernet\"\][^\"]+\"1\"". // only match cable connected devices (WiFi has a value of '0')
"[^\}]*?\[\"ip\"\][^\"]+\"([^\"]+)\"". // grep the device IP
"[^\}]*?\[\"name\"\][^\"]+\"([^\"]+)\"|s" // grep the device name
,$output, $matchArr, PREG_SET_ORDER);
// Output a list of known devices with name, IP and deviceID
echo "\n\n Name IP DeviceID\n";
foreach($matchArr as $num => $content) {
echo " ".str_pad($content['3'],25).str_pad($content['2'],20).$content['1']."\n";
}
echo "\n";
}
// Process arguments suppling a DeviceID
elseif( isset($argv[1]) and (preg_match("/^landevice[\d]+$/", $argv[1]) or preg_match("/^-id=(landevice[\d]+)$/", $argv[1], $idArr)) )
{
if(preg_match("/^landevice[\d]+$/", $argv[1])) {
$deviceID = $argv[1];
} else {
$deviceID = $idArr[1];
}
// Triggering the WOL-Package
$formfields['getpage'] = "/net/edit_device.lua";
$formfields['btn_wake'] = "";
$formfields['dev'] = $deviceID;
$output = $fritz->doPostForm($formfields);
$message .= "Sent WOL-Package to device: ".$deviceID;
}
// Process argument suppling the Device-Name
elseif( isset($argv[1]) and preg_match("/^-name=(.+)$/", $argv[1], $nameArr) )
{
// read the current settings
$formfields = array('getpage' => '/net/network_user_devices.lua');
$output = $fritz->doGetRequest($formfields);
// Try to match the DeviceName to a DeviceID
if(preg_match("|\{[^\}]*?\[\"UID\"\][^\"]+\"([^\"]+)\"". // this is the FritzBox internal DeviceID
"[^\}]*?\[\"ethernet\"\][^\"]+\"1\"". // only match cable connected devices (WiFi has a value of '0')
"[^\}]*?\[\"name\"\][^\"]+\"".$nameArr[1]."\"|s" // match the device name
,$output, $matchArr))
{
// Triggering the WOL-Package
$formfields['getpage'] = "/net/edit_device.lua";
$formfields['btn_wake'] = "";
$formfields['dev'] = $matchArr[1];
$output = $fritz->doPostForm($formfields);
$message .= "Sent WOL-Package to device: ".$matchArr[1]." (".$nameArr[1].")";
}
// Notify the User if the given DeviceName could not be matched to a DeviceID
else
{
if ( $fritz->config->getItem('logging') == 'console' )
{
echo '
No device named "'.$nameArr[1].'" was found!
Please check your spelling or run with the \'list\' argument to see all currently known devices!
';
}
else
{
$fritz->logMessage($message . 'ERROR: No WOL capable device named \''.$nameArr[1].'\' found!');
}
$fritz = null; // destroy the object to log out
exit;
}
}
// Display a help message if no (valid) CLI argument was given
else
{
if ( $fritz->config->getItem('logging') == 'console' )
{
echo '
Sends a WOL-Magic-Packet to a given Device waking it from Standby
Usage on UNIX systems:
/path/to/php ' . $argv[0] . ' {list | DeviceID | -id=DeviceID | -name=DeviceName}
Usage on Windows systems:
"c:\path\to\php.exe" ' . $argv[0] . ' {list | DeviceID | -id=DeviceID | -name=DeviceName}
DeviceID
The DeviceID is NOT the MAC but a FritzBox internal ID!
The DeviceID changes if/when the FritzBox is rebooted!
Run with the \'list\' argument to see a list of known IDs/Names.
Examples:
WakeUp a Computer with the DeviceID \'landevice1234\'
/path/to/php ' . $argv[0] . ' landevice1234
/path/to/php ' . $argv[0] . ' -id=landevice1234
WakeUp Bob\'s Computer named \'BobsComputer\'
/path/to/php ' . $argv[0] . ' -name=BobsComputer
WakeUp Paul\'s Computer named \'Pauls Computer\'
/path/to/php ' . $argv[0] . ' -name="Pauls Computer"
';
}
else
{
$fritz->logMessage($message . 'ERROR: Script was called without or with an invalid argument');
}
$fritz = null; // destroy the object to log out
exit;
}
}
catch (Exception $e)
{
$message .= $e->getMessage();
}
// log the result
if ( isset($fritz) && is_object($fritz) && get_class($fritz) == 'fritzbox_api' )
{
$fritz->logMessage($message);
}
else
{
echo $message;
}
$fritz = null; // destroy the object to log out
?>