require 'rubygems' require 'active_support' require 'drb' require 'drb/acl' require 'yaml' require 'logger' require 'etc' require 'pp' class Control attr_accessor :config TOOLS_WITH_TEMPLATES = ['trac'] def initialize(config) self.config = config TOOLS_WITH_TEMPLATES.each do |t| $log.info "Creating '#{t}' template" obj = create_tool t obj.send(:prepare_template) end if config['check_tools'] config['check_tools'].split.each do |tool| obj = create_tool tool obj.config = config obj.send(:check) end end end def method_missing(method, *args) service = args.shift begin obj = create_tool service $log.info("remote call: #{service} #{method}") obj.send(method, *args) rescue => e $log.error(e) $log.error(e.backtrace.join("\n")) raise e end end def create_tool(name) require File.join($base_dir, name) obj = get_class(name.capitalize).new obj.config = config obj end def respond_to?(name) [ :on_create, :on_destroy, :retrieve_urls, :show, :inspect, :milestones ].include? name end private def get_class(name) Object.const_get(name) end end $base_dir = File.expand_path File.dirname(__FILE__) $: << $base_dir $: << "#{$base_dir}/../../lib" File.chmod 0777, "#{$base_dir}/tmp","#{$base_dir}/log" $config = YAML::load(File.open("#{$base_dir}/control.yml")) $config['uri'] ||= 'druby://127.0.0.1:8887' acl = $config['acl'] || '127.0.0.1' acl_list = ["deny", "all"] acl.scan(/\S+/).each {|hostname| acl_list += ["allow", hostname] } Process::GID.change_privilege Etc.getgrnam($config['rtm_group']).gid Process::UID.change_privilege Etc.getpwnam($config['rtm_user']).uid # check if backup folder is writeable $log = Logger.new("#{$base_dir}/log/control.log", 5, 1024000) $log.info "Start" File.umask(0022) server = Control.new($config) DRb.install_acl(ACL.new(acl_list)) DRb.start_service($config['uri'], server) begin DRb.thread.join rescue Interrupt => e $log.info("Exiting.") end