diff options
Diffstat (limited to 'script/git-daemon')
-rwxr-xr-x | script/git-daemon | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/script/git-daemon b/script/git-daemon index b43d9ba..f5d91c2 100755 --- a/script/git-daemon +++ b/script/git-daemon @@ -2,10 +2,14 @@ require 'rubygems' require 'daemons' +require 'geoip' require 'socket' +ENV["RAILS_ENV"] ||= "production" require File.dirname(__FILE__)+'/../config/environment' +Rails.configuration.log_level = :info # Disable debug + BASE_PATH = File.expand_path(GitoriousConfig['repository_base_path']) module Git @@ -20,6 +24,7 @@ class Daemon def initialize daemonize(File.join(RAILS_ROOT, "log", "git-daemon.log")) + @geoip = GeoIP.new(File.join(RAILS_ROOT, "data", "GeoIP.dat")) trap "CLD" do pid = Process.wait log(pid, "Disconnected. (status=#{$?.exitstatus})") @@ -27,8 +32,7 @@ class Daemon port = 9418 server = TCPServer.new('localhost', port) - - service_regexp = /(\d{4})(git-[\w-]+)\s(.+)\x0host=([\w\.\-]+)/.freeze + service_regexp = /(\w{4})(git-[\w-]+)\s(.+)\x0host=([\w\.\-]+)/.freeze while session = server.accept line = session.recv(1000) timeout = 30 @@ -39,17 +43,27 @@ class Daemon host = $4 path = "#{BASE_PATH}/#{path}" - if !File.directory?(path) log(Process.pid, "Invalid path: #{path}") session.close next end + if !File.exist?(File.join(path, "git-daemon-export-ok")) + session.close + next + end + Dir.chdir(path) do cmd = "git-upload-pack --strict --timeout=#{timeout} ." fork do + repository = nil + begin + ActiveRecord::Base.allow_concurrency = true + repository = ::Repository.find_by_path(path) + rescue Exception + end pid = Process.pid domain, port, name, ip = session.addr log(pid, "Connection from #{ip}") @@ -58,10 +72,21 @@ class Daemon $stdin.reopen(session) session.close + if repository + localization = @geoip.country(ip) + repository.cloned_from(ip, localization[3], localization[5]) + else + log(pid, "Cannot find repository: #{path}") + end + exec(cmd) - exit + + exit! end end + else + $stderr.puts "Invalid request: #{line}" + session.close end end end |