Class: Baykit::BayServer::Agent::Signal::SignalAgent

Inherits:
Object
  • Object
show all
Includes:
Baykit::BayServer, Baykit::BayServer::Agent, Baykit::BayServer::Agent::Signal, Bcf, Util
Defined in:
lib/baykit/bayserver/agent/signal/signal_agent.rb

Constant Summary collapse

COMMAND_RELOAD_CERT =
"reloadcert"
COMMAND_MEM_USAGE =
"memusage"
COMMAND_RESTART_AGENTS =
"restartagents"
COMMAND_SHUTDOWN =
"shutdown"
COMMAND_ABORT =
"abort"

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(port) ⇒ SignalAgent

Returns a new instance of SignalAgent.



44
45
46
47
48
49
50
51
52
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 44

def initialize(port)
  @port = port
  @server_skt = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
  @server_skt.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)
  adr = Socket.sockaddr_in(@port, "127.0.0.1")
  @server_skt.bind(adr)
  @server_skt.listen(0)
  BayLog.info( BayMessage.get(:MSG_OPEN_CTL_PORT, @port))
end

Class Attribute Details

.commandsObject (readonly)

Returns the value of attribute commands.



26
27
28
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 26

def commands
  @commands
end

.signal_agentObject (readonly)

Returns the value of attribute signal_agent.



28
29
30
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 28

def signal_agent
  @signal_agent
end

.signal_mapObject (readonly)

Returns the value of attribute signal_map.



27
28
29
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 27

def signal_map
  @signal_map
end

Instance Attribute Details

#portObject (readonly)

Returns the value of attribute port.



41
42
43
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 41

def port
  @port
end

#server_sktObject (readonly)

Returns the value of attribute server_skt.



42
43
44
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 42

def server_skt
  @server_skt
end

Class Method Details

.get_signal_from_command(command) ⇒ Object



117
118
119
120
121
122
123
124
125
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 117

def SignalAgent.get_signal_from_command(command)
  init_signal_map()
  @signal_map.keys().each do |sig|
    if(@signal_map[sig].casecmp?(command))
      return sig;
    end
  end
  return nil
end

.handle_command(cmd) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 98

def SignalAgent.handle_command(cmd)
  BayLog.debug("handle command: %s", cmd)
  case (cmd.downcase)
  when COMMAND_RELOAD_CERT
    GrandAgentMonitor::reload_cert_all()
  when COMMAND_MEM_USAGE
    GrandAgentMonitor::print_usage_all()
  when COMMAND_RESTART_AGENTS
    GrandAgentMonitor::restart_all()
  when COMMAND_SHUTDOWN
    GrandAgentMonitor::shutdown_all()
  when COMMAND_ABORT
    GrandAgentMonitor::abort_all()
  else
    BayLog.error("Unknown command: %s", cmd)
  end
end

.init(bay_port) ⇒ Object

class methods



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 86

def SignalAgent.init(bay_port)
  @commands.each do |cmd|
    SignalProxy.register(get_signal_from_command(cmd)) do
      handle_command(cmd)
    end
  end

  if bay_port > 0
    @signal_agent = SignalAgent.new(bay_port)
  end
end

.init_signal_mapObject



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 127

def SignalAgent.init_signal_map()
  if !@signal_map.empty?
    return;
  end

  if SysUtil.run_on_windows()
    # Available signals on Windows
    #    SIGABRT
    #    SIGFPE
    #    SIGILL
    #    SIGINT
    #    SIGSEGV
    #    SIGTERM
    @signal_map["SEGV"] = COMMAND_RELOAD_CERT
    @signal_map["ILL"] = COMMAND_MEM_USAGE
    @signal_map["INT"] = COMMAND_SHUTDOWN
    @signal_map["TERM"] = COMMAND_RESTART_AGENTS
    @signal_map["ABRT"] = COMMAND_ABORT

  else
    @signal_map["ALRM"] = COMMAND_RELOAD_CERT
    @signal_map["TRAP"] = COMMAND_MEM_USAGE
    @signal_map["HUP"] = COMMAND_RESTART_AGENTS
    @signal_map["TERM"] = COMMAND_SHUTDOWN
    @signal_map["ABRT"] = COMMAND_ABORT
  end
end

.termObject



155
156
157
158
159
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 155

def SignalAgent.term()
  if @signal_agent
    @signal_agent.close()
  end
end

Instance Method Details

#closeObject



77
78
79
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 77

def close
  @server_skt.close
end

#on_socket_readableObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/baykit/bayserver/agent/signal/signal_agent.rb', line 54

def on_socket_readable()

  begin
    skt, = @server_skt.accept
    skt.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, [5, 0].pack("l_2"))

    line = skt.readline.strip()
    BayLog.info(BayMessage.get(:MSG_COMMAND_RECEIVED, line))
    SignalAgent.handle_command(line)
    skt.write("OK\n")
    skt.flush

  rescue => e
    BayLog.error_e(e)

  ensure
    if skt
      skt.close()
    end
  end

end