Virransäästö

Kristan ympäristönäkemysten innoittamana koitan vähentää palvelimen virran käyttöä niin paljon kuin mahdollista. Home Server nukkuu silloin kun sitä ei tarvita. Käytännössä Home Server herää automaattisesti vain kun joku käyttää X60s läppäriä tai jos Krista kirjautuu jollekin muista koneista. Minun pitää herättää palvelin käsin ylös. Näin takaan sen että Kristan ei tarvitse välittää koneen herättämisestä, asiat vain toimivat ja kone nukkuu suurimman osan ajasta.

Tämän tempun aikaan saamiseen tarvitaan sopivaa rautaa, eli verkkokortti joka herättää koneen (WOL). Integroitujen korttien kanssa tämä on harvemmin ongelma, erilisten PCI väyläisten korttien kanssa minulla on ollut ongelmia. Luonnollisesti kaikki ajurit pitää olla asennettuna, jotta kone suostuu kiltisti nukkumaan ja heräämään sieltä.

Nukkumisesta ja heräämisestä huolehtii Lightsout niminen lisäosa. Itse olen konfiguroinut sen nukuttamaan koneen 15 minuutin kuluttua siitä kun se ei enää näe muita koneita. Lepotila johon mennään on hibernate. Toisten koneiden heräämisen lisäksi lisäksi kone herättää itsensä joka sunnuntai 12-16, sekä joka tiistai ja torstai 12-13. Olen aikojen saatossa huomannut että Home Server tekee sunnuntaisin levyn siivousoperaatiota, joten siksi kone on hereillä sunnuntaisin. Arkisin kone on hereillä jotta Jungledisk voi tehdä turvakopion koneen tärkeistä tiedostoista Amazonin S3 tallenustilaan.

Tämän lisäksi olen tehnyt skriptin, joka odottaa wake.txt nimistä tiedostoa. Tämän huomatessaan se kytkee Lightsout palvelun pois päältä. Tämän kehitin siksi että voin ottaa etäyhteyden palvelimeen ja helposti kytkeä pois Lightsout palvelun. Mitään järkevää ei ADSL yhteyden yli kopioida 15 minuutissa. 🙂

Skriptini ajetaan 5 minuutin välein. Tämä onnistuu helposti Scheduled Taskin avulla. Luo uusi ajoitettu tehtävä.  Velhon asetukset ovat seuraavat:
Haluat ajaa ohjelmaa c:\windows\system32\wscript.exe.
Perform this task: daily
Start time: mitä vain
Perform this task: Every day
Start date: mitä vain
UserID: Administrator ja Home Serverin salasana
Rasti kohtaan “Open Advanced properties for this task when I click Finish.”

Avautuvaan ikkunaan lisää run rivin loppuun skriptin sijainti niin että lopputulos on c:windowssystem32wscript.exe d:scriptslightsout.vbs.
Valitse Schedule tasku ja klikkaa Advanced. Advanced Schedule Options ikkunassa valitse Repeat task. Every -kenttään 5 ja alasveto valikkoon minutes. Duration kohtaan 24 tuntia ja klikuttele OK. Nyt skripti ajetaan 5 minuutin välein maailman tappiin saakka.

Skripti on seuraavanlainen

' =================================================================================
'
'     Script Information
'    
'    Title: Lightsout add-on
'    Author: Juha Leivo
'    Version: 1.0
'        - Check if wake.txt exist
'             - If so, disable lightsout so the server won't sleep
'             - If not, enable lightsout so the server can sleep.
'
'==================================================================================
wakeFile = "D:\logswake.txt"             ' Location of wake file
logFile = "D:\logs\lightsout_script.txt" ' If empty, no logging, dir must exist!
debugg = 0                                 ' Debug data to the log file, 0 = no debug data

'==================================================================================
'Don't touch!

Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const strComputer = "."

'Create needed objects
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\" & strComputer & "rootcimv2")

'Check should we do logging or not
If logFile <> "" Then
 On Error Resume Next
 Set objLog = objFSO.OpenTextFile(logFile, ForAppending)
 If Err = 53 Then
 Err.Clear
 Set objLog = objFSO.CreateTextFile(logFile)
 Set objLog = Nothing
 Set objLog = objFSO.OpenTextFile(logFile, ForAppending)
 End If
End If

'Get the service
Set colServiceList = objWMIService.ExecQuery("Select * from Win32_Service where Name='LoService'")

status = CheckStatus()

If status = "Running" Then
 If objFSO.FileExists(wakeFile) Then
 objLog.WriteLine (Now & VbTab & "Disabling lightsout!")
 SetState("0")
 Else
 If debugg Then objLog.WriteLine (Now & VbTab & "Lightsout enabled, no need to disable it.") End if
 End If
Else
 If objFSO.FileExists(wakeFile) Then
 If debugg Then objLog.WriteLine (Now & VbTab & "Lightsout disabled, no need to enable it.") End If
 Else
 objLog.WriteLine (Now & VbTab & "Enabling lightsout!")
 SetState("1")
 End If
End If

objLog.Close

Function CheckStatus()
 For each objService in colServiceList
 CheckStatus = objService.State
 If debugg Then objLog.WriteLine (Now & VbTab & "Service status is " & CheckStatus) End if
 Next
End Function

'if given 0 will stop the service
'anything else starts the service
Sub SetState(run)
 If run = "0" Then
 For each objService in colServiceList
 objService.StopService()
 Next
 Else
 For each objService in colServiceList
 objService.StartService()
 Next
 End If
End Sub