construqt 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4331146e96ece520a1a1ce639961e821f977fe03
4
- data.tar.gz: 278d04395334ee8b7c0ee059d43d0c03123198ca
3
+ metadata.gz: 2115258ebfdfcd8677388f8d16094791d24c8f73
4
+ data.tar.gz: 2a0e2a30f18d8c0cca7f8f15db806685e60e517b
5
5
  SHA512:
6
- metadata.gz: 4547cfc3d2a5a9d98f863dcc4c0d4a73c075e886deb7bed57a97311f5220a37d5a492a771a36c53f61eb2338323e596e1d2b87ec250b754913e86b17da6a359a
7
- data.tar.gz: 0a756f1a5ec5e967c88abec431ad6426a86f2bc8b8138c1c55bd6e3bcf557d7ae5109c4e399e53e221caf89adcd87f829b3028dd244c459fc9a74860f96d611b
6
+ metadata.gz: cdc4dcecb64df68474a1a3475bb39202ba60e1cb02c3ac60607ce85afba3fd9b6d85a4b841ce8325d353a55f8ba592a90a14d150cbe62349c17bb0823cbf95a4
7
+ data.tar.gz: f0bb62e3236746fd6cccd2333ba213524c86d6fb8169c1371b83175d53704c1337e45f1611acc81cf54ff084e643aebc5fb7269b0460ee98358462f81ff96622
@@ -34,6 +34,7 @@ module Construqt
34
34
  @to_s = str
35
35
  @nr = nr
36
36
  end
37
+
37
38
  def <=>(other)
38
39
  a = self.to_s
39
40
  b = other.to_s
@@ -44,27 +45,33 @@ module Construqt
44
45
  ret = match_a[2].to_i<=>match_b[2].to_i if ret==0
45
46
  ret
46
47
  end
48
+
47
49
  # def hash
48
50
  # self.to_s.hash
49
51
  # end
50
52
  end
53
+
51
54
  def initialize(lines)
52
55
  @lines = []
53
56
  lines.each_with_index do |line, idx|
54
57
  @lines << Line.new(line.strip, idx)
55
58
  end
59
+
56
60
  @pos = 0
57
61
  end
62
+
58
63
  def shift
59
64
  @pos += 1
60
65
  @lines[@pos-1]
61
66
  end
62
67
  end
68
+
63
69
  def parse(lines)
64
70
  lines = Lines.new(lines)
65
71
  while line = lines.shift
66
72
  parse_line(line, lines, self, self)
67
73
  end
74
+
68
75
  self
69
76
  end
70
77
 
@@ -92,6 +99,7 @@ module Construqt
92
99
  section = @sections[key]
93
100
  block += section.serialize
94
101
  end
102
+
95
103
  Util.write_str(block.join("\n"), File.join(@host.name, "#{@host.fname||self.dialect.class.name}.cfg"))
96
104
  end
97
105
 
@@ -103,7 +111,10 @@ module Construqt
103
111
  @sections[section_key] ||= clazz.new(section_key)
104
112
  if Result.starts_with_no(section.to_s)
105
113
  @sections[section_key].no
114
+ else
115
+ @sections[section_key].yes
106
116
  end
117
+
107
118
  yield(@sections[section_key]) if block_given?
108
119
  @sections[section_key]
109
120
  end
@@ -150,6 +161,11 @@ module Construqt
150
161
  self
151
162
  end
152
163
 
164
+ def yes
165
+ @no=nil
166
+ self
167
+ end
168
+
153
169
  def self.parse_line(line, lines, section, result)
154
170
  regexp = line.to_s.strip.end_with?("\"") ? /^(.*) (\"[^"]+\")$/ : /^(.*) ([^\s"]+)$/
155
171
  if (line.to_s.strip =~ regexp)
@@ -172,6 +188,7 @@ module Construqt
172
188
  # clazz=verb
173
189
  # verb=clazz.section_key
174
190
  # end
191
+
175
192
  self.sections[Result.normalize_section_key(verb.to_s)] ||= clazz.new(verb)
