1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package it.jnrpe.net;
17
18 import io.netty.channel.ChannelFuture;
19 import io.netty.channel.ChannelFutureListener;
20 import io.netty.channel.ChannelHandlerContext;
21 import io.netty.channel.ChannelInboundHandlerAdapter;
22 import io.netty.util.ReferenceCountUtil;
23 import it.jnrpe.ReturnValue;
24 import it.jnrpe.Status;
25 import it.jnrpe.commands.CommandInvoker;
26 import it.jnrpe.events.EventsUtil;
27 import it.jnrpe.events.IJNRPEEventListener;
28 import it.jnrpe.events.LogEvent;
29
30 import java.util.Collection;
31
32 import org.apache.commons.lang.StringUtils;
33
34
35
36
37
38
39 public class JNRPEServerHandler extends ChannelInboundHandlerAdapter {
40
41
42
43
44 private final CommandInvoker commandInvoker;
45
46
47
48
49 private final Collection<IJNRPEEventListener> listeners;
50
51
52
53
54
55
56
57
58
59 public JNRPEServerHandler(final CommandInvoker invoker,
60 final Collection<IJNRPEEventListener> eventListeners) {
61 this.commandInvoker = invoker;
62 this.listeners = eventListeners;
63 }
64
65 @Override
66 public final void channelRead(final ChannelHandlerContext ctx,
67 final Object msg) {
68 try {
69 JNRPERequest req = (JNRPERequest) msg;
70
71 ReturnValue ret = commandInvoker.invoke(req.getCommand(),
72 req.getArguments());
73
74 if (ret == null) {
75 String args = StringUtils.join(req.getArguments(), ',');
76
77 ret = new ReturnValue(Status.UNKNOWN, "Command ["
78 + req.getCommand() + "] with args [" + args
79 + "] returned null");
80 }
81
82 JNRPEResponse res = new JNRPEResponse();
83 res.setPacketVersion(PacketVersion.VERSION_2);
84
85 res.setResultCode(ret.getStatus().intValue());
86 res.setMessage(ret.getMessage());
87
88 ChannelFuture f = ctx.writeAndFlush(res);
89 f.addListener(ChannelFutureListener.CLOSE);
90 } finally {
91 ReferenceCountUtil.release(msg);
92 }
93 }
94
95 @Override
96 public final void exceptionCaught(final ChannelHandlerContext ctx,
97 final Throwable cause) {
98 EventsUtil.sendEvent(listeners, this, LogEvent.ERROR,
99 cause.getMessage(), cause);
100 ctx.close();
101 }
102 }