1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.ftp.core.command.internal;
21
22 import io.netty.channel.ChannelFuture;
23 import io.netty.channel.ChannelFutureListener;
24 import org.waarp.common.command.ReplyCode;
25 import org.waarp.common.command.exception.Reply500Exception;
26 import org.waarp.common.command.exception.Reply501Exception;
27 import org.waarp.common.crypto.ssl.WaarpSslUtility;
28 import org.waarp.common.logging.WaarpLogger;
29 import org.waarp.common.logging.WaarpLoggerFactory;
30 import org.waarp.ftp.core.command.AbstractCommand;
31 import org.waarp.ftp.core.config.FtpConfiguration;
32 import org.waarp.ftp.core.utils.FtpChannelUtils;
33
34
35
36
37 public class INTERNALSHUTDOWN extends AbstractCommand {
38
39
40
41 private static final WaarpLogger logger =
42 WaarpLoggerFactory.getLogger(INTERNALSHUTDOWN.class);
43
44
45
46
47 private static class ShutdownChannelFutureListener
48 implements ChannelFutureListener {
49
50 private final FtpConfiguration configuration;
51
52 protected ShutdownChannelFutureListener(
53 final FtpConfiguration configuration) {
54 this.configuration = configuration;
55 }
56
57 @Override
58 public final void operationComplete(final ChannelFuture arg0) {
59 WaarpSslUtility.closingSslChannel(arg0.channel());
60 FtpChannelUtils.teminateServer(configuration);
61 }
62
63 }
64
65 @Override
66 public final void exec() throws Reply501Exception, Reply500Exception {
67 if (!getSession().getAuth().isAdmin()) {
68
69 throw new Reply500Exception("Command Not Allowed");
70 }
71 if (!hasArg()) {
72 throw new Reply501Exception("Shutdown Need password");
73 }
74 final String password = getArg();
75 if (logger.isDebugEnabled()) {
76 logger.debug("{} {}", password,
77 getConfiguration().checkPassword(password));
78 }
79 if (!getConfiguration().checkPassword(password)) {
80 throw new Reply501Exception("Shutdown Need a correct password");
81 }
82 logger.warn("Shutdown...");
83 getSession().setReplyCode(ReplyCode.REPLY_221_CLOSING_CONTROL_CONNECTION,
84 "System shutdown");
85 getSession().getNetworkHandler().writeIntermediateAnswer().addListener(
86 new ShutdownChannelFutureListener(getConfiguration()));
87 }
88
89 }