module Rubix class Template < Model # # == Properties & Finding == # attr_accessor :name def initialize properties={} super(properties) @name = properties[:name] self.host_ids = properties[:host_ids] self.hosts = properties[:hosts] self.host_group_ids = properties[:host_group_ids] self.host_groups = properties[:host_groups] end # # == Validation == # def validate raise ValidationError.new("A template must have at least one host group.") if host_group_ids.nil? || host_group_ids.empty? true end # # == Associations == # include Associations::HasManyHosts include Associations::HasManyHostGroups # # == CRUD == # def create_params {:host => name, :groups => host_group_params} end def update_params [create_params.merge(id_field => id)] end def destroy_params [{id_field => id}] end def self.get_params super().merge(:select_groups => :refer, :select_hosts => :refer) end def self.find_params options={} get_params.merge(:filter => {:host => options[:name], :hostid => options[:id]}) end def self.build template new({ :id => (template[id_field] || template['hostid']).to_i, :name => template['host'], :host_ids => template['hosts'].map { |host_info| host_info['hostid'].to_i }, :host_group_ids => template['groups'].map { |group| group['groupid'].to_i } }) end # # == Import/Export == # # Options which control the template import process and the Zabbix # keys they need to be mapped to. IMPORT_OPTIONS = { :update_hosts => 'rules[host][exist]', :add_hosts => 'rules[host][missed]', :update_items => 'rules[item][exist]', :add_items => 'rules[item][missed]', :update_triggers => 'rules[trigger][exist]', :add_triggers => 'rules[trigger][missed]', :update_graphs => 'rules[graph][exist]', :add_graphs => 'rules[graph][missed]', :update_templates => 'rules[template][exist]' }.freeze # Import/update a template from XML contained in an open file # handle +fh+. # # By default all hosts, items, triggers, and graphs the XML # defines will be both added and updated. (Linked templates will # also be updated.) This behavior matches the default behavior of # the web interface in Zabbix 1.8.8. # # This can be controlled with options like :update_hosts # or :add_graphs, all of which default to true. (Linked # templates are controlled with :update_templates.) def self.import fh, options={} response = web_request("POST", "/templates.php", import_options(options).merge(:import_file => fh)) File.open('/tmp/output.html', 'w') { |f| f.puts(response.body) } end def self.import_options options {}.tap do |o| self::IMPORT_OPTIONS.each_pair do |name, zabbix_name| o[zabbix_name] = 'yes' unless options[name] == false end end end end end