acirb 1.0.4h → 1.0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/lib/acirb/aaa.rb +1211 -92
  3. data/lib/acirb/ac.rb +167 -8
  4. data/lib/acirb/action.rb +309 -33
  5. data/lib/acirb/actrl.rb +1937 -79
  6. data/lib/acirb/actrlcap.rb +24 -2
  7. data/lib/acirb/adcom.rb +376 -26
  8. data/lib/acirb/aib.rb +47 -5
  9. data/lib/acirb/arp.rb +311 -19
  10. data/lib/acirb/bfd.rb +199 -15
  11. data/lib/acirb/bgp.rb +892 -69
  12. data/lib/acirb/callhome.rb +322 -23
  13. data/lib/acirb/cap.rb +45 -6
  14. data/lib/acirb/cdp.rb +235 -20
  15. data/lib/acirb/cnw.rb +122 -6
  16. data/lib/acirb/comm.rb +4565 -186
  17. data/lib/acirb/comp.rb +4882 -205
  18. data/lib/acirb/compat.rb +413 -38
  19. data/lib/acirb/condition.rb +176 -13
  20. data/lib/acirb/config.rb +235 -16
  21. data/lib/acirb/coop.rb +563 -44
  22. data/lib/acirb/copp.rb +1711 -40
  23. data/lib/acirb/ctrlr.rb +20 -2
  24. data/lib/acirb/ctx.rb +48 -6
  25. data/lib/acirb/datetime.rb +359 -24
  26. data/lib/acirb/dbg.rb +1902 -87
  27. data/lib/acirb/dbgac.rb +770 -47
  28. data/lib/acirb/dbgexp.rb +560 -41
  29. data/lib/acirb/dhcp.rb +898 -71
  30. data/lib/acirb/dhcptlv.rb +64 -8
  31. data/lib/acirb/dhcptlvpol.rb +72 -8
  32. data/lib/acirb/dlgt.rb +7 -1
  33. data/lib/acirb/dns.rb +203 -18
  34. data/lib/acirb/draw.rb +18 -2
  35. data/lib/acirb/edr.rb +52 -5
  36. data/lib/acirb/eigrp.rb +604 -49
  37. data/lib/acirb/ep.rb +43 -4
  38. data/lib/acirb/epm.rb +72 -8
  39. data/lib/acirb/eptrk.rb +147 -7
  40. data/lib/acirb/eqpt.rb +12467 -400
  41. data/lib/acirb/eqptcap.rb +131 -12
  42. data/lib/acirb/eqptcapacity.rb +6446 -254
  43. data/lib/acirb/eqptdiag.rb +171 -11
  44. data/lib/acirb/eqptdiagp.rb +956 -61
  45. data/lib/acirb/ethpm.rb +624 -19
  46. data/lib/acirb/event.rb +155 -12
  47. data/lib/acirb/extnw.rb +112 -11
  48. data/lib/acirb/fabric.rb +6199 -418
  49. data/lib/acirb/fault.rb +700 -51
  50. data/lib/acirb/file.rb +113 -9
  51. data/lib/acirb/firmware.rb +535 -40
  52. data/lib/acirb/fmcast.rb +63 -6
  53. data/lib/acirb/frmwrk.rb +201 -17
  54. data/lib/acirb/fsm.rb +26 -1
  55. data/lib/acirb/fv.rb +5653 -431
  56. data/lib/acirb/fvcap.rb +25 -2
  57. data/lib/acirb/fvns.rb +375 -33
  58. data/lib/acirb/fvtopo.rb +60 -5
  59. data/lib/acirb/geo.rb +86 -8
  60. data/lib/acirb/glean.rb +50 -5
  61. data/lib/acirb/ha.rb +6 -1
  62. data/lib/acirb/health.rb +258 -21
  63. data/lib/acirb/hvs.rb +312 -22
  64. data/lib/acirb/icmp.rb +34 -4
  65. data/lib/acirb/icmpv4.rb +42 -4
  66. data/lib/acirb/icmpv6.rb +78 -5
  67. data/lib/acirb/ident.rb +533 -43
  68. data/lib/acirb/igmp.rb +59 -4
  69. data/lib/acirb/igmpsnoop.rb +254 -18
  70. data/lib/acirb/im.rb +94 -7
  71. data/lib/acirb/imginstall.rb +18 -1
  72. data/lib/acirb/infra.rb +3909 -243
  73. data/lib/acirb/ip.rb +276 -24
  74. data/lib/acirb/ipmcsnoop.rb +217 -18
  75. data/lib/acirb/ipv4.rb +120 -8
  76. data/lib/acirb/ipv6.rb +121 -9
  77. data/lib/acirb/isis.rb +2885 -103
  78. data/lib/acirb/isistlv.rb +64 -8
  79. data/lib/acirb/l1.rb +616 -46
  80. data/lib/acirb/l1cap.rb +24 -2
  81. data/lib/acirb/l2.rb +5676 -152
  82. data/lib/acirb/l2cap.rb +25 -2
  83. data/lib/acirb/l2ext.rb +249 -19
  84. data/lib/acirb/l3.rb +562 -38
  85. data/lib/acirb/l3cap.rb +25 -2
  86. data/lib/acirb/l3ext.rb +758 -59
  87. data/lib/acirb/l3vm.rb +36 -3
  88. data/lib/acirb/l4.rb +35 -3
  89. data/lib/acirb/lacp.rb +226 -18
  90. data/lib/acirb/lbp.rb +24 -2
  91. data/lib/acirb/leqpt.rb +94 -7
  92. data/lib/acirb/lldp.rb +383 -29
  93. data/lib/acirb/lldptlv.rb +64 -8
  94. data/lib/acirb/lldptlvpol.rb +72 -8
  95. data/lib/acirb/maint.rb +464 -34
  96. data/lib/acirb/mcast.rb +19 -3
  97. data/lib/acirb/mcp.rb +168 -15
  98. data/lib/acirb/memory.rb +457 -18
  99. data/lib/acirb/mgmt.rb +708 -50
  100. data/lib/acirb/mldsnoop.rb +225 -16
  101. data/lib/acirb/mo.rb +27 -3
  102. data/lib/acirb/mock.rb +48 -4
  103. data/lib/acirb/mon.rb +378 -40
  104. data/lib/acirb/monitor.rb +124 -9
  105. data/lib/acirb/naming.rb +13 -2
  106. data/lib/acirb/nd.rb +304 -25
  107. data/lib/acirb/nw.rb +320 -39
  108. data/lib/acirb/nws.rb +71 -7
  109. data/lib/acirb/oam.rb +65 -3
  110. data/lib/acirb/observer.rb +56 -4
  111. data/lib/acirb/opflex.rb +5794 -168
  112. data/lib/acirb/os.rb +25 -2
  113. data/lib/acirb/ospf.rb +1185 -82
  114. data/lib/acirb/ospfv3.rb +477 -31
  115. data/lib/acirb/pc.rb +205 -11
  116. data/lib/acirb/pcons.rb +444 -42
  117. data/lib/acirb/phys.rb +22 -2
  118. data/lib/acirb/ping.rb +172 -6
  119. data/lib/acirb/pki.rb +194 -15
  120. data/lib/acirb/pol.rb +1063 -88
  121. data/lib/acirb/policer.rb +16 -2
  122. data/lib/acirb/pool.rb +49 -6
  123. data/lib/acirb/pres.rb +216 -19
  124. data/lib/acirb/proc.rb +4069 -130
  125. data/lib/acirb/psu.rb +40 -4
  126. data/lib/acirb/qos.rb +312 -28
  127. data/lib/acirb/qosm.rb +979 -40
  128. data/lib/acirb/qosp.rb +147 -11
  129. data/lib/acirb/rbqm.rb +113 -9
  130. data/lib/acirb/regress.rb +14 -1
  131. data/lib/acirb/reln.rb +304 -26
  132. data/lib/acirb/repl.rb +34 -4
  133. data/lib/acirb/res.rb +120 -12
  134. data/lib/acirb/rib.rb +85 -9
  135. data/lib/acirb/rmon.rb +150 -10
  136. data/lib/acirb/rpm.rb +11 -1
  137. data/lib/acirb/rtcom.rb +27 -3
  138. data/lib/acirb/rtctrl.rb +641 -59
  139. data/lib/acirb/rtextcom.rb +45 -4
  140. data/lib/acirb/rtflt.rb +23 -3
  141. data/lib/acirb/rtleak.rb +58 -6
  142. data/lib/acirb/rtmap.rb +354 -32
  143. data/lib/acirb/rtpfx.rb +54 -5
  144. data/lib/acirb/rtregcom.rb +43 -4
  145. data/lib/acirb/rtsum.rb +8 -1
  146. data/lib/acirb/rule.rb +27 -4
  147. data/lib/acirb/satm.rb +175 -6
  148. data/lib/acirb/snmp.rb +409 -34
  149. data/lib/acirb/span.rb +1263 -84
  150. data/lib/acirb/stats.rb +607 -31
  151. data/lib/acirb/statstore.rb +38 -4
  152. data/lib/acirb/stormctrl.rb +36 -3
  153. data/lib/acirb/stp.rb +315 -28
  154. data/lib/acirb/sts.rb +538 -45
  155. data/lib/acirb/svccore.rb +173 -8
  156. data/lib/acirb/svi.rb +61 -3
  157. data/lib/acirb/synthetic.rb +639 -44
  158. data/lib/acirb/sysdebug.rb +248 -18
  159. data/lib/acirb/sysfile.rb +31 -4
  160. data/lib/acirb/syshist.rb +39 -4
  161. data/lib/acirb/syslog.rb +180 -14
  162. data/lib/acirb/sysmgr.rb +38 -4
  163. data/lib/acirb/sysmgrp.rb +21 -2
  164. data/lib/acirb/tag.rb +159 -12
  165. data/lib/acirb/task.rb +48 -3
  166. data/lib/acirb/test.rb +40 -3
  167. data/lib/acirb/testinfralab.rb +97 -8
  168. data/lib/acirb/tlv.rb +68 -10
  169. data/lib/acirb/top.rb +212 -16
  170. data/lib/acirb/topoctrl.rb +100 -9
  171. data/lib/acirb/traceroute.rb +210 -11
  172. data/lib/acirb/traceroutep.rb +215 -12
  173. data/lib/acirb/trig.rb +344 -30
  174. data/lib/acirb/troubleshoot.rb +136 -8
  175. data/lib/acirb/tunnel.rb +148 -11
  176. data/lib/acirb/uribv4.rb +83 -8
  177. data/lib/acirb/uribv6.rb +63 -6
  178. data/lib/acirb/vlan.rb +88 -5
  179. data/lib/acirb/vlanmgr.rb +21 -2
  180. data/lib/acirb/vmm.rb +715 -50
  181. data/lib/acirb/vns.rb +6681 -428
  182. data/lib/acirb/vpc.rb +260 -14
  183. data/lib/acirb/vsvc.rb +48 -4
  184. data/lib/acirb/vtap.rb +20 -2
  185. data/lib/acirb/vxlan.rb +73 -4
  186. data/lib/acirb/vz.rb +1934 -145
  187. data/lib/acirb.rb +1 -1
  188. data/lib/events.rb +143 -6
  189. data/lib/loader.rb +5 -3
  190. data/lib/mo.rb +72 -15
  191. data/lib/naming.rb +1 -1
  192. data/lib/query.rb +3 -1
  193. data/lib/restclient.rb +172 -47
  194. data/lib/version.rb +1 -1
  195. metadata +32 -4
