omnyssh_core/ssh/services/
mod.rs1use async_trait::async_trait;
8
9use crate::event::{ServiceKind, ServiceMetric};
10use crate::ssh::probe::ProbeOutput;
11
12pub mod docker;
14pub mod nginx;
15pub mod nodejs;
16pub mod postgresql;
17pub mod redis;
18
19#[async_trait]
25pub trait ServiceProvider: Send + Sync {
26 fn kind(&self) -> ServiceKind;
28
29 fn detect(&self, probe_output: &ProbeOutput) -> bool;
34
35 fn quick_metrics(&self, _probe_output: &ProbeOutput) -> Vec<ServiceMetric> {
40 Vec::new()
41 }
42}
43
44pub struct ServiceRegistry {
46 providers: Vec<Box<dyn ServiceProvider>>,
47}
48
49impl ServiceRegistry {
50 pub fn new() -> Self {
53 let providers: Vec<Box<dyn ServiceProvider>> = vec![
54 Box::new(docker::DockerProvider),
55 Box::new(nginx::NginxProvider),
56 Box::new(postgresql::PostgreSQLProvider),
57 Box::new(redis::RedisProvider),
58 Box::new(nodejs::NodeJSProvider),
59 ];
60
61 Self { providers }
62 }
63
64 pub fn detect_services(&self, probe_output: &ProbeOutput) -> Vec<ServiceKind> {
68 self.providers
69 .iter()
70 .filter(|p| p.detect(probe_output))
71 .map(|p| p.kind())
72 .collect()
73 }
74
75 pub fn get_provider(&self, kind: &ServiceKind) -> Option<&dyn ServiceProvider> {
77 self.providers
78 .iter()
79 .find(|p| &p.kind() == kind)
80 .map(|boxed| &**boxed)
81 }
82}
83
84impl Default for ServiceRegistry {
85 fn default() -> Self {
86 Self::new()
87 }
88}
89
90pub fn metric_int(name: impl Into<String>, value: i64) -> ServiceMetric {
92 ServiceMetric {
93 name: name.into(),
94 value: crate::event::MetricValue::Integer(value),
95 }
96}
97
98#[cfg(test)]
103mod tests {
104 use super::*;
105
106 #[test]
107 fn test_registry_creation() {
108 let registry = ServiceRegistry::new();
109 assert_eq!(registry.providers.len(), 5); }
111
112 #[test]
113 fn test_registry_get_provider() {
114 let registry = ServiceRegistry::new();
115 assert!(registry.get_provider(&ServiceKind::Docker).is_some());
116 assert!(registry.get_provider(&ServiceKind::Nginx).is_some());
117 assert!(registry.get_provider(&ServiceKind::PostgreSQL).is_some());
118 assert!(registry.get_provider(&ServiceKind::Redis).is_some());
119 assert!(registry.get_provider(&ServiceKind::NodeJS).is_some());
120 }
121}