automate-it 0.9.0

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.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.hgignore +10 -0
  4. data/.loadpath +5 -0
  5. data/.project +17 -0
  6. data/CHANGES.txt +314 -0
  7. data/Hoe.rake +40 -0
  8. data/Manifest.txt +164 -0
  9. data/README.txt +40 -0
  10. data/Rakefile +256 -0
  11. data/TESTING.txt +57 -0
  12. data/TODO.txt +50 -0
  13. data/TUTORIAL.txt +391 -0
  14. data/automate-it.gemspec +25 -0
  15. data/bin/ai +3 -0
  16. data/bin/aifield +75 -0
  17. data/bin/aissh +93 -0
  18. data/bin/aitag +134 -0
  19. data/bin/automateit +133 -0
  20. data/docs/friendly_errors.txt +50 -0
  21. data/docs/previews.txt +86 -0
  22. data/examples/basic/Rakefile +26 -0
  23. data/examples/basic/config/automateit_env.rb +16 -0
  24. data/examples/basic/config/fields.yml +3 -0
  25. data/examples/basic/config/tags.yml +7 -0
  26. data/examples/basic/dist/README.txt +9 -0
  27. data/examples/basic/dist/myapp_server.erb +30 -0
  28. data/examples/basic/install.log +15 -0
  29. data/examples/basic/lib/README.txt +10 -0
  30. data/examples/basic/recipes/README.txt +4 -0
  31. data/examples/basic/recipes/install.rb +61 -0
  32. data/examples/basic/recipes/uninstall.rb +6 -0
  33. data/gpl.txt +674 -0
  34. data/helpers/cpan_wrapper.pl +220 -0
  35. data/helpers/which.cmd +7 -0
  36. data/lib/automateit.rb +55 -0
  37. data/lib/automateit/account_manager.rb +114 -0
  38. data/lib/automateit/account_manager/base.rb +138 -0
  39. data/lib/automateit/account_manager/etc.rb +128 -0
  40. data/lib/automateit/account_manager/nscd.rb +33 -0
  41. data/lib/automateit/account_manager/passwd_expect.rb +40 -0
  42. data/lib/automateit/account_manager/passwd_pty.rb +69 -0
  43. data/lib/automateit/account_manager/posix.rb +138 -0
  44. data/lib/automateit/address_manager.rb +88 -0
  45. data/lib/automateit/address_manager/base.rb +171 -0
  46. data/lib/automateit/address_manager/bsd.rb +28 -0
  47. data/lib/automateit/address_manager/freebsd.rb +59 -0
  48. data/lib/automateit/address_manager/linux.rb +42 -0
  49. data/lib/automateit/address_manager/openbsd.rb +66 -0
  50. data/lib/automateit/address_manager/portable.rb +37 -0
  51. data/lib/automateit/address_manager/sunos.rb +34 -0
  52. data/lib/automateit/cli.rb +85 -0
  53. data/lib/automateit/common.rb +65 -0
  54. data/lib/automateit/constants.rb +35 -0
  55. data/lib/automateit/download_manager.rb +48 -0
  56. data/lib/automateit/edit_manager.rb +321 -0
  57. data/lib/automateit/error.rb +10 -0
  58. data/lib/automateit/field_manager.rb +103 -0
  59. data/lib/automateit/interpreter.rb +631 -0
  60. data/lib/automateit/package_manager.rb +257 -0
  61. data/lib/automateit/package_manager/apt.rb +27 -0
  62. data/lib/automateit/package_manager/cpan.rb +101 -0
  63. data/lib/automateit/package_manager/dpkg.rb +54 -0
  64. data/lib/automateit/package_manager/egg.rb +64 -0
  65. data/lib/automateit/package_manager/gem.rb +201 -0
  66. data/lib/automateit/package_manager/pear.rb +95 -0
  67. data/lib/automateit/package_manager/pecl.rb +80 -0
  68. data/lib/automateit/package_manager/portage.rb +69 -0
  69. data/lib/automateit/package_manager/yum.rb +65 -0
  70. data/lib/automateit/platform_manager.rb +49 -0
  71. data/lib/automateit/platform_manager/darwin.rb +30 -0
  72. data/lib/automateit/platform_manager/debian.rb +26 -0
  73. data/lib/automateit/platform_manager/freebsd.rb +29 -0
  74. data/lib/automateit/platform_manager/gentoo.rb +26 -0
  75. data/lib/automateit/platform_manager/lsb.rb +44 -0
  76. data/lib/automateit/platform_manager/openbsd.rb +28 -0
  77. data/lib/automateit/platform_manager/struct.rb +80 -0
  78. data/lib/automateit/platform_manager/sunos.rb +39 -0
  79. data/lib/automateit/platform_manager/uname.rb +29 -0
  80. data/lib/automateit/platform_manager/windows.rb +40 -0
  81. data/lib/automateit/plugin.rb +7 -0
  82. data/lib/automateit/plugin/base.rb +32 -0
  83. data/lib/automateit/plugin/driver.rb +256 -0
  84. data/lib/automateit/plugin/manager.rb +224 -0
  85. data/lib/automateit/project.rb +493 -0
  86. data/lib/automateit/root.rb +17 -0
  87. data/lib/automateit/service_manager.rb +93 -0
  88. data/lib/automateit/service_manager/chkconfig.rb +39 -0
  89. data/lib/automateit/service_manager/rc_update.rb +37 -0
  90. data/lib/automateit/service_manager/sysv.rb +139 -0
  91. data/lib/automateit/service_manager/update_rcd.rb +35 -0
  92. data/lib/automateit/shell_manager.rb +316 -0
  93. data/lib/automateit/shell_manager/base_link.rb +67 -0
  94. data/lib/automateit/shell_manager/link.rb +24 -0
  95. data/lib/automateit/shell_manager/portable.rb +523 -0
  96. data/lib/automateit/shell_manager/symlink.rb +32 -0
  97. data/lib/automateit/shell_manager/which_base.rb +30 -0
  98. data/lib/automateit/shell_manager/which_unix.rb +16 -0
  99. data/lib/automateit/shell_manager/which_windows.rb +20 -0
  100. data/lib/automateit/tag_manager.rb +127 -0
  101. data/lib/automateit/tag_manager/struct.rb +121 -0
  102. data/lib/automateit/tag_manager/tag_parser.rb +93 -0
  103. data/lib/automateit/tag_manager/yaml.rb +29 -0
  104. data/lib/automateit/template_manager.rb +56 -0
  105. data/lib/automateit/template_manager/base.rb +181 -0
  106. data/lib/automateit/template_manager/erb.rb +17 -0
  107. data/lib/ext/metaclass.rb +17 -0
  108. data/lib/ext/object.rb +18 -0
  109. data/lib/ext/shell_escape.rb +7 -0
  110. data/lib/hashcache.rb +22 -0
  111. data/lib/helpful_erb.rb +63 -0
  112. data/lib/inactive_support.rb +53 -0
  113. data/lib/inactive_support/basic_object.rb +6 -0
  114. data/lib/inactive_support/clean_logger.rb +127 -0
  115. data/lib/inactive_support/core_ext/array/extract_options.rb +19 -0
  116. data/lib/inactive_support/core_ext/blank.rb +50 -0
  117. data/lib/inactive_support/core_ext/class/attribute_accessors.rb +48 -0
  118. data/lib/inactive_support/core_ext/class/inheritable_attributes.rb +140 -0
  119. data/lib/inactive_support/core_ext/enumerable.rb +63 -0
  120. data/lib/inactive_support/core_ext/hash/keys.rb +54 -0
  121. data/lib/inactive_support/core_ext/module/aliasing.rb +70 -0
  122. data/lib/inactive_support/core_ext/numeric/time.rb +91 -0
  123. data/lib/inactive_support/core_ext/string/inflections.rb +153 -0
  124. data/lib/inactive_support/core_ext/symbol.rb +14 -0
  125. data/lib/inactive_support/core_ext/time/conversions.rb +96 -0
  126. data/lib/inactive_support/duration.rb +96 -0
  127. data/lib/inactive_support/inflections.rb +53 -0
  128. data/lib/inactive_support/inflector.rb +282 -0
  129. data/lib/nested_error.rb +33 -0
  130. data/lib/nitpick.rb +33 -0
  131. data/lib/queued_logger.rb +68 -0
  132. data/lib/tempster.rb +250 -0
  133. data/misc/index_gem_repository.rb +304 -0
  134. data/misc/setup_egg.rb +12 -0
  135. data/misc/setup_gem_dependencies.sh +6 -0
  136. data/misc/setup_rubygems.sh +21 -0
  137. metadata +279 -0
