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.
- 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
|