Files
s5p/TASKS.md
user 7dc3926f48 feat: multi-listener with configurable proxy chaining
Each listener binds to its own port with an independent chain.
The "pool" keyword in a chain appends a random alive proxy from
the shared pool; multiple pool entries = multiple hops.

  :1080 -> Tor only (0 pool hops)
  :1081 -> Tor + 1 pool proxy
  :1082 -> Tor + 2 pool proxies

Shared resources (ProxyPool, Tor, metrics, semaphore, API) are
reused across listeners. FirstHopPool is shared per unique first
hop. Backward compatible: old listen/chain format still works.
2026-02-17 22:03:37 +01:00

55 lines
2.4 KiB
Markdown

# s5p -- Tasks
## Current
- [x] Scaffold project structure
- [x] Implement SOCKS5 server
- [x] Implement protocol handshakes (SOCKS5, SOCKS4/4a, HTTP CONNECT)
- [x] Implement chain builder
- [x] CLI and config loading
- [x] Unit tests (config, proto)
- [x] Documentation
- [x] Smoke test with Tor
- [x] Containerfile + compose.yaml (Alpine)
- [x] Graceful SIGTERM shutdown
- [x] cProfile support (`--cprofile`)
- [x] Config split (example.yaml tracked, s5p.yaml gitignored)
- [x] Dynamic proxy source API integration
- [x] Connection retry with proxy rotation
- [x] Connection metrics (periodic + shutdown logging)
- [x] Managed proxy pool (multi-source, health-tested, persistent)
- [x] Weighted proxy selection (prefer recently-tested proxies)
- [x] Per-proxy backoff (60s cooldown after connection failure)
- [x] Stale proxy expiry (evict dead proxies not seen for 3 refresh cycles)
- [x] Pool stats in periodic metrics log (`pool=alive/total`)
- [x] Fast warm start (trust cached state, defer all health tests)
- [x] Static chain health check (skip pool tests if chain unreachable)
- [x] SIGHUP hot config reload (timeout, retries, log_level, pool config)
- [x] Dead proxy reporting (`report_url` POST evicted proxies to API)
- [x] Concurrent connection semaphore (`max_connections`, CLI `-m`)
- [x] Async HTTP client (replace blocking urllib, parallel source fetch)
- [x] First-hop TCP connection pool (`pool_size`, `pool_max_idle`)
- [x] Codebase consolidation (refactor/codebase-consolidation)
- [x] Extract shared proxy parsing and constants to config.py
- [x] Consolidate health-check HTTP logic in pool
- [x] Remove threading from metrics (pure asyncio, no lock needed)
- [x] Replace `ensure_future` with `create_task`
- [x] Rename ambiguous variables in config loader
- [x] Remove legacy ProxySource layer (source.py deleted)
- [x] Add tests for extracted `parse_api_proxies`
- [x] Instant warm start (trust cached state, defer all health tests)
- [x] Register signal handlers before startup (fix SIGKILL on stop)
- [x] Use k8s-file logging driver with rotation
- [x] Built-in control API (`api.py`, `--api`, `api_listen`)
- [x] Tor control port integration (NEWNYM signaling, periodic rotation)
- [x] Replace HTTP health check with TLS handshake (round-robin targets, no httpbin dependency)
- [x] Multi-listener with configurable proxy chaining (per-port chain depth)
## Next
- [ ] Integration tests with mock proxy server
- [ ] SOCKS5 server-side authentication