omnyssh_core/ssh/services/
redis.rs1use async_trait::async_trait;
6
7use super::ServiceProvider;
8use crate::event::ServiceKind;
9use crate::ssh::probe::ProbeOutput;
10
11pub struct RedisProvider;
13
14#[async_trait]
15impl ServiceProvider for RedisProvider {
16 fn kind(&self) -> ServiceKind {
17 ServiceKind::Redis
18 }
19
20 fn detect(&self, probe_output: &ProbeOutput) -> bool {
21 if let Some(listen) = probe_output.get_section("LISTEN") {
23 if listen.contains(":6379") || listen.contains("6379") {
24 return true;
25 }
26 }
27 if let Some(processes) = probe_output.get_section("PROCESS") {
28 if processes.contains("redis-server") || processes.contains("redis") {
29 return true;
30 }
31 }
32 false
33 }
34}
35
36#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn test_redis_detect_from_port() {
46 let probe = "===OMNYSSH:LISTEN===\n0.0.0.0:6379\tLISTEN\n";
47 let parsed = ProbeOutput::parse(probe).expect("should parse");
48 assert!(RedisProvider.detect(&parsed));
49 }
50
51 #[test]
52 fn test_redis_detect_from_process() {
53 let probe = "===OMNYSSH:PROCESS===\nredis 1234 redis-server\n";
54 let parsed = ProbeOutput::parse(probe).expect("should parse");
55 assert!(RedisProvider.detect(&parsed));
56 }
57
58 #[test]
59 fn test_redis_not_detected() {
60 let probe = "===OMNYSSH:SERVICES===\nsshd.service\n";
61 let parsed = ProbeOutput::parse(probe).expect("should parse");
62 assert!(!RedisProvider.detect(&parsed));
63 }
64}