176
193
  end
177
194
 
@@ -197,6 +214,7 @@ module Construqt
197
214
  end
198
215
  end
199
216
  end
217
+
200
218
  return true
201
219
  end
202
220
  end
@@ -207,6 +225,7 @@ module Construqt
207
225
  verb = sections[key]
208
226
  block << verb.serialize.map{|i| " #{i}"}
209
227
  end
228
+
210
229
  block
211
230
  end
212
231
 
@@ -220,6 +239,11 @@ module Construqt
220
239
  @no
221
240
  end
222
241
 
242
+ def yes
243
+ @no=nil
244
+ self
245
+ end
246
+
223
247
  def serialize
224
248
  block=[]
225
249
  block << "#{@no}#{section.to_s}"
@@ -227,6 +251,7 @@ module Construqt
227
251
  block += render_verbs(self.sections)
228
252
  block << "exit"
229
253
  end
254
+
230
255
  block
231
256
  end
232
257
 
@@ -250,6 +275,7 @@ module Construqt
250
275
  delta.sections[comp.section] = comp
251
276
  end
252
277
  end
278
+
253
279
  return [delta]
254
280
  end
255
281
  end
@@ -273,6 +299,11 @@ module Construqt
273
299
  self
274
300
  end
275
301
 
302
+ def yes
303
+ @no=nil
304
+ self
305
+ end
306
+
276
307
  def serialize
277
308
  if @no
278
309
  ["#{@no}#{section}"]
@@ -301,8 +332,8 @@ module Construqt
301
332
  end
302
333
 
303
334
  def add(value)
304
- throw "must be a number \'#{value}\'" unless /^\d+$/.match(value.to_s)
305
- self.values << value.to_i
335
+ #throw "must be a number \'#{value}\'" unless /^\d+$/.match(value.to_s)
336
+ self.values << value #.to_i
306
337
  self
307
338
  end
308
339
 
@@ -311,6 +342,11 @@ module Construqt
311
342
  self
312
343
  end
313
344
 
345
+ def yes
346
+ @no=nil
347
+ self
348
+ end
349
+
314
350
  def self.compare(nu, old)
315
351
  return [nu] unless old
316
352
  return [old.no] unless nu
@@ -339,6 +375,9 @@ module Construqt
339
375
  self.changes=[]
340
376
  end
341
377
 
378
+ def yes
379
+ end
380
+
342
381
  def add(entry)
343
382
  changes << entry
344
383
  self
@@ -355,6 +394,7 @@ module Construqt
355
394
  patterns.each do |pattern|
356
395
  variables+=find_variables(pattern)
357
396
  end
397
+
358
398
  return variables
359
399
  end
360
400
 
@@ -388,6 +428,7 @@ module Construqt
388
428
  var_regex = "#{Construqt::Util::PORTS_DEF_REGEXP}" unless var_regex
389
429
  regex=regex.gsub(var, var_regex)
390
430
  end
431
+
391
432
  regex=regex.gsub(" ", "\\s+")
392
433
  regex="^"+regex+"$"
393
434
  if (matchdata=line.match(regex))
@@ -399,9 +440,11 @@ module Construqt
399
440
  values[variables[i-1]]=[matchdata[i]]
400
441
  end
401
442
  end
443
+
402
444
  return values
403
445
  end
404
446
  end
447
+
405
448
  return false
406
449
  end
407
450
 
@@ -453,6 +496,7 @@ module Construqt
453
496
  end
454
497
  end
455
498
  end
499
+
456
500
  return key_var
457
501
  end
458
502
 
@@ -533,6 +577,7 @@ module Construqt
533
577
  end
534
578
  end
535
579
  end
580
+
536
581
  output_patterns << empty_pattern if output_patterns.empty? && !empty_pattern.nil?
537
582
  return output_patterns
538
583
  end
@@ -550,14 +595,18 @@ module Construqt
550
595
  sets.each do |key_val,value_sets|
551
596
  determine_output_patterns(value_sets).each do |pattern|
552
597
  index = 0