data/lib/acirb.rb CHANGED
@@ -6,7 +6,7 @@ require 'naming'
6
6
  require 'restclient'
7
7
  require 'version'
8
8
  require 'query'
9
- #require 'events'
9
+ require 'events'
10
10
 
11
11
  module ACIrb
12
12
  end
data/lib/events.rb CHANGED
@@ -1,27 +1,164 @@
1
1
  require 'restclient'
2
- require 'websocket-eventmachine-client'
2
+ require 'websocket'
3
+ require 'socket'
4
+ require 'openssl'
5
+ require 'nokogiri'
6
+ require 'json'
3
7
 
4
8
  # rubocop:disable ClassLength
5
- # rubocop:disable FormatString
6
9
  module ACIrb
7
10
  # Event channel interface
11
+
8
12
  class EventChannel
9
- attr_accessor :websocket
10
- def initialize(rest)
13
+ attr_accessor :rest
14
+
15
+ class ApicWebSocketRecvTimeout < StandardError
16
+ end
17
+
18
+ class WebSocketNoHandshake < StandardError
19
+ end
20
+
21
+ def initialize(rest, _options = {})
11
22
  @rest = rest
23
+
12
24
  uri = URI.parse(@rest.baseurl)
13
25
 
14
26
  if uri.scheme == 'https'
