nl
0

Er zijn nog geen producten in uw winkelwagen geplaatst.

X

Er zijn nog geen producten in uw winkelwagen geplaatst.

Automatisch fileserver aan- en uitzetten

Veel mensen kennen inmiddels de uitdaging van de steeds groter wordende hoeveelheid digitale data.

Foto verzamelingen, verzekeringspolissen, muziekbestanden, videobestanden, belastingaangiftes, noem maar op.

Wellicht zijn er meerdere mensen die daarom net als wij een fileserver hebben ingericht waar al deze gegevens op terecht komen. 

Dit heeft als extra voordeel dat alle gebruikers met hun eigen PC of laptop toegang kunnen krijgen tot deze gegevens en dat ook het maken van een back-up een stuk kan worden vereenvoudigd

 


Maar ja, een fileserver 7 dagen per week 24 uur per dag aan laten staan kost de nodige elektrische energie. Het zou daarom mooi zijn als we deze kosten met onze domotica installatie drastisch zouden kunnen beperken.

Om dit te bewerkstelligen hebben we een oplossing uitgewerkt met de volgende kenmerken:

  1. Zodra een PC die gebruikt maakt van de fileserver wordt aangeschakeld, zorgt de domotica controller er voor dat dit wordt opgemerkt en schakelt daarop de fileserver aan.
  2. Zodra er geen enkele PC uit de lijst van fileserver gebruikers meer aan staat, schakelt deze fileserver zichzelf uit.
  3. Zodra een PC die gebruik maakt van de fileserver wordt ingeschakeld, wordt er na het inschakelen een script uitgevoerd die de gewenste netwerkconnecties herstelt.

De manier waarop we dit hebben uitgewerkt wordt in dit artikel beschreven.

In onze situatie maken we gebruik van een Linux server waarop Samba is geïnstalleerd.

De oplossing kan met enige aanpassingen natuurlijk ook worden gebruikt voor mensen met een op Microsoft Windows gebaseerde server.

 

Deel 1: Het inschakelen van de Fileserver

Voor het inschakelen van de fileserver maken we gebruik van de Fibaro WakeOnLan (WOL)plugin. Door hiervan gebruik te maken is het maken van aparte WOL scripts overbodig geworden.

Bij het ingeven van de gegevens van de fileserver hebben we uitsluitend het MAC adres van de netwerkaansluiting nodig. Zodra dit is ingegeven wordt er automatisch een nieuw (virtual) device aangemaakt die we op de normale manier aan een van onze ruimtes kunnen toewijzen.  

Vervolgens maken we handmatig voor iedere PC die de fileserver moet inschakelen een Virtual Device aan.

In de algemene gegevens van dit Virtual Device vullen we het IP adres van de PC in en als poortnummer gebruiken we 139 (de NetBios poort).

Zorg er wel voor dat de desbetreffende PC altijd hetzelfde IP adres gebruikt. Wij hebben dit ingesteld in onze router maar het kan natuurlijk ook bij de netwerkgegevens van de PC zelf.

We geven het Virtual Device 1 button met de naam “Check Device”en voeren hier de onderstaande Lua code in:

--[[
------------------------------------------------------------------------------------------
Ping script to check the presence of a network device
Date: 		20170109 
Author: 	Henk Kuipers
Website:	https://onsheim.nl
------------------------------------------------------------------------------------------
--]]
-- Parameters
------------------------------------------------------------------------------------------
local PCOnIcon = 1012;                         -- Icon numer displaying PC-On
local PCOffIcon = 1013;                        -- Icon number displaying PC-Off
local GlobalVariableName = "HK_Coolermaster"   -- Global variable name displaying PC status
-------------------------------------------------------------------------------------------

local selfId = fibaro:getSelfId();
local IP = fibaro:get(fibaro:getSelfId(), "IPAddress");
local Port = fibaro:get(fibaro:getSelfId(), "TCPPort");
local tcpSocket = Net.FTcpSocket(IP, Port)

