Class: BackgroundServices::Server

Inherits:
Object
  • Object
show all
Includes:
DRbUndumped, Singleton
Defined in:
lib/background_services/server.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeServer

Returns a new instance of Server.



41
42
43
44
45
# File 'lib/background_services/server.rb', line 41

def initialize
  @services = Hash.new
  @team_controllers = Hash.new
  @groups = Hash.new { |h, k| h[k] = BackgroundServices::Group.new(k) }
end

Instance Attribute Details

#groupsObject

Returns the value of attribute groups.



39
40
41
# File 'lib/background_services/server.rb', line 39

def groups
  @groups
end

#loggerObject

Returns the value of attribute logger.



35
36
37
# File 'lib/background_services/server.rb', line 35

def logger
  @logger
end

#optionsObject

Returns the value of attribute options.



36
37
38
# File 'lib/background_services/server.rb', line 36

def options
  @options
end

#servicesObject

Returns the value of attribute services.



38
39
40
# File 'lib/background_services/server.rb', line 38

def services
  @services
end

#team_controllersObject

Returns the value of attribute team_controllers.



37
38
39
# File 'lib/background_services/server.rb', line 37

def team_controllers
  @team_controllers
end

Class Method Details

.load(*args) ⇒ Object



7
8
9
# File 'lib/background_services/server.rb', line 7

def self.load(*args)
  include.load(*args)
end

.loggerObject



11
12
13
# File 'lib/background_services/server.rb', line 11

def self.logger
  instance.logger
end

.register_service(service) ⇒ Object



31
32
33
# File 'lib/background_services/server.rb', line 31

def self.register_service(service)
  instance.register_service(service)
end

.register_team(team) ⇒ Object



27
28
29
# File 'lib/background_services/server.rb', line 27

def self.register_team(team)
  instance.register_team(team)
end

.run!Object



19
20
21
# File 'lib/background_services/server.rb', line 19

def self.run!
  instance.run!
end

.setupObject



15
16
17
# File 'lib/background_services/server.rb', line 15

def self.setup
  instance.setup
end

.stop!Object



23
24
25
# File 'lib/background_services/server.rb', line 23

def self.stop!
  instance.stop!
end

Instance Method Details

#client_perform_list_groupsObject



195
196
197
198
199
# File 'lib/background_services/server.rb', line 195

def client_perform_list_groups
  @app.groups.keys.each do |name|
    puts "- #{name}"
  end
end

#client_perform_list_servicesObject



175
176
177
178
179
# File 'lib/background_services/server.rb', line 175

def client_perform_list_services
  @app.services.keys.each do |name|
    puts "- #{name}"
  end
end

#client_perform_list_teamsObject



181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/background_services/server.rb', line 181

def client_perform_list_teams
  first = true
  @app.team_controllers.each do |id, controller|
    team = controller.team
    service = team.service
    puts unless first
    first = false
    puts "- #{service.name}[#{id}] (#{team.size} workers - #{controller.running? ? "running" : "stopped"})"
    puts "  hosts: #{team.hosts.join(', ')}"
    puts "  tubes: #{team.tubes.join(', ')}"
    puts "  groups: #{team.groups.join(', ')}"
  end
end

#client_perform_start_groupObject



209
210
211
212
213
214
215
# File 'lib/background_services/server.rb', line 209

def client_perform_start_group
  group = @options[:groups].inject(nil) do |m, g|
    m = m.union(@app.groups[g]) unless m.nil?
    m ||= @app.groups[g]
  end
  group.start
end

#client_perform_start_teamObject



205
206
207
# File 'lib/background_services/server.rb', line 205

def client_perform_start_team
  @app.team_controllers[@options[:team_id]].start
end

#client_perform_stopObject



168
169
170
171
172
173
# File 'lib/background_services/server.rb', line 168

def client_perform_stop
  begin
    @app.stop!
  rescue DRb::DRbConnError
  end
end

#client_perform_stop_groupObject



217
218
219
220
221
222
223
# File 'lib/background_services/server.rb', line 217

def client_perform_stop_group
  group = @options[:groups].inject(nil) do |m, g|
    m = m.union(@app.groups[g]) unless m.nil?
    m ||= @app.groups[g]
  end
  group.stop
