junos-ez-stdlib 0.0.15 → 0.0.16
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/CHANGELOG.md +7 -0
- data/docs/Facts.md +2 -2
- data/docs/Utils/Routing-Engine.md +161 -31
- data/examples/re_upgrade.rb +20 -11
- data/lib/junos-ez/provider.rb +1 -1
- data/lib/junos-ez/utils/re.rb +181 -18
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -31,3 +31,10 @@
|
|
31
31
|
runtime status information about the port
|
32
32
|
|
33
33
|
RE::Utils - misc updates, and documentation
|
34
|
+
|
35
|
+
0.0.16: 2013-05-03
|
36
|
+
|
37
|
+
RE::Utils - added support for license-key management. Renamed "software" methods from "xxx_software"
|
38
|
+
to "software_xxx" to be consistent with other naming usage. Updated docs.
|
39
|
+
|
40
|
+
|
data/docs/Facts.md
CHANGED
@@ -46,8 +46,8 @@ pp ndev.facts.catalog
|
|
46
46
|
{:hardwaremodel=>"SRX210H",
|
47
47
|
:serialnumber=>"AD2909AA0096",
|
48
48
|
:hostname=>"srx210",
|
49
|
-
:domain=>"",
|
50
|
-
:fqdn=>"srx210",
|
49
|
+
:domain=>"workflowsherpas.com",
|
50
|
+
:fqdn=>"srx210.workflowsherpas.com",
|
51
51
|
:RE=>
|
52
52
|
{:status=>"OK",
|
53
53
|
:model=>"RE-SRX210H",
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Junos::Ez::RE::Utils
|
1
|
+
# `Junos::Ez::RE::Utils`
|
2
2
|
|
3
3
|
A collection of methods to access routing-engine specific functions and information. These methods return data in Hash / Array structures so the information can be programmatically accessible, rather than scraping CLI or navigating Junos XML.
|
4
4
|
|
@@ -25,29 +25,40 @@ pp ndev.re.uptime
|
|
25
25
|
|
26
26
|
# METHODS
|
27
27
|
|
28
|
-
##
|
28
|
+
## Informational
|
29
29
|
|
30
|
-
- `status` - "show chassis routing-engine" information
|
31
|
-
- `uptime` - "show system uptime" information
|
32
|
-
- `system_alarms` - "show system alarms" information
|
33
|
-
- `chassis_alarms` - "show chassis alarms" information
|
34
|
-
- `memory` - "show system memory" information
|
35
|
-
- `users` - "show system users" information
|
30
|
+
- [`status`](#status) - "show chassis routing-engine" information
|
31
|
+
- [`uptime`](#uptime) - "show system uptime" information
|
32
|
+
- [`system_alarms`](#system_alarms) - "show system alarms" information
|
33
|
+
- [`chassis_alarms`](#chassis_alarms) - "show chassis alarms" information
|
34
|
+
- [`memory`](#memory) - "show system memory" information
|
35
|
+
- [`users`](#users) - "show system users" information
|
36
36
|
|
37
37
|
## Software Image
|
38
38
|
|
39
|
-
- `
|
40
|
-
- `
|
41
|
-
- `
|
39
|
+
- [`software_validate?`](#software_validate) - "request system software validate..."
|
40
|
+
- [`software_install!`](#software_install) - "request system software add ..."
|
41
|
+
- [`software_rollback!`](#software_rollback) - "request system software rollback"
|
42
|
+
- [`software_images`](#software_images) - indicates current/rollback image file names
|
43
|
+
|
44
|
+
## License Management
|
45
|
+
|
46
|
+
- [`license_install!`](#license_install) - "request system license add"
|
47
|
+
- [`license_rm!`](#license_rm) - "request system license delete"
|
48
|
+
- [`licenses`](#licenses) - "show system license"
|
42
49
|
|
43
50
|
## System Controls
|
44
51
|
|
45
|
-
- `reboot!` - "request system reboot" (!! NO CONFIRM !!)
|
46
|
-
- `shutdown!` - "request system power-off" (!! NO CONFIRM !!)
|
52
|
+
- [`reboot!`](#reboot) - "request system reboot" (!! NO CONFIRM !!)
|
53
|
+
- [`shutdown!`](#shutdown) - "request system power-off" (!! NO CONFIRM !!)
|
54
|
+
|
55
|
+
## Miscellaneous
|
56
|
+
|
57
|
+
- [`ping`](#ping) - Perform a "ping" command
|
47
58
|
|
48
59
|
# GORY DETAILS
|
49
60
|
|
50
|
-
## status
|
61
|
+
## `status`
|
51
62
|
|
52
63
|
Returns a Hash structure of "show chassis routing-engine" information. Each Hash key is the RE identifier. For example, on a target with a single RE:
|
53
64
|
```ruby
|
@@ -66,7 +77,7 @@ pp ndev.re.status
|
|
66
77
|
:load_avg=>[0.06, 0.13, 0.07]}}
|
67
78
|
```
|
68
79
|
|
69
|
-
## uptime
|
80
|
+
## `uptime`
|
70
81
|
|
71
82
|
Returns a Hash structure of "show system uptime" information. Each Hash key is the RE identifier. For example, on a target with a single RE:
|
72
83
|
```ruby
|
@@ -82,7 +93,7 @@ pp ndev.re.uptime
|
|
82
93
|
:last_config=>
|
83
94
|
{:at=>"2013-04-27 15:00:55 UTC", :ago=>"5d 02:41", :by=>"root"}}}
|
84
95
|
```
|
85
|
-
## system_alarms
|
96
|
+
## `system_alarms`
|
86
97
|
|
87
98
|
Returns an Array of Hash structure of "show system alarms" information. If there are no alarms, this method returns `nil`. For example, a target with a single alarm:
|
88
99
|
```ruby
|
@@ -94,7 +105,7 @@ pp ndev.re.system_alarms
|
|
94
105
|
:type=>"Configuration"}]
|
95
106
|
```
|
96
107
|
|
97
|
-
## chassis_alarms
|
108
|
+
## `chassis_alarms`
|
98
109
|
|
99
110
|
Returns an Array Hash structure of "show chassis alarms" information. If there are no alarms, this method returns `nil`. For example, a target with no chassis alarms:
|
100
111
|
```ruby
|
@@ -103,7 +114,7 @@ pp ndev.re.chassis_alarms
|
|
103
114
|
nil
|
104
115
|
```
|
105
116
|
|
106
|
-
## memory
|
117
|
+
## `memory`
|
107
118
|
|
108
119
|
Returns a Hash structure of "show system memory" information. Each key is the RE indentifier. A target with a single RE would look like the following. Note that the `:procs` Array is the process array, with each element as a Hash of process specific information.
|
109
120
|
```ruby
|
@@ -143,7 +154,7 @@ pp ndev.re.memory
|
|
143
154
|
]}}
|
144
155
|
```
|
145
156
|
|
146
|
-
## users
|
157
|
+
## `users`
|
147
158
|
|
148
159
|
Returns a Array structure of "show system users" information. Each Array item is a Hash structure of user information. A target with a single user logged in would look like:
|
149
160
|
```ruby
|
@@ -157,24 +168,49 @@ pp ndev.re.users
|
|
157
168
|
:command=>"-cli (cli)"}]
|
158
169
|
```
|
159
170
|
|
160
|
-
##
|
171
|
+
## `software_images`
|
172
|
+
Returns a Hash of the currnet and rollback image file-names.
|
173
|
+
```ruby
|
174
|
+
pp ndev.re.software_images
|
175
|
+
->
|
176
|
+
{:rollback=>"junos-12.1I20130415_junos_121_x44_d15.0-576602-domestic",
|
177
|
+
:current=>"junos-12.1I20130322_2104_slt-builder-domestic"}
|
178
|
+
```
|
179
|
+
|
180
|
+
## `software_validate?` <a name="software_validate">
|
161
181
|
|
162
182
|
Performs the equivalent of "request system software validate..." and returns `true` if the software passes validation or a String indicating the error message. The following is an example that simply checks for true:
|
163
183
|
```ruby
|
164
|
-
unless ndev.re.
|
184
|
+
unless ndev.re.software_validate?( file_on_junos )
|
165
185
|
puts "The softare does not validate!"
|
166
186
|
ndev.close
|
167
187
|
exit 1
|
168
188
|
end
|
169
189
|
```
|
170
190
|
|
171
|
-
##
|
191
|
+
## `software_install!( opts = {} )` <a name="software_install">
|
172
192
|
|
173
|
-
Performs the equivalent of "request system software add ..." and returns `true` if the operation was successful or a String indicating the error message.
|
193
|
+
Performs the equivalent of "request system software add ..." and returns `true` if the operation was successful or a String indicating the error message.
|
194
|
+
|
195
|
+
The following options are supported:
|
196
|
+
```
|
197
|
+
:no_validate => true
|
198
|
+
```
|
199
|
+
Instructs Junos not to validate the software image. You should use this option if your program explicity calls `software_validate?` first, since you don't want to do the validation twice.
|
200
|
+
```
|
201
|
+
:unlink => true
|
202
|
+
```
|
203
|
+
Instructs Junos to remove the software package file (.tgz) after the installation has completed.
|
204
|
+
```
|
205
|
+
:reboot => true
|
206
|
+
```
|
207
|
+
Instructs Junos to reboot the RE after the software has been installed successfully.
|
208
|
+
|
209
|
+
The following example illustrates an error message:
|
174
210
|
|
175
211
|
```ruby
|
176
212
|
puts "Installing image ... please wait ..."
|
177
|
-
rc = ndev.re.
|
213
|
+
rc = ndev.re.software_install!( :package => file_on_junos, :no_validate => true )
|
178
214
|
if rc != true
|
179
215
|
puts rc
|
180
216
|
end
|
@@ -203,23 +239,22 @@ WARNING: Use 'request system storage cleanup' and
|
|
203
239
|
WARNING: the 'unlink' option to improve the chances of success
|
204
240
|
```
|
205
241
|
|
206
|
-
##
|
242
|
+
## `software_rollback!` <a name="software_rollback">
|
207
243
|
|
208
244
|
Performs the equivalent of "request system software rollback". The result of the operation is returned as a String. For example, a successful rollback would look like this:
|
209
245
|
```ruby
|
210
|
-
pp ndev.re.
|
246
|
+
pp ndev.re.software_rollback!
|
211
247
|
->
|
212
|
-
"Restoring boot file package\njunos-12.
|
248
|
+
"Restoring boot file package\njunos-12.1I20130415_junos_121_x44_d15.0-576602-domestic will become active at next reboot\nWARNING: A reboot is required to load this software correctly\nWARNING: Use the 'request system reboot' command\nWARNING: when software installation is complete"
|
213
249
|
```
|
214
250
|
An unsuccessful rollback would look like this:
|
215
251
|
```ruby
|
216
|
-
pp ndev.re.
|
252
|
+
pp ndev.re.software_rollback!
|
217
253
|
->
|
218
254
|
"WARNING: Cannot rollback, /packages/junos is not valid"
|
219
255
|
```
|
220
256
|
|
221
|
-
## reboot!( opts = {} )
|
222
|
-
|
257
|
+
## `reboot!( opts = {} )` <a name="reboot">
|
223
258
|
Performs the "request system reboot" action. There is **NO** confirmation prompt, so once you've executed this method, the action begins. Once this command executes the NETCONF session to the target will eventually terminate. You can trap the `Net::SSH::Disconnect` exception to detect this event.
|
224
259
|
|
225
260
|
The option Hash provides for the following controls:
|
@@ -232,7 +267,7 @@ Instructs Junos to reboot after `:in` minutes from the time of calling `reboot!`
|
|
232
267
|
```
|
233
268
|
Instructs Junos to reboot at a specific date and time. The format of `:at` is YYYYMMDDHHMM, where HH is the 24-hour (military) time. For example HH = 01 is 1am and HH=13 is 1pm. If you omit the YYYY, MM, or DD options the current values apply. For example `:at => 1730` is 1:30pm today.
|
234
269
|
|
235
|
-
## shutdown!( opts = {} )
|
270
|
+
## `shutdown!( opts = {} )` <a name="shutdown">
|
236
271
|
|
237
272
|
Performs the "request system power-off" action. There is **NO** confirmation prompt, so once you've executed this method, the action begins. Once this command executes the NETCONF session to the target will eventually terminate. You can trap the `Net::SSH::Disconnect` exception to detect this event.
|
238
273
|
|
@@ -246,3 +281,98 @@ Instructs Junos to reboot after `:in` minutes from the time of calling `reboot!`
|
|
246
281
|
```
|
247
282
|
Instructs Junos to reboot at a specific date and time. The format of `:at` is YYYYMMDDHHMM, where HH is the 24-hour (military) time. For example HH = 01 is 1am and HH=13 is 1pm. If you omit the YYYY, MM, or DD options the current values apply. For example `:at => 1730` is 1:30pm today.
|
248
283
|
|
284
|
+
## `license_install!( opts = {} )` <a name="license_install">
|
285
|
+
Installs the provided license. This method will return `true` if the key is installed correctly or a String message indicating the error.
|
286
|
+
|
287
|
+
The following options are supported, you **MUST** use either `:key` or `:filename` to provide the license ASCII-text.
|
288
|
+
```
|
289
|
+
:key
|
290
|
+
```
|
291
|
+
The ASCII-text of the key.
|
292
|
+
```
|
293
|
+
:filename
|
294
|
+
```
|
295
|
+
The path to the file on the server (not Junos) that contains the ASCII-text of the key.
|
296
|
+
|
297
|
+
The following illustates how to load a key from the server filesystem.
|
298
|
+
```ruby
|
299
|
+
ndev.re.license_install! :filename=>'/cygwin/home/jschulman/license.txt'
|
300
|
+
->
|
301
|
+
true
|
302
|
+
```
|
303
|
+
## `license_rm!( license_id )` <a name="license_rm">
|
304
|
+
Removes either a specific license or `:all` licenses from the target. This method will return `true` if the action was successful, or a String error-message otherwise.
|
305
|
+
|
306
|
+
Removing a specific license:
|
307
|
+
```ruby
|
308
|
+
ndev.re.license_rm! "JUNOS410496"
|
309
|
+
->
|
310
|
+
true
|
311
|
+
```
|
312
|
+
Removing all licenses
|
313
|
+
```ruby
|
314
|
+
ndev.re.license_rm! :all
|
315
|
+
->
|
316
|
+
true
|
317
|
+
```
|
318
|
+
|
319
|
+
## `licenses( opts = {} )` <a name="licenses">
|
320
|
+
|
321
|
+
Returns a Hash structure of information gathered from the "show system license" command.
|
322
|
+
|
323
|
+
The following options are supported:
|
324
|
+
```
|
325
|
+
:keys => true
|
326
|
+
```
|
327
|
+
Returns the license key value in ASCII text format.
|
328
|
+
|
329
|
+
Without the `:keys` option:
|
330
|
+
|
331
|
+
```ruby
|
332
|
+
pp ndev.re.licenses
|
333
|
+
->
|
334
|
+
{"JUNOS410496"=>
|
335
|
+
{:state=>"valid",
|
336
|
+
:version=>"2",
|
337
|
+
:serialnumber=>"91730A00092074",
|
338
|
+
:customer=>"LABVSRXJuniper-SEs",
|
339
|
+
:features=>
|
340
|
+
{"all"=>
|
341
|
+
{:description=>"All features",
|
342
|
+
:date_start=>"2013-02-05",
|
343
|
+
:date_end=>"2014-02-06"}}}}
|
344
|
+
```
|
345
|
+
With the `:keys` option:
|
346
|
+
```ruby
|
347
|
+
pp ndev.re.licenses :keys=>true
|
348
|
+
->
|
349
|
+
{"JUNOS410496"=>
|
350
|
+
{:state=>"valid",
|
351
|
+
:version=>"2",
|
352
|
+
:serialnumber=>"91730A00092074",
|
353
|
+
:customer=>"LABVSRXJuniper-SEs",
|
354
|
+
:features=>
|
355
|
+
{"all"=>
|
356
|
+
{:description=>"All features",
|
357
|
+
:date_start=>"2013-02-05",
|
358
|
+
:date_end=>"2014-02-06"}},
|
359
|
+
:key=>
|
360
|
+
"\nJUNOS410496 aeaqec agaia3 27n65m fq4ojr g4ztaq jqgayd\n smrqg4 2aye2m ifbfmu DEADBEF k3tjob sxelkt\n <snip>"}}
|
361
|
+
```
|
362
|
+
|
363
|
+
## `ping( host, opts = {} )` <a name="ping">
|
364
|
+
|
365
|
+
Issues a 'ping' from the Junos target, very handy for troubleshooting. This method will return `true` if the ping action was successful, or `false` otherwise.
|
366
|
+
|
367
|
+
The following options are supported, and they are the same as documented by the Junos techpubs:
|
368
|
+
```
|
369
|
+
:do_not_fragment, :inet, :inet6, :strict,
|
370
|
+
:count, :interface, :interval, :mac_address,
|
371
|
+
:routing_instance, :size, :source, :tos, :ttl, :wait
|
372
|
+
```
|
373
|
+
Here is a ping example that uses the 'do-no-fragment' and 'count' options:
|
374
|
+
```ruby
|
375
|
+
ndev.re.ping "192.168.56.1", :count => 5, :do_not_fragment => true
|
376
|
+
->
|
377
|
+
true
|
378
|
+
```
|
data/examples/re_upgrade.rb
CHANGED
@@ -38,23 +38,27 @@ file_on_junos = '/var/tmp/' + file_name
|
|
38
38
|
|
39
39
|
def copy_file_to_junos( ndev, file_on_server, file_on_junos )
|
40
40
|
mgr_i = cur_i = 0
|
41
|
+
backitup = 8.chr * 4
|
41
42
|
ndev.scp.upload!( file_on_server, file_on_junos ) do |ch, name, sent, total|
|
42
43
|
pct = (sent.to_f / total.to_f) * 100
|
43
44
|
mgr_i = pct.to_i
|
44
45
|
if mgr_i != cur_i
|
45
46
|
cur_i = mgr_i
|
46
|
-
|
47
|
+
printf "%4s", cur_i.to_s + "%"
|
48
|
+
print backitup
|
47
49
|
end
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
51
|
-
|
53
|
+
print "Copying file to Junos ... "
|
52
54
|
copy_file_to_junos( ndev, file_on_server, file_on_junos )
|
55
|
+
puts "OK! "
|
53
56
|
|
54
57
|
###
|
55
58
|
### check the MD5 checksum values
|
56
59
|
###
|
57
60
|
|
61
|
+
print "Validating MD5 checksum ... "
|
58
62
|
md5_on_s = Digest::MD5.file( file_on_server ).to_s
|
59
63
|
md5_on_j = ndev.fs.checksum( :md5, file_on_junos )
|
60
64
|
|
@@ -64,27 +68,32 @@ if md5_on_s != md5_on_j
|
|
64
68
|
exit 1
|
65
69
|
end
|
66
70
|
|
67
|
-
puts "
|
68
|
-
|
71
|
+
puts "OK!"
|
72
|
+
|
73
|
+
print "Validating image ... please wait ... "
|
69
74
|
|
70
|
-
unless ndev.re.
|
75
|
+
unless ndev.re.software_validate?( file_on_junos )
|
71
76
|
puts "The softare does not validate!"
|
72
77
|
ndev.close
|
73
78
|
exit 1
|
74
79
|
end
|
75
80
|
|
76
|
-
puts "
|
77
|
-
|
81
|
+
puts "OK!"
|
82
|
+
|
83
|
+
print "Installing image ... please wait ... "
|
84
|
+
rc = ndev.re.software_install!( :package => file_on_junos, :no_validate => true )
|
78
85
|
if rc != true
|
79
86
|
puts rc
|
80
87
|
end
|
81
88
|
|
89
|
+
puts "OK!"
|
90
|
+
|
82
91
|
### use pry if you want to 'look around'
|
83
92
|
## -> binding.pry
|
84
93
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
94
|
+
if ARGV[1] == 'reboot'
|
95
|
+
puts "Rebooting!"
|
96
|
+
ndev.re.reboot!
|
97
|
+
end
|
89
98
|
|
90
99
|
ndev.close
|
data/lib/junos-ez/provider.rb
CHANGED
data/lib/junos-ez/utils/re.rb
CHANGED
@@ -6,15 +6,23 @@ a misc. collection of methods that perform basic automation tasks
|
|
6
6
|
like upgrading software or getting process information. The
|
7
7
|
following lists the methods and the equivalent Junos CLI commands
|
8
8
|
|
9
|
-
- status
|
10
|
-
- uptime
|
11
|
-
- system_alarms
|
12
|
-
- chassis_alarms
|
13
|
-
- memory
|
14
|
-
- users
|
15
|
-
|
16
|
-
-
|
17
|
-
-
|
9
|
+
- status show chassis routing-engine
|
10
|
+
- uptime show system uptime
|
11
|
+
- system_alarms show system alarms
|
12
|
+
- chassis_alarms show chassis alarms
|
13
|
+
- memory show system memeory
|
14
|
+
- users show system users
|
15
|
+
|
16
|
+
- software_install! request system software add
|
17
|
+
- software_rollback! request system software rollback
|
18
|
+
- software_validate? request system software validate
|
19
|
+
- software_images - provides image file names for current/rollback
|
20
|
+
|
21
|
+
- license_install! request system license add !! TBD !!
|
22
|
+
- license_rm! request system license delete
|
23
|
+
- license_save request system license save !! TBD !!
|
24
|
+
- licenses show system license
|
25
|
+
|
18
26
|
- reboot!: request system reboot (no confirm!!)
|
19
27
|
- shutdown!: request system power-off (no confirm!!)
|
20
28
|
|
@@ -179,11 +187,17 @@ class Junos::Ez::RE::Provider < Junos::Ez::Provider::Parent
|
|
179
187
|
users_a
|
180
188
|
end
|
181
189
|
|
190
|
+
### ===============================================================
|
191
|
+
###
|
192
|
+
### Software related methods
|
193
|
+
###
|
194
|
+
### ===============================================================
|
195
|
+
|
182
196
|
### ---------------------------------------------------------------
|
183
|
-
###
|
197
|
+
### software_validate? - request system software validate ...
|
184
198
|
### ---------------------------------------------------------------
|
185
199
|
|
186
|
-
def
|
200
|
+
def software_validate?( package )
|
187
201
|
got = @ndev.rpc.request_package_validate(:package_name => package).parent
|
188
202
|
errcode = got.xpath('package-result').text.to_i
|
189
203
|
return true if errcode == 0
|
@@ -193,15 +207,16 @@ class Junos::Ez::RE::Provider < Junos::Ez::Provider::Parent
|
|
193
207
|
end
|
194
208
|
|
195
209
|
### ---------------------------------------------------------------
|
196
|
-
###
|
210
|
+
### software_install! - request system software add ...
|
197
211
|
### ---------------------------------------------------------------
|
198
212
|
|
199
|
-
def
|
213
|
+
def software_install!( opts = {} )
|
200
214
|
raise ArgumentError "missing :package" unless opts[:package]
|
201
215
|
|
202
216
|
args = { :package_name => opts[:package] }
|
203
217
|
args[:no_validate] = true if opts[:no_validate]
|
204
218
|
args[:unlink] = true if opts[:unlink]
|
219
|
+
args[:reboot] = true if opts[:reboot]
|
205
220
|
|
206
221
|
got = @ndev.rpc.request_package_add( args ).parent
|
207
222
|
errcode = got.xpath('package-result').text.to_i
|
@@ -212,14 +227,37 @@ class Junos::Ez::RE::Provider < Junos::Ez::Provider::Parent
|
|
212
227
|
end
|
213
228
|
|
214
229
|
### ---------------------------------------------------------------
|
215
|
-
###
|
230
|
+
### software_rollback! - request system software rollback
|
216
231
|
### ---------------------------------------------------------------
|
217
232
|
|
218
|
-
def
|
233
|
+
def software_rollback!
|
219
234
|
got = @ndev.rpc.request_package_rollback
|
220
235
|
got.text.strip
|
221
236
|
end
|
237
|
+
|
238
|
+
def software_images
|
239
|
+
ls_pkgs = @ndev.rpc.file_list(:path=>'/packages')
|
240
|
+
symlink = ls_pkgs.xpath('//file-symlink-target')[0]
|
241
|
+
if symlink
|
242
|
+
ls_pkgs = @ndev.rpc.file_list(:path => symlink.text.strip)
|
243
|
+
end
|
244
|
+
|
245
|
+
junos_symlink = ls_pkgs.xpath('//file-information[normalize-space(file-name) = "junos"]')[0]
|
246
|
+
junos_old_symlink = ls_pkgs.xpath('//file-information[normalize-space(file-name) = "junos.old"]')[0]
|
247
|
+
|
248
|
+
ret_h = {}
|
249
|
+
ret_h[:rollback] = (junos_old_symlink) ? junos_old_symlink.xpath('file-symlink-target').text.strip : nil
|
250
|
+
ret_h[:current] = (junos_symlink) ? junos_symlink.xpath('file-symlink-target').text.strip : ret_h[:rollback]
|
251
|
+
|
252
|
+
ret_h
|
253
|
+
end
|
222
254
|
|
255
|
+
### ===============================================================
|
256
|
+
###
|
257
|
+
### Misc Routing Engine Commands & Controls
|
258
|
+
###
|
259
|
+
### ===============================================================
|
260
|
+
|
223
261
|
### ---------------------------------------------------------------
|
224
262
|
### reboot! - request system reboot (no confirm!!)
|
225
263
|
### ---------------------------------------------------------------
|
@@ -263,15 +301,14 @@ class Junos::Ez::RE::Provider < Junos::Ez::Provider::Parent
|
|
263
301
|
got.xpath('//request-reboot-status').text.strip
|
264
302
|
end
|
265
303
|
|
266
|
-
def ping( opts = {} )
|
304
|
+
def ping( host, opts = {} )
|
267
305
|
arg_options = [
|
268
|
-
:host,
|
269
306
|
:do_not_fragment, :inet, :inet6, :strict,
|
270
307
|
:count, :interface, :interval, :mac_address,
|
271
308
|
:routing_instance, :size, :source, :tos, :ttl, :wait
|
272
309
|
]
|
273
310
|
|
274
|
-
args = {}
|
311
|
+
args = {:host => host}
|
275
312
|
opts.each do |k,v|
|
276
313
|
if arg_options.include? k
|
277
314
|
args[k] = v
|
@@ -290,6 +327,132 @@ class Junos::Ez::RE::Provider < Junos::Ez::Provider::Parent
|
|
290
327
|
|
291
328
|
return (block_given?) ? yield(got) : false
|
292
329
|
end
|
330
|
+
|
331
|
+
### ===============================================================
|
332
|
+
###
|
333
|
+
### License related methods
|
334
|
+
###
|
335
|
+
### ===============================================================
|
336
|
+
|
337
|
+
## ----------------------------------------------------------------
|
338
|
+
## - retrieve Hash of license information.
|
339
|
+
##
|
340
|
+
## By default this will provide the license installed
|
341
|
+
## information.
|
342
|
+
##
|
343
|
+
## --- returns ---
|
344
|
+
## - Hash of data if there are licenses
|
345
|
+
## - nil if no licenses
|
346
|
+
##
|
347
|
+
## --- options ---
|
348
|
+
## :keys => true
|
349
|
+
## Will include the key-text for the license
|
350
|
+
##
|
351
|
+
## ----------------------------------------------------------------
|
352
|
+
|
353
|
+
def licenses( opts = {} )
|
354
|
+
|
355
|
+
got = @ndev.rpc.get_license_summary_information
|
356
|
+
licenses = got.xpath('license-information/license')
|
357
|
+
return nil if licenses.empty?
|
358
|
+
|
359
|
+
ret_h = {}
|
360
|
+
licenses.each do |lic|
|
361
|
+
lic_h = {}
|
362
|
+
ret_h[lic.xpath('name').text.strip] = lic_h
|
363
|
+
|
364
|
+
lic_h[:state] = lic.xpath('license-state').text.strip
|
365
|
+
lic_h[:version] = lic.xpath('license-version').text.strip
|
366
|
+
lic_h[:serialnumber] = lic.xpath('software-sn').text.strip
|
367
|
+
lic_h[:customer] = lic.xpath('customer-reference').text.strip
|
368
|
+
|
369
|
+
features = lic.xpath('feature-block/feature')
|
370
|
+
unless features.empty?
|
371
|
+
feats_h = {}
|
372
|
+
lic_h[:features] = feats_h
|
373
|
+
features.each do |feat|
|
374
|
+
feat_h = {}
|
375
|
+
feats_h[feat.xpath('name').text.strip] = feat_h
|
376
|
+
feat_h[:description] = feat.xpath('description').text.strip
|
377
|
+
v_info = feat.xpath('validity-information')[0]
|
378
|
+
case v_info.xpath('validity-type').text.strip
|
379
|
+
when 'date-based'
|
380
|
+
feat_h[:date_start] = v_info.xpath('start-date').text.strip
|
381
|
+
feat_h[:date_end] = v_info.xpath('end-date').text.strip
|
382
|
+
end
|
383
|
+
end # each features
|
384
|
+
end # if features
|
385
|
+
end # each license
|
386
|
+
|
387
|
+
## now check to see if the :keys have been requested. if so
|
388
|
+
## then get that data, and store back into the return Hash.
|
389
|
+
|
390
|
+
if opts[:keys]
|
391
|
+
got = @ndev.rpc.get_license_key_information
|
392
|
+
got.xpath('license-key').each do |key|
|
393
|
+
name = key.xpath('name').text.strip
|
394
|
+
ret_h[name][:key] = key.xpath('key-data').text
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
ret_h
|
399
|
+
end
|
400
|
+
|
401
|
+
## ----------------------------------------------------------------
|
402
|
+
## add a license
|
403
|
+
##
|
404
|
+
## --- returns ---
|
405
|
+
## true - key added OK
|
406
|
+
## String - error message otherwise
|
407
|
+
##
|
408
|
+
## --- options ---
|
409
|
+
## :key => String
|
410
|
+
## The key text
|
411
|
+
##
|
412
|
+
## :filename => String
|
413
|
+
## Path to licence-file on server
|
414
|
+
## ----------------------------------------------------------------
|
415
|
+
|
416
|
+
def license_install!( opts = {} )
|
417
|
+
args = {}
|
418
|
+
if opts[:key]
|
419
|
+
args[:key_data] = opts[:key]
|
420
|
+
elsif opts[:filename]
|
421
|
+
args[:key_data] = File.read(opts[:filename]).strip
|
422
|
+
end
|
423
|
+
got = @ndev.rpc.request_license_add( args )
|
424
|
+
success = got.xpath('add-success')[0]
|
425
|
+
return true if success
|
426
|
+
got.xpath('//message').text.strip
|
427
|
+
end
|
428
|
+
|
429
|
+
## ----------------------------------------------------------------
|
430
|
+
## remove a license
|
431
|
+
##
|
432
|
+
## license_id is the String license-id or the special name :all
|
433
|
+
## ----------------------------------------------------------------
|
434
|
+
|
435
|
+
def license_rm!( license_id )
|
436
|
+
args = {}
|
437
|
+
if license_id == :all
|
438
|
+
args[:all] = true
|
439
|
+
else
|
440
|
+
args[:license_identifier] = license_id
|
441
|
+
end
|
442
|
+
got = @ndev.rpc.request_license_delete( args )
|
443
|
+
### @@@ need to test return cases ... for now, just return
|
444
|
+
### the 'got' XML
|
445
|
+
got
|
446
|
+
end
|
447
|
+
|
448
|
+
## ----------------------------------------------------------------
|
449
|
+
## save licenses (plr!) to a file
|
450
|
+
## ----------------------------------------------------------------
|
451
|
+
|
452
|
+
def license_save( opts = {} )
|
453
|
+
raise StandardError, "not implemented yet"
|
454
|
+
end
|
455
|
+
|
293
456
|
end
|
294
457
|
|
295
458
|
### -----------------------------------------------------------------
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: junos-ez-stdlib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: netconf
|