Search in sources :

Example 1 with VendorConfiguration

use of org.batfish.vendor.VendorConfiguration in project batfish by batfish.

the class Batfish method serializeNetworkConfigs.

private void serializeNetworkConfigs(Path testRigPath, Path outputPath, ParseVendorConfigurationAnswerElement answerElement, SortedMap<String, VendorConfiguration> overlayHostConfigurations) {
    Map<Path, String> configurationData = readConfigurationFiles(testRigPath, BfConsts.RELPATH_CONFIGURATIONS_DIR);
    Map<String, VendorConfiguration> vendorConfigurations;
    try (ActiveSpan parseNetworkConfigsSpan = GlobalTracer.get().buildSpan("Parse network configs").startActive()) {
        // avoid unused warning
        assert parseNetworkConfigsSpan != null;
        vendorConfigurations = parseVendorConfigurations(configurationData, answerElement, ConfigurationFormat.UNKNOWN);
    }
    if (vendorConfigurations == null) {
        throw new BatfishException("Exiting due to parser errors");
    }
    _logger.infof("Testrig:%s in container:%s has total number of network configs:%d", getTestrigName(), getContainerName(), vendorConfigurations.size());
    _logger.info("\n*** SERIALIZING VENDOR CONFIGURATION STRUCTURES ***\n");
    _logger.resetTimer();
    CommonUtil.createDirectories(outputPath);
    Map<Path, VendorConfiguration> output = new TreeMap<>();
    vendorConfigurations.forEach((name, vc) -> {
        if (name.contains(File.separator)) {
            // iptables will get a hostname like configs/iptables-save if they
            // are not set up correctly using host files
            _logger.errorf("Cannot serialize configuration with hostname %s\n", name);
            answerElement.addRedFlagWarning(name, new Warning("Cannot serialize network config. Bad hostname " + name.replace("\\", "/"), "MISCELLANEOUS"));
        } else {
            // apply overlay if it exists
            VendorConfiguration overlayConfig = overlayHostConfigurations.get(name);
            if (overlayConfig != null) {
                vc.setOverlayConfiguration(overlayConfig);
                overlayHostConfigurations.remove(name);
            }
            Path currentOutputPath = outputPath.resolve(name);
            output.put(currentOutputPath, vc);
        }
    });
    // warn about unused overlays
    overlayHostConfigurations.forEach((name, overlay) -> {
        answerElement.getParseStatus().put(name, ParseStatus.ORPHANED);
    });
    serializeObjects(output);
    _logger.printElapsedTime();
}
Also used : Path(java.nio.file.Path) CleanBatfishException(org.batfish.common.CleanBatfishException) BatfishException(org.batfish.common.BatfishException) IptablesVendorConfiguration(org.batfish.representation.iptables.IptablesVendorConfiguration) VendorConfiguration(org.batfish.vendor.VendorConfiguration) Warning(org.batfish.common.Warning) ActiveSpan(io.opentracing.ActiveSpan) TreeMap(java.util.TreeMap)

Example 2 with VendorConfiguration

use of org.batfish.vendor.VendorConfiguration in project batfish by batfish.

the class Batfish method readIptableFiles.

/**
 * Read Iptable Files for each host in the keyset of {@code hostConfigurations}, and store the
 * contents in {@code iptablesDate}. Each task fails if the Iptable file specified by host is not
 * under {@code testRigPath} or does not exist.
 *
 * @throws BatfishException if there is a failed task and either {@link
 *     Settings#getExitOnFirstError()} or {@link Settings#getHaltOnParseError()} is set.
 */
