docs: add GIF of new TUI (#386)

This commit is contained in:
Brendan Le Glaunec
2026-01-27 23:25:26 +01:00
committed by Brendan Le Glaunec
parent bf720fcea2
commit 99c2e55ec4
3 changed files with 12 additions and 6 deletions
+6 -3
View File
@@ -8,7 +8,7 @@
<img src="https://img.shields.io/docker/pulls/ullaakut/cameradar.svg?style=flat" /> <img src="https://img.shields.io/docker/pulls/ullaakut/cameradar.svg?style=flat" />
</a> </a>
<a href="https://github.com/Ullaakut/cameradar/actions"> <a href="https://github.com/Ullaakut/cameradar/actions">
<img src="https://img.shields.io/github/actions/workflow/status/Ullaakut/cameradar/build" /> <img src="https://img.shields.io/github/actions/workflow/status/Ullaakut/cameradar/build.yaml" />
</a> </a>
<a href='https://coveralls.io/github/Ullaakut/cameradar?branch=master'> <a href='https://coveralls.io/github/Ullaakut/cameradar?branch=master'>
<img src='https://coveralls.io/repos/github/Ullaakut/cameradar/badge.svg?branch=master' alt='Coverage Status' /> <img src='https://coveralls.io/repos/github/Ullaakut/cameradar/badge.svg?branch=master' alt='Coverage Status' />
@@ -24,10 +24,9 @@
</a> </a>
</p> </p>
## An RTSP stream access tool with a Go library ## RTSP stream access tool
Cameradar scans RTSP endpoints on authorized targets, and uses dictionary attacks to bruteforce their credentials and routes. Cameradar scans RTSP endpoints on authorized targets, and uses dictionary attacks to bruteforce their credentials and routes.
Use the CLI for end-to-end scanning or import the library in Go code.
### What Cameradar does ### What Cameradar does
@@ -56,6 +55,10 @@ Use the CLI for end-to-end scanning or import the library in Go code.
- [Examples](#examples) - [Examples](#examples)
- [License](#license) - [License](#license)
---
<p align="center"><img src="images/example.gif"/></p>
## Quick start with Docker ## Quick start with Docker
Install [Docker](https://docs.docker.com/engine/installation/) and run: Install [Docker](https://docs.docker.com/engine/installation/) and run:
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

+6 -3
View File
@@ -13,7 +13,6 @@ import (
func TestNew_ExpandsTargetsAndPorts(t *testing.T) { func TestNew_ExpandsTargetsAndPorts(t *testing.T) {
targets := []string{ targets := []string{
"192.0.2.0/30", "192.0.2.0/30",
"localhost",
"192.0.2.15", "192.0.2.15",
"192.0.2.10-11", "192.0.2.10-11",
} }
@@ -25,7 +24,6 @@ func TestNew_ExpandsTargetsAndPorts(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
addrs := []netip.Addr{ addrs := []netip.Addr{
netip.MustParseAddr("127.0.0.1"),
netip.MustParseAddr("192.0.2.0"), netip.MustParseAddr("192.0.2.0"),
netip.MustParseAddr("192.0.2.1"), netip.MustParseAddr("192.0.2.1"),
netip.MustParseAddr("192.0.2.2"), netip.MustParseAddr("192.0.2.2"),
@@ -92,7 +90,12 @@ func TestNew_ResolvesHostnames(t *testing.T) {
streams, err := scanner.Scan(t.Context()) streams, err := scanner.Scan(t.Context())
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, streams) require.NotEmpty(t, streams)
assert.Equal(t, netip.MustParseAddr("127.0.0.1"), streams[0].Address) addr := streams[0].Address
assert.True(t,
addr == netip.MustParseAddr("127.0.0.1") || addr == netip.MustParseAddr("::1"),
"expected localhost to resolve to 127.0.0.1 or ::1, got %s",
addr.String(),
)
} }
func TestNew_ReturnsErrorOnHostnameLookupFailure(t *testing.T) { func TestNew_ReturnsErrorOnHostnameLookupFailure(t *testing.T) {