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,72 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This exmaple illustrates the use of the Junos::Ez::Config::Utils library. The code will load the contents
|
4
|
+
of a configuration file and save the diff output to the file "diffs.txt". Error checking/exception
|
5
|
+
handling is also demonstrated. If there are any errors, the "pretty-print" (pp) function will dump the
|
6
|
+
contents of the result structure to stderr so you can see what it looks like.
|
7
|
+
|
8
|
+
=end
|
9
|
+
|
10
|
+
require 'net/netconf/jnpr'
|
11
|
+
require 'junos-ez/stdlib'
|
12
|
+
|
13
|
+
# login information for NETCONF session
|
14
|
+
|
15
|
+
login = { :target => 'vsrx', :username => 'jeremy', :password => 'jeremy1', }
|
16
|
+
|
17
|
+
## create a NETCONF object to manage the device and open the connection ...
|
18
|
+
|
19
|
+
ndev = Netconf::SSH.new( login )
|
20
|
+
$stdout.print "Connecting to device #{login[:target]} ... "
|
21
|
+
ndev.open
|
22
|
+
$stdout.puts "OK!"
|
23
|
+
|
24
|
+
# attach the junos-ez objects to the ndev object ...
|
25
|
+
|
26
|
+
Junos::Ez::Provider( ndev )
|
27
|
+
Junos::Ez::Config::Utils( ndev, :cfg )
|
28
|
+
|
29
|
+
# begin a block to trap any raised expections ...
|
30
|
+
begin
|
31
|
+
|
32
|
+
# lock the candidate config
|
33
|
+
ndev.cfg.lock!
|
34
|
+
|
35
|
+
# load the contents of the 'load_sample.conf' file
|
36
|
+
# into the device.
|
37
|
+
|
38
|
+
$stdout.puts "Loading changes ..."
|
39
|
+
ndev.cfg.load! :filename => 'load_sample.conf'
|
40
|
+
|
41
|
+
# check to see if commit-check passes. if it doesn't
|
42
|
+
# it will return a structure of errors
|
43
|
+
|
44
|
+
unless (errs = ndev.cfg.commit?) == true
|
45
|
+
$stderr.puts "Commit check failed"
|
46
|
+
pp errs
|
47
|
+
ndev.close # will auto-rollback changes
|
48
|
+
exit 1
|
49
|
+
end
|
50
|
+
|
51
|
+
# save the cnfig diff to a file ...
|
52
|
+
File.open( "diffs.txt", "w") {|f| f.write ndev.cfg.diff? }
|
53
|
+
|
54
|
+
# commit the changes and unlock the config
|
55
|
+
|
56
|
+
$stdout.puts "Commiting changes ..."
|
57
|
+
ndev.cfg.commit!
|
58
|
+
ndev.cfg.unlock!
|
59
|
+
|
60
|
+
$stdout.puts "Done!"
|
61
|
+
|
62
|
+
rescue Netconf::LockError
|
63
|
+
$stderr.puts "Unable to lock config"
|
64
|
+
rescue Netconf::EditError => e
|
65
|
+
$stderr.puts "Unable to load configuration"
|
66
|
+
pp Junos::Ez::rpc_errors( e.rsp )
|
67
|
+
rescue Netconf::CommitError => e
|
68
|
+
$stderr.puts "Unable to commit configuration"
|
69
|
+
pp Junos::Ez::rpc_errors( e.rpc )
|
70
|
+
end
|
71
|
+
|
72
|
+
ndev.close
|
@@ -0,0 +1,81 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This exmaple illustrates the use of the Junos::Ez::Config::Utils library. The code will load the contents
|
4
|
+
of a template (ERB) file and use an object to contain the variables used in scope (binding).
|
5
|
+
|
6
|
+
Error checking/exception handling is also demonstrated. If there are any errors, the "pretty-print"
|
7
|
+
(pp) function will dump the contents of the result structure to stderr so you can see what it looks like.
|
8
|
+
|
9
|
+
=end
|
10
|
+
|
11
|
+
require 'net/netconf/jnpr'
|
12
|
+
require 'junos-ez/stdlib'
|
13
|
+
|
14
|
+
# login information for NETCONF session
|
15
|
+
|
16
|
+
login = { :target => 'vsrx', :username => 'jeremy', :password => 'jeremy1', }
|
17
|
+
|
18
|
+
## create a NETCONF object to manage the device and open the connection ...
|
19
|
+
|
20
|
+
ndev = Netconf::SSH.new( login )
|
21
|
+
$stdout.print "Connecting to device #{login[:target]} ... "
|
22
|
+
ndev.open
|
23
|
+
$stdout.puts "OK!"
|
24
|
+
|
25
|
+
# attach the junos-ez objects to the ndev object ...
|
26
|
+
|
27
|
+
Junos::Ez::Provider( ndev )
|
28
|
+
Junos::Ez::Config::Utils( ndev, :cfg )
|
29
|
+
|
30
|
+
# begin a block to trap any raised expections ...
|
31
|
+
begin
|
32
|
+
|
33
|
+
# lock the candidate config
|
34
|
+
ndev.cfg.lock!
|
35
|
+
|
36
|
+
# load the template (ERB) file and use an object to contains the variables
|
37
|
+
# in scope durning the ERB result evaluation, so declare that now just for demo purposes ...
|
38
|
+
|
39
|
+
class MyClass
|
40
|
+
def initialize
|
41
|
+
@interfaces = ['ge-0/0/1','ge-0/0/2','ge-0/0/3']
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
myobj = MyClass.new
|
46
|
+
|
47
|
+
$stdout.puts "Loading changes ..."
|
48
|
+
ndev.cfg.load! :filename => 'load_template_object.conf', :binding => myobj
|
49
|
+
|
50
|
+
# check to see if commit-check passes. if it doesn't
|
51
|
+
# it will return a structure of errors
|
52
|
+
|
53
|
+
unless (errs = ndev.cfg.commit?) == true
|
54
|
+
$stderr.puts "Commit check failed"
|
55
|
+
pp errs
|
56
|
+
ndev.close # will auto-rollback changes
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
|
60
|
+
# save the cnfig diff to a file ...
|
61
|
+
File.open( "diffs.txt", "w") {|f| f.write ndev.cfg.diff? }
|
62
|
+
|
63
|
+
# commit the changes and unlock the config
|
64
|
+
|
65
|
+
$stdout.puts "Commiting changes ..."
|
66
|
+
ndev.cfg.commit!
|
67
|
+
ndev.cfg.unlock!
|
68
|
+
|
69
|
+
$stdout.puts "Done!"
|
70
|
+
|
71
|
+
rescue Netconf::LockError
|
72
|
+
$stderr.puts "Unable to lock config"
|
73
|
+
rescue Netconf::EditError => e
|
74
|
+
$stderr.puts "Unable to load configuration"
|
75
|
+
pp Junos::Ez::rpc_errors( e.rsp )
|
76
|
+
rescue Netconf::CommitError => e
|
77
|
+
$stderr.puts "Unable to commit configuration"
|
78
|
+
pp Junos::Ez::rpc_errors( e.rpc )
|
79
|
+
end
|
80
|
+
|
81
|
+
ndev.close
|
@@ -0,0 +1,76 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
This exmaple illustrates the use of the Junos::Ez::Config::Utils library. The code will load the contents
|
4
|
+
of a template (ERB) file and use the current variables in the main scope (binding) to fill in the details.
|
5
|
+
|
6
|
+
Error checking/exception handling is also demonstrated. If there are any errors, the "pretty-print"
|
7
|
+
(pp) function will dump the contents of the result structure to stderr so you can see what it looks like.
|
8
|
+
|
9
|
+
=end
|
10
|
+
|
11
|
+
require 'net/netconf/jnpr'
|
12
|
+
require 'junos-ez/stdlib'
|
13
|
+
|
14
|
+
# login information for NETCONF session
|
15
|
+
|
16
|
+
login = { :target => 'vsrx', :username => 'jeremy', :password => 'jeremy1', }
|
17
|
+
|
18
|
+
## create a NETCONF object to manage the device and open the connection ...
|
19
|
+
|
20
|
+
ndev = Netconf::SSH.new( login )
|
21
|
+
$stdout.print "Connecting to device #{login[:target]} ... "
|
22
|
+
ndev.open
|
23
|
+
$stdout.puts "OK!"
|
24
|
+
|
25
|
+
# attach the junos-ez objects to the ndev object ...
|
26
|
+
|
27
|
+
Junos::Ez::Provider( ndev )
|
28
|
+
Junos::Ez::Config::Utils( ndev, :cfg )
|
29
|
+
|
30
|
+
# begin a block to trap any raised expections ...
|
31
|
+
begin
|
32
|
+
|
33
|
+
# lock the candidate config
|
34
|
+
ndev.cfg.lock!
|
35
|
+
|
36
|
+
# load the template (ERB) file and use the current variables in scope (binding)
|
37
|
+
# when evaluating the results of the template. The template references a
|
38
|
+
# veriable called 'interfaces', so declare that now ...
|
39
|
+
|
40
|
+
interfaces = ['ge-0/0/1','ge-0/0/2','ge-0/0/3']
|
41
|
+
|
42
|
+
$stdout.puts "Loading changes ..."
|
43
|
+
ndev.cfg.load! :filename => 'load_template_main.conf', :binding => binding
|
44
|
+
|
45
|
+
# check to see if commit-check passes. if it doesn't
|
46
|
+
# it will return a structure of errors
|
47
|
+
|
48
|
+
unless (errs = ndev.cfg.commit?) == true
|
49
|
+
$stderr.puts "Commit check failed"
|
50
|
+
pp errs
|
51
|
+
ndev.close # will auto-rollback changes
|
52
|
+
exit 1
|
53
|
+
end
|
54
|
+
|
55
|
+
# save the cnfig diff to a file ...
|
56
|
+
File.open( "diffs.txt", "w") {|f| f.write ndev.cfg.diff? }
|
57
|
+
|
58
|
+
# commit the changes and unlock the config
|
59
|
+
|
60
|
+
$stdout.puts "Commiting changes ..."
|
61
|
+
ndev.cfg.commit!
|
62
|
+
ndev.cfg.unlock!
|
63
|
+
|
64
|
+
$stdout.puts "Done!"
|
65
|
+
|
66
|
+
rescue Netconf::LockError
|
67
|
+
$stderr.puts "Unable to lock config"
|
68
|
+
rescue Netconf::EditError => e
|
69
|
+
$stderr.puts "Unable to load configuration"
|
70
|
+
pp Junos::Ez::rpc_errors( e.rsp )
|
71
|
+
rescue Netconf::CommitError => e
|
72
|
+
$stderr.puts "Unable to commit configuration"
|
73
|
+
pp Junos::Ez::rpc_errors( e.rpc )
|
74
|
+
end
|
75
|
+
|
76
|
+
ndev.close
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'net/netconf/jnpr'
|
3
|
+
require 'junos-ez/stdlib'
|
4
|
+
|
5
|
+
# list of targets to make the change. Hardcoding these as array
|
6
|
+
# but you could load them from a file, etc.
|
7
|
+
|
8
|
+
targets = [ 'vsrx', 'ex-10', 'ex-20', 'ex-33' ]
|
9
|
+
|
10
|
+
# let's assume that all targets use the same login/password ...
|
11
|
+
|
12
|
+
login = { :username => 'jeremy', :password => 'jeremy1', }
|
13
|
+
|
14
|
+
|
15
|
+
# -------------------------------------------------------------------
|
16
|
+
# define a function to do the configuration actions
|
17
|
+
# -------------------------------------------------------------------
|
18
|
+
|
19
|
+
def load_stuff( login )
|
20
|
+
|
21
|
+
## create a NETCONF object to manage the device and open the connection ...
|
22
|
+
ndev = Netconf::SSH.new( login )
|
23
|
+
$stdout.print "Connecting to device #{login[:target]} ... "
|
24
|
+
ndev.open
|
25
|
+
$stdout.puts "OK!"
|
26
|
+
|
27
|
+
Junos::Ez::Provider( ndev )
|
28
|
+
Junos::Ez::Config::Utils( ndev, :cfg )
|
29
|
+
|
30
|
+
# lock the candidate config
|
31
|
+
# ndev.cfg.lock!
|
32
|
+
|
33
|
+
# examples of loading ...
|
34
|
+
# ndev.cfg.load! :filename => 'load_sample.conf'
|
35
|
+
# ndev.cfg.load! :content => File.read( 'load_sample.conf' ), :format => :text
|
36
|
+
# ndev.cfg.load! :filename => 'load_sample.set'
|
37
|
+
|
38
|
+
binding.pry
|
39
|
+
|
40
|
+
# check to see if the config is OK to commit
|
41
|
+
# ndev.cfg.commit?
|
42
|
+
|
43
|
+
# perform the commit
|
44
|
+
# ndev.cfg.commit!
|
45
|
+
|
46
|
+
# unlock the config
|
47
|
+
# ndev.cfg.unlock!
|
48
|
+
|
49
|
+
ndev.close
|
50
|
+
end
|
51
|
+
|
52
|
+
### -----------------------------------------------------------------
|
53
|
+
### run through each of the target names and load configs ..
|
54
|
+
### -----------------------------------------------------------------
|
55
|
+
|
56
|
+
targets.each do |target|
|
57
|
+
login[:target] = target
|
58
|
+
load_stuff( login )
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'pp'
|
3
|
+
require 'yaml'
|
4
|
+
require 'net/netconf/jnpr'
|
5
|
+
require 'junos-ez/stdlib'
|
6
|
+
|
7
|
+
# login information for NETCONF session
|
8
|
+
|
9
|
+
login = { :target => 'vsrx', :username => 'jeremy', :password => 'jeremy1', }
|
10
|
+
|
11
|
+
## create a NETCONF object to manage the device and open the connection ...
|
12
|
+
|
13
|
+
ndev = Netconf::SSH.new( login )
|
14
|
+
$stdout.print "Connecting to device #{login[:target]} ... "
|
15
|
+
ndev.open
|
16
|
+
$stdout.puts "OK!"
|
17
|
+
|
18
|
+
## Now bind providers to the device object.
|
19
|
+
## the 'Junos::Ez::Provider' must be first before all others
|
20
|
+
## this provider will setup the device 'facts'. The other providers
|
21
|
+
## allow you to define the instance variables; so this example
|
22
|
+
## is using 'l1_ports' and 'ip_ports', but you could name them
|
23
|
+
## what you like, yo!
|
24
|
+
|
25
|
+
Junos::Ez::Provider( ndev )
|
26
|
+
Junos::Ez::Fs::Utils( ndev, :fs )
|
27
|
+
|
28
|
+
|
29
|
+
binding.pry
|
30
|
+
|
31
|
+
ndev.close
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'pp'
|
3
|
+
require 'net/scp'
|
4
|
+
require 'net/netconf/jnpr'
|
5
|
+
require 'junos-ez/stdlib'
|
6
|
+
|
7
|
+
unless ARGV[0]
|
8
|
+
puts "You must specify a target"
|
9
|
+
exit 1
|
10
|
+
end
|
11
|
+
|
12
|
+
# login information for NETCONF session
|
13
|
+
|
14
|
+
login = { :target => ARGV[0], :username => 'jeremy', :password => 'jeremy1', }
|
15
|
+
|
16
|
+
## create a NETCONF object to manage the device and open the connection ...
|
17
|
+
|
18
|
+
ndev = Netconf::SSH.new( login )
|
19
|
+
print "Connecting to device #{login[:target]} ... "
|
20
|
+
ndev.open
|
21
|
+
puts "OK!"
|
22
|
+
|
23
|
+
## attach our private & utils that we need ...
|
24
|
+
|
25
|
+
Junos::Ez::Provider( ndev )
|
26
|
+
Junos::Ez::RE::Utils( ndev, :re ) # routine-engine utils
|
27
|
+
Junos::Ez::FS::Utils( ndev, :fs ) # filesystem utils
|
28
|
+
|
29
|
+
## upload the software image to the target device
|
30
|
+
## http://net-ssh.github.io/net-scp/
|
31
|
+
|
32
|
+
file_name = 'junos-vsrx-domestic.tgz'
|
33
|
+
file_on_server = '/home/jschulman/junos-images/vsrx/' + file_name
|
34
|
+
file_on_junos = '/var/tmp/' + file_name
|
35
|
+
|
36
|
+
## simple function to use the Netconf::SSH SCP functionality to
|
37
|
+
## upload a file to the device and watch the percetage tick by ...
|
38
|
+
|
39
|
+
def copy_file_to_junos( ndev, file_on_server, file_on_junos )
|
40
|
+
mgr_i = cur_i = 0
|
41
|
+
ndev.scp.upload!( file_on_server, file_on_junos ) do |ch, name, sent, total|
|
42
|
+
pct = (sent.to_f / total.to_f) * 100
|
43
|
+
mgr_i = pct.to_i
|
44
|
+
if mgr_i != cur_i
|
45
|
+
cur_i = mgr_i
|
46
|
+
puts cur_i.to_s + "%"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
puts "Copying file to Junos ..."
|
52
|
+
copy_file_to_junos( ndev, file_on_server, file_on_junos )
|
53
|
+
|
54
|
+
###
|
55
|
+
### check the MD5 checksum values
|
56
|
+
###
|
57
|
+
|
58
|
+
md5_on_s = Digest::MD5.file( file_on_server ).to_s
|
59
|
+
md5_on_j = ndev.fs.checksum( :md5, file_on_junos )
|
60
|
+
|
61
|
+
if md5_on_s != md5_on_j
|
62
|
+
puts "The MD5 checksum values do not match!"
|
63
|
+
ndev.close
|
64
|
+
exit 1
|
65
|
+
end
|
66
|
+
|
67
|
+
puts "MD5 checksum matches ... proceeding ..."
|
68
|
+
puts "Validating image ... please wait ..."
|
69
|
+
|
70
|
+
unless ndev.re.validate_software?( file_on_junos )
|
71
|
+
puts "The softare does not validate!"
|
72
|
+
ndev.close
|
73
|
+
exit 1
|
74
|
+
end
|
75
|
+
|
76
|
+
puts "Installing image ... place wait ..."
|
77
|
+
rc = ndev.re.install_software!( :package => file_on_junos, :no_validate => true )
|
78
|
+
if rc != true
|
79
|
+
puts rc
|
80
|
+
end
|
81
|
+
|
82
|
+
### use pry if you want to 'look around'
|
83
|
+
## -> binding.pry
|
84
|
+
|
85
|
+
### if you wanted to reboot the system now, you coud
|
86
|
+
### do the following ...
|
87
|
+
|
88
|
+
## -> ndev.re.reboot!
|
89
|
+
|
90
|
+
ndev.close
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'pp'
|
3
|
+
require 'net/scp'
|
4
|
+
require 'net/netconf/jnpr'
|
5
|
+
require 'junos-ez/stdlib'
|
6
|
+
|
7
|
+
# login information for NETCONF session
|
8
|
+
unless ARGV[0]
|
9
|
+
puts "You must specify a target"
|
10
|
+
exit 1
|
11
|
+
end
|
12
|
+
|
13
|
+
login = { :target => ARGV[0], :username => 'jeremy', :password => 'jeremy1', }
|
14
|
+
|
15
|
+
## create a NETCONF object to manage the device and open the connection ...
|
16
|
+
|
17
|
+
ndev = Netconf::SSH.new( login )
|
18
|
+
print "Connecting to device #{login[:target]} ... "
|
19
|
+
ndev.open
|
20
|
+
puts "OK!"
|
21
|
+
|
22
|
+
## attach our private & utils that we need ...
|
23
|
+
|
24
|
+
Junos::Ez::Provider( ndev )
|
25
|
+
Junos::Ez::RE::Utils( ndev, :re )
|
26
|
+
Junos::Ez::FS::Utils( ndev, :fs )
|
27
|
+
|
28
|
+
binding.pry
|
29
|
+
|
30
|
+
ndev.close
|
data/examples/simple.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'yaml'
|
3
|
+
require 'net/netconf/jnpr'
|
4
|
+
require 'junos-ez/stdlib'
|
5
|
+
require 'junos-ez/srx'
|
6
|
+
|
7
|
+
unless ARGV[0]
|
8
|
+
puts "You must specify a target"
|
9
|
+
exit 1
|
10
|
+
end
|
11
|
+
|
12
|
+
# login information for NETCONF session
|
13
|
+
login = { :target => ARGV[0], :username => 'jeremy', :password => 'jeremy1', }
|
14
|
+
|
15
|
+
## create a NETCONF object to manage the device and open the connection ...
|
16
|
+
|
17
|
+
ndev = Netconf::SSH.new( login )
|
18
|
+
$stdout.print "Connecting to device #{login[:target]} ... "
|
19
|
+
ndev.open
|
20
|
+
$stdout.puts "OK!"
|
21
|
+
|
22
|
+
## Now bind providers to the device object.
|
23
|
+
## the 'Junos::Ez::Provider' must be first before all others
|
24
|
+
## this provider will setup the device 'facts'. The other providers
|
25
|
+
## allow you to define the instance variables; so this example
|
26
|
+
## is using 'l1_ports' and 'ip_ports', but you could name them
|
27
|
+
## what you like, yo!
|
28
|
+
|
29
|
+
Junos::Ez::Provider( ndev )
|
30
|
+
Junos::Ez::L1ports::Provider( ndev, :l1_ports )
|
31
|
+
Junos::Ez::IPports::Provider( ndev, :ip_ports )
|
32
|
+
|
33
|
+
## drop into interactive mode to play around ... let's look
|
34
|
+
## at what the device has for facts ...
|
35
|
+
|
36
|
+
#-> ndev.facts.list
|
37
|
+
#-> ndev.facts.catalog
|
38
|
+
#-> ndev.fact :version
|
39
|
+
|
40
|
+
## now look at specific providers like the physical (l1) ports ...
|
41
|
+
|
42
|
+
#-> ndev.l1_ports.list
|
43
|
+
#-> ndev.l1_ports.catalog
|
44
|
+
|
45
|
+
binding.pry
|
46
|
+
|
47
|
+
ndev.close
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'pp'
|
3
|
+
require 'yaml'
|
4
|
+
require 'net/netconf/jnpr'
|
5
|
+
require 'junos-ez/stdlib'
|
6
|
+
|
7
|
+
# login information for NETCONF session
|
8
|
+
|
9
|
+
login = { :target => ARGV[0], :username => 'jeremy', :password => 'jeremy1', }
|
10
|
+
|
11
|
+
## create a NETCONF object to manage the device and open the connection ...
|
12
|
+
|
13
|
+
ndev = Netconf::SSH.new( login )
|
14
|
+
$stdout.print "Connecting to device #{login[:target]} ... "
|
15
|
+
ndev.open
|
16
|
+
$stdout.puts "OK!"
|
17
|
+
|
18
|
+
## Now bind providers to the device object.
|
19
|
+
## the 'Junos::Ez::Provider' must be first before all others
|
20
|
+
## this provider will setup the device 'facts'. The other providers
|
21
|
+
## allow you to define the instance variables; so this example
|
22
|
+
## is using 'l1_ports' and 'ip_ports', but you could name them
|
23
|
+
## what you like, yo!
|
24
|
+
|
25
|
+
Junos::Ez::Provider( ndev )
|
26
|
+
Junos::Ez::StaticHosts::Provider( ndev, :hosts )
|
27
|
+
|
28
|
+
pp ndev.hosts.list
|
29
|
+
pp ndev.hosts.catalog
|
30
|
+
|
31
|
+
binding.pry
|
32
|
+
|
33
|
+
ndev.close
|
data/examples/vlans.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'net/netconf/jnpr'
|
2
|
+
require 'junos-ez/stdlib'
|
3
|
+
|
4
|
+
# login information for NETCONF session
|
5
|
+
|
6
|
+
login = { :target => ARGV[0], :username => 'jeremy', :password => 'jeremy1', }
|
7
|
+
|
8
|
+
## create a NETCONF object to manage the device and open the connection ...
|
9
|
+
|
10
|
+
ndev = Netconf::SSH.new( login )
|
11
|
+
$stdout.print "Connecting to device #{login[:target]} ... "
|
12
|
+
ndev.open
|
13
|
+
$stdout.puts "OK!"
|
14
|
+
|
15
|
+
Junos::Ez::Provider( ndev )
|
16
|
+
Junos::Ez::Config::Utils( ndev, :cu )
|
17
|
+
Junos::Ez::Vlans::Provider( ndev, :vlans )
|
18
|
+
Junos::Ez::L2ports::Provider( ndev, :l2_ports )
|
19
|
+
|
20
|
+
pp ndev.vlans.list
|
21
|
+
pp ndev.vlans.catalog
|
22
|
+
|
23
|
+
binding.pry
|
24
|
+
|
25
|
+
ndev.close
|
@@ -0,0 +1,15 @@
|
|
1
|
+
$LOAD_PATH.unshift 'lib'
|
2
|
+
require 'rake'
|
3
|
+
require 'junos-ez/provider'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'junos-ez-stdlib'
|
7
|
+
s.version = Junos::Ez::VERSION
|
8
|
+
s.summary = "Junos EZ Framework - Standard Libraries"
|
9
|
+
s.description = "Automation Framework for Junos/NETCONF: Facts, Providers, and Utils"
|
10
|
+
s.homepage = 'https://github.com/jeremyschulman/ruby-junos-ez-stdlib'
|
11
|
+
s.authors = ["Jeremy Schulman"]
|
12
|
+
s.email = 'jschulman@juniper.net'
|
13
|
+
s.files = FileList[ '*', 'lib/**/*.rb', 'examples/**/*.rb', 'docs/**/*.md' ]
|
14
|
+
s.add_dependency('netconf')
|
15
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Junos::Ez::Facts::Keeper.define( :chassis ) do |ndev, facts|
|
2
|
+
|
3
|
+
inv_info = ndev.rpc.get_chassis_inventory
|
4
|
+
chassis = inv_info.xpath('chassis')
|
5
|
+
|
6
|
+
facts[:hardwaremodel] = chassis.xpath('description').text
|
7
|
+
facts[:serialnumber] = chassis.xpath('serial-number').text
|
8
|
+
|
9
|
+
cfg = ndev.rpc.get_configuration{|xml|
|
10
|
+
xml.system {
|
11
|
+
xml.send(:'host-name')
|
12
|
+
xml.send(:'domain-name')
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
facts[:hostname] = cfg.xpath('//host-name').text
|
17
|
+
facts[:domain] = cfg.xpath('//domain-name').text
|
18
|
+
facts[:fqdn] = facts[:hostname]
|
19
|
+
facts[:fqdn] += ".#{facts[:domain]}" unless facts[:domain].empty?
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
Junos::Ez::Facts::Keeper.define( :master ) do |ndev, facts|
|
24
|
+
uses :routingengines
|
25
|
+
end
|
26
|
+
|
27
|
+
Junos::Ez::Facts::Keeper.define( :routingengines ) do |ndev, facts|
|
28
|
+
|
29
|
+
re_facts = ['mastership-state','status','model','up-time','last-reboot-reason']
|
30
|
+
re_info = ndev.rpc.get_route_engine_information
|
31
|
+
re_info.xpath('//route-engine').each do |re|
|
32
|
+
slot_id = re.xpath('slot').text || "0"
|
33
|
+
slot = ("RE" + slot_id).to_sym
|
34
|
+
facts[slot] = Hash[ re_facts.collect{ |ele| [ ele.tr('-','_').to_sym, re.xpath(ele).text ] } ]
|
35
|
+
if facts[slot][:mastership_state].empty?
|
36
|
+
facts[slot].delete :mastership_state
|
37
|
+
else
|
38
|
+
facts[:master] = slot_id if facts[slot][:mastership_state] == 'master'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Junos::Ez::Facts::Keeper.define( :personality ) do |ndev, facts|
|
2
|
+
|
3
|
+
model = uses :hardwaremodel
|
4
|
+
|
5
|
+
facts[:personality] = case model
|
6
|
+
when /^(EX)|(QFX)/
|
7
|
+
:SWITCH
|
8
|
+
when /^MX/
|
9
|
+
:MX
|
10
|
+
when /^vMX/
|
11
|
+
facts[:virtual] = true
|
12
|
+
:MX
|
13
|
+
when /SRX(\d){3}/
|
14
|
+
:SRX_BRANCH
|
15
|
+
when /junosv-firefly/i
|
16
|
+
facts[:virtual] = true
|
17
|
+
:SRX_BRANCH
|
18
|
+
when /SRX(\d){4}/
|
19
|
+
:SRX_HIGHEND
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Junos::Ez::Facts::Keeper.define( :switch_style ) do |ndev, facts|
|
2
|
+
f_persona = uses :personality
|
3
|
+
|
4
|
+
facts[:switch_style] = case f_persona
|
5
|
+
when :SWITCH, :SRX_BRANCH
|
6
|
+
case facts[:hardwaremodel]
|
7
|
+
when /junosv-firefly/i
|
8
|
+
:NONE
|
9
|
+
when /^(ex9)|(ex43)/i
|
10
|
+
:VLAN_L2NG
|
11
|
+
else
|
12
|
+
:VLAN
|
13
|
+
end
|
14
|
+
when :MX, :SRX_HIGHEND
|
15
|
+
:BRIDGE_DOMAIN
|
16
|
+
else
|
17
|
+
:NONE
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
|