sharkit 1.0.0.dev1__tar.gz → 1.0.0.dev2__tar.gz

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.
Files changed (79) hide show
  1. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/PKG-INFO +1 -1
  2. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/pyproject.toml +1 -1
  3. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/commands/builtins.py +35 -23
  4. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/console/completion.py +4 -1
  5. sharkit-1.0.0.dev2/src/sharkit/tools/flatten_tools.sh +107 -0
  6. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/.gitignore +0 -0
  7. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/LICENSE +0 -0
  8. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/README.md +0 -0
  9. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/__init__.py +0 -0
  10. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/__main__.py +0 -0
  11. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/app.py +0 -0
  12. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/commands/__init__.py +0 -0
  13. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/commands/base.py +0 -0
  14. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/commands/registry.py +0 -0
  15. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/config/__init__.py +0 -0
  16. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/config/manager.py +0 -0
  17. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/config/paths.py +0 -0
  18. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/console/__init__.py +0 -0
  19. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/console/prompt.py +0 -0
  20. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/console/repl.py +0 -0
  21. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/exceptions.py +0 -0
  22. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/history/__init__.py +0 -0
  23. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/history/manager.py +0 -0
  24. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/network/__init__.py +0 -0
  25. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/network/client.py +0 -0
  26. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/output/__init__.py +0 -0
  27. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/output/renderer.py +0 -0
  28. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/output/theme.py +0 -0
  29. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/__init__.py +0 -0
  30. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/base.py +0 -0
  31. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/network → sharkit-1.0.0.dev2/src/sharkit/tools/geoint/recon/wifi}/mylnikov.py +0 -0
  32. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/humint/__init__.py +0 -0
  33. {sharkit-1.0.0.dev1/src/sharkit/tools/humint → sharkit-1.0.0.dev2/src/sharkit/tools/humint/factcheck}/truthcheck.py +0 -0
  34. {sharkit-1.0.0.dev1/src/sharkit/tools/humint → sharkit-1.0.0.dev2/src/sharkit/tools/humint/factcheck}/verifact.py +0 -0
  35. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/loader.py +0 -0
  36. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/manager.py +0 -0
  37. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/util → sharkit-1.0.0.dev2/src/sharkit/tools/osint/analytics}/crypto/mempool.py +0 -0
  38. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/util/hash → sharkit-1.0.0.dev2/src/sharkit/tools/osint/analytics/hashes}/hash_decrypt.py +0 -0
  39. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/util/hash → sharkit-1.0.0.dev2/src/sharkit/tools/osint/analytics/hashes}/hash_lookup.py +0 -0
  40. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/util/image → sharkit-1.0.0.dev2/src/sharkit/tools/osint/analytics/images}/exif_reader.py +0 -0
  41. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/util → sharkit-1.0.0.dev2/src/sharkit/tools/osint/analytics}/text/base64_tool.py +0 -0
  42. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/util → sharkit-1.0.0.dev2/src/sharkit/tools/osint/analytics}/text/text_entropy.py +0 -0
  43. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/humint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/gather}/scraperx.py +0 -0
  44. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/humint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/gather}/scweet.py +0 -0
  45. {sharkit-1.0.0.dev1/src/sharkit/tools/osint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/darkweb}/ahmia_search.py +0 -0
  46. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/humint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/darkweb}/pyahmia.py +0 -0
  47. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/domain → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/domains}/cve_search.py +0 -0
  48. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/dns → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/domains}/dns_lookup.py +0 -0
  49. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/domain → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/domains}/otx_query.py +0 -0
  50. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/domain → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/domains}/urlhaus_check.py +0 -0
  51. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/network → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/domains}/whois_lookup.py +0 -0
  52. {sharkit-1.0.0.dev1/src/sharkit/tools/osint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/emails}/email_reputation.py +0 -0
  53. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/email → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/emails}/email_security.py +0 -0
  54. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/email → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/emails}/holehe.py +0 -0
  55. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/humint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/emails}/mailaccess.py +0 -0
  56. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/email → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/emails}/theharvester.py +0 -0
  57. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/hybrid/blackbird.py +0 -0
  58. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/util/hash → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/leaks}/circl_hashlookup.py +0 -0
  59. {sharkit-1.0.0.dev1/src/sharkit/tools/osint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/leaks}/hibp_passwords.py +0 -0
  60. {sharkit-1.0.0.dev1/src/sharkit/tools/osint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/leaks}/leak_check.py +0 -0
  61. {sharkit-1.0.0.dev1/src/sharkit/tools/osint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/leaks}/psbdmp.py +0 -0
  62. {sharkit-1.0.0.dev1/src/sharkit/tools/osint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/leaks}/xposed_or_not.py +0 -0
  63. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/network/bgpv6.py +0 -0
  64. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/network/http_headers.py +0 -0
  65. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/network/ip_geolocate.py +0 -0
  66. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/network/ip_info.py +0 -0
  67. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/network/port_scanner.py +0 -0
  68. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/network/robtex.py +0 -0
  69. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/network/shodan_internetdb.py +0 -0
  70. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/network/ssl_check.py +0 -0
  71. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/phone → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/phones}/phoneinfoga.py +0 -0
  72. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/username → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/usernames}/maigret.py +0 -0
  73. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/username → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/usernames}/sherlock.py +0 -0
  74. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/username → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/usernames}/social_analyzer.py +0 -0
  75. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/humint → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/usernames}/socialscan.py +0 -0
  76. {sharkit-1.0.0.dev1/src/sharkit/tools/osint/recon/username → sharkit-1.0.0.dev2/src/sharkit/tools/osint/recon/usernames}/socid_extractor.py +0 -0
  77. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/web/robots_check.py +0 -0
  78. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/osint/recon/web/wayback_check.py +0 -0
  79. {sharkit-1.0.0.dev1 → sharkit-1.0.0.dev2}/src/sharkit/tools/registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sharkit
