shadow_facter 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Readme.rdoc ADDED
@@ -0,0 +1,33 @@
1
+ = ShadowFacter
2
+
3
+ ShadowFacter is a Ruby DSL for Facter, extracted out of the work we at Rails
4
+ Machine are doing on Moonshine[http://blog.railsmachine.com/articles/2009/01/16/moonshine-configuration-management-and-deployment/].
5
+
6
+ ShadowFacter provides a DSL for creating facts and processing them using Facter. A binary[http://railsmachine.github.com/shadow_facter/files/bin/shadow_facter.html] is provided to parse facts.
7
+
8
+
9
+ Example:
10
+
11
+ $ cat examples/lib/facts/kernel.rb
12
+ require 'shadow_facter'
13
+
14
+ namespace :kernel do
15
+ fact :name do
16
+ exec "uname -s"
17
+ end
18
+
19
+ fact :release do
20
+ exec "uname -r"
21
+ end
22
+
23
+ fact :version do
24
+ value(:release).to_s.split('.')[0]
25
+ end
26
+ end
27
+
28
+ Executing this fact:
29
+
30
+ $ bin/shadow_facter examples/lib/facts/kernel.rb
31
+ kernel_name => Darwin
32
+ kernel_version => 9
33
+ kernel_release => 9.6.0
data/bin/shadow_facter ADDED
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env ruby
2
+ # ShadowFacter allows the simple definition and gathering of facts
3
+ # using Facter[http://reductivelabs.com/projects/facter/].
4
+ #
5
+ #== Sample facts:
6
+ #
7
+ # $ cat examples/lib/facts/kernel.rb
8
+ # require 'shadow_facter'
9
+ #
10
+ # namespace :kernel do
11
+ # fact :name do
12
+ # exec "uname -s"
13
+ # end
14
+ #
15
+ # fact :release do
16
+ # exec "uname -r"
17
+ # end
18
+ #
19
+ # fact :version do
20
+ # facts(:kernel)[:release].to_s.split('.')[0]
21
+ # end
22
+ # end
23
+ #
24
+ #== Executing this fact:
25
+ #
26
+ # $ bin/shadow_facter examples/lib/facts/kernel.rb
27
+ # kernel_name => Darwin
28
+ # kernel_version => 9
29
+ # kernel_release => 9.6.0
30
+ # $
31
+ #
32
+ # The shadow_facter binary parses the given ruby code, which is
33
+ # expected to contain a definition of a namespace and some facts. Facts are
34
+ # gathered and outputed.
35
+
36
+ begin
37
+
38
+ require 'optparse'
39
+ opts = OptionParser.new do |opts|
40
+ opts.banner = <<-EOF
41
+ NAME
42
+ ShadowFacter
43
+
44
+ AUTHOR
45
+ Bradley Taylor
46
+ bradley@railsmachine.com
47
+
48
+ DESCRIPTION
49
+ A Ruby DSL for Facter
50
+
51
+ EXAMPLES
52
+ Sample fact:
53
+
54
+ $ cat examples/lib/facts/kernel.rb
55
+ require 'shadow_facter'
56
+
57
+ namespace :kernel do
58
+ fact :name do
59
+ exec "uname -s"
60
+ end
61
+
62
+ fact :release do
63
+ exec "uname -r"
64
+ end
65
+
66
+ fact :version do
67
+ value(:release).to_s.split('.')[0]
68
+ end
69
+ end
70
+
71
+ Executing this fact:
72
+
73
+ $ bin/shadow_facter examples/lib/facts/kernel.rb
74
+ kernel_name => Darwin
75
+ kernel_version => 9
76
+ kernel_release => 9.6.0
77
+ $
78
+
79
+ The shadow_facter binary parses the given ruby code, which is
80
+ expected to contain a definition of a namespace and some facts. Facts are
81
+ gathered and returned and pretty printed.
82
+
83
+ EOF
84
+ end
85
+
86
+ opts.parse!
87
+
88
+ filename = ARGV[0]
89
+ raise ArgumentError unless filename
90
+
91
+ require 'rubygems'
92
+ require 'shadow_facter'
93
+
94
+ load filename
95
+
96
+ namespaces.each do |namespace|
97
+ facts(namespace).to_hash.each do |k, v|
98
+ puts namespace.to_s + "_" + k.to_s + " => " + v.to_s
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,150 @@
1
+ # ShadowFacter allows the simple definition and gathering of facts
2
+ # using Facter[http://reductivelabs.com/projects/facter/]
3
+ #
4
+
5
+ require 'facter'
6
+
7
+ module ShadowFacter
8
+ class Facts
9
+
10
+ def initialize(namespace, keys)
11
+ @namespace = namespace
12
+ @keys = keys
13
+ end
14
+
15
+ # Return a fact value by key. Returns nil if non-existent or not constrained.
16
+ def [](key)
17
+ value(key)
18
+ end
19
+
20
+ # Return a fact value by key. Returns nil if non-existent or not constrained.
21
+ def value(key)
22
+ f = Facter[Base.facter_key(@namespace, key)]
23
+ f.value unless f.nil?
24
+ end
25
+
26
+ # Return an array of all of the constrained fact keys.
27
+ def keys
28
+ @keys.uniq.select { |k| !value(k).nil? }
29
+ end
30
+
31
+ # Return a boolean on the availability of a fact.
32
+ def has_fact?(key)
33
+ !value(key).nil?
34
+ end
35
+
36
+ # Return a hash of all of the constrained fact keys and values.
37
+ def to_hash
38
+ keys.inject({}) do |h, k|
39
+ h[k] = value(k)
40
+ h
41
+ end
42
+ end
43
+
44
+ # Return yaml of all of the constrained fact keys and values.
45
+ def to_yaml
46
+ require 'yaml'
47
+ to_hash.to_yaml
48
+ end
49
+
50
+ # Return json of all of the constrained fact keys and values.
51
+ def to_json
52
+ require 'json'
53
+ JSON.pretty_generate to_hash
54
+ end
55
+
56
+ # Reload facts in namespace.
57
+ def reload!
58
+ keys.each { |key| Facter[Base.facter_key(@namespace, key)].flush }
59
+ end
60
+
61
+ end
62
+
63
+
64
+ class Base
65
+ class << self
66
+
67
+ # Define a namespace.
68
+ def namespace(name)
69
+ @namespaces ||= Hash.new
70
+ raise "Nested namespaces not supported yet!" unless @current_namespace.nil?
71
+ @current_namespace = name
72
+ yield
73
+ @current_namespace = nil
74
+ end
75
+
76
+ # Return an array of defined namespaces names.
77
+ def namespaces()
78
+ @namespaces.keys
79
+ end
80
+
81
+ # Define a fact in Facter using a value or block. Can be confined with a hash
82
+ # of Facter keys (namespace_key) and value.
83
+ #
84
+ # Examples:
85
+ # fact :tea, "oolong"
86
+ # fact :tea, "puerh", {:drinks_season => "winter"}
87
+ # fact(:rand) { rand }
88
+ def fact(key, value=nil, confine_args={}, &block)
89
+ raise "Namespace required!" unless current_namespace
90
+ @namespaces[current_namespace] ||= []
91
+ @namespaces[current_namespace] << key
92
+ block = lambda { value.to_s } unless block_given?
93
+ Facter.add(current_key(key)) do
94
+ confine confine_args unless confine_args.empty?
95
+ setcode block
96
+ end
97
+ end
98
+
99
+ # Return an instance of the Facts class for the specified namespace.
100
+ def facts(namespace)
101
+ ShadowFacter::Facts.new(namespace, @namespaces[namespace])
102
+ end
103
+
104
+ # Construct a namespaced key for using with Facter.
105
+ def facter_key(namespace, key)
106
+ (namespace.to_s + "_" + key.to_s).to_sym
107
+ end
108
+
109
+ def current_namespace
110
+ @current_namespace
111
+ end
112
+
113
+ def current_key(key)
114
+ facter_key(current_namespace, key)
115
+ end
116
+
117
+ private :current_namespace, :current_key
118
+ end
119
+ end
120
+ end
121
+
122
+ # Return an array of defined namespaces names.
123
+ def namespaces()
124
+ ShadowFacter::Base.namespaces
125
+ end
126
+
127
+ # Define a namespace.
128
+ def namespace(name, &b)
129
+ ShadowFacter::Base.namespace(name, &b)
130
+ end
131
+
132
+ # Define a fact in Facter using a value or block. Can be confined with a hash
133
+ # of Facter keys (namespace_key) and value.
134
+ # Examples:
135
+ # fact :tea, "oolong"
136
+ # fact :tea, "puerh", {:drinks_season => "winter"}
137
+ # fact(:rand) { rand }
138
+ def fact(key, value=nil, confine_args={}, &b)
139
+ ShadowFacter::Base.fact(key, value, confine_args, &b)
140
+ end
141
+
142
+ # Return an instance of the Facts class for the specified namespace.
143
+ def facts(namespace)
144
+ ShadowFacter::Base.facts(namespace)
145
+ end
146
+
147
+ # Execute a system command via Facter.
148
+ def exec(command)
149
+ Facter::Util::Resolution.exec(command)
150
+ end
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__) + '/shadow_facter', 'base.rb')
2
+
3
+
4
+
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shadow_facter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Bradley Taylor
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-01-19 00:00:00 -05:00
13
+ default_executable: shadow_facter
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: facter
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.5.2
24
+ version:
25
+ description: Ruby simple DSL wrapper library for Facter
26
+ email:
27
+ - bradley@railsmachine.com
28
+ executables:
29
+ - shadow_facter
30
+ extensions: []
31
+
32
+ extra_rdoc_files: []
33
+
34
+ files:
35
+ - Readme.rdoc
36
+ - lib/shadow_facter.rb
37
+ - lib/shadow_facter/base.rb
38
+ - bin/shadow_facter
39
+ has_rdoc: true
40
+ homepage: http://railsmachine.com
41
+ post_install_message:
42
+ rdoc_options: []
43
+
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ requirements: []
59
+
60
+ rubyforge_project: moonshine
61
+ rubygems_version: 1.3.1
62
+ signing_key:
63
+ specification_version: 2
64
+ summary: Facter wrapper library
65
+ test_files: []
66
+