Sindbad~EG File Manager
class OmiOms
require 'json'
require_relative 'oms_common'
require_relative 'omslog'
attr_reader :specific_mapping
def initialize(object_name, instance_regex, counter_name_regex, omi_mapping_path, omi_interface=nil, common=nil)
@object_name = object_name
@counter_name_regex = counter_name_regex
@instance_regex = instance_regex
@omi_mapping_path = omi_mapping_path
@specific_mapping = get_specific_mapping
if @specific_mapping
@conf_error = false
@instance_property = @specific_mapping["InstanceProperty"]
@cim_to_oms = get_cim_to_oms_mappings(@specific_mapping["CimProperties"])
else
@conf_error = true
return
end
if common == nil
common = OMS::Common
end
@hostname = common.get_hostname or "Unknown host"
if omi_interface
@omi_interface = omi_interface
else
require_relative 'Libomi'
@omi_interface = Libomi::OMIInterface.new
end
@omi_interface.connect
end
def get_specific_mapping
begin
file = File.read(@omi_mapping_path)
rescue => error
$log.error "Unable to read file #{@omi_mapping_path}"
return
end
begin
mapping = JSON.parse(file)
rescue => error
$log.error "Error parsing file #{@omi_mapping_path} : #{error}"
return
end
specific_mapping = nil
mapping.each { |class_info|
if class_info["ObjectName"] == @object_name
specific_mapping = class_info
break
end
}
if specific_mapping == nil
$log.error "Could not find ObjectName '#{@object_name}' in #{@omi_mapping_path}"
return
end
return specific_mapping
end
def get_cim_to_oms_mappings(cimproperties)
cim_to_oms = {}
cimproperties.each { |maps|
cim_name = maps["CimPropertyName"]
oms_name = maps["CounterName"]
# Map cim_name to both CounterName and DisplayName
if maps.has_key?("DisplayName")
display_counter_name = maps["DisplayName"]
cim_to_oms[cim_name] = [oms_name, display_counter_name]
else
cim_to_oms[cim_name] = oms_name
end
}
return cim_to_oms
end
def omi_to_oms_instance(omi_instance, timestamp, wlm_enabled=false)
oms_instance = {}
oms_instance["Timestamp"] = timestamp
if(!wlm_enabled)
oms_instance["Host"] = @hostname
else
oms_instance["Host"] = OMS::Common.get_fully_qualified_domain_name
oms_instance[@object_name] = omi_instance[@specific_mapping["InstanceProperty"]]
end
oms_instance["ObjectName"] = @object_name
# get the specific instance value given the instance property name (i.e. Name, InstanceId, etc. )
oms_instance["InstanceName"] = omi_instance[@specific_mapping["InstanceProperty"]]
oms_instance_collections = []
# go through each CimProperties in the specific mapping,
# if counterName is collected, perform the lookup for the value
# else skip to the next property
# Filter properties. Watch out! We get them as CIM but the regex is with OMS property names
omi_instance.each do |property, value|
# CimProperty may have a DisplayName attribute; if so, use that as the CounterName
if @cim_to_oms[property].is_a?(Array)
oms_property_name = @cim_to_oms[property][0]
oms_property_display_name = @cim_to_oms[property][1]
else
oms_property_name = @cim_to_oms[property]
oms_property_display_name == nil
end
begin
if /#{@counter_name_regex}/.match(oms_property_name)
if value.nil?
OMS::Log.warn_once("Dropping null value for counter #{oms_property_name}.")
else
counter_pair = {}
if oms_property_display_name == nil
counter_pair["CounterName"] = oms_property_name
else
counter_pair["CounterName"] = oms_property_display_name
end
counter_pair["Value"] = value
oms_instance_collections.push(counter_pair)
end
end
rescue RegexpError => e
@conf_error = true
$log.error "Regex error on counter_name_regex : #{e}"
return
end
end
oms_instance["Collections"] = oms_instance_collections
return oms_instance
end
def enumerate(time, data_type="LINUX_PERF_BLOB", ip_name="LogManagement", wlm_enabled=false)
return nil if @conf_error
namespace = @specific_mapping["Namespace"]
cim_class_name = @specific_mapping["CimClassName"]
items = [[namespace, cim_class_name]]
record_txt = @omi_interface.enumerate(items)
instances = JSON.parse record_txt
# Filter based on instance names
begin
instances.select!{ |instance|
/#{@instance_regex}/.match(instance[@instance_property])
}
rescue RegexpError => e
@conf_error = true
$log.error "Regex error on instance_regex : #{e}"
return
end
timestamp = OMS::Common.format_time(time)
# Convert instances to oms format
instances.map!{ |instance|
omi_to_oms_instance(instance, timestamp, wlm_enabled)
}
if instances.length > 0
wrapper = {
"DataType"=>data_type,
"IPName"=>ip_name,
"DataItems"=>instances
}
return wrapper
end
end
def disconnect
@omi_interface.disconnect
end
end
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists