# coding=utf-8
#
#
import base64
import os, socket, json,  threading, time, pwd, grp, shutil

import myconst, mybase
from myconst import *
from mybase import *
from ClientThread import Sende_MD_Befehl

def Socket_Start(Con_Thread,Connection, Daten, address, Receive_Nr):
    if mybase.verbose > 0 :
        debugmessage('------ Verarbeitung - Start (Connection '+str(Receive_Nr)+') ------')
    IP=address[0]
    try:
        JD = json.loads(Daten)
        bef = JD.get(tag_Befehl,'')
        debugmessage('--- Receive: ' + bef + ' from ' + IP)
        if (bef == msg_UDAT):   # nur Android-Client
            Raum = ''
        else:
            Raum = JD.get(tag_Raum, '')
            Raum = GetRaum(IP) if Raum == '' else Raum
            Anweisung = '???'
            if (bef == msg_SLPC) or (bef == msg_SLPU) or (bef == msg_SUPC) or (bef==msg_POPC) or (bef==msg_REPC) or (bef==msg_LOPC):
                Anweisung = ''
            elif (bef == msg_NAPC) or (bef == msg_EXPC):
                try:
                    Anweisung = base64.b64decode(JD.get(tag_Text,'').encode()).decode()
                except :
                    logmessage('ABBRUCH: Dekodierungsfehler bei Nachricht/Anweisung: ' + bef)
                    Anweisung = '???'
        if (bef == msg_GIPS):
            t = GetRaumIPs(IP, Raum)
            Connection.sendall(getAntwortJson(t))
            logmessage('Sende IPs ...') ; debugmessage('  IPs: ' + t)
        elif (bef == msg_GDST):
            t = GetDefaultRaumDruckerStatus(Raum)
            t = 'KEINE' if (t == '') else t
            Connection.sendall(getAntwortJson(t))
            logmessage('Sende Raum Drucker Status ...');  debugmessage('   Status: ' + t)
        elif (bef == msg_GRST):
            t, DruckerStatus = GetRaumStatus(Raum)
            t = 'DENY' if (t == '') or (Raum == '') else t
            Connection.sendall(getAntwortJson_R(t, Raum))
            logmessage('Sende Raum Status ... ');  debugmessage('   Status: ' + t)
        elif (bef==msg_GCLR):
            t = GetClassrooms()
            Connection.sendall(getAntwortJson(t))
            logmessage('Sende Liste der Raeume ...')  ;  debugmessage('   Liste: ' + t)
        elif (bef==msg_GKEY):
            GetClassrooms()
            t = GetNewKey(IP)
            Connection.sendall(getAntwortJson(t))
            debugmessage('Sende KEY ... an IP ' + IP )
        elif (bef == msg_GMD5):
            t = GetMD5()
            Connection.sendall(getAntwortJson(t))
            logmessage('Sende md.md5 ...') ; debugmessage('   md.md5: ' + t)
        elif (bef == msg_SAUT):
            pass
        elif (bef == msg_LOGG):
            logmessage('Logging from '+IP+': '+JD.get(tag_Text,'???'))
        else:
            Benutzer = JD.get(tag_Benutzer,'')
            if mybase.UseAuth == 0 :
                authOK = True
            else:
                authOK = False
                if mybase.UseToken :
                    u = JD.get(tag_Token,'')
                    Tk_OK =  CheckTeacherToken(Benutzer,u)
                    if (u !='') and (Tk_OK):
                        authOK = True
                        logmessage('Authentifizierung mit Token OK: ' + Benutzer)
                    else:
                        debugmessage('Token ueberprueft ... (' + u + ')')
                if (not authOK) and (mybase.UseAuth==2) :
                    debugmessage('Ueberpruefe Client PC ...')
                    if (CheckTeacherHostIP(Benutzer, IP)) :
                        authOK = True
                        logmessage('Authentifizierung per Client-PC OK: ' + Benutzer)
                    else :
                        logmessage('Authentifizierung per Client-PC fehlgeschlagen!')
                if (not authOK) :
                    debugmessage('Ueberpruefe Passwort ...')
                    key = GetKey(IP)
                    u = JD.get(tag_Pass,'')
                    if (key != '') and (u != '') :
                        logmessage('deCrypt Passwort mit key = ' + key)
                        u = deCrypt(u, key)
                        if (u != '') and (CheckTeacherPW(Benutzer, u)):
                            authOK = True
                            logmessage('Authentifizierung mit Passwort OK: ' + Benutzer)
            if not authOK:
                logmessage('Authentifizierung insgesamt fehlgeschlagen (UseAuth=' + str(mybase.UseAuth) + '): ' + Benutzer)
            if authOK:
                if bef==msg_UDAT :
                    Filesize = int(JD.get(tag_Datei, 0))
                    if Filesize > 0 :
                        DateiName = JD.get(tag_Dateiname, '')
                        FileDir = mybase.Teacher_Pfad7 + Benutzer + '/' + mybase.AE_BasisPfad + mybase.AusZuPfad
                        FilePfad =  FileDir + DateiName
                        if not os.path.isdir(FileDir):
                            os.makedirs(FileDir)
                        logmessage('Receive UDAT: Size: ' + str(Filesize) + ' Datei: ' + DateiName + ' ' + Benutzer + ' from ' + IP)
                        Connection.sendall(getAntwortJson(tag_STARTE))
                        logmessage('Sende STARTE Dateiuebertragung an ' + IP)
                        if mybase.verbose >1 :
                            debugmessage('Speichere Datei unter: '+FilePfad)
                        Con_Thread.Filesize = Filesize
                        Con_Thread.FilePfad = FilePfad
                        Con_Thread.Benutzer = Benutzer
                        Con_Thread.Con_State = 'Empfange_Datei'
                        TimerAdd('DATEI',IP,str(Con_Thread.ident))
                    else:
                        logmessage('ERROR: Filesize = 0')
                        Connection.sendall(getAntwortJson
                                           (tag_ENDE))
                elif bef==msg_AUTH:   # Antwort : OK|BESETZT|DENY
                    antwort = 'OK'
                    if (TokenTime==0) :   # Token wird nicht verwendet
                        Connection.sendall(getAntwortJson(antwort))
                        logmessage('Sende Auth: ' + antwort)
                    else:
                        tok = GetNewToken(Benutzer, Raum)
                        if tok  == 'BESETZT':
                            if (mybase.onlyCL and not (isClassroom(Raum))):   # Antwort : OK
                                Connection.sendall(getAntwortJson(antwort))
                                logmessage('Sende Auth (no Classroom): ' + antwort)
                            else:
                                Connection.sendall(getAntwortJson(tok))        # Antwort: Besetzt
                                logmessage('Sende Auth: ' + tok)
                        else:
                            AddToken(Benutzer, tok, Raum)
                            Connection.sendall(getAntwortJson_TK(antwort, tok))
                            logmessage('Sende Auth mit Token: '+antwort+' '+tok)
                elif bef == msg_GTOK:
                        tok = GetNewToken(Benutzer, Raum)
                        if tok  == 'BESETZT' :
                            Connection.sendall(getAntwortJson(tok))
                            logmessage('Sende Token: ' + tok)
                        else:
                            AddToken(Benutzer, tok, Raum)
                            Connection.sendall(getAntwortJson(tok))
                            logmessage('Sende Token: ' + tok)
                elif bef==msg_GGRP:
                    t = GetUserGroups(Benutzer)
                    # t = GetAllClasses()
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende Gruppen: ' + t)
                elif bef==msg_GKLI:
                    t = GetKlassenliste(Raum)
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende Klassenliste: ' + t)
                elif bef==msg_GMDP:
                    t = enCrypt(GetMDPass(), GetKey(IP))
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende md.pass ...') ; debugmessage('   md.pass: ' + t)
                    # print('deCrypt: '+deCrypt(t,GetKey(IP)))
                elif bef==msg_GVTP:
                    t = enCrypt(GetVNCText(), GetKey(IP))
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende x11vnc.text ...') ; debugmessage('   x11vnc.text: ' + t)
                elif bef==msg_GVPP:
                    t = enCrypt(GetVNCPass(), GetKey(IP))
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende x11vnc.pass ...');  debugmessage('   x11vnc.pass: ' + t)
                elif bef==msg_GDAT:
                    t = GetAusteilenDateien(Benutzer)
                    t = 'KEINE' if t == ''else t
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende Dateien ...');   debugmessage('   Dateien: ' + t)
                elif (bef==msg_WLOF) or (bef==msg_WLON):
                    if os.path.isfile(Soph_mana_script_Pfad):
                        option = '--wifi' if (bef==msg_WLON) else '--nowifi'
                        UserList = GetKlassenliste(Raum)  # hier: Raum = Gruppe/Klasse
                        if (UserList !=''):
                            debugmessage('WLAN-setzen fuer User: '+UserList)
                            Befehl = [Soph_mana_script_Pfad, option, UserList]
                            Befehl_exec(Befehl)
                            if (bef==msg_WLON):
                                TimerAdd('WLAN',Raum,UserList)
                            logmessage('WLAN ' + option + ' fuer ' + Raum + ' gesetzt')
                        else:
                            logmessage('WLAN-Fehler - UserListe ist leer, Klasse: ' + Raum)
                    else :
                        logmessage('ABBRUCH: Script fehlt: ' + Soph_mana_script_Pfad)
                elif (bef==msg_SPWD) and not mybase.MenuePass:
                    logmessage('ABBRUCH: Das Setzen von Passwoertern ist im Schukodaemon deaktiviert')
                elif (bef==msg_SPWD) and mybase.MenuePass:
                    if os.path.isfile(Soph_passwd_script_Pfad):
                        Klasse = NoScriptTrim(Raum)
                        UserList = NoScriptTrim(JD.get(tag_UserList,''))
                        NewPass = JD.get(tag_NewPass,'')
                        UserOK = True
                        if UserList == '' :
                            Befehl = [Soph_passwd_script_Pfad, '-c', Klasse, '--pass', NewPass]
                            if (Klasse=='teachers') or (Klasse=='admins') :
                                UserOK = False
                        else:
                            Befehl = [Soph_passwd_script_Pfad, '-u', UserList, '--pass', NewPass]
                            Namen = UserList.split(',')
                            KlassenListe = GetKlassenliste(Klasse).split(',')
                            for Name in Namen:
                                if  Name not in KlassenListe:
                                    UserOK = False
                                    break
                        if UserOK :
                            Befehl_exec(Befehl)
                            logmessage('Passwoerter gesetzt fuer Klasse: ' + Klasse + ' Userlist: ' + UserList)
                        else:
                            logmessage('ABBRUCH: Ungueltige User vorhanden')
                    else:
                        logmessage('ABBRUCH: Script fehlt: ' + Soph_passwd_script_Pfad)
                elif (bef==msg_SLPC) or (bef==msg_SLPU) or (bef==msg_SUPC) or (bef==msg_NAPC) or (bef==msg_EXPC) or (bef==msg_POPC) or (bef==msg_REPC) or (bef==msg_LOPC):
                    IPListe=Raum.split(',')
                    try:
                        IPListe.remove(IP)
                    except:
                        pass
                    Befehl = msg_client[bef]   # Dictionary aus myconst
                    if len(IPListe)>0:
                        mybase.Thread_Nr +=1
                        logmessage('Sende '+Befehl+' an '+str(len(IPListe))+' Clients.')
                        Sende_MD_Befehl(Befehl,Anweisung,IPListe,mybase.Thread_Nr)
                    else:
                        logmessage('ABBRUCH: Maus-Dienst-IP-Liste ist leer!')
                elif bef==msg_CDAT:
                    Benutzer = NoScriptTrim(Benutzer)
                    if (Benutzer != '') and (mybase.Teacher_Pfad7 != '') and (mybase.AusZuPfad != '') :
                        Pfad = mybase.Teacher_Pfad7 + Benutzer + '/' + mybase.AE_BasisPfad + mybase.AusZuPfad
                        Liste = os.listdir(Pfad)
                        anz = len(Liste)
                        for f in  Liste:
                            file_path = os.path.join(Pfad, f)
                            try:
                                if os.path.isfile(file_path) or os.path.islink(file_path):
                                    os.unlink(file_path)
                                elif os.path.isdir(file_path):
                                    shutil.rmtree(file_path)
                            except Exception as e:
                                logmessage('Fehler bei Datei loeschen: ' + str(e))
                        logmessage('Dateien ('+str(anz)+') im Verzeichnis "' + mybase.AE_BasisPfad + mybase.AusZuPfad + '" geloescht')
                    else:
                        logmessage('Abbruch, Pfade unvollstaendig bei msg_CDAT')
                elif bef==msg_SMDP:
                    key = GetKey(IP)
                    t = JD.get(tag_MDPW,'').strip()
                    if (key != '') and (t != '') :
                        t = deCrypt(t, key)
                        logmessage('deCrypt MD-Passwort mit key = ' + key)
                    u = JD.get(tag_MDP5,'').strip()
                    if (t != '') and (u != '') and (is_Admin(Benutzer)) :
                        try:
                            f = open(mybase.MDPfad, 'w')
                            f.write(t)
                            f.close()
                            f = open(mybase.MD5Pfad, 'w')
                            f.write(u)
                            f.close()
                            logmessage('MDPass und MDHash wurden neu gesetzt.')
                        except Exception as e:
                            logmessage('FEHLER beim Schreiben der Dateien: ' + mybase.MDPfad +'.'+mybase.MD5Pfad+ '(' + str(e) + ')')
                    else :
                        if (t == '') or (u== '')  :
                            logmessage('ABBRUCH: MDPass oder MDHash unvollstaendig.')
                        if not is_Admin(Benutzer):
                            logmessage('ABBRUCH: Unberechtiger Benutzer: '+Benutzer)
                elif bef==msg_SVTP:
                    key = GetKey(IP)
                    t = JD.get(tag_VNCT,'')
                    if (key != '') and (t != '') :
                        t = deCrypt(t, key)
                        logmessage('deCrypt VNC-Passwort mit key = ' + key)
                    if (t != '') and (is_Admin(Benutzer)):
                        t = t.strip()
                        try:
                            f = open(mybase.VNCTextPfad, 'w')
                            f.write(t)
                            f.close()
                            logmessage('VNC Text Passwort wurde neu gesetzt.')
                        except Exception as e:
                            logmessage('FEHLER beim Oeffnen der Datei: '+mybase.VNCTextPfad+'('+str(e)+')')
                        if os.path.isfile(x11vnc_Pfad) :
                            Befehl = [x11vnc_Pfad, '-storepasswd', vtr(t) , mybase.VNCPassPfad]
                            Befehl_exec(Befehl)
                            logmessage('VNC-Pass-Datei wurde neu gesetzt: ' + mybase.VNCPassPfad)
                        else:
                            logmessage('WARNUNG: Programm fehlt: ' + x11vnc_Pfad)
                    if t == '' :
                        logmessage('ABBRUCH: VNC Text Passwort leer.')
                    if not is_Admin(Benutzer) :
                        logmessage('ABBRUCH: Unberechtiger Benutzer: '+Benutzer)
                elif (bef == msg_DISC):
                        logmessage('Receive: ' + bef + ' from ' + IP + '   -->> Disconnect Client')
                        DelKey(IP)
                        DelToken(Benutzer)
                        if mybase.verbose > 1:
                            debugmessage('****** Aktuelle Threads: ******')
                            for thread in threading.enumerate():
                                debugmessage(str(thread.getName()))
                            debugmessage('*******************************')
                elif (mybase.onlyCL and not (isClassroom(Raum) or isValidIPList(Raum))):
                    logmessage('Der Raum ' + Raum + ' ist kein Classroom --> Abbruch!')
                    t = None
                    if (bef==msg_GLIN):
                        t = ''
                    elif (bef==msg_SRST) or (bef==msg_GROO) :
                        t = 'DENY'
                    elif (bef==msg_GDRU) :
                        t = 'KEINE'
                    if t is not None:
                        Connection.sendall(getAntwortJson_anz(t,1))
                        debugmessage('Sende: ' + t)
        # ab hier nur Anweisungen für Klassenräume ##########################################################
                elif (bef==msg_INON) or (bef==msg_INOF) or (bef==msg_IRON) or (bef==msg_IROF) or (bef==msg_UFON) or (bef==msg_UFOF) or (bef==msg_DRON) or (bef==msg_DROF):
                    if mybase.InternetSperreClients and ((bef==msg_INON) or (bef==msg_INOF)):
                        # Internet-Sperre wird direkt auf den Clients über deren Firewall ausgeführt
                        pass
                    else:
                        if os.path.isfile(Soph_mana_script_Pfad):
                            option = myconst.ManaOption[bef]
                            UserList = JD.get(tag_UserList,'')
                            if (UserList == '') :
                                UserList = GetUsersRaum(Benutzer, Raum)
                                Raum2 = JD.get(tag_Raum2,'')
                                if (Raum2 != '') and (isClassroom(Raum2)):
                                    UserList2 = GetUsersRaum(Benutzer, Raum2)
                                    if UserList2 != '':
                                        UserList = UserList2 if UserList == '' else UserList + ',' + UserList2
                            if (UserList != '') and ((bef == msg_INOF) or (bef == msg_DROF) or (bef == msg_IROF)) and mybase.DisableTeacherSperre:
                                TeacherListe = GetTeacherliste_L()
                                Daten = UserList.split(',')
                                UserList = ','.join(list(set(Daten)-set(TeacherListe)))  # Lehrer-Logins entfernen
                            if (UserList != ''):
                                Befehl = [Soph_mana_script_Pfad, option, UserList]
                                Befehl_exec(Befehl)
                                logmessage('Option ' + option + ' gesetzt fuer: ' + UserList)
                                if (bef==msg_INON) or (bef==msg_INOF) :
                                    TimerAdd('RAUM', Raum, UserList)
                            else:
                                logmessage('Option' + option + '-> ABBRUCH, UserList ist leer!')
                        else:
                            logmessage('ABBRUCH: Script fehlt: ' + Soph_mana_script_Pfad)
                elif (bef==msg_EARA) or (bef==msg_EARC):
                    if os.path.isfile(Soph_transfer_script_Pfad):
                        option = '--scopy' if bef==msg_EARA else '--move'
                        UserList = JD.get(tag_UserList,'')
                        if (UserList != '') and (Benutzer != '') :
                            Zeitstempel = datetime.now().strftime("%Y%m%d_%H%M%S")
                            ToPfad = mybase.AE_BasisPfad+mybase.EinGePfad+Zeitstempel+'_Raum/'
                            if UseTeacherPrefix:
                                FromPfad = mybase.AE_BasisPfad + Benutzer + mybase.EinZuPfad
                            else:
                                FromPfad = mybase.AE_BasisPfad + Benutzer + mybase.EinZuPfad
                            #  fullinfo oder login als pathaddon
                            if UseSophomorix:
                                for u in UserList.split(','):
                                    FileDir = GetUserServerHomePfad(u) + FromPfad
                                    if (FileDir != '') and not os.path.isdir(FileDir):
                                        try:
                                            os.makedirs(FileDir)
                                            uid = pwd.getpwnam(u).pw_uid
                                            gid = grp.getgrnam('users').gr_gid
                                            os.chown(FileDir, uid, gid)
                                        except Exception as e:
                                            logmessage('Einsammeln-Pfad: ' + str(e))
                                Befehl = [Soph_transfer_script_Pfad, option,'--from-user', UserList,'--from-path',FromPfad,
                                          '--to-user',Benutzer,'--to-path',ToPfad,'--no-target-directory','--keep-source-directory','--to-path-addon','login']
                                debugmessage('Einsammeln-Befehl: ' + ' '.join(Befehl))
                                anz = len(UserList.split(','))
                                logmessage('Einsammeln ... Start mit timeout '+str(anz*10)+' sec')
                                Ausgabe = Befehl_execTimeout2(Befehl,anz*10)
                                if Ausgabe.find('ERROR')>-1:
                                    logmessage('Einsammeln abgebrochen: '+Ausgabe)
                                else:
                                    logmessage('Einsammeln (mit Option ' + option + ') ausgefuehrt fuer: ' + UserList)
                            else:
                                Einsammeln(Benutzer,FromPfad,UserList,ToPfad,option)
                                logmessage('Dateien intern eingesammelt fuer '+Benutzer)
                        else:
                            if (UserList=='') :
                                logmessage('ABBRUCH: UserList ist leer!')
                            if (Benutzer=='') :
                                logmessage('ABBRUCH: Benutzer fehlt!')
                    else:
                        logmessage('ABBRUCH: Script fehlt: ' + Soph_transfer_script_Pfad)
                elif (bef==msg_AARA):
                    if os.path.isfile(Soph_transfer_script_Pfad):
                        UserList = JD.get(tag_UserList,'')
                        if (UserList != '') :
                            # AE_BasisPfad = tansfer/
                            # AusZuPfad = _Auszuteilen/
                            FromPfad = mybase.AE_BasisPfad + mybase.AusZuPfad
                            FileDir = GetUserServerHomePfad(Benutzer) + FromPfad
                            if not os.path.isdir(FileDir):
                                try:
                                    os.makedirs(FileDir)
                                    uid = pwd.getpwnam(Benutzer).pw_uid
                                    gid = grp.getgrnam('users').gr_gid
                                    os.chown(FileDir, uid, gid)
                                except Exception as e:
                                    logmessage('Austeilen-Pfad: '+str(e))
                            if mybase.UseTeacherPrefix :
                                ToPfad   = mybase.AE_BasisPfad+Benutzer+mybase.AusGePfad
                            else:
                                ToPfad = mybase.AE_BasisPfad + mybase.AusGePfad
                            if UseSophomorix :
                                Befehl = [Soph_transfer_script_Pfad, '--scopy', '--from-user', Benutzer, '--from-path', FromPfad,
                                          '--to-user', UserList,'--to-path',ToPfad , '--no-target-directory'] #, '--to-path-addon', 'login'
                                debugmessage('Austeilen-Befehl: ' + ' '.join(Befehl))
                                Befehl_exec(Befehl)
                                logmessage('Dateien mit Sophomorix ausgeteilt an: ' + UserList)
                            else:
                                Austeilen(Benutzer, FromPfad, UserList, ToPfad)
                                logmessage('Dateien intern ausgeteilt an: ' + UserList)
                        else:
                            logmessage('ABBRUCH: Userlist ist leer!')
                    else:
                        logmessage('ABBRUCH: Script fehlt: ' + Soph_transfer_script_Pfad)
                elif bef==msg_SRST:
                    if Raum != '':
                        t,dummy = GetRaumStatus(Raum)
                        if t == '' :
                            t = 'DENY'
                        else:
                            UserListe = GetUsersRaum(Benutzer, Raum).split(',')+ GetTimerUserList('RAUM', Raum).split(',')
                            SetDefaultRaumStatus(Raum, ','.join(UserListe))
                            TimerDel('RAUM', Raum)
                        Connection.sendall(getAntwortJson_R(t, Raum))
                        logmessage('Sende Raum Status ...'); debugmessage('   Status: '+t)
                    else:
                        t = 'DENY'
                        Connection.sendall(getAntwortJson(t))
                        debugmessage('Sende: ' + t)
                elif bef==msg_GLIN:
                    t = GetUserLogins(Raum)
                    t = 'DENY' if t == '' else t
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende User-Logins ...') ; debugmessage('   Logins: '+t)
                elif bef==msg_GROO:
                    if (ChangeToken(Benutzer,Raum) =='BESETZT'):
                        Connection.sendall(getAntwortJson_anz('BESETZT', 0))
                        logmessage('Sende Room-PCs ... BESETZT!')
                    else :
                        t, anz = GetRaumPCInfos(Raum)
                        t = 'DENY' if t == '' else t
                        Connection.sendall(getAntwortJson_anz(t, anz))
                        logmessage('Sende Room-PCs ...'); debugmessage('   Room-PCs: ' + t)
                elif bef==msg_GDRU:
                    t = GetRaumDrucker(Raum)
                    t = 'KEINE' if t == '' else t
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende Raum Drucker ...');  debugmessage('   Drucker: ' + t)
                elif bef==msg_RWOL:
                    t = GetRaumMACs(IP, Raum)
                    if (Raum != '') and (t != '') :
                        if mybase.WolCommand == 'linbo-remote':
                            Befehl = ['/usr/sbin/linbo-remote', '-w', '0', '-r', Raum]
                            Befehl_exec(Befehl)
                            logmessage('WakeOnLan ausgefuehrt fuer Raum: ' + Raum + ' mit linbo-remote.')
                        else:
                            MACListe = t.split(',')
                            for MAC in MACListe:
                                if mybase.WolCommand == '':
                                    Befehl = [def_WOL , MAC]     # def_WOL="wakeonlan" ohne zusaetzliche Optionen
                                else:
                                    Befehl = mybase.WolCommand.split() + [MAC]    # falls WolCommand auch Optionen enthält
                                Befehl_exec(Befehl)
                                time.sleep(mybase.WolDelay / 1000)
                            logmessage('WakeOnLan ausgefuehrt fuer Raum: ' + Raum + ' mit: ' + t)
                    else:
                        logmessage('ERROR: WakeOnLan konnte nicht ausgefuehrt werden??? (Kein Raum/MACs)')
            else:
                if bef==msg_AUTH:
                    t = 'DENY'
                    Connection.sendall(getAntwortJson(t))
                    logmessage('Sende Auth: ' + t)

    except ValueError as e:
        logmessage(str(e))
    if mybase.verbose > 0 :
        debugmessage('------ Verarbeitung - Ende (Connection '+str(Receive_Nr)+') ------')