Skript zum zeitgesteuerten Shutdown mit Ferienüberprüfung
Verfasst: Dienstag 9. Oktober 2012, 16:42
Hi,
ich stand bei uns in der Schule vor dem Problem, dass wir Rechner für Info-Terminals zeitgesteuert hoch und runter fahren möchten. Da die Rechner über WLAN ins Netz gehen, fällt zumindest für das Hochfahren ein WoL-Lösung aus und da ich WLAN nicht ganz so traue auch eine serverseitige Lösung was das Runterfahren angeht.
Zusätzlich sollen die Rechner am Wochenende und in den Ferien nicht laufen. Nach ein wenig Recherche habe ich im Netz kein Tool gefunden, das diese Anforderungen erfüllt, also habe ich mich hingesetzt und ein kleines Python-Skript geschrieben, das die Aufgabe erledigt. Das Skript ist noch ausbaufähig über Rückmeldung/Verbesserungen würde ich mich freuen. Vielleicht kann es ja jemand auch noch gebrauchen.
Die Rechner werden jeden Tag um dieselbe Zeit per Bios hochgefahren. Das Runterfahren übernimmt dann das Skript. Da ich die Feriendaten als ics-Dateien von http://www.schulferien.org/iCal/vorliegen habe, verwende ich das Modul http://pypi.python.org/pypi/icalendar. Die ics-Dateien sollten im gleichen Verzeichnis liegen und müssen im Skript angegeben werden.
Das Skript sollte zum Windowsstart automatisch gestartet werden und entscheidet dann selbstständig, ob der Rechner direkt wieder runterfährt oder bis zu einer gewissen Zeit anbleibt, bei uns 18:00 Uhr.
ich stand bei uns in der Schule vor dem Problem, dass wir Rechner für Info-Terminals zeitgesteuert hoch und runter fahren möchten. Da die Rechner über WLAN ins Netz gehen, fällt zumindest für das Hochfahren ein WoL-Lösung aus und da ich WLAN nicht ganz so traue auch eine serverseitige Lösung was das Runterfahren angeht.
Zusätzlich sollen die Rechner am Wochenende und in den Ferien nicht laufen. Nach ein wenig Recherche habe ich im Netz kein Tool gefunden, das diese Anforderungen erfüllt, also habe ich mich hingesetzt und ein kleines Python-Skript geschrieben, das die Aufgabe erledigt. Das Skript ist noch ausbaufähig über Rückmeldung/Verbesserungen würde ich mich freuen. Vielleicht kann es ja jemand auch noch gebrauchen.
Die Rechner werden jeden Tag um dieselbe Zeit per Bios hochgefahren. Das Runterfahren übernimmt dann das Skript. Da ich die Feriendaten als ics-Dateien von http://www.schulferien.org/iCal/vorliegen habe, verwende ich das Modul http://pypi.python.org/pypi/icalendar. Die ics-Dateien sollten im gleichen Verzeichnis liegen und müssen im Skript angegeben werden.
Das Skript sollte zum Windowsstart automatisch gestartet werden und entscheidet dann selbstständig, ob der Rechner direkt wieder runterfährt oder bis zu einer gewissen Zeit anbleibt, bei uns 18:00 Uhr.
Code: Alles auswählen
import subprocess
from icalendar import Calendar
from datetime import datetime
#settings, change for your own needs
shutdown_hour = 18
shutdown_minute = 0
seconds_till_shutdown = 30
ics_files = ['Ferien_Nordrhein_Westfalen_2012.ics',
'Feiertage_Nordrhein_Westfalen_2012.ics']
# calc shutdown_time
today_time = datetime.today()
future = datetime(today_time.year,
today_time.month,
today_time.day+(today_time.hour >= shutdown_hour),
shutdown_hour,
shutdown_minute)
vacation = []
for ics_file in ics_files:
with open(ics_file,'rb') as file:
gcal = Calendar.from_string(file.read())
for component in gcal.walk():
if component.name == "VEVENT":
start_date = datetime.strptime(str(component.get('dtstart')),
'%Y%m%d')
end_date = datetime.strptime(str(component.get('dtend')),
'%Y%m%d')
# check for one-day-vacation:
if (end_date-start_date).days > 1:
vacation.append((start_date, end_date))
else:
vacation.append((start_date, start_date))
def is_no_vacation(date_time):
value = True
for start_date, end_date in vacation:
if date_time >= start_date and date_time <= end_date:
value = False
return value
if today_time.weekday() < 5 and is_no_vacation(today_time):
seconds_till_shutdown = (future-today_time).seconds
print "shutdown in {} seconds".format(seconds_till_shutdown)
subprocess.call(["shutdown.exe", "-f", "-s", "-t", str(seconds_till_shutdown)])