void readIptableFiles(Path testRigPath, SortedMap<String, VendorConfiguration> hostConfigurations, SortedMap<Path, String> iptablesData, ParseVendorConfigurationAnswerElement answerElement) {
    List<BatfishException> failureCauses = new ArrayList<>();
    for (VendorConfiguration vc : hostConfigurations.values()) {
        HostConfiguration hostConfig = (HostConfiguration) vc;
        if (hostConfig.getIptablesFile() != null) {
            Path path = Paths.get(testRigPath.toString(), hostConfig.getIptablesFile());
            // testrig
            try {
                if (!path.toFile().getCanonicalPath().contains(testRigPath.toFile().getCanonicalPath()) || !path.toFile().exists()) {
                    String failureMessage = String.format("Iptables file %s for host %s is not contained within the testrig", hostConfig.getIptablesFile(), hostConfig.getHostname());
                    BatfishException bfc;
                    if (answerElement.getErrors().containsKey(hostConfig.getHostname())) {
                        bfc = new BatfishException(failureMessage, answerElement.getErrors().get(hostConfig.getHostname()).getException());
                        answerElement.getErrors().put(hostConfig.getHostname(), bfc.getBatfishStackTrace());
                    } else {
                        bfc = new BatfishException(failureMessage);
                        if (_settings.getExitOnFirstError()) {
                            throw bfc;
                        } else {
                            failureCauses.add(bfc);
                            answerElement.getErrors().put(hostConfig.getHostname(), bfc.getBatfishStackTrace());
                            answerElement.getParseStatus().put(hostConfig.getHostname(), ParseStatus.FAILED);
                        }
                    }
                } else {
                    String fileText = CommonUtil.readFile(path);
                    iptablesData.put(path, fileText);
                }
            } catch (IOException e) {
                throw new BatfishException("Could not get canonical path", e);
            }
        }
    }
    if (_settings.getHaltOnParseError() && !failureCauses.isEmpty()) {
        BatfishException e = new BatfishException("Fatal exception due to at least one Iptables file is" + " not contained within the testrig");
        failureCauses.forEach(e::addSuppressed);
        throw e;
    }
}
Also used : Path(java.nio.file.Path) CleanBatfishException(org.batfish.common.CleanBatfishException) BatfishException(org.batfish.common.BatfishException) IptablesVendorConfiguration(org.batfish.representation.iptables.IptablesVendorConfiguration) VendorConfiguration(org.batfish.vendor.VendorConfiguration) Serializable(java.io.Serializable) BatfishStackTrace(org.batfish.common.BatfishException.BatfishStackTrace) AclLine(org.batfish.z3.AclLine) DeviceType(org.batfish.datamodel.DeviceType) InterfaceType(org.batfish.datamodel.InterfaceType) FlowTrace(org.batfish.datamodel.FlowTrace) Edge(org.batfish.datamodel.Edge) IpAccessListLine(org.batfish.datamodel.IpAccessListLine) Cache(com.google.common.cache.Cache) Interface(org.batfish.datamodel.Interface) DataPlane(org.batfish.datamodel.DataPlane) PluginClientType(org.batfish.common.plugin.PluginClientType) Nullable(javax.annotation.Nullable) BgpAdvertisementType(org.batfish.datamodel.BgpAdvertisement.BgpAdvertisementType) File(java.io.File) HeaderSpace(org.batfish.datamodel.HeaderSpace) TypeReference(com.fasterxml.jackson.core.type.TypeReference) AbstractRoute(org.batfish.datamodel.AbstractRoute) SubRange(org.batfish.datamodel.SubRange) HostConfiguration(org.batfish.representation.host.HostConfiguration) ArrayList(java.util.ArrayList) IOException(java.io.IOException)

Example 3 with VendorConfiguration

use of org.batfish.vendor.VendorConfiguration in project batfish by batfish.

the class Batfish method parseVendorConfigurations.

private SortedMap<String, VendorConfiguration> parseVendorConfigurations(Map<Path, String> configurationData, ParseVendorConfigurationAnswerElement answerElement, ConfigurationFormat configurationFormat) {
    _logger.info("\n*** PARSING VENDOR CONFIGURATION FILES ***\n");
    _logger.resetTimer();
    SortedMap<String, VendorConfiguration> vendorConfigurations = new TreeMap<>();
    List<ParseVendorConfigurationJob> jobs = new ArrayList<>();
    for (Entry<Path, String> vendorFile : configurationData.entrySet()) {
        Path currentFile = vendorFile.getKey();
        String fileText = vendorFile.getValue();
        Warnings warnings = buildWarnings(_settings);
        ParseVendorConfigurationJob job = new ParseVendorConfigurationJob(_settings, fileText, currentFile, warnings, configurationFormat);
        jobs.add(job);
    }
    BatfishJobExecutor.runJobsInExecutor(_settings, _logger, jobs, vendorConfigurations, answerElement, _settings.getHaltOnParseError(), "Parse configurations");
    _logger.printElapsedTime();
    return vendorConfigurations;
}
Also used : Path(java.nio.file.Path) IptablesVendorConfiguration(org.batfish.representation.iptables.IptablesVendorConfiguration) VendorConfiguration(org.batfish.vendor.VendorConfiguration) ParseVendorConfigurationJob(org.batfish.job.ParseVendorConfigurationJob) ArrayList(java.util.ArrayList) TreeMap(java.util.TreeMap) Warnings(org.batfish.common.Warnings)

Example 4 with VendorConfiguration

use of org.batfish.vendor.VendorConfiguration in project batfish by batfish.

the class Batfish method serializeHostConfigs.

