Class: ZabbixManager::Basic

Inherits:
Object
  • Object
show all
Defined in:
lib/zabbix_manager/basic/basic_func.rb,
lib/zabbix_manager/basic/basic_init.rb,
lib/zabbix_manager/basic/basic_alias.rb,
lib/zabbix_manager/basic/basic_logic.rb

Instance Method Summary collapse

Constructor Details

#initialize(client) ⇒ Basic

使用 ZabbixManager 客户端初始化一个新的 Basic 对象



6
7
8
# File 'lib/zabbix_manager/basic/basic_init.rb', line 6

def initialize(client)
  @client = client
end

Instance Method Details

#add(data) ⇒ Object

新增 Zabbix 对象



11
12
13
# File 'lib/zabbix_manager/basic/basic_alias.rb', line 11

def add(data)
  create(data)
end

#allObject

使用 API 查询所有 Zabbix 监控对象的详细信息



157
158
159
160
161
162
163
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 157

def all
  result = {}
  get_raw({ output: "extend" }).each do |item|
    result[item[identify]] = item[key]
  end
  result
end

#create(data) ⇒ Object

使用 API 新增 Zabbix 监控对象(使用默认值)



6
7
8
9
10
11
12
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 6

def create(data)
  log "[DEBUG] 调用 #{method_name}.create,参数: #{data.inspect}"

  params = default_options.merge(data)
  result = @client.api_request(method: "#{method_name}.create", params: params)
  parse_keys result
end

#create_or_update(data) ⇒ Object

使用 API 创建或更新 Zabbix 监控对象



64
65
66
67
68
69
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 64

def create_or_update(data)
  log "[DEBUG] 调用 #{method_name}.create_or_update,参数: #{data.inspect}"

  id = get_id(identify.to_sym => data[identify.to_sym])
  id ? update(data.merge(key.to_sym => id.to_s)) : create(data)
end

#default_optionsObject

派生类可以重写此方法以提供特定的默认选项



21
22
23
# File 'lib/zabbix_manager/basic/basic_init.rb', line 21

def default_options
  {}
end

#delete(data) ⇒ Object

使用 API 删除 Zabbix 监控对象



32
33
34
35
36
37
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 32

def delete(data)
  log "[DEBUG] 调用 #{method_name}.delete,参数: #{data.inspect}"

  result = @client.api_request(method: "#{method_name}.delete", params: [data].flatten)
  parse_keys result
end

#destroy(data) ⇒ Object

删除 Zabbix 对象



16
17
18
# File 'lib/zabbix_manager/basic/basic_alias.rb', line 16

def destroy(data)
  delete(data)
end

#dump_by_id(data) ⇒ Object

使用 API 基于 key 打印 Zabbix 监控对象详情



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 72

def dump_by_id(data)
  log "[DEBUG] 调用 #{method_name}.dump_by_id,参数: #{data.inspect}"

  get_raw(
    {
      filter: {
        key.to_sym => data[key.to_sym]
      },
      output: "extend"
    }
  )
end

#get(data) ⇒ Object

获取 Zabbix 对象数据



6
7
8
# File 'lib/zabbix_manager/basic/basic_alias.rb', line 6

def get(data)
  get_full_data(data)
end

#get_full_data(data) ⇒ Object

使用 API 查询 Zabbix 监控对象的详细信息



166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 166

def get_full_data(data)
  log "[DEBUG] 调用 #{method_name}.get_full_data,参数: #{data.inspect}"

  get_raw(
    {
      filter: {
        identify.to_sym => data[identify.to_sym]
      },
      output: "extend"
    }
  )
end

#get_id(data) ⇒ Object

使用 API 基于提供的数据查询 Zabbix 监控对象 id

Raises:



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 86

def get_id(data)
  log "[DEBUG] 调用 #{method_name}.get_id,参数: #{data.inspect}"

  data = symbolize_keys(data) if data.key?(identify)
  name = data[identify.to_sym]
  raise ZbxError, "在调用 get_id 时未提供 identify #{identify}" if name.nil?

  # 输出信息截取 key identify
  result = get_raw(
    {
      filter: data,
      output: [key, identify]
    }
  )

  result.find { |item| item[identify] == data[identify.to_sym] }&.[](key)&.to_i
