souleyez 2.43.1__py3-none-any.whl → 2.43.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
souleyez/__init__.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = '2.43.1'
1
+ __version__ = '2.43.3'
2
2
 
souleyez/docs/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SoulEyez Documentation
2
2
 
3
- **Version:** 2.43.1
3
+ **Version:** 2.43.3
4
4
  **Last Updated:** January 11, 2026
5
5
  **Organization:** CyberSoul Security
6
6
 
souleyez/main.py CHANGED
@@ -173,7 +173,7 @@ def _check_privileged_tools():
173
173
 
174
174
 
175
175
  @click.group()
176
- @click.version_option(version='2.43.1')
176
+ @click.version_option(version='2.43.3')
177
177
  def cli():
178
178
  """SoulEyez - AI-Powered Pentesting Platform by CyberSoul Security"""
179
179
  from souleyez.log_config import init_logging
souleyez/ui/tool_setup.py CHANGED
@@ -797,22 +797,87 @@ def _install_snap_tool(console, tool: Dict) -> bool:
797
797
 
798
798
  def _install_git_tool(console, tool: Dict) -> bool:
799
799
  """Install a tool from git (requires sudo for /opt)."""
800
+ import re
801
+
800
802
  name = tool['name']
801
803
  cmd = tool['install']
802
804
 
803
- console.print(f" {name}...", end=" ")
805
+ console.print(f" {name}...")
806
+
807
+ # Parse the command to handle existing directories properly
808
+ # Commands are typically: git clone <url> <dir> && pip install ... && ln -sf ...
809
+ commands = [c.strip() for c in cmd.split('&&')]
810
+
811
+ clone_cmd = None
812
+ post_clone_cmds = []
813
+ target_dir = None
814
+
815
+ for i, c in enumerate(commands):
816
+ if 'git clone' in c:
817
+ clone_cmd = c
818
+ post_clone_cmds = commands[i + 1:]
819
+ # Extract target directory from clone command
820
+ # Pattern: git clone <url> <directory>
821
+ match = re.search(r'git clone\s+\S+\s+(\S+)', c)
822
+ if match:
823
+ target_dir = match.group(1)
824
+ break
825
+
826
+ # If we found a git clone command and target directory
827
+ if clone_cmd and target_dir:
828
+ dir_exists = Path(target_dir).exists()
829
+
830
+ if dir_exists:
831
+ console.print(f" [dim]Directory {target_dir} exists, updating...[/dim]")
832
+ # Try to update with git pull
833
+ pull_cmd = f"sudo git -C {target_dir} pull"
834
+ success, _, stderr = _run_command(pull_cmd, console, capture=True)
835
+
836
+ if not success and "not a git repository" in stderr.lower():
837
+ # Directory exists but isn't a git repo - remove and re-clone
838
+ console.print(f" [dim]Not a git repo, re-cloning...[/dim]")
839
+ rm_cmd = f"sudo rm -rf {target_dir}"
840
+ _run_command(rm_cmd, console, capture=True)
841
+ success, _, stderr = _run_command(clone_cmd, console, capture=True)
842
+ if not success:
843
+ console.print(f"[red]✗[/red]")
844
+ if stderr:
845
+ console.print(f" [dim]{stderr[:80]}[/dim]")
846
+ return False
847
+ elif not success:
848
+ # Pull failed for other reasons, try to continue anyway
849
+ console.print(f" [yellow]⚠ git pull failed, continuing with existing files[/yellow]")
850
+ else:
851
+ # Directory doesn't exist, run the clone
852
+ success, _, stderr = _run_command(clone_cmd, console, capture=True)
853
+ if not success:
854
+ console.print(f"[red]✗[/red]")
855
+ if stderr:
856
+ console.print(f" [dim]{stderr[:80]}[/dim]")
857
+ return False
858
+
859
+ # Run post-clone commands (pip install, symlink, etc.)
860
+ for post_cmd in post_clone_cmds:
861
+ post_cmd = post_cmd.strip()
862
+ if not post_cmd:
863
+ continue
864
+ success, _, stderr = _run_command(post_cmd, console, capture=True)
865
+ if not success:
866
+ console.print(f"[red]✗[/red]")
867
+ if stderr:
868
+ console.print(f" [dim]{stderr[:80]}[/dim]")
869
+ return False
870
+
871
+ console.print(f" [green]✓[/green]")
872
+ return True
804
873
 
