cancan-microstack 0.0.1__py3-none-any.whl

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.
Files changed (440) hide show
  1. cancan_microstack/__init__.py +14 -0
  2. cancan_microstack/__version__.py +10 -0
  3. cancan_microstack/assets/__init__.py +6 -0
  4. cancan_microstack/assets/builds/caddy/Caddyfile +187 -0
  5. cancan_microstack/assets/builds/caddy/DEPLOYMENT.md +303 -0
  6. cancan_microstack/assets/builds/caddy/Dockerfile +46 -0
  7. cancan_microstack/assets/builds/caddy/README.md +343 -0
  8. cancan_microstack/assets/builds/caddy/geoip/README.md +5 -0
  9. cancan_microstack/assets/builds/caddy/start.sh +78 -0
  10. cancan_microstack/assets/builds/caddy/waf/coraza.conf +179 -0
  11. cancan_microstack/assets/builds/service/Dockerfile +59 -0
  12. cancan_microstack/assets/builds/service/README.md +13 -0
  13. cancan_microstack/assets/ddl/create_db.sql +22 -0
  14. cancan_microstack/assets/ddl/infra/execution_log_tbl.sql +46 -0
  15. cancan_microstack/assets/ddl/infra/node_instance_tbl.sql +56 -0
  16. cancan_microstack/assets/ddl/infra/service_action_log_tbl.sql +36 -0
  17. cancan_microstack/assets/ddl/infra/service_config_tbl.sql +26 -0
  18. cancan_microstack/assets/ddl/infra/service_info_tbl.sql +45 -0
  19. cancan_microstack/assets/ddl/infra/service_instance_tbl.sql +54 -0
  20. cancan_microstack/assets/ddl/infra/service_operation_tbl.sql +47 -0
  21. cancan_microstack/assets/ddl/infra/workflow_definition_tbl.sql +60 -0
  22. cancan_microstack/assets/ddl/infra/workflow_definition_version_tbl.sql +35 -0
  23. cancan_microstack/assets/ddl/infra/workflow_engine_alert_tbl.sql +34 -0
  24. cancan_microstack/assets/ddl/infra/workflow_run_tbl.sql +52 -0
  25. cancan_microstack/assets/ddl/ops/admin_user_tbl.sql +34 -0
  26. cancan_microstack/assets/ddl/ops/caddy_access_log_tbl.sql +91 -0
  27. cancan_microstack/assets/ddl/ops/caddy_certificate_tbl.sql +59 -0
  28. cancan_microstack/assets/ddl/ops/caddy_rate_limit_tbl.sql +64 -0
  29. cancan_microstack/assets/ddl/ops/caddy_route_tbl.sql +63 -0
  30. cancan_microstack/assets/ddl/ops/caddy_stats_tbl.sql +77 -0
  31. cancan_microstack/assets/ddl/trigger.sql +21 -0
  32. cancan_microstack/assets/docker/docker-compose.infra.yml +401 -0
  33. cancan_microstack/assets/scripts/README.md +195 -0
  34. cancan_microstack/assets/scripts/docker/build_images.sh +44 -0
  35. cancan_microstack/assets/scripts/docker/force_rebuild_images.sh +38 -0
  36. cancan_microstack/assets/scripts/docker/rebuild_all.sh +34 -0
  37. cancan_microstack/assets/scripts/docker/rebuild_compose.sh +61 -0
  38. cancan_microstack/assets/scripts/docker/restart.sh +35 -0
  39. cancan_microstack/assets/scripts/docker/restart_compose.sh +35 -0
  40. cancan_microstack/assets/scripts/docker/start.sh +78 -0
  41. cancan_microstack/assets/scripts/docker/start_all.sh +46 -0
  42. cancan_microstack/assets/scripts/docker/start_compose.sh +66 -0
  43. cancan_microstack/assets/scripts/docker/stop.sh +67 -0
  44. cancan_microstack/assets/scripts/docker/stop_all.sh +38 -0
  45. cancan_microstack/assets/scripts/docker/stop_compose.sh +38 -0
  46. cancan_microstack/assets/scripts/podman/build_images_podman.sh +59 -0
  47. cancan_microstack/assets/scripts/podman/cleanup_podman.sh +25 -0
  48. cancan_microstack/assets/scripts/podman/force_rebuild_images_podman.sh +56 -0
  49. cancan_microstack/assets/scripts/podman/rebuild_all_podman.sh +37 -0
  50. cancan_microstack/assets/scripts/podman/rebuild_compose_podman.sh +60 -0
  51. cancan_microstack/assets/scripts/podman/restart_compose_podman.sh +73 -0
  52. cancan_microstack/assets/scripts/podman/start_all_podman.sh +66 -0
  53. cancan_microstack/assets/scripts/podman/start_compose_podman.sh +80 -0
  54. cancan_microstack/assets/scripts/podman/start_podman.sh +91 -0
  55. cancan_microstack/assets/scripts/podman/stop.sh +73 -0
  56. cancan_microstack/assets/scripts/podman/stop_all_podman.sh +34 -0
  57. cancan_microstack/assets/scripts/podman/stop_compose_podman.sh +58 -0
  58. cancan_microstack/assets/scripts/start_controllersrv.sh +9 -0
  59. cancan_microstack/assets/scripts/utils/check_all_db_tables.sh +104 -0
  60. cancan_microstack/assets/scripts/utils/check_env.sh +177 -0
  61. cancan_microstack/assets/scripts/utils/check_service_management_deployment.sh +225 -0
  62. cancan_microstack/assets/scripts/utils/deploy_service_management.sh +176 -0
  63. cancan_microstack/assets/scripts/utils/force_reload_infrasrv.sh +52 -0
  64. cancan_microstack/assets/scripts/utils/monitor_service_management.sh +187 -0
  65. cancan_microstack/assets/scripts/utils/reset_postgres_volume.sh +68 -0
  66. cancan_microstack/assets/scripts/utils/test_async_operations.sh +141 -0
  67. cancan_microstack/assets/scripts/utils/verify_real_operations.sh +76 -0
  68. cancan_microstack/assets/service/Dockerfile +65 -0
  69. cancan_microstack/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-BOKUurnM.js +1 -0
  70. cancan_microstack/assets/www/adminops/assets/ConfigManage-DKV5YOUz.js +1 -0
  71. cancan_microstack/assets/www/adminops/assets/ConfigManage-Y5bhy7wG.css +1 -0
  72. cancan_microstack/assets/www/adminops/assets/ConsoleManage-8ljYvCW2.js +1 -0
  73. cancan_microstack/assets/www/adminops/assets/ConsoleManage-BWpyqbuQ.css +1 -0
  74. cancan_microstack/assets/www/adminops/assets/DashboardNew-B9Nf1OPl.js +1 -0
  75. cancan_microstack/assets/www/adminops/assets/DashboardNew-DYWZKQ1V.css +1 -0
  76. cancan_microstack/assets/www/adminops/assets/LogSearch-CA0Jhe78.js +1 -0
  77. cancan_microstack/assets/www/adminops/assets/LogSearch-CCZfTNPF.css +1 -0
  78. cancan_microstack/assets/www/adminops/assets/LoginView-BId3kP3M.css +1 -0
  79. cancan_microstack/assets/www/adminops/assets/LoginView-BQZTV_Qy.js +1 -0
  80. cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-BdEYwqFq.js +1 -0
  81. cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-D-pASR8G.css +1 -0
  82. cancan_microstack/assets/www/adminops/assets/PageContainer-Byss-yUC.js +1 -0
  83. cancan_microstack/assets/www/adminops/assets/PageContainer-C3nSZwM7.css +1 -0
  84. cancan_microstack/assets/www/adminops/assets/RateLimitManage-BDI8jLpC.css +1 -0
  85. cancan_microstack/assets/www/adminops/assets/RateLimitManage-DJY4NiF-.js +1 -0
  86. cancan_microstack/assets/www/adminops/assets/RouteManage-DaUQ4QLw.css +1 -0
  87. cancan_microstack/assets/www/adminops/assets/RouteManage-w9XCU0UA.js +1 -0
  88. cancan_microstack/assets/www/adminops/assets/ServiceCard-BFzHe6Tw.css +1 -0
  89. cancan_microstack/assets/www/adminops/assets/ServiceCard-BJUhWnA-.js +1 -0
  90. cancan_microstack/assets/www/adminops/assets/ServiceDetail-Cw24WuKp.js +1 -0
  91. cancan_microstack/assets/www/adminops/assets/ServiceDetail-Yum47zdB.css +1 -0
  92. cancan_microstack/assets/www/adminops/assets/ServiceList-C7ryvbhE.js +1 -0
  93. cancan_microstack/assets/www/adminops/assets/ServiceList-Cgd01fUx.css +1 -0
  94. cancan_microstack/assets/www/adminops/assets/ServiceLogs-COpG9H0h.js +1 -0
  95. cancan_microstack/assets/www/adminops/assets/ServiceLogs-H_Alq0cf.css +1 -0
  96. cancan_microstack/assets/www/adminops/assets/StatsOverview-D0TwMQkA.js +39 -0
  97. cancan_microstack/assets/www/adminops/assets/StatsOverview-lqAN6pqM.css +1 -0
  98. cancan_microstack/assets/www/adminops/assets/TotpBindView-CWlAmzFt.js +1 -0
  99. cancan_microstack/assets/www/adminops/assets/TotpBindView-HoQC1lhx.css +1 -0
  100. cancan_microstack/assets/www/adminops/assets/TotpVerifyView-BHN1VtX1.css +1 -0
  101. cancan_microstack/assets/www/adminops/assets/TotpVerifyView-D3w_lZk8.js +1 -0
  102. cancan_microstack/assets/www/adminops/assets/WorkflowCenter-DU_mpIA0.css +1 -0
  103. cancan_microstack/assets/www/adminops/assets/WorkflowCenter-i50rZyxN.js +1 -0
  104. cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-CnHokPL9.js +1 -0
  105. cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-DaZaZpLd.css +1 -0
  106. cancan_microstack/assets/www/adminops/assets/WorkflowRuns-B09hK48c.js +1 -0
  107. cancan_microstack/assets/www/adminops/assets/WorkflowRuns-wGutKIIU.css +1 -0
  108. cancan_microstack/assets/www/adminops/assets/caddy-nnCKf8fG.js +1 -0
  109. cancan_microstack/assets/www/adminops/assets/format-Cuzxgna9.js +1 -0
  110. cancan_microstack/assets/www/adminops/assets/index-CiFlm8oc.js +64 -0
  111. cancan_microstack/assets/www/adminops/assets/index-UW0T1Dkc.css +1 -0
  112. cancan_microstack/assets/www/adminops/assets/service-BYlgGPs_.js +1 -0
  113. cancan_microstack/assets/www/adminops/assets/service-operation-6GzLw2Z1.js +1 -0
  114. cancan_microstack/assets/www/adminops/assets/style-CcIXnQ5y.css +1 -0
  115. cancan_microstack/assets/www/adminops/assets/style-lRnStdGu.js +39 -0
  116. cancan_microstack/assets/www/adminops/assets/useDebounce-BRlqfXqf.js +1 -0
  117. cancan_microstack/assets/www/adminops/assets/workflow-CUXs39Ac.js +1 -0
  118. cancan_microstack/assets/www/adminops/index.html +16 -0
  119. cancan_microstack/assets/www/adminops/vite.svg +1 -0
  120. cancan_microstack/cli/__init__.py +14 -0
  121. cancan_microstack/cli/__main__.py +9 -0
  122. cancan_microstack/cli/main.py +552 -0
  123. cancan_microstack/cmd/__init__.py +54 -0
  124. cancan_microstack/cmd/cancan/__init__.py +12 -0
  125. cancan_microstack/cmd/cancan/run.py +395 -0
  126. cancan_microstack/cmd/controllersrv/__init__.py +0 -0
  127. cancan_microstack/cmd/controllersrv/run.py +131 -0
  128. cancan_microstack/cmd/infrasrv/__init__.py +5 -0
  129. cancan_microstack/cmd/infrasrv/run.py +100 -0
  130. cancan_microstack/cmd/opsbffsrv/__init__.py +5 -0
  131. cancan_microstack/cmd/opsbffsrv/run.py +96 -0
  132. cancan_microstack/core/__init__.py +5 -0
  133. cancan_microstack/core/assets.py +123 -0
  134. cancan_microstack/core/compose_builder.py +102 -0
  135. cancan_microstack/core/doctor.py +152 -0
  136. cancan_microstack/core/microstack.py +71 -0
  137. cancan_microstack/core/runner.py +56 -0
  138. cancan_microstack/core/stack_manager.py +186 -0
  139. cancan_microstack/public/__init__.py +7 -0
  140. cancan_microstack/public/api/__init__.py +1 -0
  141. cancan_microstack/public/api/controllersrv_client.py +277 -0
  142. cancan_microstack/public/api/infrasrv_client.py +404 -0
  143. cancan_microstack/public/const/__init__.py +1 -0
  144. cancan_microstack/public/const/action_consts.py +18 -0
  145. cancan_microstack/public/const/app_consts.py +42 -0
  146. cancan_microstack/public/const/caddy_consts.py +22 -0
  147. cancan_microstack/public/const/controllersrv_consts.py +163 -0
  148. cancan_microstack/public/const/docker_consts.py +15 -0
  149. cancan_microstack/public/const/error.py +56 -0
  150. cancan_microstack/public/const/health_consts.py +52 -0
  151. cancan_microstack/public/const/hook_enums.py +56 -0
  152. cancan_microstack/public/const/logging_enums.py +13 -0
  153. cancan_microstack/public/const/metrics_enums.py +36 -0
  154. cancan_microstack/public/const/monitor_enums.py +26 -0
  155. cancan_microstack/public/const/operation_consts.py +53 -0
  156. cancan_microstack/public/const/opsbffsrv_error.py +92 -0
  157. cancan_microstack/public/const/overrides_consts.py +13 -0
  158. cancan_microstack/public/const/redis.py +17 -0
  159. cancan_microstack/public/const/service_consts.py +15 -0
  160. cancan_microstack/public/const/workflow_consts.py +65 -0
  161. cancan_microstack/public/error.py +41 -0
  162. cancan_microstack/public/logging/__init__.py +0 -0
  163. cancan_microstack/public/logging/initializer.py +109 -0
  164. cancan_microstack/public/logging/mq_handler.py +279 -0
  165. cancan_microstack/public/schemas/__init__.py +1 -0
  166. cancan_microstack/public/schemas/caddy/__init__.py +381 -0
  167. cancan_microstack/public/schemas/caddy/analysis.py +90 -0
  168. cancan_microstack/public/schemas/caddy/route.py +18 -0
  169. cancan_microstack/public/schemas/common.py +79 -0
  170. cancan_microstack/public/schemas/controllersrv/__init__.py +3 -0
  171. cancan_microstack/public/schemas/controllersrv/async_requests.py +30 -0
  172. cancan_microstack/public/schemas/controllersrv/compose_models.py +47 -0
  173. cancan_microstack/public/schemas/controllersrv/const.py +24 -0
  174. cancan_microstack/public/schemas/controllersrv/docker_models.py +45 -0
  175. cancan_microstack/public/schemas/controllersrv/docker_responses.py +104 -0
  176. cancan_microstack/public/schemas/controllersrv/requests.py +54 -0
  177. cancan_microstack/public/schemas/controllersrv/responses.py +124 -0
  178. cancan_microstack/public/schemas/controllersrv/task_models.py +102 -0
  179. cancan_microstack/public/schemas/controllersrv/validation.py +23 -0
  180. cancan_microstack/public/schemas/hook_metrics.py +124 -0
  181. cancan_microstack/public/schemas/hooks.py +39 -0
  182. cancan_microstack/public/schemas/infra/__init__.py +0 -0
  183. cancan_microstack/public/schemas/infra/cleanup.py +25 -0
  184. cancan_microstack/public/schemas/infra/container.py +74 -0
  185. cancan_microstack/public/schemas/infra/enums.py +135 -0
  186. cancan_microstack/public/schemas/infra/health_check.py +42 -0
  187. cancan_microstack/public/schemas/infra/hook_log.py +42 -0
  188. cancan_microstack/public/schemas/infra/operation.py +90 -0
  189. cancan_microstack/public/schemas/infra/overview.py +25 -0
  190. cancan_microstack/public/schemas/infra/push.py +33 -0
  191. cancan_microstack/public/schemas/infra/service_action_log.py +47 -0
  192. cancan_microstack/public/schemas/infra/service_config.py +10 -0
  193. cancan_microstack/public/schemas/infra/service_info.py +69 -0
  194. cancan_microstack/public/schemas/infra/service_instance.py +93 -0
  195. cancan_microstack/public/schemas/infra/service_management.py +152 -0
  196. cancan_microstack/public/schemas/infra/service_operation.py +79 -0
  197. cancan_microstack/public/schemas/infra/service_registry.py +158 -0
  198. cancan_microstack/public/schemas/infra/status_types.py +19 -0
  199. cancan_microstack/public/schemas/infra/workflow.py +566 -0
  200. cancan_microstack/public/schemas/logging/__init__.py +1 -0
  201. cancan_microstack/public/schemas/logging/log_event.py +121 -0
  202. cancan_microstack/public/schemas/opsbffsrv/__init__.py +1 -0
  203. cancan_microstack/public/schemas/opsbffsrv/async_ops.py +17 -0
  204. cancan_microstack/public/schemas/opsbffsrv/db_admin.py +147 -0
  205. cancan_microstack/public/schemas/opsbffsrv/db_init.py +48 -0
  206. cancan_microstack/public/schemas/opsbffsrv/service_config.py +89 -0
  207. cancan_microstack/public/schemas/opsbffsrv/service_logs.py +54 -0
  208. cancan_microstack/public/schemas/service_operation.py +24 -0
  209. cancan_microstack/public/schemas/service_registry.py +40 -0
  210. cancan_microstack/public/types/__init__.py +7 -0
  211. cancan_microstack/public/web/__init__.py +0 -0
  212. cancan_microstack/public/web/config_value.py +105 -0
  213. cancan_microstack/public/web/server.py +385 -0
  214. cancan_microstack/py.typed +0 -0
  215. cancan_microstack/runtime/__init__.py +0 -0
  216. cancan_microstack/runtime/compose_cmd.py +228 -0
  217. cancan_microstack/runtime/host_daemon.py +318 -0
  218. cancan_microstack/runtime/overrides.py +103 -0
  219. cancan_microstack/runtime/resources.py +25 -0
  220. cancan_microstack/runtime/workspace.py +94 -0
  221. cancan_microstack/services/__init__.py +0 -0
  222. cancan_microstack/services/controllersrv/__init__.py +8 -0
  223. cancan_microstack/services/controllersrv/application/__init__.py +0 -0
  224. cancan_microstack/services/controllersrv/application/docker_compose_app.py +427 -0
  225. cancan_microstack/services/controllersrv/conf/__init__.py +0 -0
  226. cancan_microstack/services/controllersrv/conf/config.py +76 -0
  227. cancan_microstack/services/controllersrv/conf/settings.py +54 -0
  228. cancan_microstack/services/controllersrv/domain/__init__.py +0 -0
  229. cancan_microstack/services/controllersrv/domain/docker_compose/__init__.py +0 -0
  230. cancan_microstack/services/controllersrv/domain/docker_compose/docker_compose_domain.py +278 -0
  231. cancan_microstack/services/controllersrv/domain/service_validator.py +327 -0
  232. cancan_microstack/services/controllersrv/domain/task/__init__.py +17 -0
  233. cancan_microstack/services/controllersrv/domain/task/task_queue.py +286 -0
  234. cancan_microstack/services/controllersrv/domain/task/task_worker.py +495 -0
  235. cancan_microstack/services/controllersrv/infrastructure/__init__.py +0 -0
  236. cancan_microstack/services/controllersrv/interface/__init__.py +0 -0
  237. cancan_microstack/services/controllersrv/interface/api/__init__.py +0 -0
  238. cancan_microstack/services/controllersrv/interface/api/docker_control_api.py +470 -0
  239. cancan_microstack/services/controllersrv/router.py +132 -0
  240. cancan_microstack/services/infrasrv/__init__.py +4 -0
  241. cancan_microstack/services/infrasrv/application/__init__.py +0 -0
  242. cancan_microstack/services/infrasrv/application/health_check_app.py +24 -0
  243. cancan_microstack/services/infrasrv/application/logging/__init__.py +1 -0
  244. cancan_microstack/services/infrasrv/application/logging/log_ingestion_service.py +183 -0
  245. cancan_microstack/services/infrasrv/application/service_config.py +22 -0
  246. cancan_microstack/services/infrasrv/application/service_logs_app.py +53 -0
  247. cancan_microstack/services/infrasrv/application/service_management_app.py +689 -0
  248. cancan_microstack/services/infrasrv/application/service_operation_tracker.py +251 -0
  249. cancan_microstack/services/infrasrv/application/service_registry.py +53 -0
  250. cancan_microstack/services/infrasrv/application/workflow/__init__.py +0 -0
  251. cancan_microstack/services/infrasrv/application/workflow/workflow_app.py +991 -0
  252. cancan_microstack/services/infrasrv/application/workflow/workflow_queue.py +302 -0
  253. cancan_microstack/services/infrasrv/application/workflow/workflow_tasks.py +46 -0
  254. cancan_microstack/services/infrasrv/application/workflow/workflow_worker_runtime.py +122 -0
  255. cancan_microstack/services/infrasrv/conf/__init__.py +0 -0
  256. cancan_microstack/services/infrasrv/conf/config.py +98 -0
  257. cancan_microstack/services/infrasrv/domain/__init__.py +0 -0
  258. cancan_microstack/services/infrasrv/domain/health_check/__init__.py +3 -0
  259. cancan_microstack/services/infrasrv/domain/health_check/health_check_domain.py +576 -0
  260. cancan_microstack/services/infrasrv/domain/hooks/__init__.py +19 -0
  261. cancan_microstack/services/infrasrv/domain/hooks/builtin_hooks.py +308 -0
  262. cancan_microstack/services/infrasrv/domain/hooks/hook_registry.py +43 -0
  263. cancan_microstack/services/infrasrv/domain/hooks/hooks_log_utils.py +275 -0
  264. cancan_microstack/services/infrasrv/domain/hooks/init.py +17 -0
  265. cancan_microstack/services/infrasrv/domain/hooks/metrics.py +205 -0
  266. cancan_microstack/services/infrasrv/domain/hooks/pre_registration_hooks.py +490 -0
  267. cancan_microstack/services/infrasrv/domain/registry/__init__.py +0 -0
  268. cancan_microstack/services/infrasrv/domain/registry/service_registry.py +509 -0
  269. cancan_microstack/services/infrasrv/domain/service_config/__init__.py +0 -0
  270. cancan_microstack/services/infrasrv/domain/service_config/service_config.py +50 -0
  271. cancan_microstack/services/infrasrv/domain/service_logs/__init__.py +0 -0
  272. cancan_microstack/services/infrasrv/domain/service_logs/service_logs_domain.py +51 -0
  273. cancan_microstack/services/infrasrv/domain/workflow/__init__.py +4 -0
  274. cancan_microstack/services/infrasrv/domain/workflow/engine.py +159 -0
  275. cancan_microstack/services/infrasrv/domain/workflow/node_handlers.py +509 -0
  276. cancan_microstack/services/infrasrv/domain/workflow/workflow_domain.py +164 -0
  277. cancan_microstack/services/infrasrv/infrastructure/__init__.py +0 -0
  278. cancan_microstack/services/infrasrv/infrastructure/api/__init__.py +0 -0
  279. cancan_microstack/services/infrasrv/infrastructure/api/controllersrv_api.py +165 -0
  280. cancan_microstack/services/infrasrv/infrastructure/cache/__init__.py +0 -0
  281. cancan_microstack/services/infrasrv/infrastructure/cache/service_registry_cache.py +174 -0
  282. cancan_microstack/services/infrasrv/infrastructure/db/__init__.py +0 -0
  283. cancan_microstack/services/infrasrv/infrastructure/db/model/__init__.py +0 -0
  284. cancan_microstack/services/infrasrv/infrastructure/db/model/execution_log_tbl.py +53 -0
  285. cancan_microstack/services/infrasrv/infrastructure/db/model/node_instance_tbl.py +55 -0
  286. cancan_microstack/services/infrasrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
  287. cancan_microstack/services/infrasrv/infrastructure/db/model/service_config_tbl.py +30 -0
  288. cancan_microstack/services/infrasrv/infrastructure/db/model/service_info_tbl.py +59 -0
  289. cancan_microstack/services/infrasrv/infrastructure/db/model/service_instance_tbl.py +88 -0
  290. cancan_microstack/services/infrasrv/infrastructure/db/model/service_operation_tbl.py +73 -0
  291. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_tbl.py +55 -0
  292. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_version_tbl.py +43 -0
  293. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_engine_alert_tbl.py +57 -0
  294. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_run_tbl.py +56 -0
  295. cancan_microstack/services/infrasrv/infrastructure/db/operate/__init__.py +0 -0
  296. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_action_log_op.py +239 -0
  297. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config.py +80 -0
  298. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config_manager.py +198 -0
  299. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_info_op.py +297 -0
  300. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_instance_op.py +688 -0
  301. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_operation_op.py +387 -0
  302. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_registry.py +124 -0
  303. cancan_microstack/services/infrasrv/infrastructure/db/operate/workflow_op.py +804 -0
  304. cancan_microstack/services/infrasrv/infrastructure/ddl_manager.py +31 -0
  305. cancan_microstack/services/infrasrv/infrastructure/mongo/__init__.py +1 -0
  306. cancan_microstack/services/infrasrv/infrastructure/mongo/log_repository.py +129 -0
  307. cancan_microstack/services/infrasrv/interface/__init__.py +0 -0
  308. cancan_microstack/services/infrasrv/interface/api/__init__.py +0 -0
  309. cancan_microstack/services/infrasrv/interface/api/health_check_api.py +29 -0
  310. cancan_microstack/services/infrasrv/interface/api/hooks.py +284 -0
  311. cancan_microstack/services/infrasrv/interface/api/internal.py +49 -0
  312. cancan_microstack/services/infrasrv/interface/api/internal_instance_api.py +265 -0
  313. cancan_microstack/services/infrasrv/interface/api/internal_operation_api.py +206 -0
  314. cancan_microstack/services/infrasrv/interface/api/service_config.py +50 -0
  315. cancan_microstack/services/infrasrv/interface/api/service_logs_api.py +49 -0
  316. cancan_microstack/services/infrasrv/interface/api/service_management_api.py +113 -0
  317. cancan_microstack/services/infrasrv/interface/api/service_registry.py +117 -0
  318. cancan_microstack/services/infrasrv/interface/api/workflow_api.py +303 -0
  319. cancan_microstack/services/infrasrv/interface/schedule/__init__.py +0 -0
  320. cancan_microstack/services/infrasrv/interface/schedule/cleanup.py +13 -0
  321. cancan_microstack/services/infrasrv/interface/schedule/health_check.py +27 -0
  322. cancan_microstack/services/infrasrv/interface/schedule/log_cleanup.py +26 -0
  323. cancan_microstack/services/infrasrv/interface/schedule/operation_tracker.py +25 -0
  324. cancan_microstack/services/infrasrv/interface/schedule/scheduler.py +39 -0
  325. cancan_microstack/services/infrasrv/interface/schedule/workflow_scheduler.py +115 -0
  326. cancan_microstack/services/infrasrv/router.py +341 -0
  327. cancan_microstack/services/opsbffsrv/__init__.py +4 -0
  328. cancan_microstack/services/opsbffsrv/application/__init__.py +0 -0
  329. cancan_microstack/services/opsbffsrv/application/async_operation_app.py +150 -0
  330. cancan_microstack/services/opsbffsrv/application/auth_app.py +285 -0
  331. cancan_microstack/services/opsbffsrv/application/caddy/__init__.py +0 -0
  332. cancan_microstack/services/opsbffsrv/application/caddy/access_log_analysis_app.py +344 -0
  333. cancan_microstack/services/opsbffsrv/application/caddy/access_log_ingestion_service.py +169 -0
  334. cancan_microstack/services/opsbffsrv/application/caddy/certificate_management_app.py +355 -0
  335. cancan_microstack/services/opsbffsrv/application/caddy/rate_limit_management_app.py +496 -0
  336. cancan_microstack/services/opsbffsrv/application/caddy/route_management_app.py +401 -0
  337. cancan_microstack/services/opsbffsrv/application/caddy/stats_aggregation_app.py +364 -0
  338. cancan_microstack/services/opsbffsrv/application/db_admin_app.py +103 -0
  339. cancan_microstack/services/opsbffsrv/application/db_init_app.py +283 -0
  340. cancan_microstack/services/opsbffsrv/application/logging/__init__.py +1 -0
  341. cancan_microstack/services/opsbffsrv/application/logging/log_query_app.py +28 -0
  342. cancan_microstack/services/opsbffsrv/application/service_config.py +158 -0
  343. cancan_microstack/services/opsbffsrv/application/service_logs_app.py +74 -0
  344. cancan_microstack/services/opsbffsrv/application/service_registry.py +36 -0
  345. cancan_microstack/services/opsbffsrv/application/workflow_ops_app.py +730 -0
  346. cancan_microstack/services/opsbffsrv/conf/__init__.py +0 -0
  347. cancan_microstack/services/opsbffsrv/conf/config.py +224 -0
  348. cancan_microstack/services/opsbffsrv/domain/__init__.py +0 -0
  349. cancan_microstack/services/opsbffsrv/domain/auth/__init__.py +0 -0
  350. cancan_microstack/services/opsbffsrv/domain/auth/admin_init.py +38 -0
  351. cancan_microstack/services/opsbffsrv/domain/auth/auth_domain.py +108 -0
  352. cancan_microstack/services/opsbffsrv/domain/caddy/__init__.py +0 -0
  353. cancan_microstack/services/opsbffsrv/domain/caddy/access_log_analysis.py +358 -0
  354. cancan_microstack/services/opsbffsrv/domain/caddy/certificate_management.py +325 -0
  355. cancan_microstack/services/opsbffsrv/domain/caddy/default_routes.py +53 -0
  356. cancan_microstack/services/opsbffsrv/domain/caddy/rate_limit_management.py +308 -0
  357. cancan_microstack/services/opsbffsrv/domain/caddy/route_management.py +279 -0
  358. cancan_microstack/services/opsbffsrv/domain/caddy/stats_aggregation.py +654 -0
  359. cancan_microstack/services/opsbffsrv/domain/db_admin/__init__.py +0 -0
  360. cancan_microstack/services/opsbffsrv/domain/db_admin/db_admin_domain.py +118 -0
  361. cancan_microstack/services/opsbffsrv/domain/db_init/__init__.py +3 -0
  362. cancan_microstack/services/opsbffsrv/domain/db_init/db_init_domain.py +358 -0
  363. cancan_microstack/services/opsbffsrv/domain/logging/__init__.py +1 -0
  364. cancan_microstack/services/opsbffsrv/domain/logging/log_query_domain.py +99 -0
  365. cancan_microstack/services/opsbffsrv/domain/service_config/__init__.py +0 -0
  366. cancan_microstack/services/opsbffsrv/domain/service_config/service_config.py +81 -0
  367. cancan_microstack/services/opsbffsrv/domain/service_registry/__init__.py +0 -0
  368. cancan_microstack/services/opsbffsrv/domain/service_registry/service_registry.py +292 -0
  369. cancan_microstack/services/opsbffsrv/infrastructure/__init__.py +0 -0
  370. cancan_microstack/services/opsbffsrv/infrastructure/api/__init__.py +0 -0
  371. cancan_microstack/services/opsbffsrv/infrastructure/api/infrasrv_api.py +242 -0
  372. cancan_microstack/services/opsbffsrv/infrastructure/auth/__init__.py +0 -0
  373. cancan_microstack/services/opsbffsrv/infrastructure/auth/captcha_service.py +67 -0
  374. cancan_microstack/services/opsbffsrv/infrastructure/auth/password_service.py +12 -0
  375. cancan_microstack/services/opsbffsrv/infrastructure/auth/redis_store.py +131 -0
  376. cancan_microstack/services/opsbffsrv/infrastructure/auth/totp_service.py +59 -0
  377. cancan_microstack/services/opsbffsrv/infrastructure/caddy/__init__.py +0 -0
  378. cancan_microstack/services/opsbffsrv/infrastructure/caddy/access_log_parser.py +307 -0
  379. cancan_microstack/services/opsbffsrv/infrastructure/caddy/admin_api_client.py +678 -0
  380. cancan_microstack/services/opsbffsrv/infrastructure/caddy/ip_geo_locator.py +176 -0
  381. cancan_microstack/services/opsbffsrv/infrastructure/db/__init__.py +0 -0
  382. cancan_microstack/services/opsbffsrv/infrastructure/db/model/__init__.py +0 -0
  383. cancan_microstack/services/opsbffsrv/infrastructure/db/model/admin_user_tbl.py +33 -0
  384. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_access_log_tbl.py +90 -0
  385. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_certificate_tbl.py +65 -0
  386. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_rate_limit_tbl.py +69 -0
  387. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_route_tbl.py +66 -0
  388. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_stats_tbl.py +78 -0
  389. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
  390. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_config_tbl.py +30 -0
  391. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_info_tbl.py +51 -0
  392. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_instance_tbl.py +68 -0
  393. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/__init__.py +0 -0
  394. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/admin_user_operate.py +59 -0
  395. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_access_log.py +531 -0
  396. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_certificate.py +451 -0
  397. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_rate_limit.py +360 -0
  398. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_route.py +271 -0
  399. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_stats.py +343 -0
  400. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_action_log_op.py +57 -0
  401. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_config.py +86 -0
  402. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_info_op.py +79 -0
  403. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_instance.py +58 -0
  404. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_registry.py +138 -0
  405. cancan_microstack/services/opsbffsrv/infrastructure/ddl_manager.py +31 -0
  406. cancan_microstack/services/opsbffsrv/infrastructure/mongo/__init__.py +1 -0
  407. cancan_microstack/services/opsbffsrv/infrastructure/mongo/log_query_repository.py +87 -0
  408. cancan_microstack/services/opsbffsrv/interface/__init__.py +0 -0
  409. cancan_microstack/services/opsbffsrv/interface/api/__init__.py +0 -0
  410. cancan_microstack/services/opsbffsrv/interface/api/async_operation_api.py +137 -0
  411. cancan_microstack/services/opsbffsrv/interface/api/auth_api.py +113 -0
  412. cancan_microstack/services/opsbffsrv/interface/api/caddy/__init__.py +3 -0
  413. cancan_microstack/services/opsbffsrv/interface/api/caddy/access_log_api.py +174 -0
  414. cancan_microstack/services/opsbffsrv/interface/api/caddy/certificate_api.py +235 -0
  415. cancan_microstack/services/opsbffsrv/interface/api/caddy/rate_limit_api.py +302 -0
  416. cancan_microstack/services/opsbffsrv/interface/api/caddy/route_api.py +250 -0
  417. cancan_microstack/services/opsbffsrv/interface/api/caddy/stats_api.py +243 -0
  418. cancan_microstack/services/opsbffsrv/interface/api/db_admin_api.py +62 -0
  419. cancan_microstack/services/opsbffsrv/interface/api/db_init_api.py +109 -0
  420. cancan_microstack/services/opsbffsrv/interface/api/instance_management_api.py +165 -0
  421. cancan_microstack/services/opsbffsrv/interface/api/log_query_api.py +41 -0
  422. cancan_microstack/services/opsbffsrv/interface/api/mongo_express_proxy_api.py +181 -0
  423. cancan_microstack/services/opsbffsrv/interface/api/pgweb_proxy_api.py +154 -0
  424. cancan_microstack/services/opsbffsrv/interface/api/rabbitmq_mgmt_proxy_api.py +518 -0
  425. cancan_microstack/services/opsbffsrv/interface/api/redis_commander_proxy_api.py +133 -0
  426. cancan_microstack/services/opsbffsrv/interface/api/service_config.py +146 -0
  427. cancan_microstack/services/opsbffsrv/interface/api/service_logs_api.py +81 -0
  428. cancan_microstack/services/opsbffsrv/interface/api/service_registry.py +66 -0
  429. cancan_microstack/services/opsbffsrv/interface/api/workflow_ops_api.py +413 -0
  430. cancan_microstack/services/opsbffsrv/interface/middleware/__init__.py +0 -0
  431. cancan_microstack/services/opsbffsrv/interface/middleware/auth_middleware.py +52 -0
  432. cancan_microstack/services/opsbffsrv/router.py +901 -0
  433. cancan_microstack/utils/__init__.py +1 -0
  434. cancan_microstack/utils/container_env.py +218 -0
  435. cancan_microstack-0.0.1.dist-info/METADATA +155 -0
  436. cancan_microstack-0.0.1.dist-info/RECORD +440 -0
  437. cancan_microstack-0.0.1.dist-info/WHEEL +5 -0
  438. cancan_microstack-0.0.1.dist-info/entry_points.txt +2 -0
  439. cancan_microstack-0.0.1.dist-info/licenses/LICENSE +21 -0
  440. cancan_microstack-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,360 @@
