secator 0.8.0__tar.gz → 0.8.2a0__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.
Potentially problematic release.
This version of secator might be problematic. Click here for more details.
- {secator-0.8.0 → secator-0.8.2a0}/.docker/Dockerfile.alpine +6 -16
- {secator-0.8.0 → secator-0.8.2a0}/.docker/Dockerfile.arch +1 -3
- {secator-0.8.0 → secator-0.8.2a0}/.docker/Dockerfile.debian +2 -5
- {secator-0.8.0 → secator-0.8.2a0}/.docker/Dockerfile.kali +2 -5
- {secator-0.8.0 → secator-0.8.2a0}/.docker/Dockerfile.osx +1 -3
- {secator-0.8.0 → secator-0.8.2a0}/.docker/Dockerfile.ubuntu +2 -5
- {secator-0.8.0 → secator-0.8.2a0}/.gitignore +3 -0
- {secator-0.8.0 → secator-0.8.2a0}/CHANGELOG.md +7 -0
- {secator-0.8.0 → secator-0.8.2a0}/PKG-INFO +1 -1
- {secator-0.8.0 → secator-0.8.2a0}/pyproject.toml +1 -1
- {secator-0.8.0 → secator-0.8.2a0}/secator/cli.py +53 -67
- {secator-0.8.0 → secator-0.8.2a0}/secator/installer.py +55 -23
- {secator-0.8.0 → secator-0.8.2a0}/secator/runners/_base.py +1 -1
- {secator-0.8.0 → secator-0.8.2a0}/secator/runners/command.py +6 -3
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/bbot.py +8 -1
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/feroxbuster.py +3 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/gau.py +3 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/grype.py +3 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/katana.py +3 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/mapcidr.py +3 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/msfconsole.py +5 -6
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/naabu.py +2 -2
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/nmap.py +1 -1
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/nuclei.py +3 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/searchsploit.py +1 -1
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/wpscan.py +3 -2
- {secator-0.8.0 → secator-0.8.2a0}/.docker/build_all.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/.dockerignore +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/.flake8 +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/CONTRIBUTING.md +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/Dockerfile +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/LICENSE +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/README.md +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/SECURITY.md +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/cloudbuild.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/helm/.helmignore +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/helm/Chart.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/helm/templates/redis-service.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/helm/templates/redis.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/helm/templates/secator-manager.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/helm/templates/secator-worker.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/helm/values.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/aliases.cast +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/aliases.gif +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/demo.gif +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/demo.tap +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/fmt.cast +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/fmt.gif +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/help.png +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/input.cast +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/input.gif +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/pipe.cast +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/pipe.gif +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/short_demo.cast +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/images/short_demo.gif +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/download_cves.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/install.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/install_asciinema.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/install_go.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/install_ruby.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/msf/exploit_cve.rc +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/msf/ftp_anonymous.rc +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/msf/ftp_version.rc +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/msf/ftp_vsftpd_234_backdoor.rc +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/msf/redis.rc +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/stories/STORY.md +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/stories/aliases.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/stories/demo.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/stories/fmt.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/stories/input.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/stories/pipe.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/scripts/stories/short_demo.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/.gitignore +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/celery.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/celery_utils.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/config.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/profiles/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/profiles/aggressive.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/profiles/default.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/profiles/stealth.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/scans/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/scans/domain.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/scans/host.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/scans/network.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/scans/subdomain.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/scans/url.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/cidr_recon.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/code_scan.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/host_recon.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/port_scan.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/subdomain_recon.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/url_bypass.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/url_crawl.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/url_dirsearch.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/url_fuzz.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/url_nuclei.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/url_vuln.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/user_hunt.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/configs/workflows/wordpress.yaml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/decorators.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/definitions.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/exporters/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/exporters/_base.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/exporters/console.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/exporters/csv.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/exporters/gdrive.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/exporters/json.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/exporters/table.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/exporters/txt.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/hooks/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/hooks/gcs.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/hooks/mongodb.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/_base.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/error.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/exploit.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/info.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/ip.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/port.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/progress.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/record.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/stat.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/subdomain.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/tag.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/target.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/url.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/user_account.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/vulnerability.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/output_types/warning.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/report.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/rich.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/runners/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/runners/_helpers.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/runners/celery.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/runners/scan.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/runners/task.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/runners/workflow.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/scans/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/serializers/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/serializers/dataclass.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/serializers/json.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/serializers/regex.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/_categories.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/bup.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/cariddi.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/dalfox.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/dirsearch.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/dnsx.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/dnsxbrute.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/ffuf.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/fping.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/gf.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/gospider.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/h8mail.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/httpx.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/maigret.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/tasks/subfinder.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/template.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/thread.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/utils.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/utils_test.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/secator/workflows/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/fixtures/h8mail_breach.txt +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/fixtures/ls.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/fixtures/msfconsole_input.rc +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/fixtures/nmap_output.xml +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/inputs.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/outputs.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/setup.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/teardown.sh +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/test_addons.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/test_celery.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/test_scans.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/test_tasks.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/test_tasks_categories.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/test_worker.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/test_workflows.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/wordlist.txt +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/wordlist_dns.txt +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/wordpress_toolbox/Dockerfile +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/integration/wordpress_toolbox/Makefile +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/performance/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/performance/loadtester.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/performance/test_worker.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/__init__.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_celery.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_cli.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_config.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_offline.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_runners.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_scans.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_serializers.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_tasks.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_tasks_categories.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_template.py +0 -0
- {secator-0.8.0 → secator-0.8.2a0}/tests/unit/test_utils.py +0 -0
|
@@ -1,27 +1,18 @@
|
|
|
1
1
|
FROM alpine:latest
|
|
2
2
|
|
|
3
|
+
ARG flavor=full
|
|
3
4
|
ENV PATH="${PATH}:/root/.local/bin"
|
|
4
5
|
ENV GOBIN="/root/.local/bin"
|
|
5
|
-
ENV TERM="
|
|
6
|
+
ENV TERM="xterm-256color"
|
|
6
7
|
RUN apk add --no-cache \
|
|
7
|
-
|
|
8
|
-
build-base \
|
|
9
|
-
chromium \
|
|
10
|
-
curl \
|
|
8
|
+
flock \
|
|
11
9
|
gcc \
|
|
12
|
-
|
|
13
|
-
go \
|
|
10
|
+
musl-dev \
|
|
14
11
|
linux-headers \
|
|
15
|
-
openssl \
|
|
16
12
|
pipx \
|
|
17
|
-
proxychains-ng \
|
|
18
|
-
python3 \
|
|
19
13
|
python3-dev \
|
|
20
14
|
py3-pip \
|
|
21
|
-
|
|
22
|
-
ruby-dev \
|
|
23
|
-
sudo \
|
|
24
|
-
unzip
|
|
15
|
+
sudo
|
|
25
16
|
COPY . /code
|
|
26
17
|
WORKDIR /code
|
|
27
18
|
RUN pipx install . && \
|
|
@@ -31,6 +22,5 @@ RUN pipx install . && \
|
|
|
31
22
|
secator install addons mongodb && \
|
|
32
23
|
secator install addons redis && \
|
|
33
24
|
secator install addons dev
|
|
34
|
-
RUN secator
|
|
35
|
-
RUN secator install tools
|
|
25
|
+
RUN if [ "$flavor" != "lite" ]; then secator install tools; fi
|
|
36
26
|
ENTRYPOINT ["secator"]
|
|
@@ -6,13 +6,10 @@ RUN pacman -Syu --noconfirm && \
|
|
|
6
6
|
pacman -S --noconfirm \
|
|
7
7
|
base-devel \
|
|
8
8
|
bash \
|
|
9
|
-
chromium \
|
|
10
9
|
curl \
|
|
11
|
-
gcc \
|
|
12
10
|
git \
|
|
13
11
|
go \
|
|
14
12
|
jq \
|
|
15
|
-
make \
|
|
16
13
|
openssl \
|
|
17
14
|
proxychains \
|
|
18
15
|
proxychains-ng \
|
|
@@ -21,6 +18,7 @@ RUN pacman -Syu --noconfirm && \
|
|
|
21
18
|
python-pipx \
|
|
22
19
|
ruby \
|
|
23
20
|
rubygems \
|
|
21
|
+
sudo \
|
|
24
22
|
unzip \
|
|
25
23
|
vim \
|
|
26
24
|
wget
|
|
@@ -6,22 +6,19 @@ RUN apt update -y && \
|
|
|
6
6
|
apt install -y \
|
|
7
7
|
bash \
|
|
8
8
|
build-essential \
|
|
9
|
-
chromium \
|
|
10
9
|
curl \
|
|
11
|
-
gcc \
|
|
12
10
|
git \
|
|
13
11
|
golang-go \
|
|
14
12
|
jq \
|
|
15
|
-
make \
|
|
16
13
|
openssl \
|
|
17
14
|
pipx \
|
|
18
15
|
python3 \
|
|
19
16
|
python3-pip \
|
|
20
17
|
python3-venv \
|
|
21
|
-
ruby-full \
|
|
22
|
-
rubygems \
|
|
23
18
|
proxychains \
|
|
24
19
|
proxychains-ng \
|
|
20
|
+
ruby-full \
|
|
21
|
+
rubygems \
|
|
25
22
|
sudo \
|
|
26
23
|
unzip \
|
|
27
24
|
vim \
|
|
@@ -6,23 +6,20 @@ RUN apt update -y && \
|
|
|
6
6
|
apt install -y \
|
|
7
7
|
bash \
|
|
8
8
|
build-essential \
|
|
9
|
-
chromium \
|
|
10
9
|
curl \
|
|
11
|
-
gcc \
|
|
12
10
|
git \
|
|
13
11
|
golang-go \
|
|
14
12
|
jq \
|
|
15
|
-
make \
|
|
16
13
|
openssl \
|
|
17
14
|
pipx \
|
|
18
15
|
python3 \
|
|
19
16
|
python3-pip \
|
|
20
17
|
python3-venv \
|
|
18
|
+
proxychains \
|
|
19
|
+
proxychains-ng \
|
|
21
20
|
ruby-full \
|
|
22
21
|
rubygems \
|
|
23
22
|
sudo \
|
|
24
|
-
proxychains \
|
|
25
|
-
proxychains-ng \
|
|
26
23
|
unzip \
|
|
27
24
|
vim \
|
|
28
25
|
wget
|
|
@@ -9,13 +9,10 @@ RUN sudo pacman -Syu --noconfirm && \
|
|
|
9
9
|
sudo pacman -S --noconfirm -y \
|
|
10
10
|
base-devel \
|
|
11
11
|
bash \
|
|
12
|
-
chromium \
|
|
13
12
|
curl \
|
|
14
|
-
gcc \
|
|
15
13
|
git \
|
|
16
14
|
go \
|
|
17
15
|
jq \
|
|
18
|
-
make \
|
|
19
16
|
openssl \
|
|
20
17
|
proxychains \
|
|
21
18
|
proxychains-ng \
|
|
@@ -24,6 +21,7 @@ RUN sudo pacman -Syu --noconfirm && \
|
|
|
24
21
|
python-pipx \
|
|
25
22
|
ruby \
|
|
26
23
|
rubygems \
|
|
24
|
+
sudo \
|
|
27
25
|
unzip \
|
|
28
26
|
vim \
|
|
29
27
|
wget
|
|
@@ -6,22 +6,19 @@ RUN apt update -y && \
|
|
|
6
6
|
apt install -y \
|
|
7
7
|
bash \
|
|
8
8
|
build-essential \
|
|
9
|
-
chromium \
|
|
10
9
|
curl \
|
|
11
|
-
gcc \
|
|
12
10
|
git \
|
|
13
11
|
golang-go \
|
|
14
12
|
jq \
|
|
15
|
-
make \
|
|
16
13
|
openssl \
|
|
17
14
|
pipx \
|
|
18
15
|
python3 \
|
|
19
16
|
python3-pip \
|
|
20
17
|
python3-venv \
|
|
21
|
-
ruby-full \
|
|
22
|
-
rubygems \
|
|
23
18
|
proxychains \
|
|
24
19
|
proxychains-ng \
|
|
20
|
+
ruby-full \
|
|
21
|
+
rubygems \
|
|
25
22
|
sudo \
|
|
26
23
|
unzip \
|
|
27
24
|
vim \
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.8.1](https://github.com/freelabz/secator/compare/v0.8.0...v0.8.1) (2025-02-07)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* reduce docker image size ([#516](https://github.com/freelabz/secator/issues/516)) ([28d8fa3](https://github.com/freelabz/secator/commit/28d8fa379a88a1af73df7edfda28c0270f521bb4))
|
|
9
|
+
|
|
3
10
|
## [0.8.0](https://github.com/freelabz/secator/compare/v0.7.0...v0.8.0) (2025-02-06)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -19,7 +19,7 @@ from rich.table import Table
|
|
|
19
19
|
from secator.config import CONFIG, ROOT_FOLDER, Config, default_config, config_path
|
|
20
20
|
from secator.decorators import OrderedGroup, register_runner
|
|
21
21
|
from secator.definitions import ADDONS_ENABLED, ASCII, DEV_PACKAGE, OPT_NOT_SUPPORTED, VERSION, STATE_COLORS
|
|
22
|
-
from secator.installer import ToolInstaller, fmt_health_table_row, get_health_table, get_version_info
|
|
22
|
+
from secator.installer import ToolInstaller, fmt_health_table_row, get_health_table, get_version_info, get_distro_config
|
|
23
23
|
from secator.output_types import FINDING_TYPES, Info, Error
|
|
24
24
|
from secator.report import Report
|
|
25
25
|
from secator.rich import console
|
|
@@ -127,7 +127,7 @@ def worker(hostname, concurrency, reload, queue, pool, check, dev, stop, show):
|
|
|
127
127
|
|
|
128
128
|
# Check Celery addon is installed
|
|
129
129
|
if not ADDONS_ENABLED['worker']:
|
|
130
|
-
console.print('
|
|
130
|
+
console.print(Error(message='Missing worker addon: please run "secator install addons worker".'))
|
|
131
131
|
sys.exit(1)
|
|
132
132
|
|
|
133
133
|
# Check broken / backend addon is installed
|
|
@@ -135,7 +135,7 @@ def worker(hostname, concurrency, reload, queue, pool, check, dev, stop, show):
|
|
|
135
135
|
backend_protocol = CONFIG.celery.result_backend.split('://')[0]
|
|
136
136
|
if CONFIG.celery.broker_url:
|
|
137
137
|
if (broker_protocol == 'redis' or backend_protocol == 'redis') and not ADDONS_ENABLED['redis']:
|
|
138
|
-
console.print('
|
|
138
|
+
console.print(Error(message='Missing redis addon: please run "secator install addons redis".'))
|
|
139
139
|
sys.exit(1)
|
|
140
140
|
|
|
141
141
|
# Debug Celery config
|
|
@@ -214,7 +214,7 @@ def revshell(name, host, port, interface, listen, force):
|
|
|
214
214
|
console.print(Error(message=f'Interface "{interface}" could not be found. Run "ifconfig" to see the list of available interfaces')) # noqa: E501
|
|
215
215
|
return
|
|
216
216
|
else:
|
|
217
|
-
console.print(Info(message=f'Detected host IP:
|
|
217
|
+
console.print(Info(message=f'Detected host IP: {host}'))
|
|
218
218
|
|
|
219
219
|
# Download reverse shells JSON from repo
|
|
220
220
|
revshells_json = f'{CONFIG.dirs.revshells}/revshells.json'
|
|
@@ -389,84 +389,54 @@ def record(record_name, script, interactive, width, height, output_dir):
|
|
|
389
389
|
console.print(Info(message=f'Generated {output_gif_path}'))
|
|
390
390
|
|
|
391
391
|
|
|
392
|
-
@util.
|
|
393
|
-
|
|
394
|
-
|
|
392
|
+
@util.command('build')
|
|
393
|
+
@click.option('--version', type=str, help='Override version specified in pyproject.toml')
|
|
394
|
+
def build(version):
|
|
395
|
+
"""Build secator PyPI package."""
|
|
395
396
|
if not DEV_PACKAGE:
|
|
396
397
|
console.print(Error(message='You MUST use a development version of secator to make builds'))
|
|
397
398
|
sys.exit(1)
|
|
398
|
-
pass
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
@build.command('pypi')
|
|
402
|
-
def build_pypi():
|
|
403
|
-
"""Build secator PyPI package."""
|
|
404
399
|
if not ADDONS_ENABLED['build']:
|
|
405
|
-
console.print(Error(message='Missing build addon: please run
|
|
400
|
+
console.print(Error(message='Missing build addon: please run "secator install addons build"'))
|
|
406
401
|
sys.exit(1)
|
|
407
|
-
with console.status('[bold gold3]Building PyPI package...[/]'):
|
|
408
|
-
ret = Command.execute(f'{sys.executable} -m hatch build', name='hatch build', cwd=ROOT_FOLDER)
|
|
409
|
-
sys.exit(ret.return_code)
|
|
410
402
|
|
|
403
|
+
# Update version in pyproject.toml if --version is explicitely passed
|
|
404
|
+
if version:
|
|
405
|
+
pyproject_toml_path = Path.cwd() / 'pyproject.toml'
|
|
406
|
+
if not pyproject_toml_path.exists():
|
|
407
|
+
console.print(Error(message='You must be in the secator root directory to make builds with --version'))
|
|
408
|
+
sys.exit(1)
|
|
409
|
+
console.print(Info(message=f'Updating version in pyproject.toml to {version}'))
|
|
410
|
+
with open(pyproject_toml_path, "r") as file:
|
|
411
|
+
content = file.read()
|
|
412
|
+
updated_content = re.sub(r'^\s*version\s*=\s*".*?"', f'version = "{version}"', content, flags=re.MULTILINE)
|
|
413
|
+
with open(pyproject_toml_path, "w") as file:
|
|
414
|
+
file.write(updated_content)
|
|
411
415
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
@click.option('--latest', '-l', is_flag=True, default=False, help='Latest tag')
|
|
415
|
-
def build_docker(tag, latest):
|
|
416
|
-
"""Build secator Docker image."""
|
|
417
|
-
if not tag:
|
|
418
|
-
tag = VERSION if latest else 'dev'
|
|
419
|
-
cmd = f'docker build -t freelabz/secator:{tag}'
|
|
420
|
-
if latest:
|
|
421
|
-
cmd += ' -t freelabz/secator:latest'
|
|
422
|
-
cmd += ' .'
|
|
423
|
-
with console.status('[bold gold3]Building Docker image...[/]'):
|
|
424
|
-
ret = Command.execute(cmd, name='docker build', cwd=ROOT_FOLDER)
|
|
416
|
+
with console.status('[bold gold3]Building PyPI package...[/]'):
|
|
417
|
+
ret = Command.execute(f'{sys.executable} -m hatch build', name='hatch build', cwd=ROOT_FOLDER)
|
|
425
418
|
sys.exit(ret.return_code)
|
|
426
419
|
|
|
427
420
|
|
|
428
|
-
@util.
|
|
421
|
+
@util.command('publish')
|
|
429
422
|
def publish():
|
|
430
|
-
"""Publish secator."""
|
|
423
|
+
"""Publish secator PyPI package."""
|
|
431
424
|
if not DEV_PACKAGE:
|
|
432
|
-
console.print('
|
|
425
|
+
console.print(Error(message='You MUST use a development version of secator to publish builds.'))
|
|
433
426
|
sys.exit(1)
|
|
434
|
-
pass
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
@publish.command('pypi')
|
|
438
|
-
def publish_pypi():
|
|
439
|
-
"""Publish secator PyPI package."""
|
|
440
427
|
if not ADDONS_ENABLED['build']:
|
|
441
|
-
console.print('
|
|
428
|
+
console.print(Error(message='Missing build addon: please run "secator install addons build"'))
|
|
442
429
|
sys.exit(1)
|
|
443
430
|
os.environ['HATCH_INDEX_USER'] = '__token__'
|
|
444
431
|
hatch_token = os.environ.get('HATCH_INDEX_AUTH')
|
|
445
432
|
if not hatch_token:
|
|
446
|
-
console.print('
|
|
433
|
+
console.print(Error(message='Missing PyPI auth token (HATCH_INDEX_AUTH env variable).'))
|
|
447
434
|
sys.exit(1)
|
|
448
435
|
with console.status('[bold gold3]Publishing PyPI package...[/]'):
|
|
449
436
|
ret = Command.execute(f'{sys.executable} -m hatch publish', name='hatch publish', cwd=ROOT_FOLDER)
|
|
450
437
|
sys.exit(ret.return_code)
|
|
451
438
|
|
|
452
439
|
|
|
453
|
-
@publish.command('docker')
|
|
454
|
-
@click.option('--tag', '-t', default=None, help='Specific tag')
|
|
455
|
-
@click.option('--latest', '-l', is_flag=True, default=False, help='Latest tag')
|
|
456
|
-
def publish_docker(tag, latest):
|
|
457
|
-
"""Publish secator Docker image."""
|
|
458
|
-
if not tag:
|
|
459
|
-
tag = VERSION if latest else 'dev'
|
|
460
|
-
cmd = f'docker push freelabz/secator:{tag}'
|
|
461
|
-
cmd2 = 'docker push freelabz/secator:latest'
|
|
462
|
-
with console.status(f'[bold gold3]Publishing Docker image {tag}...[/]'):
|
|
463
|
-
ret = Command.execute(cmd, name=f'docker push ({tag})', cwd=ROOT_FOLDER)
|
|
464
|
-
if latest:
|
|
465
|
-
ret2 = Command.execute(cmd2, name='docker push (latest)')
|
|
466
|
-
sys.exit(max(ret.return_code, ret2.return_code))
|
|
467
|
-
sys.exit(ret.return_code)
|
|
468
|
-
|
|
469
|
-
|
|
470
440
|
#--------#
|
|
471
441
|
# CONFIG #
|
|
472
442
|
#--------#
|
|
@@ -503,7 +473,7 @@ def config_set(key, value):
|
|
|
503
473
|
return
|
|
504
474
|
console.print(f'[bold green]:tada: Saved config to [/]{CONFIG._path}')
|
|
505
475
|
else:
|
|
506
|
-
console.print('
|
|
476
|
+
console.print(Error(message='Invalid config, not saving it.'))
|
|
507
477
|
|
|
508
478
|
|
|
509
479
|
@config.command('edit')
|
|
@@ -699,13 +669,13 @@ def report_show(report_query, output, runner_type, time_delta, type, query, work
|
|
|
699
669
|
f'\n{path} ([bold blue]{runner_name}[/] [dim]{runner_type}[/]) ([dim]{file_date}[/]):')
|
|
700
670
|
if report.is_empty():
|
|
701
671
|
if len(paths) == 1:
|
|
702
|
-
console.print('
|
|
672
|
+
console.print(Warning(message='No results in report.'))
|
|
703
673
|
else:
|
|
704
|
-
console.print('
|
|
674
|
+
console.print(Warning(message='No new results since previous scan.'))
|
|
705
675
|
continue
|
|
706
676
|
report.send()
|
|
707
677
|
except json.decoder.JSONDecodeError as e:
|
|
708
|
-
console.print(f'
|
|
678
|
+
console.print(Error(message=f'Could not load {path}: {str(e)}'))
|
|
709
679
|
|
|
710
680
|
if unified:
|
|
711
681
|
console.print(f'\n:wrench: [bold gold3]Building report by crunching {len(all_results)} results ...[/]')
|
|
@@ -759,12 +729,12 @@ def report_list(workspace, runner_type, time_delta):
|
|
|
759
729
|
f"[{status_color}]{data['status']}[/]"
|
|
760
730
|
)
|
|
761
731
|
except json.JSONDecodeError as e:
|
|
762
|
-
console.print(f'
|
|
732
|
+
console.print(Error(message=f'Could not load {path}: {str(e)}'))
|
|
763
733
|
|
|
764
734
|
if len(paths) > 0:
|
|
765
735
|
console.print(table)
|
|
766
736
|
else:
|
|
767
|
-
console.print('
|
|
737
|
+
console.print(Error(message='No results found.'))
|
|
768
738
|
|
|
769
739
|
|
|
770
740
|
@report.command('export')
|
|
@@ -888,7 +858,7 @@ def health(json, debug, strict):
|
|
|
888
858
|
error = False
|
|
889
859
|
for tool, info in status['tools'].items():
|
|
890
860
|
if not info['installed']:
|
|
891
|
-
console.print(Error(message=f'{tool} not installed and strict mode is enabled.
|
|
861
|
+
console.print(Error(message=f'{tool} not installed and strict mode is enabled.'))
|
|
892
862
|
error = True
|
|
893
863
|
if error:
|
|
894
864
|
sys.exit(1)
|
|
@@ -902,7 +872,7 @@ def health(json, debug, strict):
|
|
|
902
872
|
|
|
903
873
|
def run_install(title=None, cmd=None, packages=None, next_steps=None):
|
|
904
874
|
if CONFIG.offline_mode:
|
|
905
|
-
console.print('
|
|
875
|
+
console.print(Error(message='Cannot run this command in offline mode.'))
|
|
906
876
|
return
|
|
907
877
|
with console.status(f'[bold yellow] Installing {title}...'):
|
|
908
878
|
if cmd:
|
|
@@ -1089,12 +1059,28 @@ def install_tools(cmds):
|
|
|
1089
1059
|
tools = ALL_TASKS
|
|
1090
1060
|
tools.sort(key=lambda x: x.__name__)
|
|
1091
1061
|
return_code = 0
|
|
1062
|
+
if not tools:
|
|
1063
|
+
cmd_str = ' '.join(cmds)
|
|
1064
|
+
console.print(Error(message=f'No tools found for {cmd_str}.'))
|
|
1065
|
+
return
|
|
1092
1066
|
for ix, cls in enumerate(tools):
|
|
1093
1067
|
with console.status(f'[bold yellow][{ix + 1}/{len(tools)}] Installing {cls.__name__} ...'):
|
|
1094
1068
|
status = ToolInstaller.install(cls)
|
|
1095
1069
|
if not status.is_ok():
|
|
1096
1070
|
return_code = 1
|
|
1097
1071
|
console.print()
|
|
1072
|
+
distro = get_distro_config()
|
|
1073
|
+
cleanup_cmds = [
|
|
1074
|
+
'go clean -cache',
|
|
1075
|
+
'go clean -modcache',
|
|
1076
|
+
'pip cache purge',
|
|
1077
|
+
'gem cleanup --user-install',
|
|
1078
|
+
'gem clean --user-install',
|
|
1079
|
+
]
|
|
1080
|
+
if distro.pm_finalizer:
|
|
1081
|
+
cleanup_cmds.append(f'sudo {distro.pm_finalizer}')
|
|
1082
|
+
cmd = ' && '.join(cleanup_cmds)
|
|
1083
|
+
Command.execute(cmd, cls_attributes={'shell': True}, quiet=False)
|
|
1098
1084
|
sys.exit(return_code)
|
|
1099
1085
|
|
|
1100
1086
|
|
|
@@ -1253,7 +1239,7 @@ def test():
|
|
|
1253
1239
|
console.print(Error(message='You MUST use a development version of secator to run tests.'))
|
|
1254
1240
|
sys.exit(1)
|
|
1255
1241
|
if not ADDONS_ENABLED['dev']:
|
|
1256
|
-
console.print(Error(message='Missing dev addon: please run
|
|
1242
|
+
console.print(Error(message='Missing dev addon: please run "secator install addons dev"'))
|
|
1257
1243
|
sys.exit(1)
|
|
1258
1244
|
pass
|
|
1259
1245
|
|
|
@@ -18,6 +18,7 @@ import requests
|
|
|
18
18
|
from rich.table import Table
|
|
19
19
|
|
|
20
20
|
from secator.config import CONFIG
|
|
21
|
+
from secator.celery import IN_CELERY_WORKER_PROCESS
|
|
21
22
|
from secator.definitions import OPT_NOT_SUPPORTED
|
|
22
23
|
from secator.output_types import Info, Warning, Error
|
|
23
24
|
from secator.rich import console
|
|
@@ -42,9 +43,10 @@ class InstallerStatus(Enum):
|
|
|
42
43
|
|
|
43
44
|
@dataclass
|
|
44
45
|
class Distribution:
|
|
45
|
-
pm_install_command: str
|
|
46
|
-
pm_name: str
|
|
47
46
|
name: str
|
|
47
|
+
pm_name: str
|
|
48
|
+
pm_installer: str
|
|
49
|
+
pm_finalizer: str
|
|
48
50
|
|
|
49
51
|
|
|
50
52
|
class ToolInstaller:
|
|
@@ -119,7 +121,7 @@ class PackageInstaller:
|
|
|
119
121
|
"""
|
|
120
122
|
# Init status
|
|
121
123
|
distribution = get_distro_config()
|
|
122
|
-
if distribution.
|
|
124
|
+
if not distribution.pm_installer:
|
|
123
125
|
return InstallerStatus.UNKNOWN_DISTRIBUTION
|
|
124
126
|
|
|
125
127
|
console.print(
|
|
@@ -133,20 +135,24 @@ class PackageInstaller:
|
|
|
133
135
|
break
|
|
134
136
|
|
|
135
137
|
# Installer cmd
|
|
136
|
-
cmd = distribution.
|
|
138
|
+
cmd = distribution.pm_installer
|
|
139
|
+
if CONFIG.security.autoinstall_commands and IN_CELERY_WORKER_PROCESS:
|
|
140
|
+
cmd = f'flock /tmp/install.lock {cmd}'
|
|
137
141
|
if getpass.getuser() != 'root':
|
|
138
142
|
cmd = f'sudo {cmd}'
|
|
139
143
|
|
|
140
144
|
if pkg_list:
|
|
145
|
+
pkg_str = ''
|
|
141
146
|
for pkg in pkg_list:
|
|
142
147
|
if ':' in pkg:
|
|
143
148
|
pdistro, pkg = pkg.split(':')
|
|
144
149
|
if pdistro != distribution.name:
|
|
145
150
|
continue
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
151
|
+
pkg_str += f'{pkg} '
|
|
152
|
+
console.print(Info(message=f'Installing packages {pkg_str}'))
|
|
153
|
+
status = SourceInstaller.install(f'{cmd} {pkg_str}', install_prereqs=False)
|
|
154
|
+
if not status.is_ok():
|
|
155
|
+
return status
|
|
150
156
|
return InstallerStatus.SUCCESS
|
|
151
157
|
|
|
152
158
|
|
|
@@ -154,7 +160,7 @@ class SourceInstaller:
|
|
|
154
160
|
"""Install a tool from source."""
|
|
155
161
|
|
|
156
162
|
@classmethod
|
|
157
|
-
def install(cls, config):
|
|
163
|
+
def install(cls, config, install_prereqs=True):
|
|
158
164
|
"""Install from source.
|
|
159
165
|
|
|
160
166
|
Args:
|
|
@@ -175,6 +181,23 @@ class SourceInstaller:
|
|
|
175
181
|
break
|
|
176
182
|
if not install_cmd:
|
|
177
183
|
return InstallerStatus.INSTALL_SKIPPED_OK
|
|
184
|
+
|
|
185
|
+
# Install build dependencies if needed
|
|
186
|
+
if install_prereqs:
|
|
187
|
+
if 'go ' in install_cmd:
|
|
188
|
+
status = PackageInstaller.install({'apt': ['golang-go'], '*': ['go']})
|
|
189
|
+
if not status.is_ok():
|
|
190
|
+
return status
|
|
191
|
+
if 'gem ' in install_cmd:
|
|
192
|
+
status = PackageInstaller.install({'apk': ['ruby', 'ruby-dev'], 'pacman': ['ruby', 'rubygems'], 'apt': ['ruby-full', 'rubygems']}) # noqa: E501
|
|
193
|
+
if not status.is_ok():
|
|
194
|
+
return status
|
|
195
|
+
if 'git ' in install_cmd or 'git+' in install_cmd:
|
|
196
|
+
status = PackageInstaller.install({'*': ['git']})
|
|
197
|
+
if not status.is_ok():
|
|
198
|
+
return status
|
|
199
|
+
|
|
200
|
+
# Run command
|
|
178
201
|
ret = Command.execute(install_cmd, cls_attributes={'shell': True}, quiet=False)
|
|
179
202
|
return InstallerStatus.SUCCESS if ret.return_code == 0 else InstallerStatus.INSTALL_FAILED
|
|
180
203
|
|
|
@@ -312,6 +335,7 @@ class GithubInstaller:
|
|
|
312
335
|
temp_dir = os.path.join("/tmp", f'{repo_name}_{date_str}')
|
|
313
336
|
os.makedirs(temp_dir, exist_ok=True)
|
|
314
337
|
|
|
338
|
+
console.print(Info(message=f'Extracting binary to {temp_dir}...'))
|
|
315
339
|
if url.endswith('.zip'):
|
|
316
340
|
with zipfile.ZipFile(io.BytesIO(response.content)) as zip_ref:
|
|
317
341
|
zip_ref.extractall(temp_dir)
|
|
@@ -323,7 +347,9 @@ class GithubInstaller:
|
|
|
323
347
|
binary_path = cls._find_binary_in_directory(temp_dir, repo_name)
|
|
324
348
|
if binary_path:
|
|
325
349
|
os.chmod(binary_path, 0o755) # Make it executable
|
|
326
|
-
|
|
350
|
+
destination = os.path.join(destination, repo_name)
|
|
351
|
+
console.print(Info(message=f'Moving binary to {destination}...'))
|
|
352
|
+
shutil.move(binary_path, destination) # Move the binary
|
|
327
353
|
return InstallerStatus.SUCCESS
|
|
328
354
|
else:
|
|
329
355
|
console.print(Error(message='Binary matching the repository name was not found in the archive.'))
|
|
@@ -479,7 +505,8 @@ def get_distro_config():
|
|
|
479
505
|
package_manager_variable = os.environ.get('SECATOR_PACKAGE_MANAGER')
|
|
480
506
|
if package_manager_variable:
|
|
481
507
|
return package_manager_variable
|
|
482
|
-
|
|
508
|
+
installer = None
|
|
509
|
+
finalizer = None
|
|
483
510
|
system = platform.system()
|
|
484
511
|
distrib = system
|
|
485
512
|
|
|
@@ -487,32 +514,37 @@ def get_distro_config():
|
|
|
487
514
|
distrib = distro.id()
|
|
488
515
|
|
|
489
516
|
if distrib in ["ubuntu", "debian", "linuxmint", "popos", "kali"]:
|
|
490
|
-
|
|
517
|
+
installer = "apt install -y --no-install-recommends"
|
|
518
|
+
finalizer = "rm -rf /var/lib/apt/lists/*"
|
|
491
519
|
elif distrib in ["arch", "manjaro", "endeavouros"]:
|
|
492
|
-
|
|
520
|
+
installer = "pacman -S --noconfirm --needed"
|
|
493
521
|
elif distrib in ["alpine"]:
|
|
494
|
-
|
|
522
|
+
installer = "apk add --no-cache"
|
|
495
523
|
elif distrib in ["fedora"]:
|
|
496
|
-
|
|
524
|
+
installer = "dnf install -y"
|
|
525
|
+
finalizer = "dnf clean all"
|
|
497
526
|
elif distrib in ["centos", "rhel", "rocky", "alma"]:
|
|
498
|
-
|
|
527
|
+
installer = "yum -y"
|
|
528
|
+
finalizer = "yum clean all"
|
|
499
529
|
elif distrib in ["opensuse", "sles"]:
|
|
500
|
-
|
|
530
|
+
installer = "zypper -n"
|
|
531
|
+
finalizer = "zypper clean --all"
|
|
501
532
|
|
|
502
533
|
elif system == "Darwin": # macOS
|
|
503
|
-
|
|
534
|
+
installer = "brew install"
|
|
504
535
|
|
|
505
536
|
elif system == "Windows":
|
|
506
537
|
if shutil.which("winget"):
|
|
507
|
-
|
|
538
|
+
installer = "winget install --disable-interactivity"
|
|
508
539
|
elif shutil.which("choco"):
|
|
509
|
-
|
|
540
|
+
installer = "choco install -y --no-progress"
|
|
510
541
|
else:
|
|
511
|
-
|
|
542
|
+
installer = "scoop" # Alternative package manager for Windows
|
|
512
543
|
|
|
513
|
-
manager =
|
|
544
|
+
manager = installer.split(' ')[0]
|
|
514
545
|
config = Distribution(
|
|
515
|
-
|
|
546
|
+
pm_installer=installer,
|
|
547
|
+
pm_finalizer=finalizer,
|
|
516
548
|
pm_name=manager,
|
|
517
549
|
name=distrib
|
|
518
550
|
)
|
|
@@ -630,7 +630,7 @@ class Runner:
|
|
|
630
630
|
return
|
|
631
631
|
remote_str = 'starting' if self.sync else 'sent to Celery worker'
|
|
632
632
|
runner_name = self.__class__.__name__
|
|
633
|
-
info = Info(message=f'{runner_name}
|
|
633
|
+
info = Info(message=f'{runner_name} {self.config.name} {remote_str}...', _source=self.unique_name)
|
|
634
634
|
self._print_item(info)
|
|
635
635
|
|
|
636
636
|
def log_results(self):
|
|
@@ -146,6 +146,9 @@ class Command(Runner):
|
|
|
146
146
|
validators=validators,
|
|
147
147
|
context=context)
|
|
148
148
|
|
|
149
|
+
# Cmd name
|
|
150
|
+
self.cmd_name = self.__class__.cmd.split(' ')[0]
|
|
151
|
+
|
|
149
152
|
# Inputs path
|
|
150
153
|
self.inputs_path = None
|
|
151
154
|
|
|
@@ -308,7 +311,7 @@ class Command(Runner):
|
|
|
308
311
|
|
|
309
312
|
if proxy != 'proxychains' and self.proxy and not proxy:
|
|
310
313
|
self._print(
|
|
311
|
-
f'[bold red]Ignoring proxy "{self.proxy}" for {self.
|
|
314
|
+
f'[bold red]Ignoring proxy "{self.proxy}" for {self.cmd_name} (not supported).[/]', rich=True)
|
|
312
315
|
|
|
313
316
|
#----------#
|
|
314
317
|
# Internal #
|
|
@@ -373,7 +376,7 @@ class Command(Runner):
|
|
|
373
376
|
status = ToolInstaller.install(self.__class__)
|
|
374
377
|
if not status.is_ok():
|
|
375
378
|
yield Error(
|
|
376
|
-
message=f'Failed installing {self.
|
|
379
|
+
message=f'Failed installing {self.cmd_name}',
|
|
377
380
|
_source=self.unique_name,
|
|
378
381
|
_uuid=str(uuid.uuid4())
|
|
379
382
|
)
|
|
@@ -433,7 +436,7 @@ class Command(Runner):
|
|
|
433
436
|
Returns:
|
|
434
437
|
bool: True if the command is installed, False otherwise.
|
|
435
438
|
"""
|
|
436
|
-
result = subprocess.Popen(["which", self.
|
|
439
|
+
result = subprocess.Popen(["which", self.cmd_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
437
440
|
result.communicate()
|
|
438
441
|
return result.returncode == 0
|
|
439
442
|
|