Class: Mrt::Ingest::OneTimeServer

Inherits:
Object
  • Object
show all
Defined in:
lib/mrt/ingest/one_time_server.rb

Instance Method Summary collapse

Constructor Details

#initializeOneTimeServer

Returns a new instance of OneTimeServer.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/mrt/ingest/one_time_server.rb', line 25

def initialize
  @dir = Dir.mktmpdir
  @mutex = Mutex.new
  @known_paths = {}
  @requested = {}
  @port = get_open_port()
  @file_callback = lambda do |req, res|
    @requested[req.path] ||= true
  end

  config = { :Port => @port }
  @server = WEBrick::HTTPServer.new(config)
  @server.mount("/", WEBrick::HTTPServlet::FileHandler, @dir,
                { :FileCallback=>@file_callback })
end

Instance Method Details

#add_file(sourcefile = nil) ⇒ Object

Add a file to this server. Returns the URL to use to fetch the file & the file path



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/mrt/ingest/one_time_server.rb', line 69

def add_file(sourcefile=nil)
  fullpath = get_temppath()
  path = File.basename(fullpath)
  if !sourcefile.nil? then
    @server.mount("/#{path}",
                  WEBrick::HTTPServlet::FileHandler,
                  sourcefile.path,
                  { :FileCallback=>@file_callback })
  else
    File.open(fullpath, 'w+') do |f|
      yield f
    end
  end
  return "http://#{Socket.gethostname}:#{@port}/#{path}", fullpath
end

#finished?Boolean

Return true if each file has been served.

Returns:

  • (Boolean)


42
43
44
45
46
47
48
49
50
# File 'lib/mrt/ingest/one_time_server.rb', line 42

def finished?
  Dir.entries(@dir).each do |entry|
    next if (entry == "." || entry == "..")
    if @requested["/#{entry}"].nil? then
      return false
    end
  end
  return true
end

#get_open_port(start = 8080) ⇒ Object

Find an open port, starting with start and adding one until we get an open port



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/mrt/ingest/one_time_server.rb', line 12

def get_open_port(start=8080)
  try_port = start
  while (true)
    begin
      s = TCPServer.open(try_port)
      s.close
      return try_port
    rescue Errno::EADDRINUSE
      try_port = try_port + 1
    end
  end
end

#get_temppathObject



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/mrt/ingest/one_time_server.rb', line 52

def get_temppath
  tmpfile = Tempfile.new("tmp", @dir)
  tmppath = tmpfile.path
  tmpfile.close!
  @mutex.synchronize do
    if !@known_paths.has_key?(tmppath) then
      # no collision
      @known_paths[tmppath] = true
      return tmppath
    end
  end
  # need to retry, there was a collision
  return get_temppath
end

#join_serverObject

Wait for server to finish serving all files.



99
100
101
102
103
104
# File 'lib/mrt/ingest/one_time_server.rb', line 99

def join_server
  # ensure that each file is requested once before shutting down
  while (!self.finished?) do sleep(1) end
  @server.shutdown 
  @thread.join
end

#runObject

Run the server and wait until each file has been served once. Cleans up files before it returns.



108
109
110
111
112
113
# File 'lib/mrt/ingest/one_time_server.rb', line 108

def run
  start_server()
  join_server()
  #    FileUtils.rm_rf(@dir)
  return
end

#start_serverObject



85
86
87
88
89
90
# File 'lib/mrt/ingest/one_time_server.rb', line 85

def start_server
  @thread = Thread.new do
    @server.start
  end
  return @thread
end

#stop_serverObject

Stop server unconditionally.



93
94
95
96
# File 'lib/mrt/ingest/one_time_server.rb', line 93

def stop_server
  @server.shutdown
  @thread.join
end