Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

  • grrrommm
  • Registratie: September 2011
  • Laatst online: 14-10-2024
Goedendag,
Dacht laat ik de volgende oplossing maar eens posten, mocht iemand dezelfde probleem hebben als ik had met het aan en uit zetten van mijn server op afstand met Fibaro als interface.

Gebruikte hardware
  • Fibaro Z-Wave Home Center 2
  • Fibaro Power Switch
  • CentOS 7 (op een Desktop)
Uitdaging
- De server van welke locatie dan ook, aan of uitzetten, via de HC2 box van Fibaro.

Probleem
Het is uiteraard heel goed mogelijk om een apparaat aan te zetten met de meeste domotica oplossingen Een simpele setting in de BIOS op het aanzetten van een power-restore zal de PC / Server booten. Een WOL (Wake-up On LAN) pakket kan ook, echter, mijn router dropt de MAC tabel naar verloop van tijd en de settings om dit te veranderen waren niet aanwezig op mijn door de provider geleverde router. Dus, WOL werkte niet, en ook al zou het werken, had ik nog steeds geen mogelijkheid om de server netjes uit te zetten.
Dus het probleem was als volgt:
  • Hoe zorg ik er voor dat ik met HC2 de server netjes aan en uit kan zetten.
De Server Aan
Veruit het makkelijkste. In je BIOS stel je de optie in dat de server aan moet gaan na een zogenoemde power-loss/restore. Door dus simpel je power aan te zetten op afstand doet de server booten. Ik kom later terug hoe je simpel de status van de boot kan monitoren.
Mocht je WOL willen gebruiken, zoals eerder gezegd, het kan prima als je router het ondersteund. De code voor een LUA script kan ik je mailen. In mijn geval was dit geen optie.

De Server Uit
Het meest boeiende probleem. Ik heb geen zin/vond het geen mooie oplossing om een web-pagina te maken die op de server een shutdown start om de volgende redenen:
  • Niet handig, ik wil het via mijn home automation systeem kunnen doen, naar een aparte pagina gaan is niet handig (zeker niet voor mijn vrouw die al dan snel denkt: “Laat maar draaien/ Te moeilijk/ Ik gebruik wel Gmail)
  • Niet echt secure. Een site die een shell commando uitvoert is niet echt mijn favoriete oplossing en al snel wat complexer
Er zijn nog wat andere redenen, dit waren voor mij echter de belangrijkste.

Stap 1
Op de lokale server:
  • Script kijkt of de bezoeker van het lokale netwerk komt, zo niet dan stopt het.
  • Script schrijft een regel naar een file waarin het woord Shutdown voorkomt
<?php
$allow = array('10.','192.168.0.');
$current_ip = $_SERVER['REMOTE_ADDR'];
echo $current_ip;
foreach($allow AS $value)
{
$count = strlen($value);
$block = substr($current_ip,0,$count);
if($block != $value){
echo "You're not allowed here!";
exit();
}
}
echo "You came from a trusted source.....";
echo "Shutdown has been invoked....please standby....";
$filename = '/var/www/html/reboot/up.txt';
$fh = fopen($filename, 'a');
fwrite($fh, 'Trying Shutdown');
fclose($fh);
?>
Stap 2
  • Elke minuut start er een script via cron dat kijkt of er een regel voorkomt waarin staat “Shutdown”. Mocht je niet weten hoe dit werkt, PM me maar.
  • Script haalt de file weg; dit voorkomt een reboot zodra de server weer opkomt
#!/bin/bash
if grep "Shutdown" '/var/www/html/reboot/up.txt'; then
echo "Shutdown found, so reboot"
rm -f /var/www/html/reboot/up.txt
shutdown -P 1 "Shutting down in 1 minute"
else
echo "No Reboot"
fi
Stap 3
- De file moet weer worden aangemaakt (rc.local), met de juiste settings (SELinux enabled, vandaar de chcon)
#!/bin/bash
touch /var/www/html/reboot/up.txt
chown apache /var/www/html/reboot/up.txt
chcon -t httpd_sys_rw_content_t /var/www/html/reboot/up.txt
Stap 4
Om nu via Fibaro het script aan te roepen, moet er een virtueel device worden aangemaakt met 2 buttons, en een label. Eerst moeten echter de variablen aangemaakt worden:
  • GROVER_UP; de status van een succesvolle ping op poort 80
  • GROVER_SHUT; de status of de server in een shutdown is:
  • 0 = No shutdown / Normaal
  • 1 = Shutdown in progress
  • 2 = Starting in progress
Ik gebruik de naam GROVER omdat dit de server naam is in kwestie.
Allereest de stap voor de main loop. Deze loop kijkt constant naar de status van de server door middel van pings en global variabelen:
--[[
%% properties
%% globals
--]]
local myVar1 = fibaro:getGlobalValue('GROVER_UP');
fibaro:debug ("GROVER_UP is ".. myVar1);
local myVar2 = fibaro:getGlobalValue('GROVER_SHUT');
fibaro:debug ("GROVER_SHUT is".. myVar2);
local ditapparaat = fibaro:getSelfId();
fibaro:debug ("id is".. ditapparaat);