15
27
  scheme = 'wss'
28
+ secure = true
16
29
  else
17
30
  scheme = 'ws'
31
+ secure = false
32
+ end
33
+
34
+ url = '%s://%s/socket%s' % [scheme, uri.host, rest.auth_cookie]
35
+
36
+ @handshake = WebSocket::Handshake::Client.new(url: url)
37
+ @frame = WebSocket::Frame::Incoming::Server.new(version: @handshake.version)
38
+
39
+ @socket = TCPSocket.new(@handshake.host, uri.port)
40
+
41
+ if secure
42
+ puts 'connecting over secure websocket'
43
+ ctx = OpenSSL::SSL::SSLContext.new
44
+
45
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE unless rest.verify
46
+
47
+ ssl_sock = OpenSSL::SSL::SSLSocket.new(@socket, ctx)
48
+ ssl_sock.sync_close = true
49
+ ssl_sock.connect
50
+
51
+ @transport_socket = @socket
52
+ @socket = ssl_sock
53
+ else
54
+ @transport_socket = nil
55
+ end
56
+
57
+ @socket.write(@handshake.to_s)
58
+ @socket.flush
59
+
60
+ loop do
61
+ data = @socket.getc
62
+ next if data.nil?
63
+
64
+ @handshake << data
65
+
66
+ if @handshake.finished?
67
+ fail @handshake.error.to_s unless @handshake.valid?
68
+ @handshaked = true
69
+ break
70
+ end
71
+ end
72
+ end
73
+
74
+ def send(data, type = :text)
75
+ fail WebSocketNoHandshake unless @handshaked
76
+
77
+ data = WebSocket::Frame::Outgoing::Client.new(
78
+ version: @handshake.version,
79
+ data: data,
80
+ type: type
81
+ ).to_s
82
+ @socket.write data
83
+ @socket.flush
84
+ end
85
+
86
+ def receive(timeout = nil)
87
+ fail WebSocketNoHandshake unless @handshaked
88
+
89
+ readable, writable, error = IO.select([@socket], nil, nil, timeout)
90
+ if readable
91
+ begin
92
+ data = @socket.read_nonblock(1024)
93
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, (IO::WaitReadable if defined?(IO::WaitReadable)) => e
94
+ puts '%s, retrying' % e
95
+ retry
96
+ end
97
+ else
98
+ fail ApicWebSocketRecvTimeout, 'Timeout for websocket read'
99
+ end
100
+ @frame << data
101
+
102
+ messages = []
103
+ while message = @frame.next
104
+ if message.type === :ping
105
+ send(message.data, :pong)
106
+ return messages
107
+ end
108
+ messages << message.to_s
18
109
  end
