otinstaller 0.0.1__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.
- otinstaller-0.0.1/.gitattributes +1 -0
- otinstaller-0.0.1/.github/workflows/ci.yml +71 -0
- otinstaller-0.0.1/.gitignore +35 -0
- otinstaller-0.0.1/AGENTS.md +70 -0
- otinstaller-0.0.1/CHANGELOG.md +52 -0
- otinstaller-0.0.1/LICENSE +21 -0
- otinstaller-0.0.1/PKG-INFO +193 -0
- otinstaller-0.0.1/README.md +164 -0
- otinstaller-0.0.1/cleanup.sh +3 -0
- otinstaller-0.0.1/docs/DECISIONS.md +12 -0
- otinstaller-0.0.1/docs/LAYOUT.md +74 -0
- otinstaller-0.0.1/docs/REGISTRY.md +160 -0
- otinstaller-0.0.1/docs/RESULTS.md +101 -0
- otinstaller-0.0.1/docs/TAGGING.md +279 -0
- otinstaller-0.0.1/docs/status.html +324 -0
- otinstaller-0.0.1/llms.txt +165 -0
- otinstaller-0.0.1/pipeline/README.md +81 -0
- otinstaller-0.0.1/pipeline/__init__.py +1 -0
- otinstaller-0.0.1/pipeline/candidates.yaml +1164 -0
- otinstaller-0.0.1/pipeline/discover.py +371 -0
- otinstaller-0.0.1/pipeline/verify.py +671 -0
- otinstaller-0.0.1/playbooks/domain-recon.yaml +7 -0
- otinstaller-0.0.1/playbooks/username-investigation.yaml +7 -0
- otinstaller-0.0.1/pyproject.toml +60 -0
- otinstaller-0.0.1/registry/denylist.yaml +11 -0
- otinstaller-0.0.1/registry/generated_registry_tagged.yaml +1452 -0
- otinstaller-0.0.1/registry/registry.yaml +1 -0
- otinstaller-0.0.1/scripts/generate_status_page.py +121 -0
- otinstaller-0.0.1/src/otinstaller/__init__.py +1 -0
- otinstaller-0.0.1/src/otinstaller/__main__.py +4 -0
- otinstaller-0.0.1/src/otinstaller/cli.py +2554 -0
- otinstaller-0.0.1/src/otinstaller/config.py +96 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/aliens-eye.txt +40 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/auto-archiver.txt +3 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/blackbird.txt +3 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/dnstwist.txt +20 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/edgar-tool.txt +4 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/ghunt.txt +64 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/h8mail.txt +20 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/holehe.txt +52 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/instagram-location-search.txt +3 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/maigret.txt +74 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/neutrosint.txt +17 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/sherlock.txt +60 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/spiderfoot.txt +63 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/telegram-phone-number-checker.txt +4 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/telepathy.txt +4 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/thebigbrother.txt +17 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/theharvester.txt +62 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/torbot.txt +13 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/user-scanner.txt +113 -0
- otinstaller-0.0.1/src/otinstaller/data/examples/zen.txt +11 -0
- otinstaller-0.0.1/src/otinstaller/data/registry.yaml +1806 -0
- otinstaller-0.0.1/src/otinstaller/denylist.py +80 -0
- otinstaller-0.0.1/src/otinstaller/detect.py +83 -0
- otinstaller-0.0.1/src/otinstaller/diff.py +76 -0
- otinstaller-0.0.1/src/otinstaller/examples.py +1 -0
- otinstaller-0.0.1/src/otinstaller/extract.py +122 -0
- otinstaller-0.0.1/src/otinstaller/installer/__init__.py +17 -0
- otinstaller-0.0.1/src/otinstaller/installer/core.py +243 -0
- otinstaller-0.0.1/src/otinstaller/installer/git_install.py +100 -0
- otinstaller-0.0.1/src/otinstaller/installer/pip_install.py +47 -0
- otinstaller-0.0.1/src/otinstaller/installer/process.py +127 -0
- otinstaller-0.0.1/src/otinstaller/installer/venv.py +27 -0
- otinstaller-0.0.1/src/otinstaller/keys.py +58 -0
- otinstaller-0.0.1/src/otinstaller/notice.py +54 -0
- otinstaller-0.0.1/src/otinstaller/registry.py +473 -0
- otinstaller-0.0.1/src/otinstaller/results.py +98 -0
- otinstaller-0.0.1/src/otinstaller/runner.py +275 -0
- otinstaller-0.0.1/src/otinstaller/state.py +263 -0
- otinstaller-0.0.1/src/otinstaller/updater.py +1 -0
- otinstaller-0.0.1/tests/conftest.py +8 -0
- otinstaller-0.0.1/tests/test_cli.py +3269 -0
- otinstaller-0.0.1/tests/test_config.py +186 -0
- otinstaller-0.0.1/tests/test_denylist.py +121 -0
- otinstaller-0.0.1/tests/test_detect.py +60 -0
- otinstaller-0.0.1/tests/test_diff.py +121 -0
- otinstaller-0.0.1/tests/test_discover.py +323 -0
- otinstaller-0.0.1/tests/test_extract.py +96 -0
- otinstaller-0.0.1/tests/test_init.py +59 -0
- otinstaller-0.0.1/tests/test_installer_core.py +389 -0
- otinstaller-0.0.1/tests/test_keys.py +127 -0
- otinstaller-0.0.1/tests/test_network.py +195 -0
- otinstaller-0.0.1/tests/test_notice.py +39 -0
- otinstaller-0.0.1/tests/test_process.py +61 -0
- otinstaller-0.0.1/tests/test_registry.py +574 -0
- otinstaller-0.0.1/tests/test_runner.py +630 -0
- otinstaller-0.0.1/tests/test_safe_rmtree.py +53 -0
- otinstaller-0.0.1/tests/test_state.py +1298 -0
- otinstaller-0.0.1/tests/test_venv.py +31 -0
- otinstaller-0.0.1/tests/test_verify.py +561 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* text=auto eol=lf
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
test:
|
|
9
|
+
runs-on: ${{ matrix.os }}
|
|
10
|
+
strategy:
|
|
11
|
+
matrix:
|
|
12
|
+
os: [ubuntu-22.04, ubuntu-24.04]
|
|
13
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
17
|
+
uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: ${{ matrix.python-version }}
|
|
20
|
+
- name: Install dependencies
|
|
21
|
+
run: pip install -e ".[dev,pipeline]"
|
|
22
|
+
- name: Ruff check
|
|
23
|
+
run: ruff check .
|
|
24
|
+
- name: Ruff format check
|
|
25
|
+
run: ruff format --check .
|
|
26
|
+
- name: Run tests
|
|
27
|
+
run: pytest
|
|
28
|
+
|
|
29
|
+
test-debian:
|
|
30
|
+
# Debian 12 (bookworm) - Kali is Debian-based and covered by this
|
|
31
|
+
runs-on: ubuntu-24.04
|
|
32
|
+
container: debian:12
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@v4
|
|
35
|
+
- name: Install system dependencies
|
|
36
|
+
run: |
|
|
37
|
+
apt-get update && apt-get install -y python3 python3-venv python3-pip git
|
|
38
|
+
- name: Create virtualenv
|
|
39
|
+
run: python3 -m venv .venv
|
|
40
|
+
- name: Install project
|
|
41
|
+
run: .venv/bin/pip install -e ".[dev,pipeline]"
|
|
42
|
+
- name: Ruff check
|
|
43
|
+
run: .venv/bin/ruff check .
|
|
44
|
+
- name: Ruff format check
|
|
45
|
+
run: .venv/bin/ruff format --check .
|
|
46
|
+
- name: Run tests
|
|
47
|
+
run: .venv/bin/pytest
|
|
48
|
+
env:
|
|
49
|
+
RUN_NETWORK_TESTS: "0"
|
|
50
|
+
|
|
51
|
+
test-arch:
|
|
52
|
+
# Arch Linux
|
|
53
|
+
runs-on: ubuntu-24.04
|
|
54
|
+
container: archlinux:latest
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v4
|
|
57
|
+
- name: Install system dependencies
|
|
58
|
+
run: |
|
|
59
|
+
pacman -Sy --noconfirm python python-pip git
|
|
60
|
+
- name: Create virtualenv
|
|
61
|
+
run: python -m venv .venv
|
|
62
|
+
- name: Install project
|
|
63
|
+
run: .venv/bin/pip install -e ".[dev,pipeline]"
|
|
64
|
+
- name: Ruff check
|
|
65
|
+
run: .venv/bin/ruff check .
|
|
66
|
+
- name: Ruff format check
|
|
67
|
+
run: .venv/bin/ruff format --check .
|
|
68
|
+
- name: Run tests
|
|
69
|
+
run: .venv/bin/pytest
|
|
70
|
+
env:
|
|
71
|
+
RUN_NETWORK_TESTS: "0"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.pytest_cache/
|
|
7
|
+
.ruff_cache/
|
|
8
|
+
.mypy_cache/
|
|
9
|
+
.coverage
|
|
10
|
+
htmlcov/
|
|
11
|
+
|
|
12
|
+
# Virtual environment
|
|
13
|
+
.venv/
|
|
14
|
+
.venv-wsl/
|
|
15
|
+
|
|
16
|
+
# Results
|
|
17
|
+
results/
|
|
18
|
+
|
|
19
|
+
# Environment
|
|
20
|
+
.env
|
|
21
|
+
|
|
22
|
+
# Build
|
|
23
|
+
dist/
|
|
24
|
+
build/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
|
|
27
|
+
# Pipeline verification outputs
|
|
28
|
+
pipeline/verification_log.jsonl
|
|
29
|
+
registry/generated_registry.yaml
|
|
30
|
+
|
|
31
|
+
# IDE
|
|
32
|
+
.vscode/
|
|
33
|
+
.idea/
|
|
34
|
+
*.swp
|
|
35
|
+
*.swocommit_msg.txt
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# otinstaller: project rules
|
|
2
|
+
|
|
3
|
+
## What this is
|
|
4
|
+
otinstaller is a Python CLI, distributed on PyPI, that installs, runs, updates and
|
|
5
|
+
removes open-source command line tools by name, using one standard command interface.
|
|
6
|
+
It is a neutral tool manager, similar in spirit to pdtm, pipx or Kali's tool packages.
|
|
7
|
+
Tool descriptions, docs and messages stay neutral.
|
|
8
|
+
|
|
9
|
+
## Fixed decisions (do not change without asking)
|
|
10
|
+
- Package and command name: otinstaller.
|
|
11
|
+
- The word "OSINT" must not appear in the package name, command name or CLI help text.
|
|
12
|
+
It may appear in the README and the PyPI description only.
|
|
13
|
+
- Python 3.10+. Linux only. Tested on Ubuntu 22.04 and 24.04 with Python 3.10, 3.11, 3.12.
|
|
14
|
+
- Managed tools are installed with pip or git only. No Go, Rust, Node or Docker.
|
|
15
|
+
- Every managed tool gets its own virtualenv. Never install tools into system Python.
|
|
16
|
+
- Run command shape: `otinstaller run <tool> -- <args>`. Arguments pass straight through.
|
|
17
|
+
- Results are saved automatically to ./results/<tool>/<target>/ using the filename
|
|
18
|
+
pattern <YYYYmmdd-HHMMSS>_<tool>_<target>_<runid>.<ext> plus a .meta.json sidecar.
|
|
19
|
+
The results directory can be overridden with --output or OTINSTALLER_RESULTS_DIR.
|
|
20
|
+
- One env file holds all API keys: ~/.otinstaller/.env, permissions 600. Each tool only
|
|
21
|
+
receives the keys it declares in its registry entry.
|
|
22
|
+
- Home directory is ~/.otinstaller/ (override with OTINSTALLER_HOME).
|
|
23
|
+
- The registry is generated by a pipeline. A tool is listed only if it passes an
|
|
24
|
+
automated install test and a smoke test (--help or --version exits cleanly).
|
|
25
|
+
- Resume: job state lives in SQLite. Finished jobs are skipped on resume and partial
|
|
26
|
+
output is always kept.
|
|
27
|
+
- No telemetry. Network access only to GitHub, PyPI and the registry host.
|
|
28
|
+
|
|
29
|
+
## Inclusion policy
|
|
30
|
+
- A tool is listed if it passes install and smoke tests and is not in the denylist.
|
|
31
|
+
- The denylist excludes attack or harassment tooling by capability (phishing kits, IP
|
|
32
|
+
grabbers, message or call bombers, credential brute-forcers, private-account bypass,
|
|
33
|
+
dox-dump hosting) and non-OSINT active scanners. It lives in registry/denylist.yaml
|
|
34
|
+
and can be edited without code changes.
|
|
35
|
+
- Registry entries carry a `capabilities` list. Tools tagged `dual-use` require the
|
|
36
|
+
responsible-use notice to be accepted before install.
|
|
37
|
+
- The generated list gets a human review before each release.
|
|
38
|
+
|
|
39
|
+
## Code rules
|
|
40
|
+
- Stack: Typer and Rich for the CLI, PyYAML, and the standard library (sqlite3,
|
|
41
|
+
subprocess, asyncio, pathlib). Keep dependencies minimal. Ask before adding any.
|
|
42
|
+
- Layout: src/otinstaller/, tests/, docs/, registry/, pipeline/.
|
|
43
|
+
- The CLI layer stays thin. Real logic lives in importable modules so a TUI could
|
|
44
|
+
reuse it later.
|
|
45
|
+
- Type hints on all function signatures. Lint and format with ruff. Test with pytest.
|
|
46
|
+
- Write the test first, then the code. Every feature needs tests, including failure cases.
|
|
47
|
+
- Never use shell=True. Pass argument lists to subprocess. Validate tool names and
|
|
48
|
+
targets: no path traversal, no shell metacharacters in filenames.
|
|
49
|
+
- Never log or write API key values anywhere (logs, meta.json, error messages).
|
|
50
|
+
- Metadata is neutral: author "otinstaller contributors". No personal names, emails or
|
|
51
|
+
local paths anywhere in the repo.
|
|
52
|
+
|
|
53
|
+
## Style rules (the code should read like an experienced developer wrote it)
|
|
54
|
+
- Comments explain why, not what. Skip comments on obvious code. Most functions need
|
|
55
|
+
no docstring; add a one-line docstring only where the purpose is not clear from
|
|
56
|
+
the name.
|
|
57
|
+
- No emojis anywhere: code, comments, README, commit messages, CLI output.
|
|
58
|
+
- No decorative banners, ASCII art, section divider comments, or "generated by" notes.
|
|
59
|
+
- Do not mention AI, assistants or prompts in any file.
|
|
60
|
+
- Keep functions short and names plain. Prefer simple code over clever code.
|
|
61
|
+
- README and docs are written in plain, direct English. No marketing filler, no
|
|
62
|
+
bullet-point overload, no exclamation marks.
|
|
63
|
+
- Commit messages are short and lowercase, imperative mood, for example
|
|
64
|
+
"add config module" or "fix path handling in results".
|
|
65
|
+
|
|
66
|
+
## Workflow
|
|
67
|
+
- After every task run: ruff check ., ruff format --check ., pytest. Report the real output.
|
|
68
|
+
- If a check fails, fix it. If it still fails after 3 attempts, stop and report the
|
|
69
|
+
problem instead of continuing to change things.
|
|
70
|
+
- Make small commits after each working step. Never leave the repo broken.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Typed input prefixes: u: (username), e: (email), p: (phone), d: (domain), url: (URL), q: (query), geo: (coordinates), g: (Telegram channel)
|
|
12
|
+
- --all mode for
|
|
13
|
+
un command: run every installed tool supporting the given input types (-a short form)
|
|
14
|
+
- --include-credentialed flag for --all mode to include tools requiring API credentials
|
|
15
|
+
- check-updates command: read-only check for available updates
|
|
16
|
+
- --tools option for update and check-updates commands (comma-separated tool names)
|
|
17
|
+
- --json output support for all commands
|
|
18
|
+
- --yes / -y flag to skip confirmation prompts on all commands
|
|
19
|
+
- Stable exit codes: 0=success, 1=error, 2=invalid input, 130=interrupted
|
|
20
|
+
- Non-interactive mode detection (CI-friendly)
|
|
21
|
+
- ot command alias alongside otinstaller
|
|
22
|
+
- otinstaller <toolname> bare command shows tool info (same as info)
|
|
23
|
+
- New tools: Blackbird, Telegram Phone Number Checker, Auto Archiver, edgar-tool, instagram-location-search, Telepathy
|
|
24
|
+
-
|
|
25
|
+
eeds_config field in registry for tools requiring configuration
|
|
26
|
+
-
|
|
27
|
+
equires_credentials concept for tools with mandatory API keys
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- All commands now support --json output
|
|
31
|
+
- All commands respect --yes / -y and non-interactive stdin
|
|
32
|
+
- update command refactored to use shared check logic
|
|
33
|
+
- Registry schema extended with input_types,
|
|
34
|
+
eeds_config
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
- Tool name collision handling (bare tool name vs subcommand)
|
|
38
|
+
- Input type validation for --all mode
|
|
39
|
+
|
|
40
|
+
## [0.0.1] - 2026-09-29
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
- Initial release
|
|
44
|
+
- Basic tool management: install, remove, run, update, list, search, info
|
|
45
|
+
- Parallel tool execution with configurable concurrency
|
|
46
|
+
- Result storage with metadata and SHA256
|
|
47
|
+
- API key management via ~/.otinstaller/.env
|
|
48
|
+
- Responsible use notice on first run
|
|
49
|
+
- Auto-detect target type with uto command
|
|
50
|
+
- Example output viewer
|
|
51
|
+
- Resume interrupted jobs
|
|
52
|
+
- Doctor diagnostics
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 otinstaller contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: otinstaller
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Install, run and update command line tools by name
|
|
5
|
+
Author: otinstaller contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: cli,installer,package-manager,tools
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Requires-Dist: click>=8.0.0
|
|
19
|
+
Requires-Dist: pyyaml
|
|
20
|
+
Requires-Dist: rich>=13.8.0
|
|
21
|
+
Requires-Dist: typer==0.27.2
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest; extra == 'dev'
|
|
24
|
+
Requires-Dist: pytest-asyncio; extra == 'dev'
|
|
25
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
26
|
+
Provides-Extra: pipeline
|
|
27
|
+
Requires-Dist: requests; extra == 'pipeline'
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# OTinstaller
|
|
31
|
+
|
|
32
|
+
Install, run, update, and remove open-source command line tools by name.
|
|
33
|
+
|
|
34
|
+
You pick a tool from a list. OTinstaller downloads it into its own folder, runs it, and saves the output. You do not learn a different install method for each tool.
|
|
35
|
+
|
|
36
|
+
Status: early development. Not published to PyPI yet.
|
|
37
|
+
|
|
38
|
+
## What you need
|
|
39
|
+
|
|
40
|
+
A Linux machine. Tested on Ubuntu 22.04 and 24.04, Debian 12, and Arch Linux. Kali Linux is checked by hand before a release.
|
|
41
|
+
|
|
42
|
+
Python 3.10 or newer, git, and the `venv` module. On Debian, Ubuntu and Kali, install that module with:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
sudo apt install python3-venv git
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Note: Some managed tools do not yet support Python 3.13+. The test matrix covers Python 3.10–3.12. If you encounter install failures on newer Python versions, try running otinstaller in a Python 3.12 virtualenv.
|
|
49
|
+
|
|
50
|
+
## Install otinstaller
|
|
51
|
+
|
|
52
|
+
These commands install otinstaller itself. Run them in this repository's folder. A virtualenv is a private Python folder, so this install does not change the Python that came with the system.
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
python3 -m venv .venv
|
|
56
|
+
source .venv/bin/activate
|
|
57
|
+
pip install -e .
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`otinstaller` should now be on your path. A new terminal does not keep that. Run `source .venv/bin/activate` again from this folder if the next command says `otinstaller: command not found`.
|
|
61
|
+
|
|
62
|
+
For system-wide installation, use `pipx install otinstaller` (or `pipx install .` from this directory). This provides the `otinstaller` and `ot` commands on your PATH without a virtualenv.
|
|
63
|
+
|
|
64
|
+
Check the machine with:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
otinstaller doctor
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`doctor` prints `[ok]` or `[problem]` for Linux, Python, git, and venv. Fix any `[problem]` line before you continue. It often tells you the package to install.
|
|
71
|
+
|
|
72
|
+
## Run your first tool
|
|
73
|
+
|
|
74
|
+
`init` creates `~/.otinstaller/` and shows a responsible-use notice. It asks `Do you accept? [y/N]`. Type `y` and press Enter. Nothing can be installed until you do.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
otinstaller init
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Sherlock searches for a username. This install asks `Install? [y/N]`. The capital N means Enter alone means no. Type `y` to continue.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
otinstaller install sherlock
|
|
84
|
+
otinstaller run sherlock -- someexampleuser123
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The `--` marks where otinstaller's own options end. Everything after it is passed to Sherlock. When the run finishes, otinstaller prints a path under `results/` in the folder where you ran the command. That file is the tool's output.
|
|
88
|
+
|
|
89
|
+
To try a different tool, use its name from the guide in place of `sherlock`.
|
|
90
|
+
|
|
91
|
+
## Typed inputs
|
|
92
|
+
|
|
93
|
+
Instead of remembering each tool's flags, you can use typed input prefixes:
|
|
94
|
+
|
|
95
|
+
- `u:` username (e.g., `u:johndoe`)
|
|
96
|
+
- `e:` email (e.g., `e:john@example.com`)
|
|
97
|
+
- `p:` phone (e.g., `p:+15551234567`)
|
|
98
|
+
- `d:` domain (e.g., `d:example.com`)
|
|
99
|
+
- `url:` URL (e.g., `url:https://example.com`)
|
|
100
|
+
- `q:` text query (e.g., `q:search terms`)
|
|
101
|
+
- `geo:` coordinates (e.g., `geo:32.22,-110.97`)
|
|
102
|
+
- `tg:` Telegram channel (e.g., `tg:channelname`)
|
|
103
|
+
- `lat:` latitude (e.g., `lat:37.7749`)
|
|
104
|
+
- `lng:` longitude (e.g., `lng:-122.4194`)
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
otinstaller run sherlock -- u:johndoe
|
|
110
|
+
otinstaller run ghunt -- u:johndoe e:john@example.com
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Each tool declares which input types it supports. Use `otinstaller info <tool>` to see the mapping.
|
|
114
|
+
|
|
115
|
+
## All mode
|
|
116
|
+
|
|
117
|
+
Run every installed tool that supports a given input type:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
otinstaller run --all u:johndoe
|
|
121
|
+
otinstaller run -a u:johndoe e:john@example.com
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Only `u`, `e`, `p`, `d`, and `url` work with `--all`. Tools requiring API credentials are skipped unless `--include-credentialed` is passed.
|
|
125
|
+
|
|
126
|
+
## Agent-friendly usage
|
|
127
|
+
|
|
128
|
+
Every command supports `--json` for machine-readable output. Commands never prompt when `--yes` or `-y` is given, or when stdin is not a terminal (CI mode). Exit codes are stable: 0 = success, 1 = error, 2 = invalid input, 130 = interrupted.
|
|
129
|
+
|
|
130
|
+
Command reference:
|
|
131
|
+
|
|
132
|
+
- `otinstaller init` — Initialize config and directories
|
|
133
|
+
- `otinstaller install <tool>...` — Install tools
|
|
134
|
+
- `otinstaller remove <tool>...` / `--all` — Remove tools
|
|
135
|
+
- `otinstaller run <tool>... -- <args>` — Run tools
|
|
136
|
+
- `otinstaller run --all u:...` — Run all matching tools
|
|
137
|
+
- `otinstaller info <tool>` — Show tool details
|
|
138
|
+
- `otinstaller list` / `--installed` — List tools
|
|
139
|
+
- `otinstaller search <query>` — Search tools
|
|
140
|
+
- `otinstaller update` / `--all` / `--check-only` — Update tools
|
|
141
|
+
- `otinstaller check-updates` — Check for updates (read-only)
|
|
142
|
+
- `otinstaller auto <target>` — Auto-detect type and run tools
|
|
143
|
+
- `otinstaller example <tool>` — Show example output
|
|
144
|
+
- `otinstaller keys check` — Check API keys
|
|
145
|
+
- `otinstaller resume` — Resume interrupted jobs
|
|
146
|
+
- `otinstaller doctor` — Run diagnostics
|
|
147
|
+
|
|
148
|
+
For AI agents: see `llms.txt` at the repository root.
|
|
149
|
+
|
|
150
|
+
## Results
|
|
151
|
+
|
|
152
|
+
Results are saved automatically to `./results/<tool>/<target>/` using the filename pattern `<YYYYmmdd-HHMMSS>_<tool>_<target>_<runid>.<ext>` plus a `.meta.json` sidecar. The results directory can be overridden with `--output` or `OTINSTALLER_RESULTS_DIR`.
|
|
153
|
+
|
|
154
|
+
Example:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
results/sherlock/testuser/20260929-123456_sherlock_testuser_abc123.txt
|
|
158
|
+
results/sherlock/testuser/20260929-123456_sherlock_testuser_abc123.meta.json
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## API keys
|
|
162
|
+
|
|
163
|
+
One env file holds all API keys: `~/.otinstaller/.env`, permissions 600. Each tool only receives the keys it declares in its registry entry. Use `otinstaller keys check` to verify.
|
|
164
|
+
|
|
165
|
+
## Resume
|
|
166
|
+
|
|
167
|
+
If a run or install is interrupted (crash, Ctrl+C, kill), otinstaller keeps a job marker in `~/.otinstaller/jobs/`. Run `otinstaller resume` to detect and handle interrupted jobs:
|
|
168
|
+
|
|
169
|
+
- For installs: cleans up partial state and retries the install.
|
|
170
|
+
- For runs: reports the interrupted run and prints the command to rerun manually.
|
|
171
|
+
|
|
172
|
+
Use `otinstaller resume --dry-run` to see what would happen without making changes. Use `--json` for machine-readable output.
|
|
173
|
+
|
|
174
|
+
Finished jobs are skipped on resume (their marker is removed on completion). Partial output from interrupted runs is always kept in the results directory.
|
|
175
|
+
|
|
176
|
+
## Dual-use tools and responsible use
|
|
177
|
+
|
|
178
|
+
Some tools are tagged `dual-use` in the registry. They can be used for legitimate research but also for misuse. Installing a dual-use tool prints a notice and requires confirmation unless `--yes` is given.
|
|
179
|
+
|
|
180
|
+
The global responsible-use notice is accepted on first `otinstaller init`. You can re-read it with `otinstaller init` any time.
|
|
181
|
+
|
|
182
|
+
## Python version caveats
|
|
183
|
+
|
|
184
|
+
Some managed tools do not yet support Python 3.13+. The test matrix covers Python 3.10–3.12. Known affected tools:
|
|
185
|
+
|
|
186
|
+
- `auto-archiver`: requires Python <3.13 (dependency `pdqhash` needs a C++ compiler, no wheel for 3.13+)
|
|
187
|
+
- `telepathy`: requires Python <3.13 (dependency `googletrans`/`httpx` uses removed `cgi` module)
|
|
188
|
+
|
|
189
|
+
If you encounter install failures on Python 3.13+, run otinstaller in a Python 3.12 virtualenv.
|
|
190
|
+
|
|
191
|
+
## License
|
|
192
|
+
|
|
193
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# OTinstaller
|
|
2
|
+
|
|
3
|
+
Install, run, update, and remove open-source command line tools by name.
|
|
4
|
+
|
|
5
|
+
You pick a tool from a list. OTinstaller downloads it into its own folder, runs it, and saves the output. You do not learn a different install method for each tool.
|
|
6
|
+
|
|
7
|
+
Status: early development. Not published to PyPI yet.
|
|
8
|
+
|
|
9
|
+
## What you need
|
|
10
|
+
|
|
11
|
+
A Linux machine. Tested on Ubuntu 22.04 and 24.04, Debian 12, and Arch Linux. Kali Linux is checked by hand before a release.
|
|
12
|
+
|
|
13
|
+
Python 3.10 or newer, git, and the `venv` module. On Debian, Ubuntu and Kali, install that module with:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
sudo apt install python3-venv git
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Note: Some managed tools do not yet support Python 3.13+. The test matrix covers Python 3.10–3.12. If you encounter install failures on newer Python versions, try running otinstaller in a Python 3.12 virtualenv.
|
|
20
|
+
|
|
21
|
+
## Install otinstaller
|
|
22
|
+
|
|
23
|
+
These commands install otinstaller itself. Run them in this repository's folder. A virtualenv is a private Python folder, so this install does not change the Python that came with the system.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
python3 -m venv .venv
|
|
27
|
+
source .venv/bin/activate
|
|
28
|
+
pip install -e .
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`otinstaller` should now be on your path. A new terminal does not keep that. Run `source .venv/bin/activate` again from this folder if the next command says `otinstaller: command not found`.
|
|
32
|
+
|
|
33
|
+
For system-wide installation, use `pipx install otinstaller` (or `pipx install .` from this directory). This provides the `otinstaller` and `ot` commands on your PATH without a virtualenv.
|
|
34
|
+
|
|
35
|
+
Check the machine with:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
otinstaller doctor
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`doctor` prints `[ok]` or `[problem]` for Linux, Python, git, and venv. Fix any `[problem]` line before you continue. It often tells you the package to install.
|
|
42
|
+
|
|
43
|
+
## Run your first tool
|
|
44
|
+
|
|
45
|
+
`init` creates `~/.otinstaller/` and shows a responsible-use notice. It asks `Do you accept? [y/N]`. Type `y` and press Enter. Nothing can be installed until you do.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
otinstaller init
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Sherlock searches for a username. This install asks `Install? [y/N]`. The capital N means Enter alone means no. Type `y` to continue.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
otinstaller install sherlock
|
|
55
|
+
otinstaller run sherlock -- someexampleuser123
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The `--` marks where otinstaller's own options end. Everything after it is passed to Sherlock. When the run finishes, otinstaller prints a path under `results/` in the folder where you ran the command. That file is the tool's output.
|
|
59
|
+
|
|
60
|
+
To try a different tool, use its name from the guide in place of `sherlock`.
|
|
61
|
+
|
|
62
|
+
## Typed inputs
|
|
63
|
+
|
|
64
|
+
Instead of remembering each tool's flags, you can use typed input prefixes:
|
|
65
|
+
|
|
66
|
+
- `u:` username (e.g., `u:johndoe`)
|
|
67
|
+
- `e:` email (e.g., `e:john@example.com`)
|
|
68
|
+
- `p:` phone (e.g., `p:+15551234567`)
|
|
69
|
+
- `d:` domain (e.g., `d:example.com`)
|
|
70
|
+
- `url:` URL (e.g., `url:https://example.com`)
|
|
71
|
+
- `q:` text query (e.g., `q:search terms`)
|
|
72
|
+
- `geo:` coordinates (e.g., `geo:32.22,-110.97`)
|
|
73
|
+
- `tg:` Telegram channel (e.g., `tg:channelname`)
|
|
74
|
+
- `lat:` latitude (e.g., `lat:37.7749`)
|
|
75
|
+
- `lng:` longitude (e.g., `lng:-122.4194`)
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
otinstaller run sherlock -- u:johndoe
|
|
81
|
+
otinstaller run ghunt -- u:johndoe e:john@example.com
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Each tool declares which input types it supports. Use `otinstaller info <tool>` to see the mapping.
|
|
85
|
+
|
|
86
|
+
## All mode
|
|
87
|
+
|
|
88
|
+
Run every installed tool that supports a given input type:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
otinstaller run --all u:johndoe
|
|
92
|
+
otinstaller run -a u:johndoe e:john@example.com
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Only `u`, `e`, `p`, `d`, and `url` work with `--all`. Tools requiring API credentials are skipped unless `--include-credentialed` is passed.
|
|
96
|
+
|
|
97
|
+
## Agent-friendly usage
|
|
98
|
+
|
|
99
|
+
Every command supports `--json` for machine-readable output. Commands never prompt when `--yes` or `-y` is given, or when stdin is not a terminal (CI mode). Exit codes are stable: 0 = success, 1 = error, 2 = invalid input, 130 = interrupted.
|
|
100
|
+
|
|
101
|
+
Command reference:
|
|
102
|
+
|
|
103
|
+
- `otinstaller init` — Initialize config and directories
|
|
104
|
+
- `otinstaller install <tool>...` — Install tools
|
|
105
|
+
- `otinstaller remove <tool>...` / `--all` — Remove tools
|
|
106
|
+
- `otinstaller run <tool>... -- <args>` — Run tools
|
|
107
|
+
- `otinstaller run --all u:...` — Run all matching tools
|
|
108
|
+
- `otinstaller info <tool>` — Show tool details
|
|
109
|
+
- `otinstaller list` / `--installed` — List tools
|
|
110
|
+
- `otinstaller search <query>` — Search tools
|
|
111
|
+
- `otinstaller update` / `--all` / `--check-only` — Update tools
|
|
112
|
+
- `otinstaller check-updates` — Check for updates (read-only)
|
|
113
|
+
- `otinstaller auto <target>` — Auto-detect type and run tools
|
|
114
|
+
- `otinstaller example <tool>` — Show example output
|
|
115
|
+
- `otinstaller keys check` — Check API keys
|
|
116
|
+
- `otinstaller resume` — Resume interrupted jobs
|
|
117
|
+
- `otinstaller doctor` — Run diagnostics
|
|
118
|
+
|
|
119
|
+
For AI agents: see `llms.txt` at the repository root.
|
|
120
|
+
|
|
121
|
+
## Results
|
|
122
|
+
|
|
123
|
+
Results are saved automatically to `./results/<tool>/<target>/` using the filename pattern `<YYYYmmdd-HHMMSS>_<tool>_<target>_<runid>.<ext>` plus a `.meta.json` sidecar. The results directory can be overridden with `--output` or `OTINSTALLER_RESULTS_DIR`.
|
|
124
|
+
|
|
125
|
+
Example:
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
results/sherlock/testuser/20260929-123456_sherlock_testuser_abc123.txt
|
|
129
|
+
results/sherlock/testuser/20260929-123456_sherlock_testuser_abc123.meta.json
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## API keys
|
|
133
|
+
|
|
134
|
+
One env file holds all API keys: `~/.otinstaller/.env`, permissions 600. Each tool only receives the keys it declares in its registry entry. Use `otinstaller keys check` to verify.
|
|
135
|
+
|
|
136
|
+
## Resume
|
|
137
|
+
|
|
138
|
+
If a run or install is interrupted (crash, Ctrl+C, kill), otinstaller keeps a job marker in `~/.otinstaller/jobs/`. Run `otinstaller resume` to detect and handle interrupted jobs:
|
|
139
|
+
|
|
140
|
+
- For installs: cleans up partial state and retries the install.
|
|
141
|
+
- For runs: reports the interrupted run and prints the command to rerun manually.
|
|
142
|
+
|
|
143
|
+
Use `otinstaller resume --dry-run` to see what would happen without making changes. Use `--json` for machine-readable output.
|
|
144
|
+
|
|
145
|
+
Finished jobs are skipped on resume (their marker is removed on completion). Partial output from interrupted runs is always kept in the results directory.
|
|
146
|
+
|
|
147
|
+
## Dual-use tools and responsible use
|
|
148
|
+
|
|
149
|
+
Some tools are tagged `dual-use` in the registry. They can be used for legitimate research but also for misuse. Installing a dual-use tool prints a notice and requires confirmation unless `--yes` is given.
|
|
150
|
+
|
|
151
|
+
The global responsible-use notice is accepted on first `otinstaller init`. You can re-read it with `otinstaller init` any time.
|
|
152
|
+
|
|
153
|
+
## Python version caveats
|
|
154
|
+
|
|
155
|
+
Some managed tools do not yet support Python 3.13+. The test matrix covers Python 3.10–3.12. Known affected tools:
|
|
156
|
+
|
|
157
|
+
- `auto-archiver`: requires Python <3.13 (dependency `pdqhash` needs a C++ compiler, no wheel for 3.13+)
|
|
158
|
+
- `telepathy`: requires Python <3.13 (dependency `googletrans`/`httpx` uses removed `cgi` module)
|
|
159
|
+
|
|
160
|
+
If you encounter install failures on Python 3.13+, run otinstaller in a Python 3.12 virtualenv.
|
|
161
|
+
|
|
162
|
+
## License
|
|
163
|
+
|
|
164
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Decisions
|
|
2
|
+
|
|
3
|
+
- The CLI does not apply the denylist at runtime; the registry pipeline applies it before publishing.
|
|
4
|
+
- Virtual environments are created in their final location (tools/<name>/venv/) because venv scripts embed absolute paths.
|
|
5
|
+
- The "commit" column in the state database was renamed to "commit_hash" to avoid SQLite reserved word conflicts.
|
|
6
|
+
- The notice acceptance file (accepted.json) stores the version and timestamp; changing the notice version requires re-acceptance.
|
|
7
|
+
- The .env file permissions are fixed to 600 on init if they are looser.
|
|
8
|
+
- The count line in list and search uses singular "tool" for 1, plural "tools" otherwise.
|
|
9
|
+
- Each tool gets its own virtualenv; no shared environments.
|
|
10
|
+
- Tools run on the same Python that runs otinstaller.
|
|
11
|
+
- otinstaller supports Linux only; install, remove, and run commands check sys.platform and exit with an error on other platforms.
|
|
12
|
+
- airecon passed verification but was deferred from launch because it requires Docker and Ollama, which otinstaller cannot check for yet; revisit once a `requires` field / dependency-check exists in the registry schema.
|