construqt 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/construqt/addresses.rb +204 -0
- data/lib/construqt/bgps.rb +164 -0
- data/lib/construqt/cables.rb +47 -0
- data/lib/construqt/firewalls.rb +247 -0
- data/lib/construqt/flavour/ciscian/ciscian.rb +687 -0
- data/lib/construqt/flavour/ciscian/dialect_dlink-dgs15xx.rb +235 -0
- data/lib/construqt/flavour/ciscian/dialect_hp-2510g.rb +114 -0
- data/lib/construqt/flavour/delegates.rb +448 -0
- data/lib/construqt/flavour/flavour.rb +97 -0
- data/lib/construqt/flavour/mikrotik/flavour_mikrotik.rb +417 -0
- data/lib/construqt/flavour/mikrotik/flavour_mikrotik_bgp.rb +134 -0
- data/lib/construqt/flavour/mikrotik/flavour_mikrotik_interface.rb +79 -0
- data/lib/construqt/flavour/mikrotik/flavour_mikrotik_ipsec.rb +65 -0
- data/lib/construqt/flavour/mikrotik/flavour_mikrotik_result.rb +182 -0
- data/lib/construqt/flavour/mikrotik/flavour_mikrotik_schema.rb +355 -0
- data/lib/construqt/flavour/plantuml/plantuml.rb +462 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu.rb +381 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu_bgp.rb +117 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu_dns.rb +97 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu_firewall.rb +300 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu_ipsec.rb +144 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu_opvn.rb +60 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu_result.rb +537 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu_services.rb +115 -0
- data/lib/construqt/flavour/ubuntu/flavour_ubuntu_vrrp.rb +52 -0
- data/lib/construqt/flavour/unknown/unknown.rb +175 -0
- data/lib/construqt/hostid.rb +42 -0
- data/lib/construqt/hosts.rb +98 -0
- data/lib/construqt/interfaces.rb +166 -0
- data/lib/construqt/ipsecs.rb +64 -0
- data/lib/construqt/networks.rb +81 -0
- data/lib/construqt/regions.rb +32 -0
- data/lib/construqt/resource.rb +42 -0
- data/lib/construqt/services.rb +53 -0
- data/lib/construqt/tags.rb +61 -0
- data/lib/construqt/templates.rb +37 -0
- data/lib/construqt/tests/test_addresses.rb +50 -0
- data/lib/construqt/tests/test_bgps.rb +24 -0
- data/lib/construqt/tests/test_hostid.rb +32 -0
- data/lib/construqt/tests/test_hosts.rb +23 -0
- data/lib/construqt/tests/test_utils.rb +76 -0
- data/lib/construqt/users.rb +19 -0
- data/lib/construqt/util.rb +163 -0
- data/lib/construqt/version.rb +3 -0
- data/lib/construqt/vlans.rb +51 -0
- data/lib/construqt.rb +92 -0
- 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
|