exa-template 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5b2ba256edf7da51eac0825a44dd1a26b5682759
4
+ data.tar.gz: 2df01a6fde32249f5226571fd60c7d7e15e7942e
5
+ SHA512:
6
+ metadata.gz: bf10a9d1b5c92904fa4fa88a3a0844ad7a71212683ac5f1fcb5cc4ef977adeeb35b43855a3ed0c9d9c0f1c0a06879321d11fd6b0814b4f6a570ce9234442d86c
7
+ data.tar.gz: 2c3e3a6d70f12b8a0a3bc789bce478d7d9adf8ccd379259bd68d58cc2fb5c511ca117bc70eef313cc9cb0211adaaa77735bc22e4c8f10001eb056f3d9252ae2a
data/README.md ADDED
@@ -0,0 +1 @@
1
+ exa-template
@@ -0,0 +1,14 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'exa-template'
3
+ s.version = '0.0.1'
4
+ s.date = '2017-03-02'
5
+ s.summary = 'exa-template'
6
+ s.description = 'Service discovery by BGP community'
7
+ s.authors = ['Donatas Abraitis']
8
+ s.email = 'donatas.abraitis@gmail.com'
9
+ s.files = ['README.md', 'exa-template.gemspec', 'lib/exa-template.rb']
10
+ s.homepage = 'http://rubygems.org/gems/exazk'
11
+ s.license = 'MIT'
12
+ s.add_runtime_dependency 'erb'
13
+ s.add_runtime_dependency 'json'
14
+ end
@@ -0,0 +1,65 @@
1
+ require 'erb'
2
+ require 'json'
3
+
4
+ class ExaTemplate
5
+ def initialize(template, destination, route_refresh = 5)
6
+ @template = template
7
+ @destination = destination
8
+ @bindings = binding
9
+ @services = reset_services
10
+ @route_refresh = route_refresh
11
+ end
12
+
13
+ def parse_events
14
+ loop do
15
+ chunks = []
16
+ begin
17
+ loop do
18
+ chunks << STDIN.read_nonblock(4096)
19
+ end
20
+ rescue IO::WaitReadable
21
+ retry if IO.select([STDIN], [], [], @route_refresh)
22
+ chunks.join.chomp.split("\n").each do |line|
23
+ event = JSON.parse(line)
24
+ next unless event['type'] == 'update'
25
+
26
+ parse_services(event)
27
+ @bindings.local_variable_set(:services, @services)
28
+ render_template
29
+ end
30
+ route_refresh
31
+ end
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def reset_services
38
+ @services = Hash.new { |h,k| h[k] = [] }
39
+ end
40
+
41
+ def route_refresh
42
+ reset_services
43
+ $stdout.write 'announce route-refresh ipv4 unicast'
44
+ $stdout.write 'announce route-refresh ipv6 unicast'
45
+ $stdout.flush
46
+ end
47
+
48
+ def parse_services(event)
49
+ community = event['neighbor']['message']['update']['attribute']['community']
50
+ community&.each do |c|
51
+ port = c[1]
52
+ event['neighbor']['message']['update']['announce']['ipv4 unicast']&.each do |_, prefix|
53
+ @services[port] << prefix.keys.flatten.first
54
+ end
55
+ event['neighbor']['message']['update']['announce']['ipv6 unicast']&.each do |_, prefix|
56
+ @services[port] << prefix.keys.flatten.first
57
+ end
58
+ end
59
+ end
60
+
61
+ def render_template
62
+ template = ERB.new(File.read(@template), nil, '-').result(@bindings)
63
+ File.write(@destination, template)
64
+ end
65
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: exa-template
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Donatas Abraitis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-03-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: erb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Service discovery by BGP community
42
+ email: donatas.abraitis@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - README.md
48
+ - exa-template.gemspec
49
+ - lib/exa-template.rb
50
+ homepage: http://rubygems.org/gems/exazk
51
+ licenses:
52
+ - MIT
53
+ metadata: {}
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubyforge_project:
70
+ rubygems_version: 2.5.1
71
+ signing_key:
72
+ specification_version: 4
73
+ summary: exa-template
74
+ test_files: []