redfish_tools 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/redfish_tools/cli.rb +23 -0
- data/lib/redfish_tools/cli/listen_sse.rb +20 -0
- data/lib/redfish_tools/cli/serve_sse.rb +22 -0
- data/lib/redfish_tools/datastore.rb +4 -4
- data/lib/redfish_tools/servlet.rb +14 -3
- data/lib/redfish_tools/sse_client.rb +20 -0
- data/lib/redfish_tools/sse_server.rb +42 -0
- data/lib/redfish_tools/version.rb +1 -1
- data/redfish_tools.gemspec +1 -0
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc9c77cc1157ae9cd393037166415de232253227a598a0e6a6e4f21cb13d7099
|
4
|
+
data.tar.gz: eaa18973472a9ade244813bf46430f8aa185a0cf9f374e7608020995796c3c00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b622a6604c1c5584055108cc19ad6a637b619cb5dc6a2890b4f0dcf016903b55b9ec190444dfad7369dce497a776073f992de46ece288f98b2feef1bf07469c
|
7
|
+
data.tar.gz: 2d4b1ebf6bb2761b0f0853ee741dca6ff1d5e5a36b8700301ad8307f8ad857498d6a9e6d444019f9604ab149ab3fa35985ed337aa00a8fa7b5cbbf816543fe0e
|
data/lib/redfish_tools/cli.rb
CHANGED
@@ -67,5 +67,28 @@ module RedfishTools
|
|
67
67
|
rescue StandardError => e
|
68
68
|
raise Thor::Error, e.to_s
|
69
69
|
end
|
70
|
+
|
71
|
+
desc "serve_sse [OPTIONS] SOURCE", "serve events from SOURCE"
|
72
|
+
option :port,
|
73
|
+
desc: "port that should be used to serve events",
|
74
|
+
default: 8001,
|
75
|
+
type: :numeric
|
76
|
+
option :bind,
|
77
|
+
desc: "address that server should bind to",
|
78
|
+
default: "127.0.0.1"
|
79
|
+
option :ssl,
|
80
|
+
desc: "use SSL",
|
81
|
+
default: false,
|
82
|
+
type: :boolean
|
83
|
+
def serve_sse(source)
|
84
|
+
require "redfish_tools/cli/serve_sse"
|
85
|
+
ServeSse.new(source, options).run
|
86
|
+
end
|
87
|
+
|
88
|
+
desc "listen_sse ADDRESS", "listen to events from ADDRESS"
|
89
|
+
def listen_sse(address)
|
90
|
+
require "redfish_tools/cli/listen_sse"
|
91
|
+
ListenSse.new(address, options).run
|
92
|
+
end
|
70
93
|
end
|
71
94
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "redfish_tools/sse_client"
|
4
|
+
|
5
|
+
module RedfishTools
|
6
|
+
class Cli
|
7
|
+
class ListenSse
|
8
|
+
def initialize(address, options)
|
9
|
+
@address = address
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
sse = RedfishTools::SseClient.new(@address)
|
15
|
+
trap("INT") { exit }
|
16
|
+
sse.start
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "redfish_tools/sse_server"
|
4
|
+
|
5
|
+
module RedfishTools
|
6
|
+
class Cli
|
7
|
+
class ServeSse
|
8
|
+
def initialize(source, options)
|
9
|
+
@source = source
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
sse = RedfishTools::SseServer.new(
|
15
|
+
@source, @options[:bind], @options[:port]
|
16
|
+
)
|
17
|
+
trap("INT") { exit }
|
18
|
+
sse.start
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -4,7 +4,7 @@ require "json"
|
|
4
4
|
|
5
5
|
module RedfishTools
|
6
6
|
class DataStore
|
7
|
-
Resource = Struct.new(:id, :body, :headers, :time)
|
7
|
+
Resource = Struct.new(:id, :body, :headers, :time, :parent)
|
8
8
|
|
9
9
|
def initialize(base_path)
|
10
10
|
@base_path = File.expand_path(base_path)
|
@@ -16,11 +16,11 @@ module RedfishTools
|
|
16
16
|
|
17
17
|
def get(id)
|
18
18
|
id = id.chomp("/")
|
19
|
-
@overlay[id]
|
19
|
+
@overlay[id] = @overlay.fetch(id, load_resource(id))
|
20
20
|
end
|
21
21
|
|
22
|
-
def set(id, body, headers: nil, time: nil)
|
23
|
-
@overlay[id] = Resource.new(id, body, headers, time)
|
22
|
+
def set(id, body, headers: nil, time: nil, parent: nil)
|
23
|
+
@overlay[id] = Resource.new(id, body, headers, time, parent)
|
24
24
|
end
|
25
25
|
|
26
26
|
private
|
@@ -56,8 +56,9 @@ module RedfishTools
|
|
56
56
|
response.status = 501
|
57
57
|
end
|
58
58
|
|
59
|
-
def do_DELETE(
|
60
|
-
|
59
|
+
def do_DELETE(request, response)
|
60
|
+
delete_item(datastore.get(request.path))
|
61
|
+
response.status = 204
|
61
62
|
end
|
62
63
|
|
63
64
|
private
|
@@ -86,7 +87,17 @@ module RedfishTools
|
|
86
87
|
item.body["Members"].push("@odata.id" => oid)
|
87
88
|
|
88
89
|
base = { "@odata.id" => oid, "Id" => id, "Name" => id }
|
89
|
-
datastore.set(
|
90
|
+
datastore.set(oid, base.merge(data), parent: item)
|
91
|
+
end
|
92
|
+
|
93
|
+
def delete_item(item)
|
94
|
+
if item.parent
|
95
|
+
item.parent.body["Members@odata.count"] -= 1
|
96
|
+
item.parent.body["Members"].delete_if do |m|
|
97
|
+
m["@odata.id"] == item.id
|
98
|
+
end
|
99
|
+
end
|
100
|
+
datastore.set(item.id, nil)
|
90
101
|
end
|
91
102
|
|
92
103
|
def authorized?(request)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
|
5
|
+
require "server_sent_events"
|
6
|
+
|
7
|
+
module RedfishTools
|
8
|
+
class SseClient
|
9
|
+
def initialize(address)
|
10
|
+
@address = address
|
11
|
+
end
|
12
|
+
|
13
|
+
def start
|
14
|
+
ServerSentEvents.listen(@address) do |event|
|
15
|
+
puts JSON.pretty_generate("id" => event.id,
|
16
|
+
"data" => JSON.parse(event.data))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "date"
|
4
|
+
require "json"
|
5
|
+
require "socket"
|
6
|
+
|
7
|
+
module RedfishTools
|
8
|
+
class SseServer
|
9
|
+
HEADERS = "HTTP/1.1 200 OK\r\n"\
|
10
|
+
"Content-Type: text/event-stream\r\n"\
|
11
|
+
"\r\n"
|
12
|
+
|
13
|
+
def initialize(source, address, port)
|
14
|
+
@events = load_events(source)
|
15
|
+
@server = TCPServer.open(address, port)
|
16
|
+
end
|
17
|
+
|
18
|
+
def start
|
19
|
+
loop { Thread.start(@server.accept) { |client| handle_client(client) } }
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def load_events(source)
|
25
|
+
JSON.parse(File.read(source))
|
26
|
+
end
|
27
|
+
|
28
|
+
def handle_client(socket)
|
29
|
+
socket.print(HEADERS)
|
30
|
+
id = 0
|
31
|
+
loop do
|
32
|
+
event = @events.sample
|
33
|
+
event["Events"][0]["EventTimestamp"] = DateTime.now.to_s
|
34
|
+
socket.print("id: #{id}\ndata: #{event.to_json}\n\n")
|
35
|
+
sleep(rand(1..10))
|
36
|
+
id += 1
|
37
|
+
end
|
38
|
+
ensure
|
39
|
+
socket.close
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/redfish_tools.gemspec
CHANGED
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.require_paths = ["lib"]
|
30
30
|
|
31
31
|
spec.add_runtime_dependency "redfish_client", "~> 0.2.2"
|
32
|
+
spec.add_runtime_dependency "server_sent_events", "~> 0.1.1"
|
32
33
|
spec.add_runtime_dependency "thor", "~> 0.19"
|
33
34
|
|
34
35
|
spec.add_development_dependency "bundler", "~> 1.16"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redfish_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tadej Borovšak
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redfish_client
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.2.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: server_sent_events
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.1.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.1.1
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: thor
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,12 +143,16 @@ files:
|
|
129
143
|
- exe/redfish
|
130
144
|
- lib/redfish_tools.rb
|
131
145
|
- lib/redfish_tools/cli.rb
|
146
|
+
- lib/redfish_tools/cli/listen_sse.rb
|
132
147
|
- lib/redfish_tools/cli/record.rb
|
133
148
|
- lib/redfish_tools/cli/serve.rb
|
149
|
+
- lib/redfish_tools/cli/serve_sse.rb
|
134
150
|
- lib/redfish_tools/datastore.rb
|
135
151
|
- lib/redfish_tools/recorder.rb
|
136
152
|
- lib/redfish_tools/server.rb
|
137
153
|
- lib/redfish_tools/servlet.rb
|
154
|
+
- lib/redfish_tools/sse_client.rb
|
155
|
+
- lib/redfish_tools/sse_server.rb
|
138
156
|
- lib/redfish_tools/version.rb
|
139
157
|
- redfish_tools.gemspec
|
140
158
|
homepage: https://github.com/xlab-si/redfish-tools-ruby
|