require 'rexml/document'\r
\r
module SubversionHook\r
- class Base\r
- HOME = File.expand_path(__FILE__ + "../../../../..")\r
+ class Base\r
+ HOME = File.expand_path(__FILE__ + "../../../../..")\r
\r
- def initialize(repos)\r
- @repos = repos\r
- end\r
+ def initialize(repos)\r
+ @repos = repos\r
+ end\r
\r
- def revision=(value)\r
- @type = :revision\r
- @number = value\r
- end\r
+ def revision=(value)\r
+ @type = :revision\r
+ @number = value\r
+ end\r
\r
- def transaction=(value)\r
- @type = :transaction\r
- @number = value\r
- end\r
+ def transaction=(value)\r
+ @type = :transaction\r
+ @number = value\r
+ end\r
\r
- def svnlook\r
- raise "must set revision or transaction" if @type.nil? || @number.nil?\r
- opt = (@type == :revision) ? "--revision" : "--transaction"\r
- "svnlook #{opt} #{@number}"\r
- end\r
+ def svnlook\r
+ raise "must set revision or transaction" if @type.nil? || @number.nil?\r
+ opt = (@type == :revision) ? "--revision" : "--transaction"\r
+ "svnlook #{opt} #{@number}"\r
+ end\r
\r
- def binary?(path)\r
- s = cat(path)[0, 512]\r
- !!s.index("\x00") || s.count("\x00-\x07\x0b\x0e-\x1a\x1c-\x1f")*10 > s.size\r
- end\r
+ def binary?(path)\r
+ s = cat(path)[0, 512]\r
+ !!s.index("\x00") || s.count("\x00-\x07\x0b\x0e-\x1a\x1c-\x1f")*10 > s.size\r
+ end\r
\r
- def cat(path)\r
- @content ||= {}\r
- @content[path] ||= IO.popen(\r
+ def cat(path)\r
+ @content ||= {}\r
+ @content[path] ||= IO.popen(\r
%Q[#{svnlook} cat "#{@repos}" "#{path}"], "rb") {|io| io.read}\r
- end\r
+ end\r
\r
- def commit_message\r
- @commit_message ||= `#{svnlook} log "#{@repos}"`\r
- end\r
+ def commit_message\r
+ @commit_message ||= `#{svnlook} log "#{@repos}"`\r
+ end\r
\r
- def changed\r
- @changed ||= `#{svnlook} changed "#{@repos}"`\r
- end\r
+ def changed\r
+ @changed ||= `#{svnlook} changed "#{@repos}"`\r
+ end\r
\r
- # :type => :binary or :text\r
- # :in => path\r
- # :extension => [".txt"]\r
- def changed_files(options = {})\r
- unless @changed_files\r
- @changed_files = {:all => [], :binary => [], :text => []}\r
- changed.each {|line|\r
- next unless m = line.match(/^[AU]\w*\s+(.+)$/)\r
- path = m[1]\r
- next if path[-1,1] == "/"\r
- \r
- @changed_files[:all].push(path)\r
- @changed_files[binary?(path) ? :binary : :text].push(path)\r
- }\r
- end\r
- \r
- list = @changed_files[options[:type]] || @changed_files[:all]\r
- list = list.select {|path| options[:in].to_a.any? {|inpath|\r
+ # :type => :binary or :text\r
+ # :in => path\r
+ # :extension => [".txt"]\r
+ def changed_files(options = {})\r
+ unless @changed_files\r
+ @changed_files = {:all => [], :binary => [], :text => []}\r
+ changed.each {|line|\r
+ next unless m = line.match(/^[AU]\w*\s+(.+)$/)\r
+ path = m[1]\r
+ next if path[-1,1] == "/"\r
+ \r
+ @changed_files[:all].push(path)\r
+ @changed_files[binary?(path) ? :binary : :text].push(path)\r
+ }\r
+ end\r
+ \r
+ list = @changed_files[options[:type]] || @changed_files[:all]\r
+ list = list.select {|path| options[:in].to_a.any? {|inpath|\r
path.index(inpath) == 0}} if options[:in]\r
- list = list.select {|path|\r
- options[:extension].include?(File.extname(path).downcase)\r
- } if options[:extension]\r
- list\r
- end\r
+ list = list.select {|path|\r
+ options[:extension].include?(File.extname(path).downcase)\r
+ } if options[:extension]\r
+ list\r
+ end\r
\r
- def load_config\r
- file = File.join(@repos, "hooks/hook_config.yml")\r
- conf = File.file?(file) ? YAML.load_file(file) : {}\r
- end\r
+ def load_config\r
+ file = File.join(@repos, "hooks/hook_config.yml")\r
+ conf = File.file?(file) ? YAML.load_file(file) : {}\r
+ end\r
\r
def service_config\r
@service_config ||= YAML.load_file(HOME + "/config/service.yml")\r
elem = doc.elements["//authToken"]\r
elem && elem.text\r
end\r
- end\r
+ end\r
end\r
require 'uri'\r
\r
module SubversionHook\r
- class PostCommit < Base\r
- def initialize(repos, revision)\r
- super repos\r
- self.revision = revision\r
- config = load_config["post_commit"] || {}\r
- \r
- (load_config["post_commit"] || {}).each {|method, options|\r
- self.send(method, options)\r
- }\r
- end\r
+ class PostCommit < Base\r
+ def initialize(repos, revision)\r
+ super repos\r
+ self.revision = revision\r
+ config = load_config["post_commit"] || {}\r
+ \r
+ (load_config["post_commit"] || {}).each {|method, options|\r
+ self.send(method, options)\r
+ }\r
+ end\r
\r
- def run_background(cmd)\r
- unless @wsh\r
- require 'win32ole'\r
- @wsh = WIN32OLE.new("WScript.Shell")\r
- end\r
- @wsh.run(cmd, 0, false)\r
- end\r
+ def run_background(cmd)\r
+ unless @wsh\r
+ require 'win32ole'\r
+ @wsh = WIN32OLE.new("WScript.Shell")\r
+ end\r
+ @wsh.run(cmd, 0, false)\r
+ end\r
\r
- def fetch_changesets(options)\r
- run_background(%Q[ruby "#{HOME}/redmine/script/runner" "Repository.fetch_changesets"])\r
- end\r
+ def fetch_changesets(options)\r
+ run_background(%Q[ruby "#{HOME}/redmine/script/runner" "Repository.fetch_changesets"])\r
+ end\r
\r
- def perform_build(options)\r
- return unless jobs = options["jobs"]\r
+ def perform_build(options)\r
+ return unless jobs = options["jobs"]\r
\r
- port = service_config["apache"]["port"]\r
- jobs.each {|job|\r
- next unless changed_files(:in => job["path"]).size > 0\r
- name = job["name"]\r
- token = hudson_token(name)\r
+ port = service_config["apache"]["port"]\r
+ jobs.each {|job|\r
+ next unless changed_files(:in => job["path"]).size > 0\r
+ name = job["name"]\r
+ token = hudson_token(name)\r
\r
- run_background(%Q[ruby -e "require 'net/http'; Net::HTTP.get('localhost', '/hudson/job/#{URI.escape(name)}/build?token=#{token}', #{port})"])\r
- }\r
- end\r
- end\r
+ run_background(%Q[ruby -e "require 'net/http'; Net::HTTP.get('localhost', '/hudson/job/#{URI.escape(name)}/build?token=#{token}', #{port})"])\r
+ }\r
+ end\r
+ end\r
end\r
require 'iconv'\r
\r
module SubversionHook\r
- class PreCommit < Base\r
- attr_reader :errors\r
-\r
- def initialize(repos, transaction)\r
- super repos\r
- self.transaction = transaction\r
-\r
- @errors = {}\r
- (load_config["pre_commit"] || {}).each {|method, options|\r
- self.send(method, options)\r
- }\r
-\r
- unless @errors.size == 0\r
- warn_error_messages\r
- exit 1\r
- end\r
- end\r
-\r
- def warn_error_messages\r
- if a = @errors[:commit_message]\r
- warn "The following keywords are not found in commit message:"\r
- warn a.join("\n")\r
- end\r
-\r
- if h = @errors[:encoding]\r
+ class PreCommit < Base\r
+ attr_reader :errors\r
+\r
+ def initialize(repos, transaction)\r
+ super repos\r
+ self.transaction = transaction\r
+\r
+ @errors = {}\r
+ (load_config["pre_commit"] || {}).each {|method, options|\r
+ self.send(method, options)\r
+ }\r
+\r
+ unless @errors.size == 0\r
+ warn_error_messages\r
+ exit 1\r
+ end\r
+ end\r
+\r
+ def warn_error_messages\r
+ if a = @errors[:commit_message]\r
+ warn "The following keywords are not found in commit message:"\r
+ warn a.join("\n")\r
+ end\r
+\r
+ if h = @errors[:encoding]\r
h.each {|encoding, messages|\r
warn "The following files are not #{encoding}:"\r
warn messages.join("\n")\r
}\r
- end\r
+ end\r
\r
- if h = @errors[:whitespace]\r
+ if h = @errors[:whitespace]\r
h.each {|type, files|\r
- warn (type != "both") ?\r
+ warn (type != "both") ?\r
"The following files are not indented with #{type} only:" :\r
"The following files are contains a mixture of tabs and spaces:"\r
- warn files.join("\n")\r
+ warn files.join("\n")\r
}\r
- end\r
+ end\r
\r
if h = @errors[:linefeed]\r
h.each {|type, files|\r
warn files.join("\n")\r
}\r
end\r
- end\r
-\r
- def check_commit_message(options)\r
- path = options["path"]\r
- keywords = options["keywords"]\r
- return unless changed_files(:in => path).size > 0\r
-\r
- keywords.each {|keyword|\r
- begin\r
- case keyword\r
- when String\r
- if m = keyword.match(%r{^/(.*)/([imx]*)$})\r
- opt = {\r
- "i" => Regexp::IGNORECASE,\r
- "m" => Regexp::MULTILINE,\r
- "x" => Regexp::EXTENDED\r
- }.inject(0) {|n, h|\r
- m[2].include?(h[0]) ? n + h[1] : n\r
- }\r
-\r
- r = Regexp.new(m[1], opt > 0 ? opt : nil, "UTF8")\r
- raise unless r === commit_message\r
- else\r
- raise unless commit_message.include?(keyword)\r
- end\r
- when Array\r
- raise unless keyword.any? {|word| commit_message.include?(word)}\r
- end\r
- rescue\r
- (@errors[:commit_message] ||= []).push(\r
- keyword.is_a?(Array) ? keyword.join(" or ") : keyword\r
- )\r
- end\r
- }\r
- end\r
-\r
- def check_text_files(options)\r
- h = {\r
+ end\r
+\r
+ def check_commit_message(options)\r
+ path = options["path"]\r
+ keywords = options["keywords"]\r
+ return unless changed_files(:in => path).size > 0\r
+\r
+ keywords.each {|keyword|\r
+ begin\r
+ case keyword\r
+ when String\r
+ if m = keyword.match(%r{^/(.*)/([imx]*)$})\r
+ opt = {\r
+ "i" => Regexp::IGNORECASE,\r
+ "m" => Regexp::MULTILINE,\r
+ "x" => Regexp::EXTENDED\r
+ }.inject(0) {|n, h|\r
+ m[2].include?(h[0]) ? n + h[1] : n\r
+ }\r
+\r
+ r = Regexp.new(m[1], opt > 0 ? opt : nil, "UTF8")\r
+ raise unless r === commit_message\r
+ else\r
+ raise unless commit_message.include?(keyword)\r
+ end\r
+ when Array\r
+ raise unless keyword.any? {|word| commit_message.include?(word)}\r
+ end\r
+ rescue\r
+ (@errors[:commit_message] ||= []).push(\r
+ keyword.is_a?(Array) ? keyword.join(" or ") : keyword\r
+ )\r
+ end\r
+ }\r
+ end\r
+\r
+ def check_text_files(options)\r
+ h = {\r
"space" => " ", "tab" => "\t",\r
"cr" => "\r", "lf" => "\n", "crlf" => "\r\n"\r
}\r
}\r
}\r
end\r
- end\r
+ end\r
end\r
module Account\r
- CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"\r
+ CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"\r
\r
- def self.random_password(length)\r
+ def self.random_password(length)\r
length.times.map{CHARSET[rand(CHARSET.length), 1]}.join\r
end\r
end\r
require 'net/ldap'\r
\r
module LDAP\r
- def self.setup_connection(options)\r
- h = {\r
- :host => options[:ldap_host],\r
- :port => options[:ldap_port],\r
- :base => options[:ldap_base_dn]\r
- }\r
-\r
- if (user = options[:ldap_bind_dn]) && (pass = options[:ldap_bind_password])\r
- h[:auth] = {:method => :simple, :username => user, :password => pass}\r
- end\r
-\r
- @attr_name = {\r
- :user => options[:ldap_user_attribute],\r
- :first_name => options[:ldap_first_name_attribute],\r
- :last_name => options[:ldap_last_name_attribute],\r
- :mail => options[:ldap_mail_attribute]\r
- }\r
- @connection = Net::LDAP.new(h)\r
- end\r
-\r
- def self.check_connection\r
- return false unless @connection\r
- timeout(0.5) { TCPSocket.new(@connection.host, @connection.port).close }\r
- @connection.bind\r
- rescue Timeout::Error\r
- false\r
- end\r
-\r
- def self.check_bind(username, password)\r
- return false unless check_connection\r
-\r
- filter = Net::LDAP::Filter.eq(@attr_name[:user], username)\r
- !!@connection.bind_as(:filter => filter, :password => password)\r
- end\r
-\r
- def self.search_attributes(username)\r
- return {} unless @connection\r
-\r
- filter = Net::LDAP::Filter.eq(@attr_name[:user], username)\r
- attrs = [:mail, :first_name, :last_name].map {|key|\r
- name = @attr_name[key]\r
- name.nil? || name.empty? ? nil : name\r
- }.compact\r
- h = {}\r
- @connection.search(:filter => filter, :attributes => attrs) {|entry|\r
- attrs.each {|attr| h[attr] = entry[attr].first}\r
- }\r
- h\r
- end\r
+ def self.setup_connection(options)\r
+ h = {\r
+ :host => options[:ldap_host],\r
+ :port => options[:ldap_port],\r
+ :base => options[:ldap_base_dn]\r
+ }\r
+\r
+ if (user = options[:ldap_bind_dn]) && (pass = options[:ldap_bind_password])\r
+ h[:auth] = {:method => :simple, :username => user, :password => pass}\r
+ end\r
+\r
+ @attr_name = {\r
+ :user => options[:ldap_user_attribute],\r
+ :first_name => options[:ldap_first_name_attribute],\r
+ :last_name => options[:ldap_last_name_attribute],\r
+ :mail => options[:ldap_mail_attribute]\r
+ }\r
+ @connection = Net::LDAP.new(h)\r
+ end\r
+\r
+ def self.check_connection\r
+ return false unless @connection\r
+ timeout(0.5) { TCPSocket.new(@connection.host, @connection.port).close }\r
+ @connection.bind\r
+ rescue Timeout::Error\r
+ false\r
+ end\r
+\r
+ def self.check_bind(username, password)\r
+ return false unless check_connection\r
+\r
+ filter = Net::LDAP::Filter.eq(@attr_name[:user], username)\r
+ !!@connection.bind_as(:filter => filter, :password => password)\r
+ end\r
+\r
+ def self.search_attributes(username)\r
+ return {} unless @connection\r
+\r
+ filter = Net::LDAP::Filter.eq(@attr_name[:user], username)\r
+ attrs = [:mail, :first_name, :last_name].map {|key|\r
+ name = @attr_name[key]\r
+ name.nil? || name.empty? ? nil : name\r
+ }.compact\r
+ h = {}\r
+ @connection.search(:filter => filter, :attributes => attrs) {|entry|\r
+ attrs.each {|attr| h[attr] = entry[attr].first}\r
+ }\r
+ h\r
+ end\r
end\r
module OpenDS\r
- def self.install(options)\r
- Dir.chdir(options[:opends_root]) {\r
- unless system("setup.bat -i -n -O --propertiesFilePath setup.properties")\r
- raise "OpenDS setup failed"\r
- end\r
- File.delete("import.ldif", "setup.properties")\r
- }\r
- end\r
+ def self.install(options)\r
+ Dir.chdir(options[:opends_root]) {\r
+ unless system("setup.bat -i -n -O --propertiesFilePath setup.properties")\r
+ raise "OpenDS setup failed"\r
+ end\r
+ File.delete("import.ldif", "setup.properties")\r
+ }\r
+ end\r
end\r
module Redmine\r
- def self.install(options)\r
- ENV["RAILS_ENV"] = "production"\r
- lang = (ENV["REDMINE_LANG"] ||= "ja")\r
+ def self.install(options)\r
+ ENV["RAILS_ENV"] = "production"\r
+ lang = (ENV["REDMINE_LANG"] ||= "ja")\r
\r
- Dir.chdir(options[:redmine_root]) {\r
- system_or_raise("rake generate_session_store")\r
- system_or_raise("rake db:migrate")\r
- system_or_raise("rake redmine:load_default_data")\r
- system_or_raise("rake db:migrate_plugins")\r
+ Dir.chdir(options[:redmine_root]) {\r
+ system_or_raise("rake generate_session_store")\r
+ system_or_raise("rake db:migrate")\r
+ system_or_raise("rake redmine:load_default_data")\r
+ system_or_raise("rake db:migrate_plugins")\r
\r
- require 'config/boot'\r
- require 'config/environment'\r
+ require 'config/boot'\r
+ require 'config/environment'\r
\r
- # create or update LDAP settings\r
- opt = {\r
- :host => options[:ldap_host],\r
- :port => options[:ldap_port],\r
- :base_dn => options[:ldap_base_dn]\r
- }\r
- ldap = AuthSourceLdap.find(:first, :conditions => opt) || AuthSourceLdap.new(opt)\r
- ldap.name = options[:ldap_host] if ldap.name.blank?\r
- ldap.account = options[:ldap_bind_dn]\r
- ldap.account_password = options[:ldap_bind_password]\r
- ldap.attr_login = options[:ldap_user_attribute]\r
- ldap.attr_firstname = options[:ldap_first_name_attribute]\r
- ldap.attr_lastname = options[:ldap_last_name_attribute]\r
- ldap.attr_mail = options[:ldap_mail_attribute]\r
- ldap.onthefly_register = true\r
- ldap.tls = false\r
- ldap.save!\r
+ # create or update LDAP settings\r
+ opt = {\r
+ :host => options[:ldap_host],\r
+ :port => options[:ldap_port],\r
+ :base_dn => options[:ldap_base_dn]\r
+ }\r
+ ldap = AuthSourceLdap.find(:first, :conditions => opt) || AuthSourceLdap.new(opt)\r
+ ldap.name = options[:ldap_host] if ldap.name.blank?\r
+ ldap.account = options[:ldap_bind_dn]\r
+ ldap.account_password = options[:ldap_bind_password]\r
+ ldap.attr_login = options[:ldap_user_attribute]\r
+ ldap.attr_firstname = options[:ldap_first_name_attribute]\r
+ ldap.attr_lastname = options[:ldap_last_name_attribute]\r
+ ldap.attr_mail = options[:ldap_mail_attribute]\r
+ ldap.onthefly_register = true\r
+ ldap.tls = false\r
+ ldap.save!\r
\r
- # delete default admin user\r
- User.destroy(1) rescue nil\r
+ # delete default admin user\r
+ User.destroy(1) rescue nil\r
\r
- # create or update admin user\r
- admin = User.find_by_login(options[:admin_account]) || User.new\r
- admin.login = options[:admin_account]\r
- admin.firstname = options[:admin_first_name]\r
- admin.lastname = options[:admin_last_name]\r
- admin.mail = options[:admin_mail]\r
- admin.admin = true\r
- admin.language = lang\r
- admin.auth_source = ldap\r
- admin.status = 1\r
- # ignore required user custom fields\r
- admin.save_without_validation! \r
+ # create or update admin user\r
+ admin = User.find_by_login(options[:admin_account]) || User.new\r
+ admin.login = options[:admin_account]\r
+ admin.firstname = options[:admin_first_name]\r
+ admin.lastname = options[:admin_last_name]\r
+ admin.mail = options[:admin_mail]\r
+ admin.admin = true\r
+ admin.language = lang\r
+ admin.auth_source = ldap\r
+ admin.status = 1\r
+ # ignore required user custom fields\r
+ admin.save_without_validation! \r
\r
- setting = RedmineLeSetting.instance\r
- setting.use_external_ldap = options[:ldap_setting]\r
- setting.auth_source = ldap\r
- setting.admin_account = options[:admin_account]\r
- setting.admin_password = options[:admin_password]\r
- RedmineLeSetting.skip_callbacks do\r
- setting.save_without_validation!\r
- end\r
+ setting = RedmineLeSetting.instance\r
+ setting.use_external_ldap = options[:ldap_setting]\r
+ setting.auth_source = ldap\r
+ setting.admin_account = options[:admin_account]\r
+ setting.admin_password = options[:admin_password]\r
+ RedmineLeSetting.skip_callbacks do\r
+ setting.save_without_validation!\r
+ end\r
\r
- host_name = Setting[:host_name] = "#{options[:apache_host]}/redmine"\r
- Setting[:emails_footer] = Setting[:emails_footer].gsub(\r
- /http\S+/, "http://#{host_name}/my/account"\r
- )\r
+ host_name = Setting[:host_name] = "#{options[:apache_host]}/redmine"\r
+ Setting[:emails_footer] = Setting[:emails_footer].gsub(\r
+ /http\S+/, "http://#{host_name}/my/account"\r
+ )\r
\r
- Setting[:autofetch_changesets] = "0"\r
- Setting[:commit_fix_status_id] = "5"\r
+ Setting[:autofetch_changesets] = "0"\r
+ Setting[:commit_fix_status_id] = "5"\r
\r
- if (Setting[:default_language] = lang) == "ja"\r
- Setting[:user_format] = "lastname_firstname"\r
- Setting[:repositories_encodings] = "utf-8,shift-jis,euc-jp"\r
- end\r
+ if (Setting[:default_language] = lang) == "ja"\r
+ Setting[:user_format] = "lastname_firstname"\r
+ Setting[:repositories_encodings] = "utf-8,shift-jis,euc-jp"\r
+ end\r
\r
- if options[:smtp_setting]\r
- Setting[:mail_from] = options[:mail_sender_address]\r
- end\r
- }\r
- end\r
+ if options[:smtp_setting]\r
+ Setting[:mail_from] = options[:mail_sender_address]\r
+ end\r
+ }\r
+ end\r
\r
- def self.system_or_raise(command)\r
- raise "\"#{command}\" failed" unless system command\r
- end\r
+ def self.system_or_raise(command)\r
+ raise "\"#{command}\" failed" unless system command\r
+ end\r
end\r
require 'uri'\r
\r
module Template\r
- class Env\r
- def initialize(options)\r
- @env = options\r
- end\r
+ class Env\r
+ def initialize(options)\r
+ @env = options\r
+ end\r
\r
- def _binding\r
- binding\r
- end\r
+ def _binding\r
+ binding\r
+ end\r
\r
- def method_missing(name, *args)\r
- @env[name] || @env[name.to_s]\r
- end\r
- end\r
+ def method_missing(name, *args)\r
+ @env[name] || @env[name.to_s]\r
+ end\r
+ end\r
\r
- def self.install(options={})\r
- options[:package_home] ||= File.expand_path(ENV["PACKAGE_HOME"])\r
- env = Env.new(options)\r
- home = env.package_home\r
- template_dir = File.join(home, "template")\r
- skip_email = !options[:smtp_setting]\r
- skip_opends = options[:ldap_setting]\r
+ def self.install(options={})\r
+ options[:package_home] ||= File.expand_path(ENV["PACKAGE_HOME"])\r
+ env = Env.new(options)\r
+ home = env.package_home\r
+ template_dir = File.join(home, "template")\r
+ skip_email = !options[:smtp_setting]\r
+ skip_opends = options[:ldap_setting]\r
\r
- Dir.chdir(template_dir) {\r
- Find.find(".") {|input|\r
- Find.prune if skip_opends && File.basename(input) == "opends"\r
- next if File.directory?(input) || File.extname(input) != ".erb"\r
- next if skip_email && input == "./redmine/config/email.yml.erb"\r
- output = File.expand_path(File.join(home, input[0..-5]))\r
+ Dir.chdir(template_dir) {\r
+ Find.find(".") {|input|\r
+ Find.prune if skip_opends && File.basename(input) == "opends"\r
+ next if File.directory?(input) || File.extname(input) != ".erb"\r
+ next if skip_email && input == "./redmine/config/email.yml.erb"\r
+ output = File.expand_path(File.join(home, input[0..-5]))\r
\r
- puts output\r
- File.open(output, "w") {|f|\r
- f.print ERB.new(File.read(input)).result(env._binding)\r
- }\r
- }\r
- }\r
- end\r
+ puts output\r
+ File.open(output, "w") {|f|\r
+ f.print ERB.new(File.read(input)).result(env._binding)\r
+ }\r
+ }\r
+ }\r
+ end\r
end\r
PACKAGE_HOME = File.expand_path(ENV["PACKAGE_HOME"])\r
\r
module Command\r
- def install\r
- service_names.each {|name|\r
- if (Win32::Service.status(name) rescue nil)\r
- warn "Error: service #{name} already exists"\r
- exit 1\r
- end\r
- }\r
-\r
- wrapper = File.join(PACKAGE_HOME, "script/wrapper.bat")\r
-\r
- config.each {|key, conf|\r
- name = conf["service_name"]\r
- port = conf["port"]\r
-\r
- begin\r
- case key.to_sym\r
- when :apache\r
- httpd = File.join(PACKAGE_HOME, "apache/bin/httpd.exe")\r
- raise unless system(%Q["#{httpd}" -k install -n "#{name}"])\r
- raise unless system(%Q[sc config "#{name}" binpath= "\\"#{wrapper}\\" httpd -k runservice"])\r
- next\r
- when :redmine\r
- redmine = File.join(PACKAGE_HOME, "redmine")\r
- script = File.join(PACKAGE_HOME, "script/mongrel_rails_env")\r
- raise unless system(%Q[mongrel_rails service::install -N "#{name}" -c "#{redmine}" -p #{port} -e production --prefix /redmine -S "#{script}"])\r
- system(%Q[sc config "#{name}" start= auto])\r
- when :hudson\r
- exe = File.join(PACKAGE_HOME, "hudson/hudson.exe")\r
- raise unless system(%Q[sc create #{name} binpath= "\\"#{wrapper}\\" \\"#{exe}\\"" start= auto])\r
- when :opends\r
- opends = File.join(PACKAGE_HOME, "opends")\r
- exe = File.join(opends, "lib/opends_service.exe")\r
- raise unless system(%Q["#{exe}" create "#{opends}" "#{name}" "OpenDS"])\r
- else\r
- raise\r
- end\r
-\r
- #warn "service #{name} installed"\r
- rescue\r
- warn "Error: failed to install service #{name}"\r
- exit 1\r
- end\r
- }\r
- start\r
- end\r
-\r
- def uninstall\r
- stop(false)\r
- service_names.each {|name|\r
- next unless status(name)\r
-\r
- begin\r
- Win32::Service.delete(name)\r
- warn "service #{name} uninstalled"\r
- rescue\r
- warn "Error: failed to uninstall service #{name}"\r
- exit 1\r
- end\r
- }\r
- end\r
-\r
- def start(verbose=true)\r
- service_names.each {|name|\r
- next unless s = status(name, verbose)\r
- if s == "running"\r
- warn "service #{name} is already running" if verbose\r
- next\r
- end\r
-\r
- begin\r
- Win32::Service.start(name)\r
- sleep 0.1 while status(name, false) == "start pending"\r
- raise if status(name, false) != "running"\r
- warn "service #{name} started"\r
- rescue\r
- warn "Error: failed to start service #{name}"\r
- exit 1\r
- end\r
- }\r
- end\r
-\r
- def stop(verbose=true)\r
- service_names.each {|name|\r
- next unless s = status(name, verbose)\r
- if s == "stopped"\r
- warn "service #{name} has already been stopped" if verbose\r
- next\r
- end\r
-\r
- begin\r
- Win32::Service.stop(name)\r
- sleep 0.1 while status(name, false) != "stopped"\r
- warn "service #{name} stopped"\r
- rescue\r
- warn "Error: failed to stop service #{name}"\r
- exit 1\r
- end\r
- }\r
- end\r
-\r
- def restart\r
- stop\r
- start\r
- end\r
-\r
- def status(name=nil, verbose=true)\r
- if name\r
- service = Win32::Service.status(name) rescue nil\r
- warn "service #{name} is not installed" if verbose && service.nil?\r
- return service && service.current_state\r
- end\r
-\r
- service_names.each {|name|\r
- begin\r
- status = Win32::Service.status(name).current_state\r
- warn "#{name}: #{status}"\r
- rescue\r
- warn "#{name}: not installed"\r
- end\r
- }\r
- nil\r
- end\r
+ def install\r
+ service_names.each {|name|\r
+ if (Win32::Service.status(name) rescue nil)\r
+ warn "Error: service #{name} already exists"\r
+ exit 1\r
+ end\r
+ }\r
+\r
+ wrapper = File.join(PACKAGE_HOME, "script/wrapper.bat")\r
+\r
+ config.each {|key, conf|\r
+ name = conf["service_name"]\r
+ port = conf["port"]\r
+\r
+ begin\r
+ case key.to_sym\r
+ when :apache\r
+ httpd = File.join(PACKAGE_HOME, "apache/bin/httpd.exe")\r
+ raise unless system(%Q["#{httpd}" -k install -n "#{name}"])\r
+ raise unless system(%Q[sc config "#{name}" binpath= "\\"#{wrapper}\\" httpd -k runservice"])\r
+ next\r
+ when :redmine\r
+ redmine = File.join(PACKAGE_HOME, "redmine")\r
+ script = File.join(PACKAGE_HOME, "script/mongrel_rails_env")\r
+ raise unless system(%Q[mongrel_rails service::install -N "#{name}" -c "#{redmine}" -p #{port} -e production --prefix /redmine -S "#{script}"])\r
+ system(%Q[sc config "#{name}" start= auto])\r
+ when :hudson\r
+ exe = File.join(PACKAGE_HOME, "hudson/hudson.exe")\r
+ raise unless system(%Q[sc create #{name} binpath= "\\"#{wrapper}\\" \\"#{exe}\\"" start= auto])\r
+ when :opends\r
+ opends = File.join(PACKAGE_HOME, "opends")\r
+ exe = File.join(opends, "lib/opends_service.exe")\r
+ raise unless system(%Q["#{exe}" create "#{opends}" "#{name}" "OpenDS"])\r
+ else\r
+ raise\r
+ end\r
+\r
+ #warn "service #{name} installed"\r
+ rescue\r
+ warn "Error: failed to install service #{name}"\r
+ exit 1\r
+ end\r
+ }\r
+ start\r
+ end\r
+\r
+ def uninstall\r
+ stop(false)\r
+ service_names.each {|name|\r
+ next unless status(name)\r
+\r
+ begin\r
+ Win32::Service.delete(name)\r
+ warn "service #{name} uninstalled"\r
+ rescue\r
+ warn "Error: failed to uninstall service #{name}"\r
+ exit 1\r
+ end\r
+ }\r
+ end\r
+\r
+ def start(verbose=true)\r
+ service_names.each {|name|\r
+ next unless s = status(name, verbose)\r
+ if s == "running"\r
+ warn "service #{name} is already running" if verbose\r
+ next\r
+ end\r
+\r
+ begin\r
+ Win32::Service.start(name)\r
+ sleep 0.1 while status(name, false) == "start pending"\r
+ raise if status(name, false) != "running"\r
+ warn "service #{name} started"\r
+ rescue\r
+ warn "Error: failed to start service #{name}"\r
+ exit 1\r
+ end\r
+ }\r
+ end\r
+\r
+ def stop(verbose=true)\r
+ service_names.each {|name|\r
+ next unless s = status(name, verbose)\r
+ if s == "stopped"\r
+ warn "service #{name} has already been stopped" if verbose\r
+ next\r
+ end\r
+\r
+ begin\r
+ Win32::Service.stop(name)\r
+ sleep 0.1 while status(name, false) != "stopped"\r
+ warn "service #{name} stopped"\r
+ rescue\r
+ warn "Error: failed to stop service #{name}"\r
+ exit 1\r
+ end\r
+ }\r
+ end\r
+\r
+ def restart\r
+ stop\r
+ start\r
+ end\r
+\r
+ def status(name=nil, verbose=true)\r
+ if name\r
+ service = Win32::Service.status(name) rescue nil\r
+ warn "service #{name} is not installed" if verbose && service.nil?\r
+ return service && service.current_state\r
+ end\r
+\r
+ service_names.each {|name|\r
+ begin\r
+ status = Win32::Service.status(name).current_state\r
+ warn "#{name}: #{status}"\r
+ rescue\r
+ warn "#{name}: not installed"\r
+ end\r
+ }\r
+ nil\r
+ end\r
end\r
\r
class Service\r
- extend Command\r
+ extend Command\r
\r
- class << self\r
- def config\r
- @config ||= YAML.load_file(File.join(PACKAGE_HOME, "config/service.yml"))\r
- end\r
+ class << self\r
+ def config\r
+ @config ||= YAML.load_file(File.join(PACKAGE_HOME, "config/service.yml"))\r
+ end\r
\r
- def service_names\r
- @service_names ||= config.values.map {|h| h["service_name"]}\r
- end\r
+ def service_names\r
+ @service_names ||= config.values.map {|h| h["service_name"]}\r
+ end\r
\r
- def usage\r
- warn <<EOT\r
+ def usage\r
+ warn <<EOT\r
Usage: service <command>\r
\r
Commands:\r
#{Command.instance_methods.sort.join("\n ")}\r
EOT\r
- exit 1\r
- end\r
-\r
- def method_missing(name, *args)\r
- warn "Unknown command #{name}"\r
- usage\r
- end\r
- end\r
+ exit 1\r
+ end\r
+\r
+ def method_missing(name, *args)\r
+ warn "Unknown command #{name}"\r
+ usage\r
+ end\r
+ end\r
end\r
\r
(command, pause) = ARGV[0..1]\r