palo_alto 0.1.5 → 0.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e2b330f9634b5c7a7e2f7f9e0a0acc86bc393716529e1aeefac7f58c169161a9
4
- data.tar.gz: 9e3f4fa3d3e54bed392a8ba3edd0f85b2dcb7b189afe4f5b739ada12beec6a26
3
+ metadata.gz: e727fd699e499c9c7cdf0f445f1f83dc6b39721595060eb40f8ca686742f76fe
4
+ data.tar.gz: 538f05942d1bebd82c67c79749cf4cca51c57d3f56d6acbe6c8765eccd0abaca
5
5
  SHA512:
6
- metadata.gz: 407e0f6cbfd8d5b8ff7ec3c2fe53d7addf9162098c3bd1eb516a29d557eb7485500063b622d6153351ae697556f163c3312b5290d65130fde47a916bd084678e
7
- data.tar.gz: fe95ffe17e2cb493ad949dcf8cc576b610b836e414b54bc557b86aa85d033983cb0a1fde7078630fd8ad53ce9ce6c21e0838d83881c8d3e1cbc1d2f331d65297
6
+ metadata.gz: 6e02483ec9f3e9860d2a248b043e30f8da48a89c7385feee667fffdea51abfaced43db81a487ba2bdf79b0c396310baf65f0b30c2132a7e1486e9e5ba4fc09f8
7
+ data.tar.gz: 1be23db7b31ed050c9fea102f2ba3007b916572a0f1b6d9b25e94bc1ebb09b923a6f938bc31c9b165c057cc8af984aa245266de71afb5cb20ac2890b167443d2
@@ -1,4 +1,4 @@
1
- # generated: 2021-09-23 10:29:11 +0200
1
+ # generated: 2021-10-19 00:56:02 +0200
2
2
  require 'openssl'
3
3
  require 'nokogiri'
4
4
 
@@ -425,7 +425,7 @@ module PaloAlto
425
425
  start_time=Time.now
426
426
  result = self.parent_instance.dup.create!.clear!.external_set(data.xpath('//response/result').first)
427
427
  if XML.debug.include?(:statistics)
428
- puts "Elapsed for parsing #{result.length} results: #{Time.now-start_time} seconds"
428
+ warn "Elapsed for parsing #{result.length} results: #{Time.now-start_time} seconds"
429
429
  end
430
430
  result
431
431
  end
@@ -473,7 +473,7 @@ module PaloAlto
473
473
  self
474
474
  end.tap do
475
475
  if XML.debug.include?(:statistics)
476
- puts "Elapsed for parsing: #{Time.now-start_time} seconds"
476
+ warn "Elapsed for parsing: #{Time.now-start_time} seconds"
477
477
  end
478
478
  end
479
479
  end
@@ -531,9 +531,9 @@ module PaloAlto
531
531
  when 'bool'
532
532
  return true if ['yes', true].include?(value)
533
533
  return false if ['no', false].include?(value)
534
- raise ArgumentError, 'Not bool: ' + value.inspect
534
+ raise ArgumentError, "Not bool: #{value.inspect}"
535
535
  when 'string', 'ipdiscontmask', 'iprangespec', 'ipspec', 'rangelistspec'
536
- raise(ArgumentError, 'Not string') unless value.is_a?(String)
536
+ raise(ArgumentError, "Not string: #{value.inspect}") unless value.is_a?(String)
537
537
  if prop_arr['regex']
538
538
  raise ArgumentError, "Not matching regex: #{value.inspect} (#{prop_arr["regex"].inspect})" unless value.match(prop_arr["regex"])
539
539
  end
@@ -667,28 +667,34 @@ module PaloAlto
667
667
  elsif @external_values.has_key?(prop)
668
668
  return @external_values[prop]
669
669
  elsif my_prop.has_key?("default") && include_defaults
670
- return enforce_type(my_prop, my_prop['default'])
670
+ return enforce_types(my_prop, my_prop['default'])
671
671
  else
672
672
  return nil
673
673
  end
674
674
  end
675
675
 
