automate-it 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.hgignore +10 -0
- data/.loadpath +5 -0
- data/.project +17 -0
- data/CHANGES.txt +314 -0
- data/Hoe.rake +40 -0
- data/Manifest.txt +164 -0
- data/README.txt +40 -0
- data/Rakefile +256 -0
- data/TESTING.txt +57 -0
- data/TODO.txt +50 -0
- data/TUTORIAL.txt +391 -0
- data/automate-it.gemspec +25 -0
- data/bin/ai +3 -0
- data/bin/aifield +75 -0
- data/bin/aissh +93 -0
- data/bin/aitag +134 -0
- data/bin/automateit +133 -0
- data/docs/friendly_errors.txt +50 -0
- data/docs/previews.txt +86 -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 +7 -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 +61 -0
- data/examples/basic/recipes/uninstall.rb +6 -0
- data/gpl.txt +674 -0
- data/helpers/cpan_wrapper.pl +220 -0
- data/helpers/which.cmd +7 -0
- data/lib/automateit.rb +55 -0
- data/lib/automateit/account_manager.rb +114 -0
- data/lib/automateit/account_manager/base.rb +138 -0
- data/lib/automateit/account_manager/etc.rb +128 -0
- data/lib/automateit/account_manager/nscd.rb +33 -0
- data/lib/automateit/account_manager/passwd_expect.rb +40 -0
- data/lib/automateit/account_manager/passwd_pty.rb +69 -0
- data/lib/automateit/account_manager/posix.rb +138 -0
- data/lib/automateit/address_manager.rb +88 -0
- data/lib/automateit/address_manager/base.rb +171 -0
- data/lib/automateit/address_manager/bsd.rb +28 -0
- data/lib/automateit/address_manager/freebsd.rb +59 -0
- data/lib/automateit/address_manager/linux.rb +42 -0
- data/lib/automateit/address_manager/openbsd.rb +66 -0
- data/lib/automateit/address_manager/portable.rb +37 -0
- data/lib/automateit/address_manager/sunos.rb +34 -0
- data/lib/automateit/cli.rb +85 -0
- data/lib/automateit/common.rb +65 -0
- data/lib/automateit/constants.rb +35 -0
- data/lib/automateit/download_manager.rb +48 -0
- data/lib/automateit/edit_manager.rb +321 -0
- data/lib/automateit/error.rb +10 -0
- data/lib/automateit/field_manager.rb +103 -0
- data/lib/automateit/interpreter.rb +631 -0
- data/lib/automateit/package_manager.rb +257 -0
- data/lib/automateit/package_manager/apt.rb +27 -0
- data/lib/automateit/package_manager/cpan.rb +101 -0
- data/lib/automateit/package_manager/dpkg.rb +54 -0
- data/lib/automateit/package_manager/egg.rb +64 -0
- data/lib/automateit/package_manager/gem.rb +201 -0
- data/lib/automateit/package_manager/pear.rb +95 -0
- data/lib/automateit/package_manager/pecl.rb +80 -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 +49 -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 +29 -0
- data/lib/automateit/platform_manager/gentoo.rb +26 -0
- data/lib/automateit/platform_manager/lsb.rb +44 -0
- data/lib/automateit/platform_manager/openbsd.rb +28 -0
- data/lib/automateit/platform_manager/struct.rb +80 -0
- data/lib/automateit/platform_manager/sunos.rb +39 -0
- data/lib/automateit/platform_manager/uname.rb +29 -0
- data/lib/automateit/platform_manager/windows.rb +40 -0
- data/lib/automateit/plugin.rb +7 -0
- data/lib/automateit/plugin/base.rb +32 -0
- data/lib/automateit/plugin/driver.rb +256 -0
- data/lib/automateit/plugin/manager.rb +224 -0
- data/lib/automateit/project.rb +493 -0
- data/lib/automateit/root.rb +17 -0
- data/lib/automateit/service_manager.rb +93 -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 +139 -0
- data/lib/automateit/service_manager/update_rcd.rb +35 -0
- data/lib/automateit/shell_manager.rb +316 -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 +523 -0
- data/lib/automateit/shell_manager/symlink.rb +32 -0
- data/lib/automateit/shell_manager/which_base.rb +30 -0
- data/lib/automateit/shell_manager/which_unix.rb +16 -0
- data/lib/automateit/shell_manager/which_windows.rb +20 -0
- data/lib/automateit/tag_manager.rb +127 -0
- data/lib/automateit/tag_manager/struct.rb +121 -0
- data/lib/automateit/tag_manager/tag_parser.rb +93 -0
- data/lib/automateit/tag_manager/yaml.rb +29 -0
- data/lib/automateit/template_manager.rb +56 -0
- data/lib/automateit/template_manager/base.rb +181 -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/ext/shell_escape.rb +7 -0
- data/lib/hashcache.rb +22 -0
- data/lib/helpful_erb.rb +63 -0
- data/lib/inactive_support.rb +53 -0
- data/lib/inactive_support/basic_object.rb +6 -0
- data/lib/inactive_support/clean_logger.rb +127 -0
- data/lib/inactive_support/core_ext/array/extract_options.rb +19 -0
- data/lib/inactive_support/core_ext/blank.rb +50 -0
- data/lib/inactive_support/core_ext/class/attribute_accessors.rb +48 -0
- data/lib/inactive_support/core_ext/class/inheritable_attributes.rb +140 -0
- data/lib/inactive_support/core_ext/enumerable.rb +63 -0
- data/lib/inactive_support/core_ext/hash/keys.rb +54 -0
- data/lib/inactive_support/core_ext/module/aliasing.rb +70 -0
- data/lib/inactive_support/core_ext/numeric/time.rb +91 -0
- data/lib/inactive_support/core_ext/string/inflections.rb +153 -0
- data/lib/inactive_support/core_ext/symbol.rb +14 -0
- data/lib/inactive_support/core_ext/time/conversions.rb +96 -0
- data/lib/inactive_support/duration.rb +96 -0
- data/lib/inactive_support/inflections.rb +53 -0
- data/lib/inactive_support/inflector.rb +282 -0
- data/lib/nested_error.rb +33 -0
- data/lib/nitpick.rb +33 -0
- data/lib/queued_logger.rb +68 -0
- data/lib/tempster.rb +250 -0
- data/misc/index_gem_repository.rb +304 -0
- data/misc/setup_egg.rb +12 -0
- data/misc/setup_gem_dependencies.sh +6 -0
- data/misc/setup_rubygems.sh +21 -0
- metadata +279 -0
@@ -0,0 +1,201 @@
|
|
1
|
+
# == PackageManager::Gem
|
2
|
+
#
|
3
|
+
# The Gem driver for the PackageManager provides a way to manage software
|
4
|
+
# packages for RubyGems using the +gem+ command.
|
5
|
+
#
|
6
|
+
# === Specifying version of gem to use
|
7
|
+
#
|
8
|
+
# You can specify the command to use with each call using the gem option, e.g., the "gem1.8" below:
|
9
|
+
#
|
10
|
+
# package_manager.install 'rails', :with => :gem, :gem => "gem1.8"
|
11
|
+
#
|
12
|
+
# Or set a default and all subsequent calls will use it:
|
13
|
+
#
|
14
|
+
# package_manager[:gem].setup(:gem => "gem1.8")
|
15
|
+
# package_manager.install 'rails', :with => :gem
|
16
|
+
class AutomateIt::PackageManager::Gem < AutomateIt::PackageManager::BaseDriver
|
17
|
+
attr_accessor :gem
|
18
|
+
|
19
|
+
# FIXME Can't tell which gem program is used until we can use #which, need a new paradigm for #available?
|
20
|
+
depends_on \
|
21
|
+
:libraries => %w(expect pty)
|
22
|
+
### :programs => %w(gem),
|
23
|
+
|
24
|
+
def setup(*args)
|
25
|
+
super(*args)
|
26
|
+
|
27
|
+
args, opts = args_and_opts(*args)
|
28
|
+
if opts[:gem]
|
29
|
+
@gem = opts[:gem]
|
30
|
+
else
|
31
|
+
@gem ||= %w(gem gem1.8 gem1.9).inject(nil){|s,v| s ? s : interpreter.which(v)}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def suitability(method, *args) # :nodoc:
|
36
|
+
# Never select GEM as the default driver
|
37
|
+
return 0
|
38
|
+
end
|
39
|
+
|
40
|
+
# See PackageManager#installed?
|
41
|
+
def installed?(*packages)
|
42
|
+
return _installed_helper?(*packages) do |list, opts|
|
43
|
+
gem = opts[:gem] || self.gem
|
44
|
+
cmd = "#{gem} list --local 2>&1"
|
45
|
+
|
46
|
+
log.debug(PEXEC+cmd)
|
47
|
+
data = `#{cmd}`
|
48
|
+
|
49
|
+
# Gem lists packages out of order, which screws up the
|
50
|
+
# install/uninstall sequence, so we need to put them back in the
|
51
|
+
# order that the user specified.
|
52
|
+
present = data.scan(/^([^\s\(]+)\s+\([^\)]+\)\s*$/).flatten
|
53
|
+
available = []
|
54
|
+
for package in list
|
55
|
+
available << package if present.include?(package)
|
56
|
+
end
|
57
|
+
available
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# See PackageManager#not_installed?
|
62
|
+
def not_installed?(*packages)
|
63
|
+
_not_installed_helper?(*packages)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Special options:
|
67
|
+
# * :docs -- If set to false, won't install rdoc or ri.
|
68
|
+
# * :source -- URL source to retrieve Gems from.
|
69
|
+
#
|
70
|
+
# See PackageManager#install
|
71
|
+
def install(*packages)
|
72
|
+
return _install_helper(*packages) do |list, opts|
|
73
|
+
gem = opts[:gem] || self.gem
|
74
|
+
|
75
|
+
# Why is the "gem" utility such a steaming pile of offal? Lameness include:
|
76
|
+
# - Requires interactive input to install a package, with no way to prevent this
|
77
|
+
# - Repeatedly updates indexes even when there's no reason to, and can't be told to stop
|
78
|
+
# - Doesn't cache packages, insists on downloading them again
|
79
|
+
# - Installs broken packages, often without giving any indication of failure
|
80
|
+
# - Installs broken packages and leaves you to deal with the jagged pieces
|
81
|
+
# - Sometimes fails through exit status, sometimes through output, but not both and not consistently
|
82
|
+
# - Lacks a proper "is this package installed?" feature
|
83
|
+
# - A nightmare to deal with if you want to install your own GEMHOME/GEMPATH
|
84
|
+
|
85
|
+
# Example of an invalid gem that'll cause the failure I'm trying to avoid below:
|
86
|
+
# package_manager.install("sys-cpu", :with => :gem)
|
87
|
+
|
88
|
+
# gem options:
|
89
|
+
# -y : Include dependencies,
|
90
|
+
# -E : use /usr/bin/env for installed executables; but only with >= 0.9.4
|
91
|
+
cmd = "#{gem} install -y"
|
92
|
+
cmd << " --no-ri" if opts[:ri] == false or opts[:docs] == false
|
93
|
+
cmd << " --no-rdoc" if opts[:rdoc] == false or opts[:docs] == false
|
94
|
+
cmd << " --source #{opts[:source]}" if opts[:source]
|
95
|
+
cmd << " "+list.join(" ")
|
96
|
+
cmd << " " << opts[:args] if opts[:args]
|
97
|
+
cmd << " 2>&1"
|
98
|
+
|
99
|
+
# XXX Try to warn the user that they won't see any output for a while
|
100
|
+
log.info(PNOTE+"Installing Gems, this will take a while...") if writing? and not opts[:quiet]
|
101
|
+
log.info(PEXEC+cmd)
|
102
|
+
return true if preview?
|
103
|
+
|
104
|
+
uninstall_needed = false
|
105
|
+
begin
|
106
|
+
require 'expect'
|
107
|
+
require 'open4'
|
108
|
+
exitstruct = Open4::popen4(cmd) do |pid, sin, sout, serr|
|
109
|
+
$expect_verbose = opts[:quiet] ? false : true
|
110
|
+
|
111
|
+
re_missing=/Could not find.+in any repository/m
|
112
|
+
re_select=/Select which gem to install.+>/m
|
113
|
+
re_failed=/Gem files will remain.+for inspection/m
|
114
|
+
re_refused=/Errno::ECONNREFUSED reading .+?\.gem/m
|
115
|
+
re_all=/#{re_missing}|#{re_select}|#{re_failed}|#{re_refused}/m
|
116
|
+
|
117
|
+
while true
|
118
|
+
begin
|
119
|
+
captureded = sout.expect(re_all)
|
120
|
+
rescue NoMethodError
|
121
|
+
log.debug(PNOTE+"Gem seems to be done")
|
122
|
+
break
|
123
|
+
end
|
124
|
+
### puts "Captureded %s" % captureded.inspect
|
125
|
+
captured = captureded.first
|
126
|
+
if captured.match(re_failed)
|
127
|
+
log.warn(PERROR+"Gem install failed mid-process")
|
128
|
+
uninstall_needed = true
|
129
|
+
break
|
130
|
+
elsif captured.match(re_refused)
|
131
|
+
log.warn(PERROR+"Gem install refused by server!\n#{captured}")
|
132
|
+
break
|
133
|
+
elsif captured.match(re_select)
|
134
|
+
choice = captured.match(/^ (\d+)\. .+?\(ruby\)\s*$/)[1]
|
135
|
+
log.info(PNOTE+"Guessing: #{choice}")
|
136
|
+
sin.puts(choice)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
rescue Errno::ENOENT => e
|
141
|
+
raise NotImplementedError.new("can't find gem command: #{e}")
|
142
|
+
end
|
143
|
+
|
144
|
+
if uninstall_needed or not exitstruct.exitstatus.zero?
|
145
|
+
log.error(PERROR+"Gem install failed, trying to uninstall broken pieces: #{list.inspect}")
|
146
|
+
uninstall(list, opts)
|
147
|
+
|
148
|
+
raise ArgumentError.new("Gem install failed because it's invalid, missing a dependency, or can't talk with Gem server: #{list.inspect}")
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# See PackageManager#uninstall
|
154
|
+
def uninstall(*packages)
|
155
|
+
return _uninstall_helper(*packages) do |list, opts|
|
156
|
+
gem = opts[:gem] || self.gem
|
157
|
+
|
158
|
+
# TODO PackageManager::gem#uninstall -- add logic to handle prompts during removal
|
159
|
+
=begin
|
160
|
+
# idiotic program MAY prompt you like this on uninstall:
|
161
|
+
|
162
|
+
Gem 0.9.4 generates prompts like this:
|
163
|
+
** gem uninstall -x mongrel < /dev/null 2>&1
|
164
|
+
|
165
|
+
You have requested to uninstall the gem:
|
166
|
+
mongrel-1.0.1
|
167
|
+
mongrel_cluster-1.0.2 depends on [mongrel (>= 1.0.1)]
|
168
|
+
If you remove this gems, one or more dependencies will not be met.
|
169
|
+
Continue with Uninstall? [Yn] Successfully uninstalled mongrel version 1.0.1
|
170
|
+
Removing mongrel_rails
|
171
|
+
|
172
|
+
#-----------------------------------------------------------------------
|
173
|
+
Gem 0.9.0 generates prompts like this:
|
174
|
+
** gem uninstall -x mongrel < /dev/null 2>&1
|
175
|
+
|
176
|
+
Select RubyGem to uninstall:
|
177
|
+
1. mongrel-1.0.1
|
178
|
+
2. mongrel_cluster-1.0.2
|
179
|
+
3. All versions
|
180
|
+
> 3
|
181
|
+
|
182
|
+
You have requested to uninstall the gem:
|
183
|
+
mongrel-1.0.1
|
184
|
+
mongrel_cluster-1.0.2 depends on [mongrel (>= 1.0.1)]
|
185
|
+
If you remove this gems, one or more dependencies will not be met.
|
186
|
+
Continue with Uninstall? [Yn] y
|
187
|
+
Successfully uninstalled mongrel version 1.0.1
|
188
|
+
Successfully uninstalled mongrel_cluster version 1.0.2
|
189
|
+
root@ubuntu:/mnt/satori/svnwork/automateit/src/examples/myapp_rails#
|
190
|
+
=end
|
191
|
+
for package in list
|
192
|
+
# gem options:
|
193
|
+
# -x : remove installed executables
|
194
|
+
cmd = "#{gem} uninstall -x #{package} < /dev/null"
|
195
|
+
cmd << " > /dev/null" if opts[:quiet]
|
196
|
+
cmd << " 2>&1"
|
197
|
+
interpreter.sh(cmd)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# == PackageManager::PEAR
|
2
|
+
#
|
3
|
+
# A PackageManager driver for PEAR (PHP Extension and Application Repository),
|
4
|
+
# manages software packages using the <tt>pear</tt> command.
|
5
|
+
#
|
6
|
+
# === Using specific channels
|
7
|
+
#
|
8
|
+
# To install a package from the default PEAR channel, just specify it's name,
|
9
|
+
# e.g. <tt>HTML_QuickForm</tt>.
|
10
|
+
#
|
11
|
+
# To install a package from another channel, you must specify the name prefixed
|
12
|
+
# with the channel's URL, e.g. <tt>pear.symfony-project.com/symfony</tt>, so
|
13
|
+
# that the channel can be automatically added as needed.
|
14
|
+
#
|
15
|
+
# *IMPORTANT*: DO NOT specify a remote channel's alias, e.g.
|
16
|
+
# <tt>symfony/symfony</tt>, because this provides no way to discover the
|
17
|
+
# channel.
|
18
|
+
class ::AutomateIt::PackageManager::PEAR < ::AutomateIt::PackageManager::BaseDriver
|
19
|
+
depends_on :programs => %w(pear)
|
20
|
+
|
21
|
+
def suitability(method, *args) # :nodoc:
|
22
|
+
# Never select as default driver
|
23
|
+
return 0
|
24
|
+
end
|
25
|
+
|
26
|
+
# Retrieve a hash containing all installed packages, indexed by package
|
27
|
+
# name. Each value is a hash containing values for :version and :state.
|
28
|
+
def get_installed_packages()
|
29
|
+
cmd = "pear list --allchannels 2>&1"
|
30
|
+
data = `#{cmd}`
|
31
|
+
installed_packages = {}
|
32
|
+
data.scan(/^([^(\s]+)\s+([^\s]+)\s+([^\s]+)$/) do |package, version, state|
|
33
|
+
next if version.upcase == 'VERSION'
|
34
|
+
installed_packages[package] = {:version => version, :state => state}
|
35
|
+
end
|
36
|
+
return installed_packages
|
37
|
+
end
|
38
|
+
protected :get_installed_packages
|
39
|
+
|
40
|
+
# See AutomateIt::PackageManager#installed?
|
41
|
+
def installed?(*packages)
|
42
|
+
return _installed_helper?(*packages) do |list, opts|
|
43
|
+
all_installed = get_installed_packages().keys.collect {|pkg| pkg.downcase}
|
44
|
+
|
45
|
+
result = []
|
46
|
+
list.each do |pkg|
|
47
|
+
pkg_without_channel = pkg.gsub(%r{^[^/]+/}, '').downcase
|
48
|
+
result.push pkg if all_installed.include?(pkg_without_channel)
|
49
|
+
end
|
50
|
+
|
51
|
+
result
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# See AutomateIt::PackageManager#not_installed?
|
56
|
+
def not_installed?(*packages)
|
57
|
+
return _not_installed_helper?(*packages)
|
58
|
+
end
|
59
|
+
|
60
|
+
# *IMPORTANT*: See documentation at the top of this file for how to correctly
|
61
|
+
# install packages from a specific channel.
|
62
|
+
#
|
63
|
+
# Options:
|
64
|
+
# * :force -- Force installation, needed when installing unstable packages
|
65
|
+
#
|
66
|
+
# See AutomateIt::PackageManager#install
|
67
|
+
def install(*packages)
|
68
|
+
return _install_helper(*packages) do |list, opts|
|
69
|
+
# pear options:
|
70
|
+
# -a install all required dependencies
|
71
|
+
# -f force installation
|
72
|
+
|
73
|
+
cmd = "(pear config-set auto_discover 1; "
|
74
|
+
cmd << "pear install -a"
|
75
|
+
cmd << " -f" if opts[:force]
|
76
|
+
cmd << " "+list.join(" ")+" < /dev/null)"
|
77
|
+
cmd << " > /dev/null" if opts[:quiet]
|
78
|
+
cmd << " 2>&1"
|
79
|
+
|
80
|
+
interpreter.sh(cmd)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# See AutomateIt::PackageManager#uninstall
|
85
|
+
def uninstall(*packages)
|
86
|
+
return _uninstall_helper(*packages) do |list, opts|
|
87
|
+
|
88
|
+
cmd = "pear uninstall "+list.join(" ")+" < /dev/null"
|
89
|
+
cmd << " > /dev/null" if opts[:quiet]
|
90
|
+
cmd << " 2>&1"
|
91
|
+
|
92
|
+
interpreter.sh(cmd)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# == PackageManager::PECL
|
2
|
+
#
|
3
|
+
# A PackageManager driver for PECL (PHP Extension Community Library), manages
|
4
|
+
# software packages using the <tt>pecl</tt> command.
|
5
|
+
class ::AutomateIt::PackageManager::PECL < ::AutomateIt::PackageManager::BaseDriver
|
6
|
+
depends_on :programs => %w(pecl)
|
7
|
+
|
8
|
+
def suitability(method, *args) # :nodoc:
|
9
|
+
# Never select as default driver
|
10
|
+
return 0
|
11
|
+
end
|
12
|
+
|
13
|
+
# Retrieve a hash containing all installed packages, indexed by package
|
14
|
+
# name. Each value is a hash containing values for :channel, :version,
|
15
|
+
# and :state.
|
16
|
+
def get_installed_packages()
|
17
|
+
cmd = "pecl list -a 2>&1"
|
18
|
+
data = `#{cmd}`
|
19
|
+
installed_packages = {}
|
20
|
+
data.scan(/^([^(\s]+)\s+([^\s]+)\s+([^\s]+)$/) do |package, version, state|
|
21
|
+
next if version.upcase == 'VERSION'
|
22
|
+
installed_packages[package] = {:version => version, :state => state}
|
23
|
+
end
|
24
|
+
return installed_packages
|
25
|
+
end
|
26
|
+
protected :get_installed_packages
|
27
|
+
|
28
|
+
# See AutomateIt::PackageManager#installed?
|
29
|
+
def installed?(*packages)
|
30
|
+
return _installed_helper?(*packages) do |list, opts|
|
31
|
+
all_installed = get_installed_packages().keys.collect {|pkg| pkg.downcase}
|
32
|
+
|
33
|
+
result = []
|
34
|
+
list.each do |pkg|
|
35
|
+
pkg_without_channel = pkg.gsub(%r{^[^/]+/}, '').downcase
|
36
|
+
result.push pkg if all_installed.include?(pkg_without_channel)
|
37
|
+
end
|
38
|
+
|
39
|
+
result
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
# See AutomateIt::PackageManager#not_installed?
|
45
|
+
def not_installed?(*packages)
|
46
|
+
return _not_installed_helper?(*packages)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Options:
|
50
|
+
# * :force -- Force installation, needed when installing unstable packages
|
51
|
+
#
|
52
|
+
# See AutomateIt::PackageManager#install
|
53
|
+
def install(*packages)
|
54
|
+
return _install_helper(*packages) do |list, opts|
|
55
|
+
# pecl options:
|
56
|
+
# -a install all required dependencies
|
57
|
+
# -f force installation
|
58
|
+
|
59
|
+
cmd = "pecl install -a"
|
60
|
+
cmd << " -f" if opts[:force]
|
61
|
+
cmd << " "+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
|
+
|
69
|
+
# See AutomateIt::PackageManager#uninstall
|
70
|
+
def uninstall(*packages)
|
71
|
+
return _uninstall_helper(*packages) do |list, opts|
|
72
|
+
|
73
|
+
cmd = "pecl uninstall "+list.join(" ")+" < /dev/null"
|
74
|
+
cmd << " > /dev/null" if opts[:quiet]
|
75
|
+
cmd << " 2>&1"
|
76
|
+
|
77
|
+
interpreter.sh(cmd)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -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
|
+
|