19
110
 
20
- @websocket = WebSocket::Handshake::Client.new(
21
- url: '%s://%s/socket%s' % [scheme, uri.host, rest.auth_cookie])
111
+ events = []
112
+ messages.each do |msg|
113
+ events += MoEvent.parse_event(self, msg.to_s)
114
+ end
115
+ events
116
+ end
117
+
118
+ def close
119
+ @socket.close
120
+ end
121
+ end
22
122
 
123
+ class MoEvent
124
+ def initialize(_options = {})
23
125
  end
24
126
 
127
+ def self.parse_event(event_channel, event_str)
128
+ subscription = nil
129
+ events = []
130
+
131
+ if event_channel.rest.format == 'xml'
132
+ doc = Nokogiri::XML(event_str)
133
+ subscription_id = doc.at_css('imdata')['subscriptionId']
134
+ puts event_str
135
+ doc.root.elements.each do |xml_obj|
136
+ event = {
137
+ type: xml_obj.attributes['status'].to_s,
138
+ properties: Hash[xml_obj.attributes.map { |k, str| [k, str.value.to_s] }],
139
+ class: xml_obj.name,
140
+ subscription_id: subscription_id
141
+ }
142
+ events.push(event)
143
+ end
144
+ elsif event_channel.rest.format == 'json'
145
+ doc = JSON.parse(event_str, symbolize_names: false)
146
+ subscription_id = doc['subscriptionId']
147
+ imdata = doc['imdata']
148
+ imdata.each do |obj|
149
+ cls = obj.keys[0]
150
+ event = {
151
+ type: obj[cls]['attributes']['status'].to_s,
152
+ properties: Hash[obj[cls]['attributes'].map { |k, str| [k, str.to_s] }],
153
+ class: cls,
154
+ subscription_id: subscription_id[0]
155
+ }
156
+ events.push(event)
157
+ end
25
158
 
