Skip to content

Plugin Infrastructure

OpenECPDS supports two complementary extension frameworks that together cover both sides of data exchange:

  • Transfer Modules — extend outgoing connections (acquisition and dissemination)
  • Server Plugins — extend incoming connections (Data Portal)

Both frameworks follow the same principle: implement a well-defined interface, register the class in configuration, and the platform handles lifecycle, threading, connection management, and monitoring automatically.

Transfer Modules (outgoing)

Transfer modules plug into the ECtrans transfer engine used by Data Acquisition and Data Dissemination. Each module implements a protocol adapter that the engine calls to connect, authenticate, transfer data, list directories, and clean up.

Built-in modules cover:

Module Protocol Page
FTP FTP ftp
FTPS FTP over TLS ftps
SFTP SSH File Transfer sftp
HTTP HTTP / HTTPS http
S3 Amazon S3 s3
Azure Azure Blob Storage azure
GCS Google Cloud Storage gcs
ECauth SSH/Telnet via ECaccess ecauth
Portal Local Data Portal staging portal

Adding a new transfer module

A new outgoing protocol is added by implementing the ECtrans module interface and referencing the class from a host configuration. No changes to the core platform are required. The module receives connection parameters, handles the protocol lifecycle, and returns results to the transfer engine.

Server Plugins (incoming)

Server plugins extend the Data Portal with new incoming protocols. Each plugin runs as an independent server, listening on its own port, authenticating users against the OpenECPDS user database, and delegating data operations to the mover's virtual filesystem.

The base classes in ecmwf.common.plugin provide:

Class Purpose
PluginThread Base thread lifecycle and caller-injection mechanism
ServerPlugin Adds TCP listen loop, per-connection threading, connection limiting, JMX monitoring
SimplePlugin Adds command-dispatch loop, HMAC authentication helpers, and stream utilities

Built-in server plugins on the Data Mover:

Plugin class Protocol Incoming port
ecmwf.common.ftpd.FtpPlugin FTP configurable (PORT_FTP)
ecmwf.ecpds.mover.plugin.ssh.SshPlugin SFTP / SCP configurable (PORT_SSH)
ecmwf.ecpds.mover.plugin.http.HttpPlugin HTTPS / S3 / WebDAV configurable (PORT_HTTPS)
ecmwf.ecpds.mover.plugin.mqtt.MqttPlugin MQTTS configurable (PORT_MQTTS)
ecmwf.ecpds.mover.plugin.ecproxy.ECproxyPlugin ECproxy (internal) configurable

Plugins are registered in ecmwf.properties under [PluginList]:

[PluginList]
http=ecmwf.ecpds.mover.plugin.http.HttpPlugin
mqtt=ecmwf.ecpds.mover.plugin.mqtt.MqttPlugin
ftp=ecmwf.common.ftpd.FtpPlugin,maxConnections=2000,inverseResolution=no
ssh=ecmwf.ecpds.mover.plugin.ssh.SshPlugin
ecproxy=ecmwf.ecpds.mover.plugin.ecproxy.ECproxyPlugin,maxConnections=2000,inverseResolution=no

Adding a new server plugin

To add a new incoming protocol:

  1. Extend ServerPlugin (or SimplePlugin for text-command protocols) from ecmwf.common.plugin.
  2. Implement the required abstract methods:
  3. getPort() — the TCP port to listen on
  4. newInstance() — factory method called per accepted connection
  5. startConnection(Socket) — handle one client session
  6. refuseConnection(Socket, int) — called when connection limits are exceeded
  7. Register the class in [PluginList] in ecmwf.properties.

The framework handles TCP accept loop, per-connection thread allocation, maximum connection enforcement, JMX MBean registration, and graceful shutdown automatically.

Extending OpenECPDS

Both frameworks are designed to be extended. If you need a protocol that is not yet supported — whether outgoing or incoming — ECMWF is happy to help guide or collaborate on integration and development.

Suggest a new protocol

Open a discussion or issue in the GitHub repository to suggest a new transfer module or server plugin. See Contributing for more details.