mirror of
https://github.com/iio612/DEFENDER.git
synced 2026-02-14 03:34:23 +00:00
Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
979ba40c05 | ||
|
|
cea69c1580 | ||
|
|
c404cc3234 | ||
|
|
80b329dd5d | ||
|
|
f7b49c151f | ||
|
|
1ee9b7e3ff | ||
|
|
4d0087623c | ||
|
|
dc20f5ec3c | ||
|
|
110cae3b84 | ||
|
|
857cbfc85d | ||
|
|
3518589e9c | ||
|
|
e14c97de03 | ||
|
|
69360be3ad | ||
|
|
bfa90c6bd5 | ||
|
|
5c8378a0e7 | ||
|
|
e3b212ea88 | ||
|
|
0c2a350d38 | ||
|
|
1cea8d0601 | ||
|
|
652b400d5e | ||
|
|
2f8b965b59 | ||
|
|
3c043cefd8 | ||
|
|
59a75cecd8 | ||
|
|
71053437a7 | ||
|
|
7796d05206 | ||
|
|
5f2567f9e5 | ||
|
|
aaa1dd9a1a | ||
|
|
a02f2f9a26 | ||
|
|
d73adb6f0b | ||
|
|
b812e64992 | ||
|
|
9bd1f68df2 | ||
|
|
f44b08bf36 | ||
|
|
1a19e1613a | ||
|
|
cdc15b7b47 | ||
|
|
31fe9f62ec | ||
|
|
f0853e3afb | ||
|
|
6dade09257 | ||
|
|
9533b010b2 | ||
|
|
824db73590 | ||
|
|
96bf4b6f80 | ||
|
|
922336363e |
13
core/base.py
13
core/base.py
@@ -236,19 +236,6 @@ class Base:
|
||||
|
||||
return False
|
||||
|
||||
def db_update_module(self, user_cmd: str, module_name: str) -> None:
|
||||
"""Modifie la date et le user qui a rechargé le module
|
||||
|
||||
Args:
|
||||
user_cmd (str): le user qui a rechargé le module
|
||||
module_name (str): le module a rechargé
|
||||
"""
|
||||
update_cmd_query = f"UPDATE {self.Config.table_module} SET datetime = :datetime, user = :user WHERE module_name = :module_name"
|
||||
mes_donnees = {'datetime': self.get_datetime(), 'user': user_cmd, 'module_name': module_name}
|
||||
self.db_execute_query(update_cmd_query, mes_donnees)
|
||||
|
||||
return False
|
||||
|
||||
def db_delete_module(self, module_name:str) -> None:
|
||||
"""Supprime les modules de la base de données
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@ class Install:
|
||||
self.set_configuration()
|
||||
|
||||
if self.skip_install:
|
||||
self.check_packages_version()
|
||||
return None
|
||||
|
||||
self.check_packages_version()
|
||||
@@ -86,13 +85,11 @@ class Install:
|
||||
|
||||
if not os.path.exists(os.path.join(self.config.defender_install_folder, 'core', 'configuration.json')):
|
||||
# If configuration file do not exist
|
||||
exit("/!\\ Configuration file (core/configuration.json) doesn't exist! please create it /!\\")
|
||||
exit("/!\\ Configuration file (core/configuration.json) doesn't exist /!\\")
|
||||
|
||||
# Exclude Windows OS from the installation
|
||||
if os.name == 'nt':
|
||||
# If windows, modify pip and python virtual environment executable
|
||||
self.config.venv_pip_executable = f'{os.path.join(defender_install_folder, venv_folder, "Scripts")}{os.sep}pip.exe'
|
||||
self.config.venv_python_executable = f'{os.path.join(defender_install_folder, venv_folder, "Scripts")}{os.sep}python.exe'
|
||||
#print('/!\\ Skip installation /!\\')
|
||||
self.skip_install = True
|
||||
return False
|
||||
|
||||
@@ -104,7 +101,7 @@ class Install:
|
||||
def is_root(self) -> bool:
|
||||
|
||||
if os.geteuid() != 0:
|
||||
print('> User without privileges ==> OK')
|
||||
print('User without privileges ==> PASS')
|
||||
return False
|
||||
elif os.geteuid() == 0:
|
||||
print('/!\\ Do not use root to install Defender /!\\')
|
||||
|
||||
133
core/irc.py
133
core/irc.py
@@ -313,7 +313,7 @@ class Irc:
|
||||
|
||||
def send_response(self, responses:list[bytes]) -> None:
|
||||
try:
|
||||
# print(responses)
|
||||
# print(data)
|
||||
for data in responses:
|
||||
response = data.decode(self.CHARSET[0]).split()
|
||||
self.cmd(response)
|
||||
@@ -490,8 +490,7 @@ class Irc:
|
||||
self.Base.db_record_module(fromuser, module_name)
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Module {module_name} chargé")
|
||||
|
||||
# self.Base.logs.info(self.loaded_classes)
|
||||
self.Base.logs.info(f"Module {class_name} has been loaded")
|
||||
self.Base.logs.info(self.loaded_classes)
|
||||
return True
|
||||
|
||||
except ModuleNotFoundError as moduleNotFound:
|
||||
@@ -535,61 +534,11 @@ class Irc:
|
||||
self.Base.logs.error(f"General Error: {err}")
|
||||
return False
|
||||
|
||||
def reload_module(self, from_user: str, mod_name: str) -> bool:
|
||||
try:
|
||||
module_name = mod_name.lower() # ==> mod_defender
|
||||
class_name = module_name.split('_')[1].capitalize() # ==> Defender
|
||||
|
||||
if 'mods.' + module_name in sys.modules:
|
||||
self.Base.logs.info('Unload the module ...')
|
||||
self.loaded_classes[class_name].unload()
|
||||
self.Base.logs.info('Module Already Loaded ... reloading the module ...')
|
||||
the_module = sys.modules['mods.' + module_name]
|
||||
importlib.reload(the_module)
|
||||
|
||||
# Supprimer la class déja instancier
|
||||
if class_name in self.loaded_classes:
|
||||
# Supprimer les commandes déclarer dans la classe
|
||||
for level, command in self.loaded_classes[class_name].commands_level.items():
|
||||
# Supprimer la commande de la variable commands
|
||||
for c in self.loaded_classes[class_name].commands_level[level]:
|
||||
self.commands.remove(c)
|
||||
self.commands_level[level].remove(c)
|
||||
|
||||
del self.loaded_classes[class_name]
|
||||
|
||||
my_class = getattr(the_module, class_name, None)
|
||||
new_instance = my_class(self.ircObject)
|
||||
self.loaded_classes[class_name] = new_instance
|
||||
|
||||
self.Base.db_update_module(from_user, mod_name)
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Module {module_name} rechargé")
|
||||
return False
|
||||
else:
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Module {module_name} n'est pas chargé !")
|
||||
|
||||
except TypeError as te:
|
||||
self.Base.logs.error(f"A TypeError raised: {te}")
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :A TypeError raised: {te}")
|
||||
self.Base.db_delete_module(module_name)
|
||||
except AttributeError as ae:
|
||||
self.Base.logs.error(f"Missing Attribute: {ae}")
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Missing Attribute: {ae}")
|
||||
self.Base.db_delete_module(module_name)
|
||||
except KeyError as ke:
|
||||
self.Base.logs.error(f"Key Error: {ke}")
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Key Error: {ke}")
|
||||
self.Base.db_delete_module(module_name)
|
||||
except Exception as e:
|
||||
self.Base.logs.error(f"Something went wrong with a module you want to reload: {e}")
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Something went wrong with the module: {e}")
|
||||
self.Base.db_delete_module(module_name)
|
||||
|
||||
def insert_db_admin(self, uid:str, level:int) -> None:
|
||||
|
||||
if self.User.get_User(uid) is None:
|
||||
return None
|
||||
|
||||
|
||||
getUser = self.User.get_User(uid)
|
||||
|
||||
nickname = getUser.nickname
|
||||
@@ -1100,7 +1049,7 @@ class Irc:
|
||||
ping_response = current_unixtime - recieved_unixtime
|
||||
|
||||
self.send2socket(f'PONG :{recieved_unixtime}')
|
||||
self.send2socket(f':{dnickname} NOTICE {user_trigger} :\x01PING {ping_response} secs\x01')
|
||||
self.send2socket(f':{dnickname} NOTICE {user_trigger} :\x01PING {recieved_unixtime} secs\x01')
|
||||
return False
|
||||
|
||||
if not arg[0].lower() in self.commands:
|
||||
@@ -1416,14 +1365,8 @@ class Irc:
|
||||
self.send2socket(f':{dnickname} NOTICE {fromuser} : ***************** FIN DES COMMANDES *****************')
|
||||
|
||||
case 'load':
|
||||
try:
|
||||
# Load a module ex: .load mod_defender
|
||||
mod_name = str(cmd[1])
|
||||
self.load_module(fromuser, mod_name)
|
||||
except KeyError as ke:
|
||||
self.Base.logs.error(f"Key Error: {ke} - list recieved: {cmd}")
|
||||
except Exception as err:
|
||||
self.Base.logs.error(f"General Error: {ke} - list recieved: {cmd}")
|
||||
|
||||
self.load_module(fromuser, str(cmd[1]))
|
||||
|
||||
case 'unload':
|
||||
# unload mod_defender
|
||||
@@ -1434,10 +1377,50 @@ class Irc:
|
||||
self.Base.logs.error(f"General Error: {err}")
|
||||
|
||||
case 'reload':
|
||||
# reload mod_defender
|
||||
# reload mod_dktmb
|
||||
try:
|
||||
module_name = str(cmd[1]).lower() # ==> mod_defender
|
||||
self.reload_module(from_user=fromuser, mod_name=module_name)
|
||||
module_name = str(cmd[1]).lower() # ==> mod_defender
|
||||
class_name = module_name.split('_')[1].capitalize() # ==> Defender
|
||||
|
||||
if 'mods.' + module_name in sys.modules:
|
||||
self.Base.logs.info('Unload the module ...')
|
||||
self.loaded_classes[class_name].unload()
|
||||
self.Base.logs.info('Module Already Loaded ... reloading the module ...')
|
||||
the_module = sys.modules['mods.' + module_name]
|
||||
importlib.reload(the_module)
|
||||
|
||||
# Supprimer la class déja instancier
|
||||
if class_name in self.loaded_classes:
|
||||
# Supprimer les commandes déclarer dans la classe
|
||||
for level, command in self.loaded_classes[class_name].commands_level.items():
|
||||
# Supprimer la commande de la variable commands
|
||||
for c in self.loaded_classes[class_name].commands_level[level]:
|
||||
self.commands.remove(c)
|
||||
self.commands_level[level].remove(c)
|
||||
|
||||
del self.loaded_classes[class_name]
|
||||
|
||||
my_class = getattr(the_module, class_name, None)
|
||||
new_instance = my_class(self.ircObject)
|
||||
self.loaded_classes[class_name] = new_instance
|
||||
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Module {module_name} rechargé")
|
||||
return False
|
||||
else:
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Module {module_name} n'est pas chargé !")
|
||||
|
||||
except TypeError as te:
|
||||
self.Base.logs.error(f"A TypeError raised: {te}")
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :A TypeError raised: {te}")
|
||||
self.Base.db_delete_module(module_name)
|
||||
except AttributeError as ae:
|
||||
self.Base.logs.error(f"Missing Attribute: {ae}")
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Missing Attribute: {ae}")
|
||||
self.Base.db_delete_module(module_name)
|
||||
except KeyError as ke:
|
||||
self.Base.logs.error(f"Key Error: {ke}")
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Key Error: {ke}")
|
||||
self.Base.db_delete_module(module_name)
|
||||
except Exception as e:
|
||||
self.Base.logs.error(f"Something went wrong with a module you want to reload: {e}")
|
||||
self.send2socket(f":{self.Config.SERVICE_NICKNAME} PRIVMSG {self.Config.SERVICE_CHANLOG} :Something went wrong with the module: {e}")
|
||||
@@ -1488,24 +1471,24 @@ class Irc:
|
||||
|
||||
self.Base.logs.debug(self.loaded_classes)
|
||||
all_modules = self.Base.get_all_modules()
|
||||
loaded = False
|
||||
|
||||
results = self.Base.db_execute_query(f'SELECT datetime, user, module_name FROM {self.Config.table_module}')
|
||||
results = self.Base.db_execute_query(f'SELECT module_name FROM {self.Config.table_module}')
|
||||
results = results.fetchall()
|
||||
|
||||
found = False
|
||||
|
||||
for module in all_modules:
|
||||
for loaded_mod in results:
|
||||
if module == loaded_mod[2]:
|
||||
loaded_datetime = loaded_mod[0]
|
||||
loaded_user = loaded_mod[1]
|
||||
loaded = True
|
||||
if module == loaded_mod[0]:
|
||||
found = True
|
||||
|
||||
if loaded:
|
||||
self.send2socket(f":{dnickname} NOTICE {fromuser} :{module} - {self.Config.COLORS.green}Loaded{self.Config.COLORS.nogc} by {loaded_user} on {loaded_datetime}")
|
||||
loaded = False
|
||||
if found:
|
||||
self.send2socket(f":{dnickname} NOTICE {fromuser} :{module} - {self.Config.COLORS.green}Loaded{self.Config.COLORS.nogc}")
|
||||
else:
|
||||
self.send2socket(f":{dnickname} NOTICE {fromuser} :{module} - {self.Config.COLORS.red}Not Loaded{self.Config.COLORS.nogc}")
|
||||
|
||||
found = False
|
||||
|
||||
case 'show_timers':
|
||||
|
||||
if self.Base.running_timers:
|
||||
|
||||
@@ -150,7 +150,6 @@ class Command():
|
||||
try:
|
||||
message = ' '.join(cmd[3:])
|
||||
self.Irc.send2socket(f":{dnickname} NOTICE {self.user_to_notice} :[{red}ERROR MSG{nogc}] {message}")
|
||||
self.Base.logs.error(f"{cmd[1]} - {message}")
|
||||
except KeyError as ke:
|
||||
self.Base.logs.error(ke)
|
||||
except Exception as err:
|
||||
@@ -213,7 +212,6 @@ class Command():
|
||||
dnickname = self.Config.SERVICE_NICKNAME
|
||||
service_id = self.Config.SERVICE_ID
|
||||
dchanlog = self.Config.SERVICE_CHANLOG
|
||||
self.user_to_notice = user
|
||||
fromuser = user
|
||||
fromchannel = channel
|
||||
|
||||
|
||||
@@ -10,7 +10,8 @@ class Jsonrpc():
|
||||
class ModConfModel:
|
||||
"""The Model containing the module parameters
|
||||
"""
|
||||
jsonrpc: int = 0
|
||||
param_exemple1: str
|
||||
param_exemple2: int
|
||||
|
||||
def __init__(self, ircInstance:Irc) -> None:
|
||||
|
||||
@@ -58,22 +59,10 @@ class Jsonrpc():
|
||||
self.__load_module_configuration()
|
||||
# End of mandatory methods you can start your customization #
|
||||
|
||||
# self.UnrealIrcdRpcLive: Live = Live(
|
||||
# req_method='unixsocket',
|
||||
# path_to_socket_file=self.Config.JSONRPC_PATH_TO_SOCKET_FILE,
|
||||
# callback_object_instance=self,
|
||||
# callback_method_name='callback_sent_to_irc'
|
||||
# )
|
||||
|
||||
self.UnrealIrcdRpcLive: Live = Live(
|
||||
req_method='websocket',
|
||||
url=self.Config.JSONRPC_URL,
|
||||
username=self.Config.JSONRPC_USER,
|
||||
password=self.Config.JSONRPC_PASSWORD,
|
||||
callback_object_instance=self,
|
||||
callback_method_name='callback_sent_to_irc',
|
||||
debug_level=10
|
||||
)
|
||||
self.UnrealIrcdRpcLive: Live = Live(path_to_socket_file=self.Config.JSONRPC_PATH_TO_SOCKET_FILE,
|
||||
callback_object_instance=self,
|
||||
callback_method_name='callback_sent_to_irc'
|
||||
)
|
||||
|
||||
self.Rpc: Loader = Loader(
|
||||
req_method=self.Config.JSONRPC_METHOD,
|
||||
@@ -90,9 +79,6 @@ class Jsonrpc():
|
||||
if self.UnrealIrcdRpcLive.Error.code != 0:
|
||||
self.Irc.sendPrivMsg(f"[{self.Config.COLORS.red}ERROR{self.Config.COLORS.nogc}] {self.UnrealIrcdRpcLive.Error.message}", self.Config.SERVICE_CHANLOG)
|
||||
|
||||
if self.ModConfig.jsonrpc == 1:
|
||||
self.Base.create_thread(self.thread_start_jsonrpc, run_once=True)
|
||||
|
||||
return None
|
||||
|
||||
def __set_commands(self, commands:dict[int, list[str]]) -> None:
|
||||
@@ -165,10 +151,10 @@ class Jsonrpc():
|
||||
"""
|
||||
try:
|
||||
# Build the default configuration model (Mandatory)
|
||||
self.ModConfig = self.ModConfModel(jsonrpc=0)
|
||||
self.ModConfig = self.ModConfModel(param_exemple1='param value 1', param_exemple2=1)
|
||||
|
||||
# Sync the configuration with core configuration (Mandatory)
|
||||
self.Base.db_sync_core_config(self.module_name, self.ModConfig)
|
||||
#self.Base.db_sync_core_config(self.module_name, self.ModConfig)
|
||||
|
||||
return None
|
||||
|
||||
@@ -197,7 +183,6 @@ class Jsonrpc():
|
||||
|
||||
command = str(cmd[0]).lower()
|
||||
dnickname = self.Config.SERVICE_NICKNAME
|
||||
dchannel = self.Config.SERVICE_CHANLOG
|
||||
fromuser = user
|
||||
fromchannel = str(channel) if not channel is None else None
|
||||
|
||||
@@ -214,19 +199,10 @@ class Jsonrpc():
|
||||
match option:
|
||||
|
||||
case 'on':
|
||||
for thread in self.Base.running_threads:
|
||||
if thread.getName() == 'thread_start_jsonrpc':
|
||||
if thread.is_alive():
|
||||
self.Irc.sendPrivMsg(f"Thread {thread.getName()} is running", dchannel)
|
||||
else:
|
||||
self.Irc.sendPrivMsg(f"Thread {thread.getName()} is not running, wait untill the process will be cleaned up", dchannel)
|
||||
|
||||
self.Base.create_thread(self.thread_start_jsonrpc, run_once=True)
|
||||
self.__update_configuration('jsonrpc', 1)
|
||||
|
||||
case 'off':
|
||||
self.UnrealIrcdRpcLive.unsubscribe()
|
||||
self.__update_configuration('jsonrpc', 0)
|
||||
|
||||
except IndexError as ie:
|
||||
self.Logs.error(ie)
|
||||
@@ -275,9 +251,6 @@ class Jsonrpc():
|
||||
self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :VHOST : {UserInfo.user.vhost}')
|
||||
self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :CLIENT PORT : {UserInfo.client_port}')
|
||||
self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :SERVER PORT : {UserInfo.server_port}')
|
||||
|
||||
self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :CERTFP : {UserInfo.tls.certfp}')
|
||||
self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :CIPHER : {UserInfo.tls.cipher}')
|
||||
|
||||
self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :IDLE SINCE : {UserInfo.idle_since}')
|
||||
self.Irc.send2socket(f':{dnickname} NOTICE {fromuser} :CONNECTED SINCE : {UserInfo.connected_since}')
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"version": "5.4.0",
|
||||
"version": "5.3.7",
|
||||
|
||||
"requests": "2.32.3",
|
||||
"psutil": "6.0.0",
|
||||
"unrealircd_rpc_py": "1.0.6",
|
||||
"unrealircd_rpc_py": "1.0.4",
|
||||
"sqlalchemy": "2.0.35",
|
||||
"faker": "30.1.0"
|
||||
}
|
||||
Reference in New Issue
Block a user