159
+ end
160
+
161
+ events
162
+ end
26
163
  end
27
164
  end
data/lib/loader.rb CHANGED
@@ -29,6 +29,7 @@ module ACIrb
29
29
  element.attributes.each do |k, v|
30
30
  create_attr[k.to_s] = v.to_s
31
31
  end
32
+ create_attr[:mark_dirty] = false
32
33
  mo = mo.new(parent_mo, create_attr)
33
34
 
34
35
  element.elements.each do |e|
@@ -68,12 +69,13 @@ module ACIrb
68
69
 
69
70
  mo = ACIrb.const_get(ACIrb::CLASSMAP[class_name])
70
71
 
71
- attributes = {}
72
+ create_attr = {}
72
73
  (values['attributes'] || {}).each do |propName, propVal|
73
- attributes[propName.to_s] = propVal
74
+ create_attr[propName.to_s] = propVal
74
75
  end
75
76
 
76
- mo = mo.new(parent_mo, attributes)
77
+ create_attr[:mark_dirty] = false
78
+ mo = mo.new(parent_mo, create_attr)
77
79
 
78
80
  (values['children'] || []).each do |child|
79
81
  mo.add_child(get_mo_from_hash(mo, child))
data/lib/mo.rb CHANGED
@@ -10,44 +10,66 @@ module ACIrb
10
10
  class << self
11
11
  # for class variables
12
12
  attr_reader :prefix, :class_name, :child_classes, :props,
13
- :naming_props, :prefixes, :ruby_class, :containers
13
+ :naming_props, :prefixes, :ruby_class, :containers,
14
+ :read_only
14
15
  end
15
16
 
16
17
  # for instance variables
17
18
  attr_reader :children, :attributes
18
- attr_accessor :parent
19
+ attr_accessor :parent, :dirty_props
19
20
 
21
+ # Internal: Returns class prefixes
20
22
  def prefixes
21
23
  self.class.prefixes
22
24
  end
23
25
 
26
+ # Internal: Returns child classes
24
27
  def child_classes
25
28
  self.class.child_classes
26
29
  end
27
30
 
