construqt 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.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/lib/construqt/addresses.rb +204 -0
  3. data/lib/construqt/bgps.rb +164 -0
  4. data/lib/construqt/cables.rb +47 -0
  5. data/lib/construqt/firewalls.rb +247 -0
  6. data/lib/construqt/flavour/ciscian/ciscian.rb +687 -0
  7. data/lib/construqt/flavour/ciscian/dialect_dlink-dgs15xx.rb +235 -0
  8. data/lib/construqt/flavour/ciscian/dialect_hp-2510g.rb +114 -0
  9. data/lib/construqt/flavour/delegates.rb +448 -0
  10. data/lib/construqt/flavour/flavour.rb +97 -0
  11. data/lib/construqt/flavour/mikrotik/flavour_mikrotik.rb +417 -0
  12. data/lib/construqt/flavour/mikrotik/flavour_mikrotik_bgp.rb +134 -0
  13. data/lib/construqt/flavour/mikrotik/flavour_mikrotik_interface.rb +79 -0
  14. data/lib/construqt/flavour/mikrotik/flavour_mikrotik_ipsec.rb +65 -0
  15. data/lib/construqt/flavour/mikrotik/flavour_mikrotik_result.rb +182 -0
  16. data/lib/construqt/flavour/mikrotik/flavour_mikrotik_schema.rb +355 -0
  17. data/lib/construqt/flavour/plantuml/plantuml.rb +462 -0
  18. data/lib/construqt/flavour/ubuntu/flavour_ubuntu.rb +381 -0
  19. data/lib/construqt/flavour/ubuntu/flavour_ubuntu_bgp.rb +117 -0
  20. data/lib/construqt/flavour/ubuntu/flavour_ubuntu_dns.rb +97 -0
  21. data/lib/construqt/flavour/ubuntu/flavour_ubuntu_firewall.rb +300 -0
  22. data/lib/construqt/flavour/ubuntu/flavour_ubuntu_ipsec.rb +144 -0
  23. data/lib/construqt/flavour/ubuntu/flavour_ubuntu_opvn.rb +60 -0
  24. data/lib/construqt/flavour/ubuntu/flavour_ubuntu_result.rb +537 -0
  25. data/lib/construqt/flavour/ubuntu/flavour_ubuntu_services.rb +115 -0
  26. data/lib/construqt/flavour/ubuntu/flavour_ubuntu_vrrp.rb +52 -0
  27. data/lib/construqt/flavour/unknown/unknown.rb +175 -0
  28. data/lib/construqt/hostid.rb +42 -0
  29. data/lib/construqt/hosts.rb +98 -0
  30. data/lib/construqt/interfaces.rb +166 -0
  31. data/lib/construqt/ipsecs.rb +64 -0
  32. data/lib/construqt/networks.rb +81 -0
  33. data/lib/construqt/regions.rb +32 -0
  34. data/lib/construqt/resource.rb +42 -0
  35. data/lib/construqt/services.rb +53 -0
  36. data/lib/construqt/tags.rb +61 -0
  37. data/lib/construqt/templates.rb +37 -0
  38. data/lib/construqt/tests/test_addresses.rb +50 -0
  39. data/lib/construqt/tests/test_bgps.rb +24 -0
  40. data/lib/construqt/tests/test_hostid.rb +32 -0
  41. data/lib/construqt/tests/test_hosts.rb +23 -0
  42. data/lib/construqt/tests/test_utils.rb +76 -0
  43. data/lib/construqt/users.rb +19 -0
  44. data/lib/construqt/util.rb +163 -0
  45. data/lib/construqt/version.rb +3 -0
  46. data/lib/construqt/vlans.rb +51 -0
  47. data/lib/construqt.rb +92 -0
  48. metadata +105 -0
