Wednesday, September 21, 2011

FreeFileSync - Wake On LAN for NAS (Buffalo LinkStation™ Duo)

Last week after my hard-disk crashed and I realized that my backups are outdated, I decided to do it right this time. So I purchased a Buffalo Link Station Duo (2TB,Raid1, good price-performance ratio) as backup device and was absolutely convinced that with a few clicks I could easily setup a pure Windows based backup scenario.
But first of all my Windows7 Home Premium doesn't support SyncCenter and the second issue is that I was not happy with the "NAS PM Service", which caused the NAS station to start-up when ever I turned on my PC. This almost jeopardized my initial idea, because all I wanted to achieve was to activate the NAS, run the backup and finally shutdown the NAS until the next time the scheduler runs.
Time for some hands-on!

So here is my solution which works without the Buffalo NASNavi Suite and may work for other vendors/products as well:

In combination with the utility WolCmd.exe I created 2 additional scripts (WOL.bat,WOL.svn) which I use to wake-up and/or keep-alive the NAS. Simply download WolCmd.exe, create WOL.bat, WOL.svn (find source code below) and copy the files to (for now the directory is hard coded) C:\Program Files\Utils. Once this is done you can use WOL.bat for ...

Linkstation wakeup
"C:\Program Files\Utils\WOL.bat" wol [MAC] [IP] [NetMask] [Port] [Runs] [Interval in seconds]
Example:
"C:\Program Files\Utils\WOL.bat" wol 4ce6XXXXXXXX 10.0.0.XX 255.255.255.0 9 5 45

Start Linkstation keepalive
"C:\Program Files\Utils\WOL.bat" start [jobID] [IP] [NetMask] [Port] [Interval in seconds]
Example:
"C:\Program Files\Utils\WOL.bat" start backup 4ce6XXXXXXXX 10.0.0.XX 255.255.255.0 9 5

Stop Linkstation keepalive
"C:\Program Files\Utils\WOL.bat" end [jobID]
Example:
"C:\Program Files\Utils\WOL.bat" end backup

Using the Windows Task Scheduler and FreeFileSync I now run a daily backup and the Linkstation is only active while FreeFileSync runs (+ a couple of minutes until it shuts down). The image below shall give you an idea how to use WOL.bat to wake-up (duration 5*45s) and keep-alive (5s interval) your Linkstation while your e.g. backup executes.



I hope this information is useful for you, helps to conserve energy and please apologize if there are typo(s), grammar error(s), etc. because my native language is German (and this is my first blog entry).

br
≠ logic
  • Software
FreeFileSync http://sourceforge.net/projects/freefilesync/
WolCmd.exe - http://www.depicus.com/wake-on-lan/wake-on-lan-cmd.aspx
  • Scripts
WOL.bat

@ECHO OFF

IF /I "%1"=="__myself" (

    FOR /L %%l IN (0,0,0) DO (

        :: WOL command example -- "C:\Program Files\Utils\WolCmd.exe" 4ce67696094b 10.0.0.62 255.255.255.0 9
        "C:\Program Files\Utils\WolCmd.exe" %3 %4 %5 %6

        :: Delay for n (>1) seconds
        ping -n %7 127.0.0.1 > nul
    )

) ELSE (

    SET prefix=w0L_-
    SET postfix=-_L0w

    IF /I "%1"=="start" (

        :: ECHO %0 __myself %prefix%%2%postfix% %3 %4 %5 %6 %7
        START "%2" /I /MIN cmd.exe /C %0 __myself %prefix%%2%postfix% %3 %4 %5 %6 %7

    ) ELSE (

        IF /I "%1"=="end" (

            START "Kill: %2" /I cmd.exe /C cscript "%~dp0WOL.vbs" %prefix%%2%postfix%

        ) ELSE (

            IF /I "%1"=="wol" (

                FOR /L %%l IN (%6,-1,1) DO (

                    :: WOL command example -- "C:\Program Files\Utils\WolCmd.exe" 4ce67696094b 10.0.0.62 255.255.255.0 9
                    "C:\Program Files\Utils\WolCmd.exe" %2 %3 %4 %5

                    :: Delay for n (>1) seconds
                    ping -n %7 127.0.0.1 > nul
                )
            )
        )
    )
)


WOL.vbs

Set oShell = CreateObject("WScript.Shell")

if WScript.Arguments.Count >= 1 then

    Dim objWMIService
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
    Dim colProcess
    Set colProcess = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'cmd.exe'")

    For Each objProcess in colProcess

        Dim re1,re2
        Set re1 = new RegExp
        Set re2 = new RegExp

        re1.Pattern = ".*[ ]{1}__myself[ ]{1}.*"
        re2.Pattern = ".*[ ]{1}" & WScript.Arguments(0) & "[ ]{1}.*"

        Dim m1,m2
        Set m1 = re1.Execute(objProcess.CommandLine)
        Set m2 = re2.Execute(objProcess.CommandLine)

        WSCript.Echo m1.Count & "|" & re1.Pattern & "|" & objProcess.CommandLine
        WSCript.Echo m2.Count & "|" & re2.Pattern & "|" & objProcess.CommandLine

        if m1.Count > 0 AND m2.Count > 0 then

            WSCript.Echo objProcess.CommandLine

            objProcess.Terminate()
            WScript.Quit()

        end if

    Next

end if


2 comments:

andE said...

fantastic. love the combination of WOL and backup.

≠ logic - Clemens said...

You now longer have to create the script files on your own. They are now available for download.

WOL.vbs
WOL.bat

br
≠ logic