secator 0.3.0__tar.gz → 0.3.2__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.3.0 → secator-0.3.2}/CHANGELOG.md +23 -0
- {secator-0.3.0 → secator-0.3.2}/PKG-INFO +2 -2
- {secator-0.3.0 → secator-0.3.2}/README.md +1 -1
- {secator-0.3.0 → secator-0.3.2}/pyproject.toml +1 -1
- {secator-0.3.0 → secator-0.3.2}/scripts/install.sh +4 -4
- {secator-0.3.0 → secator-0.3.2}/scripts/install_go.sh +3 -6
- {secator-0.3.0 → secator-0.3.2}/secator/celery.py +1 -1
- {secator-0.3.0 → secator-0.3.2}/secator/cli.py +68 -128
- {secator-0.3.0 → secator-0.3.2}/secator/decorators.py +3 -4
- {secator-0.3.0 → secator-0.3.2}/secator/definitions.py +51 -46
- {secator-0.3.0 → secator-0.3.2}/secator/installer.py +159 -16
- {secator-0.3.0 → secator-0.3.2}/secator/rich.py +2 -8
- {secator-0.3.0 → secator-0.3.2}/secator/runners/_base.py +47 -15
- {secator-0.3.0 → secator-0.3.2}/secator/runners/task.py +4 -3
- {secator-0.3.0 → secator-0.3.2}/secator/runners/workflow.py +1 -1
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/_categories.py +6 -11
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/searchsploit.py +1 -0
- {secator-0.3.0 → secator-0.3.2}/secator/utils.py +25 -1
- {secator-0.3.0 → secator-0.3.2}/.flake8 +0 -0
- {secator-0.3.0 → secator-0.3.2}/.gitignore +0 -0
- {secator-0.3.0 → secator-0.3.2}/CONTRIBUTING.md +0 -0
- {secator-0.3.0 → secator-0.3.2}/Dockerfile +0 -0
- {secator-0.3.0 → secator-0.3.2}/LICENSE +0 -0
- {secator-0.3.0 → secator-0.3.2}/SECURITY.md +0 -0
- {secator-0.3.0 → secator-0.3.2}/cloudbuild.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/aliases.cast +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/aliases.gif +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/demo.cast +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/demo.gif +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/fmt.cast +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/fmt.gif +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/help.png +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/input.cast +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/input.gif +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/pipe.cast +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/pipe.gif +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/short_demo.cast +0 -0
- {secator-0.3.0 → secator-0.3.2}/images/short_demo.gif +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/download_cves.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/install_asciinema.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/install_ruby.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/msf/exploit_cve.rc +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/msf/ftp_anonymous.rc +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/msf/ftp_version.rc +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/msf/ftp_vsftpd_234_backdoor.rc +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/msf/redis.rc +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/msfinstall.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/stories/STORY.md +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/stories/aliases.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/stories/demo.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/stories/fmt.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/stories/input.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/stories/pipe.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/scripts/stories/short_demo.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/.gitignore +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/config.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/profiles/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/profiles/aggressive.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/profiles/default.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/profiles/stealth.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/domain.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/host.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/network.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/subdomain.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/url.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/cidr_recon.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/code_scan.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/host_recon.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/port_scan.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/subdomain_recon.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_crawl.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_dirsearch.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_fuzz.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_nuclei.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_vuln.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/user_hunt.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/wordpress.yaml +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/exporters/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/exporters/_base.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/exporters/csv.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/exporters/gdrive.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/exporters/json.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/exporters/table.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/exporters/txt.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/hooks/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/hooks/mongodb.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/_base.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/exploit.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/ip.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/port.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/progress.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/record.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/subdomain.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/tag.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/target.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/url.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/user_account.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/output_types/vulnerability.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/report.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/runners/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/runners/_helpers.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/runners/command.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/runners/scan.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/serializers/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/serializers/dataclass.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/serializers/json.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/serializers/regex.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/cariddi.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/dalfox.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/dirsearch.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/dnsx.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/dnsxbrute.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/feroxbuster.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/ffuf.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/fping.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/gau.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/gf.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/gospider.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/grype.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/h8mail.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/httpx.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/katana.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/maigret.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/mapcidr.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/msfconsole.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/naabu.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/nmap.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/nuclei.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/subfinder.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/tasks/wpscan.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/secator/utils_test.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/fixtures/h8mail_breach.txt +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/fixtures/msfconsole_input.rc +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/fixtures/nmap_output.xml +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/inputs.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/outputs.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/setup.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/teardown.sh +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/test_scans.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/test_tasks.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/test_workflows.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/wordlist.txt +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/wordlist_dns.txt +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/wordpress_toolbox/Dockerfile +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/integration/wordpress_toolbox/Makefile +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/performance/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/performance/loadtester.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/unit/__init__.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/unit/test_celery.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/unit/test_scans.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/unit/test_serializers.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/unit/test_tasks.py +0 -0
- {secator-0.3.0 → secator-0.3.2}/tests/unit/test_workflows.py +0 -0
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.2](https://github.com/freelabz/secator/compare/v0.3.1...v0.3.2) (2024-04-12)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* do not create scripts/ folder ([#273](https://github.com/freelabz/secator/issues/273)) ([8fdaf09](https://github.com/freelabz/secator/commit/8fdaf09d4d1f3fbac7def995b99e9bc4f4f5020d))
|
|
9
|
+
* health table padding ([#274](https://github.com/freelabz/secator/issues/274)) ([4f976bd](https://github.com/freelabz/secator/commit/4f976bdaecef7c29a2c6b21ddb29299745dfe5c9))
|
|
10
|
+
* install script ([#276](https://github.com/freelabz/secator/issues/276)) ([e27b339](https://github.com/freelabz/secator/commit/e27b3391ea3a5c5a7898d3c02a5f409be44255f8))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Documentation
|
|
14
|
+
|
|
15
|
+
* update docker setup ([#279](https://github.com/freelabz/secator/issues/279)) ([9b56e75](https://github.com/freelabz/secator/commit/9b56e75b114f294d222660dbae4f2e6b5e1369cd))
|
|
16
|
+
|
|
17
|
+
## [0.3.1](https://github.com/freelabz/secator/compare/v0.3.0...v0.3.1) (2024-04-11)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* download default wordlists if missing ([#261](https://github.com/freelabz/secator/issues/261)) ([7bec2a4](https://github.com/freelabz/secator/commit/7bec2a46d054aa7d3702eb77d25b9f791f5cc9c5))
|
|
23
|
+
* rework init & tools install ([#271](https://github.com/freelabz/secator/issues/271)) ([6c477fc](https://github.com/freelabz/secator/commit/6c477fc99d5f1dd625423ba27dc563acc50194bf))
|
|
24
|
+
* wrong hook name in debug output ([#262](https://github.com/freelabz/secator/issues/262)) ([f2ee367](https://github.com/freelabz/secator/commit/f2ee36779615bd2c1ef1f80679a9cc77e9e592d6))
|
|
25
|
+
|
|
3
26
|
## [0.3.0](https://github.com/freelabz/secator/compare/v0.2.0...v0.3.0) (2024-04-09)
|
|
4
27
|
|
|
5
28
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: secator
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: The pentester's swiss knife.
|
|
5
5
|
Project-URL: Homepage, https://github.com/freelabz/secator
|
|
6
6
|
Project-URL: Issues, https://github.com/freelabz/secator/issues
|
|
@@ -175,7 +175,7 @@ wget -O - https://raw.githubusercontent.com/freelabz/secator/main/scripts/instal
|
|
|
175
175
|
<summary>Docker</summary>
|
|
176
176
|
|
|
177
177
|
```sh
|
|
178
|
-
docker run -it freelabz/secator --help
|
|
178
|
+
docker run -it --rm --net=host freelabz/secator --help
|
|
179
179
|
```
|
|
180
180
|
|
|
181
181
|
</details>
|
|
@@ -116,7 +116,7 @@ wget -O - https://raw.githubusercontent.com/freelabz/secator/main/scripts/instal
|
|
|
116
116
|
<summary>Docker</summary>
|
|
117
117
|
|
|
118
118
|
```sh
|
|
119
|
-
docker run -it freelabz/secator --help
|
|
119
|
+
docker run -it --rm --net=host freelabz/secator --help
|
|
120
120
|
```
|
|
121
121
|
|
|
122
122
|
</details>
|
|
@@ -7,9 +7,9 @@ echo -e "🗄 ${YELLOW}Running apt update ...${NC}"
|
|
|
7
7
|
sudo apt update
|
|
8
8
|
echo -e "🗄 ${GREEN}Ran apt update successfully !${NC}\n"
|
|
9
9
|
|
|
10
|
-
echo -e "🗄 ${YELLOW}Installing
|
|
11
|
-
sudo apt install -y
|
|
12
|
-
echo -e "🗄 ${GREEN}pipx installed successfully !${NC}\n"
|
|
10
|
+
echo -e "🗄 ${YELLOW}Installing pipx and git ...${NC}"
|
|
11
|
+
sudo apt install -y pipx git
|
|
12
|
+
echo -e "🗄 ${GREEN}pipx and git installed successfully !${NC}\n"
|
|
13
13
|
|
|
14
14
|
echo -e "🗄 ${YELLOW}Setting \$PATH ...${NC}"
|
|
15
15
|
export PATH=$PATH:~/.local/bin:~/go/bin
|
|
@@ -28,5 +28,5 @@ echo -e "🗄 ${GREEN}secator installed successfully !${NC}\n"
|
|
|
28
28
|
|
|
29
29
|
echo -e "🗄 ${YELLOW}Adding ~/go/bin and ~/.local/bin to \$PATH in .bashrc ...${NC}"
|
|
30
30
|
echo "export PATH=$PATH:~/go/bin:~/.local/bin" >> ~/.bashrc
|
|
31
|
-
|
|
31
|
+
. ~/.bashrc
|
|
32
32
|
echo -e "🗄 ${GREEN}\$PATH modified successfully !${NC}\n"
|
|
@@ -7,9 +7,6 @@ YELLOW='\033[0;93m'
|
|
|
7
7
|
GREEN='\033[0;92m'
|
|
8
8
|
NC='\033[0m' # No Color
|
|
9
9
|
|
|
10
|
-
echo -e "🗄 ${YELLOW}Removing existing Go build ...${NC}"
|
|
11
|
-
sudo rm -rf /usr/local/go
|
|
12
|
-
|
|
13
10
|
echo -e "🗄 ${YELLOW}Downloading Go $GO_VERSION ...${NC}"
|
|
14
11
|
wget https://golang.org/dl/$GO_TAR
|
|
15
12
|
|
|
@@ -18,8 +15,8 @@ tar -xvf $GO_TAR
|
|
|
18
15
|
rm $GO_TAR || true
|
|
19
16
|
|
|
20
17
|
echo -e "🗄 ${YELLOW}Linking Go install to /usr/local ...${NC}"
|
|
21
|
-
sudo mv go /usr/local
|
|
22
|
-
sudo
|
|
23
|
-
sudo ln -s /usr/local/go/bin/go /usr/bin/go
|
|
18
|
+
sudo mv go /usr/local/go$GO_VERSION
|
|
19
|
+
sudo mv /usr/bin/go /usr/bin/go.bak || true
|
|
20
|
+
sudo ln -s /usr/local/go$GO_VERSION/bin/go /usr/bin/go
|
|
24
21
|
|
|
25
22
|
echo -e "🗄 ${GREEN}Go $GO_VERSION installed successfully !${NC}\n"
|
|
@@ -106,7 +106,7 @@ def void(*args, **kwargs):
|
|
|
106
106
|
|
|
107
107
|
def revoke_task(task_id):
|
|
108
108
|
console.print(f'Revoking task {task_id}')
|
|
109
|
-
return app.control.revoke(task_id, terminate=True, signal='
|
|
109
|
+
return app.control.revoke(task_id, terminate=True, signal='SIGINT')
|
|
110
110
|
|
|
111
111
|
|
|
112
112
|
#--------------#
|
|
@@ -7,20 +7,20 @@ import rich_click as click
|
|
|
7
7
|
from dotmap import DotMap
|
|
8
8
|
from fp.fp import FreeProxy
|
|
9
9
|
from jinja2 import Template
|
|
10
|
+
from rich.live import Live
|
|
10
11
|
from rich.markdown import Markdown
|
|
11
12
|
from rich.rule import Rule
|
|
12
13
|
|
|
13
14
|
from secator.config import ConfigLoader
|
|
14
15
|
from secator.decorators import OrderedGroup, register_runner
|
|
15
|
-
from secator.definitions import (
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
TRACE_ADDON_ENABLED, VERSION, VERSION_STR, WORKER_ADDON_ENABLED)
|
|
19
|
-
from secator.installer import ToolInstaller
|
|
16
|
+
from secator.definitions import (ADDONS_ENABLED, ASCII, CVES_FOLDER, DATA_FOLDER, DEV_PACKAGE, OPT_NOT_SUPPORTED,
|
|
17
|
+
PAYLOADS_FOLDER, REVSHELLS_FOLDER, ROOT_FOLDER, VERSION)
|
|
18
|
+
from secator.installer import ToolInstaller, get_version_info, get_health_table, fmt_health_table_row
|
|
20
19
|
from secator.rich import console
|
|
21
20
|
from secator.runners import Command
|
|
22
21
|
from secator.serializers.dataclass import loads_dataclass
|
|
23
|
-
from secator.utils import debug, detect_host, discover_tasks, find_list_item, flatten,
|
|
22
|
+
from secator.utils import (debug, detect_host, discover_tasks, find_list_item, flatten,
|
|
23
|
+
print_results_table, print_version)
|
|
24
24
|
|
|
25
25
|
click.rich_click.USE_RICH_MARKUP = True
|
|
26
26
|
|
|
@@ -30,15 +30,6 @@ ALL_WORKFLOWS = ALL_CONFIGS.workflow
|
|
|
30
30
|
ALL_SCANS = ALL_CONFIGS.scan
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
def print_version():
|
|
34
|
-
console.print(f'[bold gold3]Current version[/]: {VERSION}', highlight=False)
|
|
35
|
-
console.print(f'[bold gold3]Latest version[/]: {VERSION_LATEST}', highlight=False)
|
|
36
|
-
console.print(f'[bold gold3]Python binary[/]: {sys.executable}')
|
|
37
|
-
if DEV_PACKAGE:
|
|
38
|
-
console.print(f'[bold gold3]Root folder[/]: {ROOT_FOLDER}')
|
|
39
|
-
console.print(f'[bold gold3]Lib folder[/]: {LIB_FOLDER}')
|
|
40
|
-
|
|
41
|
-
|
|
42
33
|
#-----#
|
|
43
34
|
# CLI #
|
|
44
35
|
#-----#
|
|
@@ -49,10 +40,6 @@ def print_version():
|
|
|
49
40
|
def cli(ctx, version):
|
|
50
41
|
"""Secator CLI."""
|
|
51
42
|
console.print(ASCII, highlight=False)
|
|
52
|
-
if VERSION_OBSOLETE:
|
|
53
|
-
console.print(
|
|
54
|
-
'[bold red]:warning: secator version is outdated: '
|
|
55
|
-
f'run "secator update" to install the newest version ({VERSION_LATEST}).\n')
|
|
56
43
|
if ctx.invoked_subcommand is None:
|
|
57
44
|
if version:
|
|
58
45
|
print_version()
|
|
@@ -119,7 +106,7 @@ for config in sorted(ALL_SCANS, key=lambda x: x['name']):
|
|
|
119
106
|
@click.option('--show', is_flag=True, help='Show command (celery multi).')
|
|
120
107
|
def worker(hostname, concurrency, reload, queue, pool, check, dev, stop, show):
|
|
121
108
|
"""Run a worker."""
|
|
122
|
-
if not
|
|
109
|
+
if not ADDONS_ENABLED['worker']:
|
|
123
110
|
console.print('[bold red]Missing worker addon: please run `secator install addons worker`[/].')
|
|
124
111
|
sys.exit(1)
|
|
125
112
|
from secator.celery import app, is_celery_worker_alive
|
|
@@ -408,7 +395,7 @@ def build():
|
|
|
408
395
|
@build.command('pypi')
|
|
409
396
|
def build_pypi():
|
|
410
397
|
"""Build secator PyPI package."""
|
|
411
|
-
if not
|
|
398
|
+
if not ADDONS_ENABLED['build']:
|
|
412
399
|
console.print('[bold red]Missing build addon: please run `secator install addons build`')
|
|
413
400
|
sys.exit(1)
|
|
414
401
|
with console.status('[bold gold3]Building PyPI package...[/]'):
|
|
@@ -444,7 +431,7 @@ def publish():
|
|
|
444
431
|
@publish.command('pypi')
|
|
445
432
|
def publish_pypi():
|
|
446
433
|
"""Publish secator PyPI package."""
|
|
447
|
-
if not
|
|
434
|
+
if not ADDONS_ENABLED['build']:
|
|
448
435
|
console.print('[bold red]Missing build addon: please run `secator install addons build`')
|
|
449
436
|
sys.exit(1)
|
|
450
437
|
os.environ['HATCH_INDEX_USER'] = '__token__'
|
|
@@ -526,114 +513,64 @@ def report_show(json_path, exclude_fields):
|
|
|
526
513
|
# HEALTH #
|
|
527
514
|
#--------#
|
|
528
515
|
|
|
529
|
-
|
|
530
|
-
def which(command):
|
|
531
|
-
"""Run which on a command.
|
|
532
|
-
|
|
533
|
-
Args:
|
|
534
|
-
command (str): Command to check.
|
|
535
|
-
|
|
536
|
-
Returns:
|
|
537
|
-
secator.Command: Command instance.
|
|
538
|
-
"""
|
|
539
|
-
return Command.execute(f'which {command}', quiet=True, print_errors=False)
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
def get_version_cls(cls):
|
|
543
|
-
"""Get version for a Command.
|
|
544
|
-
|
|
545
|
-
Args:
|
|
546
|
-
cls: Command class.
|
|
547
|
-
|
|
548
|
-
Returns:
|
|
549
|
-
string: Version string or 'n/a' if not found.
|
|
550
|
-
"""
|
|
551
|
-
base_cmd = cls.cmd.split(' ')[0]
|
|
552
|
-
if cls.version_flag == OPT_NOT_SUPPORTED:
|
|
553
|
-
return 'N/A'
|
|
554
|
-
version_flag = cls.version_flag or f'{cls.opt_prefix}version'
|
|
555
|
-
version_cmd = f'{base_cmd} {version_flag}'
|
|
556
|
-
return get_version(version_cmd)
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
def get_version(version_cmd):
|
|
560
|
-
"""Run version command and match first version number found.
|
|
561
|
-
|
|
562
|
-
Args:
|
|
563
|
-
version_cmd (str): Command to get the version.
|
|
564
|
-
|
|
565
|
-
Returns:
|
|
566
|
-
str: Version string.
|
|
567
|
-
"""
|
|
568
|
-
regex = r'[0-9]+\.[0-9]+\.?[0-9]*\.?[a-zA-Z]*'
|
|
569
|
-
ret = Command.execute(version_cmd, quiet=True, print_errors=False)
|
|
570
|
-
match = re.findall(regex, ret.output)
|
|
571
|
-
if not match:
|
|
572
|
-
return 'n/a'
|
|
573
|
-
return match[0]
|
|
574
|
-
|
|
575
|
-
|
|
576
516
|
@cli.command(name='health')
|
|
577
517
|
@click.option('--json', '-json', is_flag=True, default=False, help='JSON lines output')
|
|
578
518
|
@click.option('--debug', '-debug', is_flag=True, default=False, help='Debug health output')
|
|
579
519
|
def health(json, debug):
|
|
580
520
|
"""[dim]Get health status.[/]"""
|
|
581
|
-
tools =
|
|
582
|
-
status = {'
|
|
583
|
-
|
|
584
|
-
def print_status(cmd, return_code, version=None, bin=None, category=None):
|
|
585
|
-
s = '[bold green]ok [/]' if return_code == 0 else '[bold red]missing [/]'
|
|
586
|
-
s = f'[bold magenta]{cmd:<15}[/] {s} '
|
|
587
|
-
if return_code == 0 and version:
|
|
588
|
-
if version == 'N/A':
|
|
589
|
-
s += f'[dim blue]{version:<12}[/]'
|
|
590
|
-
else:
|
|
591
|
-
s += f'[bold blue]{version:<12}[/]'
|
|
592
|
-
elif category:
|
|
593
|
-
s += ' '*12 + f'[dim]# secator install {category} {cmd}'
|
|
594
|
-
if bin:
|
|
595
|
-
s += f'[dim gold3]{bin}[/]'
|
|
596
|
-
console.print(s, highlight=False)
|
|
521
|
+
tools = ALL_TASKS
|
|
522
|
+
status = {'secator': {}, 'languages': {}, 'tools': {}, 'addons': {}}
|
|
597
523
|
|
|
598
524
|
# Check secator
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
525
|
+
console.print(':wrench: [bold gold3]Checking secator ...[/]')
|
|
526
|
+
info = get_version_info('secator', '-version', 'freelabz/secator')
|
|
527
|
+
table = get_health_table()
|
|
528
|
+
with Live(table, console=console):
|
|
529
|
+
row = fmt_health_table_row(info)
|
|
530
|
+
table.add_row(*row)
|
|
531
|
+
status['secator'] = info
|
|
605
532
|
|
|
606
533
|
# Check languages
|
|
607
|
-
|
|
608
|
-
console.print('\n:wrench: [bold gold3]Checking installed languages ...[/]')
|
|
534
|
+
console.print('\n:wrench: [bold gold3]Checking installed languages ...[/]')
|
|
609
535
|
version_cmds = {'go': 'version', 'python3': '--version', 'ruby': '--version'}
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
536
|
+
table = get_health_table()
|
|
537
|
+
with Live(table, console=console):
|
|
538
|
+
for lang, version_flag in version_cmds.items():
|
|
539
|
+
info = get_version_info(lang, version_flag)
|
|
540
|
+
row = fmt_health_table_row(info, 'langs')
|
|
541
|
+
table.add_row(*row)
|
|
542
|
+
status['languages'][lang] = info
|
|
616
543
|
|
|
617
544
|
# Check tools
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
545
|
+
console.print('\n:wrench: [bold gold3]Checking installed tools ...[/]')
|
|
546
|
+
table = get_health_table()
|
|
547
|
+
with Live(table, console=console):
|
|
548
|
+
for tool in tools:
|
|
549
|
+
cmd = tool.cmd.split(' ')[0]
|
|
550
|
+
version_flag = tool.version_flag or f'{tool.opt_prefix}version'
|
|
551
|
+
version_flag = None if tool.version_flag == OPT_NOT_SUPPORTED else version_flag
|
|
552
|
+
info = get_version_info(cmd, version_flag, tool.install_github_handle)
|
|
553
|
+
row = fmt_health_table_row(info, 'tools')
|
|
554
|
+
table.add_row(*row)
|
|
555
|
+
status['tools'][tool.__name__] = info
|
|
556
|
+
|
|
557
|
+
# # Check addons
|
|
558
|
+
console.print('\n:wrench: [bold gold3]Checking installed addons ...[/]')
|
|
559
|
+
table = get_health_table()
|
|
560
|
+
with Live(table, console=console):
|
|
561
|
+
for addon in ['google', 'mongodb', 'redis', 'dev', 'trace', 'build']:
|
|
562
|
+
addon_var = ADDONS_ENABLED[addon]
|
|
563
|
+
info = {
|
|
564
|
+
'name': addon,
|
|
565
|
+
'version': None,
|
|
566
|
+
'status': 'ok' if addon_var else 'missing',
|
|
567
|
+
'latest_version': None,
|
|
568
|
+
'installed': addon_var,
|
|
569
|
+
'location': None
|
|
570
|
+
}
|
|
571
|
+
row = fmt_health_table_row(info, 'addons')
|
|
572
|
+
table.add_row(*row)
|
|
573
|
+
status['addons'][addon] = info
|
|
637
574
|
|
|
638
575
|
# Print JSON health
|
|
639
576
|
if json:
|
|
@@ -675,7 +612,7 @@ def addons():
|
|
|
675
612
|
def install_worker():
|
|
676
613
|
"Install worker addon."
|
|
677
614
|
run_install(
|
|
678
|
-
cmd=f'{sys.executable} -m pip install
|
|
615
|
+
cmd=f'{sys.executable} -m pip install secator[worker]',
|
|
679
616
|
title='worker addon',
|
|
680
617
|
next_steps=[
|
|
681
618
|
'Run "secator worker" to run a Celery worker using the file system as a backend and broker.',
|
|
@@ -689,7 +626,7 @@ def install_worker():
|
|
|
689
626
|
def install_google():
|
|
690
627
|
"Install google addon."
|
|
691
628
|
run_install(
|
|
692
|
-
cmd=f'{sys.executable} -m pip install
|
|
629
|
+
cmd=f'{sys.executable} -m pip install secator[google]',
|
|
693
630
|
title='google addon',
|
|
694
631
|
next_steps=[
|
|
695
632
|
'Set the "GOOGLE_CREDENTIALS_PATH" and "GOOGLE_DRIVE_PARENT_FOLDER_ID" environment variables.',
|
|
@@ -702,7 +639,7 @@ def install_google():
|
|
|
702
639
|
def install_mongodb():
|
|
703
640
|
"Install mongodb addon."
|
|
704
641
|
run_install(
|
|
705
|
-
cmd=f'{sys.executable} -m pip install
|
|
642
|
+
cmd=f'{sys.executable} -m pip install secator[mongodb]',
|
|
706
643
|
title='mongodb addon',
|
|
707
644
|
next_steps=[
|
|
708
645
|
'[dim]\[optional][/] Run "docker run --name mongo -p 27017:27017 -d mongo:latest" to run a local MongoDB instance.',
|
|
@@ -716,7 +653,7 @@ def install_mongodb():
|
|
|
716
653
|
def install_redis():
|
|
717
654
|
"Install redis addon."
|
|
718
655
|
run_install(
|
|
719
|
-
cmd=f'{sys.executable} -m pip install
|
|
656
|
+
cmd=f'{sys.executable} -m pip install secator[redis]',
|
|
720
657
|
title='redis addon',
|
|
721
658
|
next_steps=[
|
|
722
659
|
'[dim]\[optional][/] Run "docker run --name redis -p 6379:6379 -d redis" to run a local Redis instance.',
|
|
@@ -842,13 +779,16 @@ def install_cves(force):
|
|
|
842
779
|
@cli.command('update')
|
|
843
780
|
def update():
|
|
844
781
|
"""[dim]Update to latest version.[/]"""
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
782
|
+
info = get_version_info('secator', github_handle='freelabz/secator', version=VERSION)
|
|
783
|
+
latest_version = info['latest_version']
|
|
784
|
+
if info['status'] == 'latest':
|
|
785
|
+
console.print(f'[bold green]secator is already at the newest version {latest_version}[/] !')
|
|
786
|
+
sys.exit(0)
|
|
787
|
+
console.print(f'[bold gold3]:wrench: Updating secator from {VERSION} to {latest_version} ...[/]')
|
|
848
788
|
if 'pipx' in sys.executable:
|
|
849
|
-
Command.execute(f'pipx install secator=={
|
|
789
|
+
Command.execute(f'pipx install secator=={latest_version} --force')
|
|
850
790
|
else:
|
|
851
|
-
Command.execute(f'pip install secator=={
|
|
791
|
+
Command.execute(f'pip install secator=={latest_version}')
|
|
852
792
|
|
|
853
793
|
|
|
854
794
|
#-------#
|
|
@@ -953,7 +893,7 @@ def test():
|
|
|
953
893
|
if not DEV_PACKAGE:
|
|
954
894
|
console.print('[bold red]You MUST use a development version of secator to run tests.[/]')
|
|
955
895
|
sys.exit(1)
|
|
956
|
-
if not
|
|
896
|
+
if not ADDONS_ENABLED['dev']:
|
|
957
897
|
console.print('[bold red]Missing dev addon: please run `secator install addons dev`')
|
|
958
898
|
sys.exit(1)
|
|
959
899
|
pass
|
|
@@ -5,8 +5,7 @@ import rich_click as click
|
|
|
5
5
|
from rich_click.rich_click import _get_rich_console
|
|
6
6
|
from rich_click.rich_group import RichGroup
|
|
7
7
|
|
|
8
|
-
from secator.definitions import
|
|
9
|
-
WORKER_ADDON_ENABLED)
|
|
8
|
+
from secator.definitions import ADDONS_ENABLED, OPT_NOT_SUPPORTED
|
|
10
9
|
from secator.runners import Scan, Task, Workflow
|
|
11
10
|
from secator.utils import (deduplicate, expand_input, get_command_category,
|
|
12
11
|
get_command_cls)
|
|
@@ -276,7 +275,7 @@ def register_runner(cli_endpoint, config):
|
|
|
276
275
|
# opts.update(unknown_opts)
|
|
277
276
|
targets = opts.pop(input_type)
|
|
278
277
|
targets = expand_input(targets)
|
|
279
|
-
if sync or show or not
|
|
278
|
+
if sync or show or not ADDONS_ENABLED['worker']:
|
|
280
279
|
sync = True
|
|
281
280
|
elif worker:
|
|
282
281
|
sync = False
|
|
@@ -294,7 +293,7 @@ def register_runner(cli_endpoint, config):
|
|
|
294
293
|
# Build hooks from driver name
|
|
295
294
|
hooks = {}
|
|
296
295
|
if driver == 'mongodb':
|
|
297
|
-
if not
|
|
296
|
+
if not ADDONS_ENABLED['mongo']:
|
|
298
297
|
_get_rich_console().print('[bold red]Missing MongoDB dependencies: please run `secator install addons mongodb`[/].')
|
|
299
298
|
sys.exit(1)
|
|
300
299
|
from secator.hooks.mongodb import MONGODB_HOOKS
|
|
@@ -4,34 +4,20 @@ import os
|
|
|
4
4
|
import requests
|
|
5
5
|
|
|
6
6
|
from dotenv import find_dotenv, load_dotenv
|
|
7
|
-
from pkg_resources import get_distribution
|
|
8
|
-
|
|
9
|
-
load_dotenv(find_dotenv(usecwd=True), override=False)
|
|
7
|
+
from pkg_resources import get_distribution
|
|
10
8
|
|
|
9
|
+
from secator.rich import console
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
"""Get latest secator version from GitHub API."""
|
|
14
|
-
try:
|
|
15
|
-
resp = requests.get('https://api.github.com/repos/freelabz/secator/releases/latest', timeout=2)
|
|
16
|
-
resp.raise_for_status()
|
|
17
|
-
latest_version = resp.json()['name'].lstrip('v')
|
|
18
|
-
return latest_version
|
|
19
|
-
except (requests.exceptions.RequestException):
|
|
20
|
-
return None
|
|
21
|
-
|
|
11
|
+
load_dotenv(find_dotenv(usecwd=True), override=False)
|
|
22
12
|
|
|
23
13
|
# Globals
|
|
24
14
|
VERSION = get_distribution('secator').version
|
|
25
|
-
VERSION_LATEST = get_latest_version()
|
|
26
|
-
VERSION_OBSOLETE = parse_version(VERSION_LATEST) > parse_version(VERSION) if VERSION_LATEST else False
|
|
27
|
-
VERSION_STR = f'{VERSION} [bold red](outdated)[/]' if VERSION_OBSOLETE else VERSION
|
|
28
|
-
|
|
29
15
|
ASCII = f"""
|
|
30
16
|
__
|
|
31
17
|
________ _________ _/ /_____ _____
|
|
32
18
|
/ ___/ _ \/ ___/ __ `/ __/ __ \/ ___/
|
|
33
19
|
(__ / __/ /__/ /_/ / /_/ /_/ / /
|
|
34
|
-
/____/\___/\___/\__,_/\__/\____/_/ v{
|
|
20
|
+
/____/\___/\___/\__,_/\__/\____/_/ v{VERSION}
|
|
35
21
|
|
|
36
22
|
freelabz.com
|
|
37
23
|
""" # noqa: W605,W291
|
|
@@ -50,20 +36,10 @@ CVES_FOLDER = f'{DATA_FOLDER}/cves'
|
|
|
50
36
|
PAYLOADS_FOLDER = f'{DATA_FOLDER}/payloads'
|
|
51
37
|
REVSHELLS_FOLDER = f'{DATA_FOLDER}/revshells'
|
|
52
38
|
TESTS_FOLDER = f'{ROOT_FOLDER}/tests'
|
|
53
|
-
os.makedirs(BIN_FOLDER, exist_ok=True)
|
|
54
|
-
os.makedirs(DATA_FOLDER, exist_ok=True)
|
|
55
|
-
os.makedirs(REPORTS_FOLDER, exist_ok=True)
|
|
56
|
-
os.makedirs(WORDLISTS_FOLDER, exist_ok=True)
|
|
57
|
-
os.makedirs(SCRIPTS_FOLDER, exist_ok=True)
|
|
58
|
-
os.makedirs(CVES_FOLDER, exist_ok=True)
|
|
59
|
-
os.makedirs(PAYLOADS_FOLDER, exist_ok=True)
|
|
60
|
-
os.makedirs(REVSHELLS_FOLDER, exist_ok=True)
|
|
61
39
|
|
|
62
40
|
# Celery local fs folders
|
|
63
41
|
CELERY_DATA_FOLDER = f'{DATA_FOLDER}/celery/data'
|
|
64
42
|
CELERY_RESULTS_FOLDER = f'{DATA_FOLDER}/celery/results'
|
|
65
|
-
os.makedirs(CELERY_DATA_FOLDER, exist_ok=True)
|
|
66
|
-
os.makedirs(CELERY_RESULTS_FOLDER, exist_ok=True)
|
|
67
43
|
|
|
68
44
|
# Environment variables
|
|
69
45
|
DEBUG = int(os.environ.get('DEBUG', '0'))
|
|
@@ -99,8 +75,10 @@ DEFAULT_PROGRESS_UPDATE_FREQUENCY = int(os.environ.get('DEFAULT_PROGRESS_UPDATE_
|
|
|
99
75
|
DEFAULT_SKIP_CVE_SEARCH = bool(int(os.environ.get('DEFAULT_SKIP_CVE_SEARCH', 0)))
|
|
100
76
|
|
|
101
77
|
# Default wordlists
|
|
102
|
-
DEFAULT_HTTP_WORDLIST = os.environ.get('DEFAULT_HTTP_WORDLIST', f'{WORDLISTS_FOLDER}/
|
|
103
|
-
|
|
78
|
+
DEFAULT_HTTP_WORDLIST = os.environ.get('DEFAULT_HTTP_WORDLIST', f'{WORDLISTS_FOLDER}/fuzz-Bo0oM.txt')
|
|
79
|
+
DEFAULT_HTTP_WORDLIST_URL = 'https://raw.githubusercontent.com/Bo0oM/fuzz.txt/master/fuzz.txt'
|
|
80
|
+
DEFAULT_DNS_WORDLIST = os.environ.get('DEFAULT_DNS_WORDLIST', f'{WORDLISTS_FOLDER}/combined_subdomains.txt')
|
|
81
|
+
DEFAULT_DNS_WORDLIST_URL = 'https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/DNS/combined_subdomains.txt' # noqa: E501
|
|
104
82
|
|
|
105
83
|
# Constants
|
|
106
84
|
OPT_NOT_SUPPORTED = -1
|
|
@@ -175,57 +153,84 @@ WEBSERVER = 'webserver'
|
|
|
175
153
|
WORDLIST = 'wordlist'
|
|
176
154
|
WORDS = 'words'
|
|
177
155
|
|
|
156
|
+
|
|
157
|
+
# Create all folders
|
|
158
|
+
for folder in [BIN_FOLDER, DATA_FOLDER, REPORTS_FOLDER, WORDLISTS_FOLDER, CVES_FOLDER, PAYLOADS_FOLDER,
|
|
159
|
+
REVSHELLS_FOLDER, CELERY_DATA_FOLDER, CELERY_RESULTS_FOLDER]:
|
|
160
|
+
if not os.path.exists(folder):
|
|
161
|
+
console.print(f'[bold turquoise4]Creating folder {folder} ...[/] ', end='')
|
|
162
|
+
os.makedirs(folder)
|
|
163
|
+
console.print('[bold green]ok.[/]')
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# Download default wordlists
|
|
167
|
+
for wordlist in ['HTTP', 'DNS']:
|
|
168
|
+
wordlist_path = globals()[f'DEFAULT_{wordlist}_WORDLIST']
|
|
169
|
+
wordlist_url = globals()[f'DEFAULT_{wordlist}_WORDLIST_URL']
|
|
170
|
+
if not os.path.exists(wordlist_path):
|
|
171
|
+
try:
|
|
172
|
+
console.print(f'[bold turquoise4]Downloading default {wordlist} wordlist {wordlist_path} ...[/] ', end='')
|
|
173
|
+
resp = requests.get(wordlist_url)
|
|
174
|
+
with open(wordlist_path, 'w') as f:
|
|
175
|
+
f.write(resp.text)
|
|
176
|
+
console.print('[bold green]ok.[/]')
|
|
177
|
+
except requests.exceptions.RequestException as e:
|
|
178
|
+
console.print(f'[bold green]failed ({type(e).__name__}).[/]')
|
|
179
|
+
pass
|
|
180
|
+
|
|
181
|
+
ADDONS_ENABLED = {}
|
|
182
|
+
|
|
178
183
|
# Check worker addon
|
|
179
184
|
try:
|
|
180
185
|
import eventlet # noqa: F401
|
|
181
|
-
|
|
186
|
+
ADDONS_ENABLED['worker'] = True
|
|
182
187
|
except ModuleNotFoundError:
|
|
183
|
-
|
|
188
|
+
ADDONS_ENABLED['worker'] = False
|
|
184
189
|
|
|
185
190
|
# Check google addon
|
|
186
191
|
try:
|
|
187
192
|
import gspread # noqa: F401
|
|
188
|
-
|
|
193
|
+
ADDONS_ENABLED['google'] = True
|
|
189
194
|
except ModuleNotFoundError:
|
|
190
|
-
|
|
195
|
+
ADDONS_ENABLED['google'] = False
|
|
191
196
|
|
|
192
197
|
# Check mongodb addon
|
|
193
198
|
try:
|
|
194
199
|
import pymongo # noqa: F401
|
|
195
|
-
|
|
200
|
+
ADDONS_ENABLED['mongodb'] = True
|
|
196
201
|
except ModuleNotFoundError:
|
|
197
|
-
|
|
202
|
+
ADDONS_ENABLED['mongodb'] = False
|
|
198
203
|
|
|
199
204
|
# Check redis addon
|
|
200
205
|
try:
|
|
201
206
|
import redis # noqa: F401
|
|
202
|
-
|
|
207
|
+
ADDONS_ENABLED['redis'] = True
|
|
203
208
|
except ModuleNotFoundError:
|
|
204
|
-
|
|
209
|
+
ADDONS_ENABLED['redis'] = False
|
|
205
210
|
|
|
206
211
|
# Check dev addon
|
|
207
212
|
try:
|
|
208
213
|
import flake8 # noqa: F401
|
|
209
|
-
|
|
214
|
+
ADDONS_ENABLED['dev'] = True
|
|
210
215
|
except ModuleNotFoundError:
|
|
211
|
-
|
|
216
|
+
ADDONS_ENABLED['dev'] = False
|
|
212
217
|
|
|
213
218
|
# Check build addon
|
|
214
219
|
try:
|
|
215
220
|
import hatch # noqa: F401
|
|
216
|
-
|
|
221
|
+
ADDONS_ENABLED['build'] = True
|
|
217
222
|
except ModuleNotFoundError:
|
|
218
|
-
|
|
223
|
+
ADDONS_ENABLED['build'] = False
|
|
219
224
|
|
|
220
225
|
# Check trace addon
|
|
221
226
|
try:
|
|
222
227
|
import memray # noqa: F401
|
|
223
|
-
|
|
228
|
+
ADDONS_ENABLED['trace'] = True
|
|
224
229
|
except ModuleNotFoundError:
|
|
225
|
-
|
|
230
|
+
ADDONS_ENABLED['trace'] = False
|
|
226
231
|
|
|
227
232
|
# Check dev package
|
|
228
233
|
if os.path.exists(f'{ROOT_FOLDER}/pyproject.toml'):
|
|
229
|
-
DEV_PACKAGE =
|
|
234
|
+
DEV_PACKAGE = True
|
|
230
235
|
else:
|
|
231
|
-
DEV_PACKAGE =
|
|
236
|
+
DEV_PACKAGE = False
|