Puppet Tips&Tricks: Custom type to manipulate XML config (activemq.xml)

Last week I worked in my first ever Ruby code. It's a custom type for Puppet that allows one to edit the /etc/activemq/activemq.xml file and add (or remove) transportConnectors. It's a fairly simple thing, not very elaborate, but it's a start. I'll try to expand it to make editing other xml files possible too, because I think that shouldn't be too hard. Now for the code. Keep in mind this is my first ever Ruby code (well, second, technically, because I worked out the REXML lib in a separate script first). It's probably very ugly and inefficient, so if you can do better, do let me know!

xml_manipulator.rb type:

Puppet::Type.newtype(:xml_manipulator) do
    @doc = "Manage TransportConnectors for ActiveMQ"
ensurable

newparam(:uri) do
    desc "The uri on which the connector should listen"
end

newparam(:type) do
    desc "The connector type."

isnamevar
end

end

And the provider activemq_transportconnector.rb:

require 'rexml/document'

include REXML

Puppet::Type.type(:xml_manipulator).provide :activemq_transportconnector do
    desc "The actual ActiveMQ config manipulator"

    defaultfor :operatingsystem => :debian

    def create
        file = File.open("/etc/activemq/activemq.xml", "r+")
        doc = REXML::Document.new file
    connectors = doc.elements["//transportConnectors"]
    connectors.add_element 'transportConnector', {'name' => resource[:type], 'uri' => resource[:uri]}
    file.rewind()
    doc.write( file, 4 )
    end

    def destroy
        file = File.open("/etc/activemq/activemq.xml", "r+")
        doc = REXML::Document.new file
    doc.root.elements.delete("transportConnect[@name=" + resource[:type] + "]")
    file.rewind()
    doc.write( file, 4 )
    end

    def exists?
        file = File.open("/etc/activemq/activemq.xml", "r+")
        doc = REXML::Document.new file
        XPath.match( doc, "//amq:transportConnector[@name='" + resource[:type] + "' and @uri='" + resource[:uri] + "']", {"amq" => "http://activemq.apache.org/schema/core"}).length() > 0
    end
end

Comments

Comments powered by Disqus