iamt 1.1.27__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.
- iamt/__init__.py +67 -0
- iamt/__main__.py +5 -0
- iamt/client_config/client_config.py +354 -0
- iamt/completers/customCompleter.py +143 -0
- iamt/composes/5425CICD/gitea/.rdm.md +4 -0
- iamt/composes/5425CICD/gitea/docker-compose.yml +52 -0
- iamt/composes/5425CICD/gitlab/.rdm.md +20 -0
- iamt/composes/5425CICD/gitlab/config/ssl/.gitkeep +0 -0
- iamt/composes/5425CICD/gitlab/docker-compose.yml +32 -0
- iamt/composes/5425CICD/gitlabDocs/.rdm.md +3 -0
- iamt/composes/5425CICD/gitlabRunner/.rdm.md +5 -0
- iamt/composes/5425CICD/sonarQube/.rdm.md +14 -0
- iamt/composes/5425CICD/sonarQube/docker-compose.yml +46 -0
- iamt/composes/5425CICD/sonarQube/docker-compose3.yml +41 -0
- iamt/composes/5425CICD/sonarQube/docker-compose4.yml +33 -0
- iamt/composes/5425CICD/sonarQube/sonarqube_conf/.gitkeep +0 -0
- iamt/composes/5425CICD/sonarQube/sonarqube_data/.gitkeep +0 -0
- iamt/composes/5425CICD/sonarQube/sonarqube_extensions/.gitkeep +0 -0
- iamt/composes/5425CICD/sonarQube/sonarqube_logs/.gitkeep +0 -0
- iamt/composes/5425CICD/sonarQube/sonarqube_temp/.gitkeep +0 -0
- iamt/composes/5435PROMPT/.rdm.md +11 -0
- iamt/composes/5435PROMPT/langfuse/.env +276 -0
- iamt/composes/5435PROMPT/langfuse/.rdm.md +3 -0
- iamt/composes/5435PROMPT/langfuse/docker-compose.yml +166 -0
- iamt/composes/5435PROMPT/prompt-optimizer/.rdm.md +3 -0
- iamt/composes/5465BASE/alpine/.rdm.md +6 -0
- iamt/composes/5465BASE/mysql/.rdm.md +40 -0
- iamt/composes/5465BASE/mysql/conf/my.cnf +52 -0
- iamt/composes/5465BASE/mysql/docker-compose.yml +31 -0
- iamt/composes/5465BASE/mysql/init/01-init.sql +14 -0
- iamt/composes/5465BASE/nginx/.rdm.md +16 -0
- iamt/composes/5465BASE/nginx/docker-compose.yml +29 -0
- iamt/composes/5465BASE/nginx/html/index.html +11 -0
- iamt/composes/5465BASE/nginx/nginx/conf.d/default.conf +22 -0
- iamt/composes/5465BASE/nginx/nginx/nginx.conf +35 -0
- iamt/composes/5465BASE/node/.rdm.md +0 -0
- iamt/composes/5465BASE/node/docker-compose.yml +0 -0
- iamt/composes/5465BASE/php/.rdm.md +0 -0
- iamt/composes/5465BASE/php/docker-compose.yml +0 -0
- iamt/composes/5465BASE/redis/.env +11 -0
- iamt/composes/5465BASE/redis/.rdm.md +7 -0
- iamt/composes/5465BASE/redis/config/redis.conf +57 -0
- iamt/composes/5465BASE/redis/docker-compose.yml +35 -0
- iamt/composes/5475TTS/GPTsovits/.rdm.md +4 -0
- iamt/composes/5475TTS/GPTsovits/docker-compose.yml +34 -0
- iamt/composes/5475TTS/indexTTS/.rdm.md +3 -0
- iamt/composes/5485MCP/.rdm.md +5 -0
- iamt/composes/5485MCP/mcpGateway/.rdm.md +2 -0
- iamt/composes/5485MCP/mcpGateway/docker-compose.yml +0 -0
- iamt/composes/5485MCP/mcpProxy/.rdm.md +2 -0
- iamt/composes/5485MCP/mcpProxy/config.json +53 -0
- iamt/composes/5485MCP/mcpProxy/docker-compose.yml +34 -0
- iamt/composes/5485MCP/superGateway/.env +2 -0
- iamt/composes/5485MCP/superGateway/.rdm.md +17 -0
- iamt/composes/5485MCP/superGateway/docker-compose.yml +21 -0
- iamt/composes/5495LLM/ollama_nvidia/.rdm.md +21 -0
- iamt/composes/5495LLM/ollama_nvidia/docker-compose.yml +24 -0
- iamt/composes/5555RAG/QAnything/.rdm.md +5 -0
- iamt/composes/5555RAG/bisheng/.rdm.md +4 -0
- iamt/composes/5555RAG/devdocs/.rdm.md +4 -0
- iamt/composes/5555RAG/devdocs/docker-compose.yml +81 -0
- iamt/composes/5555RAG/kotaemon/.rdm.md +3 -0
- iamt/composes/5555RAG/kotaemon/docker-compose.yml +3 -0
- iamt/composes/5555RAG/llama_index/.rdm.md +3 -0
- iamt/composes/5555RAG/ragflow/.rdm.md +4 -0
- iamt/composes/5555RAG/ragflow/docker-compose.yml +0 -0
- iamt/composes/5556LLMAPI/litellm/.env +29 -0
- iamt/composes/5556LLMAPI/litellm/.rdm.md +17 -0
- iamt/composes/5556LLMAPI/litellm/config.yaml +211 -0
- iamt/composes/5556LLMAPI/litellm/docker-compose.yml +68 -0
- iamt/composes/5556LLMAPI/litellm/prometheus.yml +9 -0
- iamt/composes/5556LLMAPI/newapi/.env +7 -0
- iamt/composes/5556LLMAPI/newapi/docker-compose.yml +54 -0
- iamt/composes/5556LLMAPI/newapi_sqlite/.env +3 -0
- iamt/composes/5556LLMAPI/newapi_sqlite/.rdm.md +15 -0
- iamt/composes/5556LLMAPI/newapi_sqlite/docker-compose.yml +15 -0
- iamt/composes/5556LLMAPI/oneapi/.env +5 -0
- iamt/composes/5556LLMAPI/oneapi/docker-compose.yml +51 -0
- iamt/composes/5556LLMAPI/oneapi_postgresql/docker-compose.yml +51 -0
- iamt/composes/5556LLMAPI/oneapi_sqlite/.rdm.md +10 -0
- iamt/composes/5556LLMAPI/oneapi_sqlite/docker-compose.yml +15 -0
- iamt/composes/5557AICLIENT/chatgpt-web-midjourney-proxy/.rdm.md +4 -0
- iamt/composes/5557AICLIENT/librechat/.env +511 -0
- iamt/composes/5557AICLIENT/librechat/.env.example +509 -0
- iamt/composes/5557AICLIENT/librechat/README.md +10 -0
- iamt/composes/5557AICLIENT/librechat/docker-compose.override.yml +21 -0
- iamt/composes/5557AICLIENT/librechat/docker-compose.yml +70 -0
- iamt/composes/5557AICLIENT/librechat/librechat.yaml +19 -0
- iamt/composes/5557AICLIENT/librechat/litellm-config.yml +21 -0
- iamt/composes/5557AICLIENT/librechat_oneapi/.env +535 -0
- iamt/composes/5557AICLIENT/librechat_oneapi/.rdm.md +19 -0
- iamt/composes/5557AICLIENT/librechat_oneapi/docker-compose.override.yml +14 -0
- iamt/composes/5557AICLIENT/librechat_oneapi/docker-compose.yml +72 -0
- iamt/composes/5557AICLIENT/librechat_oneapi/librechat.yaml +42 -0
- iamt/composes/5557AICLIENT/nextChat/.rdm.md +13 -0
- iamt/composes/5557AICLIENT/nextChat/docker-compose.yml +2 -0
- iamt/composes/5557AICLIENT/openwebui/.env +15 -0
- iamt/composes/5557AICLIENT/openwebui/.rdm.md +6 -0
- iamt/composes/5557AICLIENT/openwebui/docker-compose.yml +33 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/.env +193 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/.rdm.md +15 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/README.md +71 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/atlas.hcl +12 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/migrations/20250703095335_initial.sql +90 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/migrations/20250703115304_update.sql +2 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/migrations/20250704040445_update.sql +2 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/migrations/20250708075302_update.sql +10 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/migrations/20250710100212_update.sql +38 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/migrations/20250711034533_update.sql +8 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/migrations/20250717125913_update.sql +12 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/migrations/atlas.sum +8 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/atlas/opencoze_latest_schema.hcl +4057 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/model_template_qwen.yaml +106 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark.yaml +133 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-1.5-lite.yaml +108 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-1.5-pro-256k.yaml +108 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-1.5-pro-32k.yaml +108 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-1.5-thinking-pro.yaml +131 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-1.5-thinking-vision-pro.yaml +132 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-1.5-vision-lite.yaml +131 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-1.5-vision-pro.yaml +132 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-seed-1.6-flash.yaml +132 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-seed-1.6-thinking.yaml +132 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_doubao-seed-1.6.yaml +132 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_volc_deepseek-r1.yaml +108 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ark_volc_deepseek-v3.yaml +108 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_basic.yaml +201 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_claude.yaml +90 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_deepseek.yaml +107 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_gemini.yaml +139 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_ollama.yaml +84 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_openai.yaml +171 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/model/template/model_template_qwen.yaml +106 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/common/oauth_schema.json +42 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/bocha_search.yaml +179 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/chestnut_sign.yaml +50 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/gaode_map.yaml +754 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/image_compression.yaml +58 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/lark_authentication_authorization.yaml +56 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/lark_base.yaml +1172 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/lark_calendar.yaml +479 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/lark_docx.yaml +552 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/lark_message.yaml +499 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/lark_sheet.yaml +795 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/lark_task.yaml +409 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/lark_wiki.yaml +95 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/library_search.yaml +73 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/maker_smart_design.yaml +82 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/plugin_meta.yaml +913 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/sky_eye_check.yaml +431 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/sohu_hot_news.yaml +69 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/wolfram_alpha.yaml +100 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/plugin/pluginproduct/worth_buying.yaml +77 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/prompt/messages_to_query_template_jinja2.json +10 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/backend/conf/prompt/nl2sql_template_jinja2.json +10 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/docker-compose.yml +549 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/proxy/go.mod +3 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/proxy/proxy.go +100 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/elasticsearch/analysis-smartcn.zip +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/elasticsearch/elasticsearch.yml +14 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/elasticsearch/es_index_schema/coze_resource.index-template.json +74 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/elasticsearch/es_index_schema/project_draft.index-template.json +79 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/elasticsearch/setup_es.sh +142 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/etcd/etcd.conf.yml +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/.mc/config.json +1 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/claude_v2.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/connector-api.jpg +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/connector-chat-sdk.jpg +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/connector-coze.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/deepseek_v2.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/default_agent_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/default_app_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/default_database_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/default_dataset_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/default_prompt_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/default_workflow_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/doubao_v2.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/gemini_v2.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/image_kn_default_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/ollama.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/openai_v2.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/plugin_default_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/qwen_v2.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_10coz_folder.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_11coz_trans_switch.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_12coz_location.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_13coz_link.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_14coz_clock.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_1coz_ai.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_2icon_ai_writing.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_3coz_imageflow.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_4icon_aisearch.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_5icon_summary.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_6icon_digest.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_7icon_video.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_8icon_audio.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/shortcut_9coz_variables.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/table_kn_default_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/team_default_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/template_7416518827749425204.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/template_7418535986059067392.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/text_kn_default_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/default_icon/user_default_icon.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_ai_ppt.jpeg +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_bocha_search.jpeg +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_chat_ppt.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_chestnut_sign.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_constellation.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_gaode_map.jpeg +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_image_compression.jpeg +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_lark_authentication_authorization.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_lark_base.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_lark_calendar.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_lark_docx.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_lark_message.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_lark_sheet.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_lark_task.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_lark_wiki.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_library_search.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_liepin.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_maker_smart_design.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_sky_eye_check.jpeg +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_sohu_hot_news.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_wolfram_alpha.png +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/minio/official_plugin_icon/plugin_worth_buying.jpeg +0 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/mysql/schema.sql +836 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/mysql/sql_init.sql +666 -0
- iamt/composes/5558AIWORKFLOW/coze_studio/volumes/rocketmq/broker.conf +28 -0
- iamt/composes/5558AIWORKFLOW/dify/.env +1090 -0
- iamt/composes/5558AIWORKFLOW/dify/.rdm.md +11 -0
- iamt/composes/5558AIWORKFLOW/dify/certbot/README.md +76 -0
- iamt/composes/5558AIWORKFLOW/dify/certbot/docker-entrypoint.sh +30 -0
- iamt/composes/5558AIWORKFLOW/dify/certbot/update-cert.template.txt +19 -0
- iamt/composes/5558AIWORKFLOW/dify/couchbase-server/Dockerfile +4 -0
- iamt/composes/5558AIWORKFLOW/dify/couchbase-server/init-cbserver.sh +44 -0
- iamt/composes/5558AIWORKFLOW/dify/docker-compose.yml +1174 -0
- iamt/composes/5558AIWORKFLOW/dify/elasticsearch/docker-entrypoint.sh +25 -0
- iamt/composes/5558AIWORKFLOW/dify/image.png +0 -0
- iamt/composes/5558AIWORKFLOW/dify/nginx/conf.d/default.conf.template +48 -0
- iamt/composes/5558AIWORKFLOW/dify/nginx/docker-entrypoint.sh +42 -0
- iamt/composes/5558AIWORKFLOW/dify/nginx/https.conf.template +9 -0
- iamt/composes/5558AIWORKFLOW/dify/nginx/nginx.conf.template +34 -0
- iamt/composes/5558AIWORKFLOW/dify/nginx/proxy.conf.template +11 -0
- iamt/composes/5558AIWORKFLOW/dify/nginx/ssl/.gitkeep +0 -0
- iamt/composes/5558AIWORKFLOW/dify/pgvector/docker-entrypoint.sh +24 -0
- iamt/composes/5558AIWORKFLOW/dify/ssrf_proxy/docker-entrypoint.sh +42 -0
- iamt/composes/5558AIWORKFLOW/dify/ssrf_proxy/squid.conf.template +56 -0
- iamt/composes/5558AIWORKFLOW/dify/startupscripts/init.sh +13 -0
- iamt/composes/5558AIWORKFLOW/dify/startupscripts/init_user.script +10 -0
- iamt/composes/5558AIWORKFLOW/dify/tidb/config/pd.toml +4 -0
- iamt/composes/5558AIWORKFLOW/dify/tidb/config/tiflash-learner.toml +13 -0
- iamt/composes/5558AIWORKFLOW/dify/tidb/config/tiflash.toml +19 -0
- iamt/composes/5558AIWORKFLOW/dify/tidb/docker-compose.yaml +62 -0
- iamt/composes/5558AIWORKFLOW/dify/volumes/myscale/config/users.d/custom_users_config.xml +17 -0
- iamt/composes/5558AIWORKFLOW/dify/volumes/oceanbase/init.d/vec_memory.sql +1 -0
- iamt/composes/5558AIWORKFLOW/dify/volumes/opensearch/opensearch_dashboards.yml +222 -0
- iamt/composes/5558AIWORKFLOW/dify/volumes/sandbox/conf/config.yaml +14 -0
- iamt/composes/5558AIWORKFLOW/dify/volumes/sandbox/conf/config.yaml.example +35 -0
- iamt/composes/5558AIWORKFLOW/dify/volumes/sandbox/dependencies/python-requirements.txt +0 -0
- iamt/composes/5558AIWORKFLOW/fastgpt/.rdm.md +14 -0
- iamt/composes/5558AIWORKFLOW/fastgpt/docker-compose-pgvector.yml +177 -0
- iamt/composes/5558AIWORKFLOW/langflow/.rdm.md +9 -0
- iamt/composes/5558AIWORKFLOW/langflow/docker-compose.yml +30 -0
- iamt/composes/5558AIWORKFLOW/n8n/.env +6 -0
- iamt/composes/5558AIWORKFLOW/n8n/.rdm.md +24 -0
- iamt/composes/5558AIWORKFLOW/n8n/docker-compose.yml +52 -0
- iamt/composes/5558AIWORKFLOW/n8n/init-data.sh +13 -0
- iamt/composes/5558AIWORKFLOW/n8n/n8n_storage/.gitkeep +0 -0
- iamt/composes/5559MJAPI/midjourney-proxy/.rdm.md +10 -0
- iamt/composes/5559MJAPI/midjourney-proxy/docker-compose.yml +0 -0
- iamt/composes/5559MJAPI/midjourney-proxy2/.rdm.md +5 -0
- iamt/composes/5559MJAPI/midjourney-proxy2/docker-compose.yml +21 -0
- iamt/composes/5655PROXY/3xui/.rdm.md +12 -0
- iamt/composes/5655PROXY/3xui/docker-compose.yml +15 -0
- iamt/composes/5655PROXY/hui/.rdm.md +6 -0
- iamt/composes/5655PROXY/hui/docker-compose.yml +18 -0
- iamt/composes/5655PROXY/mihomo/.rdm.config.md +17 -0
- iamt/composes/5655PROXY/mihomo/.rdm.md +40 -0
- iamt/composes/5655PROXY/mihomo/clash_meta_config/config.yaml +584 -0
- iamt/composes/5655PROXY/mihomo/clash_meta_config/geoip.metadb +0 -0
- iamt/composes/5655PROXY/mihomo/clash_meta_config/sub1.yaml +7 -0
- iamt/composes/5655PROXY/mihomo/clash_meta_config/sub2.yaml +56 -0
- iamt/composes/5655PROXY/mihomo/docker-compose.yml +33 -0
- iamt/composes/5655PROXY/nginx/.rdm +2 -0
- iamt/composes/5655PROXY/nginx/docker-compose.yml +21 -0
- iamt/composes/5655PROXY/sub-web/.rdm.md +9 -0
- iamt/composes/5655PROXY/sub2clash/.rdm.md +3 -0
- iamt/composes/5655PROXY/sub2clash/docker-compose.yml +21 -0
- iamt/composes/5655PROXY/subconverter/.rdm.md +4 -0
- iamt/composes/5655PROXY/v2ray/.rdm.md +3 -0
- iamt/composes/5655PROXY/v2raya/.rdm.md +33 -0
- iamt/composes/5655PROXY/v2raya/docker-compose.yml +19 -0
- iamt/composes/5655PROXY/xui/.rdm.md +3 -0
- iamt/composes/5755COMFYUI/akegarasu_lora-scripts/.rdm.md +18 -0
- iamt/composes/5755COMFYUI/akegarasu_lora-scripts/Dockerfile-for-Mainland-China +42 -0
- iamt/composes/5755COMFYUI/akegarasu_lora-scripts/docker-compose.yml +39 -0
- iamt/composes/5755COMFYUI/comfyui_boot/.rdm.md +29 -0
- iamt/composes/5755COMFYUI/comfyui_boot/docker-compose.yml +0 -0
- iamt/composes/5755COMFYUI/comfyui_boot_cu121/.env +1 -0
- iamt/composes/5755COMFYUI/comfyui_boot_cu121/.rdm.md +20 -0
- iamt/composes/5755COMFYUI/comfyui_boot_cu121/docker-compose.yml +45 -0
- iamt/composes/5755COMFYUI/comfyui_boot_cu121/storage/.gitkeep +0 -0
- iamt/composes/5755COMFYUI/comfyui_boot_cu124-cn/.rdm.md +22 -0
- iamt/composes/5755COMFYUI/comfyui_boot_cu124-cn/docker-compose.yml +31 -0
- iamt/composes/5755COMFYUI/comfyui_boot_minimal/.rdm.md +26 -0
- iamt/composes/5755COMFYUI/comfyui_boot_minimal/docker-compose.yml +0 -0
- iamt/composes/5755COMFYUI/comfyui_boot_slim/.env +0 -0
- iamt/composes/5755COMFYUI/comfyui_boot_slim/.rdm.md +23 -0
- iamt/composes/5755COMFYUI/comfyui_boot_slim/docker-compose.yml +24 -0
- iamt/composes/5755COMFYUI/swarmui/.rdm.md +5 -0
- iamt/composes/5755COMFYUI/swarmui/docker-compose.yml +38 -0
- iamt/composes/5855MEDIA/any-listen/.rdm.md +7 -0
- iamt/composes/5855MEDIA/any-listen/data/config.cjs +20 -0
- iamt/composes/5855MEDIA/any-listen/docker-compose.yml +10 -0
- iamt/composes/5855MEDIA/blackcandy/.rdm.md +1 -0
- iamt/composes/5855MEDIA/koel/.rdm.md +17 -0
- iamt/composes/5855MEDIA/koel/docker-compose.yml +41 -0
- iamt/composes/5855MEDIA/navidrome/.rdm.md +15 -0
- iamt/composes/5855MEDIA/navidrome/docker-compose.yml +15 -0
- iamt/composes/5955BACKUP/gobackup/.rdm.md +9 -0
- iamt/composes/5955BACKUP/gobackup/docker-compose.yml +19 -0
- iamt/composes/5955BACKUP/gobackup/gobackup/gobackup.yml +5 -0
- iamt/composes/5955BACKUP/rclone/.rdm.md +6 -0
- iamt/composes/5955BACKUP/rclone/docker-compose.yml +0 -0
- iamt/composes/5965SYNC/verysync/.rdm.md +16 -0
- iamt/composes/5965SYNC/verysync/docker-compose.yml +22 -0
- iamt/composes/6055DATABASE/adminer/.rdm.md +13 -0
- iamt/composes/6055DATABASE/cloudbeaver/.rdm.md +10 -0
- iamt/composes/6055DATABASE/mongodb/.env +7 -0
- iamt/composes/6055DATABASE/mongodb/.rdm.md +8 -0
- iamt/composes/6055DATABASE/mongodb/docker-compose.yml +24 -0
- iamt/composes/6055DATABASE/mongodbExpress/.env +10 -0
- iamt/composes/6055DATABASE/mongodbExpress/.rdm.md +14 -0
- iamt/composes/6055DATABASE/mongodbExpress/docker-compose.yml +24 -0
- iamt/composes/6055DATABASE/mysql/.env +0 -0
- iamt/composes/6055DATABASE/mysql/.rdm.md +0 -0
- iamt/composes/6055DATABASE/mysql/docker-compose.yml +26 -0
- iamt/composes/6055DATABASE/mysql/my.cnf +107 -0
- iamt/composes/6155AUTH/authentik/.env +10 -0
- iamt/composes/6155AUTH/authentik/.rdm.md +7 -0
- iamt/composes/6155AUTH/authentik/docker-compose.yml +90 -0
- iamt/composes/6155AUTH/casdoor/conf/app.conf +30 -0
- iamt/composes/6155AUTH/casdoor/docker-compose.yml +20 -0
- iamt/composes/6255Monitor/dcgm_exporter/.rdm.md +5 -0
- iamt/composes/6255Monitor/dcgm_exporter/docker-compose.yml +34 -0
- iamt/composes/6255Monitor/grafana/.env +5 -0
- iamt/composes/6255Monitor/grafana/.rdm.md +0 -0
- iamt/composes/6255Monitor/grafana/docker-compose.yml +22 -0
- iamt/composes/6255Monitor/node_exporter/.env +1 -0
- iamt/composes/6255Monitor/node_exporter/docker-compose.yml +19 -0
- iamt/composes/6255Monitor/prometheus/.env +6 -0
- iamt/composes/6255Monitor/prometheus/.rdm.md +8 -0
- iamt/composes/6255Monitor/prometheus/conf/prometheus.yml +39 -0
- iamt/composes/6255Monitor/prometheus/docker-compose.yml +28 -0
- iamt/composes/6255Monitor/prometheus/prometheus/.gitkeep +0 -0
- iamt/composes/6355SSL/certbot/.rdm.md +4 -0
- iamt/composes/6355SSL/certd/.rdm.md +4 -0
- iamt/composes/6355SSL/certimate/.rdm.md +23 -0
- iamt/composes/6355SSL/certimate/docker-compose.yml +17 -0
- iamt/composes/6455Storage/fileBrowser/.env +5 -0
- iamt/composes/6455Storage/fileBrowser/.rdm.md +17 -0
- iamt/composes/6455Storage/fileBrowser/docker-compose.yml +14 -0
- iamt/composes/6455Storage/fileBrowser/filebrowser.db +0 -0
- iamt/composes/6455Storage/fileBrowser/settings.json +8 -0
- iamt/composes/6455Storage/kskypro/.env +3 -0
- iamt/composes/6455Storage/kskypro/.rdm.md +30 -0
- iamt/composes/6455Storage/kskypro/buildimg/000-default.conf.template +45 -0
- iamt/composes/6455Storage/kskypro/buildimg/Dockerfile +97 -0
- iamt/composes/6455Storage/kskypro/buildimg/LICENSE +661 -0
- iamt/composes/6455Storage/kskypro/buildimg/entrypoint.sh +29 -0
- iamt/composes/6455Storage/kskypro/buildimg/ports.conf.template +2 -0
- iamt/composes/6455Storage/kskypro/buildimg/ssl/certs/ssl-cert-snakeoil.pem +21 -0
- iamt/composes/6455Storage/kskypro/buildimg/ssl/private/ssl-cert-snakeoil.key +28 -0
- iamt/composes/6455Storage/kskypro/docker-compose.yml +43 -0
- iamt/composes/6455Storage/kskypro/env.conf +43 -0
- iamt/composes/6455Storage/kskypro/mysql/conf/.gitkeep +0 -0
- iamt/composes/6455Storage/kskypro/mysql/data/.gitkeep +0 -0
- iamt/composes/6455Storage/kskypro/mysql/log/.gitkeep +0 -0
- iamt/composes/6455Storage/lskypro/.rdm.md +15 -0
- iamt/composes/6455Storage/lskypro/Dockerfile +12 -0
- iamt/composes/6455Storage/lskypro/docker-compose.yml +51 -0
- iamt/composes/6455Storage/minio/.rdm.md +1 -0
- iamt/composes/6455Storage/minio/docker-compose.yml +31 -0
- iamt/composes/6455Storage/nextcloud/.rdm.md +0 -0
- iamt/composes/6455Storage/nextcloud/docker-compose.yml +25 -0
- iamt/composes/6455Storage/seafile/.env +46 -0
- iamt/composes/6455Storage/seafile/.rdm.md +31 -0
- iamt/composes/6455Storage/seafile/caddy.yml +26 -0
- iamt/composes/6455Storage/seafile/seadoc.yml +39 -0
- iamt/composes/6455Storage/seafile/seafile-server.yml +79 -0
- iamt/composes/6555DNS/ddnsgo/.env +8 -0
- iamt/composes/6555DNS/ddnsgo/.rdm.md +7 -0
- iamt/composes/6555DNS/ddnsgo/docker-compose.yml +17 -0
- iamt/composes/6555DNS/lucky/.rdm.md +4 -0
- iamt/composes/6555DNS/lucky/docker-compose.yml +14 -0
- iamt/composes/6655CONTAINER/harbor/.rdm.md +1 -0
- iamt/composes/6755SHOP/dujiaoka/.rdm.md +10 -0
- iamt/composes/6755SHOP/dujiaoka/docker-compose.yml +37 -0
- iamt/composes/6755SHOP/dujiaoka/env.conf +46 -0
- iamt/composes/6755SHOP/dujiaoka/storage/.gitkeep +0 -0
- iamt/composes/6755SHOP/dujiaoka/uploads/.gitkeep +0 -0
- iamt/composes/6755SHOP/dujiaoka2/.rdm.md +3 -0
- iamt/composes/8888Others/apitable/docker-compose.yml +233 -0
- iamt/composes/8888Others/changeDetect/README +18 -0
- iamt/composes/8888Others/changeDetect/docker-compose.yml +44 -0
- iamt/composes/8888Others/codeServer/.rdm.md +7 -0
- iamt/composes/8888Others/codeServer/docker-compose.yml +39 -0
- iamt/composes/8888Others/douyin_tiktok_download_api/.rdm.md +19 -0
- iamt/composes/8888Others/douyin_tiktok_download_api/config.yaml +32 -0
- iamt/composes/8888Others/douyin_tiktok_download_api/docker-compose.yml +17 -0
- iamt/composes/8888Others/kasmweb_chrome/.rdm.md +19 -0
- iamt/composes/8888Others/kasmweb_chrome/docker-compose.yml +17 -0
- iamt/composes/8888Others/meilisearch/.env +10 -0
- iamt/composes/8888Others/meilisearch/config/config.toml +132 -0
- iamt/composes/8888Others/meilisearch/docker-compose.yml +34 -0
- iamt/composes/8888Others/memcached/.env +8 -0
- iamt/composes/8888Others/memcached/docker-compose.yml +20 -0
- iamt/composes/8888Others/minio/docker-compose.yml +20 -0
- iamt/composes/8888Others/minio/minio +9 -0
- iamt/composes/8888Others/neko/README.md +11 -0
- iamt/composes/8888Others/neko/docker-compose.yml +16 -0
- iamt/composes/8888Others/ocrmypdf/README.md +14 -0
- iamt/composes/8888Others/outline/docker-compose.yml +76 -0
- iamt/composes/8888Others/outline/docker.env +164 -0
- iamt/composes/8888Others/outline/redis.conf +0 -0
- iamt/composes/8888Others/pandas_ai/.rdm.md +5 -0
- iamt/composes/8888Others/pandas_ai/docker-compose.yml +49 -0
- iamt/composes/8888Others/rancher/.rdm.md +4 -0
- iamt/composes/8888Others/rustdesk/.env +10 -0
- iamt/composes/8888Others/rustdesk/docker-compose.yml +29 -0
- iamt/composes/8888Others/ttrss/docker-compose.yml +74 -0
- iamt/composes/8888Others/vultrCLI/.rdm.md +9 -0
- iamt/composes/8888Others/wewerss/docker-compose.yml +44 -0
- iamt/dcd/dcd.py +337 -0
- iamt/decorators/singleton.py +224 -0
- iamt/modules/_utils/_utils.py +1 -0
- iamt/modules/_utils/arch.py +22 -0
- iamt/modules/_utils/cleanup_network_config.py +68 -0
- iamt/modules/_utils/github.py +123 -0
- iamt/modules/_utils/setup_apt_sources.py +94 -0
- iamt/modules/_utils/steps.py +26 -0
- iamt/modules/claudecode/claudecode.py +0 -0
- iamt/modules/dcdtask/dcdtask.py +164 -0
- iamt/modules/docker/docker.py +370 -0
- iamt/modules/docker/roles/role.py +54 -0
- iamt/modules/docker/templates/daemon/daemon_multi_mirrors.json +21 -0
- iamt/modules/docker/templates/gpgkey/debian_gpgkey +62 -0
- iamt/modules/docker/templates/gpgkey/ubuntu_gpgkey +62 -0
- iamt/modules/github/ghcli.py +197 -0
- iamt/modules/nvm/nvm.py +183 -0
- iamt/modules/nvm/roles/role.py +24 -0
- iamt/modules/runlinetask/runlinetask.py +22 -0
- iamt/modules/ubuntud/antigravity.py +191 -0
- iamt/modules/ubuntud/chrome.py +111 -0
- iamt/modules/ubuntud/fcitx5.py +0 -0
- iamt/modules/ubuntud/ibus.py +53 -0
- iamt/modules/ubuntud/kiro.py +41 -0
- iamt/modules/ubuntud/rime_ice.py +173 -0
- iamt/modules/ubuntud/roles/role.py +28 -0
- iamt/modules/ubuntud/templates/ibus/ibus_rime.custom.yaml +3 -0
- iamt/modules/ubuntud/v2ray-core.py +238 -0
- iamt/modules/ubuntud/v2rayN.py +127 -0
- iamt/modules/ubuntud/vscode.py +162 -0
- iamt/modules/uv/roles/role.py +56 -0
- iamt/modules/uv/templates/uv.toml +5 -0
- iamt/modules/uv/uv.py +315 -0
- iamt/modules/vagrant/templates/Vagrantfile +25 -0
- iamt/modules/vagrant/vagrant.py +91 -0
- iamt/modules/vboxinit/base_box_init.py +142 -0
- iamt/modules/vboxinit/roles/role.py +15 -0
- iamt/role/role.py +134 -0
- iamt/run_file/run_file.py +121 -0
- iamt/run_line/commands.py +70 -0
- iamt/run_line/run_line.py +78 -0
- iamt/task/task.py +108 -0
- iamt/utils/__init__.py +6 -0
- iamt/utils/config_saver.py +90 -0
- iamt/utils/task_tracker.py +136 -0
- iamt-1.1.27.dist-info/METADATA +19 -0
- iamt-1.1.27.dist-info/RECORD +482 -0
- iamt-1.1.27.dist-info/WHEEL +4 -0
- iamt-1.1.27.dist-info/entry_points.txt +5 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
import questionary
|
|
4
|
+
from fabric import task
|
|
5
|
+
from jinja2 import Template
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# 模板目录路径
|
|
9
|
+
TEMPLATES_DIR = Path(__file__).parent / "templates"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@task
|
|
13
|
+
def gen_vagrantfile_interactive(_) -> None:
|
|
14
|
+
"""通过交互式问答生成 Vagrantfile"""
|
|
15
|
+
# region 交互式获取参数
|
|
16
|
+
hostname = questionary.text("虚拟机主机名:", default="u13").ask()
|
|
17
|
+
hostip = questionary.text("私有网络 IP:", default="10.10.10.13").ask()
|
|
18
|
+
hostcpu = questionary.text("CPU 核心数:", default="8").ask()
|
|
19
|
+
hostmem = questionary.text("内存大小 (MB):", default="8192").ask()
|
|
20
|
+
hostimg = questionary.text("Vagrant box 镜像:", default="vb/ubuntu_desktop2404").ask()
|
|
21
|
+
hostport = questionary.text("SSH 端口转发:", default="10013").ask()
|
|
22
|
+
output = questionary.text("输出文件名:", default="Vagrantfile").ask()
|
|
23
|
+
create_dir = questionary.confirm("是否创建 hostname 文件夹:", default=False).ask()
|
|
24
|
+
# endregion
|
|
25
|
+
|
|
26
|
+
# region 调用 gen_vagrantfile 生成文件
|
|
27
|
+
gen_vagrantfile(
|
|
28
|
+
_,
|
|
29
|
+
hostname=hostname,
|
|
30
|
+
hostip=hostip,
|
|
31
|
+
hostcpu=hostcpu,
|
|
32
|
+
hostmem=hostmem,
|
|
33
|
+
hostimg=hostimg,
|
|
34
|
+
hostport=hostport,
|
|
35
|
+
output=output,
|
|
36
|
+
create_dir=create_dir,
|
|
37
|
+
)
|
|
38
|
+
# endregion
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@task
|
|
42
|
+
def gen_vagrantfile(
|
|
43
|
+
_,
|
|
44
|
+
hostname: str = "vagrant-vm",
|
|
45
|
+
hostip: str = "10.10.10.100",
|
|
46
|
+
hostcpu: str = "2",
|
|
47
|
+
hostmem: str = "2048",
|
|
48
|
+
hostimg: str = "ubuntu/jammy64",
|
|
49
|
+
hostport: str = "2222",
|
|
50
|
+
output: str = "Vagrantfile",
|
|
51
|
+
create_dir: bool = False,
|
|
52
|
+
) -> None:
|
|
53
|
+
"""根据模板在当前目录下生成 Vagrantfile
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
_: Fabric Context 对象 (本地任务不使用)
|
|
57
|
+
hostname: 虚拟机主机名
|
|
58
|
+
hostip: 虚拟机私有网络 IP
|
|
59
|
+
hostcpu: CPU 核心数
|
|
60
|
+
hostmem: 内存大小 (MB)
|
|
61
|
+
hostimg: Vagrant box 镜像名称
|
|
62
|
+
hostport: SSH 端口转发的主机端口
|
|
63
|
+
output: 输出文件名
|
|
64
|
+
create_dir: 是否在当前目录下创建以 hostname 命名的文件夹
|
|
65
|
+
"""
|
|
66
|
+
# region 读取并渲染模板
|
|
67
|
+
template_path = TEMPLATES_DIR / "Vagrantfile"
|
|
68
|
+
template_content = template_path.read_text(encoding="utf-8")
|
|
69
|
+
template = Template(template_content)
|
|
70
|
+
|
|
71
|
+
rendered = template.render(
|
|
72
|
+
hostname=hostname,
|
|
73
|
+
hostip=hostip,
|
|
74
|
+
hostcpu=hostcpu,
|
|
75
|
+
hostmem=hostmem,
|
|
76
|
+
hostimg=hostimg,
|
|
77
|
+
hostport=hostport,
|
|
78
|
+
)
|
|
79
|
+
# endregion
|
|
80
|
+
|
|
81
|
+
# region 确定输出路径并写入文件
|
|
82
|
+
if create_dir:
|
|
83
|
+
host_dir = Path(hostname)
|
|
84
|
+
host_dir.mkdir(exist_ok=True)
|
|
85
|
+
output_path = host_dir / output
|
|
86
|
+
else:
|
|
87
|
+
output_path = Path(output)
|
|
88
|
+
|
|
89
|
+
output_path.write_text(rendered, encoding="utf-8", newline="\r\n")
|
|
90
|
+
print(f"[OK] Vagrantfile 已生成: {output_path.absolute()}")
|
|
91
|
+
# endregion
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import questionary
|
|
2
|
+
from fabric import Connection, task
|
|
3
|
+
from invoke import Config
|
|
4
|
+
from .._utils.setup_apt_sources import setup_apt_sources
|
|
5
|
+
from .._utils.setup_apt_sources import select_apt_sources
|
|
6
|
+
from .._utils.cleanup_network_config import cleanup_network_config
|
|
7
|
+
|
|
8
|
+
# 设置远程命令环境变量,使用英文输出避免中文乱码
|
|
9
|
+
ENV_LANG_C = {"LANG": "C", "LC_ALL": "C"}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# region Debian 初始化任务
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@task
|
|
17
|
+
def apt_update_and_install_base_package(conn: Connection) -> None:
|
|
18
|
+
"""apt update 和 安装依赖包 """
|
|
19
|
+
conn.sudo("apt-get update -y", env=ENV_LANG_C)
|
|
20
|
+
# conn.sudo("apt-get upgrade -y", env=ENV_LANG_C)
|
|
21
|
+
conn.sudo("apt-get install -y vim sudo curl wget sshpass", env=ENV_LANG_C)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@task
|
|
25
|
+
def setup_vagrant_user(conn: Connection) -> None:
|
|
26
|
+
"""确保 vagrant 用户存在并配置SSH"""
|
|
27
|
+
|
|
28
|
+
# 创建用户
|
|
29
|
+
conn.sudo("id vagrant || useradd -m -s /bin/bash vagrant", warn=True, env=ENV_LANG_C)
|
|
30
|
+
|
|
31
|
+
# 设置密码
|
|
32
|
+
conn.run("echo 'vagrant:vagrant' > /tmp/vagrant_passwd")
|
|
33
|
+
conn.sudo("chpasswd < /tmp/vagrant_passwd")
|
|
34
|
+
conn.run("rm -f /tmp/vagrant_passwd")
|
|
35
|
+
|
|
36
|
+
# 无密码 sudo
|
|
37
|
+
conn.run("echo 'vagrant ALL=(ALL) NOPASSWD:ALL' > /tmp/no-password-sudo")
|
|
38
|
+
conn.sudo("mv /tmp/no-password-sudo /etc/sudoers.d/no-password-sudo")
|
|
39
|
+
conn.sudo("chmod 440 /etc/sudoers.d/no-password-sudo")
|
|
40
|
+
|
|
41
|
+
# 配置 .ssh 目录
|
|
42
|
+
conn.sudo("mkdir -p /home/vagrant/.ssh")
|
|
43
|
+
conn.sudo("chmod 700 /home/vagrant/.ssh")
|
|
44
|
+
conn.sudo("chown vagrant:vagrant /home/vagrant/.ssh")
|
|
45
|
+
|
|
46
|
+
# 添加 vagrant insecure key
|
|
47
|
+
insecure_keys = """ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key
|
|
48
|
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN1YdxBpNlzxDqfJyw/QKow1F+wvG9hXGoqiysfJOn5Y vagrant insecure public key"""
|
|
49
|
+
conn.run(f"echo '{insecure_keys}' > /tmp/vagrant_authorized_keys")
|
|
50
|
+
conn.sudo("mv /tmp/vagrant_authorized_keys /home/vagrant/.ssh/authorized_keys")
|
|
51
|
+
conn.sudo("chmod 600 /home/vagrant/.ssh/authorized_keys")
|
|
52
|
+
conn.sudo("chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@task
|
|
56
|
+
def install_kernel_dev_packages(conn: Connection) -> None:
|
|
57
|
+
"""安装内核开发相关包 (用于 VirtualBox Guest Additions)"""
|
|
58
|
+
# 获取当前内核版本
|
|
59
|
+
result = conn.run("uname -r", hide=True)
|
|
60
|
+
kernel_version = result.stdout.strip()
|
|
61
|
+
|
|
62
|
+
conn.sudo("apt-get install -y build-essential dkms", env=ENV_LANG_C)
|
|
63
|
+
conn.sudo(f"apt-get install -y linux-headers-{kernel_version}", warn=True, env=ENV_LANG_C)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def download_vbox_guest_additions(version: str, dest_dir: str = ".") -> str:
|
|
67
|
+
"""下载 VirtualBox Guest Additions ISO 到本地主机
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
version: VirtualBox 版本号 (如 "7.0.14")
|
|
71
|
+
dest_dir: 下载目标目录,默认为当前目录
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
下载后的 ISO 文件路径
|
|
75
|
+
"""
|
|
76
|
+
import urllib.request
|
|
77
|
+
import os
|
|
78
|
+
|
|
79
|
+
print(f"\n[任务] 下载 VirtualBox Guest Additions {version}")
|
|
80
|
+
|
|
81
|
+
iso_filename = f"VBoxGuestAdditions_{version}.iso"
|
|
82
|
+
iso_path = os.path.join(dest_dir, iso_filename)
|
|
83
|
+
download_url = f"https://download.virtualbox.org/virtualbox/{version}/{iso_filename}"
|
|
84
|
+
|
|
85
|
+
# 检查文件是否已存在
|
|
86
|
+
if os.path.exists(iso_path):
|
|
87
|
+
print(f" ISO 文件已存在: {iso_path}")
|
|
88
|
+
return iso_path
|
|
89
|
+
|
|
90
|
+
# 下载 ISO 并显示进度
|
|
91
|
+
print(f" 正在下载: {download_url}")
|
|
92
|
+
|
|
93
|
+
def progress_hook(block_num: int, block_size: int, total_size: int) -> None:
|
|
94
|
+
if total_size > 0:
|
|
95
|
+
percent = min(100, block_num * block_size * 100 // total_size)
|
|
96
|
+
print(f"\r 下载进度: {percent}%", end="", flush=True)
|
|
97
|
+
|
|
98
|
+
urllib.request.urlretrieve(download_url, iso_path, progress_hook)
|
|
99
|
+
print(f"\n 下载完成: {iso_path}")
|
|
100
|
+
|
|
101
|
+
return iso_path
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@task
|
|
105
|
+
def install_vbox_guest_additions(conn: Connection, version: str = "7.2.4") -> None:
|
|
106
|
+
"""下载 上传 挂载并安装 VirtualBox Guest Additions
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
conn: Fabric Connection 对象
|
|
110
|
+
version: VirtualBox Guest Additions 版本号,默认为 "7.2.4"
|
|
111
|
+
"""
|
|
112
|
+
iso_path=download_vbox_guest_additions(version=version)
|
|
113
|
+
# 上传 ISO
|
|
114
|
+
conn.put(iso_path, "/tmp/VBoxGuestAdditions.iso")
|
|
115
|
+
|
|
116
|
+
# 挂载
|
|
117
|
+
conn.sudo("mkdir -p /media/VBoxGuestAdditions")
|
|
118
|
+
conn.sudo("mount -o loop,ro /tmp/VBoxGuestAdditions.iso /media/VBoxGuestAdditions", warn=True)
|
|
119
|
+
|
|
120
|
+
# 执行安装
|
|
121
|
+
try:
|
|
122
|
+
conn.sudo("sh /media/VBoxGuestAdditions/VBoxLinuxAdditions.run --nox11", warn=True)
|
|
123
|
+
finally:
|
|
124
|
+
# 卸载
|
|
125
|
+
conn.sudo("umount /media/VBoxGuestAdditions", warn=True)
|
|
126
|
+
|
|
127
|
+
# 验证安装
|
|
128
|
+
result = conn.sudo("/sbin/rcvboxadd status", warn=True)
|
|
129
|
+
print(f" Guest Additions 状态: {result.stdout.strip()}")
|
|
130
|
+
|
|
131
|
+
@task
|
|
132
|
+
def testssh(conn: Connection):
|
|
133
|
+
"""SSH 连通测试"""
|
|
134
|
+
result = conn.run("echo 'SSH connection OK'", hide=True)
|
|
135
|
+
print(f"✓ {result.stdout.strip()}")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# endregion
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from fabric import Connection
|
|
2
|
+
|
|
3
|
+
from ..._utils.setup_apt_sources import setup_apt_sources
|
|
4
|
+
from ..._utils.cleanup_network_config import cleanup_network_config
|
|
5
|
+
from ..base_box_init import *
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def create_vagrant_base_box(c:Connection):
|
|
10
|
+
setup_apt_sources(c)
|
|
11
|
+
apt_update_and_install_base_package(c)
|
|
12
|
+
setup_vagrant_user(c)
|
|
13
|
+
install_kernel_dev_packages(c)
|
|
14
|
+
install_vbox_guest_additions(c)
|
|
15
|
+
cleanup_network_config(c)
|
iamt/role/role.py
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
import importlib
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Role:
|
|
7
|
+
|
|
8
|
+
def _scan_roles(self) -> dict[str, dict]:
|
|
9
|
+
"""扫描 modules 目录下所有 roles 文件夹中定义的函数"""
|
|
10
|
+
roles = {}
|
|
11
|
+
modules_path = Path(__file__).parent.parent / "modules"
|
|
12
|
+
|
|
13
|
+
# region 遍历 modules 目录下的非下划线开头的文件夹
|
|
14
|
+
for module_dir in modules_path.iterdir():
|
|
15
|
+
if not module_dir.is_dir() or module_dir.name.startswith("_"):
|
|
16
|
+
continue
|
|
17
|
+
|
|
18
|
+
roles_dir = module_dir / "roles"
|
|
19
|
+
if not roles_dir.exists() or not roles_dir.is_dir():
|
|
20
|
+
continue
|
|
21
|
+
|
|
22
|
+
# region 扫描 roles 目录下的所有 Python 文件
|
|
23
|
+
for py_file in roles_dir.glob("*.py"):
|
|
24
|
+
if py_file.name.startswith("_"):
|
|
25
|
+
continue
|
|
26
|
+
|
|
27
|
+
# 构建模块导入路径
|
|
28
|
+
relative_path = py_file.relative_to(Path(__file__).parent.parent)
|
|
29
|
+
module_name = ".".join(relative_path.with_suffix("").parts)
|
|
30
|
+
|
|
31
|
+
try:
|
|
32
|
+
module = importlib.import_module(f".{module_name}", package="iamt")
|
|
33
|
+
# 查找在该模块中定义的函数(排除导入的函数)
|
|
34
|
+
for name, obj in vars(module).items():
|
|
35
|
+
if inspect.isfunction(obj) and obj.__module__ == module.__name__:
|
|
36
|
+
roles[name] = {
|
|
37
|
+
"func": obj,
|
|
38
|
+
"module": module_dir.name,
|
|
39
|
+
"source": py_file.name
|
|
40
|
+
}
|
|
41
|
+
except ImportError as e:
|
|
42
|
+
print(f"警告: 无法导入模块 {module_name}: {e}")
|
|
43
|
+
# endregion
|
|
44
|
+
# endregion
|
|
45
|
+
|
|
46
|
+
return roles
|
|
47
|
+
|
|
48
|
+
def ls(self):
|
|
49
|
+
"""列出所有可用的 roles"""
|
|
50
|
+
print("可用 roles:")
|
|
51
|
+
for name, info in (self._scan_roles()).items():
|
|
52
|
+
print(f" {name} @ {info['module']}/roles/{info['source']}")
|
|
53
|
+
|
|
54
|
+
def run(self):
|
|
55
|
+
"""交互式选择并运行 role"""
|
|
56
|
+
from prompt_toolkit import prompt
|
|
57
|
+
from prompt_toolkit.completion import FuzzyWordCompleter
|
|
58
|
+
from rich.console import Console
|
|
59
|
+
from ..client_config.client_config import ClientConfig
|
|
60
|
+
|
|
61
|
+
console = Console()
|
|
62
|
+
|
|
63
|
+
if not self._scan_roles():
|
|
64
|
+
print("没有可用的 roles")
|
|
65
|
+
return
|
|
66
|
+
|
|
67
|
+
# region 构建模块名.函数名格式的选项列表
|
|
68
|
+
role_options = {
|
|
69
|
+
f"{info['module']}.{name}": name
|
|
70
|
+
for name, info in (self._scan_roles()).items()
|
|
71
|
+
}
|
|
72
|
+
completer = FuzzyWordCompleter(list(role_options.keys()))
|
|
73
|
+
# endregion
|
|
74
|
+
|
|
75
|
+
# region 模糊搜索选择
|
|
76
|
+
try:
|
|
77
|
+
selected_key = prompt(
|
|
78
|
+
"请选择要运行的 role (Tab补全, 支持模糊搜索): ",
|
|
79
|
+
completer=completer
|
|
80
|
+
).strip()
|
|
81
|
+
except (KeyboardInterrupt, EOFError):
|
|
82
|
+
print("\n已取消选择")
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
if not selected_key or selected_key not in role_options:
|
|
86
|
+
print(f"无效的选择: {selected_key}")
|
|
87
|
+
return
|
|
88
|
+
# endregion
|
|
89
|
+
|
|
90
|
+
# region 执行选中的 role
|
|
91
|
+
selected = role_options[selected_key]
|
|
92
|
+
role_info = (self._scan_roles())[selected]
|
|
93
|
+
role_func = role_info["func"]
|
|
94
|
+
config = ClientConfig()
|
|
95
|
+
conn = config.connect()
|
|
96
|
+
if conn is None:
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
# region 询问是否保存配置
|
|
100
|
+
import questionary
|
|
101
|
+
from ..utils.config_saver import save_task_config
|
|
102
|
+
from ..utils.task_tracker import TaskTracker
|
|
103
|
+
|
|
104
|
+
save_config = questionary.confirm(
|
|
105
|
+
"是否在执行后保存运行配置?",
|
|
106
|
+
default=False,
|
|
107
|
+
).ask()
|
|
108
|
+
# endregion
|
|
109
|
+
|
|
110
|
+
# region 使用 TaskTracker 追踪 task 调用
|
|
111
|
+
tracker = TaskTracker()
|
|
112
|
+
if save_config:
|
|
113
|
+
tracker.patch_all_modules()
|
|
114
|
+
|
|
115
|
+
try:
|
|
116
|
+
role_func(conn)
|
|
117
|
+
except Exception as e:
|
|
118
|
+
console.print(f"[red]Role '{selected}' 执行失败: {e}[/red]")
|
|
119
|
+
tracker.unpatch_all()
|
|
120
|
+
return
|
|
121
|
+
finally:
|
|
122
|
+
tracker.unpatch_all()
|
|
123
|
+
# endregion
|
|
124
|
+
|
|
125
|
+
# region 保存配置文件
|
|
126
|
+
if save_config and tracker.calls:
|
|
127
|
+
save_task_config(
|
|
128
|
+
hostname=config._current_host or "",
|
|
129
|
+
tasks=tracker.calls,
|
|
130
|
+
config_name=selected,
|
|
131
|
+
suffix=".role.yaml",
|
|
132
|
+
)
|
|
133
|
+
# endregion
|
|
134
|
+
# endregion
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
import yaml
|
|
4
|
+
import questionary
|
|
5
|
+
from rich.console import Console
|
|
6
|
+
|
|
7
|
+
from ..client_config.client_config import ClientConfig
|
|
8
|
+
from ..task.task import Task
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class RunFile:
|
|
12
|
+
"""从配置文件执行 task 函数"""
|
|
13
|
+
|
|
14
|
+
def x(self) -> None:
|
|
15
|
+
"""从当前目录的配置文件执行 task 函数"""
|
|
16
|
+
|
|
17
|
+
console = Console()
|
|
18
|
+
|
|
19
|
+
# region 扫描配置文件
|
|
20
|
+
config_suffixes = [".dcd.yaml", ".role.yaml"]
|
|
21
|
+
task_config_files: list[Path] = []
|
|
22
|
+
for suffix in config_suffixes:
|
|
23
|
+
task_config_files.extend(Path.cwd().glob(f"*{suffix}"))
|
|
24
|
+
|
|
25
|
+
if not task_config_files:
|
|
26
|
+
console.print(f"[yellow]当前目录未找到配置文件 ({', '.join(config_suffixes)})[/yellow]")
|
|
27
|
+
return
|
|
28
|
+
# endregion
|
|
29
|
+
|
|
30
|
+
# region 选择配置文件
|
|
31
|
+
if len(task_config_files) == 1:
|
|
32
|
+
selected_file = task_config_files[0]
|
|
33
|
+
else:
|
|
34
|
+
file_choices = [f.name for f in task_config_files]
|
|
35
|
+
selected_name = questionary.select("请选择配置文件:", choices=file_choices).ask()
|
|
36
|
+
if selected_name is None:
|
|
37
|
+
console.print("[yellow]已取消[/yellow]")
|
|
38
|
+
return
|
|
39
|
+
selected_file = Path.cwd() / selected_name
|
|
40
|
+
# endregion
|
|
41
|
+
|
|
42
|
+
# region 读取并验证配置
|
|
43
|
+
try:
|
|
44
|
+
config_data = yaml.safe_load(selected_file.read_text(encoding="utf-8"))
|
|
45
|
+
except Exception as e:
|
|
46
|
+
console.print(f"[red]读取配置文件失败: {e}[/red]")
|
|
47
|
+
return
|
|
48
|
+
|
|
49
|
+
hostname = config_data.get("hostname", "")
|
|
50
|
+
tasks = config_data.get("tasks", [])
|
|
51
|
+
|
|
52
|
+
if not hostname:
|
|
53
|
+
console.print("[red]配置文件缺少 hostname[/red]")
|
|
54
|
+
return
|
|
55
|
+
if not tasks:
|
|
56
|
+
console.print("[red]配置文件缺少 tasks[/red]")
|
|
57
|
+
return
|
|
58
|
+
# endregion
|
|
59
|
+
|
|
60
|
+
# region 验证 hostname 并创建连接
|
|
61
|
+
client_config = ClientConfig()
|
|
62
|
+
if not client_config.config_file.exists():
|
|
63
|
+
console.print("[red]未找到 iamt.yaml 配置文件[/red]")
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
iamt_config = yaml.safe_load(client_config.config_file.read_text(encoding="utf-8"))
|
|
67
|
+
if hostname not in iamt_config.get("hosts", {}):
|
|
68
|
+
console.print(f"[red]iamt.yaml 中未找到主机: {hostname}[/red]")
|
|
69
|
+
return
|
|
70
|
+
|
|
71
|
+
conn = client_config.connect(hostname)
|
|
72
|
+
if conn is None:
|
|
73
|
+
console.print("[red]无法连接到服务器[/red]")
|
|
74
|
+
return
|
|
75
|
+
# endregion
|
|
76
|
+
|
|
77
|
+
# region 显示配置信息并确认
|
|
78
|
+
console.print(f"[cyan]配置文件: {selected_file.name}[/cyan]")
|
|
79
|
+
console.print(f"[cyan]目标主机: {hostname}[/cyan]")
|
|
80
|
+
console.print("[cyan]待执行任务:[/cyan]")
|
|
81
|
+
for t in tasks:
|
|
82
|
+
console.print(f" - {t['task']}: {t['args']}")
|
|
83
|
+
|
|
84
|
+
if not questionary.confirm("确认执行?", default=True).ask():
|
|
85
|
+
console.print("[yellow]已取消[/yellow]")
|
|
86
|
+
return
|
|
87
|
+
# endregion
|
|
88
|
+
|
|
89
|
+
# region 执行 tasks
|
|
90
|
+
task_scanner = Task()
|
|
91
|
+
scanned_tasks = task_scanner._scan_tasks()
|
|
92
|
+
|
|
93
|
+
for task_call in tasks:
|
|
94
|
+
task_name = task_call["task"]
|
|
95
|
+
task_args = task_call.get("args", {}).copy()
|
|
96
|
+
|
|
97
|
+
# 解析 task 名称 (格式: module.function)
|
|
98
|
+
parts = task_name.split(".")
|
|
99
|
+
if len(parts) != 2:
|
|
100
|
+
console.print(f"[red]无效的 task 名称: {task_name}[/red]")
|
|
101
|
+
continue
|
|
102
|
+
|
|
103
|
+
func_name = parts[1]
|
|
104
|
+
|
|
105
|
+
# 从扫描结果中获取 task
|
|
106
|
+
if func_name not in scanned_tasks:
|
|
107
|
+
console.print(f"[red]未找到 task 函数: {task_name}[/red]")
|
|
108
|
+
continue
|
|
109
|
+
|
|
110
|
+
task_obj = scanned_tasks[func_name]["task"]
|
|
111
|
+
|
|
112
|
+
# 执行 task
|
|
113
|
+
console.print(f"[cyan]执行: {task_name}[/cyan]")
|
|
114
|
+
try:
|
|
115
|
+
task_obj(conn, **task_args)
|
|
116
|
+
except Exception as e:
|
|
117
|
+
console.print(f"[red]执行失败: {e}[/red]")
|
|
118
|
+
return
|
|
119
|
+
|
|
120
|
+
console.print("[green]所有任务执行完成[/green]")
|
|
121
|
+
# endregion
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""命令字典定义模块"""
|
|
2
|
+
|
|
3
|
+
python_pkgs = {
|
|
4
|
+
"uv tool install -U dlght": "免代理 gitub下载工具 dlght",
|
|
5
|
+
"uv tool install -U envvm": "环境变量管理工具 envvm",
|
|
6
|
+
"uv tool install -U ali-ops": "aliyun命令行工具ali-ops",
|
|
7
|
+
"uv tool install -U iamt": "自动化运维工具iamt",
|
|
8
|
+
"uv tool install -U cpdts": "脚手架 cpdts",
|
|
9
|
+
"uv tool install -U tschm": "windows定时任务工具",
|
|
10
|
+
"uv tool install -U fastdjt": "django项目脚手架",
|
|
11
|
+
"uv tool install -U ptlearn": "ptlearn",
|
|
12
|
+
"uv tool install -U ptpython": "install ptpython",
|
|
13
|
+
"uv tool install -U ningfastforge":"fastapi 脚手架 forge"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
node_pkgs = {
|
|
17
|
+
"npm install -g opencode-ai@latest": "opencode",
|
|
18
|
+
"npm install -g @iflow-ai/iflow-cli@latest":"iflow",
|
|
19
|
+
"npm install -g @google/gemini-cli@latest":"gemini",
|
|
20
|
+
"npm install -g @openai/codex@latest":"codex"
|
|
21
|
+
}
|
|
22
|
+
# https://github.com/google-gemini/gemini-cli
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
cmds = {
|
|
27
|
+
"bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)": "安装3xui",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
winget_pkgs = {
|
|
32
|
+
"winget install --id Python.Python.3.13 --custom 'PrependPath=1'":"(win)install python",
|
|
33
|
+
"winget install --id=SQLite.SQLite": "(win) install sqlite",
|
|
34
|
+
"winget install --id=Google.Chrome.Beta.EXE": "(win) install Google Chrome Beta",
|
|
35
|
+
"winget install --id=7zip.7zip": "(win) install 7-Zip",
|
|
36
|
+
"winget install --id=Notion.Notion -e": "(win) install Notion",
|
|
37
|
+
"winget install --id=Yuanli.uTools -e": "(win) install uTools",
|
|
38
|
+
"winget install --id=liule.Snipaste -e": "(win) install Snipaste",
|
|
39
|
+
"winget install --id=File-New-Project.EarTrumpet -e": "(win) install EarTrumpet",
|
|
40
|
+
"winget install --id=JiLuo.Xterminal -e": "(win) install Xterminal",
|
|
41
|
+
"winget install --id=Git.Git -e": "(win) install Git",
|
|
42
|
+
"winget install --id=GitHub.GitHubDesktop -e": "(win) install GitHub Desktop",
|
|
43
|
+
"winget install --id=TortoiseGit.TortoiseGit -e": "(win) install TortoiseGit",
|
|
44
|
+
"winget install --id=Microsoft.WindowsTerminal.Preview": "(win) install Windows Terminal Preview",
|
|
45
|
+
"winget install --id=SublimeHQ.SublimeText.4 -e": "(win) install Sublime Text 4",
|
|
46
|
+
"winget install --id=Microsoft.Edit -e": "(win) install Microsoft Edit",
|
|
47
|
+
"winget install --force Microsoft.VisualStudioCode --override '/VERYSILENT /SP- /MERGETASKS=\"addcontextmenufiles,addcontextmenufolders,associatewithfiles,addtopath\"'": "(win) install VS Code with context menu",
|
|
48
|
+
"winget install --id=Amazon.Kiro -e --override '/VERYSILENT /SP- /MERGETASKS=\"addcontextmenufiles,addcontextmenufolders,addtopath\"'": "(win) install Kiro with context menu",
|
|
49
|
+
"winget install --id=kangfenmao.CherryStudio -e": "(win) install Cherry Studio",
|
|
50
|
+
"winget install --id=ByteDance.Doubao -e": "(win) install Doubao",
|
|
51
|
+
"winget install --id=Hashicorp.Vagrant -e": "(win) install Vagrant",
|
|
52
|
+
"winget install --id=Oracle.VirtualBox -e": "(win) install VirtualBox",
|
|
53
|
+
"winget install --id=astral-sh.uv -e": "(win) install uv",
|
|
54
|
+
"winget install --id=CoreyButler.NVMforWindows -e": "(win) install NVM for Windows",
|
|
55
|
+
"winget install --id=Tyrrrz.LightBulb -e": "(win) install LightBulb",
|
|
56
|
+
"winget install --id=JetBrains.DataGrip -e": "(win) install DataGrip (free for non-commercial use)",
|
|
57
|
+
"winget install --id=Microsoft.PowerShell -e": "(win) install PowerShell",
|
|
58
|
+
"winget install --id=Warp.Warp -e": "(win) install Warp",
|
|
59
|
+
"winget install --id=XiaoweiCloud.CalendarTask -e": "(win) install Calendar Task",
|
|
60
|
+
"winget install --id voidtools.Everything -e":"(win) install everything",
|
|
61
|
+
"winget install --id=Anthropic.Claude -e": "(win) install Claude",
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
"winget install --id=XPDNH1FMW7NB40 -e --accept-package-agreements":"(win) install huorong",
|
|
65
|
+
"winget install XPFCKBRNFZQ62G --accept-package-agreements":"(win) install wechat",
|
|
66
|
+
"winget install Tencent.Foxmail":"(win) install foxmail",
|
|
67
|
+
"winget install XP88XQLH1SDG81 --accept-package-agreements":"(win) install wangyimail",
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# key 当中不能存在空格 要不然就是无效选择
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import subprocess
|
|
3
|
+
from prompt_toolkit import prompt
|
|
4
|
+
|
|
5
|
+
from ..client_config.client_config import ClientConfig
|
|
6
|
+
from ..completers.customCompleter import CustomCompleter, CustomValidator
|
|
7
|
+
from ..modules.runlinetask.runlinetask import run_line
|
|
8
|
+
from .commands import python_pkgs, node_pkgs, cmds, winget_pkgs
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class RunLine:
|
|
12
|
+
|
|
13
|
+
def select_and_exec_remote(self):
|
|
14
|
+
"""交互式选择命令并在远程服务器上执行"""
|
|
15
|
+
# region 合并命令字典并创建补全器
|
|
16
|
+
all_commands = {**python_pkgs, **node_pkgs, **cmds}
|
|
17
|
+
completer = CustomCompleter(all_commands)
|
|
18
|
+
validator = CustomValidator(completer, error_msg="无效的命令,请从补全列表中选择")
|
|
19
|
+
# endregion
|
|
20
|
+
|
|
21
|
+
# region 交互式选择命令
|
|
22
|
+
try:
|
|
23
|
+
selected_cmd = prompt(
|
|
24
|
+
"请选择要执行的命令 (Tab补全, 支持模糊搜索): ",
|
|
25
|
+
completer=completer,
|
|
26
|
+
validator=validator
|
|
27
|
+
).strip()
|
|
28
|
+
except (KeyboardInterrupt, EOFError):
|
|
29
|
+
print("\n已取消选择")
|
|
30
|
+
return
|
|
31
|
+
|
|
32
|
+
if not selected_cmd or selected_cmd not in all_commands:
|
|
33
|
+
print(f"无效的选择: {selected_cmd}")
|
|
34
|
+
return
|
|
35
|
+
# endregion
|
|
36
|
+
|
|
37
|
+
# region 连接服务器并执行命令
|
|
38
|
+
config = ClientConfig()
|
|
39
|
+
conn = config.connect()
|
|
40
|
+
if conn is None:
|
|
41
|
+
return
|
|
42
|
+
print(f"\n执行命令: {selected_cmd}\n")
|
|
43
|
+
run_line(conn, selected_cmd)
|
|
44
|
+
# endregion
|
|
45
|
+
|
|
46
|
+
def select_and_exec_local(self):
|
|
47
|
+
"""交互式选择命令并在当前 shell 中执行"""
|
|
48
|
+
# region 合并命令字典并创建补全器
|
|
49
|
+
all_commands = {**python_pkgs, **node_pkgs, **cmds, **winget_pkgs}
|
|
50
|
+
completer = CustomCompleter(all_commands)
|
|
51
|
+
# validator = CustomValidator(completer, error_msg="无效的命令,请从补全列表中选择")
|
|
52
|
+
# endregion
|
|
53
|
+
|
|
54
|
+
# region 交互式选择命令
|
|
55
|
+
try:
|
|
56
|
+
selected_cmd = prompt(
|
|
57
|
+
"请选择要执行的命令 (Tab补全, 支持模糊搜索): ",
|
|
58
|
+
completer=completer,
|
|
59
|
+
# validator=validator
|
|
60
|
+
).strip()
|
|
61
|
+
except (KeyboardInterrupt, EOFError):
|
|
62
|
+
sys.stderr.write("\n已取消选择\n")
|
|
63
|
+
return
|
|
64
|
+
|
|
65
|
+
if not selected_cmd or selected_cmd not in all_commands:
|
|
66
|
+
sys.stderr.write(f"无效的选择: {selected_cmd}\n")
|
|
67
|
+
return
|
|
68
|
+
# endregion
|
|
69
|
+
|
|
70
|
+
# region 在当前 shell 中执行命令
|
|
71
|
+
sys.stderr.write(f"\n执行命令: {selected_cmd}\n\n")
|
|
72
|
+
try:
|
|
73
|
+
subprocess.run(selected_cmd, shell=True, check=True)
|
|
74
|
+
except subprocess.CalledProcessError as e:
|
|
75
|
+
sys.stderr.write(f"\n命令执行失败,退出码: {e.returncode}\n")
|
|
76
|
+
except KeyboardInterrupt:
|
|
77
|
+
sys.stderr.write("\n命令执行被中断\n")
|
|
78
|
+
# endregion
|