bytes, errorCode = tcpSocket:write("check")

if errorCode == 0
then
  fibaro:log(GlobalVariableName .. " = On");
  fibaro:call(selfId, "setProperty", "currentIcon", PCOnIcon);
  fibaro:call(selfId, "setProperty", "ui.Status.value","On");
  fibaro:setGlobal(GlobalVariableName, "On");
else
  fibaro:log(GlobalVariableName .. " = Off");
  fibaro:call(selfId, "setProperty", "currentIcon", PCOffIcon);
  fibaro:call(selfId, "setProperty", "ui.Status.value","Off");
  fibaro:setGlobal(GlobalVariableName, "Off");
end

In het script worden een drietal parameters gebruikt die aan uw specifieke situatie zullen moeten worden aangepast. Allereerst moet er voor iedere PC een globale variabele worden aangemaakt waarin we vastleggen of de PC aan of uit staat. De naam van deze variabele specificeren we bij “GlobalVariableName”.

Verder is het natuurlijk erg fijn als we in onze Fibaro User Interface ook aan de icons kunnen zien of een PC aan of uit staat. Nadat u de desbetreffende icons aan de Fibaro controller hebt toegevoegd kunt u het index nummer van het desbetreffende icon in de parameter sectie opnemen.

Om het indexnummer van uw icons te vinden kunt u het beste gebruik maken van de HC2-Toolkit. Deze Toolkit zoals ontwikkeld door een Domotica enthousiast uit Frankrijk is hier te downloaden.

Nu we voor iedere PC een Virtual Device hebben aangemaakt moet er natuurlijk ook periodiek worden gecontroleerd of het device aan of uit staat. Normaalgesproken kunnen we zoiets in de Main Loop van het Virtual Device laten uitvoeren maar om dit nu iedere seconde te laten doen zorgt wel voor een erg grote en onnodige belasting van de controller.

Vandaar dat we een scene aanmaken die 1 keer per minuut wordt uitgevoerd. Een scene die we zelf trouwens voor meerdere doeleinden toepassen. In deze scene die we gewoon via grafische blokken kunnen aanmaken zorgen we er voor dat iedere minuut op de "CheckDevice" button van de zojuist aangemaakte Virtual Devices wordt “gedrukt”.

Tenslotte maken we ook nog een scene aan voor het inschakelen van de FileServer.

--[[
%% autostart
%% properties
%% events
%% globals
HK_Coolermaster
GK_Coolermaster
--]]

--[[
------------------------------------------------------------------------------------------
-- Scene to switch on the FileServer when some PC is active
Date: 		20170109 
Author: 	Henk Kuipers
Website:	https://onsheim.nl
------------------------------------------------------------------------------------------
--]]

-- Parameters
------------------------------------------------------------------------------------------
local SoHo2ID = 96;               -- File Server device index number
------------------------------------------------------------------------------------------

local startSource = fibaro:getSourceTrigger();

if fibaro:getGlobalValue("HK_Coolermaster") == "On" 
  or
     fibaro:getGlobalValue("GK_Coolermaster") == "On" 
  or
     startSource["type"] == "other"
  then
     fibaro:call(SoHo2ID, "turnOn");
end

In dit script zult u even het index nummer van het WOL Virtual Device van uw Fileserver moeten aanpassen. Ook de namen van de verschillende globale variabelen die in het script worden gebruikt moeten natuurlijk worden aangepast naar de namen van de door u toegekende variabelen.

We zijn nu zo ver dat de fileserver automatisch aan gaat zodra er een van de PC’s die er gebruik van willen maken wordt aangezet.

 

Deel 2:  Het uitschakelen van de server

Omdat wij gebruik maken van een op Linux gebaseerde oplossing is dit heel eenvoudig te realiseren door het volgende bash script die we aan de crontab toevoegen.