553
- i=0
598
+ i = 0
554
599
  begin
555
600
  substitution=false
556
601
  result = pattern
557
- i+=1
602
+ i += 1
558
603
  self.class.find_variables(pattern).each do |v|
559
604
  if (group)
560
- result = result.gsub(v, Construqt::Util.createRangeDefinition(value_sets[v])) unless value_sets[v].nil? || value_sets[v].empty?
605
+ if self.class.is_value?(v) || self.class.is_key_value?(v)
606
+ result = result.gsub(v, value_sets[v].to_s) unless value_sets[v].nil? || value_sets[v].to_s.empty?
607
+ else
608
+ result = result.gsub(v, Construqt::Util.createRangeDefinition(value_sets[v])) unless value_sets[v].nil? || value_sets[v].empty?
609
+ end
561
610
  else
562
611
  if (index < value_sets[v].length)
563
612
  result = result.gsub(v, value_sets[v][index])
@@ -565,11 +614,13 @@ module Construqt
565
614
  end
566
615
  end
567
616
  end
617
+
568
618
  buffer << result if self.class.find_variables(result).empty?
569
619
  index+=1
570
620
  end while substitution
571
621
  end
572
622
  end
623
+
573
624
  return buffer
574
625
  end
575
626
  end
@@ -582,6 +633,7 @@ module Construqt
582
633
  def header(host)
583
634
  "# this is a generated file do not edit!!!!!"
584
635
  end
636
+
585
637
  def footer(host)
586
638
  "# this is a generated file do not edit!!!!!"
587
639
  end
@@ -3,6 +3,8 @@ module Construqt
3
3
  module Ciscian
4
4
  module DlinkDgs15xx
5
5
 
6
+
7
+
6
8
  class HostNameVerb < PatternBasedVerb
7
9
  def self.section
8
10
  "snmp-server name"
@@ -55,6 +57,44 @@ module Construqt
55
57
  end
56
58
  end
57
59
 
60
+ class EnablePasswordVerb < SingleValueVerb
61
+ def self.section
62
+ "enable password level"
63
+ end
64
+
65
+ def self.patterns
66
+ ["no channel-group", "enable password level {+admin} {+level} {+pw_hash}"]
67
+ end
68
+ end
69
+
70
+ class UserNamePasswordVerb < SingleValueVerb
71
+ def self.section
72
+ "user XXXXX password"
73
+ end
74
+
75
+ def self.patterns
76
+ end
77
+ end
78
+
79
+ class UserNamePrivilegeVerb < SingleValueVerb
80
+ def self.section
81
+ "user XXXX privilege"
82
+ end
83
+
84
+ def self.patterns
85
+ end
86
+ end
87
+
88
+ class PasswordVerb < SingleValueVerb
89
+ def self.section
90
+ "password"
91
+ end
92
+
93
+ def self.patterns
94
+ end
95
+ end
96
+
97
+
58
98
  class Ipv4RouteVerb < PatternBasedVerb
59
99
  def self.section
60
100
  "ip route"
@@ -167,6 +207,105 @@ module Construqt
167
207
  end
168
208
 
169
209
  def commit
