junos-ez-stdlib 0.0.10
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.
- data/LICENSE +26 -0
- data/README.md +181 -0
- data/docs/Config_Utils.md +3 -0
- data/docs/Facts.md +106 -0
- data/docs/Filesys_Utils.md +3 -0
- data/docs/IPports.md +3 -0
- data/docs/L1ports.md +3 -0
- data/docs/L2ports.md +3 -0
- data/docs/Providers_Resources.md +304 -0
- data/docs/RE_utils.md +3 -0
- data/docs/StaticHosts.md +3 -0
- data/docs/StaticRoutes.md +3 -0
- data/docs/Vlans.md +3 -0
- data/examples/config/config_file.rb +72 -0
- data/examples/config/config_template_object.rb +81 -0
- data/examples/config/config_template_simple.rb +76 -0
- data/examples/config/multi_config.rb +60 -0
- data/examples/fs_utils.rb +31 -0
- data/examples/re_upgrade.rb +90 -0
- data/examples/re_utils.rb +30 -0
- data/examples/simple.rb +47 -0
- data/examples/st_hosts.rb +33 -0
- data/examples/vlans.rb +25 -0
- data/junos-ez-stdlib.gemspec +15 -0
- data/lib/junos-ez/facts/chassis.rb +45 -0
- data/lib/junos-ez/facts/ifd_style.rb +14 -0
- data/lib/junos-ez/facts/personality.rb +22 -0
- data/lib/junos-ez/facts/switch_style.rb +22 -0
- data/lib/junos-ez/facts/version.rb +32 -0
- data/lib/junos-ez/facts.rb +85 -0
- data/lib/junos-ez/ip_ports/classic.rb +149 -0
- data/lib/junos-ez/ip_ports.rb +28 -0
- data/lib/junos-ez/l1_ports/classic.rb +87 -0
- data/lib/junos-ez/l1_ports/switch.rb +134 -0
- data/lib/junos-ez/l1_ports.rb +81 -0
- data/lib/junos-ez/l2_ports/bridge_domain.rb +0 -0
- data/lib/junos-ez/l2_ports/vlan.rb +317 -0
- data/lib/junos-ez/l2_ports/vlan_l2ng.rb +0 -0
- data/lib/junos-ez/l2_ports.rb +57 -0
- data/lib/junos-ez/provider.rb +608 -0
- data/lib/junos-ez/stdlib.rb +16 -0
- data/lib/junos-ez/system/st_hosts.rb +74 -0
- data/lib/junos-ez/system/st_routes.rb +135 -0
- data/lib/junos-ez/system/syscfg.rb +103 -0
- data/lib/junos-ez/system.rb +98 -0
- data/lib/junos-ez/utils/config.rb +205 -0
- data/lib/junos-ez/utils/fs.rb +376 -0
- data/lib/junos-ez/utils/re.rb +371 -0
- data/lib/junos-ez/vlans/bridge_domain.rb +85 -0
- data/lib/junos-ez/vlans/vlan.rb +112 -0
- data/lib/junos-ez/vlans.rb +31 -0
- metadata +111 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
class Junos::Ez::StaticRoutes::Provider
|
2
|
+
|
3
|
+
### ---------------------------------------------------------------
|
4
|
+
### XML top placement
|
5
|
+
### ---------------------------------------------------------------
|
6
|
+
|
7
|
+
def xml_at_top
|
8
|
+
@name = "0.0.0.0/0" if @name == :default
|
9
|
+
|
10
|
+
Nokogiri::XML::Builder.new {|xml| xml.configuration {
|
11
|
+
xml.send('routing-options') {
|
12
|
+
xml.static { xml.route {
|
13
|
+
xml.name @name
|
14
|
+
return xml
|
15
|
+
}}
|
16
|
+
}
|
17
|
+
}}
|
18
|
+
end
|
19
|
+
|
20
|
+
### ---------------------------------------------------------------
|
21
|
+
### XML property readers
|
22
|
+
### ---------------------------------------------------------------
|
23
|
+
|
24
|
+
def xml_get_has_xml( xml )
|
25
|
+
xml.xpath('routing-options/static/route')[0]
|
26
|
+
end
|
27
|
+
|
28
|
+
def xml_read_parser( as_xml, as_hash )
|
29
|
+
set_has_status( as_xml, as_hash )
|
30
|
+
|
31
|
+
## :gateway
|
32
|
+
unless (next_hop = as_xml.xpath('next-hop')).empty?
|
33
|
+
if next_hop.count == 1
|
34
|
+
as_hash[:gateway] = next_hop.text
|
35
|
+
else
|
36
|
+
as_hash[:gateway] = next_hop.collect{|i| i.text }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
unless (active = as_xml.xpath('active')).empty?
|
41
|
+
as_hash[:active] = true
|
42
|
+
end
|
43
|
+
|
44
|
+
unless (action = as_xml.xpath( 'reject | discard | receive' )).empty?
|
45
|
+
as_hash[:action] = action[0].name.to_sym
|
46
|
+
end
|
47
|
+
|
48
|
+
unless (metric = as_xml.xpath('metric')).empty?
|
49
|
+
as_hash[:metric] = metric.text.to_i
|
50
|
+
end
|
51
|
+
|
52
|
+
xml_read_parse_noele( as_xml, 'retain', as_hash, :retain )
|
53
|
+
xml_read_parse_noele( as_xml, 'install', as_hash, :install )
|
54
|
+
xml_read_parse_noele( as_xml, 'resolve', as_hash, :resolve )
|
55
|
+
xml_read_parse_noele( as_xml, 'readvertise', as_hash, :readvertise )
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
### ---------------------------------------------------------------
|
60
|
+
### XML property writers
|
61
|
+
### ---------------------------------------------------------------
|
62
|
+
|
63
|
+
def xml_change_action( xml )
|
64
|
+
|
65
|
+
if @should[:action].nil?
|
66
|
+
xml.send( @has[:action], Netconf::JunosConfig::DELETE )
|
67
|
+
return true
|
68
|
+
end
|
69
|
+
|
70
|
+
xml.send( @should[:action] )
|
71
|
+
end
|
72
|
+
|
73
|
+
def xml_change_active( xml )
|
74
|
+
xml_set_or_delete_element( xml, 'active', @should[:active] )
|
75
|
+
end
|
76
|
+
|
77
|
+
def xml_change_gateway( xml )
|
78
|
+
# delete existing entries
|
79
|
+
ele_nh = :'next-hop'
|
80
|
+
|
81
|
+
# clear any existing values, and return unless there are any new ones ...
|
82
|
+
xml.send(ele_nh, Netconf::JunosConfig::DELETE) if @has[:gateway]
|
83
|
+
return true unless @should[:gateway]
|
84
|
+
|
85
|
+
## adding back the ones we want now ...
|
86
|
+
if @should[:gateway].kind_of? String
|
87
|
+
xml.send( ele_nh, @should[:gateway] )
|
88
|
+
else
|
89
|
+
@should[:gateway].each{ |gw| xml.send( ele_nh, gw ) }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def xml_change_retain( xml )
|
94
|
+
xml_set_or_delete_noele( xml, 'retain' )
|
95
|
+
end
|
96
|
+
|
97
|
+
def xml_change_install( xml )
|
98
|
+
xml_set_or_delete_noele( xml, 'install' )
|
99
|
+
end
|
100
|
+
|
101
|
+
def xml_change_resolve( xml )
|
102
|
+
xml_set_or_delete_noele( xml, 'resolve' )
|
103
|
+
end
|
104
|
+
|
105
|
+
def xml_change_readvertise( xml )
|
106
|
+
xml_set_or_delete_noele( xml, 'readvertise' )
|
107
|
+
end
|
108
|
+
|
109
|
+
def xml_change_metric( xml )
|
110
|
+
xml_set_or_delete( xml, 'metric', @should[:metric] )
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
##### ---------------------------------------------------------------
|
117
|
+
##### Provider collection methods
|
118
|
+
##### ---------------------------------------------------------------
|
119
|
+
|
120
|
+
class Junos::Ez::StaticRoutes::Provider
|
121
|
+
|
122
|
+
def build_list
|
123
|
+
@ndev.rpc.get_configuration{|xml| xml.send(:'routing-options') {
|
124
|
+
xml.static { xml.route }
|
125
|
+
}}.xpath('//route/name').collect do |item|
|
126
|
+
item.text
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def build_catalog
|
131
|
+
@catalog = {}
|
132
|
+
@catalog
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
class Junos::Ez::SysConfig::Provider
|
2
|
+
|
3
|
+
### ---------------------------------------------------------------
|
4
|
+
### XML top placement
|
5
|
+
### ---------------------------------------------------------------
|
6
|
+
|
7
|
+
def xml_at_top
|
8
|
+
xml = Nokogiri::XML::Builder.new {|xml| xml.configuration {
|
9
|
+
xml.system {
|
10
|
+
return xml
|
11
|
+
}
|
12
|
+
}}
|
13
|
+
end
|
14
|
+
|
15
|
+
def xml_config_read!
|
16
|
+
xml = xml_at_top
|
17
|
+
xml.send(:'host-name')
|
18
|
+
xml.send(:'domain-name')
|
19
|
+
xml.send(:'domain-search')
|
20
|
+
xml.send(:'time-zone')
|
21
|
+
xml.location
|
22
|
+
xml.send(:'name-server')
|
23
|
+
xml.ntp
|
24
|
+
@ndev.rpc.get_configuration( xml )
|
25
|
+
end
|
26
|
+
|
27
|
+
### ---------------------------------------------------------------
|
28
|
+
### XML property readers
|
29
|
+
### ---------------------------------------------------------------
|
30
|
+
|
31
|
+
def xml_get_has_xml( xml )
|
32
|
+
xml.xpath('system')[0]
|
33
|
+
end
|
34
|
+
|
35
|
+
def xml_read_parser( as_xml, as_hash )
|
36
|
+
set_has_status( as_xml, as_hash )
|
37
|
+
as_hash[:host_name] = as_xml.xpath('host-name').text
|
38
|
+
unless (data = as_xml.xpath('domain-name')).empty?
|
39
|
+
as_hash[:domain_name] = data.text
|
40
|
+
end
|
41
|
+
unless (data = as_xml.xpath('domain-search')).empty?
|
42
|
+
as_hash[:domain_search] = data.collect{|i| i.text}
|
43
|
+
end
|
44
|
+
unless (data = as_xml.xpath('time-zone')).empty?
|
45
|
+
as_hash[:timezone] = data.text
|
46
|
+
end
|
47
|
+
unless (data = as_xml.xpath('name-server/name')).empty?
|
48
|
+
as_hash[:dns_servers] = data.collect{|i| i.text}
|
49
|
+
end
|
50
|
+
unless (data = as_xml.xpath('ntp/server/name')).empty?
|
51
|
+
as_hash[:ntp_servers] = data.collect{|i| i.text}
|
52
|
+
end
|
53
|
+
unless (location = as_xml.xpath('location')).empty?
|
54
|
+
as_hash[:location] = {}
|
55
|
+
unless (data = location.xpath('building')).empty?
|
56
|
+
as_hash[:location][:building] = data.text
|
57
|
+
end
|
58
|
+
unless (data = location.xpath('country-code')).empty?
|
59
|
+
as_hash[:location][:countrycode] = data.text
|
60
|
+
end
|
61
|
+
unless (data = location.xpath('floor')).empty?
|
62
|
+
as_hash[:location][:floor] = data.text
|
63
|
+
end
|
64
|
+
unless (data = location.xpath('rack')).empty?
|
65
|
+
as_hash[:location][:rack] = data.text
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
### ---------------------------------------------------------------
|
71
|
+
### XML property writers
|
72
|
+
### ---------------------------------------------------------------
|
73
|
+
|
74
|
+
def xml_change_host_name( xml )
|
75
|
+
xml.send(:'host-name', @should[:host_name] )
|
76
|
+
end
|
77
|
+
|
78
|
+
def xml_change_domain_name( xml )
|
79
|
+
xml.send(:'domain-name', @should[:domain_name] )
|
80
|
+
end
|
81
|
+
|
82
|
+
def xml_change_domain_search( xml )
|
83
|
+
end
|
84
|
+
|
85
|
+
def xml_change_timezone( xml )
|
86
|
+
xml.send(:'time-zone', @should[:timezone])
|
87
|
+
end
|
88
|
+
|
89
|
+
def xml_change_dns_servers( xml )
|
90
|
+
end
|
91
|
+
|
92
|
+
def xml_change_ntp_servers( xml )
|
93
|
+
end
|
94
|
+
|
95
|
+
def xml_change_date( xml )
|
96
|
+
end
|
97
|
+
|
98
|
+
def xml_change_location( xml )
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
|
@@ -0,0 +1,98 @@
|
|
1
|
+
|
2
|
+
require "junos-ez/provider"
|
3
|
+
|
4
|
+
### -----------------------------------------------------------------
|
5
|
+
### manage static host entries, kinda like "/etc/hosts"
|
6
|
+
### -----------------------------------------------------------------
|
7
|
+
|
8
|
+
module Junos::Ez::StaticHosts
|
9
|
+
|
10
|
+
PROPERTIES = [
|
11
|
+
:ip, # ipv4 address :String
|
12
|
+
:ip6, # ipv6 address :String
|
13
|
+
]
|
14
|
+
|
15
|
+
def self.Provider( ndev, varsym )
|
16
|
+
newbie = Junos::Ez::StaticHosts::Provider.new( ndev )
|
17
|
+
newbie.properties = Junos::Ez::Provider::PROPERTIES + PROPERTIES
|
18
|
+
Junos::Ez::Provider.attach_instance_variable( ndev, varsym, newbie )
|
19
|
+
end
|
20
|
+
|
21
|
+
class Provider < Junos::Ez::Provider::Parent
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'junos-ez/system/st_hosts'
|
27
|
+
|
28
|
+
### -----------------------------------------------------------------
|
29
|
+
### manage static route entries
|
30
|
+
### -----------------------------------------------------------------
|
31
|
+
|
32
|
+
module Junos::Ez::StaticRoutes
|
33
|
+
|
34
|
+
PROPERTIES = [
|
35
|
+
:gateway, # next-hop gateway, could be single or Array
|
36
|
+
:metric, # number or nil
|
37
|
+
:action, # one-of [ :reject, :discard, :receive ]
|
38
|
+
:active, # flag [ true, nil | false ]
|
39
|
+
:retain, # no-flag [ nil, true, false ]
|
40
|
+
:install, # no-flag [ nil, true, false ]
|
41
|
+
:readvertise, # no-flag [ nil, true, false ]
|
42
|
+
:resolve, # no-flag [ nil, true, false ]
|
43
|
+
]
|
44
|
+
|
45
|
+
def self.Provider( ndev, varsym )
|
46
|
+
newbie = Junos::Ez::StaticRoutes::Provider.new( ndev )
|
47
|
+
newbie.properties = Junos::Ez::Provider::PROPERTIES + PROPERTIES
|
48
|
+
Junos::Ez::Provider.attach_instance_variable( ndev, varsym, newbie )
|
49
|
+
end
|
50
|
+
|
51
|
+
class Provider < Junos::Ez::Provider::Parent
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
require 'junos-ez/system/st_routes'
|
57
|
+
|
58
|
+
### -----------------------------------------------------------------
|
59
|
+
### the 'syscfg' is a work in progress, do not use ...
|
60
|
+
### -----------------------------------------------------------------
|
61
|
+
|
62
|
+
module Junos::Ez::SysConfig
|
63
|
+
|
64
|
+
PROPERTIES = [
|
65
|
+
:host_name, # String, host-name
|
66
|
+
:domain_name, # domain name, string or array
|
67
|
+
:domain_search, # array of dns name suffix values
|
68
|
+
:dns_servers, # array of ip-addrs
|
69
|
+
:ntp_servers, # array NTP servers HASH of
|
70
|
+
# :version
|
71
|
+
# :key
|
72
|
+
:timezone, # String time-zone
|
73
|
+
:date, # String format: YYYYMMDDhhmm.ss
|
74
|
+
:location, # location HASH with properties
|
75
|
+
# :countrycode
|
76
|
+
# :building,
|
77
|
+
# :floor,
|
78
|
+
# :rack
|
79
|
+
]
|
80
|
+
|
81
|
+
def self.Provider( ndev, varsym )
|
82
|
+
raise ArgumentError "work-in-progress ..."
|
83
|
+
|
84
|
+
newbie = Junos::Ez::SysConfig::Provider.new( ndev )
|
85
|
+
newbie.properties = Junos::Ez::Provider::PROPERTIES + PROPERTIES
|
86
|
+
Junos::Ez::Provider.attach_instance_variable( ndev, varsym, newbie )
|
87
|
+
end
|
88
|
+
|
89
|
+
class Provider < Junos::Ez::Provider::Parent
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
require 'junos-ez/system/syscfg'
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
@@ -0,0 +1,205 @@
|
|
1
|
+
=begin
|
2
|
+
---------------------------------------------------------------------
|
3
|
+
Config::Utils is a collection of methods used for loading
|
4
|
+
configuration files/templates and software images
|
5
|
+
|
6
|
+
commit! - commit configuration
|
7
|
+
commit? - see if a candidate config is OK (commit-check)
|
8
|
+
diff? - shows the diff of the candidate config w/current | rolback
|
9
|
+
load! - load configuration onto device
|
10
|
+
lock! - take exclusive lock on config
|
11
|
+
unlock! - release exclusive lock on config
|
12
|
+
rollback! - perform a config rollback
|
13
|
+
|
14
|
+
---------------------------------------------------------------------
|
15
|
+
=end
|
16
|
+
|
17
|
+
module Junos::Ez::Config
|
18
|
+
def self.Utils( ndev, varsym )
|
19
|
+
newbie = Junos::Ez::Config::Provider.new( ndev )
|
20
|
+
Junos::Ez::Provider.attach_instance_variable( ndev, varsym, newbie )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
### -----------------------------------------------------------------
|
25
|
+
### PUBLIC METHODS
|
26
|
+
### -----------------------------------------------------------------
|
27
|
+
### -----------------------------------------------------------------
|
28
|
+
|
29
|
+
class Junos::Ez::Config::Provider < Junos::Ez::Provider::Parent
|
30
|
+
|
31
|
+
### ---------------------------------------------------------------
|
32
|
+
### load! - used to load configuration files / templates. This
|
33
|
+
### does not perform a 'commit', just the equivalent of the
|
34
|
+
### load-configuration RPC
|
35
|
+
###
|
36
|
+
### --- options ---
|
37
|
+
###
|
38
|
+
### :filename => path - indcates the filename of content
|
39
|
+
### note: filename extension will also define format
|
40
|
+
### .{conf,text,txt} <==> :text
|
41
|
+
### .xml <==> :xml
|
42
|
+
### .set <==> :set
|
43
|
+
###
|
44
|
+
### :content => String - string content of data (vs. :filename)
|
45
|
+
###
|
46
|
+
### :format => [:text, :set, :xml], default :text (curly-brace)
|
47
|
+
### this will override any auto-format from the :filename
|
48
|
+
###
|
49
|
+
### :binding - indicates file/content is an ERB
|
50
|
+
### => <object> - will grab the binding from this object
|
51
|
+
### using a bit of meta-programming magic
|
52
|
+
### => <binding> - will use this binding
|
53
|
+
###
|
54
|
+
### :replace! => true - enables the 'replace' option
|
55
|
+
### :overwrite! => true - enables the 'overwrite' optoin
|
56
|
+
###
|
57
|
+
### --- returns ---
|
58
|
+
### true if the configuration is loaded OK
|
59
|
+
### raise Netconf::EditError otherwise
|
60
|
+
### ---------------------------------------------------------------
|
61
|
+
|
62
|
+
def load!( opts = {} )
|
63
|
+
raise ArgumentError unless opts[:content] || opts[:filename]
|
64
|
+
|
65
|
+
content = opts[:content] || File.read( opts[:filename] )
|
66
|
+
|
67
|
+
attrs = {}
|
68
|
+
attrs[:action] = 'replace' if opts[:replace!]
|
69
|
+
attrs[:action] = 'override' if opts[:override!]
|
70
|
+
|
71
|
+
if opts[:format]
|
72
|
+
attrs[:format] = opts[:format].to_s
|
73
|
+
elsif opts[:filename]
|
74
|
+
case f_ext = File.extname( opts[:filename] )
|
75
|
+
when '.conf','.text','.txt'; attrs[:format] = 'text'
|
76
|
+
when '.set'; attrs[:format] = 'set'
|
77
|
+
when '.xml'; # default is XML
|
78
|
+
else
|
79
|
+
raise ArgumentError, "unknown format from extension: #{f_ext}"
|
80
|
+
end
|
81
|
+
else
|
82
|
+
raise ArgumentError "unspecified format"
|
83
|
+
end
|
84
|
+
|
85
|
+
if opts[:binding]
|
86
|
+
erb = ERB.new( content, nil, '>' )
|
87
|
+
case opts[:binding]
|
88
|
+
when Binding
|
89
|
+
# binding was provided to use
|
90
|
+
content = erb.result( opts[:binding] )
|
91
|
+
when Object
|
92
|
+
obj = opts[:binding]
|
93
|
+
def obj.junos_ez_binding; binding end
|
94
|
+
content = erb.result( obj.junos_ez_binding )
|
95
|
+
class << obj; remove_method :junos_ez_binding end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
@ndev.rpc.load_configuration( content, attrs )
|
100
|
+
true # everthing OK!
|
101
|
+
end
|
102
|
+
|
103
|
+
### ---------------------------------------------------------------
|
104
|
+
### commit! - commits the configuration to the device
|
105
|
+
###
|
106
|
+
### --- options ---
|
107
|
+
###
|
108
|
+
### :confirm => true | timeout
|
109
|
+
### :comment => commit log comment
|
110
|
+
###
|
111
|
+
### --- returns ---
|
112
|
+
### true if commit completed
|
113
|
+
### raises Netconf::CommitError otherwise
|
114
|
+
### ---------------------------------------------------------------
|
115
|
+
|
116
|
+
def commit!( opts = {} )
|
117
|
+
|
118
|
+
args = {}
|
119
|
+
args[:log] = opts[:comment] if opts[:comment]
|
120
|
+
if opts[:confirm]
|
121
|
+
args[:confirmed] = true
|
122
|
+
if opts[:confirm] != true
|
123
|
+
timeout = Integer( opts[:confirm] ) rescue false
|
124
|
+
raise ArgumentError "invalid timeout #{opts[:confirm]}" unless timeout
|
125
|
+
args[:confirm_timeout] = timeout
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
@ndev.rpc.commit_configuration( args )
|
130
|
+
true
|
131
|
+
end
|
132
|
+
|
133
|
+
### ---------------------------------------------------------------
|
134
|
+
### commit? - perform commit configuration check
|
135
|
+
###
|
136
|
+
### --- returns ---
|
137
|
+
### true if candidate config is OK to commit
|
138
|
+
### Array of rpc-error data otherwise
|
139
|
+
### ---------------------------------------------------------------
|
140
|
+
|
141
|
+
def commit?
|
142
|
+
begin
|
143
|
+
@ndev.rpc.commit_configuration( :check => true )
|
144
|
+
rescue => e
|
145
|
+
return Junos::Ez::rpc_errors( e.rsp )
|
146
|
+
end
|
147
|
+
true # commit check OK!
|
148
|
+
end
|
149
|
+
|
150
|
+
### ---------------------------------------------------------------
|
151
|
+
### rollback! - used to rollback the configuration
|
152
|
+
### ---------------------------------------------------------------
|
153
|
+
|
154
|
+
def rollback!( rollback_id = 0 )
|
155
|
+
raise ArgumentError, "invalid rollback #{rollback_id}" unless ( rollback_id >= 0 and rollback_id <= 50 )
|
156
|
+
@ndev.rpc.load_configuration( :compare=>'rollback', :rollback=> rollback_id.to_s )
|
157
|
+
true # rollback OK!
|
158
|
+
end
|
159
|
+
|
160
|
+
### ---------------------------------------------------------------
|
161
|
+
### diff? - displays diff (patch format) between
|
162
|
+
### current candidate configuration loaded and the rollback_id
|
163
|
+
###
|
164
|
+
### --- returns ---
|
165
|
+
### false if no diff
|
166
|
+
### String of diff output otherwise
|
167
|
+
### ---------------------------------------------------------------
|
168
|
+
|
169
|
+
def diff?( rollback_id = 0 )
|
170
|
+
raise ArgumentError, "invalid rollback #{rollback_id}" unless ( rollback_id >= 0 and rollback_id <= 50 )
|
171
|
+
got = ndev.rpc.get_configuration( :compare=>'rollback', :rollback=> rollback_id.to_s )
|
172
|
+
diff = got.xpath('configuration-output').text
|
173
|
+
return false if diff == "\n"
|
174
|
+
diff
|
175
|
+
end
|
176
|
+
|
177
|
+
### ---------------------------------------------------------------
|
178
|
+
### lock! - takes an exclusive lock on the candidate config
|
179
|
+
###
|
180
|
+
### --- returns ---
|
181
|
+
### true if lock acquired
|
182
|
+
### raise Netconf::LockError otherwise
|
183
|
+
### ---------------------------------------------------------------
|
184
|
+
|
185
|
+
def lock!
|
186
|
+
@ndev.rpc.lock_configuration
|
187
|
+
true
|
188
|
+
end
|
189
|
+
|
190
|
+
### ---------------------------------------------------------------
|
191
|
+
### unlock! - releases exclusive lock on candidate config
|
192
|
+
###
|
193
|
+
### --- returns ---
|
194
|
+
### true if lock release
|
195
|
+
### raise Netconf::RpcError otherwise
|
196
|
+
### ---------------------------------------------------------------
|
197
|
+
|
198
|
+
def unlock!
|
199
|
+
@ndev.rpc.unlock_configuration
|
200
|
+
true
|
201
|
+
end
|
202
|
+
|
203
|
+
end # class Provider
|
204
|
+
|
205
|
+
|