1
+ """
2
+ Caddy 限流规则表的数据库操作函数
3
+ """
4
+ from typing import (
5
+ Any,
6
+ Dict,
7
+ List,
8
+ Optional,
9
+ )
10
+ from sqlalchemy import select, update, delete, func, and_, or_
11
+ from sqlalchemy.dialects.postgresql import insert
12
+
13
+ from linglong_web import Rmanager
14
+ from cancan_microstack.public.schemas.caddy import CaddyRateLimit, CaddyRateLimitCreate
15
+ from cancan_microstack.services.opsbffsrv.infrastructure.db.model.caddy_rate_limit_tbl import CaddyRateLimitTbl
16
+
17
+
18
+ async def get_rate_limit_by_id(rule_id: int) -> Optional[CaddyRateLimit]:
19
+ """
20
+ 根据 ID 查询限流规则
21
+
22
+ Args:
23
+ rule_id: 规则 ID
24
+
25
+ Returns:
26
+ 限流规则对象或 None
27
+ """
28
+ async with Rmanager.pg_session() as session:
29
+ async with session.begin():
30
+ stmt = select(CaddyRateLimitTbl).where(CaddyRateLimitTbl.id == rule_id)
31
+ row = (await session.execute(stmt)).scalar_one_or_none()
32
+ return CaddyRateLimit.model_validate(row, from_attributes=True) if row else None
33
+
34
+
35
+ async def get_rate_limit_by_name(rule_name: str) -> Optional[CaddyRateLimit]:
36
+ """
37
+ 根据规则名称查询限流规则
38
+
39
+ Args:
40
+ rule_name: 规则名称
41
+
42
+ Returns:
43
+ 限流规则对象或 None
44
+ """
45
+ async with Rmanager.pg_session() as session:
46
+ async with session.begin():
47
+ stmt = select(CaddyRateLimitTbl).where(CaddyRateLimitTbl.rule_name == rule_name)
48
+ row = (await session.execute(stmt)).scalar_one_or_none()
49
+ return CaddyRateLimit.model_validate(row, from_attributes=True) if row else None
50
+
51
+
52
+ async def get_enabled_rate_limits() -> List[CaddyRateLimit]:
53
+ """
54
+ 查询所有已启用的限流规则
55
+
56
+ Returns:
57
+ 限流规则列表(按优先级降序)
58
+ """
59
+ async with Rmanager.pg_session() as session:
60
+ async with session.begin():
61
+ stmt = select(CaddyRateLimitTbl).where(
62
+ CaddyRateLimitTbl.is_enabled == True
63
+ ).order_by(CaddyRateLimitTbl.priority.desc(), CaddyRateLimitTbl.created_time)
64
+ rows = list((await session.execute(stmt)).scalars().all())
65
+ return [CaddyRateLimit.model_validate(r, from_attributes=True) for r in rows] if rows else []
66
+
67
+
68
+ async def get_rate_limits_by_match_type(match_type: str) -> List[CaddyRateLimit]:
69
+ """
70
+ 根据匹配类型查询限流规则
71
+
72
+ Args:
73
+ match_type: 匹配类型(path/domain/ip/header/all)
74
+
75
+ Returns:
76
+ 限流规则列表
77
+ """
78
+ async with Rmanager.pg_session() as session:
79
+ async with session.begin():
80
+ stmt = select(CaddyRateLimitTbl).where(
81
+ CaddyRateLimitTbl.match_type == match_type
82
+ ).order_by(CaddyRateLimitTbl.priority.desc())
83
+ rows = list((await session.execute(stmt)).scalars().all())
84
+ return [CaddyRateLimit.model_validate(r, from_attributes=True) for r in rows] if rows else []
85
+
86
+
87
+ async def get_all_rate_limits(filters: Optional[Dict[str, Any]] = None) -> List[CaddyRateLimit]:
88
+ """
89
+ 查询所有限流规则(支持动态过滤)
90
+
91
+ Args:
92
+ filters: 过滤条件字典
93
+
94
+ Returns:
95
+ 限流规则列表
96
+ """
97
+ async with Rmanager.pg_session() as session:
98
+ async with session.begin():
99
+ stmt = select(CaddyRateLimitTbl)
100
+
101
+ # 动态添加查询条件
102
+ if filters:
103
+ for key, value in filters.items():
104
+ if hasattr(CaddyRateLimitTbl, key) and value is not None:
105
+ stmt = stmt.where(getattr(CaddyRateLimitTbl, key) == value)
106
+
107
+ stmt = stmt.order_by(CaddyRateLimitTbl.priority.desc(), CaddyRateLimitTbl.created_time)
108
+ rows = list((await session.execute(stmt)).scalars().all())
109
+ return [CaddyRateLimit.model_validate(r, from_attributes=True) for r in rows] if rows else []
110
+
111
+
112
+ async def create_rate_limit(rate_limit: CaddyRateLimitCreate) -> CaddyRateLimit:
113
+ """
114
+ 创建新限流规则
115
+
116
+ Args:
117
+ rate_limit: 限流规则创建对象
118
+
119
+ Returns:
120
+ 创建后的限流规则对象
121
+ """
122
+ async with Rmanager.pg_session() as session:
123
+ async with session.begin():
124
+ stmt = insert(CaddyRateLimitTbl).values(
125
+ **rate_limit.model_dump()
126
+ ).returning(CaddyRateLimitTbl)
127
+ row = (await session.execute(stmt)).scalar_one()
128
+ return CaddyRateLimit.model_validate(row, from_attributes=True)
129
+
130
+
131
+ async def update_rate_limit(rule_id: int, data: Dict[str, Any]) -> Optional[CaddyRateLimit]:
132
+ """
133
+ 更新限流规则
134
+
135
+ Args:
136
+ rule_id: 规则 ID
137
+ data: 更新数据字典
138
+
139
+ Returns:
140
+ 更新后的限流规则对象或 None
141
+ """
142
+ async with Rmanager.pg_session() as session:
143
+ async with session.begin():
144
+ stmt = update(CaddyRateLimitTbl).where(
145
+ CaddyRateLimitTbl.id == rule_id
146
+ ).values(**data).returning(CaddyRateLimitTbl)
147
+ row = (await session.execute(stmt)).scalar_one_or_none()
148
+ return CaddyRateLimit.model_validate(row, from_attributes=True) if row else None
149
+
150
+
151
+ async def update_rate_limit_by_name(rule_name: str, data: Dict[str, Any]) -> Optional[CaddyRateLimit]:
152
+ """
153
+ 根据规则名称更新限流规则
154
+
155
+ Args:
156
+ rule_name: 规则名称
157
+ data: 更新数据字典
158
+
159
+ Returns:
160
+ 更新后的限流规则对象或 None
161
+ """
162
+ async with Rmanager.pg_session() as session:
163
+ async with session.begin():
164
+ stmt = update(CaddyRateLimitTbl).where(
165
+ CaddyRateLimitTbl.rule_name == rule_name
166
+ ).values(**data).returning(CaddyRateLimitTbl)
167
+ row = (await session.execute(stmt)).scalar_one_or_none()
168
+ return CaddyRateLimit.model_validate(row, from_attributes=True) if row else None
169
+
170
+
171
+ async def enable_rate_limit(rule_id: int) -> Optional[CaddyRateLimit]:
172
+ """
173
+ 启用限流规则
174
+
175
+ Args:
176
+ rule_id: 规则 ID
177
+
178
+ Returns:
179
+ 更新后的限流规则对象或 None
180
+ """
181
+ return await update_rate_limit(rule_id, {"is_enabled": True})
182
+
183
+
184
+ async def disable_rate_limit(rule_id: int) -> Optional[CaddyRateLimit]:
185
+ """
186
+ 禁用限流规则
187
+
188
+ Args:
189
+ rule_id: 规则 ID
190
+
191
+ Returns:
192
+ 更新后的限流规则对象或 None
193
+ """
194
+ return await update_rate_limit(rule_id, {"is_enabled": False})
195
+
196
+
197
+ async def delete_rate_limit(rule_id: int) -> bool:
198
+ """
199
+ 删除限流规则
200
+
201
+ Args:
202
+ rule_id: 规则 ID
203
+
204
+ Returns:
205
+ 是否删除成功
206
+ """
207
+ async with Rmanager.pg_session() as session:
208
+ async with session.begin():
209
+ stmt = delete(CaddyRateLimitTbl).where(CaddyRateLimitTbl.id == rule_id)
210
+ result = await session.execute(stmt)
211
+ return result.rowcount > 0
212
+
213
+
214
+ async def delete_rate_limit_by_name(rule_name: str) -> bool:
215
+ """
216
+ 根据规则名称删除限流规则
217
+
218
+ Args:
219
+ rule_name: 规则名称
220
+
221
+ Returns:
222
+ 是否删除成功
223
+ """
224
+ async with Rmanager.pg_session() as session:
225
+ async with session.begin():
226
+ stmt = delete(CaddyRateLimitTbl).where(CaddyRateLimitTbl.rule_name == rule_name)
227
+ result = await session.execute(stmt)
228
+ return result.rowcount > 0
229
+
230
+
231
+ async def add_whitelist_ip(rule_id: int, ip: str) -> Optional[CaddyRateLimit]:
232
+ """
233
+ 添加 IP 到白名单
234
+
235
+ Args:
236
+ rule_id: 规则 ID
237
+ ip: IP 地址
238
+
239
+ Returns:
240
+ 更新后的限流规则对象或 None
241
+ """
242
+ async with Rmanager.pg_session() as session:
243
+ async with session.begin():
244
+ # 查询当前规则
245
+ stmt = select(CaddyRateLimitTbl).where(CaddyRateLimitTbl.id == rule_id)
246
+ row = (await session.execute(stmt)).scalar_one_or_none()
247
+ if not row:
248
+ return None
249
+
250
+ # 添加到白名单
251
+ whitelist = list(row.whitelist_ips) if row.whitelist_ips else []
252
+ if ip not in whitelist:
253
+ whitelist.append(ip)
254
+ return await update_rate_limit(rule_id, {"whitelist_ips": whitelist})
255
+ return CaddyRateLimit.model_validate(row, from_attributes=True)
256
+
257
+
258
+ async def remove_whitelist_ip(rule_id: int, ip: str) -> Optional[CaddyRateLimit]:
259
+ """
260
+ 从白名单移除 IP
261
+
262
+ Args:
263
+ rule_id: 规则 ID
264
+ ip: IP 地址
265
+
266
+ Returns:
267
+ 更新后的限流规则对象或 None
268
+ """
269
+ async with Rmanager.pg_session() as session:
270
+ async with session.begin():
271
+ # 查询当前规则
272
+ stmt = select(CaddyRateLimitTbl).where(CaddyRateLimitTbl.id == rule_id)
273
+ row = (await session.execute(stmt)).scalar_one_or_none()
274
+ if not row:
275
+ return None
276
+
277
+ # 从白名单移除
278
+ whitelist = list(row.whitelist_ips) if row.whitelist_ips else []
279
+ if ip in whitelist:
280
+ whitelist.remove(ip)
281
+ return await update_rate_limit(rule_id, {"whitelist_ips": whitelist})
282
+ return CaddyRateLimit.model_validate(row, from_attributes=True)
283
+
284
+
285
+ async def add_blacklist_ip(rule_id: int, ip: str) -> Optional[CaddyRateLimit]:
286
+ """
287
+ 添加 IP 到黑名单
288
+
289
+ Args:
290
+ rule_id: 规则 ID
291
+ ip: IP 地址
292
+
293
+ Returns:
294
+ 更新后的限流规则对象或 None
295
+ """
296
+ async with Rmanager.pg_session() as session:
297
+ async with session.begin():
298
+ # 查询当前规则
299
+ stmt = select(CaddyRateLimitTbl).where(CaddyRateLimitTbl.id == rule_id)
300
+ row = (await session.execute(stmt)).scalar_one_or_none()
301
+ if not row:
302
+ return None
303
+
304
+ # 添加到黑名单
305
+ blacklist = list(row.blacklist_ips) if row.blacklist_ips else []
306
+ if ip not in blacklist:
307
+ blacklist.append(ip)
308
+ return await update_rate_limit(rule_id, {"blacklist_ips": blacklist})
309
+ return CaddyRateLimit.model_validate(row, from_attributes=True)
310
+
311
+
312
+ async def remove_blacklist_ip(rule_id: int, ip: str) -> Optional[CaddyRateLimit]:
313
+ """
314
+ 从黑名单移除 IP
315
+
316
+ Args:
317
+ rule_id: 规则 ID
318
+ ip: IP 地址
319
+
320
+ Returns:
321
+ 更新后的限流规则对象或 None
322
+ """
323
+ async with Rmanager.pg_session() as session:
324
+ async with session.begin():
325
+ # 查询当前规则
326
+ stmt = select(CaddyRateLimitTbl).where(CaddyRateLimitTbl.id == rule_id)
327
+ row = (await session.execute(stmt)).scalar_one_or_none()
328
+ if not row:
329
+ return None
330
+
331
+ # 从黑名单移除
332
+ blacklist = list(row.blacklist_ips) if row.blacklist_ips else []
333
+ if ip in blacklist:
334
+ blacklist.remove(ip)
335
+ return await update_rate_limit(rule_id, {"blacklist_ips": blacklist})
336
+ return CaddyRateLimit.model_validate(row, from_attributes=True)
337
+
338
+
339
+ async def count_rate_limits(filters: Optional[Dict[str, Any]] = None) -> int:
340
+ """
341
+ 统计限流规则数量
342
+
343
+ Args:
344
+ filters: 过滤条件字典
345
+
346
+ Returns:
347
+ 规则数量
348
+ """
349
+ async with Rmanager.pg_session() as session:
350
+ async with session.begin():
351
+ stmt = select(func.count(CaddyRateLimitTbl.id))
352
+
353
+ # 动态添加查询条件
354
+ if filters:
355
+ for key, value in filters.items():
356
+ if hasattr(CaddyRateLimitTbl, key) and value is not None:
357
+ stmt = stmt.where(getattr(CaddyRateLimitTbl, key) == value)
358
+
359
+ count = (await session.execute(stmt)).scalar_one()
360
+ return count
@@ -0,0 +1,271 @@
1
+ """
2
+ Caddy 路由表的数据库操作函数
3
+ """
4
+ from typing import (
5
+ Any,
6
+ Dict,
7
+ List,
8
+ Optional,
9
+ )
10
+ from sqlalchemy import select, update, delete, func, and_, or_
11
+ from sqlalchemy.dialects.postgresql import insert
12
+
13
+ from linglong_web import Rmanager
14
+ from cancan_microstack.public.schemas.caddy import CaddyRoute, CaddyRouteCreate
15
+ from cancan_microstack.services.opsbffsrv.infrastructure.db.model.caddy_route_tbl import CaddyRouteTbl
16
+
17
+
18
+ async def get_route_by_id(route_id: int) -> Optional[CaddyRoute]:
19
+ """
20
+ 根据 ID 查询单条路由记录
21
+
22
+ Args:
23
+ route_id: 路由 ID
24
+
25
+ Returns:
26
+ 路由对象或 None
27
+ """
28
+ async with Rmanager.pg_session() as session:
29
+ async with session.begin():
30
+ stmt = select(CaddyRouteTbl).where(CaddyRouteTbl.id == route_id)
31
+ row = (await session.execute(stmt)).scalar_one_or_none()
32
+ return CaddyRoute.model_validate(row, from_attributes=True) if row else None
33
+
34
+
35
+ async def get_route_by_name(route_name: str) -> Optional[CaddyRoute]:
36
+ """
37
+ 根据路由名称查询记录
38
+
39
+ Args:
40
+ route_name: 路由名称
41
+
42
+ Returns:
43
+ 路由对象或 None
44
+ """
45
+ async with Rmanager.pg_session() as session:
46
+ async with session.begin():
47
+ stmt = select(CaddyRouteTbl).where(CaddyRouteTbl.route_name == route_name)
48
+ row = (await session.execute(stmt)).scalar_one_or_none()
49
+ return CaddyRoute.model_validate(row, from_attributes=True) if row else None
50
+
51
+
52
+ async def get_routes_by_domain(domain: str) -> List[CaddyRoute]:
53
+ """
54
+ 根据域名查询路由列表
55
+
56
+ Args:
57
+ domain: 域名
58
+
59
+ Returns:
60
+ 路由对象列表
61
+ """
62
+ async with Rmanager.pg_session() as session:
63
+ async with session.begin():
64
+ stmt = select(CaddyRouteTbl).where(
65
+ CaddyRouteTbl.domain == domain
66
+ ).order_by(CaddyRouteTbl.priority.desc())
67
+ rows = list((await session.execute(stmt)).scalars().all())
68
+ return [CaddyRoute.model_validate(r, from_attributes=True) for r in rows] if rows else []
69
+
70
+
71
+ async def get_routes_by_service(upstream_service: str) -> List[CaddyRoute]:
72
+ """
73
+ 根据上游服务查询路由列表
74
+
75
+ Args:
76
+ upstream_service: 上游服务名称
77
+
78
+ Returns:
79
+ 路由对象列表
80
+ """
81
+ async with Rmanager.pg_session() as session:
82
+ async with session.begin():
83
+ stmt = select(CaddyRouteTbl).where(
84
+ CaddyRouteTbl.upstream_service == upstream_service
85
+ ).order_by(CaddyRouteTbl.priority.desc())
86
+ rows = list((await session.execute(stmt)).scalars().all())
87
+ return [CaddyRoute.model_validate(r, from_attributes=True) for r in rows] if rows else []
88
+
89
+
90
+ async def get_enabled_routes() -> List[CaddyRoute]:
91
+ """
92
+ 查询所有已启用的路由
93
+
94
+ Returns:
95
+ 路由对象列表(按优先级降序)
96
+ """
97
+ async with Rmanager.pg_session() as session:
98
+ async with session.begin():
99
+ stmt = select(CaddyRouteTbl).where(
100
+ CaddyRouteTbl.is_enabled == True
101
+ ).order_by(CaddyRouteTbl.priority.desc(), CaddyRouteTbl.created_time)
102
+ rows = list((await session.execute(stmt)).scalars().all())
103
+ return [CaddyRoute.model_validate(r, from_attributes=True) for r in rows] if rows else []
104
+
105
+
106
+ async def get_all_routes(filters: Optional[Dict[str, Any]] = None) -> List[CaddyRoute]:
107
+ """
108
+ 查询所有路由(支持动态过滤)
109
+
110
+ Args:
111
+ filters: 过滤条件字典
112
+
113
+ Returns:
114
+ 路由对象列表
115
+ """
116
+ async with Rmanager.pg_session() as session:
117
+ async with session.begin():
118
+ stmt = select(CaddyRouteTbl)
119
+
120
+ # 动态添加查询条件
121
+ if filters:
122
+ for key, value in filters.items():
123
+ if hasattr(CaddyRouteTbl, key) and value is not None:
124
+ stmt = stmt.where(getattr(CaddyRouteTbl, key) == value)
125
+
126
+ stmt = stmt.order_by(CaddyRouteTbl.priority.desc(), CaddyRouteTbl.created_time)
127
+ rows = list((await session.execute(stmt)).scalars().all())
128
+ return [CaddyRoute.model_validate(r, from_attributes=True) for r in rows] if rows else []
129
+
130
+
131
+ async def create_route(route: CaddyRouteCreate) -> CaddyRoute:
132
+ """
133
+ 创建新路由
134
+
135
+ Args:
136
+ route: 路由创建对象
137
+
138
+ Returns:
139
+ 创建后的路由对象
140
+ """
141
+ async with Rmanager.pg_session() as session:
142
+ async with session.begin():
143
+ stmt = insert(CaddyRouteTbl).values(
144
+ **route.model_dump()
145
+ ).returning(CaddyRouteTbl)
146
+ row = (await session.execute(stmt)).scalar_one()
147
+ return CaddyRoute.model_validate(row, from_attributes=True)
148
+
149
+
150
+ async def update_route(route_id: int, data: Dict[str, Any]) -> Optional[CaddyRoute]:
151
+ """
152
+ 更新路由
153
+
154
+ Args:
155
+ route_id: 路由 ID
156
+ data: 更新数据字典
157
+
158
+ Returns:
159
+ 更新后的路由对象或 None
160
+ """
161
+ async with Rmanager.pg_session() as session:
162
+ async with session.begin():
163
+ stmt = update(CaddyRouteTbl).where(
164
+ CaddyRouteTbl.id == route_id
165
+ ).values(**data).returning(CaddyRouteTbl)
166
+ row = (await session.execute(stmt)).scalar_one_or_none()
167
+ return CaddyRoute.model_validate(row, from_attributes=True) if row else None
168
+
169
+
170
+ async def update_route_by_name(route_name: str, data: Dict[str, Any]) -> Optional[CaddyRoute]:
171
+ """
172
+ 根据路由名称更新路由
173
+
174
+ Args:
175
+ route_name: 路由名称
176
+ data: 更新数据字典
177
+
178
+ Returns:
179
+ 更新后的路由对象或 None
180
+ """
181
+ async with Rmanager.pg_session() as session:
182
+ async with session.begin():
183
+ stmt = update(CaddyRouteTbl).where(
184
+ CaddyRouteTbl.route_name == route_name
185
+ ).values(**data).returning(CaddyRouteTbl)
186
+ row = (await session.execute(stmt)).scalar_one_or_none()
187
+ return CaddyRoute.model_validate(row, from_attributes=True) if row else None
188
+
189
+
190
+ async def enable_route(route_id: int) -> Optional[CaddyRoute]:
191
+ """
192
+ 启用路由
193
+
194
+ Args:
195
+ route_id: 路由 ID
196
+
197
+ Returns:
198
+ 更新后的路由对象或 None
199
+ """
200
+ return await update_route(route_id, {"is_enabled": True})
201
+
202
+
203
+ async def disable_route(route_id: int) -> Optional[CaddyRoute]:
204
+ """
205
+ 禁用路由
206
+
207
+ Args:
208
+ route_id: 路由 ID
209
+
210
+ Returns:
211
+ 更新后的路由对象或 None
212
+ """
213
+ return await update_route(route_id, {"is_enabled": False})
214
+
215
+
216
+ async def delete_route(route_id: int) -> bool:
217
+ """
218
+ 删除路由
219
+
220
+ Args:
221
+ route_id: 路由 ID
222
+
223
+ Returns:
224
+ 是否删除成功
225
+ """
226
+ async with Rmanager.pg_session() as session:
227
+ async with session.begin():
228
+ stmt = delete(CaddyRouteTbl).where(CaddyRouteTbl.id == route_id)
229
+ result = await session.execute(stmt)
230
+ return result.rowcount > 0
231
+
232
+
233
+ async def delete_route_by_name(route_name: str) -> bool:
234
+ """
235
+ 根据路由名称删除路由
236
+
237
+ Args:
238
+ route_name: 路由名称
239
+
240
+ Returns:
241
+ 是否删除成功
242
+ """
243
+ async with Rmanager.pg_session() as session:
244
+ async with session.begin():
245
+ stmt = delete(CaddyRouteTbl).where(CaddyRouteTbl.route_name == route_name)
246
+ result = await session.execute(stmt)
247
+ return result.rowcount > 0
248
+
249
+
250
+ async def count_routes(filters: Optional[Dict[str, Any]] = None) -> int:
251
+ """
252
+ 统计路由数量
253
+
254
+ Args:
255
+ filters: 过滤条件字典
256
+
257
+ Returns:
258
+ 路由数量
259
+ """
260
+ async with Rmanager.pg_session() as session:
261
+ async with session.begin():
262
+ stmt = select(func.count(CaddyRouteTbl.id))
263
+
264
+ # 动态添加查询条件
265
+ if filters:
266
+ for key, value in filters.items():
267
+ if hasattr(CaddyRouteTbl, key) and value is not None:
268
+ stmt = stmt.where(getattr(CaddyRouteTbl, key) == value)
269
+
270
+ count = (await session.execute(stmt)).scalar_one()
271
+ return count