construqt 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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