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.

Files changed (161) hide show
  1. {secator-0.3.0 → secator-0.3.2}/CHANGELOG.md +23 -0
  2. {secator-0.3.0 → secator-0.3.2}/PKG-INFO +2 -2
  3. {secator-0.3.0 → secator-0.3.2}/README.md +1 -1
  4. {secator-0.3.0 → secator-0.3.2}/pyproject.toml +1 -1
  5. {secator-0.3.0 → secator-0.3.2}/scripts/install.sh +4 -4
  6. {secator-0.3.0 → secator-0.3.2}/scripts/install_go.sh +3 -6
  7. {secator-0.3.0 → secator-0.3.2}/secator/celery.py +1 -1
  8. {secator-0.3.0 → secator-0.3.2}/secator/cli.py +68 -128
  9. {secator-0.3.0 → secator-0.3.2}/secator/decorators.py +3 -4
  10. {secator-0.3.0 → secator-0.3.2}/secator/definitions.py +51 -46
  11. {secator-0.3.0 → secator-0.3.2}/secator/installer.py +159 -16
  12. {secator-0.3.0 → secator-0.3.2}/secator/rich.py +2 -8
  13. {secator-0.3.0 → secator-0.3.2}/secator/runners/_base.py +47 -15
  14. {secator-0.3.0 → secator-0.3.2}/secator/runners/task.py +4 -3
  15. {secator-0.3.0 → secator-0.3.2}/secator/runners/workflow.py +1 -1
  16. {secator-0.3.0 → secator-0.3.2}/secator/tasks/_categories.py +6 -11
  17. {secator-0.3.0 → secator-0.3.2}/secator/tasks/searchsploit.py +1 -0
  18. {secator-0.3.0 → secator-0.3.2}/secator/utils.py +25 -1
  19. {secator-0.3.0 → secator-0.3.2}/.flake8 +0 -0
  20. {secator-0.3.0 → secator-0.3.2}/.gitignore +0 -0
  21. {secator-0.3.0 → secator-0.3.2}/CONTRIBUTING.md +0 -0
  22. {secator-0.3.0 → secator-0.3.2}/Dockerfile +0 -0
  23. {secator-0.3.0 → secator-0.3.2}/LICENSE +0 -0
  24. {secator-0.3.0 → secator-0.3.2}/SECURITY.md +0 -0
  25. {secator-0.3.0 → secator-0.3.2}/cloudbuild.yaml +0 -0
  26. {secator-0.3.0 → secator-0.3.2}/images/aliases.cast +0 -0
  27. {secator-0.3.0 → secator-0.3.2}/images/aliases.gif +0 -0
  28. {secator-0.3.0 → secator-0.3.2}/images/demo.cast +0 -0
  29. {secator-0.3.0 → secator-0.3.2}/images/demo.gif +0 -0
  30. {secator-0.3.0 → secator-0.3.2}/images/fmt.cast +0 -0
  31. {secator-0.3.0 → secator-0.3.2}/images/fmt.gif +0 -0
  32. {secator-0.3.0 → secator-0.3.2}/images/help.png +0 -0
  33. {secator-0.3.0 → secator-0.3.2}/images/input.cast +0 -0
  34. {secator-0.3.0 → secator-0.3.2}/images/input.gif +0 -0
  35. {secator-0.3.0 → secator-0.3.2}/images/pipe.cast +0 -0
  36. {secator-0.3.0 → secator-0.3.2}/images/pipe.gif +0 -0
  37. {secator-0.3.0 → secator-0.3.2}/images/short_demo.cast +0 -0
  38. {secator-0.3.0 → secator-0.3.2}/images/short_demo.gif +0 -0
  39. {secator-0.3.0 → secator-0.3.2}/scripts/download_cves.sh +0 -0
  40. {secator-0.3.0 → secator-0.3.2}/scripts/install_asciinema.sh +0 -0
  41. {secator-0.3.0 → secator-0.3.2}/scripts/install_ruby.sh +0 -0
  42. {secator-0.3.0 → secator-0.3.2}/scripts/msf/exploit_cve.rc +0 -0
  43. {secator-0.3.0 → secator-0.3.2}/scripts/msf/ftp_anonymous.rc +0 -0
  44. {secator-0.3.0 → secator-0.3.2}/scripts/msf/ftp_version.rc +0 -0
  45. {secator-0.3.0 → secator-0.3.2}/scripts/msf/ftp_vsftpd_234_backdoor.rc +0 -0
  46. {secator-0.3.0 → secator-0.3.2}/scripts/msf/redis.rc +0 -0
  47. {secator-0.3.0 → secator-0.3.2}/scripts/msfinstall.sh +0 -0
  48. {secator-0.3.0 → secator-0.3.2}/scripts/stories/STORY.md +0 -0
  49. {secator-0.3.0 → secator-0.3.2}/scripts/stories/aliases.sh +0 -0
  50. {secator-0.3.0 → secator-0.3.2}/scripts/stories/demo.sh +0 -0
  51. {secator-0.3.0 → secator-0.3.2}/scripts/stories/fmt.sh +0 -0
  52. {secator-0.3.0 → secator-0.3.2}/scripts/stories/input.sh +0 -0
  53. {secator-0.3.0 → secator-0.3.2}/scripts/stories/pipe.sh +0 -0
  54. {secator-0.3.0 → secator-0.3.2}/scripts/stories/short_demo.sh +0 -0
  55. {secator-0.3.0 → secator-0.3.2}/secator/.gitignore +0 -0
  56. {secator-0.3.0 → secator-0.3.2}/secator/__init__.py +0 -0
  57. {secator-0.3.0 → secator-0.3.2}/secator/config.py +0 -0
  58. {secator-0.3.0 → secator-0.3.2}/secator/configs/__init__.py +0 -0
  59. {secator-0.3.0 → secator-0.3.2}/secator/configs/profiles/__init__.py +0 -0
  60. {secator-0.3.0 → secator-0.3.2}/secator/configs/profiles/aggressive.yaml +0 -0
  61. {secator-0.3.0 → secator-0.3.2}/secator/configs/profiles/default.yaml +0 -0
  62. {secator-0.3.0 → secator-0.3.2}/secator/configs/profiles/stealth.yaml +0 -0
  63. {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/__init__.py +0 -0
  64. {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/domain.yaml +0 -0
  65. {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/host.yaml +0 -0
  66. {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/network.yaml +0 -0
  67. {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/subdomain.yaml +0 -0
  68. {secator-0.3.0 → secator-0.3.2}/secator/configs/scans/url.yaml +0 -0
  69. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/__init__.py +0 -0
  70. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/cidr_recon.yaml +0 -0
  71. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/code_scan.yaml +0 -0
  72. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/host_recon.yaml +0 -0
  73. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/port_scan.yaml +0 -0
  74. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/subdomain_recon.yaml +0 -0
  75. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_crawl.yaml +0 -0
  76. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_dirsearch.yaml +0 -0
  77. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_fuzz.yaml +0 -0
  78. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_nuclei.yaml +0 -0
  79. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/url_vuln.yaml +0 -0
  80. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/user_hunt.yaml +0 -0
  81. {secator-0.3.0 → secator-0.3.2}/secator/configs/workflows/wordpress.yaml +0 -0
  82. {secator-0.3.0 → secator-0.3.2}/secator/exporters/__init__.py +0 -0
  83. {secator-0.3.0 → secator-0.3.2}/secator/exporters/_base.py +0 -0
  84. {secator-0.3.0 → secator-0.3.2}/secator/exporters/csv.py +0 -0
  85. {secator-0.3.0 → secator-0.3.2}/secator/exporters/gdrive.py +0 -0
  86. {secator-0.3.0 → secator-0.3.2}/secator/exporters/json.py +0 -0
  87. {secator-0.3.0 → secator-0.3.2}/secator/exporters/table.py +0 -0
  88. {secator-0.3.0 → secator-0.3.2}/secator/exporters/txt.py +0 -0
  89. {secator-0.3.0 → secator-0.3.2}/secator/hooks/__init__.py +0 -0
  90. {secator-0.3.0 → secator-0.3.2}/secator/hooks/mongodb.py +0 -0
  91. {secator-0.3.0 → secator-0.3.2}/secator/output_types/__init__.py +0 -0
  92. {secator-0.3.0 → secator-0.3.2}/secator/output_types/_base.py +0 -0
  93. {secator-0.3.0 → secator-0.3.2}/secator/output_types/exploit.py +0 -0
  94. {secator-0.3.0 → secator-0.3.2}/secator/output_types/ip.py +0 -0
  95. {secator-0.3.0 → secator-0.3.2}/secator/output_types/port.py +0 -0
  96. {secator-0.3.0 → secator-0.3.2}/secator/output_types/progress.py +0 -0
  97. {secator-0.3.0 → secator-0.3.2}/secator/output_types/record.py +0 -0
  98. {secator-0.3.0 → secator-0.3.2}/secator/output_types/subdomain.py +0 -0
  99. {secator-0.3.0 → secator-0.3.2}/secator/output_types/tag.py +0 -0
  100. {secator-0.3.0 → secator-0.3.2}/secator/output_types/target.py +0 -0
  101. {secator-0.3.0 → secator-0.3.2}/secator/output_types/url.py +0 -0
  102. {secator-0.3.0 → secator-0.3.2}/secator/output_types/user_account.py +0 -0
  103. {secator-0.3.0 → secator-0.3.2}/secator/output_types/vulnerability.py +0 -0
  104. {secator-0.3.0 → secator-0.3.2}/secator/report.py +0 -0
  105. {secator-0.3.0 → secator-0.3.2}/secator/runners/__init__.py +0 -0
  106. {secator-0.3.0 → secator-0.3.2}/secator/runners/_helpers.py +0 -0
  107. {secator-0.3.0 → secator-0.3.2}/secator/runners/command.py +0 -0
  108. {secator-0.3.0 → secator-0.3.2}/secator/runners/scan.py +0 -0
  109. {secator-0.3.0 → secator-0.3.2}/secator/serializers/__init__.py +0 -0
  110. {secator-0.3.0 → secator-0.3.2}/secator/serializers/dataclass.py +0 -0
  111. {secator-0.3.0 → secator-0.3.2}/secator/serializers/json.py +0 -0
  112. {secator-0.3.0 → secator-0.3.2}/secator/serializers/regex.py +0 -0
  113. {secator-0.3.0 → secator-0.3.2}/secator/tasks/__init__.py +0 -0
  114. {secator-0.3.0 → secator-0.3.2}/secator/tasks/cariddi.py +0 -0
  115. {secator-0.3.0 → secator-0.3.2}/secator/tasks/dalfox.py +0 -0
  116. {secator-0.3.0 → secator-0.3.2}/secator/tasks/dirsearch.py +0 -0
  117. {secator-0.3.0 → secator-0.3.2}/secator/tasks/dnsx.py +0 -0
  118. {secator-0.3.0 → secator-0.3.2}/secator/tasks/dnsxbrute.py +0 -0
  119. {secator-0.3.0 → secator-0.3.2}/secator/tasks/feroxbuster.py +0 -0
  120. {secator-0.3.0 → secator-0.3.2}/secator/tasks/ffuf.py +0 -0
  121. {secator-0.3.0 → secator-0.3.2}/secator/tasks/fping.py +0 -0
  122. {secator-0.3.0 → secator-0.3.2}/secator/tasks/gau.py +0 -0
  123. {secator-0.3.0 → secator-0.3.2}/secator/tasks/gf.py +0 -0
  124. {secator-0.3.0 → secator-0.3.2}/secator/tasks/gospider.py +0 -0
  125. {secator-0.3.0 → secator-0.3.2}/secator/tasks/grype.py +0 -0
  126. {secator-0.3.0 → secator-0.3.2}/secator/tasks/h8mail.py +0 -0
  127. {secator-0.3.0 → secator-0.3.2}/secator/tasks/httpx.py +0 -0
  128. {secator-0.3.0 → secator-0.3.2}/secator/tasks/katana.py +0 -0
  129. {secator-0.3.0 → secator-0.3.2}/secator/tasks/maigret.py +0 -0
  130. {secator-0.3.0 → secator-0.3.2}/secator/tasks/mapcidr.py +0 -0
  131. {secator-0.3.0 → secator-0.3.2}/secator/tasks/msfconsole.py +0 -0
  132. {secator-0.3.0 → secator-0.3.2}/secator/tasks/naabu.py +0 -0
  133. {secator-0.3.0 → secator-0.3.2}/secator/tasks/nmap.py +0 -0
  134. {secator-0.3.0 → secator-0.3.2}/secator/tasks/nuclei.py +0 -0
  135. {secator-0.3.0 → secator-0.3.2}/secator/tasks/subfinder.py +0 -0
  136. {secator-0.3.0 → secator-0.3.2}/secator/tasks/wpscan.py +0 -0
  137. {secator-0.3.0 → secator-0.3.2}/secator/utils_test.py +0 -0
  138. {secator-0.3.0 → secator-0.3.2}/tests/__init__.py +0 -0
  139. {secator-0.3.0 → secator-0.3.2}/tests/fixtures/h8mail_breach.txt +0 -0
  140. {secator-0.3.0 → secator-0.3.2}/tests/fixtures/msfconsole_input.rc +0 -0
  141. {secator-0.3.0 → secator-0.3.2}/tests/fixtures/nmap_output.xml +0 -0
  142. {secator-0.3.0 → secator-0.3.2}/tests/integration/__init__.py +0 -0
  143. {secator-0.3.0 → secator-0.3.2}/tests/integration/inputs.py +0 -0
  144. {secator-0.3.0 → secator-0.3.2}/tests/integration/outputs.py +0 -0
  145. {secator-0.3.0 → secator-0.3.2}/tests/integration/setup.sh +0 -0
  146. {secator-0.3.0 → secator-0.3.2}/tests/integration/teardown.sh +0 -0
  147. {secator-0.3.0 → secator-0.3.2}/tests/integration/test_scans.py +0 -0
  148. {secator-0.3.0 → secator-0.3.2}/tests/integration/test_tasks.py +0 -0
  149. {secator-0.3.0 → secator-0.3.2}/tests/integration/test_workflows.py +0 -0
  150. {secator-0.3.0 → secator-0.3.2}/tests/integration/wordlist.txt +0 -0
  151. {secator-0.3.0 → secator-0.3.2}/tests/integration/wordlist_dns.txt +0 -0
  152. {secator-0.3.0 → secator-0.3.2}/tests/integration/wordpress_toolbox/Dockerfile +0 -0
  153. {secator-0.3.0 → secator-0.3.2}/tests/integration/wordpress_toolbox/Makefile +0 -0
  154. {secator-0.3.0 → secator-0.3.2}/tests/performance/__init__.py +0 -0
  155. {secator-0.3.0 → secator-0.3.2}/tests/performance/loadtester.py +0 -0
  156. {secator-0.3.0 → secator-0.3.2}/tests/unit/__init__.py +0 -0
  157. {secator-0.3.0 → secator-0.3.2}/tests/unit/test_celery.py +0 -0
  158. {secator-0.3.0 → secator-0.3.2}/tests/unit/test_scans.py +0 -0
  159. {secator-0.3.0 → secator-0.3.2}/tests/unit/test_serializers.py +0 -0
  160. {secator-0.3.0 → secator-0.3.2}/tests/unit/test_tasks.py +0 -0
  161. {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.0
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>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "secator"
7
- version = "0.3.0"
7
+ version = "0.3.2"
8
8
  authors = [{ name = "FreeLabz", email = "sales@freelabz.com" }]
9
9
  readme = "README.md"
10
10
  description = "The pentester's swiss knife."
@@ -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 Python and pipx ...${NC}"
11
- sudo apt install -y python3-pip pipx
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
- source ~/.bashrc
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 rm /usr/bin/go || true
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='SIGKILL')
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 (ASCII, BUILD_ADDON_ENABLED, CVES_FOLDER, DATA_FOLDER, DEV_ADDON_ENABLED, # noqa: F401
16
- DEV_PACKAGE, GOOGLE_ADDON_ENABLED, VERSION_LATEST, LIB_FOLDER, MONGODB_ADDON_ENABLED,
17
- VERSION_OBSOLETE, OPT_NOT_SUPPORTED, PAYLOADS_FOLDER, REDIS_ADDON_ENABLED, REVSHELLS_FOLDER, ROOT_FOLDER,
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, print_results_table
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 WORKER_ADDON_ENABLED:
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 BUILD_ADDON_ENABLED:
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 BUILD_ADDON_ENABLED:
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 = [cls for cls in ALL_TASKS]
582
- status = {'tools': {}, 'languages': {}, 'secator': {}}
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
- if not json:
600
- console.print(':wrench: [bold gold3]Checking secator ...[/]')
601
- ret = which('secator')
602
- if not json:
603
- print_status('secator', ret.return_code, VERSION, ret.output, None)
604
- status['secator'] = {'installed': ret.return_code == 0, 'version': VERSION}
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
- if not json:
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
- for lang, version_flag in version_cmds.items():
611
- ret = which(lang)
612
- version = get_version(f'{lang} {version_flag}')
613
- if not json:
614
- print_status(lang, ret.return_code, version, ret.output, 'langs')
615
- status['languages'][lang] = {'installed': ret.return_code == 0, 'version': version}
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
- if not json:
619
- console.print('\n:wrench: [bold gold3]Checking installed tools ...[/]')
620
- for tool in tools:
621
- cmd = tool.cmd.split(' ')[0]
622
- ret = which(cmd)
623
- version = get_version_cls(tool)
624
- if not json:
625
- print_status(tool.__name__, ret.return_code, version, ret.output, 'tools')
626
- status['tools'][tool.__name__] = {'installed': ret.return_code == 0, 'version': version}
627
-
628
- # Check addons
629
- if not json:
630
- console.print('\n:wrench: [bold gold3]Checking installed addons ...[/]')
631
- for addon in ['google', 'mongodb', 'redis', 'dev', 'trace', 'build']:
632
- addon_var = globals()[f'{addon.upper()}_ADDON_ENABLED']
633
- ret = 0 if addon_var == 1 else 1
634
- bin = None if addon_var == 0 else ' '
635
- if not json:
636
- print_status(addon, ret, 'N/A', bin, 'addons')
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 .[worker]',
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 .[google]',
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 .[mongodb]',
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 .[redis]',
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
- if not VERSION_OBSOLETE:
846
- console.print(f'[bold green]secator is already at the newest version {VERSION_LATEST}[/]')
847
- console.print(f'[bold gold3]:wrench: Updating secator from {VERSION} to {VERSION_LATEST} ...[/]')
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=={VERSION_LATEST} --force')
789
+ Command.execute(f'pipx install secator=={latest_version} --force')
850
790
  else:
851
- Command.execute(f'pip install secator=={VERSION_LATEST}')
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 DEV_ADDON_ENABLED:
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 (MONGODB_ADDON_ENABLED, OPT_NOT_SUPPORTED,
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 WORKER_ADDON_ENABLED:
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 MONGODB_ADDON_ENABLED:
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, parse_version
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
- def get_latest_version():
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{VERSION_STR}
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}/Fuzzing/fuzz-Bo0oM.txt')
103
- DEFAULT_DNS_WORDLIST = os.environ.get('DEFAULT_DNS_WORDLIST', f'{WORDLISTS_FOLDER}/Discovery/DNS/combined_subdomains.txt') # noqa:E501
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
- WORKER_ADDON_ENABLED = 1
186
+ ADDONS_ENABLED['worker'] = True
182
187
  except ModuleNotFoundError:
183
- WORKER_ADDON_ENABLED = 0
188
+ ADDONS_ENABLED['worker'] = False
184
189
 
185
190
  # Check google addon
186
191
  try:
187
192
  import gspread # noqa: F401
188
- GOOGLE_ADDON_ENABLED = 1
193
+ ADDONS_ENABLED['google'] = True
189
194
  except ModuleNotFoundError:
190
- GOOGLE_ADDON_ENABLED = 0
195
+ ADDONS_ENABLED['google'] = False
191
196
 
192
197
  # Check mongodb addon
193
198
  try:
194
199
  import pymongo # noqa: F401
195
- MONGODB_ADDON_ENABLED = 1
200
+ ADDONS_ENABLED['mongodb'] = True
196
201
  except ModuleNotFoundError:
197
- MONGODB_ADDON_ENABLED = 0
202
+ ADDONS_ENABLED['mongodb'] = False
198
203
 
199
204
  # Check redis addon
200
205
  try:
201
206
  import redis # noqa: F401
202
- REDIS_ADDON_ENABLED = 1
207
+ ADDONS_ENABLED['redis'] = True
203
208
  except ModuleNotFoundError:
204
- REDIS_ADDON_ENABLED = 0
209
+ ADDONS_ENABLED['redis'] = False
205
210
 
206
211
  # Check dev addon
207
212
  try:
208
213
  import flake8 # noqa: F401
209
- DEV_ADDON_ENABLED = 1
214
+ ADDONS_ENABLED['dev'] = True
210
215
  except ModuleNotFoundError:
211
- DEV_ADDON_ENABLED = 0
216
+ ADDONS_ENABLED['dev'] = False
212
217
 
213
218
  # Check build addon
214
219
  try:
215
220
  import hatch # noqa: F401
216
- BUILD_ADDON_ENABLED = 1
221
+ ADDONS_ENABLED['build'] = True
217
222
  except ModuleNotFoundError:
218
- BUILD_ADDON_ENABLED = 0
223
+ ADDONS_ENABLED['build'] = False
219
224
 
220
225
  # Check trace addon
221
226
  try:
222
227
  import memray # noqa: F401
223
- TRACE_ADDON_ENABLED = 1
228
+ ADDONS_ENABLED['trace'] = True
224
229
  except ModuleNotFoundError:
225
- TRACE_ADDON_ENABLED = 0
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 = 1
234
+ DEV_PACKAGE = True
230
235
  else:
231
- DEV_PACKAGE = 0
236
+ DEV_PACKAGE = False