[ftpupload] Add configurable passive port (#10127)

* Add configurable passive port
* Don't use apache library; Use standard Java
* Ran spotless:apply
* Update readme

Signed-off-by: schinken <schinken@bamberg.ccc.de>

Co-authored-by: Hilbrand Bouwkamp <hilbrand@h72.nl>
This commit is contained in:
Christopher Schirner 2021-02-26 19:55:19 +01:00 committed by GitHub
parent dc9c2f3fe8
commit 522586156c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 6 deletions

View File

@ -18,10 +18,11 @@ Automatic discovery is not supported.
The binding has the following configuration options: The binding has the following configuration options:
| Parameter | Name | Description | Required | Default value | | Parameter | Name | Description | Required | Default value |
|-------------|--------------|------------------------------------------------------------------------------------------------------------------------|----------|---------------| |--------------|---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------------|
| port | TCP Port | TCP port of the FTP server | no | 2121 | | port | TCP Port | TCP port of the FTP server | no | 2121 |
| idleTimeout | Idle timeout | The number of seconds before an inactive client is disconnected. If this value is set to 0, the idle time is disabled. | no | 60 | | idleTimeout | Idle timeout | The number of seconds before an inactive client is disconnected. If this value is set to 0, the idle time is disabled. | no | 60 |
| passivePorts | Passive Ports | A string of passive ports, can contain a single port (as an integer), multiple ports seperated by commas (e.g. 123,124,125) or ranges of ports, including open ended ranges (e.g. 123-125, 30000-, -1023). Combinations for single ports and ranges is also supported. Empty (default) allows all ports as passive ports. | no | |
## Thing Configuration ## Thing Configuration

View File

@ -19,6 +19,7 @@ import java.util.Dictionary;
import java.util.Set; import java.util.Set;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.ftpserver.DataConnectionConfigurationFactory;
import org.apache.ftpserver.FtpServerConfigurationException; import org.apache.ftpserver.FtpServerConfigurationException;
import org.apache.ftpserver.ftplet.FtpException; import org.apache.ftpserver.ftplet.FtpException;
import org.openhab.binding.ftpupload.internal.ftp.FtpServer; import org.openhab.binding.ftpupload.internal.ftp.FtpServer;
@ -90,6 +91,7 @@ public class FtpUploadHandlerFactory extends BaseThingHandlerFactory {
protected synchronized void modified(ComponentContext componentContext) { protected synchronized void modified(ComponentContext componentContext) {
stopFtpServer(); stopFtpServer();
Dictionary<String, Object> properties = componentContext.getProperties(); Dictionary<String, Object> properties = componentContext.getProperties();
DataConnectionConfigurationFactory dataConnectionConfigurationFactory = new DataConnectionConfigurationFactory();
int port = DEFAULT_PORT; int port = DEFAULT_PORT;
int idleTimeout = DEFAULT_IDLE_TIMEOUT; int idleTimeout = DEFAULT_IDLE_TIMEOUT;
@ -116,9 +118,21 @@ public class FtpUploadHandlerFactory extends BaseThingHandlerFactory {
} }
} }
if (properties.get("passivePorts") != null) {
String strPassivePorts = properties.get("passivePorts").toString();
if (!strPassivePorts.isEmpty()) {
try {
dataConnectionConfigurationFactory.setPassivePorts(strPassivePorts);
} catch (IllegalArgumentException e) {
logger.warn("Invalid passive ports '{}' ({})", strPassivePorts, e.getMessage());
}
}
}
try { try {
logger.debug("Starting FTP server, port={}, idleTimeout={}", port, idleTimeout); logger.debug("Starting FTP server, port={}, idleTimeout={}", port, idleTimeout);
ftpServer.startServer(port, idleTimeout); ftpServer.startServer(port, idleTimeout,
dataConnectionConfigurationFactory.createDataConnectionConfiguration());
} catch (FtpException | FtpServerConfigurationException e) { } catch (FtpException | FtpServerConfigurationException e) {
logger.warn("FTP server starting failed, reason: {}", e.getMessage()); logger.warn("FTP server starting failed, reason: {}", e.getMessage());
} }

View File

@ -19,6 +19,7 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ftpserver.DataConnectionConfiguration;
import org.apache.ftpserver.FtpServerConfigurationException; import org.apache.ftpserver.FtpServerConfigurationException;
import org.apache.ftpserver.FtpServerFactory; import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.DefaultFtplet; import org.apache.ftpserver.ftplet.DefaultFtplet;
@ -48,6 +49,7 @@ public class FtpServer {
private final Logger logger = LoggerFactory.getLogger(FtpServer.class); private final Logger logger = LoggerFactory.getLogger(FtpServer.class);
private int port; private int port;
private DataConnectionConfiguration dataConnectionConfiguration;
int idleTimeout; int idleTimeout;
private org.apache.ftpserver.FtpServer server; private org.apache.ftpserver.FtpServer server;
@ -61,10 +63,12 @@ public class FtpServer {
FTPUserManager = new FTPUserManager(); FTPUserManager = new FTPUserManager();
} }
public void startServer(int port, int idleTimeout) throws FtpException { public void startServer(int port, int idleTimeout, DataConnectionConfiguration dataConnectionConfiguration)
throws FtpException {
stopServer(); stopServer();
this.port = port; this.port = port;
this.idleTimeout = idleTimeout; this.idleTimeout = idleTimeout;
this.dataConnectionConfiguration = dataConnectionConfiguration;
FTPUserManager.setIdleTimeout(idleTimeout); FTPUserManager.setIdleTimeout(idleTimeout);
initServer(); initServer();
} }
@ -127,8 +131,10 @@ public class FtpServer {
private void initServer() throws FtpException { private void initServer() throws FtpException {
FtpServerFactory serverFactory = new FtpServerFactory(); FtpServerFactory serverFactory = new FtpServerFactory();
ListenerFactory listenerFactory = new ListenerFactory(); ListenerFactory listenerFactory = new ListenerFactory();
listenerFactory.setPort(port); listenerFactory.setPort(port);
listenerFactory.setIdleTimeout(idleTimeout); listenerFactory.setIdleTimeout(idleTimeout);
listenerFactory.setDataConnectionConfiguration(dataConnectionConfiguration);
Listener listener = listenerFactory.createListener(); Listener listener = listenerFactory.createListener();

View File

@ -18,5 +18,15 @@
time is disabled.</description> time is disabled.</description>
<default>60</default> <default>60</default>
</parameter> </parameter>
<parameter name="passivePorts" type="text">
<label>Passive Port Range</label>
<description>A string of passive ports, can contain a single port (as an integer), multiple ports seperated by
commas
(e.g. 123,124,125) or ranges of ports, including open ended ranges (e.g. 123-125, 30000-, -1023).
Combinations for
single ports and ranges is also supported. Empty (default) allows all ports as passive ports.</description>
<default></default>
<advanced>true</advanced>
</parameter>
</config-description> </config-description>
</binding:binding> </binding:binding>