end

#get_ids(data) ⇒ Object

使用 API 基于提供的数据查询 Zabbix 监控对象 ids



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 105

def get_ids(data)
  log "[DEBUG] 调用 #{method_name}.get_ids,参数: #{data.inspect}"

  ids = []
  [data].flatten.each do |item|
    if (id = get_id(item))
      ids << id
    end
  end
  ids
end

#get_ids_by_identify(data) ⇒ Object

使用 API 基于 name 查询 Zabbix 监控对象 id



131
132
133
134
135
136
137
138
139
140
141
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 131

def get_ids_by_identify(data)
  log "[DEBUG] 调用 #{method_name}.get_ids_by_identify,参数: #{data.inspect}"

  result = get_raw(
    {
      filter: { identify.to_sym => [data].flatten },
      output: [key]
    }
  )
  result.empty? ? nil : result.map { |i| i[key] }
end

#get_key_ids(data) ⇒ Object

使用 API 基于提供的数据查询 Zabbix 监控对象 id



118
119
120
121
122
123
124
125
126
127
128
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 118

def get_key_ids(data)
  log "[DEBUG] 调用 #{method_name}.get_key_ids,参数: #{data.inspect}"

  ids = []
  [data].flatten.each do |item|
    if (id = get_id(item))
      ids << { key.to_sym => id }
    end
  end
  ids
end

#get_key_ids_by_identify(data) ⇒ Object

使用 API 基于 name 查询 Zabbix 监控对象 id



144
145
146
147
148
149
150
151
152
153
154
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 144

def get_key_ids_by_identify(data)
  log "[DEBUG] 调用 #{method_name}.get_key_ids_by_identify,参数: #{data.inspect}"

  result = get_raw(
    {
      filter: { identify.to_sym => [data].flatten },
      output: [key]
    }
  )
  result.empty? ? nil : result.map { |i| { key.to_sym => i[key] } }
end

#get_or_create(data) ⇒ Object

使用 API 获取或创建 Zabbix 监控对象



40
41
42
43
44
45
46
47
48
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 40

def get_or_create(data)
  log "[DEBUG] 调用 #{method_name}.get_or_create,参数: #{data.inspect}"

  if (id = get_id(identify.to_sym => data[identify.to_sym]))
    id
  else
    create(data)
  end
end

#get_or_create_keys(data) ⇒ Object

使用 API 批量获取或创建 Zabbix 监控对象



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 51

def get_or_create_keys(data)
  log "[DEBUG] 调用 #{method_name}.get_or_create_keys,参数: #{data.inspect}"

  ids = []
  [data].flatten.each do |item|
    if (id = get_or_create(item))
      ids << { key.to_sym => id }
    end
  end
  ids
end

#get_raw(data) ⇒ Object

使用 API 查询 Zabbix 监控对象的原始数据



180
181
182
183
184
185
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 180

def get_raw(data)
  @client.api_request(
    method: "#{method_name}.get",
    params: data
  )
end

#hash_equals?(hash1, hash2) ⇒ Boolean

比较两个哈希是否相等

Returns:

  • (Boolean)


11
12
13
14
15
16
17
18
19
# File 'lib/zabbix_manager/basic/basic_func.rb', line 11

def hash_equals?(hash1, hash2)
  normalized_hash1 = normalize_hash(hash1)
  normalized_hash2 = normalize_hash(hash2)

  merged_hash1 = normalized_hash1.merge(normalized_hash2)
  merged_hash2 = normalized_hash2.merge(normalized_hash1)

  merged_hash1 == merged_hash2
end

#identifyObject

在派生类中应该重写此方法以提供特定的 ID 字段名

Raises:



16
17
18
# File 'lib/zabbix_manager/basic/basic_init.rb', line 16

def identify
  raise ZbxError, "子类需要自行实现 identify"
