automateit 0.70923
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.
- 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
|