3
- Version: 1.0.0.dev1
3
+ Version: 1.0.0.dev2
4
4
  Summary: OSINT / HUMINT / GEOINT research framework
5
5
  Project-URL: Homepage, https://github.com/sshsrv/sharkit
6
6
  Project-URL: Repository, https://github.com/sshsrv/sharkit
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sharkit"
3
- version = "1.0.0.dev1"
3
+ version = "1.0.0.dev2"
4
4
  description = "OSINT / HUMINT / GEOINT research framework"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -286,7 +286,7 @@ class ShowCommand(Command):
286
286
  name = "show"
287
287
  aliases = []
288
288
  description = "Show tools or tool options"
289
- usage = "show <all|osint|humint|options> [tool]"
289
+ usage = "show <all|osint|humint|geoint|options> [tool]"
290
290
 
291
291
  def execute(self, context: CommandContext, args: list[str]) -> str | None:
292
292
  if not args:
@@ -297,7 +297,7 @@ class ShowCommand(Command):
297
297
  return self._show_options(context, args[1] if len(args) > 1 else None)
298
298
  if args[0] == "all":
299
299
  return self._show_tools(context, None)
300
- if args[0] in ("osint", "humint"):
300
+ if args[0] in ("osint", "humint", "geoint"):
301
301
  return self._show_tools(context, args[0])
302
302
  return f"Unknown show subcommand: {args[0]}\nUsage: {self.usage}"
303
303
 
@@ -307,35 +307,47 @@ class ShowCommand(Command):
307
307
  renderer = context.session.get("renderer")
308
308
  if tool_registry is None or renderer is None:
309
309
  return "Tool registry not available."
310
+
310
311
  all_tools = tool_registry.get_all_tools()
311
312
  if not all_tools:
312
313
  return "No tools available."
313
314
 
