Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.
180 changes: 97 additions & 83 deletions lib/junos-ez/facts.rb
Original file line number Diff line number Diff line change
@@ -1,83 +1,97 @@
require 'junos-ez/provider'

### -----------------------------------------------------------------
### Junos::Ez module devices the toplevel Provider and associated
### Facts class & methods
### -----------------------------------------------------------------

module Junos::Ez

attr_accessor :providers, :facts

def self.Provider( ndev )
ndev.extend Junos::Ez
ndev.providers = []
ndev.facts = Junos::Ez::Facts::Keeper.new( ndev )
ndev.facts.read!
true
end

def fact( name ); facts[name] end
end;

module Junos::Ez::Facts

class Keeper
attr_accessor :known

def initialize( ndev )
@ndev = ndev
@known = Hash.new
end

def clear; @known.clear end

def list; @known.keys end
def list!; read!; list; end

def catalog; @known end
def catalog!; read!; catalog end

def uses( *facts )
values = facts.collect do |f|
self.send( "fact_read_#{f}", @ndev, @known ) unless @known[f]
self[f]
end
(values.count == 1) ? values[0] : values
end

def self.define( fact, &block )
define_method( "fact_read_#{fact}".to_sym, block )
end

def []=(key,value)
@known[key] = value
end

def [](key)
@known[key]
end

def read!
@known.clear
fact_readers = self.methods.grep /^fact_read_/
fact_readers.each do |getter|
getter =~ /^fact_read_(\w+)/
fact = $1.to_sym
self.send( getter, @ndev, @known ) unless @known[fact]
end
end

end # class
end

### -----------------------------------------------------------------
### Load all of the fact files
### -----------------------------------------------------------------

require 'junos-ez/facts/chassis'
require 'junos-ez/facts/personality'
require 'junos-ez/facts/version'
require 'junos-ez/facts/switch_style'
require 'junos-ez/facts/ifd_style'

require 'junos-ez/provider'

### -----------------------------------------------------------------
### Junos::Ez module devices the toplevel Provider and associated
### Facts class & methods
### -----------------------------------------------------------------

module Junos::Ez

attr_accessor :providers, :facts

def self.Provider( ndev )
ndev.extend Junos::Ez
ndev.providers = []
ndev.facts = Junos::Ez::Facts::Keeper.new( ndev )
ndev.facts.read!
true
end

def fact( name ); facts[name] end
end;

module Junos::Ez::Facts

class Keeper
attr_accessor :known

def initialize( ndev )
@ndev = ndev
@known = Hash.new
end

def clear; @known.clear end

def list; @known.keys end
def list!; read!; list; end

def catalog; @known end
def catalog!; read!; catalog end

def uses( *facts )
values = facts.collect do |f|
self.send( "fact_read_#{f}", @ndev, @known ) unless @known[f]
self[f]
end
(values.count == 1) ? values[0] : values
end

def self.define( fact, &block )
define_method( "fact_read_#{fact}".to_sym, block )
end

def []=(key,value)
@known[key] = value
end

def [](key)
@known[key]
end

def read!
@known.clear
fact_readers = self.methods.grep /^fact_read_/
fact_readers.each do |getter|
getter =~ /^fact_read_(\w+)/
fact = $1.to_sym
self.send( getter, @ndev, @known ) unless @known[fact]
end
end

private

def examine_model(facts)
model = facts[:hardwaremodel]
if model == 'Virtual Chassis'
re = facts.detect {|k,v| k.match(/^RE\d+/)}
if re
re_model = re[1][:model]
if re_model
model = re_model.start_with?('RE-') ? re_model[3, re_model.length] : re_model
end
end
end
model
end
end # class
end

### -----------------------------------------------------------------
### Load all of the fact files
### -----------------------------------------------------------------

require 'junos-ez/facts/chassis'
require 'junos-ez/facts/personality'
require 'junos-ez/facts/version'
require 'junos-ez/facts/switch_style'
require 'junos-ez/facts/ifd_style'
46 changes: 21 additions & 25 deletions lib/junos-ez/facts/personality.rb
Original file line number Diff line number Diff line change
@@ -1,25 +1,21 @@
Junos::Ez::Facts::Keeper.define( :personality ) do |ndev, facts|

uses :chassis, :routingengines
model = facts[:hardwaremodel]

examine = ( model != "Virtual Chassis" ) ? model : facts.select {|k,v| k.match(/^RE[0..9]+/) }.values[0][:model]

facts[:personality] = case examine
when /^(EX)|(QFX)|(OCX)/i
:SWITCH
when /^MX/i
:MX
when /^vMX/i
facts[:virtual] = true
:MX
when /SRX(\d){3}/i
:SRX_BRANCH
when /junosv-firefly/i
facts[:virtual] = true
:SRX_BRANCH
when /SRX(\d){4}/i
:SRX_HIGHEND
end

end
Junos::Ez::Facts::Keeper.define( :personality ) do |ndev, facts|
uses :chassis, :routingengines

model = examine_model(facts)
facts[:personality] = case model
when /^(?:EX)|(?:QFX)|(?:OCX)/i
:SWITCH
when /^MX/i
:MX
when /^vMX/i
facts[:virtual] = true
:MX
when /SRX(?:\d){3}/i
:SRX_BRANCH
when /junosv-firefly/i
facts[:virtual] = true
:SRX_BRANCH
when /SRX(?:\d){4}/i
:SRX_HIGHEND
end
end
57 changes: 26 additions & 31 deletions lib/junos-ez/facts/switch_style.rb
Original file line number Diff line number Diff line change
@@ -1,31 +1,26 @@
Junos::Ez::Facts::Keeper.define( :switch_style ) do |ndev, facts|
f_persona = uses :personality

model = facts[:hardwaremodel]
examine = ( model != "Virtual Chassis" ) ? model : facts.select {|k,v| k.match(/^RE[0-9]+/) }.values[0][:model]

facts[:switch_style] = case f_persona
when :SWITCH, :SRX_BRANCH
case examine
when /junosv-firefly/i
:NONE
when /^(ex9)|(ex43)|(ocx)/i
:VLAN_L2NG
when /^(qfx)/i
if facts[:version][0..3].to_f >= 13.2
:VLAN_L2NG
else
:VLAN
end
else
:VLAN
end
when :MX, :SRX_HIGHEND
:BRIDGE_DOMAIN
else
:NONE
end

end


Junos::Ez::Facts::Keeper.define( :switch_style ) do |ndev, facts|
f_persona = uses :personality
model = examine_model(facts)

facts[:switch_style] = case f_persona
when :SWITCH, :SRX_BRANCH
case model
when /junosv-firefly/i
:NONE
when /^(?:ex9)|(?:ex43)|(?:ex34)|(?:ocx)/i
:VLAN_L2NG
when /^qfx/i
if facts[:version][0..3].to_f >= 13.2
:VLAN_L2NG
else
:VLAN
end
else
:VLAN
end
when :MX, :SRX_HIGHEND
:BRIDGE_DOMAIN
else
:NONE
end
end
Loading