210
+ [
211
+ "aaa",
212
+ "service password-encryption",
213
+ "no ip http server",
214
+ "debug reboot on-error",
215
+ "no debug enable"
216
+ ].each do |verb|
217
+ @result.add(verb, Ciscian::SingleValueVerb)
218
+ end
219
+
220
+ ["line console", "line telnet", "line ssh"].each do |section|
221
+ @result.add(section) { |_section| _section.add("line") }
222
+ end
223
+
224
+ #@result.host.interfaces.values.each do |iface|
225
+ # @result.add(k
226
+ #end
227
+
228
+
229
+
230
+
231
+ # "enable password level 15 7 <>"
232
+ # "username root password 7 <>"
233
+ # "username root password 15"
234
+ #
235
+ # "autoconfig",
236
+ # ["clock timezone", "+ 1"],
237
+ # "no clock summer-time"
238
+ # "sntp interval 720"
239
+ # "ddp report-timer 30",
240
+ # "debug"
241
+ # "debug reboot"
242
+ # "dim"
243
+ # "ignore"
244
+ # "instance 16 vlans"
245
+ # no power-saving link-detection
246
+ # no dim led
247
+ # no power-saving hibernation
248
+ # no power-saving dim-led
249
+ # no power-saving port-shutdown
250
+ #
251
+ #
252
+ # "ddp"
253
+ # "no power-saving eee"
254
+ # "no snmp-server trap-sending"
255
+ # "no speed"
256
+ # "spanning-tree guard"
257
+ # "spanning-tree mst hello-time"
258
+ #
259
+ #
260
+ # "ip arp gratuitous"
261
+ # "ip dhcp relay information option format circuit-id default"
262
+ # "ip dhcp relay information option format remote-id default"
263
+ # "ip dhcp relay information policy replace"
264
+ # "ip domain"
265
+ # "ip http service-port"
266
+ # "ip http timeout-policy idle"
267
+ # "ip ssh"
268
+ # "ip telnet"
269
+ # "ip telnet service-port"
270
+ # "port-channel load-balance"
271
+ # "power-saving"
272
+ # "service"
273
+ #
274
+ # "snmp-server community private view CommunityView"
275
+ # "snmp-server community public view CommunityView"
276
+ # "snmp-server contact"
277
+ # "snmp-server enable traps rmon falling-alarm"
278
+ # "snmp-server enable traps snmp rising-alarm"
279
+ # "snmp-server engineID local"
280
+ # "snmp-server group initial"
281
+ # "snmp-server group initial v3 noauth read restricted notify"
282
+ # "snmp-server group private v1 read CommunityView write CommunityView notify"
283
+ # "snmp-server group private v2c read CommunityView write CommunityView notify"
284
+ # "snmp-server group public v1 read CommunityView notify"
285
+ # "snmp-server group public v2c read CommunityView notify"
286
+ # "snmp-server location"
287
+ # "snmp-server response"
288
+ # "snmp-server service-port"
289
+ # "snmp-server user initial"
290
+ # "snmp-server user initial initial"
291
+ # "snmp-server view CommunityView 1"
292
+ # "snmp-server view CommunityView 1.3.6.1.6.3"
293
+ # "snmp-server view CommunityView 1.3.6.1.6.3.1"
294
+ # "snmp-server view restricted 1.3.6.1.2.1.1"
295
+ # "snmp-server view restricted 1.3.6.1.2.1.11"
296
+ # "snmp-server view restricted 1.3.6.1.6.3.10.2.1"
297
+ # "snmp-server view restricted 1.3.6.1.6.3.11.2.1"
298
+ # "snmp-server view restricted 1.3.6.1.6.3.15.1.1"
299
+ # "sntp"
300
+ # "sntp interval"
301
+ # "spanning-tree mode"
302
+ # "spanning-tree mst"
303
+ # "ssh user root authentication-method"
304
+ # "username root password 7"
305
+ # "username root privilege"
306
+ #
307
+
308
+
170
309
  @result.add("snmp-server name", Ciscian::SingleValueVerb).add(@result.host.name)
171
310
  @result.host.interfaces.values.each do |iface|
172
311
  next unless iface.delegate.address
@@ -218,9 +357,8 @@ module Construqt
218
357
  vlan_id=vlan.delegate.vlan_id
219
358
  vlan.interfaces.each do |iface|
220
359
  @result.add("interface #{expand_device_name(iface)}") do |section|
221
- if iface.template.is_tagged?(vlan_id)
222
- section.add("switchport trunk allowed vlan", Ciscian::RangeVerb).add(vlan_id)
223
- else
360
+ section.add("switchport trunk allowed vlan", Ciscian::RangeVerb).add(vlan_id)
361
+ unless iface.template.is_tagged?(vlan_id)
224
362
  section.add("switchport trunk native vlan").add(vlan_id)
225
363
  end
226
364
  end
@@ -13,12 +13,13 @@ module Construqt
13
13
  def commit
