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 title: Option<String>,
60    pub name: String,
61    pub script: String,
62    #[serde(default)]
63    pub servers: Vec<String>,
64    pub timeout_seconds: Option<u64>,
65    pub extract: Option<Vec<ExtractRule>>,
66    #[serde(default)]
67    pub variables: Option<HashMap<String, String>>,
68}
69
70/// 流水线配置
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct Pipeline {
73    pub name: String,
74    pub title: Option<String>,
75    pub steps: Vec<Step>,
76}
77
78/// 全局配置
79#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct RemoteExecutionConfig {
81    pub variables: Option<HashMap<String, String>>,
82    pub clients: HashMap<String, ClientConfig>,
83    pub pipelines: Vec<Pipeline>,
84    pub default_timeout: Option<u64>,
85}
86
87/// 实时输出类型
88#[derive(Debug, Clone)]
89pub enum OutputType {
90    Stdout,
91    Stderr,
92    Log,
93    StepStarted,    // 步骤开始执行
94    StepCompleted,  // 步骤执行完成
95}
96
97/// 实时输出事件
98#[derive(Debug, Clone)]
99pub struct OutputEvent {
100    pub pipeline_name: String,
101    pub server_name: String,
102    pub step: Step, // 替换step_name为完整的Step对象,方便排错
103    pub output_type: OutputType,
104    pub content: String,
105    pub timestamp: std::time::Instant,
106    pub variables: HashMap<String, String>, // 添加当前变量上下文
107}
108
109/// 输出回调函数类型
110pub type OutputCallback = std::sync::Arc<dyn Fn(OutputEvent) + Send + Sync>;
111
112/// 执行结果
113#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct ExecutionResult {
115    pub success: bool,
116    pub stdout: String,
117    pub stderr: String,
118    pub script: String,
119    pub exit_code: i32,
120    pub execution_time_ms: u64,
121    pub error_message: Option<String>,
122}
123
124/// 步骤执行结果
125#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct StepExecutionResult {
127    pub title: String,
128    pub step_name: String,
129    pub server_name: String,
130    pub execution_result: ExecutionResult,
131    pub overall_success: bool,
132    pub execution_time_ms: u64,
133}
134
135/// 流水线执行结果
136#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct PipelineExecutionResult {
138    pub pipeline_name: String,
139    pub title: String,
140    pub step_results: Vec<StepExecutionResult>,
141    pub overall_success: bool,
142    pub total_execution_time_ms: u64,
143}