use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ExecutionMethod {
#[serde(rename = "ssh")]
SSH,
#[serde(rename = "websocket")]
WebSocket,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SshConfig {
pub host: String,
pub port: u16,
pub username: String,
pub password: Option<String>,
pub private_key_path: Option<String>,
pub session_timeout_seconds: Option<u64>,
pub timeout_seconds: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketConfig {
pub url: String,
pub timeout_seconds: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClientConfig {
pub name: String,
pub execution_method: ExecutionMethod,
pub ssh_config: Option<SshConfig>,
pub websocket_config: Option<WebSocketConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExtractRule {
pub name: String,
pub patterns: Vec<String>, pub source: String, #[serde(default = "default_cascade")]
pub cascade: bool, }
fn default_cascade() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Step {
pub title: Option<String>,
pub name: String,
pub script: String,
#[serde(default)]
pub servers: Vec<String>,
pub timeout_seconds: Option<u64>,
pub extract: Option<Vec<ExtractRule>>,
#[serde(default)]
pub variables: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Pipeline {
pub name: String,
pub title: Option<String>,
pub steps: Vec<Step>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RemoteExecutionConfig {
pub variables: Option<HashMap<String, String>>,
pub clients: HashMap<String, ClientConfig>,
pub pipelines: Vec<Pipeline>,
pub default_timeout: Option<u64>,
pub global_scripts:Vec<String>
}
#[derive(Debug, Clone)]
pub enum OutputType {
Stdout,
Stderr,
Log,
StepStarted, StepCompleted, }
#[derive(Debug, Clone)]
pub struct OutputEvent {
pub pipeline_name: String,
pub server_name: String,
pub step: Step, pub output_type: OutputType,
pub content: String,
pub timestamp: std::time::Instant,
pub variables: HashMap<String, String>, }
pub type OutputCallback = std::sync::Arc<dyn Fn(OutputEvent) + Send + Sync>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionResult {
pub success: bool,
pub stdout: String,
pub stderr: String,
pub script: String,
pub exit_code: i32,
pub execution_time_ms: u64,
pub error_message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StepExecutionResult {
pub title: String,
pub step_name: String,
pub server_name: String,
pub execution_result: ExecutionResult,
pub overall_success: bool,
pub execution_time_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineExecutionResult {
pub pipeline_name: String,
pub title: String,
pub step_results: Vec<StepExecutionResult>,
pub overall_success: bool,
pub total_execution_time_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShellExecutionResult {
pub pipeline_results: Vec<PipelineExecutionResult>,
pub success: bool,
pub reason: String,
}