676
- def prop_set(prop, value)
677
- my_prop = self.class.props[prop] or raise(InternalErrorException, "Unknown attribute for #{self.class}: #{prop}")
676
+ def enforce_types(prop_arr, values)
677
+ return if values.nil?
678
678
 
679
- if has_multiple_values? && value.is_a?(String)
680
- value = value.split(/\s+/)
679
+ if has_multiple_values? && values.is_a?(String)
680
+ values = values.split(/\s+/)
681
681
  end
682
682
 
683
- if value.is_a?(Array)
684
- @values[prop] = value.map{|v| enforce_type(my_prop, v)}
685
- elsif value.nil?
686
- @values[prop] = nil
683
+ if values.is_a?(Array) && has_multiple_values?
684
+ values.map{|v| enforce_type(prop_arr, v)}
685
+ elsif !has_multiple_values?
686
+ enforce_type(prop_arr, values)
687
687
  else
688
- @values[prop] = enforce_type(my_prop, value)
688
+ raise(ArgumentError, 'Needs to be Array but is not, or vice versa')
689
689
  end
690
690
  end
691
691
 
692
+ def prop_set(prop, value)
693
+ my_prop = self.class.props[prop] or raise(InternalErrorException, "Unknown attribute for #{self.class}: #{prop}")
694
+
695
+ @values[prop] = enforce_types(my_prop, value)
696
+ end
697
+
692
698
  def to_xml(changed_only:, full_tree:, include_root: )
693
699
  builder = Nokogiri::XML::Builder.new{|xml|
694
700
  xml.send(self._section, (self.selector rescue nil)) {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PaloAlto
4
- VERSION = '0.1.5'
4
+ VERSION = '0.1.6'
5
5
  end
data/lib/palo_alto.rb CHANGED
@@ -213,12 +213,15 @@ module PaloAlto
213
213
  end
214
214
  end
215
215
 
216
- def commit!(all: false)
216
+ def commit!(all: false, device_groups: nil, wait_for_completion: true)
217
+ return nil if device_groups.is_a?(Array) && device_groups.empty?
218
+
217
219
  op = if all
218
220
  'commit'
219
221
  else
220
222
  { commit: { partial: [
221
223
  { 'admin': [XML.username] },
224
+ device_groups ? {'device-group': device_groups } : nil,
222
225
  'no-template',
223
226
  'no-template-stack',
224
227
  'no-log-collector',
@@ -227,9 +230,39 @@ module PaloAlto
227
230
  'no-wildfire-appliance-cluster',
228
231
  { 'device-and-network': 'excluded' },
229
232
  { 'shared-object': 'excluded' }
230
- ] } }
233
+ ].compact } }
231
234
  end
232
- Op.new.execute(op)
235
+ Op.new.execute(op).tap do |result|
236
+ if wait_for_completion
237
+ job_id = result.at_xpath('response/result/job')&.text
238
+ wait_for_job_completion(job_id) if job_id
239
+ end
240
+ end
241
+ end
242
+
243
+ def full_commit_required?
244
+ result = Op.new.execute({check: 'full-commit-required'})
245
+ return true unless result.at_xpath('response/result').text == 'no'
246
+
247
+ false
248
+ end
249
+
250
+ def check_for_changes(usernames: [XML.username])
251
+ result = Op.new.execute({show: {config: {list: {'change-summary': {partial: {admin: usernames}}}}}})
252
+ result.xpath('response/result/summary/device-group/member').map(&:inner_text)
253
+ end
254
+
255
+ def wait_for_job_completion(job_id, wait: 5, timeout: 300)
256
+ cmd = {show: {jobs: {id: job_id}}}
257
+ start = Time.now
258
+ begin
259
+ result = Op.new.execute(cmd)
260
+ unless result.at_xpath('response/result/job/status')&.text=='ACT'
261
+ return result
262
+ end
263
+ sleep wait
264
+ end while start+timeout > Time.now
265
+ return false
233
266
  end
234
267
 
235
268
  def revert!(all: false)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: palo_alto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Roesner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-23 00:00:00.000000000 Z
11
+ date: 2021-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri