Confluence automation

Here’s a script that i use to automate updating an Confluence wiki content. Posting it here in case is usefull for someone else. I developed it on Windows7 and with ruby 1.9.3.

Can be used as a standalone, like so:

# for content:
$ ruby confluence.rb post "{html}<h1>Hello Confluence</h1>{html}" "page" "space" "username" "password" "confluence.my.com"

# for attachments:
$ ruby confluence.rb attach file.pdf "application/pdf" "page" "space" "username" "password" "confluence.my.com"

Or as a ruby lib, like so:

require 'confluence'

# for content:
Confluence.post "{html}<h1>Hello Confluence</h1>{html}", "page", "space", "user", "pass", "confluence.my.com"

# for attachments:
Confluence.attach "report.pdf", "application/pdf", "page", "space", "user", "pass", "confluence.my.com"

Code

module Confluence
  require 'xmlrpc/client'
  extend self

  # Confluence.post "{html}<h1>Hello Confluence</h1>{html}", "page", "space", "user", "pass", "confluence.my.com"
  def post content, page, space, user, pass, server
    confluence = XMLRPC::Client.new2("https://#{user}:#{pass}@#{server}/rpc/xmlrpc")
    # disable certificate check    
    confluence.instance_variable_get(:@http).instance_variable_set(:@verify_mode, OpenSSL::SSL::VERIFY_NONE)
    # shortcut
    confluence = confluence.proxy("confluence2") # confluence1 with older

    pa = confluence.getPage("", space, page)
    pa["content"] = content
    confluence.storePage("", pa)
  end

  # Confluence.attach "report.pdf", "application/pdf", "page", "space", "user", "pass", "confluence.my.com"
  def attach file, type, page, space, user, pass, server
    server = XMLRPC::Client.new2("https://#{user}:#{pass}@#{server}/rpc/xmlrpc")
    # disable certificate check    
    server.instance_variable_get(:@http).instance_variable_set(:@verify_mode, OpenSSL::SSL::VERIFY_NONE)
    # shortcut
    confluence = server.proxy("confluence2") # confluence1 with older

    token = confluence.login(user, pass)
    pa = confluence.getPage(token, space, page)

    attachment = {}
    attachment['fileName'] = file
    attachment['contentType'] = type

    # Read updated local copy of the document
    data = ""   # data array does not work, init as string instead
    f = File.open(file, "rb")  # don't forget the 'b' for binary
    f.read.each_byte {|byte| data << byte }
    f.close

    confluence.addAttachment(token, pa['id'], attachment, XMLRPC::Base64.new(data))
  end 
end


if __FILE__ == $0
  if ARGV[0] == "post"
    if ARGV.size != 7
      puts '$ ruby confluence.rb post "{html}<h1>Hello Confluence</h1>{html}" "page" "space" "username" "password" "confluence.my.com"'
    else
      Confluence.post ARGV[1], ARGV[2], ARGV[3], ARGV[4], ARGV[5], ARGV[6]
    end
  end

  if ARGV[0] == "attach"
    if ARGV.size != 8
      puts '$ ruby confluence.rb attach file.pdf "application/pdf" "page" "space" "username" "password" "confluence.my.com"'
    else
      Confluence.attach ARGV[1], ARGV[2], ARGV[3], ARGV[4], ARGV[5], ARGV[6], ARGV[7]
    end
  end    
end

It might change/evolve over time, check it out in my github ruby repo.

Updated: