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
         |