Skip to main content

omnyssh_core/ssh/services/
nodejs.rs

1//! Node.js service provider.
2//!
3//! Detects Node.js processes and PM2-managed applications from probe output.
4
5use async_trait::async_trait;
6
7use super::ServiceProvider;
8use crate::event::ServiceKind;
9use crate::ssh::probe::ProbeOutput;
10
11/// Node.js service provider.
12pub struct NodeJSProvider;
13
14#[async_trait]
15impl ServiceProvider for NodeJSProvider {
16    fn kind(&self) -> ServiceKind {
17        ServiceKind::NodeJS
18    }
19
20    fn detect(&self, probe_output: &ProbeOutput) -> bool {
21        // Check for node processes in PROCESS section
22        if let Some(processes) = probe_output.get_section("PROCESS") {
23            if processes.contains("node ") || processes.contains("/node") {
24                return true;
25            }
26        }
27        false
28    }
29}
30
31// ---------------------------------------------------------------------------
32// Tests
33// ---------------------------------------------------------------------------
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn test_nodejs_detect_from_process() {
41        let probe = "===OMNYSSH:PROCESS===\nuser 1234 /usr/bin/node server.js\n";
42        let parsed = ProbeOutput::parse(probe).expect("should parse");
43        assert!(NodeJSProvider.detect(&parsed));
44    }
45
46    #[test]
47    fn test_nodejs_not_detected() {
48        let probe = "===OMNYSSH:SERVICES===\nsshd.service\n";
49        let parsed = ProbeOutput::parse(probe).expect("should parse");
50        assert!(!NodeJSProvider.detect(&parsed));
51    }
52}