314
- categories: dict[str, list[tuple[str, type]]] = {}
315
- for tool_path, tool_cls in all_tools.items():
316
- meta = tool_cls.metadata
317
- cat = meta.category.split(".")[0] if meta.category else "other"
318
- if category and cat != category:
319
- continue
320
- categories.setdefault(cat, []).append((tool_path, tool_cls))
315
+ def matches_category(tool_path: str, tool_cls: type) -> bool:
316
+ if category is None:
317
+ return True
318
+
319
+ normalized_category = category.lower()
320
+ tool_category = (tool_cls.metadata.category or "").lower()
321
+ first_segment = tool_category.split(".")[0]
322
+ return (
323
+ normalized_category == tool_category
324
+ or normalized_category == first_segment
325
+ or normalized_category in tool_category
326
+ or tool_path.lower().startswith(f"{normalized_category}/")
327
+ )
328
+
329
+ filtered = [
330
+ (tool_path, tool_cls)
331
+ for tool_path, tool_cls in all_tools.items()
332
+ if matches_category(tool_path, tool_cls)
333
+ ]
321
334
 
322
- if not categories:
335
+ if not filtered:
323
336
  return f'No tools found for category "{category}".'
324
337
 
325
338
  title = f"show > {category or 'all'}"
326
- for cat_name in sorted(categories):
327
- tools = sorted(categories[cat_name], key=lambda x: x[0])
328
- rows = []
329
- for tool_path, tool_cls in tools:
330
- meta = tool_cls.metadata
331
- if meta.install is None or (
332
- tool_manager is not None and tool_manager.is_installed(meta.name)
333
- ):
334
- installed = f"{BOLD}{PINK}Yes{RESET}"
335
- else:
336
- installed = ""
337
- rows.append([tool_path, installed, meta.description])
338
- renderer.table(f"{title} > {cat_name}", ["Tool", "Installed", "Description"], rows)
339
+ rows = []
340
+ for tool_path, tool_cls in sorted(filtered, key=lambda item: item[0]):
341
+ meta = tool_cls.metadata
342
+ if meta.install is None or (
343
+ tool_manager is not None and tool_manager.is_installed(meta.name)
344
+ ):
345
+ installed = f"{BOLD}{PINK}Yes{RESET}"
346
+ else:
347
+ installed = ""
348
+ rows.append([tool_path, installed, meta.description])
349
+
350
+ renderer.table(title, ["Tool", "Installed", "Description"], rows)
339
351
  return None
340
352
 
341
353
  def _show_options(self, context: CommandContext, tool_arg: str | None) -> str | None:
@@ -42,7 +42,10 @@ class CompletionEngine:
42
42
 
43
43
  if text_lower.startswith("show "):
44
44
  prefix = text_lower[5:]
45
- return sorted(s for s in ("all", "osint", "humint", "options") if s.startswith(prefix))
45
+ return sorted(
46
+ s for s in ("all", "osint", "humint", "geoint", "options")
47
+ if s.startswith(prefix)
48
+ )
46
49
 
47
50
  if text_lower.startswith("set ") or text_lower.startswith("unset "):