#!/bin/bash
#
# Check IP range for any host alive
#
DEVICES="$(fping -g -q -a 192.168.10.50 192.168.10.59 )"
if [ ! "${DEVICES}" ]; then
  #
  # No host alive anymore so it's safe to shutdown the server
  #
  /sbin/shutdown -h now
fi

Doordat we voor alle PC’s die van de fileserver gebruik moeten kunnen maken een kleine adres range hebben gedefinieerd (xxx.xxx.xxx.50 t/m 59) wordt in bovenstaand script deze range gecontroleerd op aanwezigheid van gebruikers.

Zodra er geen enkele PC met een adres in deze range meer is ingeschakeld schakelt de server zich vanzelf uit.

Voor een Windows server zal hiervoor een batch bestand moeten worden gemaakt die periodiek door de taakplanner wordt uitgevoerd.

 

Deel 3: Het maken van de netwerkverbindingen

Doordat de fileserver nog niet beschikbaar is op het moment dat de (eerste) PC wordt aangezet, zal Windows geen netwerkverbindingen kunnen maken. Dit moeten we daarom zelf nog doen.

Om het geheel nog gebruikersvriendelijker te maken kan het onderstaande batchbestand met de hand worden uitgevoerd maar we kunnen dit natuurlijk ook door de PC laten doen. In dat geval kunnen we het batchbestand na het opstarten van de PC automatisch laten uitvoeren.

@echo off
cls
rem ---------------------------------------------------------------------------------
rem BATCHFILE TO RECONNECT NETWORK DRIVES AFTER POWERING UP THE SERVER BY DOMOTICS
rem ---------------------------------------------------------------------------------
rem 
rem Date: 	20170113 
rem Author: 	Henk Kuipers
rem Website:	https://www.onsheim.nl
rem
rem This batch file makes it possible to start some extra tasks as well, like:
rem
rem - Backing up Outlook.pst file to the cloud
rem - Backing up essential PC data to the server
rem - Start your favourite applications
rem   etc.
rem 
rem 
rem PARAMETER SECTION (Adjust to your personal environment)
rem ---------------------------------------------------------------------------------
rem LAN IP address of the server
rem Server network name (all in capital)
rem Max waiting time for server ready (in seconds)

set ServerAddress=xxx.xxx.xxx.xxx
set ServerName=SOHO2
set /A ServerDelay=80
set /A ShareDelay=15			
			
rem EXTRA PARAMETERS (when using the extra tasks possibility)
rem ---------------------------------------------------------------------------------
rem Sync directory for your cloud service
rem Directoryname to put the files in

set "CloudDir=Dropbox"
set "DirName=OutlookCopy"

echo --------------------------------------------------------------------------------
echo WAIT UNTIL SERVER AVAILABILITY ON THE NETWORK
echo --------------------------------------------------------------------------------
:WaitServer
echo %time% Wait for max %ServerDelay% seconds until server ready
set /A RetryCount=0
:ServerLoop
net view | find /i "%ServerName%" >nul
if not errorlevel 1 goto EndWaitServer
set /A RetryCount+=1
timeout 2 > nul
echo | set /p="-"
if not %RetryCount%==%ServerDelay% goto ServerLoop
echo %time% Server not ready within %ServerDelay% seconds
goto ErrorDetected
:EndWaitServer

rem ---------------------------------------------------------------------------------
rem NOW THE SERVER IS AVAILABLE< WAIT UNTIL SHARES READY
rem ---------------------------------------------------------------------------------
:CheckShares
echo.
echo %time% Requested server available on the network
set /A RetryCount=0
:ShareLoop
net view \\%ServerName% | find /i "Schijf" >nul
if not errorlevel 1 goto EndCheckShares
set /A RetryCount+=1
timeout 1 > nul
echo|set /p="-"
if not %RetryCount%==%ShareDelay% goto ShareLoop
echo %time% Server can not be reached within %ShareDelay% seconds, end script execution
goto ErrorDetected
:EndCheckShares

