/*
* Licensed to David Pilato (the "Author") under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Author licenses this
* file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package fr.pilato.elasticsearch.crawler.fs;
import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl.PROTOCOL;
import fr.pilato.elasticsearch.crawler.fs.meta.settings.Elasticsearch;
import fr.pilato.elasticsearch.crawler.fs.meta.settings.Fs;
import fr.pilato.elasticsearch.crawler.fs.meta.settings.FsSettings;
import fr.pilato.elasticsearch.crawler.fs.meta.settings.Rest;
import fr.pilato.elasticsearch.crawler.fs.util.OsValidator;
import org.apache.logging.log4j.Logger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import static fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl.hasText;
public class FsCrawlerValidator {
/**
* Check if settings are valid. Note that settings can be updated by this method (fallback to defaults if not set)
* @param logger Needed to print warn/errors or info
* @param settings Settings we want to check
* @param rest true If Rest server should be started, so we check Rest settings
* @return true if we found fatal errors and should prevent from starting
*/
public static boolean validateSettings(Logger logger, FsSettings settings, boolean rest) {
if (settings.getFs() == null || settings.getFs().getUrl() == null) {
logger.warn("`url` is not set. Please define it. Falling back to default: [{}].", Fs.DEFAULT_DIR);
if (settings.getFs() == null) {
settings.setFs(Fs.DEFAULT);
} else {
settings.getFs().setUrl(Fs.DEFAULT_DIR);
}
}
if (settings.getElasticsearch() == null) {
settings.setElasticsearch(Elasticsearch.DEFAULT());
}
if (settings.getElasticsearch().getIndex() == null) {
// When index is not set, we fallback to the config name
settings.getElasticsearch().setIndex(settings.getName());
}
// Checking protocol
if (settings.getServer() != null) {
if (!PROTOCOL.LOCAL.equals(settings.getServer().getProtocol()) &&
!PROTOCOL.SSH.equals(settings.getServer().getProtocol())) {
// Non supported protocol
logger.error(settings.getServer().getProtocol() + " is not supported yet. Please use " +
PROTOCOL.LOCAL + " or " + PROTOCOL.SSH + ". Disabling crawler");
return true;
}
// Checking username/password
if (PROTOCOL.SSH.equals(settings.getServer().getProtocol()) &&
!hasText(settings.getServer().getUsername())) {
// Non supported protocol
logger.error("When using SSH, you need to set a username and probably a password or a pem file. Disabling crawler");
return true;
}
}
// Checking Checksum Algorithm
if (settings.getFs().getChecksum() != null) {
try {
MessageDigest.getInstance(settings.getFs().getChecksum());
} catch (NoSuchAlgorithmException e) {
// Non supported protocol
logger.error("Algorithm [{}] not found. Disabling crawler", settings.getFs().getChecksum());
return true;
}
}
// Checking That we don't try to do both xml and json
if (settings.getFs().isJsonSupport() && settings.getFs().isXmlSupport()) {
logger.error("Can not support both xml and json parsing. Disabling crawler");
return true;
}
// Checking That we don't try to have xml or json but we don't want to index their content
if ((settings.getFs().isJsonSupport() || settings.getFs().isXmlSupport()) && !settings.getFs().isIndexContent()) {
logger.error("Json or Xml indexation is activated but you disabled indexing content which does not make sense. Disabling crawler");
return true;
}
// We just warn the user if he is running on windows but want to get attributes
if (OsValidator.windows && settings.getFs().isAttributesSupport()) {
logger.info("attributes_support is set to true but getting group is not available on [{}].", OsValidator.OS);
}
// Check that REST settings are available when we start with rest option
if (rest && settings.getRest() == null) {
logger.warn("`rest` settings are not defined. Falling back to default: [{}].", Rest.DEFAULT.url());
settings.setRest(Rest.DEFAULT);
}
return false;
}
}