@@ -0,0 +1,65 @@
1
+ # == PackageManager::YUM
2
+ #
3
+ # The YUM driver for the PackageManager provides a way to manage software
4
+ # packages on Red Hat-style systems using +yum+ and +rpm+.
5
+ class AutomateIt::PackageManager::YUM < AutomateIt::PackageManager::BaseDriver
6
+ depends_on :programs => %w(yum rpm)
7
+
8
+ def suitability(method, *args) # :nodoc:
9
+ return available? ? 1 : 0
10
+ end
11
+
12
+ # See AutomateIt::PackageManager#installed?
13
+ def installed?(*packages)
14
+ return _installed_helper?(*packages) do |list, opts|
15
+ ### rpm -q --nosignature --nodigest --qf "%{NAME} # %{VERSION} # %{RELEASE}\n" httpd nomarch foo
16
+ cmd = 'rpm -q --nosignature --nodigest --qf "%{NAME} # %{VERSION} # %{RELEASE}\n"'
17
+ list.each{|package| cmd << " "+package}
18
+ cmd << " 2>&1" # missing packages are listed on STDERR
19
+
20
+ log.debug(PEXEC+cmd)
21
+ data = `#{cmd}`
22
+ matches = data.scan(/^(.+) # (.+) # .+$/)
23
+ available = matches.inject([]) do |sum, match|
24
+ package, status = match
25
+ sum << package
26
+ sum
27
+ end
28
+ available
29
+ end
30
+ end
31
+
32
+ # See AutomateIt::PackageManager#not_installed?
33
+ def not_installed?(*packages)
34
+ _not_installed_helper?(*packages)
35
+ end
36
+
37
+ # See AutomateIt::PackageManager#install
38
+ def install(*packages)
39
+ return _install_helper(*packages) do |list, opts|
40
+ # yum options:
41
+ # -y : yes to queries
42
+ # -d 0 : no debugging info
43
+ # -e 0 : show only fatal errors
44
+ # -C : don't download headers
45
+ cmd = "yum -y -d 0 -e 0"
46
+ cmd << " -C" if opts[:cache] == true
47
+ cmd << " install "+list.join(" ")+" < /dev/null"
48
+ cmd << " > /dev/null" if opts[:quiet]
49
+ cmd << " 2>&1"
50
+
51
+ interpreter.sh(cmd)
52
+ end
53
+ end
54
+
55
+ # See AutomateIt::PackageManager#uninstall
56
+ def uninstall(*packages)
57
+ return _uninstall_helper(*packages) do |list, opts|
58
+ cmd = "rpm --erase --quiet "+list.join(" ")+" < /dev/null"
59
+ cmd << " > /dev/null" if opts[:quiet]
60
+ cmd << " 2>&1"
61
+
62
+ interpreter.sh(cmd)
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,49 @@
1
+ # == PlatformManager
2
+ #
3
+ # The PlatformManager provides a way to query platform identifiers, such as
4
+ # the operating system distribution's version.
5
+ class AutomateIt::PlatformManager < AutomateIt::Plugin::Manager
6
+ # Query the +search+ field. The +search+ can either be a key or a set of
7
+ # keys separated by "#" signs.
8
+ #
9
+ # Examples:
10
+ # query(:os) # => "linux"
11
+ # query("arch") # => "i686"
12
+ # query("os#arch") # => "linux_i686"
13
+ # query("os#arch#distro#release") # => "linux_i686_ubuntu_6.06"
14
+ #
15
+ # Fields that may be provided by drivers:
16
+ # * :arch -- Hardware architecture, e.g., "i686"
17
+ # * :os -- Operating system, e.g., "linux"
18
+ # * :distro -- Operating system distribution, e.g., "ubuntu"
19
+ # * :release -- Operating system distribution release, e.g., "6.06"
20
+ def query(search) dispatch(search) end
21
+
22
+ # Is this a single-vendor operating system? E.g., Windows is, while Linux
23
+ # isn't. This method helps the TagManager determine how to name tags. A
24
+ # single-vendor product uses the "os#release" format (e.g., "windows_xp"),
25
+ # while a multi-vendor product uses a "distro#release" format
26
+ # ("ubuntu_6.06").
27
+ def single_vendor?() dispatch() end
28
+
29
+ # Return an array of tags for this platform.
30
+ def tags() dispatch() end
31
+ end
32
+
33
+ # == PlatformManager::BaseDriver
34
+ #
35
+ # Base class for all PlatformManager drivers.
36
+ class AutomateIt::PlatformManager::BaseDriver < AutomateIt::Plugin::Driver
37
+ end
38
+
39
+ # Drivers
40
+ require 'automateit/platform_manager/struct'
41
+ require 'automateit/platform_manager/uname'
42
+ require 'automateit/platform_manager/lsb'
43
+ require 'automateit/platform_manager/debian'
44
+ require 'automateit/platform_manager/gentoo'
45
+ require 'automateit/platform_manager/darwin'
46
+ require 'automateit/platform_manager/windows'
47
+ require 'automateit/platform_manager/freebsd'
48
+ require 'automateit/platform_manager/sunos'
49
+ require 'automateit/platform_manager/openbsd'
@@ -0,0 +1,30 @@
1
+ # == PlatformManager::Darwin
2
+ #
3
+ # A PlatformManager driver for Apple's Darwin.
4
+ class AutomateIt::PlatformManager::Darwin < AutomateIt::PlatformManager::Struct
5
+ depends_on :files => ["/usr/sbin/scutil"], :programs => ["which", "uname"]
6
+
7
+ def suitability(method, *args) # :nodoc:
8
+ # Must be higher than PlatformManager::Uname
9
+ return available? ? 3 : 0
10
+ end
11
+
12
+ def _prepare
13
+ return if @struct[:release]
14
+ @struct[:os] = "darwin"
15
+ @struct[:arch] = `uname -p`.strip.downcase
16
+ @struct[:distro] = "apple"
17
+ @struct[:release] = `uname -r`.strip.downcase
18
+ @struct
19
+ end
20
+ private :_prepare
21
+
22
+ def query(search)
23
+ _prepare
24
+ super(search)
25
+ end
26
+
27
+ def single_vendor?
28
+ return true
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # == PlatformManager::Debian
2
+ #
3
+ # A PlatformManager driver for Debian Linux.
4
+ class AutomateIt::PlatformManager::Debian < AutomateIt::PlatformManager::Uname
5
+ VERSION_FILE = "/etc/debian_version"
6
+
7
+ depends_on :files => [VERSION_FILE]
8
+
9
+ def suitability(method, *args) # :nodoc:
10
+ # Must be higher than PlatformManager::Struct
11
+ return available? ? 3 : 0
12
+ end
13
+
14
+ def _prepare
15
+ return if @struct[:distro]
16
+ @struct[:distro] = "debian"
17
+ @struct[:release] = File.read(VERSION_FILE).strip
18
+ @struct
19
+ end
20
+ private :_prepare
21
+
22
+ def query(search)
23
+ _prepare
24
+ super(search)
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ # == PlatformManager::FreeBSD
2
+ #
3
+ # A PlatformManager driver for FreeBSD.
4
+ class AutomateIt::PlatformManager::FreeBSD < AutomateIt::PlatformManager::Uname
5
+ def self.token
6
+ :freebsd
7
+ end
8
+
9
+ depends_on :files => %w(/etc/portsnap.conf /etc/rc.conf)
10
+
11
+ def suitability(method, *args) # :nodoc:
12
+ # Must be higher than PlatformManager::Struct
13
+ return available? ? 3 : 0
14
+ end
15
+
16
+ def _prepare
17
+ return if @struct[:distro]
18
+ @struct[:distro] = "freebsd"
19
+ @struct[:release] = `uname -r`.strip.match(/^([\d\.]+)-/)[1]
20
+ @struct
21
+ end
22
+ private :_prepare
23
+
24
+ def query(search)
25
+ _prepare
26
+ super(search)
27
+ end
28
+ end
29
+
@@ -0,0 +1,26 @@
1
+ # == PlatformManager::Gentoo
2
+ #
3
+ # A PlatformManager driver for Gentoo Linux.
4
+ class AutomateIt::PlatformManager::Gentoo < AutomateIt::PlatformManager::Uname
5
+ GENTOO_RELEASE = "/etc/gentoo-release"
6
+
7
+ depends_on :files => [GENTOO_RELEASE]
8
+
9
+ def suitability(method, *args) # :nodoc:
10
+ # Must be higher than PlatformManager::Struct
11
+ return available? ? 3 : 0
12
+ end
13
+
14
+ def _prepare
15
+ return if @struct[:distro]
16
+ @struct[:distro] = "gentoo"
17
+ @struct[:release] = File.read(GENTOO_RELEASE).strip.match(/\s([\d\.]+)$/)[1]
18
+ @struct
19
+ end
20
+ private :_prepare
21
+
22
+ def query(search)
23
+ _prepare
24
+ super(search)
25
+ end
26
+ end
@@ -0,0 +1,44 @@
1
+ # == PlatformManager::LSB
2
+ #
3
+ # A PlatformManager driver for LSB (Linux Standards Base) systems. The
4
+ # platform doesn't actually need to be Linux, but simply has to provide an
5
+ # <tt>lsb_release</tt> command.
6
+ class AutomateIt::PlatformManager::LSB < AutomateIt::PlatformManager::Uname
7
+ LSB_RELEASE = "lsb_release"
8
+
9
+ depends_on :programs => [LSB_RELEASE]
10
+
11
+ def suitability(method, *args) # :nodoc:
12
+ # Level must be greater than Uname and Debian
13
+ return available? ? 4 : 0
14
+ end
15
+
16
+ def setup(opts={}) # :nodoc:
17
+ super(opts) # Rely on Uname to set :os and :arch
18
+ @struct[:distro] ||= @@struct_cache[:distro]
19
+ @struct[:release] ||= @@struct_cache[:release]
20
+ if available?
21
+ unless @struct[:distro] and @struct[:release]
22
+ hash = _parse_lsb_release_data(_read_lsb_release_data)
23
+ @struct[:distro] ||= @@struct_cache[:distro] ||= hash["Distributor ID"].to_s.downcase
24
+ @struct[:release] ||= @@struct_cache[:release] ||= hash["Release"].to_s.downcase
25
+ end
26
+ end
27
+ end
28
+
29
+ protected
30
+
31
+ # Returns the LSB data for this platform's Distributor and ID
32
+ def _read_lsb_release_data
33
+ # TODO Consider parsing files directly to avoid the overhead of this command.
34
+ #
35
+ # Do NOT use 'lsb_release -a' because this takes a few seconds. Telling
36
+ # 'lsb_release' which fields we want makes it much faster.
37
+ `"#{LSB_RELEASE}" --release --id`
38
+ end
39
+
40
+ # Parses LSB data into a hash.
41
+ def _parse_lsb_release_data(data)
42
+ data.scan(/^([^:]+):\s+([^\n]+)/).inject({}){|s,v| s[v.first] = v.last; s}
43
+ end
44
+ end
@@ -0,0 +1,28 @@
1
+ # == PlatformManager::OpenBSD
2
+ #
3
+ # A PlatformManager driver for OpenBSD.
4
+ class AutomateIt::PlatformManager::OpenBSD < AutomateIt::PlatformManager::Uname
5
+ def self.token
6
+ :openbsd
7
+ end
8
+
9
+ depends_on :files => %w(/obsd /bsd /bsd.rd), :directories => %w(/altroot /stand)
10
+
11
+ def suitability(method, *args) # :nodoc:
12
+ # Must be higher than PlatformManager::Struct
13
+ return available? ? 3 : 0
14
+ end
15
+
16
+ def _prepare
17
+ return if @struct[:distro]
18
+ @struct[:distro] = `uname -s`.strip.downcase
19
+ @struct[:release] = `uname -r`.strip.downcase
20
+ @struct
21
+ end
22
+ private :_prepare
23
+
24
+ def query(search)
25
+ _prepare
26
+ super(search)
27
+ end
28
+ end
@@ -0,0 +1,80 @@
1
+ # == PlatformManager::Struct
2
+ #
3
+ # A simple PlatformManager driver that queries a hash for results. Although
4
+ # not useful on its own, it's inherited by other drivers that provide
5
+ # platform-specific methods to query the system.
6
+ class AutomateIt::PlatformManager::Struct < AutomateIt::PlatformManager::BaseDriver
7
+ depends_on :nothing
8
+
9
+ # Hash mapping of keys that have many common names, e.g., "release" and "version"
10
+ attr_accessor :key_aliases
11
+
12
+ def suitability(method, *args) # :nodoc:
13
+ return 1
14
+ end
15
+
16
+ # Options:
17
+ # * :struct -- The hash to use for queries.
18
+ def setup(opts={})
19
+ super(opts)
20
+
21
+ @@struct_cache ||= {}
22
+
23
+ if opts[:struct]
24
+ @struct = opts[:struct]
25
+ else
26
+ @struct ||= {}
27
+ end
28
+
29
+ # Generate bi-directional map
30
+ @key_aliases ||= @@key_aliases ||= {
31
+ :version => :release,
32
+ }.inject({}){|s,v| s[v[0]] = v[1]; s[v[1]] = v[0]; s}
33
+ end
34
+
35
+ # See PlatformManager#query
36
+ def query(search)
37
+ result = ""
38
+ for key in search.to_s.split(/#/)
39
+ result << "_" unless result.empty?
40
+ result << _query_key(key)
41
+ end
42
+ result
43
+ end
44
+
45
+ def _query_key(key)
46
+ key = key.to_sym
47
+ unless @struct.has_key?(key)
48
+ key_alias = key_aliases[key]
49
+ if @struct.has_key?(key_alias)
50
+ key = key_alias
51
+ else
52
+ raise IndexError.new("platform doesn't provide key: #{key}")
53
+ end
54
+ end
55
+ return @struct[key]
56
+ end
57
+ private :_query_key
58
+
59
+ # See PlatformManager#single_vendor?
60
+ def single_vendor?
61
+ return false
62
+ end
63
+
64
+ # See PlatformManager#tags
65
+ def tags
66
+ results = []
67
+ for key in %w(os arch distro os#arch)
68
+ results << query(key) rescue IndexError
69
+ end
70
+
71
+ release_query = \
72
+ if single_vendor?
73
+ "os#release" # E.g. windows_xp
74
+ else
75
+ "distro#release" # E.g. ubuntu_6.06
76
+ end
77
+ results << query(release_query) rescue IndexError
78
+ return results
79
+ end
80
+ end
@@ -0,0 +1,39 @@
1
+ # == PlatformManager::SunOS
2
+ #
3
+ # A PlatformManager driver for SunOS.
4
+ class AutomateIt::PlatformManager::SunOS < AutomateIt::PlatformManager::Uname
5
+ def self.token
6
+ :sunos
7
+ end
8
+
9
+ depends_on \
10
+ :programs => %w(uname),
11
+ :callbacks => [lambda {
12
+ begin
13
+ not `uname -s`.match(/SunOS/i).nil?
14
+ rescue
15
+ false
16
+ end
17
+ }]
18
+
19
+ def suitability(method, *args) # :nodoc:
20
+ # Must be higher than PlatformManager::Struct and Uname
21
+ return available? ? 3 : 0
22
+ end
23
+
24
+ def _prepare
25
+ return if @struct[:release]
26
+ @struct[:distro] = "sun"
27
+ @struct[:release] = `uname -r`.strip.downcase
28
+ @struct
29
+ end
30
+
31
+ def query(search)
32
+ _prepare
33
+ super(search)
34
+ end
35
+
36
+ def single_vendor?
37
+ return true
38
+ end
39
+ end
@@ -0,0 +1,29 @@
1
+ # == PlatformManager::Uname
2
+ #
3
+ # A PlatformManager driver that uses the Unix +uname+ command to provide
4
+ # basic information about the platform.
5
+ class AutomateIt::PlatformManager::Uname < AutomateIt::PlatformManager::Struct
6
+ depends_on :programs => %w(uname)
7
+
8
+ def suitability(method, *args) # :nodoc:
9
+ # Level must be greater than Struct's
10
+ return available? ? 2 : 0
11
+ end
12
+
13
+ def setup(opts={}) # :nodoc:
14
+ super(opts)
15
+ if available?
16
+ @struct[:os] ||= @@struct_cache[:os] ||= `uname -s`.chomp.downcase
17
+ @struct[:arch] ||= @@struct_cache[:arch] ||= `uname -m`.chomp.downcase
18
+ =begin
19
+ # This method is 20% faster, but is it less portable because of the combined calls?
20
+ @struct[:os] and @struct[:arch] or begin
21
+ output = `uname -s -m`.chomp.downcase
22
+ os, arch = output.split(/\s+/)
23
+ @struct[:os] = @@struct_cache[:os] = os
24
+ @struct[:arch] = @@struct_cache[:arch] = arch
25
+ end
26
+ =end
27
+ end
28
+ end
29
+ end