summaryrefslogtreecommitdiff
path: root/src/plugin/example.rs
blob: d1f6b46bb97ac004946966b0002900427ed452d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use crate::event::event::Event;
use crate::event::manager::EventHandle;
use crate::event::manager::EventManager;
use crate::event::manager::EventQueue;
use crate::packet::packet::Packet;
use crate::session::session::Session;
use std::cell::RefCell;
use std::rc::Rc;

#[derive(Clone)]
pub struct ExamplePulgin {
    plugin_name: &'static str,
    plugin_ctx: Rc<RefCell<String>>,
}

impl ExamplePulgin {
    pub fn new(plugin_name: &'static str) -> ExamplePulgin {
        ExamplePulgin {
            plugin_name,
            plugin_ctx: Rc::new(RefCell::new(String::new())),
        }
    }
}

impl EventHandle for ExamplePulgin {
    fn init(&mut self, event_mgr: &mut EventManager) {
        event_mgr.register(Event::TcpOpeningEvent, Box::new(self.clone()));
        event_mgr.register(Event::TcpActiveEvent, Box::new(self.clone()));
        event_mgr.register(Event::TcpExpireEvent, Box::new(self.clone()));
        event_mgr.register(Event::TcpClosedEvent, Box::new(self.clone()));
        event_mgr.register(Event::HttpRequestEvent, Box::new(self.clone()));
    }

    fn handle(
        &mut self,
        event: Event,
        queue: &mut EventQueue,
        packet: Option<&Packet>,
        session: Option<Rc<RefCell<Session>>>,
    ) {
        self.plugin_ctx.borrow_mut().push_str("1");

        if session.is_none() {
            return;
        }

        if packet.is_none() {
            println!("{} handle Packet: None", self.plugin_name);
        }

        let session = session.unwrap();
        session.borrow_mut().inc_session_c2s_metrics(0, 0, 1, 1);
        match event {
            Event::TcpOpeningEvent => {
                println!("{} handle TcpOpeningEvent: {:?}", self.plugin_name, session);
                let (src_port, dst_port) = packet.unwrap().get_inner_most_port().unwrap();
                if src_port == 80 || dst_port == 80 {
                    println!("{} add HttpRequestEvent", self.plugin_name);
                    queue.add(Event::HttpRequestEvent, Some(session));
                }
            }
            Event::TcpActiveEvent => {
                println!("{} handle TcpActiveEvent: {:?}", self.plugin_name, session);
            }
            Event::TcpExpireEvent => {
                println!("{} handle TcpExpireEvent: {:?}", self.plugin_name, session);
            }
            Event::TcpClosedEvent => {
                println!("{} handle TcpClosedEvent: {:?}", self.plugin_name, session);
            }
            Event::HttpRequestEvent => {
                println!(
                    "{} handle HttpRequestEvent: {:?}",
                    self.plugin_name, session
                );
            }
            _ => {
                println!("{} handle UnknownEvent: {:?}", self.plugin_name, session);
            }
        }
    }
}