#! /usr/bin/ruby
$:.unshift '../../../../../lib'
require 'optparse'
require 'xmpp4r'
require 'inifile'
require 'optparse'
require 'net/smtp'
include Jabber
revision = nil
repository = String.new
OptionParser::new do |opts|
opts.banner = "notification.rb: Sends notifcation about svn commits via mail and jabber"
opts.banner << "\n\n"
opts.banner << 'Usage: notification.rb --revision \'revision\' --repository \'repository\''
opts.separator ''
opts.on( '-r', '--revision REVISION', 'revision of the project' ) { |r| revision = r }
opts.on( '-d', '--repository REPOSITORY', 'path to the repository' ) { |d| repository = d }
opts.on_tail('-h', '--help', 'Show this message') do
puts opts
exit 2
end
opts.parse!(ARGV)
end
if revision.nil? or repository == ""
exit 1
end
class SVNLook
def initialize( repository, revision)
@repository = repository
@revision = revision
end
def GetAttrib( function )
return `/usr/bin/svnlook #{function} #{@repository} -r #{@revision}`
end
end
def SendJabberNotification( address, message )
myJID = JID::new('bot@strojny.net/CaptainHook')
myPassword = 'foobarfoobar'
JID::new(address)
cl = Client::new(myJID, false)
cl.connect
cl.auth(myPassword)
m = Message::new(address, message).set_type(:chat).set_id('1')
cl.send(m)
cl.close
end
def GetAddress( project, type, short = false)
ini = IniFile::new( )
ini.load( "/svn/usermap.ini" )
ret = Array.new
ini.sections do |username|
if ini[username]['project'].split(",").find {|p| project.strip == p.strip }
if type == "jabber" and ini[username]['notification'].split(",").find {|v| v.strip == "jabber"}
ret.push( ini[username]["jabber"] )
elsif type == "mail" and ini[username]['notification'].split(",").find {|v| v.strip == "mail"}
if short == true
ret.push( ini[username]["mail"] )
else
ret.push( ini[username]["name"].to_s << " <" << ini[username]["mail"].to_s << ">")
end
end
end
end
return ret
end
def SendMailNotification( receiver, subject, message )
Net::SMTP.start('localhost', 25) do |smtp|
smtp.open_message_stream( "no-reply@dev.nu2m.de", receiver ) do |stream|
stream.puts "Subject: #{subject}"
stream.puts
stream.puts "#{message}"
end
end
end
svnlook = SVNLook::new( repository, revision )
diff = svnlook.GetAttrib( "diff" )
log = svnlook.GetAttrib( "log" )
author = svnlook.GetAttrib( "author" )
changed = svnlook.GetAttrib( "changed" )
project = repository.split("/").last
address_jabber = GetAddress( project, "jabber" )
message = "-------------------------------------------------------------------------\n"
message << "Project: #{project} | New Revision #{revision} | Author: #{author}"
message << "-------------------------------------------------------------------------\n"
message << "Log: #{log}"
message << "-------------------------------------------------------------------------\n"
message << "Files:\n"
message << "#{changed}"
message << "-------------------------------------------------------------------------\n"
subject = "[Nu2M-commits] " << project << " "
mail_message = message + diff
jabber_message = "\n" + message
SendMailNotification( GetAddress( project, "mail", true ), subject, mail_message)
GetAddress( project, "jabber" ).each { |address| SendJabberNotification( address, jabber_message ) }