805
- # These typically clone to /opt and need sudo
874
+ # Fallback: run the full command as-is (no git clone detected)
806
875
  success, _, stderr = _run_command(cmd, console, capture=True)
807
876
 
808
877
  if success:
809
878
  console.print("[green]✓[/green]")
810
879
  return True
811
880
  else:
812
- # Check if directory already exists
813
- if "already exists" in stderr:
814
- console.print("[green]✓ (already installed)[/green]")
815
- return True
816
881
  console.print(f"[red]✗[/red]")
817
882
  if stderr:
818
883
  console.print(f" [dim]{stderr[:80]}[/dim]")
@@ -320,8 +320,8 @@ EXTERNAL_TOOLS = {
320
320
  },
321
321
  'responder': {
322
322
  'command': 'responder',
323
- 'install_kali': 'sudo apt install responder && sudo pip install aioquic',
324
- 'install_ubuntu': 'sudo git clone https://github.com/lgandx/Responder.git /opt/Responder && sudo pip install -r /opt/Responder/requirements.txt aioquic && sudo ln -sf /opt/Responder/Responder.py /usr/local/bin/responder',
323
+ 'install_kali': 'sudo apt install responder && sudo pip install --break-system-packages aioquic',
324
+ 'install_ubuntu': 'sudo git clone https://github.com/lgandx/Responder.git /opt/Responder && sudo pip install --break-system-packages -r /opt/Responder/requirements.txt aioquic && sudo ln -sf /opt/Responder/Responder.py /usr/local/bin/responder',
325
325
  'install_method': 'kali_only',
326
326
  'description': 'LLMNR, NBT-NS and MDNS poisoner',
327
327
  'needs_sudo': True # Required for network poisoning
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: souleyez
3
- Version: 2.43.1
3
+ Version: 2.43.3
4
4
  Summary: AI-Powered Penetration Testing Platform with 40+ integrated tools
5
5
  Author-email: CyberSoul Security <contact@cybersoulsecurity.com>
6
6
  Maintainer-email: CyberSoul Security <contact@cybersoulsecurity.com>
@@ -1,10 +1,10 @@
1
- souleyez/__init__.py,sha256=DJ8p496pzHrV1rC5NT4HTGE6R5GEybXzpIr4MXWUPN8,24
1
+ souleyez/__init__.py,sha256=hQfhNFZmys4vpRUV0tekkwul1bHV-z9AHclh8q4E4WQ,24
2
2
  souleyez/config.py,sha256=av357I3GYRWAklv8Dto-9-5Db699Wq5znez7zo7241Q,11595
3
3
  souleyez/devtools.py,sha256=rptmUY4a5eVvYjdEc6273MSagL-D9xibPOFgohVqUno,3508
4
4
  souleyez/feature_flags.py,sha256=mo6YAq07lc6sR3lEFKmIwTKxXZ2JPxwa5X97uR_mu50,4642
5
5
  souleyez/history.py,sha256=gzs5I_j-3OigIP6yfmBChdqxaFmyUIxvTpzWUPe_Q6c,2853
6
6
  souleyez/log_config.py,sha256=MMhPAJOqgXDfuE-xm5g0RxAfWndcmbhFHvIEMm1a_Wo,5830
7
- souleyez/main.py,sha256=JxMzeX2Le-LlKZpI9Zevn_Tp4DT-8v71sd7oE7HJRqI,129100
7
+ souleyez/main.py,sha256=eQpWyYeCz8IvNFBJmqOqFv6x05FT8gOtUC62M_a-0UI,129100
8
8
  souleyez/scanner.py,sha256=U3IWHRrJ5aQ32dSHiVAHB60w1R_z0E0QxfM99msYNlw,3124
9
9
  souleyez/security.py,sha256=S84m1QmnKz_6NgH2I6IBIAorMHxRPNYVFSnks5xjihQ,2479
10
10
  souleyez/ui.py,sha256=15pfsqoDPnojAqr5S0TZHJE2ZkSHzkHpNVfVvsRj66A,34301
@@ -104,7 +104,7 @@ souleyez/detection/__init__.py,sha256=QIhvXjFdjrquQ6A0VQ7GZQkK_EXB59t8Dv9PKXhEUe
104
104
  souleyez/detection/attack_signatures.py,sha256=akgWwiIkh6WYnghCuLhRV0y6FS0SQ0caGF8tZUc49oA,6965
105
105
  souleyez/detection/mitre_mappings.py,sha256=xejE80YK-g8kKaeQoo-vBl8P3t8RTTItbfN0NaVZw6s,20558
106
106
  souleyez/detection/validator.py,sha256=-AJ7QSJ3-6jFKLnPG_Rc34IXyF4JPyI82BFUgTA9zw0,15641
107
- souleyez/docs/README.md,sha256=QV_P1kFEzxR7Ht2B1dtPpc4bjBssJRWy2VDb2cm0slc,7187
107
+ souleyez/docs/README.md,sha256=yY6yvWMHZZXVEQC2JeQ8Tui0TyXKbWNabPlh0X5BdO8,7187
108
108
  souleyez/docs/api-reference/cli-commands.md,sha256=lTLFnILN3YRVdqCaag7WgsYXfDGglb1TuPexkxDsVdE,12917
109
109
  souleyez/docs/api-reference/engagement-api.md,sha256=nd-EvQMtiJrobg2bzFEADp853HP1Uhb9dmgok0_-neE,11672
110
110
  souleyez/docs/api-reference/integration-guide.md,sha256=c96uX79ukHyYotLa54wZ20Kx-EUZnrKegTeGkfLD-pw,16285
@@ -364,15 +364,15 @@ souleyez/ui/team_dashboard.py,sha256=ejM_44nbJbEIPxxxdEK7SCPcqQtcuJLjoO-C53qED2Y
364
364
  souleyez/ui/template_selector.py,sha256=qQJkFNnVjYctb-toeYlupP_U1asGrJWYi5-HR89Ab9g,19103
365
365
  souleyez/ui/terminal.py,sha256=Sw9ma1-DZclJE1sENjTZ3Q7r-Ct1NiB3Lpmv-RZW5tE,2372
366
366
  souleyez/ui/timeline_view.py,sha256=Ze8Mev9VE4_ECdNFEJwZK2V42EBguR83uCCdwAbJqmc,11111
367
- souleyez/ui/tool_setup.py,sha256=Ah-EfuAZm6POJc9I6KSkMVPBD4LafEeXOqBzvcemvfs,33669
367
+ souleyez/ui/tool_setup.py,sha256=HkRTjzN7FHUs_XKtNYnphkdXb5kC4P6ghpI8TeCuEjU,36375
368
368
  souleyez/ui/tutorial.py,sha256=XxF06vNVbuzHjkbHbft6fDPj6RSH0tqr4FZ3K8DPSrY,14800
369
369
  souleyez/ui/tutorial_state.py,sha256=Thf7_qCj4VKjG7UqgJqa9kjIqiFUU-7Q7kG4v-u2B4A,8123
370
370
  souleyez/ui/wazuh_vulns_view.py,sha256=3vJJEmrjgS2wD6EDB7ZV7WxgytBHTm-1WqNDjp7lVEI,21830
371
371
  souleyez/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
372
- souleyez/utils/tool_checker.py,sha256=kQcXJVY5NiO-orQAUnpHhpQvR5UOBNHJ0PaT0fBxYoQ,30782
373
- souleyez-2.43.1.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
374
- souleyez-2.43.1.dist-info/METADATA,sha256=_QPUwJB_nRPuYIWH-QfIff98oyWrg2e_vH6Obn4Taic,10425
375
- souleyez-2.43.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
376
- souleyez-2.43.1.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
377
- souleyez-2.43.1.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
378
- souleyez-2.43.1.dist-info/RECORD,,
372
+ souleyez/utils/tool_checker.py,sha256=YZjEeHudjglvJk_MA-iQLzqEItFybhCy6PfaPoBANtE,30830
373
+ souleyez-2.43.3.dist-info/licenses/LICENSE,sha256=J7vDD5QMF4w2oSDm35eBgosATE70ah1M40u9W4EpTZs,1090
374
+ souleyez-2.43.3.dist-info/METADATA,sha256=SgqKTr7vd8TI_8YKA8yOHU1-QJez9VJH8HlFr9cAJvU,10425
375
+ souleyez-2.43.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
376
+ souleyez-2.43.3.dist-info/entry_points.txt,sha256=bN5W1dhjDZJl3TKclMjRpfQvGPmyrJLwwDuCj_X39HE,48
377
+ souleyez-2.43.3.dist-info/top_level.txt,sha256=afAMzS9p4lcdBNxhGo6jl3ipQE9HUvvNIPOdjtPjr_Q,9
378
+ souleyez-2.43.3.dist-info/RECORD,,