def call(name, *args, scope="global", **kwargs): try: for event in events: if event.name == name and event.scope == scope: event.call(*args, **kwargs) except Exception as e: logger.log(f"§cEvent '{name}' throw exception: {e}") traceback.print_exc()
def _function(self): try: self.function() except Exception as e: logger.log(f"§cCronJob '{self.name}' throw exception: {e}") traceback.print_exc() if self.wait_for_last_job is True: self._current_thread = None
def endLogTime(name, log=True): if name in logTimes: convertedTime = tools.convertTime(time.time() - logTimes[name], millis=True) if log: logger.log(f"§8[§bTIME§8] §e{name} finished in §6{convertedTime}") logTimes.pop(name) return convertedTime else: logger.log(f"§cError: {name} not exist!")
def uploadToHastebin(content): url = 'https://hastebin.com' data = "" if type(content) == str: data = content elif type(content) == list: for i in content: data += str(i) + "\n" else: logger.log("§cError: Please insert string or list!") return response = requests.post(url + '/documents', data=data.encode('utf-8')) return url + '/' + response.json()['key']
def _calc_next_run(self): if type(self.interval) is int: self._next_run = self._last_run + self.interval return if type(self.interval) is str: if ":" in self.interval: regex = re.compile( r'((?P<hours>\d+?):)?((?P<minutes>\d+?):)?((?P<seconds>\d+?):)?' ) parts = regex.match(self.interval + ":") if parts: parts = parts.groupdict() global _UPDATE_INTERVAL if parts["minutes"] and _UPDATE_INTERVAL > 60: _UPDATE_INTERVAL = 60 if parts["seconds"] and _UPDATE_INTERVAL > 1: _UPDATE_INTERVAL = 1 for name, val in parts.items(): parts[name] = int(val) if val else 0 today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) delta = timedelta(**parts) self._next_run = (today + delta).timestamp() if time.time() > self._next_run: self._next_run = (today + timedelta(days=1) + delta).timestamp() return else: if self.interval.lower() in [ "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday" ]: wday_ofs = time.strptime(self.interval, "%A").tm_wday today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) self._next_run = (today - timedelta(days=today.weekday()) + timedelta(days=wday_ofs)).timestamp() if time.time() > self._next_run: self._next_run = ( today - timedelta(days=today.weekday()) + timedelta(weeks=1, days=wday_ofs)).timestamp() return self._next_run = sys.maxsize logger.log(f"§cCronJob '{self.name}' will never execute!") return
def send(self, data, savePackage=True): try: send_data = json.dumps(data) if self.enabled_encrypt is True: send_data = "{" + base64.b64encode( crypthography.encrypt(self.secret_key, send_data)).decode('utf-8') + "}" send_data = bytes(send_data + self.seq, "utf-8") # if len(send_data) > 65536: # for i in range(math.ceil(len(send_data) / 65536)): # self.clientSocket.send(send_data[65536*i:][:65536]) # else: # self.clientSocket.send(send_data) self.clientSocket.send(send_data) if data["METHOD"] not in self.packagePrintBlacklist: logger.log("§8[§eCLIENT§8] §r[OUT] " + data["METHOD"]) return True except Exception as e: logger.log( "§8[§eCLIENT§8] §8[§cWARNING§8] §cFailed to send data: " + str(e)) if not self.connected and savePackage is True: self.lostPackages.append(data) return False
def sendTo(self, sock, data): try: send_data = json.dumps(data) if self.enabled_encrypt is True: send_data = "{" + base64.b64encode( crypthography.encrypt(self.secret_key, send_data)).decode('utf-8') + "}" send_data = bytes(send_data + self.seq, "utf-8") #if len(send_data) > 65536: # for i in range(math.ceil(len(send_data)/65536)): # sock.send(send_data[65536*i:][:65536]) #else: # sock.send(send_data) sock.send(send_data) if data["METHOD"] not in self.packagePrintBlacklist: logger.log("§8[§eSERVER§8] §r[OUT] " + data["METHOD"]) except Exception as e: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cFailed to send data: " + str(e)) if e == BrokenPipeError or "Broken pipe" in str(e): p = True for client in self.clients: if client["clientSocket"] == sock: events.call("ON_CLIENT_DISCONNECT", client, scope=self.eventScope) logger.log("§8[§eSERVER§8] §6Client '" + client["clientID"] + "' disconnected") self.clients.remove(client) p = False try: self.clientSocks.remove(sock) except: pass try: sock.close() except: pass if p is True: logger.log("§8[§eSERVER§8] §6Client disconnected")
def clientTask(clientSocket, address): logger.log("§8[§eSERVER§8] §aClient connected from §6" + str(address)) error = False if self.enabled_whitelist_ip is True: if address[0] not in self.whitelisted_ips: error = True logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cIp-Address §6'" + str(address[0]) + "'§c not whitelisted!") lastData = "" while error is False: try: recvData = clientSocket.recv(32768) recvData = str(recvData, "utf-8") if recvData != "": if not recvData.startswith("{") and ( recvData.endswith("}" + self.seq) or (lastData + recvData).endswith("}" + self.seq)): if lastData != "": recvData = lastData + recvData if self.printUnsignedData: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cUnsigned data repaired" ) elif not recvData.endswith("}" + self.seq): lastData += recvData if self.printUnsignedData: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cReceiving unsigned data: §r" + recvData) continue if "}" + self.seq + "{" in recvData: recvDataList = recvData.split("}" + self.seq + "{") recvData = "[" for i in range(len(recvDataList)): if self.enabled_encrypt is True: recvData += crypthography.decrypt( self.secret_key, base64.b64decode( (recvDataList[i][1:] if i == 0 else recvDataList[i]).replace( "}" + self.seq, "").encode( 'ascii'))).decode("utf-8") if i + 1 < len(recvDataList): recvData += ", " else: recvData += recvDataList[i].replace( self.seq, "") if i + 1 < len(recvDataList): recvData += "}, {" recvData += "]" lastData = "" elif "}" + self.seq in recvData: if self.enabled_encrypt is True: recvData = "[" + crypthography.decrypt( self.secret_key, base64.b64decode( recvData.replace("}" + self.seq, "")[1:]. encode('ascii'))).decode("utf-8") + "]" else: recvData = "[" + recvData.replace( self.seq, "") + "]" lastData = "" try: recvData = json.loads(recvData) except: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cReceiving broken data: §r" + str(recvData)) continue for data in recvData: if data["METHOD"] == "ALIVE": self.sendTo(clientSocket, {"METHOD": "ALIVE_OK"}) elif data["METHOD"] == "AUTHENTICATION": logger.log("§8[§eSERVER§8] §r[IN] " + data["METHOD"]) if data["PASSWORD"] == self.password: if self.enabled_whitelist_mac is True: if "MAC" not in data: error = True self.sendTo( clientSocket, { "METHOD": "AUTHENTICATION_FAILED" }) logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cNo MAC are given!" ) elif data[ "MAC"] not in self.whitelisted_macs: error = True self.sendTo( clientSocket, { "METHOD": "AUTHENTICATION_FAILED" }) logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cMAC §6'" + str(data["MAC"]) + "'§c not whitelisted!") if error is False: for c in self.clients: if c["clientID"] == data[ "CLIENT_ID"]: self.sendTo( clientSocket, { "METHOD": "AUTHENTICATION_FAILED" }) error = True break if error is False: client = { "clientSocket": clientSocket, "clientID": data["CLIENT_ID"], "clientType": data["CLIENT_TYPE"] } self.clients.append(client) self.sendTo( clientSocket, {"METHOD": "AUTHENTICATION_OK"}) logger.log( "§8[§eSERVER§8] §aClient '" + data["CLIENT_ID"] + "' authenticated §6('" + data["MAC"] + "')") events.call("ON_CLIENT_CONNECT", client, scope=self.eventScope) else: self.sendTo( clientSocket, {"METHOD": "AUTHENTICATION_FAILED"}) error = True break else: client = self.getClient(clientSocket) if client is not None: if data["METHOD"] not in self.packagePrintBlacklist: logger.log("§8[§eSERVER§8] §r[IN] " + data["METHOD"]) events.call("ON_RECEIVE", client, data, scope=self.eventScope) else: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cReceiving not authenticated package: §r" + data["METHOD"]) except Exception as e: if "Connection reset by peer" in str( e) or "Connection timed out" in str( e) or "Bad file descriptor" in str(e): break if self.uploadError is True: try: link = dev.uploadToHastebin(traceback.format_exc()) logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cException: §4" + str(e) + " §r" + str(link)) except: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cException: §4" + str(e)) else: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cException: §4" + str(e)) break p = True for client in self.clients: if client["clientSocket"] == clientSocket: events.call("ON_CLIENT_DISCONNECT", client, scope=self.eventScope) logger.log("§8[§eSERVER§8] §6Client '" + client["clientID"] + "' disconnected") self.clients.remove(client) p = False try: self.clientSocks.remove(clientSocket) except: pass try: clientSocket.close() except: pass if p is True: logger.log("§8[§eSERVER§8] §6Client " + str(address) + " disconnected")
def close(self): self.serverSocket.close() logger.log("§8[§eSERVER§8] §6Closed")
def clientTask(): if self.error is False: self.send({ "METHOD": "AUTHENTICATION", "CLIENT_ID": self.clientID, "CLIENT_TYPE": self.clientType, "PASSWORD": self.password, "MAC": str(getmac.get_mac_address()).upper() }) lastData = "" while self.error is False: try: recvData = self.clientSocket.recv(32768) recvData = str(recvData, "utf-8") if not recvData.startswith("{") and ( recvData.endswith("}" + self.seq) or (lastData + recvData).endswith("}" + self.seq)): if lastData != "": recvData = lastData + recvData if self.printUnsignedData: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cUnsigned data repaired" ) if not recvData.endswith("}" + self.seq): lastData += recvData if self.printUnsignedData: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cReceiving unsigned data: §r" + recvData) continue if recvData != "": if "}" + self.seq + "{" in recvData: recvDataList = recvData.split("}" + self.seq + "{") recvData = "[" for i in range(len(recvDataList)): if self.enabled_encrypt is True: recvData += crypthography.decrypt( self.secret_key, base64.b64decode( (recvDataList[i][1:] if i == 0 else recvDataList[i]).replace( "}" + self.seq, "").encode('ascii')) ).decode("utf-8") if i + 1 < len(recvDataList): recvData += ", " else: recvData += recvDataList[i].replace( self.seq, "") if i + 1 < len(recvDataList): recvData += "}, {" recvData += "]" lastData = "" elif "}" + self.seq in recvData: if self.enabled_encrypt is True: recvData = "[" + crypthography.decrypt( self.secret_key, base64.b64decode( recvData.replace( "}" + self.seq, "")[1:].encode('ascii')) ).decode("utf-8") + "]" else: recvData = "[" + recvData.replace( self.seq, "") + "]" lastData = "" try: recvData = json.loads(recvData) except: logger.log( "§8[§eSERVER§8] §8[§cWARNING§8] §cReceiving broken data: §r" + str(recvData)) continue for data in recvData: if data["METHOD"] not in self.packagePrintBlacklist: logger.log("§8[§eCLIENT§8] §r[IN] " + data["METHOD"]) if data["METHOD"] == "AUTHENTICATION_FAILED": self.error = True self.authenticated = False elif data["METHOD"] == "AUTHENTICATION_OK": self.authenticated = True events.call("ON_CONNECT", scope=self.eventScope) for package in self.lostPackages: self.send(package) self.lostPackages.clear() elif data["METHOD"] != "ALIVE_OK": events.call("ON_RECEIVE", data, scope=self.eventScope) except Exception as e: self.error = True if self.uploadError is True: try: link = dev.uploadToHastebin( traceback.format_exc()) logger.log( "§8[§eCLIENT§8] §8[§cWARNING§8] §cException: §4" + str(e) + " §r" + str(link)) except: logger.log( "§8[§eCLIENT§8] §8[§cWARNING§8] §cException: §4" + str(e)) else: logger.log( "§8[§eCLIENT§8] §8[§cWARNING§8] §cException: §4" + str(e)) break self.clientSocket.close() self.connected = False logger.log("§8[§eCLIENT§8] §6Disconnected") if self.reconnect is True: if self.authenticated is False: logger.log("§8[§eCLIENT§8] §6Reconnect in 60 seconds") time.sleep(60) else: logger.log("§8[§eCLIENT§8] §6Reconnect in 10 seconds") time.sleep(10) self.clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) _connect(False) self.authenticated = False
def disconnect(self): self.reconnect = False self.clientSocket.close() self.connected = False logger.log("§8[§eCLIENT§8] §6Disconnected")
def cron_interval_based(): logger.log("Interval-based CronJob done.")
def cron_weekday_based(): logger.log("today is friday!") logger.log("Weekday-based CronJob done.")
def cron_time_based(): logger.log("Time-based CronJob done.")