Class | Facter::Resolution |
In: |
lib/facter.rb
|
Parent: | Object |
An actual fact resolution mechanism. These are largely just chunks of code, with optional confinements restricting the mechanisms to only working on specific systems. Note that the confinements are always ANDed, so any confinements specified must all be true for the resolution to be suitable.
code | [RW] | |
fact | [RW] | |
interpreter | [RW] | |
name | [RW] |
Execute a chunk of code.
# File lib/facter.rb, line 396 396: def Resolution.exec(code, interpreter = "/bin/sh") 397: if interpreter == "/bin/sh" 398: binary = code.split(/\s+/).shift 399: 400: if have_which 401: path = nil 402: if binary !~ /^\// 403: path = %x{which #{binary} 2>/dev/null}.chomp 404: if path == "" 405: # we don't have the binary necessary 406: return nil 407: end 408: else 409: path = binary 410: end 411: 412: unless FileTest.exists?(path) 413: # our binary does not exist 414: return nil 415: end 416: end 417: 418: out = nil 419: begin 420: out = %x{#{code}}.chomp 421: rescue => detail 422: $stderr.puts detail 423: return nil 424: end 425: if out == "" 426: return nil 427: else 428: return out 429: end 430: else 431: raise ArgumentError, 432: "non-sh interpreters are not currently supported" 433: end 434: end
# File lib/facter.rb, line 387 387: def Resolution.have_which 388: if @have_which.nil? 389: %x{which which 2>/dev/null} 390: @have_which = ($? == 0) 391: end 392: @have_which 393: end
Add a new confine to the resolution mechanism.
# File lib/facter.rb, line 437 437: def confine(*args) 438: if args[0].is_a? Hash 439: args[0].each do |fact, values| 440: @confines.push Confine.new(fact,*values) 441: end 442: else 443: fact = args.shift 444: @confines.push Confine.new(fact,*args) 445: end 446: end
Return the number of confines.
# File lib/facter.rb, line 456 456: def length 457: @confines.length 458: end
Set our code for returning a value.
# File lib/facter.rb, line 461 461: def setcode(string = nil, interp = nil, &block) 462: if string 463: @code = string 464: @interpreter = interp || "/bin/sh" 465: else 466: unless block_given? 467: raise ArgumentError, "You must pass either code or a block" 468: end 469: @code = block 470: end 471: end
Set the name by which this parameter is known in LDAP. The default is just the fact name.
# File lib/facter.rb, line 475 475: def setldapname(name) 476: @fact.ldapname = name.to_s 477: end
Is this resolution mechanism suitable on the system in question?
# File lib/facter.rb, line 480 480: def suitable? 481: unless defined? @suitable 482: @suitable = true 483: if @confines.length == 0 484: return true 485: end 486: @confines.each { |confine| 487: unless confine.true? 488: @suitable = false 489: end 490: } 491: end 492: 493: return @suitable 494: end
Set tags on our parent fact.
# File lib/facter.rb, line 497 497: def tag(*values) 498: @fact.tag(*values) 499: end
How we get a value for our resolution mechanism.
# File lib/facter.rb, line 506 506: def value 507: value = nil 508: 509: if @code.is_a?(Proc) 510: value = @code.call() 511: else 512: unless defined? @interpreter 513: @interpreter = "/bin/sh" 514: end 515: if @code.nil? 516: $stderr.puts "Code for %s is nil" % @name 517: else 518: value = Resolution.exec(@code,@interpreter) 519: end 520: end 521: 522: if value == "" 523: value = nil 524: end 525: 526: return value 527: end