ich versuche gerade eine Client/Server-Lösung für unser kleines Hausnetzwerk zu entwickeln. Ziel ist es, den Server nur so lange wie nötig angeschaltet zu lassen.
Per Client wird der ServerPC geweckt (WOL). Sobald der Server(Python-Programm) gestartet ist, meldet sich der Client an. Bei der Anmeldung wird ein Client-Passwort, ein Username und ein "Timeout" übertragen. Der Server überprüft nun per Thread welcher User sein Timeout überschritten hat und löscht ihn aus der Liste. Ist die Liste leer, wird der Server heruntergefahren.
Ich habe nun ein größeres und ein kleineres Problem (abgesehen von vielen Kinderkrankheiten die ich aber erstmal nicht beachte...):
- größer: Ich würde mir eine Art Event vom Server an den Client wünschen, um dem Client mitzuteilen, dass seine Zeit um ist.
- kleiner: Meldung vom Server an den Client, dass er bereit ist (nach dem Hochfahren).
Das kleinere Problem ist nicht zu lösen, da der Server ja nur auf "vorhandene" Clients reagieren kann.
Zum Größeren: Der Client löchert den Server zB alle paar Sekunden, ob er(Client) noch in der Liste des Servers vorhanden ist.
Ich habe erst vor kurzem mit Python begonnen. Und seit noch kürzerem mit Threads, seit also ein bisschen nachsichtig mit mir
Code: Alles auswählen
#!/usr/bin/python
## ServerScripts.py
from SimpleXMLRPCServer import SimpleXMLRPCServer
import time
from threading import Thread, Event
from socket import error
from SocketServer import TCPServer
class CheckServerStatus(Thread):
def run(self):
global userlist
interval = 5
time.sleep(10)
while len(userlist) != 0:
time.sleep(interval)
tmplist = userlist.copy()
print "#### Check Server Status ####"
for user in tmplist:
print "check\t%s\t%i\t%i" % (user, (time.time() - userlist[user].timestamp), (int(userlist[user].timeout)*60))
interval = 5
if ((int(userlist[user].timeout) * 60) - (time.time() - userlist[user].timestamp)) < 5:
difference = (int(userlist[user].timeout) * 60) - (time.time() - userlist[user].timestamp)
time.sleep(difference)
print "del\t%s\t%i\t%i" % (user, (time.time() - userlist[user].timestamp), (int(userlist[user].timeout) * 60))
del userlist[user]
interval = 5 - difference
del tmplist
if len(userlist) == 0: #Wenn kein user mehr angemeldet ist, shutdown einleiten
print "SHUTDOWN"
class SSUser:
def __init__(self,password,timeout):
self.password = password
self.timestamp = time.time()
self.timeout = timeout
def __repr__(self):
return repr(self.timestamp)
userlist = {}
SERVER_PW = ''
def AddUser(user,password,server_pw,timeout):
global userlist
if not userlist.has_key(user): #Ueberpruefen ob ein solcher user schon existiert
userlist[user] = SSUser(password,timeout) #falls nicht, neuen Key mit class SSUser anlegen
return 100 #"all right"
else:
return 101 #"user already logged in"
def DelUser(user,password,server_pw):
global userlist
if userlist.has_key(user): #Ueberpruefen ob ein solcher user exisitert
if server_pw == SERVER_PW: #Das ServerPassword ueberpruefen
if password == userlist[user].password: #Das userPassword ueberpruefen
del userlist[user] #Falls beides stimmt, user aus _____ loeschen
return 100 #"all right"
else:
return 103 #"wrong user password"
else:
return 102 #"wrong server password"
else:
return 104 #"user not in list"
try:
# Create server
TCPServer.allow_reuse_address = True
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_introspection_functions()
server.register_function(AddUser)
server.register_function(DelUser)
server.register_function(CheckServerStatus)
# Run the server's main loops
t = CheckServerStatus().start()
server.serve_forever()
except error, v:
print "ERROR", v
Code: Alles auswählen
#!/usr/bin/python
## ServerScriptsClient.py
#import xmlrpclib
import xmlrpclib
import wolpython
from socket import error
from time import sleep
def StartServer(ip, mac, name, pw, server_pw, timeout):
global s
ServerNotReady = 1
Try = 1
print "Wake up Server with Mac " + mac
wolpython.wol(mac)
print "Trying to connect to " + ip
s = xmlrpclib.ServerProxy('http://localhost:8000')
print s
while ((ServerNotReady) and (Try < 11)):
try:
result = s.AddUser(name,pw,server_pw,timeout)
ServerNotReady = 0
except error, v:
result = 0
sleep(5)
print "Try: ", Try, " ERROR", v
Try = Try + 1
return result
def StopServer(name, pw):
global s
return s.DelUser(name,pw,'')