end

#client_perform_stop_teamObject



201
202
203
# File 'lib/background_services/server.rb', line 201

def client_perform_stop_team
  @app.team_controllers[@options[:team_id]].stop
end

#damonizeObject



119
120
121
# File 'lib/background_services/server.rb', line 119

def damonize
  Daemons.daemonize if options[:daemonize]
end

#load_filesObject



108
109
110
111
112
# File 'lib/background_services/server.rb', line 108

def load_files
  @options[:files].each do |file|
    DSL.load(file)
  end
end

#next_team_idObject



163
164
165
166
# File 'lib/background_services/server.rb', line 163

def next_team_id
  @next_team_id ||= 0
  @next_team_id += 1
end

#parse_optionsObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/background_services/server.rb', line 56

def parse_options
  @options = {
    :log => STDOUT,
    :level => Logger::INFO,
    :files => [],
    :run_server => true,
    :host => "127.0.0.1:5000",
    :daemonize => false
  }
  @opts = OptionParser.new do |opts|
    opts.banner = "Usage: #{File.basename($0)} [options]"
    opts.separator ""
    opts.separator "Server options: "
    
    opts.on("-c", "--config CONFIG_FILE", "Path to a configuration file") do |v|
      options[:files] << File.expand_path(v)
    end
    
    opts.on("-L", "--log LOG_FILE", "Path to the log file") do |v|
      options[:log] = File.expand_path(v)
    end
    
    opts.on("-d", "--daemonize", "Run in the background") do |v|
      options[:daemonize] = true
    end
    
    opts.on("-H", "--host HOST", "Server location") do |v|
      options[:host] = v
    end
    
    opts.on("--debug", "Run in debugging mode") do |v|
      options[:level] = Logger::DEBUG
      require 'ruby-debug'
    end
    
    opts.on_tail("-h", "--help", "Show this message") do |v|
      puts opts
      exit
    end
    
  end
  @opts.parse!
rescue OptionParser::InvalidOption, OptionParser::InvalidArgument, OptionParser::MissingArgument
  puts @opts
  exit(1)
end

#register_service(service) ⇒ Object



142
143
144
145
# File 'lib/background_services/server.rb', line 142

def register_service(service)
  @logger.debug "Registered service: #{service.name}"
  @services[service.name] = service
end

#register_signal_handlersObject



123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/background_services/server.rb', line 123

def register_signal_handlers
  terminator = Proc.new do
    BackgroundServices::Server.stop!
  end
  Signal.trap('TERM', terminator)
  Signal.trap('QUIT', terminator)
  Signal.trap('INT',  terminator)
  Signal.trap("CHLD") do
    @team_controllers.each do |id, controller|
      controller.check_process
    end
  end
end

#register_team(team) ⇒ Object



137
138
139
140
# File 'lib/background_services/server.rb', line 137

def register_team(team)
  @logger.debug "Registered team: #{team.inspect}"
  @team_controllers[team.id] = BackgroundServices::TeamController.new(team)
end

#run!Object



147
148
149
150
151
152
153
# File 'lib/background_services/server.rb', line 147

def run!
  @team_controllers.each do |id, controller|
    controller.start unless controller.running?
  end
  Process.waitall
  sleep(0.5) until @stopped
end

#setupObject



47
48
49
50
51
52
53
54
# File 'lib/background_services/server.rb', line 47

def setup
  parse_options
  damonize
  setup_logger
  load_files
  register_signal_handlers
  start_drb_server
end

#setup_loggerObject



103
104
105
106
# File 'lib/background_services/server.rb', line 103

def setup_logger
  @logger = Logger.new(options[:log])
  @logger.level = options[:level]
end

#start_drb_serverObject



114
115
116
117
# File 'lib/background_services/server.rb', line 114

def start_drb_server
  DRb.start_service "druby://"+@options[:host], self
  puts "listening on: #{DRb.uri}"
end

#stop!Object



155
156
157
158
159
160
161
# File 'lib/background_services/server.rb', line 155

def stop!
  @team_controllers.each do |id, controller|
    controller.stop if controller.running?
  end
  DRb.stop_service
  @stopped = true
end