ExecGatewayFtpServer.java

/*
 * This file is part of Waarp Project (named also Waarp or GG).
 *
 *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
 *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
 * individual contributors.
 *
 *  All Waarp Project is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or (at your
 * option) any later version.
 *
 * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along with
 * Waarp . If not, see <http://www.gnu.org/licenses/>.
 */

package org.waarp.gateway.ftp;

import org.waarp.common.file.filesystembased.FilesystemBasedFileParameterImpl;
import org.waarp.common.logging.SysErrLogger;
import org.waarp.common.logging.WaarpLogger;
import org.waarp.common.logging.WaarpLoggerFactory;
import org.waarp.common.logging.WaarpSlf4JLoggerFactory;
import org.waarp.ftp.core.exception.FtpNoConnectionException;
import org.waarp.gateway.ftp.config.FileBasedConfiguration;
import org.waarp.gateway.ftp.control.ExecBusinessHandler;
import org.waarp.gateway.ftp.data.FileSystemBasedDataBusinessHandler;
import org.waarp.gateway.ftp.exec.AbstractExecutor;
import org.waarp.gateway.ftp.service.FtpEngine;
import org.waarp.openr66.protocol.configuration.Configuration;

/**
 * Exec FTP Server using simple authentication (XML FileInterface based), and
 * standard Directory and
 * FileInterface implementation (Filesystem based).
 */
public class ExecGatewayFtpServer {
  /**
   * Internal Logger
   */
  private static WaarpLogger logger;

  private ExecGatewayFtpServer() {
  }

  /**
   * Take a simple XML file as configuration.
   *
   * @param args
   */
  public static void main(final String[] args) {
    if (args.length < 1) {
      SysErrLogger.FAKE_LOGGER.syserr(
          "Usage: " + ExecGatewayFtpServer.class.getName() +
          " <config-file> [<r66config-file>]");
      return;
    }
    WaarpLoggerFactory.setDefaultFactoryIfNotSame(
        new WaarpSlf4JLoggerFactory(null));
    logger = WaarpLoggerFactory.getLogger(ExecGatewayFtpServer.class);
    initialize(args[0], args.length > 1? args[1] : null);
  }

  public static boolean initialize(final String config, final String r66file) {
    boolean asAService = false;
    if (logger == null) {
      // Called as a service
      logger = WaarpLoggerFactory.getLogger(ExecGatewayFtpServer.class);
      asAService = true;
    }
    final FileBasedConfiguration configuration =
        new FileBasedConfiguration(ExecGatewayFtpServer.class,
                                   ExecBusinessHandler.class,
                                   FileSystemBasedDataBusinessHandler.class,
                                   new FilesystemBasedFileParameterImpl());
    if (asAService) {
      configuration.getShutdownConfiguration().serviceFuture =
          FtpEngine.closeFuture;
    }
    if (!configuration.setConfigurationServerFromXml(config)) {
      SysErrLogger.FAKE_LOGGER.syserr("Bad main configuration");
      return false;
    }
    Configuration.configuration.setUseLocalExec(configuration.isUseLocalExec());
    if (AbstractExecutor.useDatabase) {
      // Use R66 module
      if (r66file != null) {
        if (!org.waarp.openr66.configuration.FileBasedConfiguration.setSubmitClientConfigurationFromXml(
            Configuration.configuration, r66file)) {
          SysErrLogger.FAKE_LOGGER.syserr("Bad R66 configuration");
          return false;
        }
      } else {
        // Cannot get R66 functional
        SysErrLogger.FAKE_LOGGER.syserr(
            "No R66PrepareTransfer configuration file");
      }
    } else {
      SysErrLogger.FAKE_LOGGER.syserr("No R66PrepareTransfer support");
    }
    FileBasedConfiguration.fileBasedConfiguration = configuration;
    // Start server.
    configuration.configureLExec();
    try {
      configuration.serverStartup();
    } catch (final FtpNoConnectionException e1) {
      SysErrLogger.FAKE_LOGGER.syserr(e1);
      configuration.releaseResources();
      return false;
    }
    configuration.configureHttps();
    configuration.configureConstraint();
    try {
      configuration.configureSnmp();
    } catch (final FtpNoConnectionException e) {
      SysErrLogger.FAKE_LOGGER.syserr(
          "Cannot start SNMP support: " + e.getMessage());
    }
    logger.warn("FTP started " +
                (configuration.getFtpInternalConfiguration().isUsingNativeSsl()?
                    "Implicit SSL On" :
                    configuration.getFtpInternalConfiguration()
                                 .isAcceptAuthProt()? "Explicit SSL On" :
                        "with SSL Off"));
    return true;
  }

}