Как реализовать команду ALLO на Apache FTP? - PullRequest
0 голосов
/ 18 октября 2018

У нас есть встроенный FTP-сервер Apache, работающий в шлюзе в течение нескольких лет.Это всегда работало без проблем.

Но теперь клиент пытается подключиться к устройству бренда, которого у нас никогда не было раньше, и, в отличие от всех других клиентов до сих пор, эта вещь отправляет команду ALLO вУбедитесь, что на сервере достаточно места.

Но Apache FTP, похоже, не знает эту команду.состояние журнала трассировки:

ПОЛУЧЕНО: ALLO 77482
SENT: 502 Команда ALLO не реализована.

, после чего клиент прерывает соединение.

Команда также отсутствует в документации Apache: https://mina.apache.org/ftpserver-project/ftpserver_commands.html

Итак, вопрос в том, могу ли я как-то подключить свою собственную реализацию к серверу?Просто чтобы прояснить, я не спрашиваю, как реализовать функциональность.Как я могу передать свою собственную реализацию Apache FTP для использования.Если это возможно без прикосновения к исходному коду.

Поскольку рассматриваемое приложение долгое время работало очень стабильно, я бы очень не хотел вырвать там сервер Apache FTP и встроить еще один ...

1 Ответ

0 голосов
/ 18 октября 2018

Что ж, это было удивительно просто, когда я нашел правильный код.

Реализация команды достаточно проста, в данном случае я только что начал с заглушки для тестирования:

class ALLO : AbstractCommand() {

    override fun execute(session: FtpIoSession, context: FtpServerContext, request: FtpRequest) {

        session.write(LocalizedFtpReply.translate(session, request, context,
                FtpReply.REPLY_200_COMMAND_OKAY, "ALLO", "bring it!"))
    }
}

Унаследовать AbstractCommand, переопределить execute и записать ответ на сеанс.

Конечно, тогда возникает вопрос, как сообщить серверу о реализации, что также оказывается действительно простым, хотя там, конечно, чертовски нет никакой документации.Но вы можете просто создать экземпляр CommandFactoryFactory, отобразить вашу реализацию, построить CommandFactory и установить его в FtpServerFactory:

        val commandFactoryFactory = CommandFactoryFactory()
        commandFactoryFactory.addCommand("ALLO", ALLO())
        serverFactory.commandFactory = commandFactoryFactory.createCommandFactory()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...