automateit 0.70923
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +1 -0
- data/CHANGES.txt +100 -0
- data/Hoe.rake +35 -0
- data/Manifest.txt +111 -0
- data/README.txt +44 -0
- data/Rakefile +284 -0
- data/TESTING.txt +57 -0
- data/TODO.txt +26 -0
- data/TUTORIAL.txt +390 -0
- data/bin/ai +3 -0
- data/bin/aifield +82 -0
- data/bin/aitag +128 -0
- data/bin/automateit +117 -0
- data/docs/friendly_errors.txt +50 -0
- data/docs/previews.txt +86 -0
- data/env.sh +4 -0
- data/examples/basic/Rakefile +26 -0
- data/examples/basic/config/automateit_env.rb +16 -0
- data/examples/basic/config/fields.yml +3 -0
- data/examples/basic/config/tags.yml +13 -0
- data/examples/basic/dist/README.txt +9 -0
- data/examples/basic/dist/myapp_server.erb +30 -0
- data/examples/basic/install.log +15 -0
- data/examples/basic/lib/README.txt +10 -0
- data/examples/basic/recipes/README.txt +4 -0
- data/examples/basic/recipes/install.rb +53 -0
- data/examples/basic/recipes/uninstall.rb +6 -0
- data/gpl.txt +674 -0
- data/lib/automateit.rb +66 -0
- data/lib/automateit/account_manager.rb +106 -0
- data/lib/automateit/account_manager/linux.rb +171 -0
- data/lib/automateit/account_manager/passwd.rb +69 -0
- data/lib/automateit/account_manager/portable.rb +136 -0
- data/lib/automateit/address_manager.rb +165 -0
- data/lib/automateit/address_manager/linux.rb +80 -0
- data/lib/automateit/address_manager/portable.rb +37 -0
- data/lib/automateit/cli.rb +80 -0
- data/lib/automateit/common.rb +65 -0
- data/lib/automateit/constants.rb +33 -0
- data/lib/automateit/edit_manager.rb +292 -0
- data/lib/automateit/error.rb +10 -0
- data/lib/automateit/field_manager.rb +103 -0
- data/lib/automateit/interpreter.rb +641 -0
- data/lib/automateit/package_manager.rb +242 -0
- data/lib/automateit/package_manager/apt.rb +63 -0
- data/lib/automateit/package_manager/egg.rb +64 -0
- data/lib/automateit/package_manager/gem.rb +179 -0
- data/lib/automateit/package_manager/portage.rb +69 -0
- data/lib/automateit/package_manager/yum.rb +65 -0
- data/lib/automateit/platform_manager.rb +47 -0
- data/lib/automateit/platform_manager/darwin.rb +30 -0
- data/lib/automateit/platform_manager/debian.rb +26 -0
- data/lib/automateit/platform_manager/freebsd.rb +25 -0
- data/lib/automateit/platform_manager/gentoo.rb +26 -0
- data/lib/automateit/platform_manager/lsb.rb +40 -0
- data/lib/automateit/platform_manager/struct.rb +78 -0
- data/lib/automateit/platform_manager/uname.rb +29 -0
- data/lib/automateit/platform_manager/windows.rb +33 -0
- data/lib/automateit/plugin.rb +7 -0
- data/lib/automateit/plugin/base.rb +32 -0
- data/lib/automateit/plugin/driver.rb +218 -0
- data/lib/automateit/plugin/manager.rb +232 -0
- data/lib/automateit/project.rb +460 -0
- data/lib/automateit/root.rb +14 -0
- data/lib/automateit/service_manager.rb +79 -0
- data/lib/automateit/service_manager/chkconfig.rb +39 -0
- data/lib/automateit/service_manager/rc_update.rb +37 -0
- data/lib/automateit/service_manager/sysv.rb +126 -0
- data/lib/automateit/service_manager/update_rcd.rb +35 -0
- data/lib/automateit/shell_manager.rb +261 -0
- data/lib/automateit/shell_manager/base_link.rb +67 -0
- data/lib/automateit/shell_manager/link.rb +24 -0
- data/lib/automateit/shell_manager/portable.rb +421 -0
- data/lib/automateit/shell_manager/symlink.rb +32 -0
- data/lib/automateit/shell_manager/which.rb +25 -0
- data/lib/automateit/tag_manager.rb +63 -0
- data/lib/automateit/tag_manager/struct.rb +101 -0
- data/lib/automateit/tag_manager/tag_parser.rb +91 -0
- data/lib/automateit/tag_manager/yaml.rb +29 -0
- data/lib/automateit/template_manager.rb +55 -0
- data/lib/automateit/template_manager/base.rb +172 -0
- data/lib/automateit/template_manager/erb.rb +17 -0
- data/lib/ext/metaclass.rb +17 -0
- data/lib/ext/object.rb +18 -0
- data/lib/hashcache.rb +22 -0
- data/lib/helpful_erb.rb +63 -0
- data/lib/nested_error.rb +33 -0
- data/lib/queued_logger.rb +68 -0
- data/lib/tempster.rb +239 -0
- data/misc/index_gem_repository.rb +303 -0
- data/misc/setup_egg.rb +12 -0
- data/misc/setup_gem_dependencies.sh +7 -0
- data/misc/setup_rubygems.sh +21 -0
- data/misc/which.cmd +6 -0
- data/spec/extras/automateit_service_sysv_test +50 -0
- data/spec/extras/scratch.rb +15 -0
- data/spec/extras/simple_recipe.rb +8 -0
- data/spec/integration/account_manager_spec.rb +218 -0
- data/spec/integration/address_manager_linux_spec.rb +119 -0
- data/spec/integration/address_manager_portable_spec.rb +30 -0
- data/spec/integration/cli_spec.rb +215 -0
- data/spec/integration/examples_spec.rb +54 -0
- data/spec/integration/examples_spec_editor.rb +71 -0
- data/spec/integration/package_manager_spec.rb +104 -0
- data/spec/integration/platform_manager_spec.rb +69 -0
- data/spec/integration/service_manager_sysv_spec.rb +115 -0
- data/spec/integration/shell_manager_spec.rb +471 -0
- data/spec/integration/template_manager_erb_spec.rb +31 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/unit/edit_manager_spec.rb +162 -0
- data/spec/unit/field_manager_spec.rb +79 -0
- data/spec/unit/hashcache_spec.rb +28 -0
- data/spec/unit/interpreter_spec.rb +98 -0
- data/spec/unit/platform_manager_spec.rb +44 -0
- data/spec/unit/plugins_spec.rb +253 -0
- data/spec/unit/tag_manager_spec.rb +189 -0
- data/spec/unit/template_manager_erb_spec.rb +137 -0
- metadata +249 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
# == PackageManager::Portage
|
2
|
+
#
|
3
|
+
# The Portage driver for the PackageManager provides a way to manage software
|
4
|
+
# packages on Gentoo systems using.
|
5
|
+
class AutomateIt::PackageManager::Portage < AutomateIt::PackageManager::BaseDriver
|
6
|
+
depends_on :programs => %w(emerge)
|
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
|
+
# Emerge throws an error when called with invalid packages, so it's
|
16
|
+
# necessary to find the invalid packages and re-run the command without
|
17
|
+
# them to find out what is actually installed.
|
18
|
+
missing = []
|
19
|
+
available = []
|
20
|
+
while true
|
21
|
+
cmd = "emerge --color n --nospinner --tree --usepkg --quiet --pretend " + \
|
22
|
+
(list-missing).join(' ') + " < /dev/null 2>&1"
|
23
|
+
log.debug(PEXEC+cmd)
|
24
|
+
output = `#{cmd}`
|
25
|
+
|
26
|
+
if output.match(/no ebuilds to satisfy "(.+)"/)
|
27
|
+
invalid = $1
|
28
|
+
log.debug(PNOTE+"PackageManager::Portage.installed? skipping invalid package '#{invalid}'")
|
29
|
+
missing << invalid
|
30
|
+
break if (list-missing).size.zero?
|
31
|
+
else
|
32
|
+
matches = output.scan(%r{^\[\w+\s+R\s*\] .+/(\w+?)-.+$}).flatten
|
33
|
+
available = list & matches
|
34
|
+
break
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
available
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# See AutomateIt::PackageManager#not_installed?
|
43
|
+
def not_installed?(*packages)
|
44
|
+
return _not_installed_helper?(*packages)
|
45
|
+
end
|
46
|
+
|
47
|
+
# See AutomateIt::PackageManager#install
|
48
|
+
def install(*packages)
|
49
|
+
return _install_helper(*packages) do |list, opts|
|
50
|
+
cmd = "emerge --color n --nospinner --tree --usepkg --quiet #{list.join(' ')} < /dev/null"
|
51
|
+
cmd << " > /dev/null" if opts[:quiet]
|
52
|
+
cmd << " 2>&1"
|
53
|
+
|
54
|
+
interpreter.sh(cmd)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# See AutomateIt::PackageManager#uninstall
|
59
|
+
def uninstall(*packages)
|
60
|
+
return _uninstall_helper(*packages) do |list, opts|
|
61
|
+
cmd = "emerge --color n --nospinner --tree --unmerge --quiet #{list.join(' ')} < /dev/null"
|
62
|
+
cmd << " > /dev/null" if opts[:quiet]
|
63
|
+
cmd << " 2>&1"
|
64
|
+
|
65
|
+
interpreter.sh(cmd)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
@@ -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,47 @@
|
|
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'
|
@@ -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"]
|
6
|
+
|
7
|
+
def suitability(method, *args) # :nodoc:
|
8
|
+
# Must be higher than PlatformManager::Struct
|
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,25 @@
|
|
1
|
+
# == PlatformManager::FreeBSD
|
2
|
+
#
|
3
|
+
# A PlatformManager driver for FreeBSD.
|
4
|
+
class AutomateIt::PlatformManager::FreeBSD < AutomateIt::PlatformManager::Uname
|
5
|
+
depends_on :files => %w(/etc/portsnap.conf /etc/rc.conf)
|
6
|
+
|
7
|
+
def suitability(method, *args) # :nodoc:
|
8
|
+
# Must be higher than PlatformManager::Struct
|
9
|
+
return available? ? 3 : 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def _prepare
|
13
|
+
return if @struct[:distro]
|
14
|
+
@struct[:distro] = "freebsd"
|
15
|
+
@struct[:release] = `uname -r`.strip.match(/^([\d\.]+)-/)[1]
|
16
|
+
@struct
|
17
|
+
end
|
18
|
+
private :_prepare
|
19
|
+
|
20
|
+
def query(search)
|
21
|
+
_prepare
|
22
|
+
super(search)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -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,40 @@
|
|
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
|
+
data = _read_lsb_release_output # SLOW 0.2s
|
23
|
+
begin
|
24
|
+
yaml = YAML::load(data)
|
25
|
+
@struct[:distro] ||= @@struct_cache[:distro] ||= yaml["Distributor ID"].to_s.downcase
|
26
|
+
@struct[:release] ||= @@struct_cache[:release] ||= yaml["Release"].to_s.downcase
|
27
|
+
rescue NoMethodError, IndexError, ArgumentError => e
|
28
|
+
raise ArgumentError.new("invalid YAML output from '#{LSB_RELEASE}': #{data.inspect}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def _read_lsb_release_output
|
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
|
+
return `"#{LSB_RELEASE}" --release --id`.gsub(/\t/, " ")
|
38
|
+
end
|
39
|
+
private :_read_lsb_release_output
|
40
|
+
end
|
@@ -0,0 +1,78 @@
|
|
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 = @struct.values
|
67
|
+
results << query("os#arch") rescue IndexError
|
68
|
+
|
69
|
+
release_query = \
|
70
|
+
if single_vendor?
|
71
|
+
"os#release" # E.g. windows_xp
|
72
|
+
else
|
73
|
+
"distro#release" # E.g. ubuntu_6.06
|
74
|
+
end
|
75
|
+
results << query(release_query) rescue IndexError
|
76
|
+
return results
|
77
|
+
end
|
78
|
+
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
|