Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f586940b6c | |||
| bcb8933261 | |||
| 73542f9efe | |||
| a3695e3e6a | |||
| ba9da112db | |||
| 1b91e5441f | |||
| d73878a1e1 | |||
| 1cc3eaa0fa | |||
| bf65c3cf45 | |||
| 456a1508c0 | |||
| 3991f1625f | |||
| 4c1493506d | |||
| 80e75061da | |||
| 5b48737cc7 | |||
| da2dac70ac | |||
| 8c8ea1209b | |||
| df3718a06c |
+1
-1
@@ -26,7 +26,7 @@ RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/main' >> /etc/apk/repositori
|
|||||||
RUN apk --update add --no-cache nmap \
|
RUN apk --update add --no-cache nmap \
|
||||||
nmap-nselibs \
|
nmap-nselibs \
|
||||||
nmap-scripts \
|
nmap-scripts \
|
||||||
curl-dev==7.64.0-r3
|
curl-dev==7.64.0-r5
|
||||||
|
|
||||||
WORKDIR /app/cameradar
|
WORKDIR /app/cameradar
|
||||||
COPY --from=build-env /go/src/github.com/Ullaakut/cameradar/dictionaries/ /app/dictionaries/
|
COPY --from=build-env /go/src/github.com/Ullaakut/cameradar/dictionaries/ /app/dictionaries/
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ e.g.: `docker run -t ullaakut/cameradar -t 192.168.100.0/24` will scan the ports
|
|||||||
|
|
||||||
Only use this solution if for some reason using docker is not an option for you or if you want to locally build Cameradar on your machine.
|
Only use this solution if for some reason using docker is not an option for you or if you want to locally build Cameradar on your machine.
|
||||||
|
|
||||||
|
**WARNING**: Manually building the binary will **NOT WORK** for any camera that uses **DIGEST AUTHENTICATION** [if your version of `curl` is over `7.64.0`](https://github.com/Ullaakut/cameradar/pull/252), which is most likely the case. For more information, see [this response on the subject from the author of curl](https://stackoverflow.com/a/59778142/4145098).
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
|
|
||||||
* `go` (> `1.10`)
|
* `go` (> `1.10`)
|
||||||
@@ -84,10 +86,7 @@ Only use this solution if for some reason using docker is not an option for you
|
|||||||
|
|
||||||
### Steps to install
|
### Steps to install
|
||||||
|
|
||||||
1. `go get github.com/Ullaakut/cameradar/v5`
|
1. `go install github.com/Ullaakut/cameradar/v5/cmd/cameradar@latest`
|
||||||
2. `cd $GOPATH/src/github.com/Ullaakut/cameradar`
|
|
||||||
3. `cd cmd/cameradar`
|
|
||||||
4. `go install`
|
|
||||||
|
|
||||||
The `cameradar` binary is now in your `$GOPATH/bin` ready to be used. See command line options [here](#command-line-options).
|
The `cameradar` binary is now in your `$GOPATH/bin` ready to be used. See command line options [here](#command-line-options).
|
||||||
|
|
||||||
@@ -207,13 +206,13 @@ Default: `false`
|
|||||||
|
|
||||||
#### Docker build
|
#### Docker build
|
||||||
|
|
||||||
To build the docker image, simply run `docker build -t . cameradar` in the root of the project.
|
To build the docker image, simply run `docker build . -t cameradar` in the root of the project.
|
||||||
|
|
||||||
Your image will be called `cameradar` and NOT `ullaakut/cameradar`.
|
Your image will be called `cameradar` and NOT `ullaakut/cameradar`.
|
||||||
|
|
||||||
#### Go build
|
#### Go build
|
||||||
|
|
||||||
1. `go get github.com/Ullaakut/cameradar/v5`
|
1. `go get github.com/Ullaakut/cameradar`
|
||||||
2. `cd $GOPATH/src/github.com/Ullaakut/cameradar`
|
2. `cd $GOPATH/src/github.com/Ullaakut/cameradar`
|
||||||
3. `cd cmd/cameradar`
|
3. `cd cmd/cameradar`
|
||||||
4. `go install`
|
4. `go install`
|
||||||
@@ -236,7 +235,7 @@ You can still find it under the 1.1.4 tag on this repo, however it was slower an
|
|||||||
|
|
||||||
> How to use the Cameradar library for my own project?
|
> How to use the Cameradar library for my own project?
|
||||||
|
|
||||||
See the example in `/cmd/cameradar`. You just need to run `go get github.com/Ullaakut/cameradar/v5` and to use the `cameradar` package in your code. You can find the documentation on [godoc](https://godoc.org/github.com/ullaakut/cameradar).
|
See the example in `/cmd/cameradar`. You just need to run `go get github.com/Ullaakut/cameradar` and to use the `cameradar` package in your code. You can find the documentation on [godoc](https://godoc.org/github.com/ullaakut/cameradar).
|
||||||
|
|
||||||
> I want to scan my own localhost for some reason, and it does not work! What's going on?
|
> I want to scan my own localhost for some reason, and it does not work! What's going on?
|
||||||
|
|
||||||
@@ -270,7 +269,7 @@ Cameradar supports both basic and digest authentication.
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Copyright 2019 Ullaakut
|
Copyright 2023 Ullaakut
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
+289
@@ -0,0 +1,289 @@
|
|||||||
|
# Cameradar
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="images/Cameradar.gif" width="100%"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="#license">
|
||||||
|
<img src="https://img.shields.io/badge/license-Apache-blue.svg?style=flat" />
|
||||||
|
</a>
|
||||||
|
<a href="https://hub.docker.com/r/ullaakut/cameradar/">
|
||||||
|
<img src="https://img.shields.io/docker/pulls/ullaakut/cameradar.svg?style=flat" />
|
||||||
|
</a>
|
||||||
|
<a href="https://travis-ci.org/Ullaakut/cameradar">
|
||||||
|
<img src="https://travis-ci.org/Ullaakut/cameradar.svg?branch=master" />
|
||||||
|
</a>
|
||||||
|
<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' />
|
||||||
|
</a>
|
||||||
|
<a href="https://golangci.com/r/github.com/ullaakut/cameradar">
|
||||||
|
<img src="https://golangci.com/badges/github.com/ullaakut/cameradar.svg" />
|
||||||
|
</a>
|
||||||
|
<a href="https://goreportcard.com/report/github.com/ullaakut/cameradar">
|
||||||
|
<img src="https://goreportcard.com/badge/github.com/ullaakut/cameradar" />
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ullaakut/cameradar/releases/latest">
|
||||||
|
<img src="https://img.shields.io/github/release/Ullaakut/cameradar.svg?style=flat" />
|
||||||
|
</a>
|
||||||
|
<a href="https://godoc.org/github.com/ullaakut/cameradar">
|
||||||
|
<img src="https://godoc.org/github.com/ullaakut/cameradar?status.svg" />
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## RTSP stream потоковы протокол со своей библиотекой
|
||||||
|
|
||||||
|
### Возможности Cameradar
|
||||||
|
|
||||||
|
* **Обнаружить открытые RTSP-хосты** на любом доступном целевом узле.
|
||||||
|
* Определить, какая модель устройства осуществляет потоковое вещание
|
||||||
|
* Запускать автоматический перебор по словарю для получения **маршрута потока** (например: `/live.sdp`)
|
||||||
|
* Запустить автоматические перебор по словарю для получения **имени пользователя и пароля** камер.
|
||||||
|
* Получить полный и удобный отчет о результатах.
|
||||||
|
|
||||||
|
<p align="center"><img src="images/Cameradar.png" width="250"/></p>
|
||||||
|
|
||||||
|
## Оглавление
|
||||||
|
|
||||||
|
* [Docker Image](#docker-image)
|
||||||
|
* [Зависмости](#configuration)
|
||||||
|
* [Вывод](#output)
|
||||||
|
* [Параметры командной строки](#command-line-options)
|
||||||
|
* [Вклад](#contribution)
|
||||||
|
* [Часто задаваемые вопросы](#frequently-asked-questions)
|
||||||
|
* [Лицензия](#license)
|
||||||
|
|
||||||
|
## Docker для Cameradar
|
||||||
|
|
||||||
|
<p align="center"><img src="images/CameradarV4.png" width="70%"/></p>
|
||||||
|
* У
|
||||||
|
Устоновка [docker](https://docs.docker.com/engine/installation/) на свою машину и запустить команду:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -t ullaakut/cameradar -t <target> <other command-line options>
|
||||||
|
```
|
||||||
|
|
||||||
|
[Параметры командной строки](#command-line-options).
|
||||||
|
|
||||||
|
Пример: `docker run -t ullaakut/cameradar -t 192.168.100.0/24` будет сканировать порты 554, 5554 и 8554 хостов в подсети 192.168.100.0/24 и перебирать обнаруженные RTSP-stream и выводить журнал отладки.
|
||||||
|
*YOUR_TARGET может быть подсетью (например: 172.16.100.0/24), IP (например: 172.16.100.10) или диапазоном IPs (например: 172.16.100.10-20).
|
||||||
|
* Если вы хотите получить точные результаты сканирования nmap в виде XML файла, вы можете добавить `-v /your/path:/tmp/cameradar_scan.xml` в команду docker run, перед `ullaakut/cameradar`.
|
||||||
|
* Если вы используете `-r` и `-c` для указания ваших пользовательских словарей, убедитесь, что вы также используете для добавления их в контейнер docker. Пример: `docker run -t -v /path/to/dictionaries/:/tmp/ ullaakut/cameradar -r /tmp/myroutes -c /tmp/mycredentials.json -t mytarget`.
|
||||||
|
|
||||||
|
## Бинарная устоновка
|
||||||
|
Решение локального Camader без использование docker.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
**WARNING**: Бинарная устновка **НЕ БУДЕТ РАБОТАТЬ** для камер, которые используют **DIGEST AUTHENTICATION** [если ваша версия `curl` старше `7.64.0`](https://github.com/Ullaakut/cameradar/pull/252), то скорее всего, так и есть. Дополнильная информация [this response on the subject from the author of curl](https://stackoverflow.com/a/59778142/4145098).
|
||||||
|
|
||||||
|
### Зависимости
|
||||||
|
|
||||||
|
* `go` (> `1.10`)
|
||||||
|
* `libcurl` библиотека (**[version has to be <7.66.0](https://github.com/Ullaakut/cameradar/issues/247)**)
|
||||||
|
* Для apt: `apt install libcurl4-openssl-dev`
|
||||||
|
|
||||||
|
### Этапы устоновки
|
||||||
|
|
||||||
|
1. `go install github.com/Ullaakut/cameradar/v5/cmd/cameradar@latest`
|
||||||
|
|
||||||
|
Бинарный файл `cameradar` находится здесь `$GOPATH/bin` и готов к использованию. Опции командной строки [здесь](#command-line-options).
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
Порт **RTSP, используемый для большинства камер, 554**, поэтому указываем 554 в качестве одного из сканируемых портов. Если не прописать порты в приложении cameradar, оно будет искать порты 554, 5554 и 8554.
|
||||||
|
|
||||||
|
`docker run -t --net=host ullaakut/cameradar -p "18554,19000-19010" -t localhost` будет сканировать порты `18554`, и диапазон портов между `19000` и `19010` на `localhost`.
|
||||||
|
|
||||||
|
Вы **можете использовать свои собственные файлы для словарей учетных данных и маршрутов**, используемых для атаки на камеры, но репозиторий Cameradar уже предоставляет вам хорошую базу, которая работает с большинством камер, в папке `/dictionaries`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -t -v /my/folder/with/dictionaries:/tmp/dictionaries \
|
||||||
|
ullaakut/cameradar \
|
||||||
|
-r "/tmp/dictionaries/my_routes" \
|
||||||
|
-c "/tmp/dictionaries/my_credentials.json" \
|
||||||
|
-t 172.19.124.0/24
|
||||||
|
```
|
||||||
|
|
||||||
|
Это поместит содержимое вашей папки со словарями в образ докера и будет использовать его для перебора словаря, вместо словарей по умолчанию, предоставленных в репозитории cameradar.
|
||||||
|
|
||||||
|
## Доступ камеры
|
||||||
|
|
||||||
|
Если у вас есть [VLC Media Playe](http://www.videolan.org/vlc/), у вас есть возможность использовать графический интерфейс или командную строку для подключения к потоку RTSP, для этого используется этот формат `rtsp://username:password@address:port/route`.
|
||||||
|
|
||||||
|
## Опции командной строки
|
||||||
|
|
||||||
|
* ** "-t, --targets "**: Устанавливаем цель.Целью может быть файл (см. [инструкции по форматированию файла](#format-input-file)), IP, диапазон IP, подсеть или их комбинация. Пример: `--targets="192.168.1.72,192.168.1.74"`
|
||||||
|
* ** "-p, --ports "**: (По умолчанию: `554,5554,8554`) Устанавливаем пользовательские порты.
|
||||||
|
* ** "-s, --scan-speed "**: (По умолчанию: `4`) Установка пользовательских настроек обнаружения nmap для повышения скорости или точности. Рекомендуется уменьшить это значение, если вы пытаетесь сканировать нестабильную и медленную сеть, или увеличить его, если вы работаете в очень производительной и надежной сети. Вы также можете оставить значение низким, чтобы уменшить вероятность обнуружения. Смотрите [здесь более подробная информация о шаблонах синхронизации nmap] (https://nmap.org/book/man-performance.html).
|
||||||
|
* ** "-I, --attack-interval "**: (По умолчанию: `0ms`) Задает пользовательский интервал, после которого попытка атаки без ответа должна прекратиться. Рекомендуется увеличить его при попытке сканирования нестабильных и медленных сетей или уменьшить в быстрых и надежных сетях.
|
||||||
|
* ** "-T, --timeout "**: (По умолчанию: `2000 мс`) Задает пользовательское значение тайм-аута, после которого попытка атаки без ответа должна прекратиться. Рекомендуется увеличить это значение при попытке сканирования нестабильных и медленных сетей или уменьшить его в быстрых и надежных сетях.
|
||||||
|
* ** "-r, --custom-routes "**: (По умолчанию: `<CAMERADAR_GOPATH>/dictionaries/routes`) Устанавливает путь к пользовательскому словарю для маршрутов.
|
||||||
|
* ** "-c, --custom-credentials "**: (По умолчанию: `<CAMERADAR_GOPATH>/dictionaries/credentials.json`) Устанавливает путь к пользовательскому словарю для учетных данных
|
||||||
|
* ** "-o, --nmap-output "**: (По умолчанию: `/tmp/cameradar_scan.xml`) устанавливаем путь вывода nmap.
|
||||||
|
* **"-d, --debug "**: Включаем журналы отладки
|
||||||
|
* **"-v, --verbose "**: Включаем журналы curl (не рекомендуется для большинства пользователей)
|
||||||
|
* **"-h "**: Отображаем использованную информацию
|
||||||
|
|
||||||
|
## Форматирование входного файла
|
||||||
|
|
||||||
|
Файл может содержать IP-адреса, имена хостов, диапазоны IP-адресов и подсети, разделенные на строки. Например:
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.0.0.0
|
||||||
|
localhost
|
||||||
|
192.17.0.0/16
|
||||||
|
192.168.1.140-255
|
||||||
|
192.168.2-3.0-255
|
||||||
|
```
|
||||||
|
|
||||||
|
## Переменные среды
|
||||||
|
|
||||||
|
### `CAMERADAR_TARGET`
|
||||||
|
|
||||||
|
Эта переменная обязательная и указывает цель, которую cameradar должен сканировать и пытаться получить доступ к потокам RTSP.
|
||||||
|
|
||||||
|
Например:
|
||||||
|
|
||||||
|
* `172.16.100.0/24`
|
||||||
|
* `192.168.1.1`
|
||||||
|
* `localhost`
|
||||||
|
* `192.168.1.140-255`
|
||||||
|
* `192.168.2-3.0-255`
|
||||||
|
|
||||||
|
### `CAMERADAR_PORTS`
|
||||||
|
|
||||||
|
Эта переменная не обязательная,нужна для того, чтоб указать сканируемые порты
|
||||||
|
|
||||||
|
Значение по умолчанию `554,5554,8554`
|
||||||
|
|
||||||
|
Рекомендуется не изменять их, кроме случаев, когда вы уверены, что камеры были настроены на передачу RTSP через другой порт. 99,9% камер передают поток через эти порты.
|
||||||
|
|
||||||
|
### `CAMERADAR_NMAP_OUTPUT_FILE`
|
||||||
|
|
||||||
|
Эта переменная является необязательной и позволяет указать, в какой файл nmap будет записывать свой вывод.
|
||||||
|
|
||||||
|
Значение по умолчанию: `/tmp/cameradar_scan.xml`
|
||||||
|
|
||||||
|
Это может быть полезно, только для самотятельного чтения файлов, если вы не хотите, чтобы он записывал данные в вашу папку `/tmp`, или если вы хотите использовать только функцию RunNmap в cameradar, и делать ее разбор вручную.
|
||||||
|
|
||||||
|
### `CAMERADAR_CUSTOM_ROUTES`, `CAMERADAR_CUSTOM_CREDENTIALS`
|
||||||
|
|
||||||
|
Эти переменные являются необязательными и позволяют заменить словари по умолчанию на пользовательские, Это нужно для перебора по словарю.
|
||||||
|
|
||||||
|
Значение по умолчанию: `<CAMERADAR_GOPATH>/dictionaries/routes` and `<CAMERADAR_GOPATH>/dictionaries/credentials.json`
|
||||||
|
|
||||||
|
### `CAMERADAR_SCAN_SPEED`
|
||||||
|
|
||||||
|
Эта опцианальная переменная позволяет установить пользовательские настройки обнаружения nmap для повышения скорости и точности. Рекомендуется уменьшить значение, если вы пытаетесь сканировать нестабильную и медленную сеть, или увеличить, если сеть быстрая и надежная. Дополнительные сведения о временных шаблонах nmap смотреть [здесь](https://nmap.org/book/man-performance.html).
|
||||||
|
|
||||||
|
Значение по умолчанию: `4`
|
||||||
|
|
||||||
|
### `CAMERADAR_ATTACK_INTERVAL`
|
||||||
|
|
||||||
|
Эта не обязательная переменная позволяет установить `custom interval` между каждой атакой, чтобы оставаться незаметным. Рекомендуется увеличивать его при попытке сканирования сети, которая может быть защищена от атак методом перебора. По умолчанию интервал отсутствует, чтобы сделать атаки как можно более быстрыми.
|
||||||
|
|
||||||
|
Значение по умолчанию: `0ms`
|
||||||
|
|
||||||
|
### `CAMERADAR_TIMEOUT`
|
||||||
|
|
||||||
|
Эта необязательная переменная дает возмоджность установить пользовательское значение тайм-аута, по истечении которого попытка атаки без ответа должна прекратиться. Рекомендуется увеличить это значение при попытке сканирования нестабильных и медленных сетей или уменьшить его в быстрых и надежных сетях.
|
||||||
|
|
||||||
|
Значение по умолчанию: `2000ms`
|
||||||
|
|
||||||
|
### `CAMERADAR_LOGGING`
|
||||||
|
|
||||||
|
Эта необязательная переменная позволяет вам включить более расширенный вывод, чтобы иметь больше информации о процессах.
|
||||||
|
|
||||||
|
Она будет выводить результаты nmap, запросы cURL и т.д.
|
||||||
|
|
||||||
|
Значение по умолчанию: `false`
|
||||||
|
|
||||||
|
## Вклад
|
||||||
|
|
||||||
|
### Сборка
|
||||||
|
|
||||||
|
#### Docker build
|
||||||
|
|
||||||
|
Чтобы собрать образ докера, просто выполните команду `docker build . -t cameradar` в корне проекта.
|
||||||
|
|
||||||
|
Ваше изображение будет называться `cameradar`, а НЕ `ullaakut/cameradar`.
|
||||||
|
|
||||||
|
#### Приступим к сборке
|
||||||
|
|
||||||
|
1. `go get github.com/Ullaakut/cameradar`
|
||||||
|
2. `cd $GOPATH/src/github.com/Ullaakut/cameradar`
|
||||||
|
3. `cd cmd/cameradar`
|
||||||
|
4. `go install`
|
||||||
|
|
||||||
|
Бинарный файл cameradar теперь находится в `$GOPATH/bin/cameradar`.
|
||||||
|
|
||||||
|
## Часто задаваемые вопросы
|
||||||
|
|
||||||
|
> Cameradar не находит не одной камеры!
|
||||||
|
|
||||||
|
Это означает, что либо ваши камеры не передают поток в RTSP, либо их нет на объекте, который вы сканируете. В большинстве случаев камеры видеонаблюдения находятся в частной подсети, изолированной от Интернета. Используйте опцию `-t` для указания цели. Если вы уверены, что все сделали правильно, но это все равно не работает, пожалуйста, откройте проблему с подробной информацией об устройстве, к которому вы пытаетесь получить доступ.
|
||||||
|
|
||||||
|
> Cameradar нашел мои камеры, но не может получить доступ к ним
|
||||||
|
|
||||||
|
Возможно, ваши камеры были настроены, и учетные данные / URL были изменены. Cameradar только угадывает, используя значения конструктора по умолчанию, если не предоставлен пользовательский словарь. Вы можете использовать свои собственные словари, в которые нужно просто добавить ваши учетные данные и маршруты RTSP. Для этого посмотрите, как работает [configuration](#configuration). Также, возможно, учетные данные вашей камеры еще не известны, в таком случае, если вы их найдете, было бы очень хорошо добавить их в словари Cameradar, чтобы помочь другим людям в будущем.
|
||||||
|
|
||||||
|
> Что случилось с версией на C++?
|
||||||
|
|
||||||
|
Вы все еще можете найти его под тегом 1.1.4 в этом репозитории, однако он был медленнее и менее стабилен, чем текущая версия, написанная на Golang. Использовать ее не рекомендуется.
|
||||||
|
|
||||||
|
> Как использовать библиотеку Cameradar для моего собственного проекта?
|
||||||
|
|
||||||
|
Смотрите пример в `/cmd/cameradar`. Вам просто нужно запустить `go get github.com/Ullaakut/cameradar` и использовать пакет `cameradar` в своем коде. Документацию можно найти на [godoc](https://godoc.org/github.com/ullaakut/cameradar).
|
||||||
|
|
||||||
|
> Я почему-то хочу просканировать свой собственный localhost, а он не работает!
|
||||||
|
|
||||||
|
Используйте флаг `--net=host` при запуске образа cameradar, или используйте бинарный файл, выполнив команду `go run cameradar/cameradar.go` или [установив его](#go-build).
|
||||||
|
|
||||||
|
> Я не вижу цветного вывода :(
|
||||||
|
|
||||||
|
Вероятнее вы забыли использовать флаг `-t` перед `ullaakut/cameradar` в вашей командной строке. Это указывается -tty для cameradar, что позволит ему использовать цвета.
|
||||||
|
|
||||||
|
> У меня нет камеры, но я хотел бы попробовать Cameradar!
|
||||||
|
|
||||||
|
Просто воспользуйтесь командой `docker run -p 8554:8554 -e RTSP_USERNAME=admin -e RTSP_PASSWORD=12345 -e RTSP_PORT=8554 ullaakut/rtspatt` и запустите cameradar, и он должен определить, что имя пользователя - admin, а пароль - 12345. Вы можете попробовать это с любыми учетными данными конструктора по умолчанию (их можно найти [здесь](dictionaries/credentials.json)).
|
||||||
|
|
||||||
|
> Какие типы аутентификации поддерживает Cameradar?
|
||||||
|
|
||||||
|
Cameradar поддерживает как базовую, так и дайджест-аутентификацию.
|
||||||
|
|
||||||
|
|
||||||
|
## Примеры
|
||||||
|
|
||||||
|
>> Запуск cameradar на вашей собственной машине для сканирования портов по умолчанию
|
||||||
|
|
||||||
|
`docker run --net=host -t ullaakut/cameradar -t localhost`
|
||||||
|
|
||||||
|
> Запуск cameradar с входным файлом, включение журналов на порту 8554
|
||||||
|
|
||||||
|
`docker run -v /tmp:/tmp --net=host -t ullaakut/cameradar -t /tmp/test.txt -p 8554`
|
||||||
|
|
||||||
|
> Запуск cameradar в подсети с пользовательскими словарями, на портах 554, 5554 и 8554
|
||||||
|
|
||||||
|
`docker run -v /tmp:/tmp --net=host -t ullaakut/cameradar -t 192.168.0.0/24 --custom-credentials="/tmp/dictionaries/credentials.json" --custom-routes="/tmp/dictionaries/routes" -p 554,5554,8554`.
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
|
||||||
|
Copyright 2023 Ullaakut
|
||||||
|
|
||||||
|
Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию
|
||||||
|
данного программного обеспечения и сопутствующих файлов документации ("Программное обеспечение"), совершать сделки с Программным обеспечением без ограничений, включая, без ограничения, права
|
||||||
|
использовать, копировать, изменять, объединять, публиковать, распространять, выдавать сублицензии и/или продавать
|
||||||
|
копии программного обеспечения, а также разрешать лицам, которым предоставляется Программное обеспечение
|
||||||
|
делать это, при соблюдении следующих условий:
|
||||||
|
|
||||||
|
Вышеуказанное уведомление об авторском праве и данное уведомление о разрешении должны быть включены во все
|
||||||
|
копиях или существенных частях Программного обеспечения.
|
||||||
|
|
||||||
|
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ
|
||||||
|
ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОГО СОСТОЯНИЯ,
|
||||||
|
ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ
|
||||||
|
АВТОРЫ ИЛИ ВЛАДЕЛЬЦЫ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ
|
||||||
|
ОТВЕТСТВЕННОСТЬ, БУДЬ ТО В РАМКАХ ДОГОВОРНОГО, ДЕЛИКТНОГО ИЛИ ИНОГО ИСКА, ВОЗНИКАЮЩЕГО
|
||||||
|
ИЗ, В РЕЗУЛЬТАТЕ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ
|
||||||
|
ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
|
||||||
@@ -134,6 +134,8 @@ func (s *Scanner) DetectAuthMethods(targets []Stream) []Stream {
|
|||||||
authMethod = "basic"
|
authMethod = "basic"
|
||||||
case authDigest:
|
case authDigest:
|
||||||
authMethod = "digest"
|
authMethod = "digest"
|
||||||
|
default:
|
||||||
|
authMethod = "unknown:" + string(targets[i].AuthenticationType)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.term.Debugf("Stream %s uses %s authentication method\n", GetCameraRTSPURL(targets[i]), authMethod)
|
s.term.Debugf("Stream %s uses %s authentication method\n", GetCameraRTSPURL(targets[i]), authMethod)
|
||||||
|
|||||||
@@ -10,48 +10,71 @@
|
|||||||
"Administrator",
|
"Administrator",
|
||||||
"aiphone",
|
"aiphone",
|
||||||
"Dinion",
|
"Dinion",
|
||||||
|
"none",
|
||||||
"root",
|
"root",
|
||||||
|
"Root",
|
||||||
"service",
|
"service",
|
||||||
"supervisor",
|
"supervisor",
|
||||||
"ubnt"
|
"ubnt"
|
||||||
],
|
],
|
||||||
"passwords": [
|
"passwords": [
|
||||||
"",
|
"",
|
||||||
|
"0000",
|
||||||
|
"00000",
|
||||||
|
"1111",
|
||||||
"111111",
|
"111111",
|
||||||
"1111111",
|
"1111111",
|
||||||
|
"123",
|
||||||
"1234",
|
"1234",
|
||||||
"12345",
|
"12345",
|
||||||
"123456",
|
"123456",
|
||||||
|
"1234567",
|
||||||
"12345678",
|
"12345678",
|
||||||
|
"123456789",
|
||||||
|
"12345678910",
|
||||||
"4321",
|
"4321",
|
||||||
"666666",
|
"666666",
|
||||||
"6fJjMKYx",
|
"6fJjMKYx",
|
||||||
"888888",
|
"888888",
|
||||||
"9999",
|
"9999",
|
||||||
"admin",
|
"admin",
|
||||||
|
"admin123456",
|
||||||
|
"admin pass",
|
||||||
|
"Admin",
|
||||||
|
"admin123",
|
||||||
"administrator",
|
"administrator",
|
||||||
|
"Administrator",
|
||||||
"aiphone",
|
"aiphone",
|
||||||
"camera",
|
"camera",
|
||||||
|
"Camera",
|
||||||
"fliradmin",
|
"fliradmin",
|
||||||
"GRwvcj8j",
|
"GRwvcj8j",
|
||||||
"hikvision",
|
"hikvision",
|
||||||
"hikadmin",
|
"hikadmin",
|
||||||
|
"HuaWei123",
|
||||||
"ikwd",
|
"ikwd",
|
||||||
"jvc",
|
"jvc",
|
||||||
"kj3TqCWv",
|
"kj3TqCWv",
|
||||||
"meinsm",
|
"meinsm",
|
||||||
"pass",
|
"pass",
|
||||||
|
"Pass",
|
||||||
"password",
|
"password",
|
||||||
"password123",
|
"password123",
|
||||||
|
"qwerty",
|
||||||
|
"qwerty123",
|
||||||
|
"Recorder",
|
||||||
"reolink",
|
"reolink",
|
||||||
"root",
|
"root",
|
||||||
"service",
|
"service",
|
||||||
"supervisor",
|
"supervisor",
|
||||||
|
"support",
|
||||||
"system",
|
"system",
|
||||||
"tlJwpbo6",
|
"tlJwpbo6",
|
||||||
"toor",
|
"toor",
|
||||||
"tp-link",
|
"tp-link",
|
||||||
"ubnt",
|
"ubnt",
|
||||||
|
"user",
|
||||||
|
"wbox",
|
||||||
"wbox123",
|
"wbox123",
|
||||||
"Y5eIMz3C"
|
"Y5eIMz3C"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -66,6 +66,14 @@ ch001.sdp
|
|||||||
ch01.264
|
ch01.264
|
||||||
ch01.264?
|
ch01.264?
|
||||||
ch01.264?ptype=tcp
|
ch01.264?ptype=tcp
|
||||||
|
ch1_0
|
||||||
|
ch2_0
|
||||||
|
ch3_0
|
||||||
|
ch4_0
|
||||||
|
ch1/0
|
||||||
|
ch2/0
|
||||||
|
ch3/0
|
||||||
|
ch4/0
|
||||||
ch0_0.h264
|
ch0_0.h264
|
||||||
ch0_unicast_firststream
|
ch0_unicast_firststream
|
||||||
ch0_unicast_secondstream
|
ch0_unicast_secondstream
|
||||||
@@ -132,6 +140,9 @@ onvif1
|
|||||||
pass@10.0.0.5:6667/blinkhd
|
pass@10.0.0.5:6667/blinkhd
|
||||||
play1.sdp
|
play1.sdp
|
||||||
play2.sdp
|
play2.sdp
|
||||||
|
profile0
|
||||||
|
profile1
|
||||||
|
profile2
|
||||||
profile2/media.smp
|
profile2/media.smp
|
||||||
profile5/media.smp
|
profile5/media.smp
|
||||||
rtpvideo1.sdp
|
rtpvideo1.sdp
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
|
|||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
@@ -139,7 +138,6 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
|||||||
+1
-1
@@ -116,7 +116,7 @@ func (s *Scanner) LoadTargets() error {
|
|||||||
|
|
||||||
s.targets = strings.Split(string(bytes), "\n")
|
s.targets = strings.Split(string(bytes), "\n")
|
||||||
|
|
||||||
s.term.Debugf("Successfylly parsed targets file with %d entries", len(s.targets))
|
s.term.Debugf("Successfully parsed targets file with %d entries", len(s.targets))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,13 +37,12 @@ func (s *Scanner) Scan() ([]Stream, error) {
|
|||||||
|
|
||||||
func (s *Scanner) scan(nmapScanner nmap.ScanRunner) ([]Stream, error) {
|
func (s *Scanner) scan(nmapScanner nmap.ScanRunner) ([]Stream, error) {
|
||||||
results, warnings, err := nmapScanner.Run()
|
results, warnings, err := nmapScanner.Run()
|
||||||
if err != nil {
|
|
||||||
return nil, s.term.FailStepf("error while scanning network: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, warning := range warnings {
|
for _, warning := range warnings {
|
||||||
s.term.Infoln("[Nmap Warning]", warning)
|
s.term.Infoln("[Nmap Warning]", warning)
|
||||||
}
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, s.term.FailStepf("error while scanning network: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// Get streams from nmap results.
|
// Get streams from nmap results.
|
||||||
var streams []Stream
|
var streams []Stream
|
||||||
|
|||||||
@@ -186,6 +186,6 @@ func saveRoutes(rtspURLs []string) {
|
|||||||
disgo.StartStep("Writing new dictionary file")
|
disgo.StartStep("Writing new dictionary file")
|
||||||
err := ioutil.WriteFile("dictionaries/routes", []byte(contents), 0644)
|
err := ioutil.WriteFile("dictionaries/routes", []byte(contents), 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
disgo.FailStepf("unable to write dictionnary: %v", err)
|
disgo.FailStepf("unable to write dictionary: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
module github.com/Ullaakut/cameradar/magefile
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Ullaakut/disgo v0.3.1
|
||||||
|
github.com/fatih/color v1.10.0 // indirect
|
||||||
|
github.com/magefile/mage v1.11.0
|
||||||
|
github.com/stretchr/testify v1.7.0 // indirect
|
||||||
|
)
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
github.com/Ullaakut/disgo v0.3.1 h1:BGGVHynji41KGuGI02ztTCnILRvyzlvmiCRl5bBpjKk=
|
||||||
|
github.com/Ullaakut/disgo v0.3.1/go.mod h1:/CSvpnYVSKOeh2dvUvx9cXshzz2t7T1/lRO/MrFj3fI=
|
||||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
|
||||||
|
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||||
|
github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls=
|
||||||
|
github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
|
||||||
|
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
|
||||||
|
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
|
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||||
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
|
||||||
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
//+build mage
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/magefile/mage/sh"
|
||||||
|
"github.com/Ullaakut/disgo"
|
||||||
|
"github.com/Ullaakut/disgo/style"
|
||||||
|
)
|
||||||
|
|
||||||
|
var supportedPlatforms = map[string]string{
|
||||||
|
"linux/amd64": "ullaakut/cameradar:amd64",
|
||||||
|
"linux/386": "ullaakut/cameradar:386",
|
||||||
|
"linux/arm64": "ullaakut/cameradar:arm64",
|
||||||
|
"linux/arm/v7": "ullaakut/cameradar:armv7",
|
||||||
|
//"linux/riscv64": "ullaakut/cameradar:riscv64", // UNSUPPORTED.
|
||||||
|
//"linux/ppc64le": "ullaakut/cameradar:ppc64le", // UNSUPPORTED.
|
||||||
|
//"linux/s390x": "ullaakut/cameradar:s390x", // UNSUPPORTED.
|
||||||
|
//"linux/arm/v6": "ullaakut/cameradar:armv6", // UNSUPPORTED.
|
||||||
|
}
|
||||||
|
|
||||||
|
var Default = Build
|
||||||
|
|
||||||
|
// Follows https://www.docker.com/blog/multi-platform-docker-builds/.
|
||||||
|
func Build() error {
|
||||||
|
term := disgo.NewTerminal(disgo.WithColors(true))
|
||||||
|
|
||||||
|
term.StartStep("Building images for all platforms")
|
||||||
|
term.Infof("Builds planned for %v\n", supportedPlatforms)
|
||||||
|
for platform, name := range supportedPlatforms {
|
||||||
|
term.Infoln("Building image for", platform, "at", name)
|
||||||
|
|
||||||
|
// docker buildx build --platform linux/arm/v7 -t ullaakut/cameradar:armv7 .
|
||||||
|
if err := sh.Run("docker", "buildx", "build", "--platform", platform, "-t", name, "../../"); err != nil {
|
||||||
|
return term.FailStepf("unable to build image: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
term.Infoln(style.Success("Cross-platform docker build successful."))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Publish() error {
|
||||||
|
term := disgo.NewTerminal(disgo.WithColors(true))
|
||||||
|
|
||||||
|
term.StartStep("Pushing images to DockerHub")
|
||||||
|
term.Infoln("Pushing ullaakut/cameradar:latest")
|
||||||
|
if err := sh.Run("docker", "push", "ullaakut/cameradar:latest"); err != nil {
|
||||||
|
return term.FailStepf("unable to push latest docker images to docker hub: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if version, exists := os.LookupEnv("CAMERADAR_VERSION"); exists {
|
||||||
|
term.Infoln("Pushing ullaakut/cameradar:"+version)
|
||||||
|
if err := sh.Run("docker", "push", "ullaakut/cameradar:"+version); err != nil {
|
||||||
|
return term.FailStepf("unable to push versionned docker images to docker hub: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
term.StartStep("Pushing images to GitHub Packages")
|
||||||
|
term.Infoln("Pushing docker.pkg.github.com/ullaakut/cameradar/cameradar:latest")
|
||||||
|
if err := sh.Run("docker", "tag", "ullaakut/cameradar:latest", "docker.pkg.github.com/ullaakut/cameradar/cameradar:latest"); err != nil {
|
||||||
|
return term.FailStepf("unable to push latest docker images to docker hub: %v", err)
|
||||||
|
}
|
||||||
|
if err := sh.Run("docker", "push", "docker.pkg.github.com/ullaakut/cameradar/cameradar:latest"); err != nil {
|
||||||
|
return term.FailStepf("unable to push latest docker images to docker hub: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if version, exists := os.LookupEnv("CAMERADAR_VERSION"); exists {
|
||||||
|
term.Infoln("Pushing docker.pkg.github.com/ullaakut/cameradar/cameradar:"+version)
|
||||||
|
if err := sh.Run("docker", "tag", "ullaakut/cameradar:"+version, "docker.pkg.github.com/ullaakut/cameradar/cameradar:"+version); err != nil {
|
||||||
|
return term.FailStepf("unable to push latest docker images to docker hub: %v", err)
|
||||||
|
}
|
||||||
|
if err := sh.Run("docker", "push", "ullaakut/cameradar:"+version); err != nil {
|
||||||
|
return term.FailStepf("unable to push versionned docker images to docker hub: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
term.StartStep("Creating manifest(s) for cross platform builds")
|
||||||
|
|
||||||
|
var manifestImages []string
|
||||||
|
for _, image := range supportedPlatforms {
|
||||||
|
manifestImages = append(manifestImages, image)
|
||||||
|
}
|
||||||
|
|
||||||
|
args := []string{"manifest", "create", "--amend", "ullaakut/cameradar:latest"}
|
||||||
|
args = append(args, manifestImages...)
|
||||||
|
|
||||||
|
// docker manifest create ullaakut/cameradar:latest ullaakut/cameradar:amd64 ullaakut/cameradar:armv7 [...]
|
||||||
|
if err := sh.Run("docker", args...); err != nil {
|
||||||
|
return term.FailStepf("unable to create manifest: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if version, exists := os.LookupEnv("CAMERADAR_VERSION"); exists {
|
||||||
|
args = []string{"manifest", "create", "--amend", "ullaakut/cameradar:"+version}
|
||||||
|
args = append(args, manifestImages...)
|
||||||
|
|
||||||
|
if err := sh.Run("docker", args...); err != nil {
|
||||||
|
return term.FailStepf("unable to create manifest: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
term.EndStep()
|
||||||
|
|
||||||
|
term.Infoln(style.Success("Images published successfully."))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user