private SortedMap<String, VendorConfiguration> serializeHostConfigs(Path testRigPath, Path outputPath, ParseVendorConfigurationAnswerElement answerElement) {
    SortedMap<Path, String> configurationData = readConfigurationFiles(testRigPath, BfConsts.RELPATH_HOST_CONFIGS_DIR);
    // read the host files
    SortedMap<String, VendorConfiguration> allHostConfigurations;
    try (ActiveSpan parseHostConfigsSpan = GlobalTracer.get().buildSpan("Parse host configs").startActive()) {
        // avoid unused warning
        assert parseHostConfigsSpan != null;
        allHostConfigurations = parseVendorConfigurations(configurationData, answerElement, ConfigurationFormat.HOST);
    }
    if (allHostConfigurations == null) {
        throw new BatfishException("Exiting due to parser errors");
    }
    _logger.infof("Testrig:%s in container:%s has total number of host configs:%d", getTestrigName(), getContainerName(), allHostConfigurations.size());
    // split into hostConfigurations and overlayConfigurations
    SortedMap<String, VendorConfiguration> overlayConfigurations = allHostConfigurations.entrySet().stream().filter(e -> ((HostConfiguration) e.getValue()).getOverlay()).collect(toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v1, TreeMap::new));
    SortedMap<String, VendorConfiguration> nonOverlayHostConfigurations = allHostConfigurations.entrySet().stream().filter(e -> !((HostConfiguration) e.getValue()).getOverlay()).collect(toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v1, TreeMap::new));
    // read and associate iptables files for specified hosts
    SortedMap<Path, String> iptablesData = new TreeMap<>();
    readIptableFiles(testRigPath, allHostConfigurations, iptablesData, answerElement);
    SortedMap<String, VendorConfiguration> iptablesConfigurations = parseVendorConfigurations(iptablesData, answerElement, ConfigurationFormat.IPTABLES);
    for (VendorConfiguration vc : allHostConfigurations.values()) {
        HostConfiguration hostConfig = (HostConfiguration) vc;
        if (hostConfig.getIptablesFile() != null) {
            Path path = Paths.get(testRigPath.toString(), hostConfig.getIptablesFile());
            String relativePathStr = _testrigSettings.getBasePath().relativize(path).toString();
            if (iptablesConfigurations.containsKey(relativePathStr)) {
                hostConfig.setIptablesVendorConfig((IptablesVendorConfiguration) iptablesConfigurations.get(relativePathStr));
            }
        }
    }
    // now, serialize
    _logger.info("\n*** SERIALIZING VENDOR CONFIGURATION STRUCTURES ***\n");
    _logger.resetTimer();
    CommonUtil.createDirectories(outputPath);
    Map<Path, VendorConfiguration> output = new TreeMap<>();
    nonOverlayHostConfigurations.forEach((name, vc) -> {
        Path currentOutputPath = outputPath.resolve(name);
        output.put(currentOutputPath, vc);
    });
    serializeObjects(output);
    // serialize warnings
    serializeObject(answerElement, _testrigSettings.getParseAnswerPath());
    _logger.printElapsedTime();
    return overlayConfigurations;
}
Also used : Path(java.nio.file.Path) JuniperFlattener(org.batfish.grammar.juniper.JuniperFlattener) TreeMultiSet(org.batfish.datamodel.collections.TreeMultiSet) BfConsts(org.batfish.common.BfConsts) HeaderQuestion(org.batfish.datamodel.questions.smt.HeaderQuestion) Topology(org.batfish.datamodel.Topology) Map(java.util.Map) RoutesByVrf(org.batfish.datamodel.collections.RoutesByVrf) Pair(org.batfish.common.Pair) Path(java.nio.file.Path) TopologyExtractor(org.batfish.grammar.topology.TopologyExtractor) ConfigurationFormat(org.batfish.datamodel.ConfigurationFormat) GenericConfigObject(org.batfish.datamodel.GenericConfigObject) AnswerSummary(org.batfish.datamodel.answers.AnswerSummary) ReachabilityQuerySynthesizer(org.batfish.z3.ReachabilityQuerySynthesizer) AssertionCombinedParser(org.batfish.grammar.assertion.AssertionCombinedParser) ParseEnvironmentBgpTableJob(org.batfish.job.ParseEnvironmentBgpTableJob) Serializable(java.io.Serializable) Environment(org.batfish.datamodel.pojo.Environment) AssertionExtractor(org.batfish.grammar.assertion.AssertionExtractor) Stream(java.util.stream.Stream) NamedStructureEquivalenceSets(org.batfish.datamodel.collections.NamedStructureEquivalenceSets) RoleQuestion(org.batfish.datamodel.questions.smt.RoleQuestion) BatfishCompressor(org.batfish.symbolic.abstraction.BatfishCompressor) CoordConsts(org.batfish.common.CoordConsts) AssertionContext(org.batfish.grammar.assertion.AssertionParser.AssertionContext) BatfishStackTrace(org.batfish.common.BatfishException.BatfishStackTrace) AnswerElement(org.batfish.datamodel.answers.AnswerElement) JuniperCombinedParser(org.batfish.grammar.juniper.JuniperCombinedParser) ExceptionUtils(org.apache.commons.lang3.exception.ExceptionUtils) InitInfoAnswerElement(org.batfish.datamodel.answers.InitInfoAnswerElement) QuerySynthesizer(org.batfish.z3.QuerySynthesizer) NodJob(org.batfish.z3.NodJob) RipNeighbor(org.batfish.datamodel.RipNeighbor) SerializationUtils(org.apache.commons.lang3.SerializationUtils) HostConfiguration(org.batfish.representation.host.HostConfiguration) AclLine(org.batfish.z3.AclLine) DataPlanePlugin(org.batfish.common.plugin.DataPlanePlugin) ParseStatus(org.batfish.datamodel.answers.ParseStatus) Lists(com.google.common.collect.Lists) RunAnalysisAnswerElement(org.batfish.datamodel.answers.RunAnalysisAnswerElement) DeviceType(org.batfish.datamodel.DeviceType) AclReachabilityQuerySynthesizer(org.batfish.z3.AclReachabilityQuerySynthesizer) ImmutableSortedSet(com.google.common.collect.ImmutableSortedSet) Directory(org.batfish.common.Directory) ParseTreeWalker(org.antlr.v4.runtime.tree.ParseTreeWalker) IOException(java.io.IOException) InterfaceType(org.batfish.datamodel.InterfaceType) ReachabilitySettings(org.batfish.datamodel.questions.ReachabilitySettings) JSONArray(org.codehaus.jettison.json.JSONArray) NodeRoleSpecifier(org.batfish.datamodel.NodeRoleSpecifier) AnswerStatus(org.batfish.datamodel.answers.AnswerStatus) ExecutionException(java.util.concurrent.ExecutionException) ParseEnvironmentRoutingTableJob(org.batfish.job.ParseEnvironmentRoutingTableJob) BlacklistDstIpQuerySynthesizer(org.batfish.z3.BlacklistDstIpQuerySynthesizer) CleanBatfishException(org.batfish.common.CleanBatfishException) TreeMap(java.util.TreeMap) JSONException(org.codehaus.jettison.json.JSONException) Snapshot(org.batfish.common.Snapshot) IpsecVpn(org.batfish.datamodel.IpsecVpn) SortedSet(java.util.SortedSet) DataPlaneAnswerElement(org.batfish.datamodel.answers.DataPlaneAnswerElement) BiFunction(java.util.function.BiFunction) FlowTrace(org.batfish.datamodel.FlowTrace) BgpTableFormat(org.batfish.grammar.BgpTableFormat) FlowHistory(org.batfish.datamodel.FlowHistory) Edge(org.batfish.datamodel.Edge) ForwardingAnalysisImpl(org.batfish.datamodel.ForwardingAnalysisImpl) OspfProcess(org.batfish.datamodel.OspfProcess) Collectors.toMap(java.util.stream.Collectors.toMap) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) PropertyChecker(org.batfish.symbolic.smt.PropertyChecker) ConvertConfigurationAnswerElement(org.batfish.datamodel.answers.ConvertConfigurationAnswerElement) NodFirstUnsatJob(org.batfish.z3.NodFirstUnsatJob) VyosFlattener(org.batfish.grammar.vyos.VyosFlattener) Vrf(org.batfish.datamodel.Vrf) ImmutableSet(com.google.common.collect.ImmutableSet) ParseVendorConfigurationJob(org.batfish.job.ParseVendorConfigurationJob) RipProcess(org.batfish.datamodel.RipProcess) StandardReachabilityQuerySynthesizer(org.batfish.z3.StandardReachabilityQuerySynthesizer) Collection(java.util.Collection) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) InferRoles(org.batfish.role.InferRoles) AclLinesAnswerElement(org.batfish.datamodel.answers.AclLinesAnswerElement) ParseEnvironmentRoutingTablesAnswerElement(org.batfish.datamodel.answers.ParseEnvironmentRoutingTablesAnswerElement) NavigableMap(java.util.NavigableMap) Collectors(java.util.stream.Collectors) Settings(org.batfish.config.Settings) BatfishCombinedParser(org.batfish.grammar.BatfishCombinedParser) Entry(java.util.Map.Entry) BatfishJobExecutor(org.batfish.job.BatfishJobExecutor) Ip(org.batfish.datamodel.Ip) NodeInterfacePair(org.batfish.datamodel.collections.NodeInterfacePair) ForwardingAnalysis(org.batfish.datamodel.ForwardingAnalysis) BatfishException(org.batfish.common.BatfishException) IpAccessList(org.batfish.datamodel.IpAccessList) ConcurrentMap(java.util.concurrent.ConcurrentMap) HashSet(java.util.HashSet) TestrigSettings(org.batfish.config.Settings.TestrigSettings) BgpAdvertisementsByVrf(org.batfish.datamodel.collections.BgpAdvertisementsByVrf) ImmutableList(com.google.common.collect.ImmutableList) Version(org.batfish.common.Version) BatfishObjectMapper(org.batfish.common.util.BatfishObjectMapper) NamedStructureEquivalenceSet(org.batfish.datamodel.collections.NamedStructureEquivalenceSet) Configuration(org.batfish.datamodel.Configuration) ComputeDataPlaneResult(org.batfish.common.plugin.DataPlanePlugin.ComputeDataPlaneResult) ImmutableConfiguration(org.apache.commons.configuration2.ImmutableConfiguration) Nonnull(javax.annotation.Nonnull) ConvertConfigurationJob(org.batfish.job.ConvertConfigurationJob) Answerer(org.batfish.common.Answerer) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) NodAnswerElement(org.batfish.datamodel.answers.NodAnswerElement) NodFirstUnsatAnswerElement(org.batfish.datamodel.answers.NodFirstUnsatAnswerElement) InitStepAnswerElement(org.batfish.datamodel.answers.InitStepAnswerElement) NodSatAnswerElement(org.batfish.datamodel.answers.NodSatAnswerElement) ParseAnswerElement(org.batfish.datamodel.answers.ParseAnswerElement) IpAccessListLine(org.batfish.datamodel.IpAccessListLine) FileVisitOption(java.nio.file.FileVisitOption) AwsConfiguration(org.batfish.representation.aws.AwsConfiguration) Cache(com.google.common.cache.Cache) HeaderLocationQuestion(org.batfish.datamodel.questions.smt.HeaderLocationQuestion) AssertionAst(org.batfish.datamodel.assertion.AssertionAst) Interface(org.batfish.datamodel.Interface) CompositeNodJob(org.batfish.z3.CompositeNodJob) DirectoryStream(java.nio.file.DirectoryStream) Flow(org.batfish.datamodel.Flow) FlattenVendorConfigurationAnswerElement(org.batfish.datamodel.answers.FlattenVendorConfigurationAnswerElement) InvalidReachabilitySettingsException(org.batfish.datamodel.questions.InvalidReachabilitySettingsException) GrammarSettings(org.batfish.grammar.GrammarSettings) IptablesVendorConfiguration(org.batfish.representation.iptables.IptablesVendorConfiguration) Verify(com.google.common.base.Verify) DataPlane(org.batfish.datamodel.DataPlane) VendorConfiguration(org.batfish.vendor.VendorConfiguration) Set(java.util.Set) EnvironmentSettings(org.batfish.config.Settings.EnvironmentSettings) IBatfish(org.batfish.common.plugin.IBatfish) Question(org.batfish.datamodel.questions.Question) Roles(org.batfish.symbolic.abstraction.Roles) ParserRuleContext(org.antlr.v4.runtime.ParserRuleContext) ForwardingAction(org.batfish.datamodel.ForwardingAction) CommonUtil(org.batfish.common.util.CommonUtil) EarliestMoreGeneralReachableLineQuerySynthesizer(org.batfish.z3.EarliestMoreGeneralReachableLineQuerySynthesizer) AclReachabilityEntry(org.batfish.datamodel.answers.AclLinesAnswerElement.AclReachabilityEntry) PluginClientType(org.batfish.common.plugin.PluginClientType) TreeSet(java.util.TreeSet) ArrayList(java.util.ArrayList) BgpAdvertisement(org.batfish.datamodel.BgpAdvertisement) BgpTablePlugin(org.batfish.common.plugin.BgpTablePlugin) ParseTreePrettyPrinter(org.batfish.grammar.ParseTreePrettyPrinter) ReachEdgeQuerySynthesizer(org.batfish.z3.ReachEdgeQuerySynthesizer) ValidateEnvironmentAnswerElement(org.batfish.datamodel.answers.ValidateEnvironmentAnswerElement) ImmutableSortedMap(com.google.common.collect.ImmutableSortedMap) LinkedHashSet(java.util.LinkedHashSet) Nullable(javax.annotation.Nullable) BgpAdvertisementType(org.batfish.datamodel.BgpAdvertisement.BgpAdvertisementType) Files(java.nio.file.Files) JSONObject(org.codehaus.jettison.json.JSONObject) ExternalBgpAdvertisementPlugin(org.batfish.common.plugin.ExternalBgpAdvertisementPlugin) File(java.io.File) ParseEnvironmentBgpTablesAnswerElement(org.batfish.datamodel.answers.ParseEnvironmentBgpTablesAnswerElement) Paths(java.nio.file.Paths) ActiveSpan(io.opentracing.ActiveSpan) HeaderSpace(org.batfish.datamodel.HeaderSpace) SynthesizerInputImpl(org.batfish.z3.SynthesizerInputImpl) MultiSet(org.batfish.datamodel.collections.MultiSet) NodesSpecifier(org.batfish.datamodel.questions.NodesSpecifier) Answer(org.batfish.datamodel.answers.Answer) NodSatJob(org.batfish.z3.NodSatJob) FlattenVendorConfigurationJob(org.batfish.job.FlattenVendorConfigurationJob) TypeReference(com.fasterxml.jackson.core.type.TypeReference) PatternSyntaxException(java.util.regex.PatternSyntaxException) ImmutableMap(com.google.common.collect.ImmutableMap) Sets(com.google.common.collect.Sets) List(java.util.List) GNS3TopologyExtractor(org.batfish.grammar.topology.GNS3TopologyExtractor) Warnings(org.batfish.common.Warnings) Pattern(java.util.regex.Pattern) Synthesizer(org.batfish.z3.Synthesizer) PluginConsumer(org.batfish.common.plugin.PluginConsumer) SortedMap(java.util.SortedMap) MultipathInconsistencyQuerySynthesizer(org.batfish.z3.MultipathInconsistencyQuerySynthesizer) BatfishLogger(org.batfish.common.BatfishLogger) HashMap(java.util.HashMap) SimpleImmutableEntry(java.util.AbstractMap.SimpleImmutableEntry) AbstractRoute(org.batfish.datamodel.AbstractRoute) SubRange(org.batfish.datamodel.SubRange) VyosCombinedParser(org.batfish.grammar.vyos.VyosCombinedParser) Warning(org.batfish.common.Warning) Iterator(java.util.Iterator) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) GlobalTracer(io.opentracing.util.GlobalTracer) GNS3TopologyCombinedParser(org.batfish.grammar.topology.GNS3TopologyCombinedParser) ParseVendorConfigurationAnswerElement(org.batfish.datamodel.answers.ParseVendorConfigurationAnswerElement) DataPlanePluginSettings(org.batfish.common.plugin.DataPlanePluginSettings) ReportAnswerElement(org.batfish.datamodel.answers.ReportAnswerElement) Collections(java.util.Collections) CleanBatfishException(org.batfish.common.CleanBatfishException) BatfishException(org.batfish.common.BatfishException) IptablesVendorConfiguration(org.batfish.representation.iptables.IptablesVendorConfiguration) VendorConfiguration(org.batfish.vendor.VendorConfiguration) ActiveSpan(io.opentracing.ActiveSpan) HostConfiguration(org.batfish.representation.host.HostConfiguration) TreeMap(java.util.TreeMap)