end

#keyObject

根据 method_name + id 返回对象的 ID 字段名(identify)



26
27
28
# File 'lib/zabbix_manager/basic/basic_init.rb', line 26

def key
  "#{method_name}id"
end

#keysObject

根据 key 返回对象的复数 ID 字段名(identify)



31
32
33
# File 'lib/zabbix_manager/basic/basic_init.rb', line 31

def keys
  "#{key}s"
end

#log(message) ⇒ Object

在调试模式下将日志消息记录到 stdout



6
7
8
# File 'lib/zabbix_manager/basic/basic_func.rb', line 6

def log(message)
  puts message if @client.options[:debug]
end

#merge_hashes(hash1, hash2) ⇒ Object

合并两个哈希为一个新的哈希



79
80
81
82
# File 'lib/zabbix_manager/basic/basic_func.rb', line 79

def merge_hashes(hash1, hash2)
  new_hash = hash1.dup
  new_hash.merge(hash2)
end

#method_nameObject

在派生类中应该重写此方法以提供特定的方法名

Raises:



11
12
13
# File 'lib/zabbix_manager/basic/basic_init.rb', line 11

def method_name
  raise ZbxError, "子类需要自行实现 method_name"
end

#normalize_array(array) ⇒ Object

将所有数组值规范化为字符串



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/zabbix_manager/basic/basic_func.rb', line 48

def normalize_array(array)
  result = []

  array.each do |e|
    if e.is_a?(Array)
      result.push(normalize_array(e))
    elsif e.is_a?(Hash)
      result.push(normalize_hash(e))
    else
      result.push(e.to_s)
    end
  end

  result
end

#normalize_hash(hash) ⇒ Object

将所有哈希值规范化为字符串



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/zabbix_manager/basic/basic_func.rb', line 35

def normalize_hash(hash)
  result = hash.dup

  # 移除用于日志记录的 TODO 注释。TemplateID 和 HostID 具有不同的 ID
  result.delete(:hostid)

  result.transform_keys!(&:to_sym)
  result.transform_values! { |value| value.is_a?(Array) ? normalize_array(value) : value.to_s }

  result
end

#parse_keys(data) ⇒ Object

解析包含 ID 键或布尔值的数据哈希



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/zabbix_manager/basic/basic_func.rb', line 65

def parse_keys(data)
  case data
  when Hash
    data.empty? ? false : data[keys][0].to_i
  when TrueClass
    true
  when FalseClass
    false
  else
    false
  end
end

#request_raw(method, data) ⇒ Object

使用 API 查询 Zabbix 监控对象的原始数据



188
189
190
191
192
193
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 188

def request_raw(method, data)
  @client.api_request(
    method: method,
    params: data
  )
end

#symbolize_keys(object) ⇒ Object

将所有哈希/数组键转换为符号 &method(:symbolize_keys) 是 Ruby 中一种将方法转换为可传递给块或其他方法的 Proc 的方式



23
24
25
26
27
28
29
30
31
32
# File 'lib/zabbix_manager/basic/basic_func.rb', line 23

def symbolize_keys(object)
  case object
  when Array
    object.map(&method(:symbolize_keys))
  when Hash
    object.transform_keys(&:to_sym).transform_values(&method(:symbolize_keys))
  else
    object
  end
end

#update(data, force = false) ⇒ Object

使用 API 更新 Zabbix 监控对象



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 15

def update(data, force = false)
  log "[DEBUG] 调用 #{method_name}.update,参数: #{data.inspect}"

  dump = {}
  dump_by_id(key.to_sym => data[key.to_sym]).each do |item|
    dump = symbolize_keys(item) if item[key].to_i == data[key.to_sym].to_i
  end
  if hash_equals?(dump, data) && !force
    log "[DEBUG] 系统以有数据 #{dump} 和 待更新的数据 #{data} 相同,跳过本次更新"
    data[key.to_sym].to_i
  else
    result = @client.api_request(method: "#{method_name}.update", params: data)
    parse_keys result
  end
end