aidevops 2.52.1
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.
- package/.agent/AGENTS.md +614 -0
- package/.agent/accounts.md +65 -0
- package/.agent/aidevops/add-new-mcp-to-aidevops.md +456 -0
- package/.agent/aidevops/api-integrations.md +335 -0
- package/.agent/aidevops/architecture.md +510 -0
- package/.agent/aidevops/configs.md +274 -0
- package/.agent/aidevops/docs.md +244 -0
- package/.agent/aidevops/extension.md +311 -0
- package/.agent/aidevops/mcp-integrations.md +340 -0
- package/.agent/aidevops/mcp-troubleshooting.md +162 -0
- package/.agent/aidevops/memory-patterns.md +172 -0
- package/.agent/aidevops/providers.md +217 -0
- package/.agent/aidevops/recommendations.md +321 -0
- package/.agent/aidevops/requirements.md +301 -0
- package/.agent/aidevops/resources.md +214 -0
- package/.agent/aidevops/security-requirements.md +174 -0
- package/.agent/aidevops/security.md +350 -0
- package/.agent/aidevops/service-links.md +400 -0
- package/.agent/aidevops/services.md +357 -0
- package/.agent/aidevops/setup.md +153 -0
- package/.agent/aidevops/troubleshooting.md +389 -0
- package/.agent/aidevops.md +124 -0
- package/.agent/build-plus.md +244 -0
- package/.agent/content/guidelines.md +109 -0
- package/.agent/content.md +87 -0
- package/.agent/health.md +59 -0
- package/.agent/legal.md +59 -0
- package/.agent/loop-state/full-loop.local.md +16 -0
- package/.agent/loop-state/ralph-loop.local.md +10 -0
- package/.agent/marketing.md +440 -0
- package/.agent/memory/README.md +260 -0
- package/.agent/onboarding.md +796 -0
- package/.agent/plan-plus.md +245 -0
- package/.agent/research.md +100 -0
- package/.agent/sales.md +333 -0
- package/.agent/scripts/101domains-helper.sh +701 -0
- package/.agent/scripts/add-missing-returns.sh +140 -0
- package/.agent/scripts/agent-browser-helper.sh +311 -0
- package/.agent/scripts/agno-setup.sh +712 -0
- package/.agent/scripts/ahrefs-mcp-wrapper.js +168 -0
- package/.agent/scripts/aidevops-update-check.sh +71 -0
- package/.agent/scripts/ampcode-cli.sh +522 -0
- package/.agent/scripts/auto-version-bump.sh +156 -0
- package/.agent/scripts/autogen-helper.sh +512 -0
- package/.agent/scripts/beads-sync-helper.sh +596 -0
- package/.agent/scripts/closte-helper.sh +5 -0
- package/.agent/scripts/cloudron-helper.sh +321 -0
- package/.agent/scripts/codacy-cli-chunked.sh +581 -0
- package/.agent/scripts/codacy-cli.sh +442 -0
- package/.agent/scripts/code-audit-helper.sh +5 -0
- package/.agent/scripts/coderabbit-cli.sh +417 -0
- package/.agent/scripts/coderabbit-pro-analysis.sh +238 -0
- package/.agent/scripts/commands/code-simplifier.md +86 -0
- package/.agent/scripts/commands/full-loop.md +246 -0
- package/.agent/scripts/commands/postflight-loop.md +103 -0
- package/.agent/scripts/commands/recall.md +182 -0
- package/.agent/scripts/commands/remember.md +132 -0
- package/.agent/scripts/commands/save-todo.md +175 -0
- package/.agent/scripts/commands/session-review.md +154 -0
- package/.agent/scripts/comprehensive-quality-fix.sh +106 -0
- package/.agent/scripts/context-builder-helper.sh +522 -0
- package/.agent/scripts/coolify-cli-helper.sh +674 -0
- package/.agent/scripts/coolify-helper.sh +380 -0
- package/.agent/scripts/crawl4ai-examples.sh +401 -0
- package/.agent/scripts/crawl4ai-helper.sh +1078 -0
- package/.agent/scripts/crewai-helper.sh +681 -0
- package/.agent/scripts/dev-browser-helper.sh +513 -0
- package/.agent/scripts/dns-helper.sh +396 -0
- package/.agent/scripts/domain-research-helper.sh +917 -0
- package/.agent/scripts/dspy-helper.sh +285 -0
- package/.agent/scripts/dspyground-helper.sh +291 -0
- package/.agent/scripts/eeat-score-helper.sh +1242 -0
- package/.agent/scripts/efficient-return-fix.sh +92 -0
- package/.agent/scripts/extract-opencode-prompts.sh +128 -0
- package/.agent/scripts/find-missing-returns.sh +113 -0
- package/.agent/scripts/fix-auth-headers.sh +104 -0
- package/.agent/scripts/fix-common-strings.sh +254 -0
- package/.agent/scripts/fix-content-type.sh +100 -0
- package/.agent/scripts/fix-error-messages.sh +130 -0
- package/.agent/scripts/fix-misplaced-returns.sh +74 -0
- package/.agent/scripts/fix-remaining-literals.sh +152 -0
- package/.agent/scripts/fix-return-statements.sh +41 -0
- package/.agent/scripts/fix-s131-default-cases.sh +249 -0
- package/.agent/scripts/fix-sc2155-simple.sh +102 -0
- package/.agent/scripts/fix-shellcheck-critical.sh +187 -0
- package/.agent/scripts/fix-string-literals.sh +273 -0
- package/.agent/scripts/full-loop-helper.sh +773 -0
- package/.agent/scripts/generate-opencode-agents.sh +497 -0
- package/.agent/scripts/generate-opencode-commands.sh +1629 -0
- package/.agent/scripts/generate-skills.sh +366 -0
- package/.agent/scripts/git-platforms-helper.sh +640 -0
- package/.agent/scripts/gitea-cli-helper.sh +743 -0
- package/.agent/scripts/github-cli-helper.sh +702 -0
- package/.agent/scripts/gitlab-cli-helper.sh +682 -0
- package/.agent/scripts/gsc-add-user-helper.sh +325 -0
- package/.agent/scripts/gsc-sitemap-helper.sh +678 -0
- package/.agent/scripts/hetzner-helper.sh +485 -0
- package/.agent/scripts/hostinger-helper.sh +229 -0
- package/.agent/scripts/keyword-research-helper.sh +1815 -0
- package/.agent/scripts/langflow-helper.sh +544 -0
- package/.agent/scripts/linkedin-automation.py +241 -0
- package/.agent/scripts/linter-manager.sh +599 -0
- package/.agent/scripts/linters-local.sh +434 -0
- package/.agent/scripts/list-keys-helper.sh +488 -0
- package/.agent/scripts/local-browser-automation.py +339 -0
- package/.agent/scripts/localhost-helper.sh +744 -0
- package/.agent/scripts/loop-common.sh +806 -0
- package/.agent/scripts/mainwp-helper.sh +728 -0
- package/.agent/scripts/markdown-formatter.sh +338 -0
- package/.agent/scripts/markdown-lint-fix.sh +311 -0
- package/.agent/scripts/mass-fix-returns.sh +58 -0
- package/.agent/scripts/mcp-diagnose.sh +167 -0
- package/.agent/scripts/mcp-inspector-helper.sh +449 -0
- package/.agent/scripts/memory-helper.sh +650 -0
- package/.agent/scripts/monitor-code-review.sh +255 -0
- package/.agent/scripts/onboarding-helper.sh +706 -0
- package/.agent/scripts/opencode-github-setup-helper.sh +797 -0
- package/.agent/scripts/opencode-test-helper.sh +213 -0
- package/.agent/scripts/pagespeed-helper.sh +464 -0
- package/.agent/scripts/pandoc-helper.sh +362 -0
- package/.agent/scripts/postflight-check.sh +555 -0
- package/.agent/scripts/pre-commit-hook.sh +259 -0
- package/.agent/scripts/pre-edit-check.sh +169 -0
- package/.agent/scripts/qlty-cli.sh +356 -0
- package/.agent/scripts/quality-cli-manager.sh +525 -0
- package/.agent/scripts/quality-feedback-helper.sh +462 -0
- package/.agent/scripts/quality-fix.sh +263 -0
- package/.agent/scripts/quality-loop-helper.sh +1108 -0
- package/.agent/scripts/ralph-loop-helper.sh +836 -0
- package/.agent/scripts/ralph-upstream-check.sh +341 -0
- package/.agent/scripts/secretlint-helper.sh +847 -0
- package/.agent/scripts/servers-helper.sh +241 -0
- package/.agent/scripts/ses-helper.sh +619 -0
- package/.agent/scripts/session-review-helper.sh +404 -0
- package/.agent/scripts/setup-linters-wizard.sh +379 -0
- package/.agent/scripts/setup-local-api-keys.sh +330 -0
- package/.agent/scripts/setup-mcp-integrations.sh +472 -0
- package/.agent/scripts/shared-constants.sh +246 -0
- package/.agent/scripts/site-crawler-helper.sh +1487 -0
- package/.agent/scripts/snyk-helper.sh +940 -0
- package/.agent/scripts/sonarcloud-autofix.sh +193 -0
- package/.agent/scripts/sonarcloud-cli.sh +191 -0
- package/.agent/scripts/sonarscanner-cli.sh +455 -0
- package/.agent/scripts/spaceship-helper.sh +747 -0
- package/.agent/scripts/stagehand-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-setup.sh +441 -0
- package/.agent/scripts/stagehand-setup.sh +439 -0
- package/.agent/scripts/system-cleanup.sh +340 -0
- package/.agent/scripts/terminal-title-helper.sh +388 -0
- package/.agent/scripts/terminal-title-setup.sh +549 -0
- package/.agent/scripts/test-stagehand-both-integration.sh +317 -0
- package/.agent/scripts/test-stagehand-integration.sh +309 -0
- package/.agent/scripts/test-stagehand-python-integration.sh +341 -0
- package/.agent/scripts/todo-ready.sh +263 -0
- package/.agent/scripts/tool-version-check.sh +362 -0
- package/.agent/scripts/toon-helper.sh +469 -0
- package/.agent/scripts/twilio-helper.sh +917 -0
- package/.agent/scripts/updown-helper.sh +279 -0
- package/.agent/scripts/validate-mcp-integrations.sh +250 -0
- package/.agent/scripts/validate-version-consistency.sh +131 -0
- package/.agent/scripts/vaultwarden-helper.sh +597 -0
- package/.agent/scripts/vercel-cli-helper.sh +816 -0
- package/.agent/scripts/verify-mirrors.sh +169 -0
- package/.agent/scripts/version-manager.sh +831 -0
- package/.agent/scripts/webhosting-helper.sh +471 -0
- package/.agent/scripts/webhosting-verify.sh +238 -0
- package/.agent/scripts/wordpress-mcp-helper.sh +508 -0
- package/.agent/scripts/worktree-helper.sh +595 -0
- package/.agent/scripts/worktree-sessions.sh +577 -0
- package/.agent/seo/dataforseo.md +215 -0
- package/.agent/seo/domain-research.md +532 -0
- package/.agent/seo/eeat-score.md +659 -0
- package/.agent/seo/google-search-console.md +366 -0
- package/.agent/seo/gsc-sitemaps.md +282 -0
- package/.agent/seo/keyword-research.md +521 -0
- package/.agent/seo/serper.md +278 -0
- package/.agent/seo/site-crawler.md +387 -0
- package/.agent/seo.md +236 -0
- package/.agent/services/accounting/quickfile.md +159 -0
- package/.agent/services/communications/telfon.md +470 -0
- package/.agent/services/communications/twilio.md +569 -0
- package/.agent/services/crm/fluentcrm.md +449 -0
- package/.agent/services/email/ses.md +399 -0
- package/.agent/services/hosting/101domains.md +378 -0
- package/.agent/services/hosting/closte.md +177 -0
- package/.agent/services/hosting/cloudflare.md +251 -0
- package/.agent/services/hosting/cloudron.md +478 -0
- package/.agent/services/hosting/dns-providers.md +335 -0
- package/.agent/services/hosting/domain-purchasing.md +344 -0
- package/.agent/services/hosting/hetzner.md +327 -0
- package/.agent/services/hosting/hostinger.md +287 -0
- package/.agent/services/hosting/localhost.md +419 -0
- package/.agent/services/hosting/spaceship.md +353 -0
- package/.agent/services/hosting/webhosting.md +330 -0
- package/.agent/social-media.md +69 -0
- package/.agent/templates/plans-template.md +114 -0
- package/.agent/templates/prd-template.md +129 -0
- package/.agent/templates/tasks-template.md +108 -0
- package/.agent/templates/todo-template.md +89 -0
- package/.agent/tools/ai-assistants/agno.md +471 -0
- package/.agent/tools/ai-assistants/capsolver.md +326 -0
- package/.agent/tools/ai-assistants/configuration.md +221 -0
- package/.agent/tools/ai-assistants/overview.md +209 -0
- package/.agent/tools/ai-assistants/status.md +171 -0
- package/.agent/tools/ai-assistants/windsurf.md +193 -0
- package/.agent/tools/ai-orchestration/autogen.md +406 -0
- package/.agent/tools/ai-orchestration/crewai.md +445 -0
- package/.agent/tools/ai-orchestration/langflow.md +405 -0
- package/.agent/tools/ai-orchestration/openprose.md +487 -0
- package/.agent/tools/ai-orchestration/overview.md +362 -0
- package/.agent/tools/ai-orchestration/packaging.md +647 -0
- package/.agent/tools/browser/agent-browser.md +464 -0
- package/.agent/tools/browser/browser-automation.md +400 -0
- package/.agent/tools/browser/chrome-devtools.md +282 -0
- package/.agent/tools/browser/crawl4ai-integration.md +422 -0
- package/.agent/tools/browser/crawl4ai-resources.md +277 -0
- package/.agent/tools/browser/crawl4ai-usage.md +416 -0
- package/.agent/tools/browser/crawl4ai.md +585 -0
- package/.agent/tools/browser/dev-browser.md +341 -0
- package/.agent/tools/browser/pagespeed.md +260 -0
- package/.agent/tools/browser/playwright.md +266 -0
- package/.agent/tools/browser/playwriter.md +310 -0
- package/.agent/tools/browser/stagehand-examples.md +456 -0
- package/.agent/tools/browser/stagehand-python.md +483 -0
- package/.agent/tools/browser/stagehand.md +421 -0
- package/.agent/tools/build-agent/agent-review.md +224 -0
- package/.agent/tools/build-agent/build-agent.md +784 -0
- package/.agent/tools/build-mcp/aidevops-plugin.md +476 -0
- package/.agent/tools/build-mcp/api-wrapper.md +445 -0
- package/.agent/tools/build-mcp/build-mcp.md +240 -0
- package/.agent/tools/build-mcp/deployment.md +401 -0
- package/.agent/tools/build-mcp/server-patterns.md +632 -0
- package/.agent/tools/build-mcp/transports.md +366 -0
- package/.agent/tools/code-review/auditing.md +383 -0
- package/.agent/tools/code-review/automation.md +219 -0
- package/.agent/tools/code-review/best-practices.md +203 -0
- package/.agent/tools/code-review/codacy.md +151 -0
- package/.agent/tools/code-review/code-simplifier.md +174 -0
- package/.agent/tools/code-review/code-standards.md +309 -0
- package/.agent/tools/code-review/coderabbit.md +101 -0
- package/.agent/tools/code-review/management.md +155 -0
- package/.agent/tools/code-review/qlty.md +248 -0
- package/.agent/tools/code-review/secretlint.md +565 -0
- package/.agent/tools/code-review/setup.md +250 -0
- package/.agent/tools/code-review/snyk.md +563 -0
- package/.agent/tools/code-review/tools.md +230 -0
- package/.agent/tools/content/summarize.md +353 -0
- package/.agent/tools/context/augment-context-engine.md +468 -0
- package/.agent/tools/context/context-builder-agent.md +76 -0
- package/.agent/tools/context/context-builder.md +375 -0
- package/.agent/tools/context/context7.md +371 -0
- package/.agent/tools/context/dspy.md +302 -0
- package/.agent/tools/context/dspyground.md +374 -0
- package/.agent/tools/context/llm-tldr.md +219 -0
- package/.agent/tools/context/osgrep.md +488 -0
- package/.agent/tools/context/prompt-optimization.md +338 -0
- package/.agent/tools/context/toon.md +292 -0
- package/.agent/tools/conversion/pandoc.md +304 -0
- package/.agent/tools/credentials/api-key-management.md +154 -0
- package/.agent/tools/credentials/api-key-setup.md +224 -0
- package/.agent/tools/credentials/environment-variables.md +180 -0
- package/.agent/tools/credentials/vaultwarden.md +382 -0
- package/.agent/tools/data-extraction/outscraper.md +974 -0
- package/.agent/tools/deployment/coolify-cli.md +388 -0
- package/.agent/tools/deployment/coolify-setup.md +353 -0
- package/.agent/tools/deployment/coolify.md +345 -0
- package/.agent/tools/deployment/vercel.md +390 -0
- package/.agent/tools/git/authentication.md +132 -0
- package/.agent/tools/git/gitea-cli.md +193 -0
- package/.agent/tools/git/github-actions.md +207 -0
- package/.agent/tools/git/github-cli.md +223 -0
- package/.agent/tools/git/gitlab-cli.md +190 -0
- package/.agent/tools/git/opencode-github-security.md +350 -0
- package/.agent/tools/git/opencode-github.md +328 -0
- package/.agent/tools/git/opencode-gitlab.md +252 -0
- package/.agent/tools/git/security.md +196 -0
- package/.agent/tools/git.md +207 -0
- package/.agent/tools/opencode/oh-my-opencode.md +375 -0
- package/.agent/tools/opencode/opencode-anthropic-auth.md +446 -0
- package/.agent/tools/opencode/opencode.md +651 -0
- package/.agent/tools/social-media/bird.md +437 -0
- package/.agent/tools/task-management/beads.md +336 -0
- package/.agent/tools/terminal/terminal-title.md +251 -0
- package/.agent/tools/ui/shadcn.md +196 -0
- package/.agent/tools/ui/ui-skills.md +115 -0
- package/.agent/tools/wordpress/localwp.md +311 -0
- package/.agent/tools/wordpress/mainwp.md +391 -0
- package/.agent/tools/wordpress/scf.md +527 -0
- package/.agent/tools/wordpress/wp-admin.md +729 -0
- package/.agent/tools/wordpress/wp-dev.md +940 -0
- package/.agent/tools/wordpress/wp-preferred.md +398 -0
- package/.agent/tools/wordpress.md +95 -0
- package/.agent/workflows/branch/bugfix.md +63 -0
- package/.agent/workflows/branch/chore.md +95 -0
- package/.agent/workflows/branch/experiment.md +115 -0
- package/.agent/workflows/branch/feature.md +59 -0
- package/.agent/workflows/branch/hotfix.md +98 -0
- package/.agent/workflows/branch/refactor.md +92 -0
- package/.agent/workflows/branch/release.md +96 -0
- package/.agent/workflows/branch.md +347 -0
- package/.agent/workflows/bug-fixing.md +267 -0
- package/.agent/workflows/changelog.md +129 -0
- package/.agent/workflows/code-audit-remote.md +279 -0
- package/.agent/workflows/conversation-starter.md +69 -0
- package/.agent/workflows/error-feedback.md +578 -0
- package/.agent/workflows/feature-development.md +355 -0
- package/.agent/workflows/git-workflow.md +702 -0
- package/.agent/workflows/multi-repo-workspace.md +268 -0
- package/.agent/workflows/plans.md +709 -0
- package/.agent/workflows/postflight.md +604 -0
- package/.agent/workflows/pr.md +571 -0
- package/.agent/workflows/preflight.md +278 -0
- package/.agent/workflows/ralph-loop.md +773 -0
- package/.agent/workflows/release.md +498 -0
- package/.agent/workflows/session-manager.md +254 -0
- package/.agent/workflows/session-review.md +311 -0
- package/.agent/workflows/sql-migrations.md +631 -0
- package/.agent/workflows/version-bump.md +283 -0
- package/.agent/workflows/wiki-update.md +333 -0
- package/.agent/workflows/worktree.md +477 -0
- package/LICENSE +21 -0
- package/README.md +1446 -0
- package/VERSION +1 -0
- package/aidevops.sh +1746 -0
- package/bin/aidevops +21 -0
- package/package.json +75 -0
- package/scripts/npm-postinstall.js +60 -0
- package/setup.sh +2366 -0
|
@@ -0,0 +1,917 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# shellcheck disable=SC2034,SC2155
|
|
3
|
+
|
|
4
|
+
# Domain Research Helper Script
|
|
5
|
+
# DNS intelligence using THC IP database (https://ip.thc.org/) and Reconeer (https://reconeer.com/)
|
|
6
|
+
# Provides reverse DNS, subdomain enumeration, and CNAME discovery
|
|
7
|
+
|
|
8
|
+
# Source shared constants if available
|
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || exit
|
|
10
|
+
source "$SCRIPT_DIR/shared-constants.sh" 2>/dev/null || true
|
|
11
|
+
|
|
12
|
+
# Colors for output
|
|
13
|
+
GREEN='\033[0;32m'
|
|
14
|
+
BLUE='\033[0;34m'
|
|
15
|
+
YELLOW='\033[1;33m'
|
|
16
|
+
RED='\033[0;31m'
|
|
17
|
+
CYAN='\033[0;36m'
|
|
18
|
+
NC='\033[0m' # No Color
|
|
19
|
+
|
|
20
|
+
# THC API Configuration
|
|
21
|
+
readonly THC_API_BASE="https://ip.thc.org"
|
|
22
|
+
readonly THC_API_V1="${THC_API_BASE}/api/v1"
|
|
23
|
+
readonly API_BASE="$THC_API_BASE" # Alias for backward compatibility
|
|
24
|
+
readonly API_V1="$THC_API_V1" # Alias for backward compatibility
|
|
25
|
+
readonly MAX_LIMIT=100
|
|
26
|
+
readonly MAX_EXPORT_LIMIT=50000
|
|
27
|
+
readonly DEFAULT_LIMIT=50
|
|
28
|
+
|
|
29
|
+
# Reconeer API Configuration
|
|
30
|
+
readonly RECONEER_API_BASE="https://reconeer.com"
|
|
31
|
+
readonly RECONEER_API="${RECONEER_API_BASE}/api"
|
|
32
|
+
|
|
33
|
+
# Load API key from environment or config
|
|
34
|
+
load_reconeer_api_key() {
|
|
35
|
+
# Check environment variable first
|
|
36
|
+
if [[ -n "${RECONEER_API_KEY:-}" ]]; then
|
|
37
|
+
echo "$RECONEER_API_KEY"
|
|
38
|
+
return 0
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# Check config file
|
|
42
|
+
local config_file="$HOME/.config/aidevops/mcp-env.sh"
|
|
43
|
+
if [[ -f "$config_file" ]]; then
|
|
44
|
+
local key
|
|
45
|
+
key=$(grep -E "^export RECONEER_API_KEY=" "$config_file" 2>/dev/null | cut -d'=' -f2- | tr -d '"' | tr -d "'")
|
|
46
|
+
if [[ -n "$key" ]]; then
|
|
47
|
+
echo "$key"
|
|
48
|
+
return 0
|
|
49
|
+
fi
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
# No key found
|
|
53
|
+
echo ""
|
|
54
|
+
return 0
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# Common message constants
|
|
58
|
+
readonly HELP_SHOW_MESSAGE="Show this help"
|
|
59
|
+
readonly USAGE_COMMAND_OPTIONS="Usage: $0 [command] [options]"
|
|
60
|
+
readonly HELP_USAGE_INFO="Use '$0 help' for usage information"
|
|
61
|
+
|
|
62
|
+
print_info() {
|
|
63
|
+
local msg="$1"
|
|
64
|
+
echo -e "${BLUE}[INFO]${NC} $msg"
|
|
65
|
+
return 0
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
print_success() {
|
|
69
|
+
local msg="$1"
|
|
70
|
+
echo -e "${GREEN}[SUCCESS]${NC} $msg"
|
|
71
|
+
return 0
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
print_warning() {
|
|
75
|
+
local msg="$1"
|
|
76
|
+
echo -e "${YELLOW}[WARNING]${NC} $msg"
|
|
77
|
+
return 0
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
print_error() {
|
|
81
|
+
local msg="$1"
|
|
82
|
+
echo -e "${RED}[ERROR]${NC} $msg" >&2
|
|
83
|
+
return 0
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
print_header() {
|
|
87
|
+
local msg="$1"
|
|
88
|
+
echo -e "${CYAN}=== $msg ===${NC}"
|
|
89
|
+
return 0
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# Check for required tools
|
|
93
|
+
check_dependencies() {
|
|
94
|
+
local missing=()
|
|
95
|
+
|
|
96
|
+
if ! command -v curl &>/dev/null; then
|
|
97
|
+
missing+=("curl")
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
if ! command -v jq &>/dev/null; then
|
|
101
|
+
missing+=("jq")
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
105
|
+
print_error "Missing required tools: ${missing[*]}"
|
|
106
|
+
print_info "Install with: brew install ${missing[*]}"
|
|
107
|
+
return 1
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
return 0
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
# Simple reverse DNS lookup (CLI-friendly)
|
|
114
|
+
rdns_simple() {
|
|
115
|
+
local ip="$1"
|
|
116
|
+
local filter="${2:-}"
|
|
117
|
+
local limit="${3:-$DEFAULT_LIMIT}"
|
|
118
|
+
local nocolor="${4:-0}"
|
|
119
|
+
local noheader="${5:-0}"
|
|
120
|
+
|
|
121
|
+
local url="${API_BASE}/${ip}?l=${limit}&nocolor=${nocolor}&noheader=${noheader}"
|
|
122
|
+
|
|
123
|
+
if [[ -n "$filter" ]]; then
|
|
124
|
+
url="${url}&f=${filter}"
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
print_info "Looking up domains for IP: $ip"
|
|
128
|
+
curl -s "$url"
|
|
129
|
+
|
|
130
|
+
return 0
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# Reverse DNS lookup with JSON output
|
|
134
|
+
rdns_json() {
|
|
135
|
+
local ip="$1"
|
|
136
|
+
local limit="${2:-$DEFAULT_LIMIT}"
|
|
137
|
+
local tld_filter="${3:-}"
|
|
138
|
+
local apex_filter="${4:-}"
|
|
139
|
+
local page_state="${5:-}"
|
|
140
|
+
|
|
141
|
+
local payload="{\"ip_address\":\"$ip\", \"limit\": $limit"
|
|
142
|
+
|
|
143
|
+
if [[ -n "$tld_filter" ]]; then
|
|
144
|
+
# Convert comma-separated to JSON array
|
|
145
|
+
local tld_array
|
|
146
|
+
tld_array=$(echo "$tld_filter" | tr ',' '\n' | jq -R . | jq -s .)
|
|
147
|
+
payload="${payload}, \"tld\": $tld_array"
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
if [[ -n "$apex_filter" ]]; then
|
|
151
|
+
payload="${payload}, \"apex_domain\": \"$apex_filter\""
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
if [[ -n "$page_state" ]]; then
|
|
155
|
+
payload="${payload}, \"page_state\": \"$page_state\""
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
payload="${payload}}"
|
|
159
|
+
|
|
160
|
+
print_info "Querying rDNS API for: $ip"
|
|
161
|
+
curl -s -X POST "${API_V1}/lookup" \
|
|
162
|
+
-H "Content-Type: application/json" \
|
|
163
|
+
-d "$payload" | jq .
|
|
164
|
+
|
|
165
|
+
return 0
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
# IP block lookup (/24, /16, /8)
|
|
169
|
+
rdns_block() {
|
|
170
|
+
local ip_block="$1"
|
|
171
|
+
local limit="${2:-$DEFAULT_LIMIT}"
|
|
172
|
+
local tld_filter="${3:-}"
|
|
173
|
+
|
|
174
|
+
# Validate CIDR notation
|
|
175
|
+
if [[ ! "$ip_block" =~ /[0-9]+$ ]]; then
|
|
176
|
+
print_error "Invalid IP block format. Use CIDR notation (e.g., 1.1.1.0/24)"
|
|
177
|
+
return 1
|
|
178
|
+
fi
|
|
179
|
+
|
|
180
|
+
local payload="{\"ip_address\":\"$ip_block\", \"limit\": $limit"
|
|
181
|
+
|
|
182
|
+
if [[ -n "$tld_filter" ]]; then
|
|
183
|
+
local tld_array
|
|
184
|
+
tld_array=$(echo "$tld_filter" | tr ',' '\n' | jq -R . | jq -s .)
|
|
185
|
+
payload="${payload}, \"tld\": $tld_array"
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
payload="${payload}}"
|
|
189
|
+
|
|
190
|
+
print_info "Querying IP block: $ip_block"
|
|
191
|
+
print_warning "Note: TLD filters cannot be used with IP block lookups"
|
|
192
|
+
|
|
193
|
+
curl -s -X POST "${API_V1}/lookup" \
|
|
194
|
+
-H "Content-Type: application/json" \
|
|
195
|
+
-d "$payload" | jq .
|
|
196
|
+
|
|
197
|
+
return 0
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
# Simple subdomain lookup (CLI-friendly)
|
|
201
|
+
subdomains_simple() {
|
|
202
|
+
local domain="$1"
|
|
203
|
+
local limit="${2:-$DEFAULT_LIMIT}"
|
|
204
|
+
local nocolor="${3:-0}"
|
|
205
|
+
local noheader="${4:-0}"
|
|
206
|
+
|
|
207
|
+
local url="${API_BASE}/sb/${domain}?l=${limit}&nocolor=${nocolor}&noheader=${noheader}"
|
|
208
|
+
|
|
209
|
+
print_info "Enumerating subdomains for: $domain"
|
|
210
|
+
curl -s "$url"
|
|
211
|
+
|
|
212
|
+
return 0
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
# Subdomain lookup with JSON output and pagination
|
|
216
|
+
subdomains_json() {
|
|
217
|
+
local domain="$1"
|
|
218
|
+
local limit="${2:-$DEFAULT_LIMIT}"
|
|
219
|
+
local page_state="${3:-}"
|
|
220
|
+
|
|
221
|
+
local payload="{\"domain\":\"$domain\", \"limit\": $limit"
|
|
222
|
+
|
|
223
|
+
if [[ -n "$page_state" ]]; then
|
|
224
|
+
payload="${payload}, \"page_state\": \"$page_state\""
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
payload="${payload}}"
|
|
228
|
+
|
|
229
|
+
print_info "Querying subdomains API for: $domain"
|
|
230
|
+
curl -s -X POST "${API_V1}/lookup/subdomains" \
|
|
231
|
+
-H "Content-Type: application/json" \
|
|
232
|
+
-d "$payload" | jq .
|
|
233
|
+
|
|
234
|
+
return 0
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
# Fetch all subdomains with pagination
|
|
238
|
+
subdomains_all() {
|
|
239
|
+
local domain="$1"
|
|
240
|
+
local output_file="${2:-}"
|
|
241
|
+
local limit=100
|
|
242
|
+
local page_state=""
|
|
243
|
+
local total=0
|
|
244
|
+
|
|
245
|
+
print_info "Fetching all subdomains for: $domain"
|
|
246
|
+
print_info "This may take a while for large domains..."
|
|
247
|
+
|
|
248
|
+
while true; do
|
|
249
|
+
local payload="{\"domain\":\"$domain\", \"limit\": $limit"
|
|
250
|
+
|
|
251
|
+
if [[ -n "$page_state" ]]; then
|
|
252
|
+
payload="${payload}, \"page_state\": \"$page_state\""
|
|
253
|
+
fi
|
|
254
|
+
|
|
255
|
+
payload="${payload}}"
|
|
256
|
+
|
|
257
|
+
local response
|
|
258
|
+
response=$(curl -s -X POST "${API_V1}/lookup/subdomains" \
|
|
259
|
+
-H "Content-Type: application/json" \
|
|
260
|
+
-d "$payload")
|
|
261
|
+
|
|
262
|
+
# Extract domains
|
|
263
|
+
local domains
|
|
264
|
+
domains=$(echo "$response" | jq -r '.domains[]?' 2>/dev/null)
|
|
265
|
+
|
|
266
|
+
if [[ -z "$domains" ]]; then
|
|
267
|
+
break
|
|
268
|
+
fi
|
|
269
|
+
|
|
270
|
+
local count
|
|
271
|
+
count=$(echo "$domains" | wc -l | tr -d ' ')
|
|
272
|
+
total=$((total + count))
|
|
273
|
+
|
|
274
|
+
if [[ -n "$output_file" ]]; then
|
|
275
|
+
echo "$domains" >> "$output_file"
|
|
276
|
+
else
|
|
277
|
+
echo "$domains"
|
|
278
|
+
fi
|
|
279
|
+
|
|
280
|
+
# Get next page state
|
|
281
|
+
page_state=$(echo "$response" | jq -r '.page_state // empty' 2>/dev/null)
|
|
282
|
+
|
|
283
|
+
if [[ -z "$page_state" ]]; then
|
|
284
|
+
break
|
|
285
|
+
fi
|
|
286
|
+
|
|
287
|
+
print_info "Fetched $total subdomains so far..."
|
|
288
|
+
sleep 0.5 # Rate limiting
|
|
289
|
+
done
|
|
290
|
+
|
|
291
|
+
print_success "Total subdomains found: $total"
|
|
292
|
+
|
|
293
|
+
if [[ -n "$output_file" ]]; then
|
|
294
|
+
print_success "Results saved to: $output_file"
|
|
295
|
+
fi
|
|
296
|
+
|
|
297
|
+
return 0
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
# Simple CNAME lookup (CLI-friendly)
|
|
301
|
+
cnames_simple() {
|
|
302
|
+
local target_domain="$1"
|
|
303
|
+
local limit="${2:-$DEFAULT_LIMIT}"
|
|
304
|
+
local nocolor="${3:-0}"
|
|
305
|
+
local noheader="${4:-0}"
|
|
306
|
+
|
|
307
|
+
local url="${API_BASE}/cn/${target_domain}?l=${limit}&nocolor=${nocolor}&noheader=${noheader}"
|
|
308
|
+
|
|
309
|
+
print_info "Finding domains pointing to: $target_domain"
|
|
310
|
+
curl -s "$url"
|
|
311
|
+
|
|
312
|
+
return 0
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
# CNAME lookup with JSON output and pagination
|
|
316
|
+
cnames_json() {
|
|
317
|
+
local target_domain="$1"
|
|
318
|
+
local limit="${2:-$DEFAULT_LIMIT}"
|
|
319
|
+
local apex_filter="${3:-}"
|
|
320
|
+
local page_state="${4:-}"
|
|
321
|
+
|
|
322
|
+
local payload="{\"target_domain\":\"$target_domain\", \"limit\": $limit"
|
|
323
|
+
|
|
324
|
+
if [[ -n "$apex_filter" ]]; then
|
|
325
|
+
payload="${payload}, \"apex_domain\": \"$apex_filter\""
|
|
326
|
+
fi
|
|
327
|
+
|
|
328
|
+
if [[ -n "$page_state" ]]; then
|
|
329
|
+
payload="${payload}, \"page_state\": \"$page_state\""
|
|
330
|
+
fi
|
|
331
|
+
|
|
332
|
+
payload="${payload}}"
|
|
333
|
+
|
|
334
|
+
print_info "Querying CNAME API for: $target_domain"
|
|
335
|
+
curl -s -X POST "${API_V1}/lookup/cnames" \
|
|
336
|
+
-H "Content-Type: application/json" \
|
|
337
|
+
-d "$payload" | jq .
|
|
338
|
+
|
|
339
|
+
return 0
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
# Export rDNS to CSV
|
|
343
|
+
export_rdns() {
|
|
344
|
+
local ip="$1"
|
|
345
|
+
local output="${2:-rdns-${ip}.csv}"
|
|
346
|
+
local limit="${3:-$MAX_EXPORT_LIMIT}"
|
|
347
|
+
local hide_header="${4:-false}"
|
|
348
|
+
local apex_filter="${5:-}"
|
|
349
|
+
local tld_filter="${6:-}"
|
|
350
|
+
|
|
351
|
+
local url="${API_V1}/download?ip_address=${ip}&limit=${limit}"
|
|
352
|
+
|
|
353
|
+
if [[ "$hide_header" == "true" ]]; then
|
|
354
|
+
url="${url}&hide_header=true"
|
|
355
|
+
fi
|
|
356
|
+
|
|
357
|
+
if [[ -n "$apex_filter" ]]; then
|
|
358
|
+
url="${url}&apex_domain=${apex_filter}"
|
|
359
|
+
fi
|
|
360
|
+
|
|
361
|
+
if [[ -n "$tld_filter" ]]; then
|
|
362
|
+
url="${url}&tld=${tld_filter}"
|
|
363
|
+
fi
|
|
364
|
+
|
|
365
|
+
print_info "Exporting rDNS data for: $ip"
|
|
366
|
+
print_info "Output: $output (limit: $limit)"
|
|
367
|
+
|
|
368
|
+
curl -s "$url" -o "$output"
|
|
369
|
+
|
|
370
|
+
if [[ -f "$output" ]]; then
|
|
371
|
+
local lines
|
|
372
|
+
lines=$(wc -l < "$output" | tr -d ' ')
|
|
373
|
+
print_success "Exported $lines records to: $output"
|
|
374
|
+
else
|
|
375
|
+
print_error "Export failed"
|
|
376
|
+
return 1
|
|
377
|
+
fi
|
|
378
|
+
|
|
379
|
+
return 0
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
# Export subdomains to CSV
|
|
383
|
+
export_subdomains() {
|
|
384
|
+
local domain="$1"
|
|
385
|
+
local output="${2:-subdomains-${domain}.csv}"
|
|
386
|
+
local limit="${3:-$MAX_EXPORT_LIMIT}"
|
|
387
|
+
local hide_header="${4:-false}"
|
|
388
|
+
|
|
389
|
+
local url="${API_V1}/subdomains/download?domain=${domain}&limit=${limit}"
|
|
390
|
+
|
|
391
|
+
if [[ "$hide_header" == "true" ]]; then
|
|
392
|
+
url="${url}&hide_header=true"
|
|
393
|
+
fi
|
|
394
|
+
|
|
395
|
+
print_info "Exporting subdomains for: $domain"
|
|
396
|
+
print_info "Output: $output (limit: $limit)"
|
|
397
|
+
|
|
398
|
+
curl -s "$url" -o "$output"
|
|
399
|
+
|
|
400
|
+
if [[ -f "$output" ]]; then
|
|
401
|
+
local lines
|
|
402
|
+
lines=$(wc -l < "$output" | tr -d ' ')
|
|
403
|
+
print_success "Exported $lines records to: $output"
|
|
404
|
+
else
|
|
405
|
+
print_error "Export failed"
|
|
406
|
+
return 1
|
|
407
|
+
fi
|
|
408
|
+
|
|
409
|
+
return 0
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
# Export CNAMEs to CSV
|
|
413
|
+
export_cnames() {
|
|
414
|
+
local target_domain="$1"
|
|
415
|
+
local output="${2:-cnames-${target_domain}.csv}"
|
|
416
|
+
local limit="${3:-$MAX_EXPORT_LIMIT}"
|
|
417
|
+
local hide_header="${4:-false}"
|
|
418
|
+
|
|
419
|
+
local url="${API_V1}/cnames/download?target_domain=${target_domain}&limit=${limit}"
|
|
420
|
+
|
|
421
|
+
if [[ "$hide_header" == "true" ]]; then
|
|
422
|
+
url="${url}&hide_header=true"
|
|
423
|
+
fi
|
|
424
|
+
|
|
425
|
+
print_info "Exporting CNAMEs pointing to: $target_domain"
|
|
426
|
+
print_info "Output: $output (limit: $limit)"
|
|
427
|
+
|
|
428
|
+
curl -s "$url" -o "$output"
|
|
429
|
+
|
|
430
|
+
if [[ -f "$output" ]]; then
|
|
431
|
+
local lines
|
|
432
|
+
lines=$(wc -l < "$output" | tr -d ' ')
|
|
433
|
+
print_success "Exported $lines records to: $output"
|
|
434
|
+
else
|
|
435
|
+
print_error "Export failed"
|
|
436
|
+
return 1
|
|
437
|
+
fi
|
|
438
|
+
|
|
439
|
+
return 0
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
# =============================================================================
|
|
443
|
+
# RECONEER API FUNCTIONS
|
|
444
|
+
# =============================================================================
|
|
445
|
+
|
|
446
|
+
# Reconeer domain lookup (subdomains with IPs)
|
|
447
|
+
reconeer_domain() {
|
|
448
|
+
local domain="$1"
|
|
449
|
+
local api_key="${2:-}"
|
|
450
|
+
local json_output="${3:-false}"
|
|
451
|
+
|
|
452
|
+
# Load API key if not provided
|
|
453
|
+
if [[ -z "$api_key" ]]; then
|
|
454
|
+
api_key=$(load_reconeer_api_key)
|
|
455
|
+
fi
|
|
456
|
+
|
|
457
|
+
print_info "[Reconeer] Looking up domain: $domain"
|
|
458
|
+
|
|
459
|
+
local curl_opts=(-s -L) # -L follows redirects
|
|
460
|
+
if [[ -n "$api_key" ]]; then
|
|
461
|
+
curl_opts+=(-H "Authorization: Bearer $api_key")
|
|
462
|
+
print_info "Using API key for unlimited access"
|
|
463
|
+
else
|
|
464
|
+
print_warning "No API key - limited to 10 queries/day"
|
|
465
|
+
fi
|
|
466
|
+
|
|
467
|
+
local response
|
|
468
|
+
response=$(curl "${curl_opts[@]}" "${RECONEER_API}/domain/${domain}")
|
|
469
|
+
|
|
470
|
+
if [[ "$json_output" == "true" ]]; then
|
|
471
|
+
echo "$response" | jq . 2>/dev/null || echo "$response"
|
|
472
|
+
else
|
|
473
|
+
# Pretty print the response
|
|
474
|
+
if command -v jq &>/dev/null; then
|
|
475
|
+
local count
|
|
476
|
+
count=$(echo "$response" | jq -r '.count // 0' 2>/dev/null)
|
|
477
|
+
print_success "Found $count subdomains for $domain"
|
|
478
|
+
echo ""
|
|
479
|
+
echo "$response" | jq -r '.subdomains[]? | "\(.name)\t\(.ip // "N/A")"' 2>/dev/null | column -t
|
|
480
|
+
else
|
|
481
|
+
echo "$response"
|
|
482
|
+
fi
|
|
483
|
+
fi
|
|
484
|
+
|
|
485
|
+
return 0
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
# Reconeer IP lookup (hostnames for an IP)
|
|
489
|
+
reconeer_ip() {
|
|
490
|
+
local ip="$1"
|
|
491
|
+
local api_key="${2:-}"
|
|
492
|
+
local json_output="${3:-false}"
|
|
493
|
+
|
|
494
|
+
# Load API key if not provided
|
|
495
|
+
if [[ -z "$api_key" ]]; then
|
|
496
|
+
api_key=$(load_reconeer_api_key)
|
|
497
|
+
fi
|
|
498
|
+
|
|
499
|
+
print_info "[Reconeer] Looking up IP: $ip"
|
|
500
|
+
|
|
501
|
+
local curl_opts=(-s -L) # -L follows redirects
|
|
502
|
+
if [[ -n "$api_key" ]]; then
|
|
503
|
+
curl_opts+=(-H "Authorization: Bearer $api_key")
|
|
504
|
+
print_info "Using API key for unlimited access"
|
|
505
|
+
else
|
|
506
|
+
print_warning "No API key - limited to 10 queries/day"
|
|
507
|
+
fi
|
|
508
|
+
|
|
509
|
+
local response
|
|
510
|
+
response=$(curl "${curl_opts[@]}" "${RECONEER_API}/ip/${ip}")
|
|
511
|
+
|
|
512
|
+
if [[ "$json_output" == "true" ]]; then
|
|
513
|
+
echo "$response" | jq . 2>/dev/null || echo "$response"
|
|
514
|
+
else
|
|
515
|
+
# Pretty print the response
|
|
516
|
+
if command -v jq &>/dev/null; then
|
|
517
|
+
echo "$response" | jq -r '.hostnames[]?' 2>/dev/null || echo "$response"
|
|
518
|
+
else
|
|
519
|
+
echo "$response"
|
|
520
|
+
fi
|
|
521
|
+
fi
|
|
522
|
+
|
|
523
|
+
return 0
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
# Reconeer subdomain details
|
|
527
|
+
reconeer_subdomain() {
|
|
528
|
+
local subdomain="$1"
|
|
529
|
+
local api_key="${2:-}"
|
|
530
|
+
local json_output="${3:-false}"
|
|
531
|
+
|
|
532
|
+
# Load API key if not provided
|
|
533
|
+
if [[ -z "$api_key" ]]; then
|
|
534
|
+
api_key=$(load_reconeer_api_key)
|
|
535
|
+
fi
|
|
536
|
+
|
|
537
|
+
print_info "[Reconeer] Looking up subdomain: $subdomain"
|
|
538
|
+
|
|
539
|
+
local curl_opts=(-s -L) # -L follows redirects
|
|
540
|
+
if [[ -n "$api_key" ]]; then
|
|
541
|
+
curl_opts+=(-H "Authorization: Bearer $api_key")
|
|
542
|
+
print_info "Using API key for unlimited access"
|
|
543
|
+
else
|
|
544
|
+
print_warning "No API key - limited to 10 queries/day"
|
|
545
|
+
fi
|
|
546
|
+
|
|
547
|
+
local response
|
|
548
|
+
response=$(curl "${curl_opts[@]}" "${RECONEER_API}/subdomain/${subdomain}")
|
|
549
|
+
|
|
550
|
+
if [[ "$json_output" == "true" ]]; then
|
|
551
|
+
echo "$response" | jq . 2>/dev/null || echo "$response"
|
|
552
|
+
else
|
|
553
|
+
echo "$response" | jq . 2>/dev/null || echo "$response"
|
|
554
|
+
fi
|
|
555
|
+
|
|
556
|
+
return 0
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
# Reconeer command dispatcher
|
|
560
|
+
reconeer_cmd() {
|
|
561
|
+
local subcommand="${1:-help}"
|
|
562
|
+
local target="${2:-}"
|
|
563
|
+
local api_key="${3:-}"
|
|
564
|
+
local json_output="${4:-false}"
|
|
565
|
+
|
|
566
|
+
case "$subcommand" in
|
|
567
|
+
"domain"|"d")
|
|
568
|
+
if [[ -z "$target" ]]; then
|
|
569
|
+
print_error "Domain required"
|
|
570
|
+
print_info "Usage: $0 reconeer domain <domain> [--api-key KEY]"
|
|
571
|
+
return 1
|
|
572
|
+
fi
|
|
573
|
+
reconeer_domain "$target" "$api_key" "$json_output"
|
|
574
|
+
;;
|
|
575
|
+
"ip"|"i")
|
|
576
|
+
if [[ -z "$target" ]]; then
|
|
577
|
+
print_error "IP address required"
|
|
578
|
+
print_info "Usage: $0 reconeer ip <ip> [--api-key KEY]"
|
|
579
|
+
return 1
|
|
580
|
+
fi
|
|
581
|
+
reconeer_ip "$target" "$api_key" "$json_output"
|
|
582
|
+
;;
|
|
583
|
+
"subdomain"|"sub"|"s")
|
|
584
|
+
if [[ -z "$target" ]]; then
|
|
585
|
+
print_error "Subdomain required"
|
|
586
|
+
print_info "Usage: $0 reconeer subdomain <subdomain> [--api-key KEY]"
|
|
587
|
+
return 1
|
|
588
|
+
fi
|
|
589
|
+
reconeer_subdomain "$target" "$api_key" "$json_output"
|
|
590
|
+
;;
|
|
591
|
+
"help"|"-h"|"--help")
|
|
592
|
+
echo ""
|
|
593
|
+
print_header "Reconeer Commands"
|
|
594
|
+
echo " reconeer domain <domain> - Get subdomains with IPs"
|
|
595
|
+
echo " reconeer ip <ip> - Get hostnames for IP"
|
|
596
|
+
echo " reconeer subdomain <subdomain> - Get subdomain details"
|
|
597
|
+
echo ""
|
|
598
|
+
echo "Options:"
|
|
599
|
+
echo " --api-key <key> Use API key for unlimited access"
|
|
600
|
+
echo " --json Output raw JSON"
|
|
601
|
+
echo ""
|
|
602
|
+
echo "Rate Limits:"
|
|
603
|
+
echo " Free: 10 queries/day (no key required)"
|
|
604
|
+
echo " Premium: Unlimited (\$49/mo with API key)"
|
|
605
|
+
echo ""
|
|
606
|
+
echo "API Key Setup:"
|
|
607
|
+
echo " export RECONEER_API_KEY=\"your-key\" in ~/.config/aidevops/mcp-env.sh"
|
|
608
|
+
echo ""
|
|
609
|
+
;;
|
|
610
|
+
*)
|
|
611
|
+
print_error "Unknown Reconeer command: $subcommand"
|
|
612
|
+
print_info "Use '$0 reconeer help' for usage"
|
|
613
|
+
return 1
|
|
614
|
+
;;
|
|
615
|
+
esac
|
|
616
|
+
|
|
617
|
+
return 0
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
# =============================================================================
|
|
621
|
+
# THC API FUNCTIONS (continued)
|
|
622
|
+
# =============================================================================
|
|
623
|
+
|
|
624
|
+
# Lookup current IP
|
|
625
|
+
my_ip() {
|
|
626
|
+
print_info "Looking up domains for your current IP..."
|
|
627
|
+
curl -s "${API_BASE}/me"
|
|
628
|
+
return 0
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
# Show rate limit status
|
|
632
|
+
rate_limit() {
|
|
633
|
+
print_info "Checking rate limit status..."
|
|
634
|
+
local response
|
|
635
|
+
response=$(curl -s "${API_BASE}/me" 2>/dev/null | head -20)
|
|
636
|
+
|
|
637
|
+
# Extract rate limit info from response
|
|
638
|
+
echo "$response" | grep -E "Rate Limit|requests"
|
|
639
|
+
|
|
640
|
+
return 0
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
# Show help
|
|
644
|
+
show_help() {
|
|
645
|
+
echo "Domain Research Helper Script"
|
|
646
|
+
echo "DNS intelligence using THC (ip.thc.org) and Reconeer (reconeer.com)"
|
|
647
|
+
echo ""
|
|
648
|
+
echo "$USAGE_COMMAND_OPTIONS"
|
|
649
|
+
echo ""
|
|
650
|
+
echo "Data Sources:"
|
|
651
|
+
echo " THC: 4.51B records, rDNS/CNAMEs/exports, 250 req (0.5/sec replenish)"
|
|
652
|
+
echo " Reconeer: Enriched subdomains, 10/day free, \$49/mo unlimited"
|
|
653
|
+
echo ""
|
|
654
|
+
print_header "THC: Reverse DNS (IP to Domains)"
|
|
655
|
+
echo " rdns <ip> - Simple rDNS lookup"
|
|
656
|
+
echo " rdns <ip> --filter <domain> - Filter by apex domain"
|
|
657
|
+
echo " rdns <ip> --limit <n> - Limit results (max 100)"
|
|
658
|
+
echo " rdns <ip> --json - JSON output with metadata"
|
|
659
|
+
echo " rdns-block <ip/cidr> - IP block lookup (/24, /16, /8)"
|
|
660
|
+
echo ""
|
|
661
|
+
print_header "THC: Subdomain Enumeration"
|
|
662
|
+
echo " subdomains <domain> - Simple subdomain lookup"
|
|
663
|
+
echo " subdomains <domain> --all - Fetch all with pagination"
|
|
664
|
+
echo " subdomains <domain> --json - JSON output with metadata"
|
|
665
|
+
echo " subdomains <domain> --limit <n> - Limit results (max 100)"
|
|
666
|
+
echo ""
|
|
667
|
+
print_header "THC: CNAME Discovery"
|
|
668
|
+
echo " cnames <target> - Find domains pointing to target"
|
|
669
|
+
echo " cnames <target> --filter <apex> - Filter by apex domain"
|
|
670
|
+
echo " cnames <target> --json - JSON output with metadata"
|
|
671
|
+
echo ""
|
|
672
|
+
print_header "THC: CSV Exports (up to 50,000 records)"
|
|
673
|
+
echo " export-rdns <ip> [--output file.csv]"
|
|
674
|
+
echo " export-subdomains <domain> [--output file.csv]"
|
|
675
|
+
echo " export-cnames <target> [--output file.csv]"
|
|
676
|
+
echo ""
|
|
677
|
+
print_header "Reconeer: Enriched Subdomain Enumeration"
|
|
678
|
+
echo " reconeer domain <domain> - Get subdomains with IPs"
|
|
679
|
+
echo " reconeer ip <ip> - Get hostnames for IP"
|
|
680
|
+
echo " reconeer subdomain <sub> - Get subdomain details"
|
|
681
|
+
echo " reconeer help - Reconeer-specific help"
|
|
682
|
+
echo ""
|
|
683
|
+
print_header "Utilities"
|
|
684
|
+
echo " my-ip - Lookup your current IP (THC)"
|
|
685
|
+
echo " rate-limit - Check THC rate limit status"
|
|
686
|
+
echo " help - $HELP_SHOW_MESSAGE"
|
|
687
|
+
echo ""
|
|
688
|
+
echo "Options:"
|
|
689
|
+
echo " --filter <domain> Filter results by apex domain"
|
|
690
|
+
echo " --limit <n> Limit results (default: 50, max: 100)"
|
|
691
|
+
echo " --tld <tld1,tld2> Filter by TLDs (comma-separated)"
|
|
692
|
+
echo " --json Output in JSON format"
|
|
693
|
+
echo " --all Fetch all results with pagination"
|
|
694
|
+
echo " --output <file> Output file for exports"
|
|
695
|
+
echo " --no-header Hide CSV headers in exports"
|
|
696
|
+
echo " --api-key <key> Reconeer API key for unlimited access"
|
|
697
|
+
echo ""
|
|
698
|
+
echo "Examples:"
|
|
699
|
+
echo " # THC examples"
|
|
700
|
+
echo " $0 rdns 1.1.1.1"
|
|
701
|
+
echo " $0 rdns 8.8.8.8 --json --limit 20"
|
|
702
|
+
echo " $0 rdns-block 1.1.1.0/24 --tld com,org"
|
|
703
|
+
echo " $0 subdomains github.com --all"
|
|
704
|
+
echo " $0 cnames github.io --limit 50"
|
|
705
|
+
echo " $0 export-subdomains example.com --output subs.csv"
|
|
706
|
+
echo ""
|
|
707
|
+
echo " # Reconeer examples"
|
|
708
|
+
echo " $0 reconeer domain github.com"
|
|
709
|
+
echo " $0 reconeer ip 140.82.121.4"
|
|
710
|
+
echo " $0 reconeer domain example.com --api-key YOUR_KEY"
|
|
711
|
+
echo ""
|
|
712
|
+
echo "Rate Limits:"
|
|
713
|
+
echo " THC: 250 requests, replenishes at 0.50/sec (~8 min recovery)"
|
|
714
|
+
echo " Reconeer: 10/day free, unlimited with \$49/mo premium"
|
|
715
|
+
echo ""
|
|
716
|
+
echo "API Key Setup (Reconeer):"
|
|
717
|
+
echo " Add to ~/.config/aidevops/mcp-env.sh:"
|
|
718
|
+
echo " export RECONEER_API_KEY=\"your-api-key-here\""
|
|
719
|
+
echo ""
|
|
720
|
+
echo "Database Info (THC):"
|
|
721
|
+
echo " - 4.51 billion records (updated monthly)"
|
|
722
|
+
echo " - Powered by Segfault, Domainsproject, CertStream-Domains"
|
|
723
|
+
echo " - Full database downloads: https://cs2.ip.thc.org/RDNS/readme.txt"
|
|
724
|
+
|
|
725
|
+
return 0
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
# Main function
|
|
729
|
+
main() {
|
|
730
|
+
if ! check_dependencies; then
|
|
731
|
+
return 1
|
|
732
|
+
fi
|
|
733
|
+
|
|
734
|
+
local command="${1:-help}"
|
|
735
|
+
shift || true
|
|
736
|
+
|
|
737
|
+
# Parse arguments
|
|
738
|
+
local target=""
|
|
739
|
+
local filter=""
|
|
740
|
+
local limit="$DEFAULT_LIMIT"
|
|
741
|
+
local tld=""
|
|
742
|
+
local json_output=false
|
|
743
|
+
local all_pages=false
|
|
744
|
+
local output=""
|
|
745
|
+
local no_header=false
|
|
746
|
+
local api_key=""
|
|
747
|
+
local reconeer_subcommand=""
|
|
748
|
+
|
|
749
|
+
# For reconeer command, capture subcommand first
|
|
750
|
+
if [[ "$command" == "reconeer" ]]; then
|
|
751
|
+
reconeer_subcommand="${1:-help}"
|
|
752
|
+
shift || true
|
|
753
|
+
fi
|
|
754
|
+
|
|
755
|
+
while [[ $# -gt 0 ]]; do
|
|
756
|
+
case "$1" in
|
|
757
|
+
--filter|-f)
|
|
758
|
+
filter="$2"
|
|
759
|
+
shift 2
|
|
760
|
+
;;
|
|
761
|
+
--limit|-l)
|
|
762
|
+
limit="$2"
|
|
763
|
+
shift 2
|
|
764
|
+
;;
|
|
765
|
+
--tld|-t)
|
|
766
|
+
tld="$2"
|
|
767
|
+
shift 2
|
|
768
|
+
;;
|
|
769
|
+
--json|-j)
|
|
770
|
+
json_output=true
|
|
771
|
+
shift
|
|
772
|
+
;;
|
|
773
|
+
--all|-a)
|
|
774
|
+
all_pages=true
|
|
775
|
+
shift
|
|
776
|
+
;;
|
|
777
|
+
--output|-o)
|
|
778
|
+
output="$2"
|
|
779
|
+
shift 2
|
|
780
|
+
;;
|
|
781
|
+
--no-header)
|
|
782
|
+
no_header=true
|
|
783
|
+
shift
|
|
784
|
+
;;
|
|
785
|
+
--api-key|-k)
|
|
786
|
+
api_key="$2"
|
|
787
|
+
shift 2
|
|
788
|
+
;;
|
|
789
|
+
-*)
|
|
790
|
+
print_error "Unknown option: $1"
|
|
791
|
+
return 1
|
|
792
|
+
;;
|
|
793
|
+
*)
|
|
794
|
+
if [[ -z "$target" ]]; then
|
|
795
|
+
target="$1"
|
|
796
|
+
fi
|
|
797
|
+
shift
|
|
798
|
+
;;
|
|
799
|
+
esac
|
|
800
|
+
done
|
|
801
|
+
|
|
802
|
+
case "$command" in
|
|
803
|
+
"rdns")
|
|
804
|
+
if [[ -z "$target" ]]; then
|
|
805
|
+
print_error "IP address required"
|
|
806
|
+
print_info "Usage: $0 rdns <ip> [options]"
|
|
807
|
+
return 1
|
|
808
|
+
fi
|
|
809
|
+
|
|
810
|
+
if [[ "$json_output" == true ]]; then
|
|
811
|
+
rdns_json "$target" "$limit" "$tld" "$filter"
|
|
812
|
+
else
|
|
813
|
+
rdns_simple "$target" "$filter" "$limit" "1" "0"
|
|
814
|
+
fi
|
|
815
|
+
;;
|
|
816
|
+
"rdns-block")
|
|
817
|
+
if [[ -z "$target" ]]; then
|
|
818
|
+
print_error "IP block required (CIDR notation)"
|
|
819
|
+
print_info "Usage: $0 rdns-block <ip/cidr> [options]"
|
|
820
|
+
return 1
|
|
821
|
+
fi
|
|
822
|
+
rdns_block "$target" "$limit" "$tld"
|
|
823
|
+
;;
|
|
824
|
+
"subdomains"|"subs"|"sb")
|
|
825
|
+
if [[ -z "$target" ]]; then
|
|
826
|
+
print_error "Domain required"
|
|
827
|
+
print_info "Usage: $0 subdomains <domain> [options]"
|
|
828
|
+
return 1
|
|
829
|
+
fi
|
|
830
|
+
|
|
831
|
+
if [[ "$all_pages" == true ]]; then
|
|
832
|
+
subdomains_all "$target" "$output"
|
|
833
|
+
elif [[ "$json_output" == true ]]; then
|
|
834
|
+
subdomains_json "$target" "$limit"
|
|
835
|
+
else
|
|
836
|
+
subdomains_simple "$target" "$limit" "1" "0"
|
|
837
|
+
fi
|
|
838
|
+
;;
|
|
839
|
+
"cnames"|"cn")
|
|
840
|
+
if [[ -z "$target" ]]; then
|
|
841
|
+
print_error "Target domain required"
|
|
842
|
+
print_info "Usage: $0 cnames <target> [options]"
|
|
843
|
+
return 1
|
|
844
|
+
fi
|
|
845
|
+
|
|
846
|
+
if [[ "$json_output" == true ]]; then
|
|
847
|
+
cnames_json "$target" "$limit" "$filter"
|
|
848
|
+
else
|
|
849
|
+
cnames_simple "$target" "$limit" "1" "0"
|
|
850
|
+
fi
|
|
851
|
+
;;
|
|
852
|
+
"export-rdns")
|
|
853
|
+
if [[ -z "$target" ]]; then
|
|
854
|
+
print_error "IP address required"
|
|
855
|
+
print_info "Usage: $0 export-rdns <ip> [--output file.csv]"
|
|
856
|
+
return 1
|
|
857
|
+
fi
|
|
858
|
+
|
|
859
|
+
local hide_header_str="false"
|
|
860
|
+
if [[ "$no_header" == true ]]; then
|
|
861
|
+
hide_header_str="true"
|
|
862
|
+
fi
|
|
863
|
+
|
|
864
|
+
export_rdns "$target" "$output" "$limit" "$hide_header_str" "$filter" "$tld"
|
|
865
|
+
;;
|
|
866
|
+
"export-subdomains"|"export-subs")
|
|
867
|
+
if [[ -z "$target" ]]; then
|
|
868
|
+
print_error "Domain required"
|
|
869
|
+
print_info "Usage: $0 export-subdomains <domain> [--output file.csv]"
|
|
870
|
+
return 1
|
|
871
|
+
fi
|
|
872
|
+
|
|
873
|
+
local hide_header_str="false"
|
|
874
|
+
if [[ "$no_header" == true ]]; then
|
|
875
|
+
hide_header_str="true"
|
|
876
|
+
fi
|
|
877
|
+
|
|
878
|
+
export_subdomains "$target" "$output" "$limit" "$hide_header_str"
|
|
879
|
+
;;
|
|
880
|
+
"export-cnames"|"export-cn")
|
|
881
|
+
if [[ -z "$target" ]]; then
|
|
882
|
+
print_error "Target domain required"
|
|
883
|
+
print_info "Usage: $0 export-cnames <target> [--output file.csv]"
|
|
884
|
+
return 1
|
|
885
|
+
fi
|
|
886
|
+
|
|
887
|
+
local hide_header_str="false"
|
|
888
|
+
if [[ "$no_header" == true ]]; then
|
|
889
|
+
hide_header_str="true"
|
|
890
|
+
fi
|
|
891
|
+
|
|
892
|
+
export_cnames "$target" "$output" "$limit" "$hide_header_str"
|
|
893
|
+
;;
|
|
894
|
+
"my-ip"|"me")
|
|
895
|
+
my_ip
|
|
896
|
+
;;
|
|
897
|
+
"rate-limit"|"rate"|"limit")
|
|
898
|
+
rate_limit
|
|
899
|
+
;;
|
|
900
|
+
"reconeer"|"rn")
|
|
901
|
+
reconeer_cmd "$reconeer_subcommand" "$target" "$api_key" "$json_output"
|
|
902
|
+
;;
|
|
903
|
+
"help"|"-h"|"--help"|"")
|
|
904
|
+
show_help
|
|
905
|
+
;;
|
|
906
|
+
*)
|
|
907
|
+
print_error "Unknown command: $command"
|
|
908
|
+
print_info "$HELP_USAGE_INFO"
|
|
909
|
+
return 1
|
|
910
|
+
;;
|
|
911
|
+
esac
|
|
912
|
+
|
|
913
|
+
return 0
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
# Run main function
|
|
917
|
+
main "$@"
|