예제 #1
0
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()
예제 #2
0
 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
예제 #3
0
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!")
예제 #4
0
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']
예제 #5
0
 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
예제 #6
0
 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
예제 #7
0
 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")
예제 #8
0
 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")
예제 #9
0
 def close(self):
     self.serverSocket.close()
     logger.log("§8[§eSERVER§8] §6Closed")
예제 #10
0
 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
예제 #11
0
 def disconnect(self):
     self.reconnect = False
     self.clientSocket.close()
     self.connected = False
     logger.log("§8[§eCLIENT§8] §6Disconnected")
예제 #12
0
def cron_interval_based():
    logger.log("Interval-based CronJob done.")
예제 #13
0
def cron_weekday_based():
    logger.log("today is friday!")
    logger.log("Weekday-based CronJob done.")
예제 #14
0
def cron_time_based():
    logger.log("Time-based CronJob done.")