Unify all of the Tag types into one type

- Remove tag types for each component type (analyzer, etc)
- Add deprecated versions of the old types
- Remove unnecessary tag element from templates for TaggedComponent and ComponentManager
- Enable TaggedComponent to pass an EnumType when initializing Tag objects
- Update some tests that are affected by the tag enum values changing order
This commit is contained in:
Tim Wojtulewicz 2021-09-16 12:39:46 -07:00
parent 4f9f46a0c4
commit 331161138a
46 changed files with 352 additions and 955 deletions

View file

@ -379,7 +379,7 @@ set(MAIN_SRCS
plugin/Component.cc plugin/Component.cc
plugin/ComponentManager.h plugin/ComponentManager.h
plugin/TaggedComponent.h plugin/TaggedComponent.cc
plugin/Manager.cc plugin/Manager.cc
plugin/Plugin.cc plugin/Plugin.cc

View file

@ -7,12 +7,15 @@
namespace zeek namespace zeek
{ {
const Tag Tag::Error;
Tag::Tag(type_t arg_type, subtype_t arg_subtype) : Tag(nullptr, arg_type, arg_subtype) { }
Tag::Tag(const EnumTypePtr& etype, type_t arg_type, subtype_t arg_subtype) Tag::Tag(const EnumTypePtr& etype, type_t arg_type, subtype_t arg_subtype)
: type(arg_type), subtype(arg_subtype), etype(etype)
{ {
assert(arg_type > 0); assert(arg_type > 0);
type = arg_type;
subtype = arg_subtype;
int64_t i = (int64_t)(type) | ((int64_t)subtype << 31); int64_t i = (int64_t)(type) | ((int64_t)subtype << 31);
val = etype->GetEnumVal(i); val = etype->GetEnumVal(i);
} }
@ -68,11 +71,13 @@ Tag& Tag::operator=(const Tag&& other) noexcept
return *this; return *this;
} }
const EnumValPtr& Tag::AsVal(const EnumTypePtr& etype) const const EnumValPtr& Tag::AsVal() const
{ {
// TODO: this probably isn't valid, and we should just return the null val
// if it's null.
if ( ! val ) if ( ! val )
{ {
assert(type == 0 && subtype == 0); assert(type == 0 && subtype == 0 && etype != nullptr);
val = etype->GetEnumVal(0); val = etype->GetEnumVal(0);
} }

View file

@ -4,7 +4,7 @@
#include "zeek/zeek-config.h" #include "zeek/zeek-config.h"
#include <stdint.h> #include <cstdint>
#include <string> #include <string>
#include "zeek/IntrusivePtr.h" #include "zeek/IntrusivePtr.h"
@ -14,9 +14,9 @@ namespace zeek
{ {
class EnumVal; class EnumVal;
using EnumValPtr = IntrusivePtr<EnumVal>;
class EnumType; class EnumType;
using EnumTypePtr = IntrusivePtr<EnumType>; using EnumTypePtr = IntrusivePtr<EnumType>;
using EnumValPtr = IntrusivePtr<EnumVal>;
/** /**
* Class to identify an analyzer type. * Class to identify an analyzer type.
@ -59,28 +59,53 @@ public:
*/ */
subtype_t Subtype() const { return subtype; } subtype_t Subtype() const { return subtype; }
/**
* Returns the numerical values for main and subtype inside a string
* suitable for printing. This is primarily for debugging.
*/
std::string AsString() const;
protected:
/*
* Copy constructor.
*/
Tag(const Tag& other);
/** /**
* Default constructor. This initializes the tag with an error value * Default constructor. This initializes the tag with an error value
* that will make \c operator \c bool return false. * that will make \c operator \c bool return false.
*/ */
Tag(); Tag();
/**
* Constructor.
*
* @param etype the script-layer enum type associated with the tag.
*
* @param type The main type. Note that the manager class manages the
* the value space internally, so noone else should assign main types.
*
* @param subtype The sub type, which is left to an analyzer for
* interpretation. By default it's set to zero.
*/
Tag(const EnumTypePtr& etype, type_t type, subtype_t subtype = 0);
/**
* Constructor.
*
* @param type The main type. Note that the \a analyzer::Manager
* manages the value space internally, so noone else should assign
* any main types.
*
* @param subtype The sub type, which is left to an analyzer for
* interpretation. By default it's set to zero.
*/
explicit Tag(type_t type, subtype_t subtype = 0);
/**
* Constructor.
*
* @param val An enum value of script type \c Analyzer::Tag.
*/
explicit Tag(EnumValPtr val);
/*
* Copy constructor.
*/
Tag(const Tag& other);
/** /**
* Destructor. * Destructor.
*/ */
~Tag(); virtual ~Tag();
/** /**
* Assignment operator. * Assignment operator.
@ -116,38 +141,33 @@ protected:
return type != other.type ? type < other.type : (subtype < other.subtype); return type != other.type ? type < other.type : (subtype < other.subtype);
} }
/**
* Returns the numerical values for main and subtype inside a string
* suitable for printing. This is primarily for debugging.
*/
std::string AsString() const;
/** /**
* Returns the script-layer enum that corresponds to this tag. * Returns the script-layer enum that corresponds to this tag.
* The returned value does not have its ref-count increased. * The returned value does not have its ref-count increased.
* *
* @param etype the script-layer enum type associated with the tag. * @param etype the script-layer enum type associated with the tag.
*/ */
const EnumValPtr& AsVal(const EnumTypePtr& etype) const; const EnumValPtr& AsVal() const;
/** /**
* Constructor. * Returns false if the tag represents an error value rather than a
* * legal analyzer type.
* @param etype the script-layer enum type associated with the tag.
*
* @param type The main type. Note that the manager class manages the
* the value space internally, so noone else should assign main types.
*
* @param subtype The sub type, which is left to an analyzer for
* interpretation. By default it's set to zero.
*/ */
Tag(const EnumTypePtr& etype, type_t type, subtype_t subtype = 0); explicit operator bool() const { return *this != Error; }
/** static const Tag Error;
* Constructor.
*
* @param val An enum value of script type \c Analyzer::Tag.
*/
explicit Tag(EnumValPtr val);
private: private:
type_t type; // Main type. type_t type; // Main type.
subtype_t subtype; // Subtype. subtype_t subtype; // Subtype.
mutable EnumValPtr val; // Script-layer value. mutable EnumValPtr val; // Script-layer value.
mutable EnumTypePtr etype;
}; };
} // namespace zeek } // namespace zeek

View file

@ -12,11 +12,9 @@ set(analyzer_SRCS
Analyzer.cc Analyzer.cc
Manager.cc Manager.cc
Component.cc Component.cc
Tag.cc
) )
bif_target(analyzer.bif) bif_target(analyzer.bif)
bro_add_subdir_library(analyzer ${analyzer_SRCS}) bro_add_subdir_library(analyzer ${analyzer_SRCS})
add_dependencies(bro_analyzer generate_outputs) add_dependencies(bro_analyzer generate_outputs)

View file

@ -14,7 +14,7 @@ Component::Component(const std::string& name, factory_callback arg_factory,
bool arg_adapter) bool arg_adapter)
: plugin::Component( : plugin::Component(
arg_adapter ? plugin::component::SESSION_ADAPTER : plugin::component::ANALYZER, name), arg_adapter ? plugin::component::SESSION_ADAPTER : plugin::component::ANALYZER, name),
plugin::TaggedComponent<analyzer::Tag>(arg_subtype) plugin::TaggedComponent(arg_subtype, analyzer_mgr->GetTagType())
{ {
factory = arg_factory; factory = arg_factory;
enabled = arg_enabled; enabled = arg_enabled;

View file

@ -25,7 +25,7 @@ class Analyzer;
* A plugin can provide a specific protocol analyzer by registering this * A plugin can provide a specific protocol analyzer by registering this
* analyzer component, describing the analyzer. * analyzer component, describing the analyzer.
*/ */
class Component : public plugin::Component, public plugin::TaggedComponent<analyzer::Tag> class Component : public plugin::Component, public plugin::TaggedComponent
{ {
public: public:
using factory_callback = Analyzer* (*)(Connection* conn); using factory_callback = Analyzer* (*)(Connection* conn);

View file

@ -56,9 +56,7 @@ bool Manager::ConnIndex::operator<(const ConnIndex& other) const
return false; return false;
} }
Manager::Manager() : plugin::ComponentManager<analyzer::Tag, analyzer::Component>("Analyzer", "Tag") Manager::Manager() : plugin::ComponentManager<analyzer::Component>("Analyzer", "Tag") { }
{
}
Manager::~Manager() Manager::~Manager()
{ {

View file

@ -56,7 +56,7 @@ namespace analyzer
* respecting well-known ports, and tracking any analyzers specifically * respecting well-known ports, and tracking any analyzers specifically
* scheduled for individidual connections. * scheduled for individidual connections.
*/ */
class Manager : public plugin::ComponentManager<Tag, Component> class Manager : public plugin::ComponentManager<Component>
{ {
public: public:
/** /**

View file

@ -1,27 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/analyzer/Tag.h"
#include "zeek/analyzer/Manager.h"
namespace zeek::analyzer
{
const Tag Tag::Error;
Tag::Tag(type_t type, subtype_t subtype) : zeek::Tag(analyzer_mgr->GetTagType(), type, subtype) { }
Tag& Tag::operator=(const Tag& other)
{
zeek::Tag::operator=(other);
return *this;
}
const EnumValPtr& Tag::AsVal() const
{
return zeek::Tag::AsVal(analyzer_mgr->GetTagType());
}
Tag::Tag(EnumValPtr val) : zeek::Tag(std::move(val)) { }
} // namespace zeek::analyzer

View file

@ -1,4 +1,3 @@
// See the file "COPYING" in the main distribution directory for copyright. // See the file "COPYING" in the main distribution directory for copyright.
#pragma once #pragma once
@ -7,109 +6,9 @@
#include "zeek/Tag.h" #include "zeek/Tag.h"
namespace zeek namespace zeek::analyzer
{ {
class EnumVal; using Tag [[deprecated("Remove in v5.1. Use zeek::Tag.")]] = zeek::Tag;
namespace plugin } // namespace zeek::analyzer
{
template <class T> class TaggedComponent;
template <class T, class C> class ComponentManager;
} // namespace plugin
namespace analyzer
{
class Manager;
class Component;
/**
* Class to identify a protocol analyzer type.
*
* The script-layer analogue is Analyzer::Tag.
*/
class Tag : public zeek::Tag
{
public:
/*
* Copy constructor.
*/
Tag(const Tag& other) : zeek::Tag(other) { }
/**
* Default constructor. This initializes the tag with an error value
* that will make \c operator \c bool return false.
*/
Tag() : zeek::Tag() { }
/**
* Destructor.
*/
~Tag() { }
/**
* Returns false if the tag represents an error value rather than a
* legal analyzer type.
*/
explicit operator bool() const { return *this != Error; }
/**
* Assignment operator.
*/
Tag& operator=(const Tag& other);
/**
* Compares two tags for equality.
*/
bool operator==(const Tag& other) const { return zeek::Tag::operator==(other); }
/**
* Compares two tags for inequality.
*/
bool operator!=(const Tag& other) const { return zeek::Tag::operator!=(other); }
/**
* Compares two tags for less-than relationship.
*/
bool operator<(const Tag& other) const { return zeek::Tag::operator<(other); }
/**
* Returns the \c Analyzer::Tag enum that corresponds to this tag.
* The returned value does not have its ref-count increased.
*
* @param etype the script-layer enum type associated with the tag.
*/
const EnumValPtr& AsVal() const;
static const Tag Error;
protected:
friend class analyzer::Manager;
friend class plugin::ComponentManager<Tag, Component>;
friend class plugin::TaggedComponent<Tag>;
/**
* Constructor.
*
* @param type The main type. Note that the \a analyzer::Manager
* manages the value space internally, so noone else should assign
* any main types.
*
* @param subtype The sub type, which is left to an analyzer for
* interpretation. By default it's set to zero.
*/
explicit Tag(type_t type, subtype_t subtype = 0);
/**
* Constructor.
*
* @param val An enum value of script type \c Analyzer::Tag.
*/
explicit Tag(EnumValPtr val);
};
} // namespace analyzer
} // namespace zeek

View file

@ -15,7 +15,6 @@ set(file_analysis_SRCS
Analyzer.cc Analyzer.cc
AnalyzerSet.cc AnalyzerSet.cc
Component.cc Component.cc
Tag.cc
) )
bif_target(file_analysis.bif) bif_target(file_analysis.bif)

View file

@ -11,8 +11,9 @@ namespace zeek::file_analysis
Component::Component(const std::string& name, factory_function arg_factory, Tag::subtype_t subtype, Component::Component(const std::string& name, factory_function arg_factory, Tag::subtype_t subtype,
bool arg_enabled) bool arg_enabled)
: plugin::Component(plugin::component::FILE_ANALYZER, name), : plugin::Component(plugin::component::FILE_ANALYZER, name), plugin::TaggedComponent(
plugin::TaggedComponent<file_analysis::Tag>(subtype) subtype,
file_mgr->GetTagType())
{ {
factory_func = arg_factory; factory_func = arg_factory;
enabled = arg_enabled; enabled = arg_enabled;

View file

@ -27,7 +27,7 @@ class Manager;
* A plugin can provide a specific file analyzer by registering this * A plugin can provide a specific file analyzer by registering this
* analyzer component, describing the analyzer. * analyzer component, describing the analyzer.
*/ */
class Component : public plugin::Component, public plugin::TaggedComponent<file_analysis::Tag> class Component : public plugin::Component, public plugin::TaggedComponent
{ {
public: public:
using factory_function = Analyzer* (*)(RecordValPtr args, File* file); using factory_function = Analyzer* (*)(RecordValPtr args, File* file);

View file

@ -27,7 +27,6 @@ namespace file_analysis
{ {
class FileReassembler; class FileReassembler;
class Tag;
/** /**
* Wrapper class around \c fa_file record values from script layer. * Wrapper class around \c fa_file record values from script layer.

View file

@ -19,8 +19,8 @@ namespace zeek::file_analysis
{ {
Manager::Manager() Manager::Manager()
: plugin::ComponentManager<file_analysis::Tag, file_analysis::Component>("Files", "Tag"), : plugin::ComponentManager<file_analysis::Component>("Files", "Tag"), current_file_id(),
current_file_id(), magic_state(), cumulative_files(0), max_files(0) magic_state(), cumulative_files(0), max_files(0)
{ {
} }

View file

@ -23,7 +23,6 @@ namespace analyzer
{ {
class Analyzer; class Analyzer;
class Tag;
} // namespace analyzer } // namespace analyzer
@ -31,12 +30,11 @@ namespace file_analysis
{ {
class File; class File;
class Tag;
/** /**
* Main entry point for interacting with file analysis. * Main entry point for interacting with file analysis.
*/ */
class Manager : public plugin::ComponentManager<Tag, Component> class Manager : public plugin::ComponentManager<Component>
{ {
public: public:
/** /**

View file

@ -1,27 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/file_analysis/Tag.h"
#include "zeek/file_analysis/Manager.h"
namespace zeek::file_analysis
{
const Tag Tag::Error;
Tag::Tag(type_t type, subtype_t subtype) : zeek::Tag(file_mgr->GetTagType(), type, subtype) { }
Tag& Tag::operator=(const Tag& other)
{
zeek::Tag::operator=(other);
return *this;
}
const EnumValPtr& Tag::AsVal() const
{
return zeek::Tag::AsVal(file_mgr->GetTagType());
}
Tag::Tag(EnumValPtr val) : zeek::Tag(std::move(val)) { }
} // namespace zeek::file_analysis

View file

@ -6,105 +6,9 @@
#include "zeek/Tag.h" #include "zeek/Tag.h"
namespace zeek::plugin namespace zeek::file_analysis
{
template <class T> class TaggedComponent;
template <class T, class C> class ComponentManager;
}
namespace zeek
{ {
class EnumVal; using Tag [[deprecated("Remove in v5.1. Use zeek::Tag.")]] = zeek::Tag;
namespace file_analysis } // namespace zeek::file_analysis
{
class Component;
/**
* Class to identify a file analyzer type.
*
* The script-layer analogue is Files::Tag.
*/
class Tag : public zeek::Tag
{
public:
/*
* Copy constructor.
*/
Tag(const Tag& other) : zeek::Tag(other) { }
/**
* Default constructor. This initializes the tag with an error value
* that will make \c operator \c bool return false.
*/
Tag() : zeek::Tag() { }
/**
* Destructor.
*/
~Tag() { }
/**
* Returns false if the tag represents an error value rather than a
* legal analyzer type.
*/
explicit operator bool() const { return *this != Error; }
/**
* Assignment operator.
*/
Tag& operator=(const Tag& other);
/**
* Compares two tags for equality.
*/
bool operator==(const Tag& other) const { return zeek::Tag::operator==(other); }
/**
* Compares two tags for inequality.
*/
bool operator!=(const Tag& other) const { return zeek::Tag::operator!=(other); }
/**
* Compares two tags for less-than relationship.
*/
bool operator<(const Tag& other) const { return zeek::Tag::operator<(other); }
/**
* Returns the \c Files::Tag enum that corresponds to this tag.
* The returned value does not have its ref-count increased.
*
* @param etype the script-layer enum type associated with the tag.
*/
const EnumValPtr& AsVal() const;
static const Tag Error;
protected:
friend class plugin::ComponentManager<Tag, Component>;
friend class plugin::TaggedComponent<Tag>;
/**
* Constructor.
*
* @param type The main type. Note that the \a file_analysis::Manager
* manages the value space internally, so noone else should assign
* main types.
*
* @param subtype The sub type, which is left to an analyzer for
* interpretation. By default it's set to zero.
*/
explicit Tag(type_t type, subtype_t subtype = 0);
/**
* Constructor.
*
* @param val An enum value of script type \c Files::Tag.
*/
explicit Tag(EnumValPtr val);
};
} // namespace file_analysis
} // namespace zeek

View file

@ -23,7 +23,6 @@ namespace file_analysis
{ {
class File; class File;
class Tag;
namespace detail namespace detail
{ {

View file

@ -13,11 +13,9 @@ set(input_SRCS
Manager.cc Manager.cc
ReaderBackend.cc ReaderBackend.cc
ReaderFrontend.cc ReaderFrontend.cc
Tag.cc
) )
bif_target(input.bif) bif_target(input.bif)
bro_add_subdir_library(input ${input_SRCS}) bro_add_subdir_library(input ${input_SRCS})
add_dependencies(bro_input generate_outputs) add_dependencies(bro_input generate_outputs)

View file

@ -10,7 +10,8 @@ namespace zeek::input
{ {
Component::Component(const std::string& name, factory_callback arg_factory) Component::Component(const std::string& name, factory_callback arg_factory)
: plugin::Component(plugin::component::READER, name) : plugin::Component(plugin::component::READER, name), plugin::TaggedComponent(
0, input_mgr->GetTagType())
{ {
factory = arg_factory; factory = arg_factory;
} }

View file

@ -15,7 +15,7 @@ class ReaderBackend;
/** /**
* Component description for plugins providing log readers. * Component description for plugins providing log readers.
*/ */
class Component : public plugin::Component, public plugin::TaggedComponent<Tag> class Component : public plugin::Component, public plugin::TaggedComponent
{ {
public: public:
using factory_callback = ReaderBackend* (*)(ReaderFrontend* frontend); using factory_callback = ReaderBackend* (*)(ReaderFrontend* frontend);

View file

@ -179,7 +179,7 @@ Manager::AnalysisStream::AnalysisStream() : Manager::Stream::Stream(ANALYSIS_STR
Manager::AnalysisStream::~AnalysisStream() { } Manager::AnalysisStream::~AnalysisStream() { }
Manager::Manager() : plugin::ComponentManager<input::Tag, input::Component>("Input", "Reader") Manager::Manager() : plugin::ComponentManager<input::Component>("Input", "Reader")
{ {
end_of_data = event_registry->Register("Input::end_of_data"); end_of_data = event_registry->Register("Input::end_of_data");
} }

View file

@ -26,7 +26,7 @@ class ReaderBackend;
/** /**
* Singleton class for managing input streams. * Singleton class for managing input streams.
*/ */
class Manager : public plugin::ComponentManager<Tag, Component> class Manager : public plugin::ComponentManager<Component>
{ {
public: public:
/** /**

View file

@ -1,27 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/input/Tag.h"
#include "zeek/input/Manager.h"
namespace zeek::input
{
const Tag Tag::Error;
Tag::Tag(type_t type, subtype_t subtype) : zeek::Tag(input_mgr->GetTagType(), type, subtype) { }
Tag& Tag::operator=(const Tag& other)
{
zeek::Tag::operator=(other);
return *this;
}
const EnumValPtr& Tag::AsVal() const
{
return zeek::Tag::AsVal(input_mgr->GetTagType());
}
Tag::Tag(EnumValPtr val) : zeek::Tag(std::move(val)) { }
} // namespace zeek::input

View file

@ -6,108 +6,9 @@
#include "zeek/Tag.h" #include "zeek/Tag.h"
namespace zeek namespace zeek::input
{ {
class EnumVal; using Tag [[deprecated("Remove in v5.1. Use zeek::Tag.")]] = zeek::Tag;
namespace plugin } // namespace zeek::input
{
template <class T> class TaggedComponent;
template <class T, class C> class ComponentManager;
} // namespace plugin
namespace input
{
class Manager;
class Component;
/**
* Class to identify a reader type.
*
* The script-layer analogue is Input::Reader.
*/
class Tag : public zeek::Tag
{
public:
/*
* Copy constructor.
*/
Tag(const Tag& other) : zeek::Tag(other) { }
/**
* Default constructor. This initializes the tag with an error value
* that will make \c operator \c bool return false.
*/
Tag() : zeek::Tag() { }
/**
* Destructor.
*/
~Tag() { }
/**
* Returns false if the tag represents an error value rather than a
* legal reader type.
*/
explicit operator bool() const { return *this != Error; }
/**
* Assignment operator.
*/
Tag& operator=(const Tag& other);
/**
* Compares two tags for equality.
*/
bool operator==(const Tag& other) const { return zeek::Tag::operator==(other); }
/**
* Compares two tags for inequality.
*/
bool operator!=(const Tag& other) const { return zeek::Tag::operator!=(other); }
/**
* Compares two tags for less-than relationship.
*/
bool operator<(const Tag& other) const { return zeek::Tag::operator<(other); }
/**
* Returns the \c Input::Reader enum that corresponds to this tag.
* The returned value does not have its ref-count increased.
*
* @param etype the script-layer enum type associated with the tag.
*/
const EnumValPtr& AsVal() const;
static const Tag Error;
protected:
friend class plugin::ComponentManager<Tag, Component>;
friend class plugin::TaggedComponent<Tag>;
/**
* Constructor.
*
* @param type The main type. Note that the \a input::Manager
* manages the value space internally, so noone else should assign
* any main types.
*
* @param subtype The sub type, which is left to an reader for
* interpretation. By default it's set to zero.
*/
explicit Tag(type_t type, subtype_t subtype = 0);
/**
* Constructor.
*
* @param val An enum value of script type \c Input::Reader.
*/
explicit Tag(EnumValPtr val);
};
} // namespace input
} // namespace zeek

View file

@ -15,11 +15,9 @@ set(logging_SRCS
Manager.cc Manager.cc
WriterBackend.cc WriterBackend.cc
WriterFrontend.cc WriterFrontend.cc
Tag.cc
) )
bif_target(logging.bif) bif_target(logging.bif)
bro_add_subdir_library(logging ${logging_SRCS}) bro_add_subdir_library(logging ${logging_SRCS})
add_dependencies(bro_logging generate_outputs) add_dependencies(bro_logging generate_outputs)

View file

@ -10,7 +10,8 @@ namespace zeek::logging
{ {
Component::Component(const std::string& name, factory_callback arg_factory) Component::Component(const std::string& name, factory_callback arg_factory)
: plugin::Component(plugin::component::WRITER, name) : plugin::Component(plugin::component::WRITER, name), plugin::TaggedComponent(
0, log_mgr->GetTagType())
{ {
factory = arg_factory; factory = arg_factory;
} }

View file

@ -15,7 +15,7 @@ class WriterBackend;
/** /**
* Component description for plugins providing log writers. * Component description for plugins providing log writers.
*/ */
class Component : public plugin::Component, public plugin::TaggedComponent<logging::Tag> class Component : public plugin::Component, public plugin::TaggedComponent
{ {
public: public:
using factory_callback = WriterBackend* (*)(WriterFrontend* frontend); using factory_callback = WriterBackend* (*)(WriterFrontend* frontend);

View file

@ -132,7 +132,7 @@ Manager::Stream::~Stream()
delete *f; delete *f;
} }
Manager::Manager() : plugin::ComponentManager<logging::Tag, logging::Component>("Log", "Writer") Manager::Manager() : plugin::ComponentManager<logging::Component>("Log", "Writer")
{ {
rotations_pending = 0; rotations_pending = 0;
} }

View file

@ -36,7 +36,7 @@ class RotationTimer;
/** /**
* Singleton class for managing log streams. * Singleton class for managing log streams.
*/ */
class Manager : public plugin::ComponentManager<Tag, Component> class Manager : public plugin::ComponentManager<Component>
{ {
public: public:
/** /**

View file

@ -1,33 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/logging/Tag.h"
#include "zeek/logging/Manager.h"
namespace zeek::logging
{
const Tag Tag::Error;
Tag::Tag(type_t type, subtype_t subtype) : zeek::Tag(log_mgr->GetTagType(), type, subtype) { }
Tag& Tag::operator=(const Tag& other)
{
zeek::Tag::operator=(other);
return *this;
}
Tag& Tag::operator=(const Tag&& other) noexcept
{
zeek::Tag::operator=(other);
return *this;
}
const EnumValPtr& Tag::AsVal() const
{
return zeek::Tag::AsVal(log_mgr->GetTagType());
}
Tag::Tag(EnumValPtr val) : zeek::Tag(std::move(val)) { }
} // namespace zeek::logging

View file

@ -6,113 +6,9 @@
#include "zeek/Tag.h" #include "zeek/Tag.h"
namespace zeek namespace zeek::logging
{ {
class EnumVal; using Tag [[deprecated("Remove in v5.1. Use zeek::Tag.")]] = zeek::Tag;
namespace plugin } // namespace zeek::logging
{
template <class T> class TaggedComponent;
template <class T, class C> class ComponentManager;
} // namespace plugin
namespace logging
{
class Manager;
class Component;
/**
* Class to identify a writer type.
*
* The script-layer analogue is Log::Writer.
*/
class Tag : public zeek::Tag
{
public:
/*
* Copy constructor.
*/
Tag(const Tag& other) : zeek::Tag(other) { }
/**
* Default constructor. This initializes the tag with an error value
* that will make \c operator \c bool return false.
*/
Tag() : zeek::Tag() { }
/**
* Destructor.
*/
~Tag() { }
/**
* Returns false if the tag represents an error value rather than a
* legal writer type.
*/
explicit operator bool() const { return *this != Error; }
/**
* Assignment operator.
*/
Tag& operator=(const Tag& other);
/**
* Move assignment operator.
*/
Tag& operator=(const Tag&& other) noexcept;
/**
* Compares two tags for equality.
*/
bool operator==(const Tag& other) const { return zeek::Tag::operator==(other); }
/**
* Compares two tags for inequality.
*/
bool operator!=(const Tag& other) const { return zeek::Tag::operator!=(other); }
/**
* Compares two tags for less-than relationship.
*/
bool operator<(const Tag& other) const { return zeek::Tag::operator<(other); }
/**
* Returns the \c Log::Writer enum that corresponds to this tag.
* The returned value does not have its ref-count increased.
*
* @param etype the script-layer enum type associated with the tag.
*/
const EnumValPtr& AsVal() const;
static const Tag Error;
protected:
friend class plugin::ComponentManager<Tag, Component>;
friend class plugin::TaggedComponent<Tag>;
/**
* Constructor.
*
* @param type The main type. Note that the \a logging::Manager
* manages the value space internally, so noone else should assign
* any main types.
*
* @param subtype The sub type, which is left to an writer for
* interpretation. By default it's set to zero.
*/
explicit Tag(type_t type, subtype_t subtype = 0);
/**
* Constructor.
*
* @param val An enum value of script type \c Log::Writer.
*/
explicit Tag(EnumValPtr val);
};
} // namespace logging
} // namespace zeek

View file

@ -13,7 +13,6 @@ set(packet_analysis_SRCS
Dispatcher.cc Dispatcher.cc
Manager.cc Manager.cc
Component.cc Component.cc
Tag.cc
) )
bro_add_subdir_library(packet_analysis ${packet_analysis_SRCS}) bro_add_subdir_library(packet_analysis ${packet_analysis_SRCS})

View file

@ -9,8 +9,9 @@ using namespace zeek::packet_analysis;
Component::Component(const std::string& name, factory_callback arg_factory, Component::Component(const std::string& name, factory_callback arg_factory,
Tag::subtype_t arg_subtype) Tag::subtype_t arg_subtype)
: plugin::Component(plugin::component::PACKET_ANALYZER, name), : plugin::Component(plugin::component::PACKET_ANALYZER, name), plugin::TaggedComponent(
plugin::TaggedComponent<packet_analysis::Tag>(arg_subtype) arg_subtype,
packet_mgr->GetTagType())
{ {
factory = arg_factory; factory = arg_factory;
} }

View file

@ -17,7 +17,7 @@ namespace zeek::packet_analysis
class Analyzer; class Analyzer;
using AnalyzerPtr = std::shared_ptr<Analyzer>; using AnalyzerPtr = std::shared_ptr<Analyzer>;
class Component : public plugin::Component, public plugin::TaggedComponent<packet_analysis::Tag> class Component : public plugin::Component, public plugin::TaggedComponent
{ {
public: public:
using factory_callback = std::function<AnalyzerPtr()>; using factory_callback = std::function<AnalyzerPtr()>;

View file

@ -13,9 +13,7 @@
using namespace zeek::packet_analysis; using namespace zeek::packet_analysis;
Manager::Manager() Manager::Manager() : plugin::ComponentManager<packet_analysis::Component>("PacketAnalyzer", "Tag")
: plugin::ComponentManager<packet_analysis::Tag, packet_analysis::Component>("PacketAnalyzer",
"Tag")
{ {
} }

View file

@ -29,7 +29,7 @@ namespace packet_analysis
class Analyzer; class Analyzer;
using AnalyzerPtr = std::shared_ptr<Analyzer>; using AnalyzerPtr = std::shared_ptr<Analyzer>;
class Manager : public plugin::ComponentManager<Tag, Component> class Manager : public plugin::ComponentManager<Component>
{ {
public: public:
/** /**

View file

@ -1,27 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/packet_analysis/Tag.h"
#include "zeek/packet_analysis/Manager.h"
namespace zeek::packet_analysis
{
Tag Tag::Error;
Tag::Tag(type_t type, subtype_t subtype) : zeek::Tag(packet_mgr->GetTagType(), type, subtype) { }
Tag& Tag::operator=(const Tag& other)
{
zeek::Tag::operator=(other);
return *this;
}
const IntrusivePtr<EnumVal>& Tag::AsVal() const
{
return zeek::Tag::AsVal(packet_mgr->GetTagType());
}
Tag::Tag(IntrusivePtr<EnumVal> val) : zeek::Tag(std::move(val)) { }
}

View file

@ -6,99 +6,9 @@
#include "zeek/Tag.h" #include "zeek/Tag.h"
namespace zeek::plugin
{
template <class T> class TaggedComponent;
template <class T, class C> class ComponentManager;
}
namespace zeek::packet_analysis namespace zeek::packet_analysis
{ {
class Manager; using Tag [[deprecated("Remove in v5.1. Use zeek::Tag.")]] = zeek::Tag;
class Component;
/** } // namespace zeek::packet_analysis
* Class to identify a protocol analyzer type.
*/
class Tag : public zeek::Tag
{
public:
/*
* Copy constructor.
*/
Tag(const Tag& other) : zeek::Tag(other) { }
/**
* Default constructor. This initializes the tag with an error value
* that will make \c operator \c bool return false.
*/
Tag() : zeek::Tag() { }
/**
* Destructor.
*/
~Tag() = default;
/**
* Returns false if the tag represents an error value rather than a
* legal analyzer type.
*/
explicit operator bool() const { return *this != Tag(); }
/**
* Assignment operator.
*/
Tag& operator=(const Tag& other);
/**
* Compares two tags for equality.
*/
bool operator==(const Tag& other) const { return zeek::Tag::operator==(other); }
/**
* Compares two tags for inequality.
*/
bool operator!=(const Tag& other) const { return zeek::Tag::operator!=(other); }
/**
* Compares two tags for less-than relationship.
*/
bool operator<(const Tag& other) const { return zeek::Tag::operator<(other); }
/**
* Returns the \c Analyzer::Tag enum that corresponds to this tag.
* The returned value does not have its ref-count increased.
*
* @param etype the script-layer enum type associated with the tag.
*/
const IntrusivePtr<EnumVal>& AsVal() const;
static Tag Error;
protected:
friend class packet_analysis::Manager;
friend class plugin::ComponentManager<Tag, Component>;
friend class plugin::TaggedComponent<Tag>;
/**
* Constructor.
*
* @param type The main type. Note that the \a zeek::packet_analysis::Manager
* manages the value space internally, so noone else should assign any main
* types.
*
* @param subtype The sub type, which is left to an analyzer for
* interpretation. By default it's set to zero.
*/
explicit Tag(type_t type, subtype_t subtype = 0);
/**
* Constructor.
*
* @param val An enum value of script type \c Analyzer::Tag.
*/
explicit Tag(IntrusivePtr<EnumVal> val);
};
}

View file

@ -7,6 +7,7 @@
#include "zeek/DebugLogger.h" #include "zeek/DebugLogger.h"
#include "zeek/Reporter.h" #include "zeek/Reporter.h"
#include "zeek/Scope.h" #include "zeek/Scope.h"
#include "zeek/Tag.h"
#include "zeek/Type.h" #include "zeek/Type.h"
#include "zeek/Val.h" #include "zeek/Val.h"
#include "zeek/Var.h" // for add_type() #include "zeek/Var.h" // for add_type()
@ -20,10 +21,9 @@ namespace zeek::plugin
* installs identifiers in the script-layer to identify them by a unique tag, * installs identifiers in the script-layer to identify them by a unique tag,
* (a script-layer enum value). * (a script-layer enum value).
* *
* @tparam T A ::Tag type or derivative.
* @tparam C A plugin::TaggedComponent type derivative. * @tparam C A plugin::TaggedComponent type derivative.
*/ */
template <class T, class C> class ComponentManager template <class C> class ComponentManager
{ {
public: public:
/** /**
@ -59,7 +59,7 @@ public:
* @param tag A component's tag. * @param tag A component's tag.
* @return The canonical component name. * @return The canonical component name.
*/ */
const std::string& GetComponentName(T tag) const; const std::string& GetComponentName(zeek::Tag tag) const;
/** /**
* Get a component name from it's enum value. * Get a component name from it's enum value.
@ -76,7 +76,7 @@ public:
* @return The component's tag, or a tag representing an error if * @return The component's tag, or a tag representing an error if
* no such component assoicated with the name exists. * no such component assoicated with the name exists.
*/ */
T GetComponentTag(const std::string& name) const; zeek::Tag GetComponentTag(const std::string& name) const;
/** /**
* Get a component tag from its enum value. * Get a component tag from its enum value.
@ -85,7 +85,7 @@ public:
* @return The component's tag, or a tag representing an error if * @return The component's tag, or a tag representing an error if
* no such component assoicated with the value exists. * no such component assoicated with the value exists.
*/ */
T GetComponentTag(Val* v) const; zeek::Tag GetComponentTag(Val* v) const;
/** /**
* Add a component the internal maps used to keep track of it and create * Add a component the internal maps used to keep track of it and create
@ -110,7 +110,7 @@ public:
* @return The component associated with the tag or a null pointer if no * @return The component associated with the tag or a null pointer if no
* such component exists. * such component exists.
*/ */
C* Lookup(const T& tag) const; C* Lookup(const zeek::Tag& tag) const;
/** /**
* @param name A component's enum value. * @param name A component's enum value.
@ -123,12 +123,12 @@ private:
std::string module; /**< Script layer module in which component tags live. */ std::string module; /**< Script layer module in which component tags live. */
EnumTypePtr tag_enum_type; /**< Enum type of component tags. */ EnumTypePtr tag_enum_type; /**< Enum type of component tags. */
std::map<std::string, C*> components_by_name; std::map<std::string, C*> components_by_name;
std::map<T, C*> components_by_tag; std::map<zeek::Tag, C*> components_by_tag;
std::map<int, C*> components_by_val; std::map<int, C*> components_by_val;
}; };
template <class T, class C> template <class C>
ComponentManager<T, C>::ComponentManager(const std::string& arg_module, const std::string& local_id) ComponentManager<C>::ComponentManager(const std::string& arg_module, const std::string& local_id)
: module(arg_module), tag_enum_type(make_intrusive<EnumType>(module + "::" + local_id)) : module(arg_module), tag_enum_type(make_intrusive<EnumType>(module + "::" + local_id))
{ {
auto id = zeek::detail::install_ID(local_id.c_str(), module.c_str(), true, true); auto id = zeek::detail::install_ID(local_id.c_str(), module.c_str(), true, true);
@ -136,15 +136,15 @@ ComponentManager<T, C>::ComponentManager(const std::string& arg_module, const st
zeek::detail::zeekygen_mgr->Identifier(std::move(id)); zeek::detail::zeekygen_mgr->Identifier(std::move(id));
} }
template <class T, class C> const std::string& ComponentManager<T, C>::GetModule() const template <class C> const std::string& ComponentManager<C>::GetModule() const
{ {
return module; return module;
} }
template <class T, class C> std::list<C*> ComponentManager<T, C>::GetComponents() const template <class C> std::list<C*> ComponentManager<C>::GetComponents() const
{ {
std::list<C*> rval; std::list<C*> rval;
typename std::map<T, C*>::const_iterator i; typename std::map<zeek::Tag, C*>::const_iterator i;
for ( i = components_by_tag.begin(); i != components_by_tag.end(); ++i ) for ( i = components_by_tag.begin(); i != components_by_tag.end(); ++i )
rval.push_back(i->second); rval.push_back(i->second);
@ -152,12 +152,12 @@ template <class T, class C> std::list<C*> ComponentManager<T, C>::GetComponents(
return rval; return rval;
} }
template <class T, class C> const EnumTypePtr& ComponentManager<T, C>::GetTagType() const template <class C> const EnumTypePtr& ComponentManager<C>::GetTagType() const
{ {
return tag_enum_type; return tag_enum_type;
} }
template <class T, class C> const std::string& ComponentManager<T, C>::GetComponentName(T tag) const template <class C> const std::string& ComponentManager<C>::GetComponentName(zeek::Tag tag) const
{ {
static const std::string error = "<error>"; static const std::string error = "<error>";
@ -173,45 +173,44 @@ template <class T, class C> const std::string& ComponentManager<T, C>::GetCompon
return error; return error;
} }
template <class T, class C> template <class C> const std::string& ComponentManager<C>::GetComponentName(EnumValPtr val) const
const std::string& ComponentManager<T, C>::GetComponentName(EnumValPtr val) const
{ {
return GetComponentName(T(std::move(val))); return GetComponentName(zeek::Tag(std::move(val)));
} }
template <class T, class C> T ComponentManager<T, C>::GetComponentTag(const std::string& name) const template <class C> zeek::Tag ComponentManager<C>::GetComponentTag(const std::string& name) const
{ {
C* c = Lookup(name); C* c = Lookup(name);
return c ? c->Tag() : T(); return c ? c->Tag() : zeek::Tag();
} }
template <class T, class C> T ComponentManager<T, C>::GetComponentTag(Val* v) const template <class C> zeek::Tag ComponentManager<C>::GetComponentTag(Val* v) const
{ {
C* c = Lookup(v->AsEnumVal()); C* c = Lookup(v->AsEnumVal());
return c ? c->Tag() : T(); return c ? c->Tag() : zeek::Tag();
} }
template <class T, class C> C* ComponentManager<T, C>::Lookup(const std::string& name) const template <class C> C* ComponentManager<C>::Lookup(const std::string& name) const
{ {
typename std::map<std::string, C*>::const_iterator i = components_by_name.find( typename std::map<std::string, C*>::const_iterator i = components_by_name.find(
util::to_upper(name)); util::to_upper(name));
return i != components_by_name.end() ? i->second : 0; return i != components_by_name.end() ? i->second : 0;
} }
template <class T, class C> C* ComponentManager<T, C>::Lookup(const T& tag) const template <class C> C* ComponentManager<C>::Lookup(const zeek::Tag& tag) const
{ {
typename std::map<T, C*>::const_iterator i = components_by_tag.find(tag); typename std::map<zeek::Tag, C*>::const_iterator i = components_by_tag.find(tag);
return i != components_by_tag.end() ? i->second : 0; return i != components_by_tag.end() ? i->second : 0;
} }
template <class T, class C> C* ComponentManager<T, C>::Lookup(EnumVal* val) const template <class C> C* ComponentManager<C>::Lookup(EnumVal* val) const
{ {
typename std::map<int, C*>::const_iterator i = components_by_val.find(val->InternalInt()); typename std::map<int, C*>::const_iterator i = components_by_val.find(val->InternalInt());
return i != components_by_val.end() ? i->second : 0; return i != components_by_val.end() ? i->second : 0;
} }
template <class T, class C> template <class C>
void ComponentManager<T, C>::RegisterComponent(C* component, const std::string& prefix) void ComponentManager<C>::RegisterComponent(C* component, const std::string& prefix)
{ {
std::string cname = component->CanonicalName(); std::string cname = component->CanonicalName();

View file

@ -0,0 +1,36 @@
#include "zeek/plugin/TaggedComponent.h"
#include "zeek/IntrusivePtr.h"
#include "zeek/Type.h"
namespace zeek::plugin
{
Tag::type_t TaggedComponent::type_counter(0);
TaggedComponent::TaggedComponent(Tag::subtype_t subtype, EnumTypePtr etype)
: tag(etype, 1, 0), subtype(subtype), initialized(false), etype(std::move(etype))
{
}
/**
* Initializes tag by creating the unique tag value for thos componend.
* Has to be called exactly once.
*/
void TaggedComponent::InitializeTag()
{
assert(initialized == false);
initialized = true;
tag = zeek::Tag(etype, ++type_counter, subtype);
}
/**
* @return The component's tag.
*/
zeek::Tag TaggedComponent::Tag() const
{
assert(initialized);
return tag;
}
} // namespace zeek::plugin

View file

@ -2,15 +2,16 @@
#include <cassert> #include <cassert>
#include "zeek/Tag.h"
#include "zeek/Type.h"
namespace zeek::plugin namespace zeek::plugin
{ {
/** /**
* A class which has a tag of a given type associated with it. * A class which has a tag of a given type associated with it.
*
* @tparam T A ::Tag type or derivative.
*/ */
template <class T> class TaggedComponent class TaggedComponent
{ {
public: public:
/** /**
@ -24,7 +25,7 @@ public:
* and component instances can accordingly access it via Tag(). * and component instances can accordingly access it via Tag().
* If not used, leave at zero. * If not used, leave at zero.
*/ */
explicit TaggedComponent(typename T::subtype_t subtype = 0); explicit TaggedComponent(Tag::subtype_t subtype = 0, zeek::EnumTypePtr etype = nullptr);
/** /**
* Initializes tag by creating the unique tag value for thos componend. * Initializes tag by creating the unique tag value for thos componend.
@ -35,36 +36,15 @@ public:
/** /**
* @return The component's tag. * @return The component's tag.
*/ */
T Tag() const; zeek::Tag Tag() const;
private: private:
T tag; /**< The automatically assigned analyzer tag. */ zeek::Tag tag; /**< The automatically assigned analyzer tag. */
typename T::subtype_t subtype; Tag::subtype_t subtype;
bool initialized; bool initialized;
static typename T::type_t type_counter; /**< Used to generate globally EnumTypePtr etype;
static Tag::type_t type_counter; /**< Used to generate globally
unique tags. */ unique tags. */
}; };
template <class T> TaggedComponent<T>::TaggedComponent(typename T::subtype_t subtype)
{
tag = T(1, 0);
this->subtype = subtype;
initialized = false;
}
template <class T> void TaggedComponent<T>::InitializeTag()
{
assert(initialized == false);
initialized = true;
tag = T(++type_counter, subtype);
}
template <class T> T TaggedComponent<T>::Tag() const
{
assert(initialized);
return tag;
}
template <class T> typename T::type_t TaggedComponent<T>::type_counter(0);
} // namespace zeek::plugin } // namespace zeek::plugin

View file

@ -7,10 +7,10 @@
#open XXXX-XX-XX-XX-XX-XX #open XXXX-XX-XX-XX-XX-XX
#fields ts fuid tx_hosts rx_hosts conn_uids source depth analyzers mime_type filename duration local_orig is_orig seen_bytes total_bytes missing_bytes overflow_bytes timedout parent_fuid md5 sha1 sha256 #fields ts fuid tx_hosts rx_hosts conn_uids source depth analyzers mime_type filename duration local_orig is_orig seen_bytes total_bytes missing_bytes overflow_bytes timedout parent_fuid md5 sha1 sha256
#types time string set[addr] set[addr] set[string] string count set[string] string string interval bool bool count count count count bool string string string string #types time string set[addr] set[addr] set[string] string count set[string] string string interval bool bool count count count count bool string string string string
XXXXXXXXXX.XXXXXX FgN3AE3of2TRIqaeQe 74.125.239.129 192.168.4.149 CHhAvVGS1DHFjwGM9 SSL 0 SHA256,X509,SHA1,MD5 application/x-x509-user-cert - 0.000000 - F 1859 - 0 0 F - 7af07aca6d5c6e8e87fe4bb34786edc0 548b9e03bc183d1cd39f93a37985cb3950f8f06f 6bacfa4536150ed996f2b0c05ab6e345a257225f449aeb9d2018ccd88f4ede43 XXXXXXXXXX.XXXXXX FgN3AE3of2TRIqaeQe 74.125.239.129 192.168.4.149 CHhAvVGS1DHFjwGM9 SSL 0 X509,SHA256,SHA1,MD5 application/x-x509-user-cert - 0.000000 - F 1859 - 0 0 F - 7af07aca6d5c6e8e87fe4bb34786edc0 548b9e03bc183d1cd39f93a37985cb3950f8f06f 6bacfa4536150ed996f2b0c05ab6e345a257225f449aeb9d2018ccd88f4ede43
XXXXXXXXXX.XXXXXX Fv2Agc4z5boBOacQi6 74.125.239.129 192.168.4.149 CHhAvVGS1DHFjwGM9 SSL 0 SHA256,X509,SHA1,MD5 application/x-x509-ca-cert - 0.000000 - F 1032 - 0 0 F - 9e4ac96474245129d9766700412a1f89 d83c1a7f4d0446bb2081b81a1670f8183451ca24 a047a37fa2d2e118a4f5095fe074d6cfe0e352425a7632bf8659c03919a6c81d XXXXXXXXXX.XXXXXX Fv2Agc4z5boBOacQi6 74.125.239.129 192.168.4.149 CHhAvVGS1DHFjwGM9 SSL 0 X509,SHA256,SHA1,MD5 application/x-x509-ca-cert - 0.000000 - F 1032 - 0 0 F - 9e4ac96474245129d9766700412a1f89 d83c1a7f4d0446bb2081b81a1670f8183451ca24 a047a37fa2d2e118a4f5095fe074d6cfe0e352425a7632bf8659c03919a6c81d
XXXXXXXXXX.XXXXXX Ftmyeg2qgI2V38Dt3g 74.125.239.129 192.168.4.149 CHhAvVGS1DHFjwGM9 SSL 0 SHA256,X509,SHA1,MD5 application/x-x509-ca-cert - 0.000000 - F 897 - 0 0 F - 2e7db2a31d0e3da4b25f49b9542a2e1a 7359755c6df9a0abc3060bce369564c8ec4542a3 3c35cc963eb004451323d3275d05b353235053490d9cd83729a2faf5e7ca1cc0 XXXXXXXXXX.XXXXXX Ftmyeg2qgI2V38Dt3g 74.125.239.129 192.168.4.149 CHhAvVGS1DHFjwGM9 SSL 0 X509,SHA256,SHA1,MD5 application/x-x509-ca-cert - 0.000000 - F 897 - 0 0 F - 2e7db2a31d0e3da4b25f49b9542a2e1a 7359755c6df9a0abc3060bce369564c8ec4542a3 3c35cc963eb004451323d3275d05b353235053490d9cd83729a2faf5e7ca1cc0
XXXXXXXXXX.XXXXXX FUFNf84cduA0IJCp07 74.125.239.129 192.168.4.149 ClEkJM2Vm5giqnMf4h SSL 0 SHA256,X509,SHA1,MD5 application/x-x509-user-cert - 0.000000 - F 1859 - 0 0 F - 7af07aca6d5c6e8e87fe4bb34786edc0 548b9e03bc183d1cd39f93a37985cb3950f8f06f 6bacfa4536150ed996f2b0c05ab6e345a257225f449aeb9d2018ccd88f4ede43 XXXXXXXXXX.XXXXXX FUFNf84cduA0IJCp07 74.125.239.129 192.168.4.149 ClEkJM2Vm5giqnMf4h SSL 0 X509,SHA256,SHA1,MD5 application/x-x509-user-cert - 0.000000 - F 1859 - 0 0 F - 7af07aca6d5c6e8e87fe4bb34786edc0 548b9e03bc183d1cd39f93a37985cb3950f8f06f 6bacfa4536150ed996f2b0c05ab6e345a257225f449aeb9d2018ccd88f4ede43
XXXXXXXXXX.XXXXXX F1H4bd2OKGbLPEdHm4 74.125.239.129 192.168.4.149 ClEkJM2Vm5giqnMf4h SSL 0 SHA256,X509,SHA1,MD5 application/x-x509-ca-cert - 0.000000 - F 1032 - 0 0 F - 9e4ac96474245129d9766700412a1f89 d83c1a7f4d0446bb2081b81a1670f8183451ca24 a047a37fa2d2e118a4f5095fe074d6cfe0e352425a7632bf8659c03919a6c81d XXXXXXXXXX.XXXXXX F1H4bd2OKGbLPEdHm4 74.125.239.129 192.168.4.149 ClEkJM2Vm5giqnMf4h SSL 0 X509,SHA256,SHA1,MD5 application/x-x509-ca-cert - 0.000000 - F 1032 - 0 0 F - 9e4ac96474245129d9766700412a1f89 d83c1a7f4d0446bb2081b81a1670f8183451ca24 a047a37fa2d2e118a4f5095fe074d6cfe0e352425a7632bf8659c03919a6c81d
XXXXXXXXXX.XXXXXX Fgsbci2jxFXYMOHOhi 74.125.239.129 192.168.4.149 ClEkJM2Vm5giqnMf4h SSL 0 SHA256,X509,SHA1,MD5 application/x-x509-ca-cert - 0.000000 - F 897 - 0 0 F - 2e7db2a31d0e3da4b25f49b9542a2e1a 7359755c6df9a0abc3060bce369564c8ec4542a3 3c35cc963eb004451323d3275d05b353235053490d9cd83729a2faf5e7ca1cc0 XXXXXXXXXX.XXXXXX Fgsbci2jxFXYMOHOhi 74.125.239.129 192.168.4.149 ClEkJM2Vm5giqnMf4h SSL 0 X509,SHA256,SHA1,MD5 application/x-x509-ca-cert - 0.000000 - F 897 - 0 0 F - 2e7db2a31d0e3da4b25f49b9542a2e1a 7359755c6df9a0abc3060bce369564c8ec4542a3 3c35cc963eb004451323d3275d05b353235053490d9cd83729a2faf5e7ca1cc0
#close XXXX-XX-XX-XX-XX-XX #close XXXX-XX-XX-XX-XX-XX

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long