31
+ # Internal: Returns containiner classes
28
32
  def containers
29
33
  self.class.containers
30
34
  end
31
35
 
36
+ # Internal: Returns naming properties
32
37
  def naming_props
33
38
  self.class.naming_props
34
39
  end
35
40
 
41
+ # Internal: Returns class properties
36
42
  def props
37
43
  self.class.props
38
44
  end
39
45
 
46
+ # Internal: Returns object class name in APIC package.class notation
40
47
  def class_name
41
48
  self.class.class_name
42
49
  end
43
50
 
51
+ # Internal: Returns class name as ruby package notation
44
52
  def ruby_class
45
53
  self.class.ruby_class
46
54
  end
47
55
 
48
- def initialize(create_parent, create_attr = {})
56
+ # Interal: Returns boolean for if this class is read only
57
+ def read_only
58
+ self.class.read_only
59
+ end
60
+
61
+ def initialize(create_parent, create_options = {})
62
+ # always mark dirty unless otherwise specified
63
+ if create_options[:mark_dirty] == false
64
+ mark_dirty = false
65
+ else
66
+ mark_dirty = true
67
+ end
68
+ create_options.delete(:mark_dirty)
69
+
49
70
  @attributes = {}
50
- props.each do |prop|
71
+ @dirty_props = []
72
+ props.each do |prop, _flags|
51
73
  @attributes[prop.to_s] = ''
52
74
  end
53
75
  @children = []
@@ -61,12 +83,16 @@ module ACIrb
61
83
 
62
84
  # for performance reasons, do not use set_prop here
63
85
  # and build the dn string after all attributes are set
64
- create_attr.each do |k, v|
65
- @attributes[k.to_s] = v
86
+ create_options.each do |k, v|
87
+ flags = props[k.to_s]
88
+ @attributes[k.to_s] = v.to_s
89
+ @dirty_props.push(k.to_s) if mark_dirty
66
90
  end
67
91
  @attributes['dn'] = build_dn
92
+ @attributes['rn'] = rn
68
93
  end
69
94
 
95
+ # Internal: Adds another MO object as a child to this class
70
96
  def add_child(child)
71
97
  unless child.containers.include?(ruby_class)
72
98
  fail child.class.to_s + ' cannot be child of ' + self.class.to_s
@@ -81,11 +107,16 @@ module ACIrb
81
107
  def set_prop(key, val)
82
108
  key = key.to_s
83
109
  val = val.to_s
110
+
84
111
  return if key == 'dn' || key == 'rn'
112
+
85
113
  @attributes[key] = val
114
+ @dirty_props.push(key)
115
+
86
116
  if naming_props.include? key
87
117
  dn_str = build_dn
88
118
  @attributes['dn'] = dn_str
119
+ @attributes['rn'] = rn
89
120
  end
90
121
  end
91
122
 
@@ -95,14 +126,34 @@ module ACIrb
95
126
  p
96
127
  end
97
128
 
129
+ def get_attributes_to_include
130
+ incl_attr = {}
131
+ @attributes.each do |key, value|
132
+ if props[key.to_s]['isDn'] == true || props[key.to_s]['isRn'] == true || @dirty_props.include?(key) || naming_props.include?(key)
133
+ incl_attr[key.to_s] = value
134
+ end
135
+ end
136
+ incl_attr
137
+ end
138
+
139
+ def get_children_to_include
140
+ incl_children = []
141
+ @children.each do |child|
142
+ incl_children.push(child) if child.read_only == false
143
+ end
144
+ incl_children
145
+ end
146
+
98
147
  def to_xml
99
148
  # TODO: Use nokogiri here
100
149
  # https://github.com/sparklemotion/nokogiri/wiki/Cheat-sheet
101
150
  x = REXML::Element.new mo_type.to_s
102
- @attributes.each do |key, value|
103
- x.attributes[key.to_s] = value if value.to_s != ''
151
+
152
+ get_attributes_to_include.each do |key, value|
153
+ x.attributes[key.to_s] = value
104
154
  end