@@ -0,0 +1,462 @@
1
+
2
+ module Construqt
3
+ module Flavour
4
+ module Plantuml
5
+
6
+ def self.name
7
+ 'plantuml'
8
+ end
9
+
10
+ Flavour.add_aspect(self)
11
+ def self.simple(clazz)
12
+ # clazz
13
+ clazz.name[clazz.name.rindex(':')+1..-1].gsub(/Delegate$/,'')
14
+ end
15
+
16
+ class Node
17
+ attr_accessor :reference
18
+ def initialize(reference)
19
+ self.reference = reference
20
+ throw "Node need a ident #{reference.class.name}" unless reference.ident
21
+ #throw "Node need a clazz #{reference.class.name}" unless reference.clazz
22
+ # self.clazz = clazz
23
+ @in_links = {}
24
+ @out_links = {}
25
+ @drawed = false
26
+ end
27
+
28
+ def in_links
29
+ @in_links.values
30
+ end
31
+
32
+ def out_links
33
+ @out_links.values
34
+ end
35
+
36
+ def ident
37
+ reference.ident
38
+ end
39
+
40
+ def drawed=(a)
41
+ @drawed = a
42
+ end
43
+
44
+ def drawed!
45
+ prev = @drawed
46
+ @drawed = true
47
+ prev
48
+ end
49
+
50
+ def drawed?
51
+ @drawed
52
+ end
53
+
54
+ def in_links=(node)
55
+ @in_links[node.object_id] = node
56
+ end
57
+
58
+ def in_links?(node)
59
+ @in_links[node.object_id]
60
+ end
61
+
62
+ def connect(node)
63
+ throw "node not set" unless node
64
+ unless self.in_links?(node)
65
+ @out_links[node.object_id] = node
66
+ node.in_links = self
67
+ end
68
+ end
69
+ end
70
+
71
+ @tree = {}
72
+
73
+ def self.connect(node, out, path)
74
+ return if node.drawed!
75
+ # Construqt.logger.debug("planuml.draw:#{node.reference.name} #{node.ident} ")
76
+ node.out_links.each do |n|
77
+ # Construqt.logger.debug("planuml.draw:Out:#{node.reference.name} #{node.ident}:#{n.ident}")
78
+ unless simple(node.reference.class) == "Host"
79
+ out << "#{node.ident} .. #{n.ident}"
80
+ end
81
+
82
+ connect(n, out, path + [n.reference.name])
83
+ end
84
+ end
85
+
86
+ def self.ident(path, content)
87
+ ident = (0...path.length-1).to_a.map{ " " }.join('')
88
+ content.lines.map{|i| ident+i }.join('')
89
+ end
90
+
91
+ def self.draw(node, out, path, flat)
92
+ return if node.drawed!
93
+ n_kind = simple(node.reference.class)
94
+ if n_kind == "Host"
95
+ out << ident(path, "package \"#{node.ident}\" <<Node>> #DDDDDD {")
96
+ else
97
+ out << ident(path, <<UML)
98
+ object #{node.ident} <<#{n_kind}>> {
99
+ #{render_object_address(node.reference)}
100
+ }
101
+ UML
102
+ end
103
+
104
+ !flat && n_kind != 'Device' && node.out_links.each do |n|
105
+ draw(n, out, path + [n.reference.name], flat)
106
+ end
107
+
108
+ if n_kind == "Host"
109
+ out << ident(path, "}")
110
+ end
111
+ end
112
+
113
+ def self.render_object_address(iface)
114
+ out = []
115
+ out << "name = \"#{iface.name}\""
116
+ out << "desc = \"#{iface.description}\"" if iface.description
117
+ if iface.address
118
+ tags = []
119
+ [iface.address.v4s, iface.address.v6s].each do |ips|
120
+ next unless ips.first
121
+ prefix = ips.first.ipv4? ? "ipv4" : "ipv6"
122
+ ips.each_with_index do |ip, idx|
123
+ tags += Construqt::Tags.from(ip)||[]
124
+ out << "#{prefix}(#{idx}) = #{ip.to_string}"
125
+ end
126
+ end
127
+
128
+ iface.address.routes.each_with_index do |route, idx|
129
+ out << "route(#{idx}) = \"#{route.dst.to_string} via #{route.via.to_s}\""
130
+ end
131
+ iface.delegate.firewalls && iface.delegate.firewalls.each_with_index do |fw, idx|
132
+ out << "fw(#{idx}) = \"#{fw.name}\""
133
+ end
134
+ (iface.tags+tags).sort.uniq.each_with_index do |tag, idx|
135
+ out << "tag(#{idx}) = \"#{tag}\""
136
+ end
137
+ end
138
+
139
+ out.join("\n")
140
+ end
141
+
142
+ def self.clean_name(name)
143
+ #name = name.gsub(/\s+/, '_')
144
+ name.gsub(/[^0-9a-zA-Z_]/, '_')
145
+ end
146
+
147
+ def self.add_node_factory(type, host, *args)
148
+ factory = {
149
+ "BondDelegate.build_config" => lambda do |type, host, *args|
150
+ args.first
151
+ end,
152
+ "BridgeDelegate.build_config" => lambda do |type, host, *args|
153
+ args.first
154
+ end,
155
+ "DeviceDelegate.build_config" => lambda do |type, host, *args|
156
+ #Construqt.logger.debug("DeviceDelegate.build_config:#{host.class.name} #{args.map{|i| i.name}}")
157
+ args.first
158
+ end,
159
+ "HostDelegate.build_config" => lambda do |type, host, *args|
160
+ #Construqt.logger.debug("Planuml:HostDelegate.build_config:#{host.name}")
161
+ #binding.pry
162
+ args.first
163
+ end,
164
+ "InterfaceDelegate.build_config" => lambda do |type, host, *args|
165
+ nil
166
+ end,
167
+ "OpvnDelegate.build_config" => lambda do |type, host, *args|
168
+ args.first
169
+ end,
170
+ "VlanDelegate.build_config" => lambda do |type, host, *args|
171
+ args.first
172
+ end,
173
+ "IpsecDelegate.build_config" => lambda do |type, host, *args|
174
+ args.first.cfg
175
+ end,
176
+ "VrrpDelegate.build_config" => lambda do |type, host, *args|
177
+ args.first
178
+ end,
179
+ "GreDelegate.build_config" => lambda do |type, host, *args|
180
+ args.first
181
+ end,
182
+ "BgpDelegate.build_config" => lambda do |type, host, *args|
183
+ args.first.cfg
184
+ end
185
+
186
+ }
187
+
188
+ method = factory[type]
189
+ if method
190
+ obj = method.call(type, host, *args)
191
+ if obj
192
+ ident = obj.ident
193
+ throw "A object needs a ident #{obj.class.name}" unless ident
194
+ @tree[ident] ||= Node.new(obj)
195
+ end
196
+ else
197
+ Construqt.logger.debug "Planuml:add_node_factory type not found #{type}"
198
+ end
199
+ end
200
+
201
+ def self.build_tree
202
+ #binding.pry
203
+ @tree.each do |ident,node|
204
+ #binding.pry
205
+ # Construqt.logger.debug "Planuml:build_tree=#{node.reference.class.name}=#{simple(node.reference.class)}"
206
+ {
207
+ "Vrrp" => lambda do |node|
208
+ node.reference.delegate.interfaces.each do |i|
209
+ node.connect @tree[i.ident]
210
+ end
211
+ end,
212
+ "Vlan" => lambda do |node|
213
+ node.reference.interfaces.each do |vlan_iface|
214
+ node.connect @tree[vlan_iface.ident]
215
+ end
216
+ end,
217
+ "Bond" => lambda do |node|
218
+ node.reference.delegate.interfaces.each do |i|
219
+ #Construqt.logger.debug(">>>>>>>>>> BOND -> #{simple(i.clazz)} #{i.name}")
220
+ node.connect @tree[i.ident]
221
+ end
222
+ end,
223
+ "Bridge" => lambda do |node|
224
+ node.reference.delegate.interfaces.each do |i|
225
+ #binding.pry
226
+ node.connect @tree[i.ident]
227
+ end
228
+ end,
229
+ "Device" => lambda do |node|
230
+ if node.reference.cable
231
+ node.connect @tree[node.reference.cable.other.ident]
232
+ end
233
+ end,
234
+ "Template" => lambda do |node|
235
+ # iface.interface.delegate.vlans.each do |i|
236
+ # iface.connect tree[simple(i.clazz)][i.name]
237
+ # end
238
+ end,
239
+ "Gre" => lambda do |node|
240
+ # binding.pry
241
+ interface = node.reference.delegate.local.interface
242
+ node.connect @tree[interface.ident]
243
+ end,
244
+ "Opvn" => lambda do |node|
245
+ end,
246
+ "Ipsec" => lambda do |node|
247
+ [node.reference.left, node.reference.right].each do |iface|
248
+ binding.pry unless @tree[iface.interface.ident]
249
+ node.connect @tree[iface.interface.ident]
250
+ end
251
+ end,
252
+ "Bgp" => lambda do |node|
253
+ #binding.pry
254
+ [node.reference.left, node.reference.right].each do |iface|
255
+ node.connect @tree[iface.my.ident]
256
+ end
257
+ end,
258
+ "Host" => lambda do |node|
259
+ node.reference.interfaces.values.each do |iface|
260
+ next if simple(iface.class) == "Vrrp"
261
+ #Construqt.logger.debug "Planuml:Host:#{iface.name}:#{iface.ident}:#{simple(iface.class)}"
262
+ node.connect @tree[iface.ident]
263
+ end
264
+ end
265
+
266
+ }[simple(node.reference.class)].call(node)
267
+ end
268
+ end
269
+
270
+ #X #render_matrixs = []
271
+ #X #[i"Vrrp","Vlan", "Bridge", "Bond", "Device"].each do |clazz|
272
+ #X tree.keys.each do |clazz|
273
+ #X (tree[clazz]||{}).values.each do |node|
274
+ #X next unless node.in_links.empty?
275
+ #X next if node.drawed?
276
+ #X draw(node, out, [node.reference.name])
277
+ #X end
278
+
279
+ #X end
280
+
281
+ #X out << <<UML
282
+ #X }
283
+ #X end
284
+
285
+ #
286
+ def self.call(type, *args)
287
+ add_node_factory(type, *args)
288
+ factory = {
289
+ #X "host.commit" => lambda do |type, host, *args|
290
+ #X #binding.pry
291
+ #X # vrrp -> bridge -> vlan -> bond -> device
292
+ #X # vrrp1
293
+ #X # vlan1 vlan2
294
+ #X # bond
295
+ #X # device0 device1
296
+ #X #
297
+ #X out = []
298
+ #X
299
+ #X out << <<UML
300
+ #X package "#{host.name}" {
301
+ #X UML
302
+ #X tree = {}
303
+ #X host.interfaces.each do |k,v|
304
+ #X key = simple(v.clazz)
305
+ #X tree[key] ||= {}
306
+ #X ident = "#{clean_name(host.name)}_#{key}_#{clean_name(v.name)}"
307
+ #X tree[key][v.name] = Node.new(key, ident, v)
308
+ #X out << <<UML
309
+ #X object #{ident} {
310
+ #X #{render_object_address(v)}
311
+ #X }
312
+ #X UML
313
+ #X end
314
+
315
+ #X
316
+ #X tree.each do |k,ifaces|
317
+ #X # puts "K=>#{k}"
318
+ #X ifaces.each do |name, iface|
319
+ #X # binding.pry if k == 'Bond'
320
+ #X {
321
+ #X "Vrrp" => lambda do |iface|
322
+ #X interface = iface.interface.delegate.interface
323
+ #X iface.connect tree[simple(interface.clazz)][interface.name]
324
+ #X end,
325
+ #X "Vlan" => lambda do |iface|
326
+ #X iface.interface.interfaces.each do |vlan_iface|
327
+ #X iface.connect tree[simple(vlan_iface.clazz)][vlan_iface.name]
328
+ #X end
329
+
330
+ #X end,
331
+ #X "Bond" => lambda do |iface|
332
+ #X iface.interface.delegate.interfaces.each do |i|
333
+ #X #Construqt.logger.debug(">>>>>>>>>> BOND -> #{simple(i.clazz)} #{i.name}")
334
+ #X iface.connect tree[simple(i.clazz)][i.name]
335
+ #X end
336
+
337
+ #X end,
338
+ #X "Bridge" => lambda do |iface|
339
+ #X iface.interface.delegate.interfaces.each do |i|
340
+ #X #binding.pry
341
+ #X iface.connect tree[simple(i.clazz)][i.name]
342
+ #X end
343
+
344
+ #X end,
345
+ #X "Device" => lambda do |iface|
346
+ #X end,
347
+ #X "Template" => lambda do |iface|
348
+ #X # iface.interface.delegate.vlans.each do |i|
349
+ #X # iface.connect tree[simple(i.clazz)][i.name]
350
+ #X # end
351
+
352
+ #X end,
353
+ #X "Gre" => lambda do |iface|
354
+ #X interface = iface.interface.delegate.local.interface
355
+ #X # puts ">>>>>>GRE #{interface.host.name} #{interface.name}"
356
+ #X iface.connect tree[simple(interface.clazz)][interface.name]
357
+ #X end,
358
+ #X "Opvn" => lambda do |iface|
359
+ #X end
360
+
361
+ #X }[k].call(iface)
362
+ #X end
363
+
364
+ #X end
365
+
366
+ #X
367
+ #X #render_matrixs = []
368
+ #X #[i"Vrrp","Vlan", "Bridge", "Bond", "Device"].each do |clazz|
369
+ #X tree.keys.each do |clazz|
370
+ #X (tree[clazz]||{}).values.each do |node|
371
+ #X next unless node.in_links.empty?
372
+ #X next if node.drawed?
373
+ #X draw(node, out, [node.reference.name])
374
+ #X end
375
+
376
+ #X end
377
+
378
+ #X out << <<UML
379
+ #X }
380
+ #X UML
381
+ "completed" => lambda do |type, *args|
382
+ build_tree
383
+ out = []
384
+ # @tree.values.each do |node|
385
+ #binding.pry if node.reference.name == "s2b-l3-m2"
386
+ # out << <<UML
387
+ #object #{node.ident} {
388
+ # #{render_object_address(node.reference)}
389
+ #}
390
+ #UML
391
+ # end
392
+
393
+ @tree.values.each do |node|
394
+ # next unless node.in_links.empty?
395
+ draw(node, out, [node.reference.name], ['Vrrp', 'Ipsec', 'Bgp'].include?(simple(node.reference.class)))
396
+ end
397
+
398
+ @tree.values.each { |n| n.drawed = false }
399
+ @tree.values.each do |node|
400
+ # next unless node.in_links.empty?
401
+ connect(node, out, [node.reference.name])
402
+ end
403
+
404
+ File.open("cfgs/world.puml", 'w') do |file|
405
+ file.puts(<<UML)
406
+ @startuml
407
+ skinparam object {
408
+ ArrowColor<<Gre>> MediumOrchid
409
+ BackgroundColor<<Gre>> MediumOrchid
410
+ ArrowColor<<Bgp>> MediumSeaGreen
411
+ BackgroundColor<<Bgp>> MediumSeaGreen
412
+ ArrowColor<<Ipsec>> LightSkyBlue
413
+ BackgroundColor<<Ipsec>> LightSkyBlue
414
+ ArrowColor<<Vrrp>> OrangeRed
415
+ BackgroundColor<<Vrrp>> OrangeRed
416
+ ArrowColor<<Device>> YellowGreen
417
+ BackgroundColor<<Device>> YellowGreen
418
+ ArrowColor<<Bond>> Orange
419
+ BackgroundColor<<Bond>> Orange
420
+ ArrowColor<<Vlan>> Yellow
421
+ BackgroundColor<<Vlan>> Yellow
422
+ ArrowColor<<Bridge>> Pink
423
+ BackgroundColor<<Bridge>> Pink
424
+ }
425
+ skinparam stereotypeBackgroundColor<<Gre>> MediumOrchid
426
+ skinparam stereotypeBackgroundColor<<Bgp>> MediumSeaGreen
427
+ skinparam stereotypeBackgroundColor<<Ipsec>> LightSkyBlue
428
+ skinparam stereotypeBackgroundColor<<Vrrp>> OrangeRed
429
+ skinparam stereotypeBackgroundColor<<Device>> YellowGreen
430
+ skinparam stereotypeBackgroundColor<<Bond>> Orange
431
+ skinparam stereotypeBackgroundColor<<Vlan>> Yellow
432
+ skinparam stereotypeBackgroundColor<<Bridge>> Pink
433
+ UML
434
+ file.write(out.join("\n") + "\n")
435
+ file.puts("@enduml")
436
+ end
437
+
438
+ if File.exists?("/cygdrive/c/Program Files/cygwin/bin/dot.exe")
439
+ dot = "C:\\Program Files\\cygwin\\bin\\dot.exe"
440
+ elsif File.exists?("/usr/bin/dot")
441
+ dot = "/usr/bin/dot"
442
+ else
443
+ dot = "$HOME/macosx/bin/dot"
444
+ end
445
+ if File.exists?("#{ENV['HOMEPATH']}/Downloads/plantuml.jar")
446
+ plantuml_jar = "#{ENV['HOMEPATH']}/Downloads/plantuml.jar"
447
+ else
448
+ plantuml_jar = "~/Downloads/plantuml.jar"
449
+ end
450
+ system("java -jar \"#{plantuml_jar}\" -Djava.awt.headless=true -graphvizdot \"#{dot}\" -tsvg cfgs/world.puml")
451
+ end
452
+
453
+ }
454
+ Construqt.logger.debug "Planuml:#{type}"
455
+ action = factory[type]
456
+ if action
457
+ action.call(type, *args)
458
+ end
459
+ end
460
+ end
461
+ end
462
+ end