net_shell/models/
mod.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4/// 执行方式枚举
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
6pub enum ExecutionMethod {
7    #[serde(rename = "ssh")]
8    SSH,
9    #[serde(rename = "websocket")]
10    WebSocket,
11}
12
13/// SSH连接配置
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct SshConfig {
16    pub host: String,
17    pub port: u16,
18    pub username: String,
19    pub password: Option<String>,
20    pub private_key_path: Option<String>,
21    pub session_timeout_seconds: Option<u64>,
22    pub timeout_seconds: Option<u64>,
23}
24
25/// WebSocket配置(预留,后续实现)
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct WebSocketConfig {
28    pub url: String,
29    pub timeout_seconds: Option<u64>,
30}
31
32/// 客户端配置
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct ClientConfig {
35    pub name: String,
36    pub execution_method: ExecutionMethod,
37    pub ssh_config: Option<SshConfig>,
38    pub websocket_config: Option<WebSocketConfig>,
39}
40
41/// 变量提取规则
42#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct ExtractRule {
44    pub name: String,
45    pub patterns: Vec<String>, // 支持多个正则表达式,按顺序尝试直到匹配成功
46    pub source: String, // "stdout", "stderr", "exit_code"
47    #[serde(default = "default_cascade")]
48    pub cascade: bool, // 是否启用级联模式:前一个正则的匹配结果作为下一个正则的输入,默认为true
49}
50
51/// 默认级联模式为true
52fn default_cascade() -> bool {
53    true
54}
55
56/// 步骤配置
57#[derive(Debug, Clone, Serialize, Deserialize, Default)]
58pub struct Step {
59    pub name: String,
60    pub script: String,
61    #[serde(default)]
62    pub servers: Vec<String>,
63    pub timeout_seconds: Option<u64>,
64    pub extract: Option<Vec<ExtractRule>>,
65    #[serde(default)]
66    pub variables: Option<HashMap<String, String>>,
67}
68
69/// 流水线配置
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct Pipeline {
72    pub name: String,
73    pub steps: Vec<Step>,
74}
75
76/// 全局配置
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct RemoteExecutionConfig {
79    pub variables: Option<HashMap<String, String>>,
80    pub clients: HashMap<String, ClientConfig>,
81    pub pipelines: Vec<Pipeline>,
82    pub default_timeout: Option<u64>,
83}
84
85/// 实时输出类型
86#[derive(Debug, Clone)]
87pub enum OutputType {
88    Stdout,
89    Stderr,
90    Log,
91    StepStarted,    // 步骤开始执行
92    StepCompleted,  // 步骤执行完成
93}
94
95/// 实时输出事件
96#[derive(Debug, Clone)]
97pub struct OutputEvent {
98    pub pipeline_name: String,
99    pub server_name: String,
100    pub step: Step, // 替换step_name为完整的Step对象,方便排错
101    pub output_type: OutputType,
102    pub content: String,
103    pub timestamp: std::time::Instant,
104    pub variables: HashMap<String, String>, // 添加当前变量上下文
105}
106
107/// 输出回调函数类型
108pub type OutputCallback = std::sync::Arc<dyn Fn(OutputEvent) + Send + Sync>;
109
110/// 执行结果
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct ExecutionResult {
113    pub success: bool,
114    pub stdout: String,
115    pub stderr: String,
116    pub script: String,
117    pub exit_code: i32,
118    pub execution_time_ms: u64,
119    pub error_message: Option<String>,
120}
121
122/// 步骤执行结果
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct StepExecutionResult {
125    pub step_name: String,
126    pub server_name: String,
127    pub execution_result: ExecutionResult,
128    pub overall_success: bool,
129    pub execution_time_ms: u64,
130}
131
132/// 流水线执行结果
133#[derive(Debug, Clone, Serialize, Deserialize)]
134pub struct PipelineExecutionResult {
135    pub pipeline_name: String,
136    pub step_results: Vec<StepExecutionResult>,
137    pub overall_success: bool,
138    pub total_execution_time_ms: u64,
139}