105
- @children.each do |child|
155
+
156
+ get_children_to_include.each do |child|
106
157
  x.add_element(child.to_xml)
107
158
  end
108
159
  x
@@ -111,10 +162,13 @@ module ACIrb
111
162
  def to_hash
112
163
  h = {}
113
164
  h[mo_type.to_s] = {}
114
- h[mo_type.to_s]['attributes'] = @attributes
165
+ h[mo_type.to_s]['attributes'] = {}
166
+ get_attributes_to_include.each do |key, value|
167
+ h[mo_type.to_s]['attributes'][key.to_s] = value
168
+ end
115
169
  h[mo_type.to_s]['attributes']['dn'] = dn
116
170
  h[mo_type.to_s]['children'] = [] if children.length > 0
117
- @children.each do |child|
171
+ get_children_to_include.each do |child|
118
172
  h[mo_type.to_s]['children'].push(child.to_hash)
119
173
  end
120
174
  h
@@ -125,15 +179,17 @@ module ACIrb
125
179
  end
126
180
 
127
181
  def create(restclient)
128
- @attributes['status'] = 'created,modified'
182
+ self.status = 'created,modified'
129
183
  restclient.post(data: self,
130
184
  url: "/api/mo/#{dn}.#{restclient.format}")
185
+ @dirty_props = []
131
186
  end
132
187
 
133
188
  def destroy(restclient)
134
- @attributes['status'] = 'deleted'
189
+ self.status = 'deleted'
135
190
  restclient.post(data: self,
136
191
  url: "/api/mo/#{dn}.#{restclient.format}")
192
+ @dirty_props = []
137
193
  end
138
194
 
139
195
  def exists(restclient, recurse = false)
@@ -182,7 +238,7 @@ module ACIrb
182
238
  ret
183
239
  end
184
240
  header_table = hash_to_table(
185
- 'Class' => class_name,
241
+ 'Class' => class_name
186
242
  )
187
243
  attribute_table = hash_to_table(attributes)
188
244
  header_table.push(attribute_table)
@@ -191,7 +247,8 @@ module ACIrb
191
247
 
192
248
  def method_missing(name, *args, &block)
193
249
  lookup_name = name.to_s
194
- return @attributes[lookup_name] if @attributes.include? lookup_name
250
+ return @attributes[lookup_name] if @attributes.key? lookup_name
251
+ return set_prop(lookup_name.chomp('='), args[0]) if @attributes.key? lookup_name.chomp('=')
195
252
  child_matches = []
196
253
  @children.each do |child|
197
254
  child_matches.push(child) if child.class.prefix.sub('-', '') == lookup_name
data/lib/naming.rb CHANGED
@@ -100,7 +100,7 @@ module ACIrb
100
100
 
101
101
  return prefix_match if matches
102
102
 
103
- return nil
103
+ nil
104
104
  end
105
105
 
106
106
  def self.get_class_from_child_prefix(parent_mo, rn_str)
data/lib/query.rb CHANGED
@@ -7,7 +7,7 @@ module ACIrb
7
7
  class Query
8
8
  attr_accessor :subtree, :class_filter, :query_target, :subtree_class_filter,
9
9
  :prop_filter, :subtree_prop_filter, :subtree_include,
10
- :page_size, :include_prop, :subscribe, :sort_order
10
+ :page_size, :include_prop, :subscribe, :sort_order, :page
11
11
 
12
12
  def make_options
13
13
  query_params = []
@@ -28,6 +28,8 @@ module ACIrb
28
28
  if @subtree_include
29
29
  query_params.push('page-size=%s' % @page_size) \
30
30
  if @page_size
31
+ query_params.push('page=%s' % @page) \
32
+ if @page
31
33
  query_params.push('order-by=%s' % @sort_order) \
32
34
  if @sort_order
33
35
  query_params.push('rsp-prop-include=%s' % @include_prop) \