logs-cf-plugin 0.0.39.pre → 0.0.40.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,11 @@
|
|
1
1
|
module LogsCfPlugin
|
2
2
|
class ClientConfig
|
3
|
-
attr_reader :loggregator_host, :user_token, :output, :trace, :use_ssl
|
3
|
+
attr_reader :loggregator_host, :loggregator_port, :user_token, :output, :trace, :use_ssl
|
4
4
|
|
5
|
-
def initialize(loggregator_host, user_token, output, trace, use_ssl = true)
|
5
|
+
def initialize(loggregator_host, loggregator_port, user_token, output, trace, use_ssl = true)
|
6
6
|
@output = output
|
7
7
|
@loggregator_host = loggregator_host
|
8
|
+
@loggregator_port = loggregator_port
|
8
9
|
@user_token = user_token
|
9
10
|
@trace = trace
|
10
11
|
@use_ssl = use_ssl
|
@@ -26,8 +26,8 @@ module LogsCfPlugin
|
|
26
26
|
Mothership::Help.command_help(@@commands[:logs])
|
27
27
|
fail "Please provide an application to log."
|
28
28
|
end
|
29
|
-
|
30
|
-
client_config = ClientConfig.new(loggregator_host, client.token.auth_header, STDOUT, input[:trace], use_ssl)
|
29
|
+
port = input[:recent] ? nil : 4443
|
30
|
+
client_config = ClientConfig.new(loggregator_host, port, client.token.auth_header, STDOUT, input[:trace], use_ssl)
|
31
31
|
|
32
32
|
client_clazz = input[:recent] ? RecentLogsClient : TailingLogsClient
|
33
33
|
client_clazz.new(client_config).logs_for(input[:app])
|
@@ -9,24 +9,9 @@ module LogsCfPlugin
|
|
9
9
|
|
10
10
|
def logs_for(app)
|
11
11
|
prefix = use_ssl ? 'https' : 'http'
|
12
|
-
uri = "#{prefix}://#{loggregator_host}/dump/?app=#{app.guid}"
|
13
|
-
response = make_dump_request(uri)
|
14
|
-
|
15
|
-
case response.code
|
16
|
-
when "200"
|
17
|
-
# fall thru
|
18
|
-
when "302"
|
19
|
-
response = make_dump_request(response['location'])
|
20
|
-
when "401"
|
21
|
-
output.puts("Unauthorized")
|
22
|
-
return
|
23
|
-
when "404"
|
24
|
-
output.puts("App #{app.name} not found")
|
25
|
-
return
|
26
|
-
else
|
27
|
-
output.puts("Error connecting to server #{response.code}")
|
28
|
-
return
|
29
|
-
end
|
12
|
+
uri = "#{prefix}://#{loggregator_host}#{loggregator_port ? ":#{loggregator_port}" : ""}/dump/?app=#{app.guid}"
|
13
|
+
response = make_dump_request(uri, app)
|
14
|
+
return unless response
|
30
15
|
|
31
16
|
response_bytes = StringIO.new(response.body)
|
32
17
|
messages = []
|
@@ -57,10 +42,10 @@ module LogsCfPlugin
|
|
57
42
|
|
58
43
|
attr_reader :config
|
59
44
|
|
60
|
-
delegate :output, :loggregator_host, :user_token, :trace, :use_ssl,
|
45
|
+
delegate :output, :loggregator_host, :loggregator_port, :user_token, :trace, :use_ssl,
|
61
46
|
to: :config
|
62
47
|
|
63
|
-
def make_dump_request(uri)
|
48
|
+
def make_dump_request(uri, app)
|
64
49
|
uri = URI.parse(uri)
|
65
50
|
http = Net::HTTP.new(uri.host, uri.port)
|
66
51
|
http.use_ssl = use_ssl
|
@@ -80,7 +65,23 @@ module LogsCfPlugin
|
|
80
65
|
end
|
81
66
|
|
82
67
|
response = http.request(request)
|
83
|
-
|
68
|
+
|
69
|
+
case response.code
|
70
|
+
when "200"
|
71
|
+
return response
|
72
|
+
when "302"
|
73
|
+
response = make_dump_request(response['location'], app)
|
74
|
+
return response
|
75
|
+
when "401"
|
76
|
+
output.puts("Unauthorized")
|
77
|
+
return
|
78
|
+
when "404"
|
79
|
+
output.puts("App #{app.name} not found")
|
80
|
+
return
|
81
|
+
else
|
82
|
+
output.puts("Error connecting to server #{response.code}")
|
83
|
+
return
|
84
|
+
end
|
84
85
|
end
|
85
86
|
|
86
87
|
def sane_headers(obj)
|
@@ -8,62 +8,86 @@ module LogsCfPlugin
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def logs_for(app)
|
11
|
-
|
12
|
-
|
13
|
-
else
|
14
|
-
websocket_address = "ws://#{loggregator_host}/tail/?app=#{app.guid}"
|
15
|
-
end
|
11
|
+
protocol = use_ssl ? "wss" : "ws"
|
12
|
+
websocket_address = "#{protocol}://#{loggregator_host}#{loggregator_port ? ":#{loggregator_port}" : ""}/tail/?app=#{app.guid}"
|
16
13
|
|
17
14
|
output.puts "websocket_address: #{websocket_address}" if trace
|
18
15
|
|
19
|
-
|
20
|
-
|
16
|
+
make_websocket_request(app, websocket_address)
|
17
|
+
end
|
21
18
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
def make_websocket_request(app, websocket_address)
|
20
|
+
redirect_uri = nil
|
21
|
+
@em_client_thread = Thread.new do
|
22
|
+
EM.run {
|
23
|
+
ws = Faye::WebSocket::Client.new(websocket_address, nil, :headers => {"Origin" => "http://localhost", "Authorization" => user_token})
|
24
|
+
ws.on :open do |event|
|
25
|
+
output.puts("Connected to server.")
|
26
|
+
EventMachine.add_periodic_timer(keep_alive_interval) do
|
27
|
+
ws.send([42])
|
28
|
+
end
|
26
29
|
end
|
27
|
-
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
31
|
+
ws.on :message do |event|
|
32
|
+
begin
|
33
|
+
received_message = LogMessage.decode(event.data.pack("C*"))
|
34
|
+
write(app, output, received_message)
|
35
|
+
rescue Beefcake::Message::WrongTypeError, Beefcake::Message::RequiredFieldNotSetError, Beefcake::Message::InvalidValueError
|
36
|
+
output.puts("Error parsing data. Please ensure your gem is the latest version.")
|
37
|
+
ws.close
|
38
|
+
@em_client_thread.kill
|
39
|
+
end
|
37
40
|
end
|
38
|
-
end
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
ws.on :error do |event|
|
43
|
+
if !redirect_uri
|
44
|
+
if event.current_target.status == 302
|
45
|
+
redirect_uri = event.current_target.headers["location"]
|
46
|
+
ws.close
|
47
|
+
@em_client_thread.kill
|
48
|
+
ws = nil
|
49
|
+
else
|
50
|
+
output.puts("Server error: #{websocket_address}")
|
51
|
+
output.puts(event.data.inspect) if trace
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
44
55
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
56
|
+
ws.on :close do |event|
|
57
|
+
unless redirect_uri
|
58
|
+
ws.close
|
59
|
+
case event.code
|
60
|
+
when 4000
|
61
|
+
output.puts("Error: No space given.")
|
62
|
+
when 4001
|
63
|
+
output.puts("Error: No authorization token given.")
|
64
|
+
when 4002
|
65
|
+
output.puts("Error: Not authorized.")
|
66
|
+
end
|
67
|
+
output.puts("Server dropped connection...goodbye.")
|
68
|
+
@em_client_thread.kill
|
69
|
+
ws = nil
|
70
|
+
end
|
54
71
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
wait_for_em_thread_to_finish
|
76
|
+
|
77
|
+
make_websocket_request(app, redirect_uri) if redirect_uri
|
78
|
+
end
|
79
|
+
|
80
|
+
def wait_for_em_thread_to_finish
|
81
|
+
while @em_client_thread.alive? do
|
82
|
+
sleep 0.1
|
83
|
+
end
|
60
84
|
end
|
61
85
|
|
62
86
|
private
|
63
87
|
|
64
88
|
attr_reader :config
|
65
89
|
|
66
|
-
delegate :output, :loggregator_host, :user_token, :trace, :use_ssl,
|
90
|
+
delegate :output, :loggregator_host, :loggregator_port, :user_token, :trace, :use_ssl,
|
67
91
|
to: :config
|
68
92
|
|
69
93
|
def keep_alive_interval
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logs-cf-plugin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.40.pre
|
5
5
|
prerelease: 7
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-09-
|
12
|
+
date: 2013-09-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cf
|