DataConnectors/microsoft-sentinel-log-analytics-logstash-output-plugin/lib/logstash/sentinel_la/logstashLoganalyticsConfiguration.rb (193 lines of code) (raw):
# encoding: utf-8
module LogStash; module Outputs; class MicrosoftSentinelOutputInternal
class LogstashLoganalyticsOutputConfiguration
def initialize(client_app_Id, client_app_secret, tenant_id, data_collection_endpoint, dcr_immutable_id, dcr_stream_name, compress_data, create_sample_file, sample_file_path, logger)
@client_app_Id = client_app_Id
@client_app_secret = client_app_secret
@tenant_id = tenant_id
@data_collection_endpoint = data_collection_endpoint
@dcr_immutable_id = dcr_immutable_id
@dcr_stream_name = dcr_stream_name
@logger = logger
@compress_data = compress_data
@create_sample_file = create_sample_file
@sample_file_path = sample_file_path
# Delay between each resending of a message
@RETRANSMISSION_DELAY = 2
@MIN_MESSAGE_AMOUNT = 100
# Maximum of 1 MB per post to Log Analytics Data Collector API V2.
# This is a size limit for a single post.
# If the data from a single post that exceeds 1 MB, you should split it.
@loganalytics_api_data_limit = 1 * 1024 * 1024
# Taking 4K safety buffer
@MAX_SIZE_BYTES = @loganalytics_api_data_limit - 10000
@azure_clouds = {
"AzureCloud" => {"aad" => "https://login.microsoftonline.com", "monitor" => "https://monitor.azure.com"},
"AzureChinaCloud" => {"aad" => "https://login.chinacloudapi.cn", "monitor" => "https://monitor.azure.cn"},
"AzureUSGovernment" => {"aad" => "https://login.microsoftonline.us", "monitor" => "https://monitor.azure.us"}
}.freeze
end
def validate_configuration()
if @create_sample_file
begin
if @sample_file_path.nil?
print_missing_parameter_message_and_raise("sample_file_path")
end
if @sample_file_path.strip == ""
raise ArgumentError, "The setting sample_file_path cannot be empty"
end
begin
file = java.io.File.new(@sample_file_path)
if !file.exists
raise "Path not exists"
end
rescue Exception
raise ArgumentError, "The path #{@sample_file_path} does not exist."
end
end
else
required_configs = { "client_app_Id" => @client_app_Id,
"client_app_secret" => @client_app_secret,
"tenant_id" => @tenant_id,
"data_collection_endpoint" => @data_collection_endpoint,
"dcr_immutable_id" => @dcr_immutable_id,
"dcr_stream_name" => @dcr_stream_name }
required_configs.each { |name, conf|
if conf.nil?
print_missing_parameter_message_and_raise(name)
end
if conf.empty?
raise ArgumentError, "Malformed configuration , the following arguments can not be null or empty.[client_app_Id, client_app_secret, tenant_id, data_collection_endpoint, dcr_immutable_id, dcr_stream_name]"
end
}
if @retransmission_time < 0
raise ArgumentError, "retransmission_time must be a positive integer."
end
if @max_items < @MIN_MESSAGE_AMOUNT
raise ArgumentError, "Setting max_items to value must be greater then #{@MIN_MESSAGE_AMOUNT}."
end
if @key_names.length > 500
raise ArgumentError, 'There are over 500 key names listed to be included in the events sent to Azure Loganalytics, which exceeds the limit of columns that can be define in each table in log analytics.'
end
if !@azure_clouds.key?(@azure_cloud)
raise ArgumentError, "The specified Azure cloud #{@azure_cloud} is not supported. Supported clouds are: #{@azure_clouds.keys.join(", ")}."
end
end
@logger.info("Azure Loganalytics configuration was found valid.")
# If all validation pass then configuration is valid
return true
end # def validate_configuration
def print_missing_parameter_message_and_raise(param_name)
@logger.error("Missing a required setting for the microsoft-sentinel-log-analytics-logstash-output-plugin output plugin:
output {
microsoft-sentinel-log-analytics-logstash-output-plugin {
#{param_name} => # SETTING MISSING
...
}
}
")
raise ArgumentError, "The setting #{param_name} is required."
end
def RETRANSMISSION_DELAY
@RETRANSMISSION_DELAY
end
def MAX_SIZE_BYTES
@MAX_SIZE_BYTES
end
def amount_resizing
@amount_resizing
end
def retransmission_time
@retransmission_time
end
def proxy_aad
@proxy_aad
end
def proxy_endpoint
@proxy_endpoint
end
def logger
@logger
end
def decrease_factor
@decrease_factor
end
def client_app_Id
@client_app_Id
end
def client_app_secret
@client_app_secret
end
def tenant_id
@tenant_id
end
def data_collection_endpoint
@data_collection_endpoint
end
def dcr_immutable_id
@dcr_immutable_id
end
def dcr_stream_name
@dcr_stream_name
end
def key_names
@key_names
end
def max_items
@max_items
end
def plugin_flush_interval
@plugin_flush_interval
end
def MIN_MESSAGE_AMOUNT
@MIN_MESSAGE_AMOUNT
end
def key_names=(new_key_names)
@key_names = new_key_names
end
def plugin_flush_interval=(new_plugin_flush_interval)
@plugin_flush_interval = new_plugin_flush_interval
end
def decrease_factor=(new_decrease_factor)
@decrease_factor = new_decrease_factor
end
def amount_resizing=(new_amount_resizing)
@amount_resizing = new_amount_resizing
end
def max_items=(new_max_items)
@max_items = new_max_items
end
def proxy_aad=(new_proxy_aad)
@proxy_aad = new_proxy_aad
end
def proxy_endpoint=(new_proxy_endpoint)
@proxy_endpoint = new_proxy_endpoint
end
def retransmission_time=(new_retransmission_time)
@retransmission_time = new_retransmission_time
end
def compress_data
@compress_data
end
def compress_data=(new_compress_data)
@compress_data = new_compress_data
end
def create_sample_file
@create_sample_file
end
def create_sample_file=(new_create_sample_file)
@create_sample_file = new_create_sample_file
end
def sample_file_path
@sample_file_path
end
def sample_file_path=(new_sample_file_path)
@sample_file_path = new_sample_file_path
end
def azure_cloud
@azure_cloud
end
def azure_cloud=(new_azure_cloud)
@azure_cloud = new_azure_cloud
end
def get_aad_endpoint
@azure_clouds[@azure_cloud]["aad"]
end
def get_monitor_endpoint
@azure_clouds[@azure_cloud]["monitor"]
end
end
end ;end ;end