14
14
  end
15
15
 
16
- def expand_device_name(device)
16
+ def expand_vlan_device_name(device)
17
+ expand_device_name(device, { "po" => "Trk%s", "ge" => "%s" })
18
+ end
19
+
20
+ def expand_device_name(device, map={ "po" => "Trk%s", "ge" => "ethernet %s" })
17
21
  return device.delegate.dev_name if device.delegate.dev_name
18
- pattern = (({
19
- "po" => "Trk%s",
20
- "ge" => "ethernet %s"
21
- })[device.name[0..1]])
22
+ pattern = map[device.name[0..1]]
22
23
  throw "device not expandable #{device.name}" unless pattern
23
24
  pattern%device.name[2..-1]
24
25
  end
@@ -39,21 +40,21 @@ module Construqt
39
40
  end
40
41
 
41
42
  def add_bond(bond)
42
- throw "not implemented yet"
43
+ @result.add("trunk", TrunkVerb).add("{+ports}" => bond.interfaces.map{|i| i.delegate.number }, "{*channel}" => bond.delegate.number)
44
+ @result.add("spanning-tree #{expand_vlan_device_name(bond)} priority 4")
43
45
  end
44
46
 
45
47
  def add_vlan(vlan)
46
- @result.add("vlan #{vlan.delegate.vlan_id}") do |section|
48
+ @result.add("vlan #{vlan.delegate.vlan_id} jumbo") do |section|
47
49
  next unless vlan.delegate.description && !vlan.delegate.description.empty?
48
50
  throw "vlan name too long, max 32 chars" if vlan.delegate.description.length > 32
49
51
  section.add("name", Ciscian::SingleValueVerb).add(vlan.delegate.description)
50
-
51
-
52
52
  vlan.interfaces.each do |port|
53
+
53
54
  section.add({
54
55
  true => "tagged",
55
56
  false => "untagged"
56
- }[port.template.is_tagged?(vlan.vlan_id)], Ciscian::RangeVerb).add(port.delegate.number)
57
+ }[port.template.is_tagged?(vlan.vlan_id)], Ciscian::RangeVerb).add(expand_vlan_device_name(port))
57
58
  end
58
59
 
59
60
  if vlan.delegate.address
@@ -104,8 +105,6 @@ module Construqt
104
105
  ["no trunk {-ports}", "trunk {+ports} Trk{*channel} Trunk"]
105
106
  end
106
107
  end
107
-
108
-
109
108
  end
110
109
 
111
110
  Construqt::Flavour::Ciscian.add_dialect(Hp2510g)
@@ -282,6 +282,7 @@ auth requisite pam_deny.so
282
282
  PAM
283
283
  #binding.pry
284
284
  host.delegate.files && host.delegate.files.each do |file|
285
+ next if file.kind_of?(Construqt::Resources::SkipFile)
285
286
  if host.result.replace(nil, file.data, file.right, *file.path)
286
287
  Construqt.logger.warn("the file #{file.path} was overriden!")
287
288
  end
@@ -553,6 +553,9 @@ then
553
553
  fi
554
554
  BASH
555
555
  out += @result.map do |fname, block|
556
+ if host.files
557
+ next [] if host.files.find{|file| file.path == fname && file.kind_of?(Construqt::Resources::SkipFile) }
558
+ end
556
559
  text = block.flatten.select{|i| !(i.nil? || i.strip.empty?) }.join("\n")
557
560
  next if text.strip.empty?
558
561
  Util.write_str(text, @host.name, fname)
@@ -61,7 +61,7 @@ module Construqt
61
61
 
62
62
  def fqdn(name)
63
63
  throw "name must set" unless name
64
- _name = name.gsub(/[\s_]+/, '-')
64
+ _name = name.gsub(/[\s_\.]+/, '-')
65
65
  return "#{_name}.#{self.domain}" unless _name.include?('.')
66
66
  return _name
67
67
  end
@@ -12,6 +12,10 @@ module Construqt
12
12
  attr_accessor :data
