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.
- cancan_microstack/__init__.py +14 -0
- cancan_microstack/__version__.py +10 -0
- cancan_microstack/assets/__init__.py +6 -0
- cancan_microstack/assets/builds/caddy/Caddyfile +187 -0
- cancan_microstack/assets/builds/caddy/DEPLOYMENT.md +303 -0
- cancan_microstack/assets/builds/caddy/Dockerfile +46 -0
- cancan_microstack/assets/builds/caddy/README.md +343 -0
- cancan_microstack/assets/builds/caddy/geoip/README.md +5 -0
- cancan_microstack/assets/builds/caddy/start.sh +78 -0
- cancan_microstack/assets/builds/caddy/waf/coraza.conf +179 -0
- cancan_microstack/assets/builds/service/Dockerfile +59 -0
- cancan_microstack/assets/builds/service/README.md +13 -0
- cancan_microstack/assets/ddl/create_db.sql +22 -0
- cancan_microstack/assets/ddl/infra/execution_log_tbl.sql +46 -0
- cancan_microstack/assets/ddl/infra/node_instance_tbl.sql +56 -0
- cancan_microstack/assets/ddl/infra/service_action_log_tbl.sql +36 -0
- cancan_microstack/assets/ddl/infra/service_config_tbl.sql +26 -0
- cancan_microstack/assets/ddl/infra/service_info_tbl.sql +45 -0
- cancan_microstack/assets/ddl/infra/service_instance_tbl.sql +54 -0
- cancan_microstack/assets/ddl/infra/service_operation_tbl.sql +47 -0
- cancan_microstack/assets/ddl/infra/workflow_definition_tbl.sql +60 -0
- cancan_microstack/assets/ddl/infra/workflow_definition_version_tbl.sql +35 -0
- cancan_microstack/assets/ddl/infra/workflow_engine_alert_tbl.sql +34 -0
- cancan_microstack/assets/ddl/infra/workflow_run_tbl.sql +52 -0
- cancan_microstack/assets/ddl/ops/admin_user_tbl.sql +34 -0
- cancan_microstack/assets/ddl/ops/caddy_access_log_tbl.sql +91 -0
- cancan_microstack/assets/ddl/ops/caddy_certificate_tbl.sql +59 -0
- cancan_microstack/assets/ddl/ops/caddy_rate_limit_tbl.sql +64 -0
- cancan_microstack/assets/ddl/ops/caddy_route_tbl.sql +63 -0
- cancan_microstack/assets/ddl/ops/caddy_stats_tbl.sql +77 -0
- cancan_microstack/assets/ddl/trigger.sql +21 -0
- cancan_microstack/assets/docker/docker-compose.infra.yml +401 -0
- cancan_microstack/assets/scripts/README.md +195 -0
- cancan_microstack/assets/scripts/docker/build_images.sh +44 -0
- cancan_microstack/assets/scripts/docker/force_rebuild_images.sh +38 -0
- cancan_microstack/assets/scripts/docker/rebuild_all.sh +34 -0
- cancan_microstack/assets/scripts/docker/rebuild_compose.sh +61 -0
- cancan_microstack/assets/scripts/docker/restart.sh +35 -0
- cancan_microstack/assets/scripts/docker/restart_compose.sh +35 -0
- cancan_microstack/assets/scripts/docker/start.sh +78 -0
- cancan_microstack/assets/scripts/docker/start_all.sh +46 -0
- cancan_microstack/assets/scripts/docker/start_compose.sh +66 -0
- cancan_microstack/assets/scripts/docker/stop.sh +67 -0
- cancan_microstack/assets/scripts/docker/stop_all.sh +38 -0
- cancan_microstack/assets/scripts/docker/stop_compose.sh +38 -0
- cancan_microstack/assets/scripts/podman/build_images_podman.sh +59 -0
- cancan_microstack/assets/scripts/podman/cleanup_podman.sh +25 -0
- cancan_microstack/assets/scripts/podman/force_rebuild_images_podman.sh +56 -0
- cancan_microstack/assets/scripts/podman/rebuild_all_podman.sh +37 -0
- cancan_microstack/assets/scripts/podman/rebuild_compose_podman.sh +60 -0
- cancan_microstack/assets/scripts/podman/restart_compose_podman.sh +73 -0
- cancan_microstack/assets/scripts/podman/start_all_podman.sh +66 -0
- cancan_microstack/assets/scripts/podman/start_compose_podman.sh +80 -0
- cancan_microstack/assets/scripts/podman/start_podman.sh +91 -0
- cancan_microstack/assets/scripts/podman/stop.sh +73 -0
- cancan_microstack/assets/scripts/podman/stop_all_podman.sh +34 -0
- cancan_microstack/assets/scripts/podman/stop_compose_podman.sh +58 -0
- cancan_microstack/assets/scripts/start_controllersrv.sh +9 -0
- cancan_microstack/assets/scripts/utils/check_all_db_tables.sh +104 -0
- cancan_microstack/assets/scripts/utils/check_env.sh +177 -0
- cancan_microstack/assets/scripts/utils/check_service_management_deployment.sh +225 -0
- cancan_microstack/assets/scripts/utils/deploy_service_management.sh +176 -0
- cancan_microstack/assets/scripts/utils/force_reload_infrasrv.sh +52 -0
- cancan_microstack/assets/scripts/utils/monitor_service_management.sh +187 -0
- cancan_microstack/assets/scripts/utils/reset_postgres_volume.sh +68 -0
- cancan_microstack/assets/scripts/utils/test_async_operations.sh +141 -0
- cancan_microstack/assets/scripts/utils/verify_real_operations.sh +76 -0
- cancan_microstack/assets/service/Dockerfile +65 -0
- cancan_microstack/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-BOKUurnM.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConfigManage-DKV5YOUz.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConfigManage-Y5bhy7wG.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ConsoleManage-8ljYvCW2.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConsoleManage-BWpyqbuQ.css +1 -0
- cancan_microstack/assets/www/adminops/assets/DashboardNew-B9Nf1OPl.js +1 -0
- cancan_microstack/assets/www/adminops/assets/DashboardNew-DYWZKQ1V.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LogSearch-CA0Jhe78.js +1 -0
- cancan_microstack/assets/www/adminops/assets/LogSearch-CCZfTNPF.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LoginView-BId3kP3M.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LoginView-BQZTV_Qy.js +1 -0
- cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-BdEYwqFq.js +1 -0
- cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-D-pASR8G.css +1 -0
- cancan_microstack/assets/www/adminops/assets/PageContainer-Byss-yUC.js +1 -0
- cancan_microstack/assets/www/adminops/assets/PageContainer-C3nSZwM7.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RateLimitManage-BDI8jLpC.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RateLimitManage-DJY4NiF-.js +1 -0
- cancan_microstack/assets/www/adminops/assets/RouteManage-DaUQ4QLw.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RouteManage-w9XCU0UA.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceCard-BFzHe6Tw.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceCard-BJUhWnA-.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceDetail-Cw24WuKp.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceDetail-Yum47zdB.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceList-C7ryvbhE.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceList-Cgd01fUx.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceLogs-COpG9H0h.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceLogs-H_Alq0cf.css +1 -0
- cancan_microstack/assets/www/adminops/assets/StatsOverview-D0TwMQkA.js +39 -0
- cancan_microstack/assets/www/adminops/assets/StatsOverview-lqAN6pqM.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpBindView-CWlAmzFt.js +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpBindView-HoQC1lhx.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpVerifyView-BHN1VtX1.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpVerifyView-D3w_lZk8.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowCenter-DU_mpIA0.css +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowCenter-i50rZyxN.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-CnHokPL9.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-DaZaZpLd.css +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowRuns-B09hK48c.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowRuns-wGutKIIU.css +1 -0
- cancan_microstack/assets/www/adminops/assets/caddy-nnCKf8fG.js +1 -0
- cancan_microstack/assets/www/adminops/assets/format-Cuzxgna9.js +1 -0
- cancan_microstack/assets/www/adminops/assets/index-CiFlm8oc.js +64 -0
- cancan_microstack/assets/www/adminops/assets/index-UW0T1Dkc.css +1 -0
- cancan_microstack/assets/www/adminops/assets/service-BYlgGPs_.js +1 -0
- cancan_microstack/assets/www/adminops/assets/service-operation-6GzLw2Z1.js +1 -0
- cancan_microstack/assets/www/adminops/assets/style-CcIXnQ5y.css +1 -0
- cancan_microstack/assets/www/adminops/assets/style-lRnStdGu.js +39 -0
- cancan_microstack/assets/www/adminops/assets/useDebounce-BRlqfXqf.js +1 -0
- cancan_microstack/assets/www/adminops/assets/workflow-CUXs39Ac.js +1 -0
- cancan_microstack/assets/www/adminops/index.html +16 -0
- cancan_microstack/assets/www/adminops/vite.svg +1 -0
- cancan_microstack/cli/__init__.py +14 -0
- cancan_microstack/cli/__main__.py +9 -0
- cancan_microstack/cli/main.py +552 -0
- cancan_microstack/cmd/__init__.py +54 -0
- cancan_microstack/cmd/cancan/__init__.py +12 -0
- cancan_microstack/cmd/cancan/run.py +395 -0
- cancan_microstack/cmd/controllersrv/__init__.py +0 -0
- cancan_microstack/cmd/controllersrv/run.py +131 -0
- cancan_microstack/cmd/infrasrv/__init__.py +5 -0
- cancan_microstack/cmd/infrasrv/run.py +100 -0
- cancan_microstack/cmd/opsbffsrv/__init__.py +5 -0
- cancan_microstack/cmd/opsbffsrv/run.py +96 -0
- cancan_microstack/core/__init__.py +5 -0
- cancan_microstack/core/assets.py +123 -0
- cancan_microstack/core/compose_builder.py +102 -0
- cancan_microstack/core/doctor.py +152 -0
- cancan_microstack/core/microstack.py +71 -0
- cancan_microstack/core/runner.py +56 -0
- cancan_microstack/core/stack_manager.py +186 -0
- cancan_microstack/public/__init__.py +7 -0
- cancan_microstack/public/api/__init__.py +1 -0
- cancan_microstack/public/api/controllersrv_client.py +277 -0
- cancan_microstack/public/api/infrasrv_client.py +404 -0
- cancan_microstack/public/const/__init__.py +1 -0
- cancan_microstack/public/const/action_consts.py +18 -0
- cancan_microstack/public/const/app_consts.py +42 -0
- cancan_microstack/public/const/caddy_consts.py +22 -0
- cancan_microstack/public/const/controllersrv_consts.py +163 -0
- cancan_microstack/public/const/docker_consts.py +15 -0
- cancan_microstack/public/const/error.py +56 -0
- cancan_microstack/public/const/health_consts.py +52 -0
- cancan_microstack/public/const/hook_enums.py +56 -0
- cancan_microstack/public/const/logging_enums.py +13 -0
- cancan_microstack/public/const/metrics_enums.py +36 -0
- cancan_microstack/public/const/monitor_enums.py +26 -0
- cancan_microstack/public/const/operation_consts.py +53 -0
- cancan_microstack/public/const/opsbffsrv_error.py +92 -0
- cancan_microstack/public/const/overrides_consts.py +13 -0
- cancan_microstack/public/const/redis.py +17 -0
- cancan_microstack/public/const/service_consts.py +15 -0
- cancan_microstack/public/const/workflow_consts.py +65 -0
- cancan_microstack/public/error.py +41 -0
- cancan_microstack/public/logging/__init__.py +0 -0
- cancan_microstack/public/logging/initializer.py +109 -0
- cancan_microstack/public/logging/mq_handler.py +279 -0
- cancan_microstack/public/schemas/__init__.py +1 -0
- cancan_microstack/public/schemas/caddy/__init__.py +381 -0
- cancan_microstack/public/schemas/caddy/analysis.py +90 -0
- cancan_microstack/public/schemas/caddy/route.py +18 -0
- cancan_microstack/public/schemas/common.py +79 -0
- cancan_microstack/public/schemas/controllersrv/__init__.py +3 -0
- cancan_microstack/public/schemas/controllersrv/async_requests.py +30 -0
- cancan_microstack/public/schemas/controllersrv/compose_models.py +47 -0
- cancan_microstack/public/schemas/controllersrv/const.py +24 -0
- cancan_microstack/public/schemas/controllersrv/docker_models.py +45 -0
- cancan_microstack/public/schemas/controllersrv/docker_responses.py +104 -0
- cancan_microstack/public/schemas/controllersrv/requests.py +54 -0
- cancan_microstack/public/schemas/controllersrv/responses.py +124 -0
- cancan_microstack/public/schemas/controllersrv/task_models.py +102 -0
- cancan_microstack/public/schemas/controllersrv/validation.py +23 -0
- cancan_microstack/public/schemas/hook_metrics.py +124 -0
- cancan_microstack/public/schemas/hooks.py +39 -0
- cancan_microstack/public/schemas/infra/__init__.py +0 -0
- cancan_microstack/public/schemas/infra/cleanup.py +25 -0
- cancan_microstack/public/schemas/infra/container.py +74 -0
- cancan_microstack/public/schemas/infra/enums.py +135 -0
- cancan_microstack/public/schemas/infra/health_check.py +42 -0
- cancan_microstack/public/schemas/infra/hook_log.py +42 -0
- cancan_microstack/public/schemas/infra/operation.py +90 -0
- cancan_microstack/public/schemas/infra/overview.py +25 -0
- cancan_microstack/public/schemas/infra/push.py +33 -0
- cancan_microstack/public/schemas/infra/service_action_log.py +47 -0
- cancan_microstack/public/schemas/infra/service_config.py +10 -0
- cancan_microstack/public/schemas/infra/service_info.py +69 -0
- cancan_microstack/public/schemas/infra/service_instance.py +93 -0
- cancan_microstack/public/schemas/infra/service_management.py +152 -0
- cancan_microstack/public/schemas/infra/service_operation.py +79 -0
- cancan_microstack/public/schemas/infra/service_registry.py +158 -0
- cancan_microstack/public/schemas/infra/status_types.py +19 -0
- cancan_microstack/public/schemas/infra/workflow.py +566 -0
- cancan_microstack/public/schemas/logging/__init__.py +1 -0
- cancan_microstack/public/schemas/logging/log_event.py +121 -0
- cancan_microstack/public/schemas/opsbffsrv/__init__.py +1 -0
- cancan_microstack/public/schemas/opsbffsrv/async_ops.py +17 -0
- cancan_microstack/public/schemas/opsbffsrv/db_admin.py +147 -0
- cancan_microstack/public/schemas/opsbffsrv/db_init.py +48 -0
- cancan_microstack/public/schemas/opsbffsrv/service_config.py +89 -0
- cancan_microstack/public/schemas/opsbffsrv/service_logs.py +54 -0
- cancan_microstack/public/schemas/service_operation.py +24 -0
- cancan_microstack/public/schemas/service_registry.py +40 -0
- cancan_microstack/public/types/__init__.py +7 -0
- cancan_microstack/public/web/__init__.py +0 -0
- cancan_microstack/public/web/config_value.py +105 -0
- cancan_microstack/public/web/server.py +385 -0
- cancan_microstack/py.typed +0 -0
- cancan_microstack/runtime/__init__.py +0 -0
- cancan_microstack/runtime/compose_cmd.py +228 -0
- cancan_microstack/runtime/host_daemon.py +318 -0
- cancan_microstack/runtime/overrides.py +103 -0
- cancan_microstack/runtime/resources.py +25 -0
- cancan_microstack/runtime/workspace.py +94 -0
- cancan_microstack/services/__init__.py +0 -0
- cancan_microstack/services/controllersrv/__init__.py +8 -0
- cancan_microstack/services/controllersrv/application/__init__.py +0 -0
- cancan_microstack/services/controllersrv/application/docker_compose_app.py +427 -0
- cancan_microstack/services/controllersrv/conf/__init__.py +0 -0
- cancan_microstack/services/controllersrv/conf/config.py +76 -0
- cancan_microstack/services/controllersrv/conf/settings.py +54 -0
- cancan_microstack/services/controllersrv/domain/__init__.py +0 -0
- cancan_microstack/services/controllersrv/domain/docker_compose/__init__.py +0 -0
- cancan_microstack/services/controllersrv/domain/docker_compose/docker_compose_domain.py +278 -0
- cancan_microstack/services/controllersrv/domain/service_validator.py +327 -0
- cancan_microstack/services/controllersrv/domain/task/__init__.py +17 -0
- cancan_microstack/services/controllersrv/domain/task/task_queue.py +286 -0
- cancan_microstack/services/controllersrv/domain/task/task_worker.py +495 -0
- cancan_microstack/services/controllersrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/api/docker_control_api.py +470 -0
- cancan_microstack/services/controllersrv/router.py +132 -0
- cancan_microstack/services/infrasrv/__init__.py +4 -0
- cancan_microstack/services/infrasrv/application/__init__.py +0 -0
- cancan_microstack/services/infrasrv/application/health_check_app.py +24 -0
- cancan_microstack/services/infrasrv/application/logging/__init__.py +1 -0
- cancan_microstack/services/infrasrv/application/logging/log_ingestion_service.py +183 -0
- cancan_microstack/services/infrasrv/application/service_config.py +22 -0
- cancan_microstack/services/infrasrv/application/service_logs_app.py +53 -0
- cancan_microstack/services/infrasrv/application/service_management_app.py +689 -0
- cancan_microstack/services/infrasrv/application/service_operation_tracker.py +251 -0
- cancan_microstack/services/infrasrv/application/service_registry.py +53 -0
- cancan_microstack/services/infrasrv/application/workflow/__init__.py +0 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_app.py +991 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_queue.py +302 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_tasks.py +46 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_worker_runtime.py +122 -0
- cancan_microstack/services/infrasrv/conf/__init__.py +0 -0
- cancan_microstack/services/infrasrv/conf/config.py +98 -0
- cancan_microstack/services/infrasrv/domain/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/health_check/__init__.py +3 -0
- cancan_microstack/services/infrasrv/domain/health_check/health_check_domain.py +576 -0
- cancan_microstack/services/infrasrv/domain/hooks/__init__.py +19 -0
- cancan_microstack/services/infrasrv/domain/hooks/builtin_hooks.py +308 -0
- cancan_microstack/services/infrasrv/domain/hooks/hook_registry.py +43 -0
- cancan_microstack/services/infrasrv/domain/hooks/hooks_log_utils.py +275 -0
- cancan_microstack/services/infrasrv/domain/hooks/init.py +17 -0
- cancan_microstack/services/infrasrv/domain/hooks/metrics.py +205 -0
- cancan_microstack/services/infrasrv/domain/hooks/pre_registration_hooks.py +490 -0
- cancan_microstack/services/infrasrv/domain/registry/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/registry/service_registry.py +509 -0
- cancan_microstack/services/infrasrv/domain/service_config/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/service_config/service_config.py +50 -0
- cancan_microstack/services/infrasrv/domain/service_logs/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/service_logs/service_logs_domain.py +51 -0
- cancan_microstack/services/infrasrv/domain/workflow/__init__.py +4 -0
- cancan_microstack/services/infrasrv/domain/workflow/engine.py +159 -0
- cancan_microstack/services/infrasrv/domain/workflow/node_handlers.py +509 -0
- cancan_microstack/services/infrasrv/domain/workflow/workflow_domain.py +164 -0
- cancan_microstack/services/infrasrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/api/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/api/controllersrv_api.py +165 -0
- cancan_microstack/services/infrasrv/infrastructure/cache/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/cache/service_registry_cache.py +174 -0
- cancan_microstack/services/infrasrv/infrastructure/db/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/execution_log_tbl.py +53 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/node_instance_tbl.py +55 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_config_tbl.py +30 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_info_tbl.py +59 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_instance_tbl.py +88 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_operation_tbl.py +73 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_tbl.py +55 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_version_tbl.py +43 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_engine_alert_tbl.py +57 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_run_tbl.py +56 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_action_log_op.py +239 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config.py +80 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config_manager.py +198 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_info_op.py +297 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_instance_op.py +688 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_operation_op.py +387 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_registry.py +124 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/workflow_op.py +804 -0
- cancan_microstack/services/infrasrv/infrastructure/ddl_manager.py +31 -0
- cancan_microstack/services/infrasrv/infrastructure/mongo/__init__.py +1 -0
- cancan_microstack/services/infrasrv/infrastructure/mongo/log_repository.py +129 -0
- cancan_microstack/services/infrasrv/interface/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/api/health_check_api.py +29 -0
- cancan_microstack/services/infrasrv/interface/api/hooks.py +284 -0
- cancan_microstack/services/infrasrv/interface/api/internal.py +49 -0
- cancan_microstack/services/infrasrv/interface/api/internal_instance_api.py +265 -0
- cancan_microstack/services/infrasrv/interface/api/internal_operation_api.py +206 -0
- cancan_microstack/services/infrasrv/interface/api/service_config.py +50 -0
- cancan_microstack/services/infrasrv/interface/api/service_logs_api.py +49 -0
- cancan_microstack/services/infrasrv/interface/api/service_management_api.py +113 -0
- cancan_microstack/services/infrasrv/interface/api/service_registry.py +117 -0
- cancan_microstack/services/infrasrv/interface/api/workflow_api.py +303 -0
- cancan_microstack/services/infrasrv/interface/schedule/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/schedule/cleanup.py +13 -0
- cancan_microstack/services/infrasrv/interface/schedule/health_check.py +27 -0
- cancan_microstack/services/infrasrv/interface/schedule/log_cleanup.py +26 -0
- cancan_microstack/services/infrasrv/interface/schedule/operation_tracker.py +25 -0
- cancan_microstack/services/infrasrv/interface/schedule/scheduler.py +39 -0
- cancan_microstack/services/infrasrv/interface/schedule/workflow_scheduler.py +115 -0
- cancan_microstack/services/infrasrv/router.py +341 -0
- cancan_microstack/services/opsbffsrv/__init__.py +4 -0
- cancan_microstack/services/opsbffsrv/application/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/application/async_operation_app.py +150 -0
- cancan_microstack/services/opsbffsrv/application/auth_app.py +285 -0
- cancan_microstack/services/opsbffsrv/application/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/application/caddy/access_log_analysis_app.py +344 -0
- cancan_microstack/services/opsbffsrv/application/caddy/access_log_ingestion_service.py +169 -0
- cancan_microstack/services/opsbffsrv/application/caddy/certificate_management_app.py +355 -0
- cancan_microstack/services/opsbffsrv/application/caddy/rate_limit_management_app.py +496 -0
- cancan_microstack/services/opsbffsrv/application/caddy/route_management_app.py +401 -0
- cancan_microstack/services/opsbffsrv/application/caddy/stats_aggregation_app.py +364 -0
- cancan_microstack/services/opsbffsrv/application/db_admin_app.py +103 -0
- cancan_microstack/services/opsbffsrv/application/db_init_app.py +283 -0
- cancan_microstack/services/opsbffsrv/application/logging/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/application/logging/log_query_app.py +28 -0
- cancan_microstack/services/opsbffsrv/application/service_config.py +158 -0
- cancan_microstack/services/opsbffsrv/application/service_logs_app.py +74 -0
- cancan_microstack/services/opsbffsrv/application/service_registry.py +36 -0
- cancan_microstack/services/opsbffsrv/application/workflow_ops_app.py +730 -0
- cancan_microstack/services/opsbffsrv/conf/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/conf/config.py +224 -0
- cancan_microstack/services/opsbffsrv/domain/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/auth/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/auth/admin_init.py +38 -0
- cancan_microstack/services/opsbffsrv/domain/auth/auth_domain.py +108 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/access_log_analysis.py +358 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/certificate_management.py +325 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/default_routes.py +53 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/rate_limit_management.py +308 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/route_management.py +279 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/stats_aggregation.py +654 -0
- cancan_microstack/services/opsbffsrv/domain/db_admin/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/db_admin/db_admin_domain.py +118 -0
- cancan_microstack/services/opsbffsrv/domain/db_init/__init__.py +3 -0
- cancan_microstack/services/opsbffsrv/domain/db_init/db_init_domain.py +358 -0
- cancan_microstack/services/opsbffsrv/domain/logging/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/domain/logging/log_query_domain.py +99 -0
- cancan_microstack/services/opsbffsrv/domain/service_config/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/service_config/service_config.py +81 -0
- cancan_microstack/services/opsbffsrv/domain/service_registry/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/service_registry/service_registry.py +292 -0
- cancan_microstack/services/opsbffsrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/api/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/api/infrasrv_api.py +242 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/captcha_service.py +67 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/password_service.py +12 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/redis_store.py +131 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/totp_service.py +59 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/access_log_parser.py +307 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/admin_api_client.py +678 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/ip_geo_locator.py +176 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/admin_user_tbl.py +33 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_access_log_tbl.py +90 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_certificate_tbl.py +65 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_rate_limit_tbl.py +69 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_route_tbl.py +66 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_stats_tbl.py +78 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_config_tbl.py +30 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_info_tbl.py +51 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_instance_tbl.py +68 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/admin_user_operate.py +59 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_access_log.py +531 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_certificate.py +451 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_rate_limit.py +360 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_route.py +271 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_stats.py +343 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_action_log_op.py +57 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_config.py +86 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_info_op.py +79 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_instance.py +58 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_registry.py +138 -0
- cancan_microstack/services/opsbffsrv/infrastructure/ddl_manager.py +31 -0
- cancan_microstack/services/opsbffsrv/infrastructure/mongo/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/infrastructure/mongo/log_query_repository.py +87 -0
- cancan_microstack/services/opsbffsrv/interface/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/api/async_operation_api.py +137 -0
- cancan_microstack/services/opsbffsrv/interface/api/auth_api.py +113 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/__init__.py +3 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/access_log_api.py +174 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/certificate_api.py +235 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/rate_limit_api.py +302 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/route_api.py +250 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/stats_api.py +243 -0
- cancan_microstack/services/opsbffsrv/interface/api/db_admin_api.py +62 -0
- cancan_microstack/services/opsbffsrv/interface/api/db_init_api.py +109 -0
- cancan_microstack/services/opsbffsrv/interface/api/instance_management_api.py +165 -0
- cancan_microstack/services/opsbffsrv/interface/api/log_query_api.py +41 -0
- cancan_microstack/services/opsbffsrv/interface/api/mongo_express_proxy_api.py +181 -0
- cancan_microstack/services/opsbffsrv/interface/api/pgweb_proxy_api.py +154 -0
- cancan_microstack/services/opsbffsrv/interface/api/rabbitmq_mgmt_proxy_api.py +518 -0
- cancan_microstack/services/opsbffsrv/interface/api/redis_commander_proxy_api.py +133 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_config.py +146 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_logs_api.py +81 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_registry.py +66 -0
- cancan_microstack/services/opsbffsrv/interface/api/workflow_ops_api.py +413 -0
- cancan_microstack/services/opsbffsrv/interface/middleware/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/middleware/auth_middleware.py +52 -0
- cancan_microstack/services/opsbffsrv/router.py +901 -0
- cancan_microstack/utils/__init__.py +1 -0
- cancan_microstack/utils/container_env.py +218 -0
- cancan_microstack-0.0.1.dist-info/METADATA +155 -0
- cancan_microstack-0.0.1.dist-info/RECORD +440 -0
- cancan_microstack-0.0.1.dist-info/WHEEL +5 -0
- cancan_microstack-0.0.1.dist-info/entry_points.txt +2 -0
- cancan_microstack-0.0.1.dist-info/licenses/LICENSE +21 -0
- cancan_microstack-0.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import http
|
|
2
|
+
from enum import StrEnum
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ErrorCode(StrEnum):
|
|
6
|
+
SUCCESS = "0"
|
|
7
|
+
INVALID_PARAM = "4000"
|
|
8
|
+
USER_UNLOGIN = "4001"
|
|
9
|
+
HANDLER_NOT_FOUND = "4004"
|
|
10
|
+
REGISTRATION_REJECTED = "4009"
|
|
11
|
+
SYSTEM_ERROR = "5000"
|
|
12
|
+
SERVICE_MANAGEMENT_ERROR = "5001"
|
|
13
|
+
MISSING_REQUIRED_PARAM = "4002"
|
|
14
|
+
NETWORK_ERROR = "5100"
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def http_status_to_error_code(cls, http_status_code: int) -> str:
|
|
18
|
+
d = {
|
|
19
|
+
http.HTTPStatus.OK.value: cls.SUCCESS,
|
|
20
|
+
http.HTTPStatus.BAD_REQUEST.value: cls.INVALID_PARAM,
|
|
21
|
+
http.HTTPStatus.UNAUTHORIZED.value: cls.USER_UNLOGIN,
|
|
22
|
+
http.HTTPStatus.NOT_FOUND.value: cls.HANDLER_NOT_FOUND,
|
|
23
|
+
http.HTTPStatus.INTERNAL_SERVER_ERROR.value: cls.SYSTEM_ERROR,
|
|
24
|
+
http.HTTPStatus.GATEWAY_TIMEOUT.value: cls.NETWORK_ERROR,
|
|
25
|
+
}
|
|
26
|
+
return d.get(http_status_code, cls.SUCCESS)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ErrorMsg(StrEnum):
|
|
30
|
+
SUCCESS = "success"
|
|
31
|
+
COMMON_ERROR = "system error"
|
|
32
|
+
INVALID_PARAM = "params error"
|
|
33
|
+
USER_UNLOGIN = "user not login"
|
|
34
|
+
HANDLER_NOT_FOUND = "not found"
|
|
35
|
+
SERVICE_MANAGEMENT_ERROR = "service management operation failed"
|
|
36
|
+
MISSING_REQUIRED_PARAM = "missing required parameter"
|
|
37
|
+
NETWORK_ERROR = "network error"
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def get_msg(cls, code: str | int) -> str:
|
|
41
|
+
if code is None or code == "":
|
|
42
|
+
return cls.SUCCESS
|
|
43
|
+
if isinstance(code, int):
|
|
44
|
+
code = str(code)
|
|
45
|
+
d = {
|
|
46
|
+
ErrorCode.SUCCESS: cls.COMMON_ERROR,
|
|
47
|
+
ErrorCode.INVALID_PARAM: cls.INVALID_PARAM,
|
|
48
|
+
ErrorCode.USER_UNLOGIN: cls.USER_UNLOGIN,
|
|
49
|
+
ErrorCode.HANDLER_NOT_FOUND: cls.HANDLER_NOT_FOUND,
|
|
50
|
+
ErrorCode.NETWORK_ERROR: cls.NETWORK_ERROR,
|
|
51
|
+
}
|
|
52
|
+
if code in d:
|
|
53
|
+
return d[code]
|
|
54
|
+
elif code.isdigit() and int(code) in http.HTTPStatus:
|
|
55
|
+
return http.HTTPStatus(int(code)).phrase
|
|
56
|
+
return cls.COMMON_ERROR
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class HealthCheckResult(StrEnum):
|
|
5
|
+
"""
|
|
6
|
+
健康检查结果枚举
|
|
7
|
+
Enum for health check result values
|
|
8
|
+
"""
|
|
9
|
+
PASS = "PASS"
|
|
10
|
+
FAIL = "FAIL"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class HealthOverallStatus(StrEnum):
|
|
14
|
+
"""
|
|
15
|
+
服务整体状态枚举
|
|
16
|
+
Enum for overall service status used in overviews
|
|
17
|
+
"""
|
|
18
|
+
UP = "UP"
|
|
19
|
+
PARTIAL = "PARTIAL"
|
|
20
|
+
DOWN = "DOWN"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# 更多健康状态,用于实例级别标记
|
|
24
|
+
class InstanceHealthStatus(StrEnum):
|
|
25
|
+
UNKNOWN = "unknown"
|
|
26
|
+
HEALTHY = "healthy"
|
|
27
|
+
DEGRADED = "degraded"
|
|
28
|
+
UNHEALTHY = "unhealthy"
|
|
29
|
+
EXEMPTED = "exempted"
|
|
30
|
+
EXPECTED_STOPPED = "expected_stopped"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ServiceRuntimeStatus(StrEnum):
|
|
34
|
+
"""
|
|
35
|
+
服务运行时状态(用于概览的 expected/actual)
|
|
36
|
+
Runtime service status for overview expected/actual fields
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
RUNNING = "running"
|
|
40
|
+
STOPPED = "stopped"
|
|
41
|
+
DEGRADED = "degraded"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ServiceExpectedStatusAlias(StrEnum):
|
|
45
|
+
"""
|
|
46
|
+
期望状态别名(用于标准化输入)
|
|
47
|
+
Expected status aliases for normalization
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
STOP = "stop"
|
|
51
|
+
STOPPED = "stopped"
|
|
52
|
+
DOWN = "down"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Hook-related enums.
|
|
3
|
+
"""
|
|
4
|
+
from enum import StrEnum, IntEnum
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class HookResult(StrEnum):
|
|
8
|
+
"""钩子执行结果枚举"""
|
|
9
|
+
SUCCESS = "success" # 成功
|
|
10
|
+
FAILURE = "failure" # 失败
|
|
11
|
+
SKIP = "skip" # 跳过
|
|
12
|
+
RETRY = "retry" # 重试
|
|
13
|
+
TERMINATE = "terminate" # 终止
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class HookType(StrEnum):
|
|
17
|
+
"""钩子类型枚举 / Hook type enum"""
|
|
18
|
+
PRE_REGISTER = "pre_register" # 注册前钩子
|
|
19
|
+
POST_REGISTER = "post_register" # 注册后钩子
|
|
20
|
+
PRE_DEREGISTER = "pre_deregister" # 注销前钩子
|
|
21
|
+
POST_DEREGISTER = "post_deregister" # 注销后钩子
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class HookPriority(IntEnum):
|
|
25
|
+
"""钩子优先级枚举"""
|
|
26
|
+
HIGHEST = 0
|
|
27
|
+
HIGH = 25
|
|
28
|
+
MEDIUM = 50
|
|
29
|
+
NORMAL = 50
|
|
30
|
+
LOW = 75
|
|
31
|
+
LOWEST = 100
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class HookLogAction(StrEnum):
|
|
35
|
+
"""
|
|
36
|
+
钩子日志行为类型枚举
|
|
37
|
+
Hook log action type enum
|
|
38
|
+
"""
|
|
39
|
+
REGISTERED = "registered" # 钩子已注册
|
|
40
|
+
DEREGISTERED = "deregistered" # 钩子已注销
|
|
41
|
+
EXECUTION_STARTED = "execution_started" # 执行开始
|
|
42
|
+
EXECUTION_SUCCESS = "execution_success" # 执行成功
|
|
43
|
+
EXECUTION_FAILURE = "execution_failure" # 执行失败
|
|
44
|
+
REJECTION = "rejection" # 拒绝注册
|
|
45
|
+
MODIFICATION = "modification" # 修改服务信息
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class SensitiveFieldKey(StrEnum):
|
|
49
|
+
"""
|
|
50
|
+
敏感字段名枚举(用于日志脱敏)
|
|
51
|
+
Sensitive field key enum (for log sanitization)
|
|
52
|
+
"""
|
|
53
|
+
PASSWORD = "password"
|
|
54
|
+
TOKEN = "token"
|
|
55
|
+
SECRET = "secret"
|
|
56
|
+
CREDENTIAL = "credential"
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Metrics-related enums.
|
|
3
|
+
"""
|
|
4
|
+
from enum import StrEnum
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MetricType(StrEnum):
|
|
8
|
+
"""指标类型枚举"""
|
|
9
|
+
COUNTER = "counter"
|
|
10
|
+
GAUGE = "gauge"
|
|
11
|
+
HISTOGRAM = "histogram"
|
|
12
|
+
SUMMARY = "summary"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class HookMetricName(StrEnum):
|
|
16
|
+
"""钩子指标名称枚举"""
|
|
17
|
+
EXECUTIONS_TOTAL = "hook_executions_total"
|
|
18
|
+
EXECUTION_DURATION_SECONDS = "hook_execution_duration_seconds"
|
|
19
|
+
FAILURES_TOTAL = "hook_failures_total"
|
|
20
|
+
ACTIVE_HOOKS = "active_hooks"
|
|
21
|
+
REJECTIONS_TOTAL = "hook_rejections_total"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class HookMetricLabel(StrEnum):
|
|
25
|
+
"""钩子指标标签枚举"""
|
|
26
|
+
HOOK_NAME = "hook_name"
|
|
27
|
+
HOOK_TYPE = "hook_type"
|
|
28
|
+
RESULT = "result"
|
|
29
|
+
ERROR_TYPE = "error_type"
|
|
30
|
+
REASON = "reason"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class HookMetricResult(StrEnum):
|
|
34
|
+
"""钩子指标结果枚举"""
|
|
35
|
+
SUCCESS = "success"
|
|
36
|
+
FAILURE = "failure"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Monitor-related enums.
|
|
3
|
+
"""
|
|
4
|
+
from enum import StrEnum
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ContainerStatus(StrEnum):
|
|
8
|
+
"""容器状态枚举"""
|
|
9
|
+
RUNNING = "running"
|
|
10
|
+
STOPPED = "stopped"
|
|
11
|
+
PAUSED = "paused"
|
|
12
|
+
RESTARTING = "restarting"
|
|
13
|
+
STARTING = "starting"
|
|
14
|
+
REMOVING = "removing"
|
|
15
|
+
EXITED = "exited"
|
|
16
|
+
DEAD = "dead"
|
|
17
|
+
CREATED = "created"
|
|
18
|
+
UNKNOWN = "unknown"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class CleanupPolicy(StrEnum):
|
|
22
|
+
"""清理策略枚举"""
|
|
23
|
+
NEVER = "never" # 从不清理
|
|
24
|
+
ON_FAILURE = "failure" # 失败时清理
|
|
25
|
+
ON_EXIT = "exit" # 退出时清理
|
|
26
|
+
ALWAYS = "always" # 总是清理
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""
|
|
2
|
+
异步操作相关的常量和枚举定义
|
|
3
|
+
"""
|
|
4
|
+
from enum import StrEnum
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class OperationType(StrEnum):
|
|
8
|
+
"""操作类型枚举"""
|
|
9
|
+
START = "start"
|
|
10
|
+
STOP = "stop"
|
|
11
|
+
RESTART = "restart"
|
|
12
|
+
STATUS = "status"
|
|
13
|
+
LIST = "list"
|
|
14
|
+
HEALTH = "health"
|
|
15
|
+
COMPOSE_STATUS = "compose_status"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class OperationStatus(StrEnum):
|
|
19
|
+
"""操作状态枚举"""
|
|
20
|
+
PENDING = "pending"
|
|
21
|
+
RUNNING = "running"
|
|
22
|
+
SUCCESS = "success"
|
|
23
|
+
FAILED = "failed"
|
|
24
|
+
TIMEOUT = "timeout"
|
|
25
|
+
CANCELLED = "cancelled"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class InitiatedBy(StrEnum):
|
|
29
|
+
"""操作发起者枚举"""
|
|
30
|
+
OPSBFFSRV = "opsbffsrv"
|
|
31
|
+
INFRASRV = "infrasrv"
|
|
32
|
+
CONTROLLERSRV = "controllersrv"
|
|
33
|
+
SYSTEM = "system"
|
|
34
|
+
USER = "user"
|
|
35
|
+
INFRASRV_HEALTH_CHECK = "infrasrv_health_check"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class InitiatedFrom(StrEnum):
|
|
39
|
+
"""发起来源枚举"""
|
|
40
|
+
FRONTEND = "frontend"
|
|
41
|
+
API = "api"
|
|
42
|
+
SCHEDULER = "scheduler"
|
|
43
|
+
WEBHOOK = "webhook"
|
|
44
|
+
INTERNAL = "internal"
|
|
45
|
+
HEALTH_CHECK_DOMAIN = "health_check_domain"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# 操作超时时间配置(秒)
|
|
49
|
+
OPERATION_TIMEOUTS = {
|
|
50
|
+
OperationType.START: 120,
|
|
51
|
+
OperationType.STOP: 60,
|
|
52
|
+
OperationType.RESTART: 180,
|
|
53
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Opsbffsrv 模块错误码枚举 / Error code enumerations for opsbffsrv."""
|
|
2
|
+
from enum import StrEnum
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class OpsbffsrvInstanceErrorCode(StrEnum):
|
|
6
|
+
"""实例管理错误码 / Instance management error codes."""
|
|
7
|
+
|
|
8
|
+
LIST_HTTP_ERROR = "50001" # 获取实例列表失败 / Failed to fetch instance list
|
|
9
|
+
INTERNAL_ERROR = "50000" # 实例管理内部错误 / Internal instance management error
|
|
10
|
+
DETAIL_HTTP_ERROR = "50002" # 获取实例详情失败 / Failed to fetch instance detail
|
|
11
|
+
STATS_HTTP_ERROR = "50003" # 获取实例统计信息失败 / Failed to fetch instance statistics
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class OpsbffsrvServiceLogsErrorCode(StrEnum):
|
|
15
|
+
"""服务日志错误码 / Service logs error codes."""
|
|
16
|
+
|
|
17
|
+
INVALID_INPUT = "10001" # 输入参数无效 / Invalid input parameter
|
|
18
|
+
INFRA_HTTP_ERROR = "10002" # 调用 infrasrv HTTP 出错 / HTTP error when calling infrasrv
|
|
19
|
+
INFRA_RESPONSE_ERROR = "10003" # infrasrv 返回失败 / infrasrv responded with failure
|
|
20
|
+
INTERNAL_ERROR = "10004" # 服务日志内部错误 / Internal service log error
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class OpsbffsrvServiceConfigErrorCode(StrEnum):
|
|
24
|
+
"""服务配置错误码 / Service configuration error codes."""
|
|
25
|
+
|
|
26
|
+
INVALID_INPUT = "20001" # 输入参数无效 / Invalid input parameter
|
|
27
|
+
INTERNAL_ERROR = "20002" # 服务配置内部错误 / Internal service configuration error
|
|
28
|
+
PUSH_TRIGGER_FAILED = "20003" # 配置推送触发失败 / Failed to trigger config push
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class OpsbffsrvDbAdminErrorCode(StrEnum):
|
|
32
|
+
"""数据库管理错误码 / Database administration error codes."""
|
|
33
|
+
|
|
34
|
+
SCHEMA_APPLY_FAILED = "30001" # 模式应用失败 / Schema apply operation failed
|
|
35
|
+
SCHEMA_DIFF_FAILED = "30002" # 模式对比失败 / Schema diff operation failed
|
|
36
|
+
DATABASE_REBUILD_FAILED = "30003" # 数据库重建失败 / Database rebuild operation failed
|
|
37
|
+
TABLE_REBUILD_FAILED = "30004" # 数据表重建失败 / Table rebuild operation failed
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class OpsbffsrvCaddyRouteErrorCode(StrEnum):
|
|
41
|
+
"""Caddy 路由错误码 / Caddy route management error codes."""
|
|
42
|
+
|
|
43
|
+
CREATE_VALIDATION_FAILED = "40001" # 路由创建参数校验失败 / Route creation validation failed
|
|
44
|
+
CREATE_SYNC_FAILED = "50001" # 路由创建同步失败 / Route creation sync failure
|
|
45
|
+
UPDATE_VALIDATION_FAILED = "40002" # 路由更新参数校验失败 / Route update validation failed
|
|
46
|
+
UPDATE_SYNC_FAILED = "50002" # 路由更新同步失败 / Route update sync failure
|
|
47
|
+
ROUTE_NOT_FOUND = "40401" # 路由不存在 / Route not found
|
|
48
|
+
ROUTE_QUERY_FAILED = "50003" # 路由查询失败 / Route query failure
|
|
49
|
+
ROUTE_DELETE_FAILED = "50004" # 路由删除失败 / Route deletion failure
|
|
50
|
+
ROUTE_TOGGLE_VALIDATION_FAILED = "40003" # 路由状态切换参数校验失败 / Route toggle validation failed
|
|
51
|
+
ROUTE_TOGGLE_FAILED = "50005" # 路由状态切换失败 / Route toggle failure
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class OpsbffsrvCaddyStatsErrorCode(StrEnum):
|
|
55
|
+
"""Caddy 统计错误码 / Caddy statistics error codes."""
|
|
56
|
+
|
|
57
|
+
REALTIME_GLOBAL_FAILED = "50301" # 获取实时全局统计失败 / Failed to fetch realtime global stats
|
|
58
|
+
REALTIME_SERVICE_NOT_FOUND = "40401" # 服务统计不存在 / Service statistics not found
|
|
59
|
+
REALTIME_SERVICE_FAILED = "50302" # 获取实时服务统计失败 / Failed to fetch realtime service stats
|
|
60
|
+
GLOBAL_TREND_FAILED = "50303" # 获取全局趋势失败 / Failed to fetch global trend
|
|
61
|
+
SERVICE_TREND_FAILED = "50304" # 获取服务趋势失败 / Failed to fetch service trend
|
|
62
|
+
ROUTE_TREND_FAILED = "50305" # 获取路由趋势失败 / Failed to fetch route trend
|
|
63
|
+
TOP_COUNTRY_FAILED = "50306" # 获取 Top 国家失败 / Failed to fetch top countries
|
|
64
|
+
TOP_IP_FAILED = "50307" # 获取 Top IP 失败 / Failed to fetch top IPs
|
|
65
|
+
CLEANUP_FAILED = "50308" # 清理统计数据失败 / Failed to cleanup statistics
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class OpsbffsrvCaddyAccessLogErrorCode(StrEnum):
|
|
69
|
+
"""Caddy 访问日志错误码 / Caddy access log error codes."""
|
|
70
|
+
|
|
71
|
+
SEARCH_FAILED = "50401" # 搜索访问日志失败 / Failed to search access logs
|
|
72
|
+
SECURITY_EVENT_FAILED = "50402" # 获取安全事件失败 / Failed to fetch security events
|
|
73
|
+
GEO_ANALYSIS_FAILED = "50403" # 分析地理分布失败 / Failed to analyze geographic distribution
|
|
74
|
+
STATUS_CODE_ANALYSIS_FAILED = "50404" # 分析状态码分布失败 / Failed to analyze status code distribution
|
|
75
|
+
SUSPICIOUS_IP_FAILED = "50405" # 检测可疑 IP 失败 / Failed to detect suspicious IPs
|
|
76
|
+
ERROR_PATTERN_ANALYSIS_FAILED = "50406" # 分析错误模式失败 / Failed to analyze error patterns
|
|
77
|
+
CLEANUP_LOG_FAILED = "50407" # 清理访问日志失败 / Failed to cleanup access logs
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class OpsbffsrvAuthErrorCode(StrEnum):
|
|
81
|
+
"""认证错误码 / Authentication error codes."""
|
|
82
|
+
|
|
83
|
+
CAPTCHA_INVALID = "60001" # 验证码错误 / Invalid captcha
|
|
84
|
+
CREDENTIALS_INVALID = "60002" # 用户名或密码错误 / Invalid credentials
|
|
85
|
+
IP_LOCKED = "60003" # IP 被锁定 / IP locked
|
|
86
|
+
TEMP_TOKEN_INVALID = "60004" # 临时 token 无效 / Temp token invalid
|
|
87
|
+
TOTP_INVALID = "60005" # TOTP 验证码错误 / Invalid TOTP code
|
|
88
|
+
TOTP_ALREADY_BOUND = "60006" # TOTP 已绑定 / TOTP already bound
|
|
89
|
+
SESSION_INVALID = "60007" # Session 无效 / Invalid session
|
|
90
|
+
INTERNAL_ERROR = "60099" # 认证内部错误 / Authentication internal error
|
|
91
|
+
|
|
92
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Override-related constants.
|
|
2
|
+
|
|
3
|
+
用于覆盖(override)机制的常量定义。
|
|
4
|
+
Constants for override discovery/configuration.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# Overrides root environment variable name.
|
|
8
|
+
# overrides 根目录环境变量名。
|
|
9
|
+
OVERRIDE_ENV = "CANCAN_OVERRIDE_ROOT"
|
|
10
|
+
|
|
11
|
+
# Overrides folder name under workspace.
|
|
12
|
+
# workspace 下 overrides 目录名称。
|
|
13
|
+
OVERRIDE_DIR_NAME = "cancan_overrides"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class RedisKey(StrEnum):
|
|
5
|
+
AUTH_ACCESS_KEY = "auth_access_token"
|
|
6
|
+
AUTH_ACCESS_LOCK_KEY = "access_token_lock"
|
|
7
|
+
USER_LOGIN_TOKEN_KEY = "user_login_token"
|
|
8
|
+
USER_ID_TO_LOGIN_TOKEN_KEY = "user_id_to_login_token"
|
|
9
|
+
USER_SESSION_KEY = "user_session_key"
|
|
10
|
+
|
|
11
|
+
SERVICE_REGISTRY_PREFIX = "service_registry:"
|
|
12
|
+
SERVICE_REGISTRY_INSTANCE = "instance:{service_name}:{instance_id}"
|
|
13
|
+
SERVICE_REGISTRY_SERVICE_INSTANCES = "instances:{service_name}"
|
|
14
|
+
SERVICE_REGISTRY_ALL_SERVICES = "all_services"
|
|
15
|
+
SERVICE_REGISTRY_SERVICE_NAMES = "service_names"
|
|
16
|
+
|
|
17
|
+
WORKFLOW_UPDATE_PREFIX = "workflow_update:"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class PushStatus(StrEnum):
|
|
5
|
+
SUCCESS = "success"
|
|
6
|
+
FAILED = "failed"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class InstanceStatus(StrEnum):
|
|
10
|
+
"""服务实例状态枚举"""
|
|
11
|
+
STARTING = "starting"
|
|
12
|
+
RUNNING = "running"
|
|
13
|
+
STOPPING = "stopping"
|
|
14
|
+
STOPPED = "stopped"
|
|
15
|
+
UNHEALTHY = "unhealthy"
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""Workflow task constants.
|
|
2
|
+
|
|
3
|
+
集中声明 Celery 任务名称,避免散落在多个模块中造成字符串不一致。
|
|
4
|
+
Centralizes Celery task identifiers to keep task names consistent across modules.
|
|
5
|
+
"""
|
|
6
|
+
from enum import StrEnum
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Immutable workflow node IDs
|
|
10
|
+
# 工作流内置节点 ID(不可变,前端/后端都应视为保留字)
|
|
11
|
+
IMMUTABLE_START_NODE_IDS: frozenset[str] = frozenset({
|
|
12
|
+
"start",
|
|
13
|
+
"start_node",
|
|
14
|
+
"node-start",
|
|
15
|
+
"node_start",
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
IMMUTABLE_END_NODE_IDS: frozenset[str] = frozenset({
|
|
19
|
+
"end",
|
|
20
|
+
"end_node",
|
|
21
|
+
"node-end",
|
|
22
|
+
"node_end",
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class WorkflowTask(StrEnum):
|
|
27
|
+
EXECUTE_NODE = "workflows.execute_node"
|
|
28
|
+
SCAN_SCHEDULED = "workflows.scan_scheduled"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class WorkflowStatusEnum(StrEnum):
|
|
32
|
+
PENDING = "PENDING"
|
|
33
|
+
RUNNING = "RUNNING"
|
|
34
|
+
SUCCESS = "SUCCESS"
|
|
35
|
+
FAILURE = "FAILURE"
|
|
36
|
+
CANCELLED = "CANCELLED"
|
|
37
|
+
PAUSED = "PAUSED"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class NodeStatusEnum(StrEnum):
|
|
41
|
+
PENDING = "PENDING"
|
|
42
|
+
RUNNING = "RUNNING"
|
|
43
|
+
SUCCESS = "SUCCESS"
|
|
44
|
+
FAILURE = "FAILURE"
|
|
45
|
+
SKIPPED = "SKIPPED"
|
|
46
|
+
SUSPENDED = "SUSPENDED" # 等待回调
|
|
47
|
+
RETRYING = "RETRYING"
|
|
48
|
+
CANCELLED = "CANCELLED" # 跟随流程取消
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class TriggerTypeEnum(StrEnum):
|
|
52
|
+
MANUAL = "MANUAL"
|
|
53
|
+
SCHEDULE = "SCHEDULE"
|
|
54
|
+
API = "API"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class WorkflowEngineAlertReason(StrEnum):
|
|
58
|
+
"""Workflow engine alert reasons to keep string identifiers consistent."""
|
|
59
|
+
|
|
60
|
+
INVALID_RUN_ID = "INVALID_RUN_ID"
|
|
61
|
+
RUN_NOT_FOUND = "RUN_NOT_FOUND"
|
|
62
|
+
WORKFLOW_DEFINITION_MISSING = "WORKFLOW_DEFINITION_MISSING"
|
|
63
|
+
NODE_CONFIG_MISSING = "NODE_CONFIG_MISSING"
|
|
64
|
+
NODE_EXECUTION_EXCEPTION = "NODE_EXECUTION_EXCEPTION"
|
|
65
|
+
NODE_TERMINATED_WITHOUT_DOWNSTREAM = "NODE_TERMINATED_WITHOUT_DOWNSTREAM"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Cancan Microstack public exceptions.
|
|
2
|
+
|
|
3
|
+
为本库代码提供统一异常类型,避免依赖业务仓库的代码。
|
|
4
|
+
Provide shared exceptions for the library without depending on any consumer repo.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import http
|
|
8
|
+
from typing import Optional
|
|
9
|
+
|
|
10
|
+
from linglong_web.core.errors import LinglongHTTPException
|
|
11
|
+
|
|
12
|
+
from cancan_microstack.public.const.error import ErrorCode
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class HTTPException(LinglongHTTPException):
|
|
16
|
+
"""HTTP 异常 / HTTP exception."""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
status_code: int = http.HTTPStatus.INTERNAL_SERVER_ERROR.value,
|
|
21
|
+
error_code: str = ErrorCode.SYSTEM_ERROR,
|
|
22
|
+
msg: Optional[str] = None,
|
|
23
|
+
detail: Optional[str] = None,
|
|
24
|
+
) -> None:
|
|
25
|
+
super().__init__(
|
|
26
|
+
status_code=status_code,
|
|
27
|
+
error_code=error_code,
|
|
28
|
+
message=msg,
|
|
29
|
+
detail=detail,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ParamError(HTTPException):
|
|
34
|
+
"""参数错误 / Invalid parameter error."""
|
|
35
|
+
|
|
36
|
+
def __init__(self, msg: Optional[str] = None, error_code: str = ErrorCode.INVALID_PARAM) -> None:
|
|
37
|
+
super().__init__(
|
|
38
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
39
|
+
error_code=error_code,
|
|
40
|
+
msg=msg or "Invalid request parameters",
|
|
41
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from linglong_web import LinglongConfigBase
|
|
5
|
+
from linglong_web import Rmanager
|
|
6
|
+
|
|
7
|
+
from cancan_microstack.runtime.workspace import ensure_server_log_dir
|
|
8
|
+
from cancan_microstack.public.logging.mq_handler import RabbitMQHandler
|
|
9
|
+
|
|
10
|
+
# 模块级变量,用于持有处理器实例
|
|
11
|
+
# Module-level variable to hold the handler instance
|
|
12
|
+
_handler: Optional[RabbitMQHandler] = None
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def setup_mq_logging(conf: LinglongConfigBase, service_name: str):
|
|
16
|
+
"""
|
|
17
|
+
初始化并注册 RabbitMQ 日志处理器。
|
|
18
|
+
此函数会将处理器添加到根日志记录器中,以便捕获所有日志。
|
|
19
|
+
这是一个异步函数,应在应用资源(如 RabbitMQ 连接)准备就绪后调用。
|
|
20
|
+
|
|
21
|
+
Initializes and registers the RabbitMQ log handler.
|
|
22
|
+
This function adds the handler to the root logger to capture all logs.
|
|
23
|
+
It is an async function and should be called after application resources
|
|
24
|
+
(like the RabbitMQ connection) are ready.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
conf: The application's configuration proxy object.
|
|
28
|
+
service_name: The name of the service, used for routing log messages.
|
|
29
|
+
"""
|
|
30
|
+
global _handler
|
|
31
|
+
|
|
32
|
+
# 确保 server_log_data 目录存在,避免日志写入 venv 目录
|
|
33
|
+
# Ensure the canonical server_log_data directory exists outside the venv
|
|
34
|
+
ensure_server_log_dir()
|
|
35
|
+
# 检查日志管道是否已启用
|
|
36
|
+
# Check if the log pipeline is enabled in the configuration
|
|
37
|
+
if not conf.LOG_PIPELINE_ENABLED:
|
|
38
|
+
logging.info("MQ logging is disabled via LOG_PIPELINE_ENABLED config.")
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
# 确保 RabbitMQ 连接可用
|
|
42
|
+
# Ensure the RabbitMQ connection is available
|
|
43
|
+
if not Rmanager.mq_conn or Rmanager.mq_conn.is_closed:
|
|
44
|
+
logging.error("Cannot setup MQ logging: RabbitMQ connection is not available in Rmanager.")
|
|
45
|
+
return
|
|
46
|
+
|
|
47
|
+
# 检查是否已存在处理器,避免重复添加
|
|
48
|
+
# Check if a handler is already configured to prevent duplication
|
|
49
|
+
root_logger = logging.getLogger()
|
|
50
|
+
if any(isinstance(h, RabbitMQHandler) for h in root_logger.handlers):
|
|
51
|
+
logging.warning("RabbitMQ log handler already configured.")
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
# 从配置中获取 exchange 名称
|
|
56
|
+
# Get the exchange name from the configuration
|
|
57
|
+
exchange_name = getattr(conf, "RABBITMQ_LOG_EXCHANGE", None) or conf.LOG_CONFIG.get(
|
|
58
|
+
'exchange_name',
|
|
59
|
+
'logs.topic.exchange',
|
|
60
|
+
)
|
|
61
|
+
routing_template = getattr(conf, "RABBITMQ_LOG_ROUTING_TEMPLATE", None) or "logs.business.{service}.{level}"
|
|
62
|
+
|
|
63
|
+
# 创建处理器实例
|
|
64
|
+
# Create the handler instance
|
|
65
|
+
handler = RabbitMQHandler(
|
|
66
|
+
connection=Rmanager.mq_conn,
|
|
67
|
+
service_name=service_name,
|
|
68
|
+
exchange_name=exchange_name,
|
|
69
|
+
routing_template=routing_template,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# 异步初始化在 RabbitMQHandler 的 __init__ 中已经通过 run_coroutine_threadsafe 启动
|
|
73
|
+
# aio_pika 的 RobustConnection 会自动处理重连,所以我们直接添加处理器即可
|
|
74
|
+
# Async initialization is already started in RabbitMQHandler's __init__ via run_coroutine_threadsafe.
|
|
75
|
+
# aio_pika's RobustConnection handles reconnections automatically, so we can add the handler directly.
|
|
76
|
+
_handler = handler
|
|
77
|
+
root_logger.addHandler(_handler)
|
|
78
|
+
logging.info(f"RabbitMQ log handler added for service '{service_name}'. Initialization is in progress.")
|
|
79
|
+
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logging.error(f"Failed to create and add RabbitMQ log handler: {e}", exc_info=True)
|
|
82
|
+
_handler = None
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
async def shutdown_mq_logging():
|
|
86
|
+
"""
|
|
87
|
+
异步关闭 RabbitMQ 日志处理器。
|
|
88
|
+
这会从根日志记录器中移除处理器,并安全地关闭其 RabbitMQ 通道。
|
|
89
|
+
|
|
90
|
+
Asynchronously shuts down the RabbitMQ log handler.
|
|
91
|
+
This removes the handler from the root logger and safely closes its RabbitMQ channel.
|
|
92
|
+
"""
|
|
93
|
+
global _handler
|
|
94
|
+
if _handler:
|
|
95
|
+
root_logger = logging.getLogger()
|
|
96
|
+
logging.info("Shutting down RabbitMQ log handler.")
|
|
97
|
+
try:
|
|
98
|
+
# 首先从 logger 中移除处理器,停止接收新的日志
|
|
99
|
+
# First, remove the handler from the logger to stop accepting new logs
|
|
100
|
+
root_logger.removeHandler(_handler)
|
|
101
|
+
|
|
102
|
+
# 调用处理器的异步关闭方法
|
|
103
|
+
# Call the handler's asynchronous close method
|
|
104
|
+
await _handler.close_async()
|
|
105
|
+
logging.info("RabbitMQ log handler has been shut down.")
|
|
106
|
+
except Exception as e:
|
|
107
|
+
logging.error(f"Error during RabbitMQ log handler shutdown: {e}", exc_info=True)
|
|
108
|
+
finally:
|
|
109
|
+
_handler = None
|