Class: ZabbixManager::Basic
- Inherits:
-
Object
- Object
- ZabbixManager::Basic
- 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
Direct Known Subclasses
Actions, Applications, Configurations, Drules, Events, Graphs, HostGroups, HostInterfaces, Hosts, HttpTests, Items, Maintenance, Mediatypes, Problems, Proxies, Roles, Screens, Scripts, Templates, Triggers, Usergroups, Usermacros, Users, ValueMaps
Instance Method Summary collapse
-
#add(data) ⇒ Integer, Boolean
通过 Zabbix API 创建对象。.
-
#all ⇒ Hash
获取当前资源的全部对象,并返回业务标识到 ID 的映射。.
-
#create(data) ⇒ Integer, Boolean
合并默认选项后通过 Zabbix API 创建对象。.
-
#create_or_update(data) ⇒ Integer, Boolean
按业务标识查找对象,存在则更新,否则创建。.
-
#create_raw(data) ⇒ Object
使用原始参数直接创建 Zabbix 对象。.
-
#default_options ⇒ Hash
返回资源创建时使用的默认选项,子类可按需覆盖。.
-
#delete(data) ⇒ Integer, Boolean
通过 Zabbix API 删除对象。.
-
#delete_raw(data) ⇒ Object
使用原始参数直接删除 Zabbix 对象。.
-
#destroy(data) ⇒ Integer, Boolean
通过 Zabbix API 删除对象。.
-
#dump_by_id(data) ⇒ Hash
按对象 ID 字段从 Zabbix API 获取扩展数据。.
-
#get(data) ⇒ Hash
按标识字段从 Zabbix API 获取对象完整数据。.
-
#get_full_data(data) ⇒ Hash
按业务标识从 Zabbix API 获取对象扩展数据。.
-
#get_id(data) ⇒ Integer?
按业务标识精确查询对象 ID,并拒绝歧义结果。.
-
#get_or_create(data) ⇒ Integer
按业务标识获取对象,不存在时创建。.
-
#get_raw(data) ⇒ Hash
将调用方参数直接传给对应的 Zabbix get 方法。.
-
#hash_equals?(first_hash, second_hash) ⇒ Boolean
比较实际哈希是否包含期望哈希中的全部键值。.
-
#identify ⇒ String
定义资源业务标识字段占位,要求子类覆盖。.
-
#identity_filter(data) ⇒ Hash
提取通用获取或写入操作使用的远端业务标识。.
-
#initialize(client) ⇒ ZabbixManager::Basic
constructor
使用 ZabbixManager 客户端初始化基础资源对象。.
-
#key ⇒ String
根据 API 方法名生成对象 ID 字段名。.
-
#keys ⇒ String
根据单数 ID 字段名生成 API 返回结果中的复数字段名。.
-
#log(message) ⇒ void
将调试信息交给客户端结构化日志,并移除可能包含请求参数的片段。.
-
#method_name ⇒ String?
返回子类对应的 Zabbix API 方法名;由具体资源类实现。.
-
#normalize_hash(hash) ⇒ Hash
将哈希值递归规范为字符串,并忽略 hostid。.
-
#parse_keys(data) ⇒ Integer, ...
从 API 结果中解析单个对象 ID,或透传布尔结果。.
-
#update(data, force = false) ⇒ Integer, Boolean
在属性发生变化或强制更新时通过 Zabbix API 更新对象。.
-
#update_raw(data) ⇒ Object
使用原始参数直接更新 Zabbix 对象。.
Constructor Details
#initialize(client) ⇒ ZabbixManager::Basic
使用 ZabbixManager 客户端初始化基础资源对象。
9 10 11 |
# File 'lib/zabbix_manager/basic/basic_init.rb', line 9 def initialize(client) @client = client end |
Instance Method Details
#add(data) ⇒ Integer, Boolean
通过 Zabbix API 创建对象。
22 23 24 |
# File 'lib/zabbix_manager/basic/basic_alias.rb', line 22 def add(data) create(data) end |
#all ⇒ Hash
获取当前资源的全部对象,并返回业务标识到 ID 的映射。
138 139 140 141 142 143 144 145 146 147 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 138 def all result = {} @client.api_request( method: "#{method_name}.get", params: { output: "extend" } ).each do |item| result[item[identify]] = item[key] end result end |
#create(data) ⇒ Integer, Boolean
合并默认选项后通过 Zabbix API 创建对象。
12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 12 def create(data) log "[DEBUG] Call create with parameters: #{data.inspect}" # 判断是否绑定默认选项并重新生成配置 data_with_default = .empty? ? data : .merge(data) data_create = [data_with_default] # 调用实例方法 result = @client.api_request(method: "#{method_name}.create", params: data_create) # 判断是否执行成功并返回结果 parse_keys result end |
#create_or_update(data) ⇒ Integer, Boolean
按业务标识查找对象,存在则更新,否则创建。
47 48 49 50 51 52 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 47 def create_or_update(data) log "[DEBUG] Call create_or_update with parameters: #{data.inspect}" id = get_id(**identity_filter(data)) id ? update(data.merge(key.to_sym => id)) : create(data) end |
#create_raw(data) ⇒ Object
使用原始参数直接创建 Zabbix 对象。
204 205 206 207 208 209 210 211 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 204 def create_raw(data) log "[DEBUG] Call create_raw with parameters: #{data.inspect}" # 请求创建数据 @client.api_request( method: "#{method_name}.create", params: data ) end |
#default_options ⇒ Hash
返回资源创建时使用的默认选项,子类可按需覆盖。
24 25 26 |
# File 'lib/zabbix_manager/basic/basic_init.rb', line 24 def {} end |
#delete(data) ⇒ Integer, Boolean
通过 Zabbix API 删除对象。
32 33 34 35 36 37 38 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 32 def delete(data) log "[DEBUG] Call delete with parameters: #{data.inspect}" data_delete = [data] result = @client.api_request(method: "#{method_name}.delete", params: data_delete) parse_keys result end |
#delete_raw(data) ⇒ Object
使用原始参数直接删除 Zabbix 对象。
230 231 232 233 234 235 236 237 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 230 def delete_raw(data) log "[DEBUG] Call delete_raw with parameters: #{data.inspect}" # 请求创建数据 @client.api_request( method: "#{method_name}.delete", params: data ) end |
#destroy(data) ⇒ Integer, Boolean
通过 Zabbix API 删除对象。
33 34 35 |
# File 'lib/zabbix_manager/basic/basic_alias.rb', line 33 def destroy(data) delete(data) end |
#dump_by_id(data) ⇒ Hash
按对象 ID 字段从 Zabbix API 获取扩展数据。
119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 119 def dump_by_id(data) log "[DEBUG] Call dump_by_id with parameters: #{data.inspect}" @client.api_request( method: "#{method_name}.get", params: { filter: { key.to_sym => data[key.to_sym] }, output: "extend" } ) end |
#get(data) ⇒ Hash
按标识字段从 Zabbix API 获取对象完整数据。
11 12 13 |
# File 'lib/zabbix_manager/basic/basic_alias.rb', line 11 def get(data) get_full_data(data) end |
#get_full_data(data) ⇒ Hash
按业务标识从 Zabbix API 获取对象扩展数据。
84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 84 def get_full_data(data) log "[DEBUG] Call get_full_data with parameters: #{data.inspect}" @client.api_request( method: "#{method_name}.get", params: { filter: { identify.to_sym => data[identify.to_sym] }, output: "extend" } ) end |
#get_id(data) ⇒ Integer?
按业务标识精确查询对象 ID,并拒绝歧义结果。
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 155 def get_id(data) log "[DEBUG] Call get_id with parameters: #{data.inspect}" data = data.deep_symbolize_keys # 缺少业务标识字段时立即终止查询 name = data[identify.to_sym] raise Invalid, "#{identify} not supplied in call to get_id" if name.nil? result = @client.api_request( method: "#{method_name}.get", params: { filter: data, output: [key, identify] } ) matches = result.select { |item| item[identify].to_s == name.to_s } raise Conflict, "multiple #{method_name} objects match #{identify}=#{name}" if matches.length > 1 matches.first&.fetch(key, nil)&.to_i end |
#get_or_create(data) ⇒ Integer
按业务标识获取对象,不存在时创建。
182 183 184 185 186 187 188 189 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 182 def get_or_create(data) log "[DEBUG] Call get_or_create with parameters: #{data.inspect}" unless (id = get_id(**identity_filter(data))) id = create(data) end id end |
#get_raw(data) ⇒ Hash
将调用方参数直接传给对应的 Zabbix get 方法。
104 105 106 107 108 109 110 111 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 104 def get_raw(data) log "[DEBUG] Call get_raw with parameters: #{data.inspect}" @client.api_request( method: "#{method_name}.get", params: data ) end |
#hash_equals?(first_hash, second_hash) ⇒ Boolean
比较实际哈希是否包含期望哈希中的全部键值。
26 27 28 29 30 |
# File 'lib/zabbix_manager/basic/basic_func.rb', line 26 def hash_equals?(first_hash, second_hash) actual = normalize_hash(first_hash) expected = normalize_hash(second_hash) actual.slice(*expected.keys) == expected end |
#identify ⇒ String
定义资源业务标识字段占位,要求子类覆盖。
46 47 48 |
# File 'lib/zabbix_manager/basic/basic_init.rb', line 46 def identify raise Invalid, "Can't call identify here" end |
#identity_filter(data) ⇒ Hash
提取通用获取或写入操作使用的远端业务标识。
195 196 197 198 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 195 def identity_filter(data) attributes = data.deep_symbolize_keys { identify.to_sym => attributes.fetch(identify.to_sym) } end |
#key ⇒ String
根据 API 方法名生成对象 ID 字段名。
38 39 40 |
# File 'lib/zabbix_manager/basic/basic_init.rb', line 38 def key "#{method_name}id" end |
#keys ⇒ String
根据单数 ID 字段名生成 API 返回结果中的复数字段名。
31 32 33 |
# File 'lib/zabbix_manager/basic/basic_init.rb', line 31 def keys "#{key}s" end |
#log(message) ⇒ void
This method returns an undefined value.
将调试信息交给客户端结构化日志,并移除可能包含请求参数的片段。
9 10 11 12 13 14 15 16 17 18 19 |
# File 'lib/zabbix_manager/basic/basic_func.rb', line 9 def log() return unless @client.[:debug] = .to_s = if .start_with?("[DEBUG]") [/\A\[DEBUG\]\s+Call\s+[a-z_]+/i] || "[DEBUG] domain operation" else end @client.log(:debug, "domain.operation", message: ) end |
#method_name ⇒ String?
返回子类对应的 Zabbix API 方法名;由具体资源类实现。
17 18 19 |
# File 'lib/zabbix_manager/basic/basic_init.rb', line 17 def method_name raise Invalid, "Can't call method_name here" end |
#normalize_hash(hash) ⇒ Hash
将哈希值递归规范为字符串,并忽略 hostid。
36 37 38 |
# File 'lib/zabbix_manager/basic/basic_func.rb', line 36 def normalize_hash(hash) hash.deep_symbolize_keys.except(:hostid).deep_transform_values(&:to_s) end |
#parse_keys(data) ⇒ Integer, ...
从 API 结果中解析单个对象 ID,或透传布尔结果。
44 45 46 47 48 49 50 51 52 53 |
# File 'lib/zabbix_manager/basic/basic_func.rb', line 44 def parse_keys(data) case data when Hash data.empty? ? nil : data[keys][0].to_i when TrueClass true when FalseClass false end end |
#update(data, force = false) ⇒ Integer, Boolean
在属性发生变化或强制更新时通过 Zabbix API 更新对象。
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 62 def update(data, force = false) log "[DEBUG] Call update with parameters: #{data.inspect}" dump = {} dump_by_id(key.to_sym => data[key.to_sym]).each do |item| dump = item.deep_symbolize_keys if item[key].to_i == data[key.to_sym].to_i end if hash_equals?(dump, data) && !force log "[DEBUG] Equal keys #{dump} and #{data}, skip update" data[key.to_sym].to_i else data_update = [data] result = @client.api_request(method: "#{method_name}.update", params: data_update) parse_keys result end end |
#update_raw(data) ⇒ Object
使用原始参数直接更新 Zabbix 对象。
217 218 219 220 221 222 223 224 |
# File 'lib/zabbix_manager/basic/basic_logic.rb', line 217 def update_raw(data) log "[DEBUG] Call update_raw with parameters: #{data.inspect}" # 请求创建数据 @client.api_request( method: "#{method_name}.update", params: data ) end |