tcpSocket = Net.FTcpSocket("192.168.0.180", 80)
bytes, errorCode = tcpSocket:write("test")
if (errorCode == 0) and (myVar2 == "1") then
fibaro:debug ("GROVER = Shutting down");
fibaro:log("Grover Shuting down");
fibaro:call(90, "setProperty", "ui.Label1.value", "Shuting Down");
elseif errorCode == 0 then
fibaro:debug ("GROVER UP");
fibaro:setGlobal("GROVER_UP", "1");
fibaro:call(90, "setProperty", "ui.Label1.value", "Up");
elseif (errorCode ~= 0) and (myVar2 == "2") then
fibaro:debug ("GROVER = Starting up ");
fibaro:log("Grover Starting up");
fibaro:setGlobal("GROVER_UP", "0");
fibaro:call(90, "setProperty", "ui.Label1.value", "Starting Up");
else
fibaro:debug ("GROVER down ");
fibaro:log("Grover down");
fibaro:setGlobal("GROVER_UP", "0");
fibaro:call(90, "setProperty", "ui.Label1.value", "Down");
Stap 5
  • Het script start de pagina op de server,
  • Zet de waarde van GROVER_SHUT op 2 (status shutdown)
  • Wacht 180 seconden voordat de power er af kan
  • Zet de waarde van GROVER_SHUT op 0 (volledige power down)
--[[
%% properties
%% globals
--]]
local myVar2 = fibaro:getGlobalValue('GROVER_SHUT');
fibaro:debug ("Variable GROVER_SHUT".. myVar2);
fibaro:debug ("Starting script on Grover".. myVar2);
-- This start the PHP script that writes a file this will trigger cron
httpSession = Net.FHttp("192.168.0.180", 80);
response = httpSession:GET("/reboot.php");
-- Indicate Server is going down
fibaro:setGlobal("GROVER_SHUT", "1");
fibaro:debug ("Going down....variable GROVER_SHUT".. myVar2);
fibaro:sleep(180000);
fibaro:call(82, 'turnOff');
fibaro:setGlobal("GROVER_SHUT", "0");
fibaro:debug ("All down ....variable GROVER_SHUT".. myVar2);
Stap 6
- Vrij eenvoudig, de server word pas aangezet als de main loop de status aangeeft dat de server daadwerkelijk down is.
--[[
%% properties
%% globals
--]]

-- checking if we arent in a shutdown procedure
local myVar1 = fibaro:getGlobalValue('GROVER_UP');
local myVar2 = fibaro:getGlobalValue('GROVER_SHUT');
fibaro:debug ("waarde van de variable GROVER_UP".. myVar1);
fibaro:debug ("waarde van de variable GROVER_SHUT".. myVar2);
if (myVar1 == '0') then
fibaro:call (82, 'turnOn');
-- Set starting up
fibaro:setGlobal("GROVER_SHUT", "2");
fibaro:debug ("waarde van de variable GROVER_SHUT".. myVar2);
end
Mocht je nu denken: "Ik heb een veel handiger oplossing!", altijd boeiend om te horen. Mocht je plaatjes willen, hulp nodig, of wat dan ook, PM me maar.

Cheers,

Grrrommm

[ Voor 12% gewijzigd door grrrommm op 01-02-2015 14:10 ]


  • Ploink
  • Registratie: April 2002
  • Laatst online: 21-08 13:05
grrrommm schreef op zondag 01 februari 2015 @ 11:41:
Een WOL (Wake-up On LAN) pakket kan ook, echter, mijn router dropt de MAC tabel naar verloop van tijd en de settings om dit te veranderen waren niet aanwezig op mijn door de provider geleverde router.
Een WOL packet stuur je naar het boadcast adres 255.255.255.255 en dat komt overal aan.
Alleen indien de bestemming op een ander subnet zit komt deze broadcast niet door een router, maar dan kun je de subnet broadcast proberen.

  • HeroS
  • Registratie: Januari 2003
  • Laatst online: 16:00

HeroS

SmartHome Nerd

Mooi! Bedankt voor het delen. Ga eens even kijken in me Bios.

Blog over Smart Homes: https://www.hellosmarthome.nl


  • grrrommm
  • Registratie: September 2011
  • Laatst online: 14-10-2024
@Ploink

Klopt, dus daarom niet vanaf elke locatie (lees Internet). Je krijgt het wel werkend om een WOL packet te sturen naar een IP address en een portforward (9) op 255.255.255.255. Uiteraard met het MAC adres in het magic packet.

Probleem hier was echter niet zozeer de PC aan te zetten, meer het netjes uitzetten.

  • Ploink
  • Registratie: April 2002
  • Laatst online: 21-08 13:05
In plaats van te pollen via cron, kijk eens naar inotifywait.
Hiermee kun je actie ondernemen zodra een file verandert, dus je hoeft niet te wachten op de volgende poll.