48
51
  if current_tool is None:
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env bash
2
+ # flatten_tools.sh
3
+ # Sube cada herramienta un nivel: cat/subcat/esp/tool/tool.py -> cat/subcat/esp/tool.py
4
+ # Borra las carpetas propias vacías resultantes.
5
+ #
6
+ # Uso:
7
+ # ./flatten_tools.sh # dry-run
8
+ # ./flatten_tools.sh --apply # ejecuta de verdad
9
+ # ./flatten_tools.sh --force # sobrescribe destinos existentes
10
+
11
+ set -euo pipefail
12
+
13
+ ROOT="$(pwd)"
14
+ APPLY=false
15
+ FORCE=false
16
+
17
+ for arg in "$@"; do
18
+ case "$arg" in
19
+ --apply) APPLY=true ;;
20
+ --force) FORCE=true ;;
21
+ -h|--help)
22
+ sed -n '2,9p' "$0"; exit 0 ;;
23
+ *) echo "Argumento desconocido: $arg" >&2; exit 2 ;;
24
+ esac
25
+ done
26
+
27
+ log() { printf '\033[1;34m[info]\033[0m %s\n' "$*"; }
28
+ warn() { printf '\033[1;33m[warn]\033[0m %s\n' "$*" >&2; }
29
+ err() { printf '\033[1;31m[err ]\033[0m %s\n' "$*" >&2; }
30
+
31
+ if [[ ! -d "$ROOT" ]]; then
32
+ err "El directorio actual no existe"; exit 1
33
+ fi
34
+
35
+ # Detectar automáticamente todos los cat/subcat/esp/tool/tool.py
36
+ # (estructura de 4 segmentos + archivo con mismo nombre que la carpeta)
37
+ moves_count=0
38
+ declare -a MOVES=()
39
+
40
+ while IFS= read -r -d '' py; do
41
+ # py = .../cat/subcat/esp/tool/tool.py
42
+ dir="$(dirname "$py")"
43
+ tool_name="$(basename "$dir")"
44
+ parent="$(dirname "$dir")"
45
+ dst="${parent}/${tool_name}.py"
46
+
47
+ # Ignora si por algún motivo no coincide el nombre
48
+ if [[ "$(basename "$py" .py)" != "$tool_name" ]]; then
49
+ warn "nombre inconsistente, salto: $py"; continue
50
+ fi
51
+
52
+ # Seguridad: no subir si ya hay un archivo en el destino (a menos que --force)
53
+ if [[ -e "$dst" && "$FORCE" != true ]]; then
54
+ err "destino ya existe, salto: $dst (usa --force)"
55
+ continue
56
+ fi
57
+
58
+ MOVES+=("$py|$dst")
59
+ moves_count=$((moves_count + 1))
60
+ done < <(find "$ROOT" -mindepth 5 -maxdepth 5 -name "*.py" -not -name "__init__.py" -print0)
61
+
62
+ log "Detectadas $moves_count herramientas a aplanar."
63
+ log "MODO = $([[ "$APPLY" == true ]] && echo 'APPLY' || echo 'DRY-RUN')"
64
+ log "FORCE = $FORCE"
65
+
66
+ for entry in "${MOVES[@]}"; do
67
+ src="${entry%|*}"
68
+ dst="${entry#*|}"
69
+
70
+ if [[ "$APPLY" == true ]]; then
71
+ mv "$src" "$dst"
72
+ log "movido: $src -> $dst"
73
+ else
74
+ printf 'DRY-RUN mv %s -> %s\n' "$src" "$dst"
75
+ fi
76
+ done
77
+
78
+ # Borrar carpetas propias (cat/subcat/esp/tool/) que hayan quedado vacías
79
+ # Recorremos las mismas que acabamos de mover
80
+ log "Borrando carpetas propias vacías…"
81
+
82
+ clean_dirs=()
83
+ for entry in "${MOVES[@]}"; do
84
+ src="${entry%|*}"
85
+ d="$(dirname "$src")"
86
+ clean_dirs+=("$d")
87
+ done
88
+
89
+ # Borrar __pycache__ que pueda haber dentroif [[ "$APPLY" == true ]]; then
90
+ find "$ROOT" -type d -name __pycache__ -prune -exec rm -rf {} +
91
+ else
92
+ find "$ROOT" -type d -name __pycache__ -printf 'DRY-RUN rm -rf %p\n'
93
+ fi
94
+
95
+ for d in "${clean_dirs[@]}"; do
96
+ [[ -d "$d" ]] || continue
97
+ if [[ -n "$(ls -A "$d" 2>/dev/null)" ]]; then
98
+ warn "no vacía, no borro: $d"; continue
99
+ fi
100
+ if [[ "$APPLY" == true ]]; then
101
+ rmdir "$d" && log "borrada: $d"
102
+ else
103
+ printf 'DRY-RUN rmdir %s\n' "$d"
104
+ fi
105
+ done
106
+
107
+ log "Listo."
File without changes
File without changes
File without changes