Example 5 with VendorConfiguration

use of org.batfish.vendor.VendorConfiguration in project batfish by batfish.

the class ParseVendorConfigurationJob method call.

@SuppressWarnings("fallthrough")
@Override
public ParseVendorConfigurationResult call() throws Exception {
    long startTime = System.currentTimeMillis();
    long elapsedTime;
    String currentPath = _file.toAbsolutePath().toString();
    VendorConfiguration vc = null;
    BatfishCombinedParser<?, ?> combinedParser = null;
    ParserRuleContext tree = null;
    ControlPlaneExtractor extractor = null;
    ConfigurationFormat format = _format;
    _logger.infof("Processing: '%s'\n", currentPath);
    for (String s : _settings.ignoreFilesWithStrings()) {
        if (_fileText.contains(s)) {
            format = ConfigurationFormat.IGNORED;
            break;
        }
    }
    String relativePathStr = _settings.getActiveTestrigSettings().getBasePath().relativize(_file).toString();
    if (format == ConfigurationFormat.UNKNOWN) {
        format = VendorConfigurationFormatDetector.identifyConfigurationFormat(_fileText);
    }
    switch(format) {
        case EMPTY:
            _warnings.redFlag("Empty file: '" + currentPath + "'\n");
            elapsedTime = System.currentTimeMillis() - startTime;
            return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, _warnings, ParseStatus.EMPTY);
        case IGNORED:
            _warnings.pedantic("Ignored file: '" + currentPath + "'\n");
            elapsedTime = System.currentTimeMillis() - startTime;
            return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, _warnings, ParseStatus.IGNORED);
        case ARISTA:
        case CADANT:
        case CISCO_ASA:
        case CISCO_IOS:
        case CISCO_IOS_XR:
        case CISCO_NX:
        case FORCE10:
        case FOUNDRY:
            String newFileText = _fileText;
            String fileText;
            _logger.info("\tPreprocessing...");
            do {
                fileText = newFileText;
                try {
                    newFileText = preprocessBanner(fileText, format);
                } catch (BatfishException e) {
                    elapsedTime = System.currentTimeMillis() - startTime;
                    return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException("Error preprocessing banner", e));
                }
            } while (!newFileText.equals(fileText));
            _logger.info("OK\n");
            CiscoCombinedParser ciscoParser = new CiscoCombinedParser(newFileText, _settings, format);
            combinedParser = ciscoParser;
            extractor = new CiscoControlPlaneExtractor(newFileText, ciscoParser, format, _warnings, _settings.getUnrecognizedAsRedFlag());
            break;
        case HOST:
            vc = HostConfiguration.fromJson(_fileText, _warnings);
            elapsedTime = System.currentTimeMillis() - startTime;
            return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, vc, _warnings, _ptSentences);
        case VYOS:
            if (_settings.flattenOnTheFly()) {
                String msg = "Flattening: '" + currentPath + "' on-the-fly; line-numbers reported for this file will be spurious\n";
                _warnings.pedantic(msg);
                // _logger
                // .warn("Flattening: \""
                // + currentPath
                // +
                // "\" on-the-fly; line-numbers reported for this file will be
                // spurious\n");
                _fileText = Batfish.flatten(_fileText, _logger, _settings, ConfigurationFormat.VYOS, VendorConfigurationFormatDetector.BATFISH_FLATTENED_VYOS_HEADER);
            } else {
                elapsedTime = System.currentTimeMillis() - startTime;
                return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException("Vyos configurations must be flattened prior to this stage: '" + relativePathStr + "'"));
            }
        // fall through
        case FLAT_VYOS:
            FlatVyosCombinedParser flatVyosParser = new FlatVyosCombinedParser(_fileText, _settings);
            combinedParser = flatVyosParser;
            extractor = new FlatVyosControlPlaneExtractor(_fileText, flatVyosParser, _warnings);
            break;
        case JUNIPER:
            if (_settings.flattenOnTheFly()) {
                String msg = "Flattening: '" + currentPath + "' on-the-fly; line-numbers reported for this file will be spurious\n";
                _warnings.pedantic(msg);
                // spurious\n");
                try {
                    _fileText = Batfish.flatten(_fileText, _logger, _settings, ConfigurationFormat.JUNIPER, VendorConfigurationFormatDetector.BATFISH_FLATTENED_JUNIPER_HEADER);
                } catch (BatfishException e) {
                    String error = "Error flattening configuration file: '" + currentPath + "'";
                    elapsedTime = System.currentTimeMillis() - startTime;
                    return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException(error, e));
                }
            } else {
                elapsedTime = System.currentTimeMillis() - startTime;
                return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException("Juniper configurations must be flattened prior to this stage: '" + relativePathStr + "'"));
            }
        // fall through
        case FLAT_JUNIPER:
            FlatJuniperCombinedParser flatJuniperParser = new FlatJuniperCombinedParser(_fileText, _settings);
            combinedParser = flatJuniperParser;
            extractor = new FlatJuniperControlPlaneExtractor(_fileText, flatJuniperParser, _warnings, _settings.getUnrecognizedAsRedFlag());
            break;
        case IPTABLES:
            IptablesCombinedParser iptablesParser = new IptablesCombinedParser(_fileText, _settings);
            combinedParser = iptablesParser;
            extractor = new IptablesControlPlaneExtractor(_fileText, iptablesParser, _warnings, relativePathStr);
            break;
        case MRV:
            MrvCombinedParser mrvParser = new MrvCombinedParser(_fileText, _settings);
            combinedParser = mrvParser;
            extractor = new MrvControlPlaneExtractor(_fileText, mrvParser, _warnings);
            break;
        case ALCATEL_AOS:
        case AWS:
        case BLADENETWORK:
        case F5:
        case JUNIPER_SWITCH:
        case METAMAKO:
        case MRV_COMMANDS:
        case MSS:
        case VXWORKS:
            String unsupportedError = "Unsupported configuration format: '" + format + "' for file: '" + currentPath + "'\n";
            if (!_settings.ignoreUnsupported()) {
                elapsedTime = System.currentTimeMillis() - startTime;
                return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException(unsupportedError));
            } else {
                _warnings.unimplemented(unsupportedError);
                elapsedTime = System.currentTimeMillis() - startTime;
                return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, _warnings, ParseStatus.UNSUPPORTED);
            }
        case UNKNOWN:
        default:
            String unknownError = "Unknown configuration format for file: '" + currentPath + "'\n";
            if (!_settings.ignoreUnknown()) {
                elapsedTime = System.currentTimeMillis() - startTime;
                return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException(unknownError));
            } else {
                _warnings.unimplemented(unknownError);
                elapsedTime = System.currentTimeMillis() - startTime;
                return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, _warnings, ParseStatus.UNKNOWN);
            }
    }
    try {
        _logger.info("\tParsing...");
        tree = Batfish.parse(combinedParser, _logger, _settings);
        if (_settings.getPrintParseTree()) {
            _ptSentences = ParseTreePrettyPrinter.getParseTreeSentences(tree, combinedParser);
        }
        _logger.info("\tPost-processing...");
        extractor.processParseTree(tree);
        if (!combinedParser.getErrors().isEmpty()) {
            elapsedTime = System.currentTimeMillis() - startTime;
            return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException(String.format("Configuration file: '%s' contains unrecognized lines:\n%s", _file.getFileName().toString(), String.join("\n", combinedParser.getErrors()))));
        }
        _logger.info("OK\n");
    } catch (ParserBatfishException e) {
        String error = "Error parsing configuration file: '" + currentPath + "'";
        elapsedTime = System.currentTimeMillis() - startTime;
        return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException(error, e));
    } catch (Exception e) {
        String error = "Error post-processing parse tree of configuration file: '" + currentPath + "'";
        elapsedTime = System.currentTimeMillis() - startTime;
        return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, new BatfishException(error, e));
    } finally {
        Batfish.logWarnings(_logger, _warnings);
    }
    vc = extractor.getVendorConfiguration();
    vc.setVendor(format);
    vc.setFilename(_file.getFileName().toString());
    // at this point we should have a VendorConfiguration vc
    String hostname = vc.getHostname();
    if (hostname == null) {
        String error = "No hostname set in file: '" + relativePathStr.replace("\\", "/") + "'\n";
        try {
            _warnings.redFlag(error);
        } catch (BatfishException e) {
            elapsedTime = System.currentTimeMillis() - startTime;
            return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, e);
        }
        String filename = _file.getFileName().toString();
        String guessedHostname = filename.replaceAll("\\.(cfg|conf)$", "");
        _logger.redflag("\tNo hostname set! Guessing hostname from filename: '" + filename + "' ==> '" + guessedHostname + "'\n");
        vc.setHostname(guessedHostname);
    }
    elapsedTime = System.currentTimeMillis() - startTime;
    return new ParseVendorConfigurationResult(elapsedTime, _logger.getHistory(), _file, vc, _warnings, _ptSentences);
}
Also used : ParserRuleContext(org.antlr.v4.runtime.ParserRuleContext) BatfishException(org.batfish.common.BatfishException) ParserBatfishException(org.batfish.main.ParserBatfishException) FlatVyosControlPlaneExtractor(org.batfish.grammar.flatvyos.FlatVyosControlPlaneExtractor) CiscoControlPlaneExtractor(org.batfish.grammar.cisco.CiscoControlPlaneExtractor) FlatVyosCombinedParser(org.batfish.grammar.flatvyos.FlatVyosCombinedParser) IptablesCombinedParser(org.batfish.grammar.iptables.IptablesCombinedParser) CiscoCombinedParser(org.batfish.grammar.cisco.CiscoCombinedParser) MrvCombinedParser(org.batfish.grammar.mrv.MrvCombinedParser) BatfishException(org.batfish.common.BatfishException) ParserBatfishException(org.batfish.main.ParserBatfishException) ConfigurationFormat(org.batfish.datamodel.ConfigurationFormat) IptablesControlPlaneExtractor(org.batfish.grammar.iptables.IptablesControlPlaneExtractor) ParserBatfishException(org.batfish.main.ParserBatfishException) VendorConfiguration(org.batfish.vendor.VendorConfiguration) FlatJuniperCombinedParser(org.batfish.grammar.flatjuniper.FlatJuniperCombinedParser) FlatVyosControlPlaneExtractor(org.batfish.grammar.flatvyos.FlatVyosControlPlaneExtractor) CiscoControlPlaneExtractor(org.batfish.grammar.cisco.CiscoControlPlaneExtractor) ControlPlaneExtractor(org.batfish.grammar.ControlPlaneExtractor) MrvControlPlaneExtractor(org.batfish.grammar.mrv.MrvControlPlaneExtractor) IptablesControlPlaneExtractor(org.batfish.grammar.iptables.IptablesControlPlaneExtractor) FlatJuniperControlPlaneExtractor(org.batfish.grammar.flatjuniper.FlatJuniperControlPlaneExtractor) MrvControlPlaneExtractor(org.batfish.grammar.mrv.MrvControlPlaneExtractor) FlatJuniperControlPlaneExtractor(org.batfish.grammar.flatjuniper.FlatJuniperControlPlaneExtractor)

Aggregations

VendorConfiguration (org.batfish.vendor.VendorConfiguration)10 Path (java.nio.file.Path)8 BatfishException (org.batfish.common.BatfishException)7 IptablesVendorConfiguration (org.batfish.representation.iptables.IptablesVendorConfiguration)7 TreeMap (java.util.TreeMap)6 ParseVendorConfigurationAnswerElement (org.batfish.datamodel.answers.ParseVendorConfigurationAnswerElement)5 HostConfiguration (org.batfish.representation.host.HostConfiguration)5 CleanBatfishException (org.batfish.common.CleanBatfishException)4 File (java.io.File)3 ArrayList (java.util.ArrayList)3 Warnings (org.batfish.common.Warnings)3 TypeReference (com.fasterxml.jackson.core.type.TypeReference)2 Cache (com.google.common.cache.Cache)2 ActiveSpan (io.opentracing.ActiveSpan)2 IOException (java.io.IOException)2 Serializable (java.io.Serializable)2 HashMap (java.util.HashMap)2 Nullable (javax.annotation.Nullable)2 ParserRuleContext (org.antlr.v4.runtime.ParserRuleContext)2 BatfishStackTrace (org.batfish.common.BatfishException.BatfishStackTrace)2