13
13
  end
14
14
 
15
+ class SkipFile
16
+ attr_accessor :path
17
+ end
18
+
15
19
  def initialize(region)
16
20
  @region = region
17
21
  @files = {}
@@ -21,6 +25,12 @@ module Construqt
21
25
  add_file(IO.read(src_fname), right, key, *path)
22
26
  end
23
27
 
28
+ def add_skip_file(fname)
29
+ sf = SkipFile.new
30
+ sf.path = fname
31
+ sf
32
+ end
33
+
24
34
  def add_file(data, right, key, *path)
25
35
  throw "need a key" unless key
26
36
  throw "need a path #{key}" if path.empty?
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ require 'linux/ip/addr'
3
+ require 'linux/ip/route'
4
+ CONSTRUQT_PATH=ENV['CONSTRUQT_PATH']||'..'
5
+ ["#{CONSTRUQT_PATH}/construqt/lib","#{CONSTRUQT_PATH}/ipaddress/lib"].each{|path| $LOAD_PATH.unshift(path) }
6
+ require 'construqt'
7
+
8
+ # ruby lib/construqt/reverse.rb addr ~/addrs routes ~/routes
9
+ if cp = ARGV.index("addr")
10
+ addr = Linux::Ip::Addr.parse_from_lines(IO.read(ARGV[cp+1]).lines)
11
+ else
12
+ addr = Linux::Ip::Addr.parse
13
+ end
14
+ if cp = ARGV.index("routes")
15
+ routes = Linux::Ip::Route.parse_from_lines(IO.read(ARGV[cp+1]).lines)
16
+ else
17
+ routes = Linux::Ip::Route.parse
18
+ end
19
+
20
+ def render_iface(ifaces, routes)
21
+ ifaces.interfaces.map do |iface|
22
+ next [] if iface.name == 'lo'
23
+ next [] if iface.ips.empty?
24
+ out = <<RUBY
25
+ region.interfaces.add_device(host, "#{iface.name}", "mtu" => 1500,
26
+ 'mac_address' => #{iface.mac_address},
27
+ 'address' => region.network.addresses.
28
+ #{Construqt::Util.indent((
29
+ iface.ips.map{|i| "add_ip('#{i.to_s}')" }+
30
+ (routes.interfaces[iface.name] ? routes.interfaces[iface.name].select{|i| i.kind_of?(Linux::Ip::Route::IpRoute::ViaRoute) }.map{|i| "add_route('#{i.dst.to_s}', '#{i.via.to_s}')" } : [])).join(".\n"), 22)})
31
+ RUBY
32
+ end.join("\n")
33
+ end
34
+
35
+ puts <<RUBY
36
+ region.hosts.add("REVERSE-HOST", "flavour" => "ubuntu") do |host|
37
+ region.interfaces.add_device(host, "lo", "mtu" => "1500", :description=>"loopback",
38
+ "address" => region.network.addresses.add_ip(Construqt::Addresses::LOOOPBACK))
39
+
40
+ #{render_iface(addr, routes)}
41
+
42
+ end
43
+ RUBY
@@ -157,6 +157,9 @@ module Construqt
157
157
  end
158
158
 
159
159
  def self.indent(body, ident)
160
+ if ident.kind_of?(Fixnum)
161
+ ident = (1..ident).to_a.map{' '}.join('')
162
+ end
160
163
  body.lines.map { |line| ident+line.chomp.strip }.join("\n")
161
164
  end
162
165
  end
@@ -1,3 +1,3 @@
1
1
  module Construqt
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: construqt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Meno Abels
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-04 00:00:00.000000000 Z
11
+ date: 2014-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: construqt-ipaddress
@@ -79,6 +79,7 @@ files:
79
79
  - lib/construqt/networks.rb
80
80
  - lib/construqt/regions.rb
81
81
  - lib/construqt/resource.rb
82
+ - lib/construqt/reverse.rb
82
83
  - lib/construqt/services.rb
83
84
  - lib/construqt/tags.rb
84
85
  - lib/construqt/templates.rb