rem ---------------------------------------------------------------------------------
rem DELETE ALL POSSIBLE EXISTING SHARE CONNECTIONS AND MOUNT THE DESIRED ONES
rem ---------------------------------------------------------------------------------
:DeleteShares
echo %time% Server shares advertised
echo %time% Delete any old persistant network share
%SystemRoot%\System32\net.exe use * /d /y > nul
if not errorlevel 1 goto EndDeleteShares
echo %time% Error deleting existing networkshares
goto ErrorDetected
:EndDeleteShares

rem ---------------------------------------------------------------------------------
rem MOUNT DESIRED NETWORK SHARES
rem ---------------------------------------------------------------------------------
:MountShares
echo %time% Mount desired network shares
%SystemRoot%\System32\net.exe use M: \\%ServerName%\%Username%	/persistent:no >nul  
echo %time% M-disk connected to \\%ServerName%\%Username%
%SystemRoot%\System32\net.exe use N: \\%ServerName%\Share2	/persistent:no >nul
echo %time% N-disk connected to \\%ServerName%\Share2
%SystemRoot%\System32\net.exe use O: \\%ServerName%\Share3	/persistent:no >nul
echo %time% O-disk connected to \\%ServerName%\Share3
%SystemRoot%\System32\net.exe use P: \\%ServerName%\Shgare4	/persistent:no >nul
echo %time% P-disk connected to \\%ServerName%\Share4
%SystemRoot%\System32\net.exe use Q: \\%ServerName%\Share5	/persistent:no >nul
echo %time% Q-disk connected to \\%ServerName%\Share5
%SystemRoot%\System32\net.exe use R: \\%ServerName%\Share6	/persistent:no >nul
echo %time% R-disk connected to \\%ServerName%\Share6
%SystemRoot%\System32\net.exe use S: \\%ServerName%\Share8	/persistent:no >nul
echo %time% S-disk connected to \\%ServerName%\Share8
%SystemRoot%\System32\net.exe use T: \\%ServerName%\Share9	/persistent:no >nul
echo %time% T-disk connected to \\%ServerName%\Share9
%SystemRoot%\System32\net.exe use U: \\%ServerName%\Share10	/persistent:no >nul
echo %time% U-disk connected to \\%ServerName%\Share10

echo %time% All desired network shares mounted
:EndMountShares

rem ---------------------------------------------------------------------------------
rem EXTRA TASKS AFTER NETWORK CONNECTIONS ARE RESTORED
rem ---------------------------------------------------------------------------------

rem ---------------------------------------------------------------------------------
rem Back-up Outlook.pst files to the local sync directory for your cloud solution
rem ---------------------------------------------------------------------------------
:OutlookCopy
echo %time% Check if directory %HOMEPATH%\%CloudDir%\%DirName% is present
if exist "%HOMEPATH%\%CloudDir%\%DirName%" goto DirPresent
echo %time% Create %HOMEPATH%\%CloudDir%\%DirName%
mkdir %HOMEPATH%\%CloudDir%\%DirName%
if not errorlevel 0 goto ErrorDetected
:DirPresent
echo %time% Copy Outlook.pst files to our %CloudDir% Cloud
copy %LOCALAPPDATA%\Microsoft\Outlook\*.* %HOMEPATH%\%CloudDir%\%DirName%\*.* >nul
if not errorlevel 0 goto ErrorDetected  
:EndOutlookCopy

rem ---------------------------------------------------------------------------------
rem END SCRIPT EXECUTION
rem ---------------------------------------------------------------------------------
:EOF
echo %time% Script execution ended
exit 0

:ErrorDetected
echo %time% Error(s) detected, script execution halted
rem Make sure the user sees the Error message and wait for any key
echo.
echo PRESS ANY KEY TO CLOSE THIS WINDOW
timeout /t -1
"Klanten de service geven die wij ook van een webshop verwachten"