dply 0.2.19 → 0.3.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.
- checksums.yaml +5 -5
- data/.rspec +4 -0
- data/Rakefile +0 -14
- data/TODO +0 -1
- data/code_dump/old_remote_task.rb +2 -0
- data/{dev_bin → dev_exe}/dplyr +0 -0
- data/{dev_bin → dev_exe}/drake +1 -1
- data/dply.gemspec +2 -2
- data/{bin → exe}/dplyr +0 -0
- data/{bin → exe}/drake +12 -14
- data/lib/dply/TEST_TODO +50 -0
- data/lib/dply/app_config.rb +108 -0
- data/lib/dply/base_config.rb +110 -0
- data/lib/dply/build.rb +17 -11
- data/lib/dply/build_config.rb +28 -96
- data/lib/dply/bundle.rb +7 -30
- data/lib/dply/cli/build.rb +5 -12
- data/lib/dply/cli/ctl.rb +7 -8
- data/lib/dply/cli/deploy.rb +6 -10
- data/lib/dply/cli/devbuild.rb +6 -10
- data/lib/dply/cli/install_pkgs.rb +2 -3
- data/lib/dply/cli/run.rb +27 -0
- data/lib/dply/cli/status.rb +1 -2
- data/lib/dply/cli/task.rb +6 -12
- data/lib/dply/code_archive.rb +123 -0
- data/lib/dply/command.rb +57 -0
- data/lib/dply/config_downloader.rb +3 -2
- data/lib/dply/curl.rb +1 -5
- data/lib/dply/custom_logger.rb +18 -1
- data/lib/dply/deplist.rb +16 -48
- data/lib/dply/deploy_config.rb +34 -0
- data/lib/dply/elf.rb +60 -0
- data/lib/dply/env.rb +9 -0
- data/lib/dply/git.rb +15 -8
- data/lib/dply/helper.rb +21 -33
- data/lib/dply/linker.rb +27 -27
- data/lib/dply/lock.rb +2 -9
- data/lib/dply/logger.rb +1 -1
- data/lib/dply/pkgs.rb +9 -11
- data/lib/dply/release.rb +2 -2
- data/lib/dply/{archive.rb → remote_archive.rb} +1 -1
- data/lib/dply/repo.rb +3 -3
- data/lib/dply/rpm.rb +12 -20
- data/lib/dply/scripts/depcheck.rb +4 -0
- data/lib/dply/shared_dirs.rb +1 -1
- data/lib/dply/strategy/archive.rb +15 -22
- data/lib/dply/strategy/base.rb +82 -0
- data/lib/dply/strategy/git.rb +18 -19
- data/lib/dply/task_dsl.rb +101 -0
- data/lib/dply/util.rb +75 -0
- data/lib/dply/venv.rb +53 -0
- data/lib/dply/version.rb +1 -1
- data/lib/dply/yum.rb +21 -31
- data/lib/dplyr/consul.rb +1 -1
- data/spec/dply/base_config_spec.rb +178 -0
- data/spec/dply/bundle_spec.rb +100 -0
- data/spec/dply/command_spec.rb +190 -0
- data/spec/dply/curl_spec.rb +41 -0
- data/spec/dply/deplist_spec.rb +48 -0
- data/spec/dply/elf_spec.rb +64 -0
- data/spec/dply/env_spec.rb +57 -0
- data/spec/dply/git_spec.rb +136 -0
- data/spec/dply/helper_spec.rb +168 -0
- data/spec/dply/linker_spec.rb +81 -0
- data/spec/dply/lock_spec.rb +24 -0
- data/spec/dply/pkgs_spec.rb +105 -0
- data/spec/dply/repo_spec.rb +58 -0
- data/spec/dply/rpm_spec.rb +32 -0
- data/spec/dply/yum_spec.rb +29 -0
- data/spec/integration/archive_flow_spec.rb +87 -0
- data/spec/integration/git_flow_spec.rb +63 -0
- data/spec/repo.rb +27 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/test_data/build.tar.gz +0 -0
- data/spec/test_data/build.tar.gz.md5 +1 -0
- data/spec/test_data/bundle/gems_installed/Gemfile +1 -0
- data/spec/test_data/bundle/gems_not_installed/Gemfile +2 -0
- data/spec/test_data/bundle/no_gemfile/.gitkeep +0 -0
- data/spec/test_data/command/test.rb +7 -0
- data/spec/test_data/elf/elf +0 -0
- data/spec/test_data/elf/libpgtypes.so.3 +0 -0
- data/spec/test_data/elf/not_elf +1 -0
- data/spec/test_data/sample_repo/.dply.lock +0 -0
- data/spec/test_data/sample_repo/Gemfile +2 -0
- data/spec/test_data/sample_repo/Rakefile +3 -0
- data/spec/test_data/sample_repo/app.rb +1 -0
- data/spec/test_data/sample_repo/dply/app.rb +33 -0
- data/spec/test_data/sample_repo/lib/libacl.so.1 +0 -0
- data/spec/test_data/sample_repo/pkgs.yml +2 -0
- data/spec/webserver.rb +21 -0
- metadata +96 -28
- data/lib/dply/cli/app_task.rb +0 -38
- data/lib/dply/config.rb +0 -120
- data/lib/dply/config_struct.rb +0 -52
- data/lib/dply/rakelib/drake.rake +0 -33
- data/lib/dply/tasks.rb +0 -136
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'dply/helper'
|
|
2
|
+
require 'dply/tasks'
|
|
3
|
+
require 'dply/setup'
|
|
4
|
+
require 'dply/config_downloader'
|
|
5
|
+
require 'dply/yum'
|
|
6
|
+
require 'dply/release'
|
|
7
|
+
require 'dply/release_helper'
|
|
8
|
+
require 'forwardable'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
module Dply
|
|
12
|
+
module Strategy
|
|
13
|
+
class Base
|
|
14
|
+
|
|
15
|
+
extend Forwardable
|
|
16
|
+
include Helper
|
|
17
|
+
|
|
18
|
+
attr_reader :config, :options
|
|
19
|
+
def_delegators :config, :target, :branch, :revision, :name,
|
|
20
|
+
:config_map, :dir_map, :config_skip_download,
|
|
21
|
+
:config_download_url, :build_url
|
|
22
|
+
|
|
23
|
+
def initialize(config, options)
|
|
24
|
+
@config = config
|
|
25
|
+
@options = options || {}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def deploy
|
|
29
|
+
raise NotImplementedError
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def reload
|
|
33
|
+
raise NotImplementedError
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def stop
|
|
37
|
+
raise NotImplementedError
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def reopen_logs
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def current_dir
|
|
46
|
+
@current_dir ||= "#{config.dir}/current"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def download_configs
|
|
50
|
+
files = config_map.values.uniq
|
|
51
|
+
downloader = ConfigDownloader.new(files, config_download_url, dir: "config")
|
|
52
|
+
downloader.skip_download = config_skip_download if config_skip_download
|
|
53
|
+
downloader.download_all
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def link_all
|
|
57
|
+
link "#{config.dir}/shared", dir_map
|
|
58
|
+
tasks.link "#{config.dir}/config", config_map
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def link(source, map)
|
|
62
|
+
return if not map
|
|
63
|
+
logger.bullet "symlinking #{source}"
|
|
64
|
+
dest = Dir.pwd
|
|
65
|
+
linker = Linker.new(source, dest, map: map)
|
|
66
|
+
linker.create_symlinks
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def setup
|
|
70
|
+
@setup ||= Setup.new(@config)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def tasks
|
|
74
|
+
@tasks ||= Tasks.new
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
class NotImplementedError < StandardError
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
data/lib/dply/strategy/git.rb
CHANGED
|
@@ -2,14 +2,13 @@ require 'dply/helper'
|
|
|
2
2
|
require 'dply/setup'
|
|
3
3
|
require 'dply/config_downloader'
|
|
4
4
|
require 'dply/yum'
|
|
5
|
-
require 'dply/
|
|
5
|
+
require 'dply/util'
|
|
6
6
|
require 'forwardable'
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
module Dply
|
|
10
9
|
module Strategy
|
|
11
10
|
class Git
|
|
12
|
-
|
|
11
|
+
|
|
13
12
|
extend Forwardable
|
|
14
13
|
include Helper
|
|
15
14
|
|
|
@@ -17,7 +16,7 @@ module Dply
|
|
|
17
16
|
def_delegators :config, :target, :branch,
|
|
18
17
|
:config_map, :dir_map, :config_skip_download,
|
|
19
18
|
:config_download_url
|
|
20
|
-
|
|
19
|
+
|
|
21
20
|
def initialize(config, options)
|
|
22
21
|
@config = config
|
|
23
22
|
@options = options || {}
|
|
@@ -33,8 +32,10 @@ module Dply
|
|
|
33
32
|
current_version = git.commit_id
|
|
34
33
|
link_all
|
|
35
34
|
install_pkgs
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
bundle.install
|
|
36
|
+
bundle.clean
|
|
37
|
+
util.run "deploy:#{deploy_target}"
|
|
38
|
+
util.report_changes(previous_version, current_version)
|
|
38
39
|
end
|
|
39
40
|
end
|
|
40
41
|
|
|
@@ -42,13 +43,7 @@ module Dply
|
|
|
42
43
|
download_configs if config_download_url
|
|
43
44
|
Dir.chdir current_dir do
|
|
44
45
|
link_all
|
|
45
|
-
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def task(name)
|
|
50
|
-
Dir.chdir current_dir do
|
|
51
|
-
tasks.rake name
|
|
46
|
+
util.run :reload
|
|
52
47
|
end
|
|
53
48
|
end
|
|
54
49
|
|
|
@@ -61,7 +56,7 @@ module Dply
|
|
|
61
56
|
def download_configs
|
|
62
57
|
files = config_map.values.uniq
|
|
63
58
|
downloader = ConfigDownloader.new(files, config_download_url)
|
|
64
|
-
downloader.skip_download = config_skip_download if config_skip_download
|
|
59
|
+
downloader.skip_download = config_skip_download if config_skip_download
|
|
65
60
|
downloader.download_all
|
|
66
61
|
end
|
|
67
62
|
|
|
@@ -75,20 +70,24 @@ module Dply
|
|
|
75
70
|
end
|
|
76
71
|
|
|
77
72
|
def link_all
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
util.link "#{config.dir}/shared", dir_map
|
|
74
|
+
util.link "#{config.dir}/config", config_map
|
|
80
75
|
end
|
|
81
76
|
|
|
82
77
|
def install_pkgs
|
|
83
|
-
|
|
78
|
+
util.install_pkgs(build_mode: true)
|
|
84
79
|
end
|
|
85
80
|
|
|
86
81
|
def setup
|
|
87
82
|
@setup ||= Setup.new(@config)
|
|
88
83
|
end
|
|
89
84
|
|
|
90
|
-
def
|
|
91
|
-
@
|
|
85
|
+
def util
|
|
86
|
+
@util ||= Util.new
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def bundle
|
|
90
|
+
@bundle ||= Bundle.new
|
|
92
91
|
end
|
|
93
92
|
|
|
94
93
|
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
require_relative 'helper'
|
|
2
|
+
|
|
3
|
+
module Dply
|
|
4
|
+
class TaskDsl
|
|
5
|
+
|
|
6
|
+
include Helper
|
|
7
|
+
|
|
8
|
+
def initialize(app_config)
|
|
9
|
+
@app_config = app_config
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def run(name)
|
|
13
|
+
@app_config.run_task name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def sh(command, env: {}, bundled_env: false)
|
|
17
|
+
extra_env = base_env.merge env
|
|
18
|
+
super(command, env: extra_env, bundled_env: bundled_env, display: :arrow)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def set_env(key, value)
|
|
22
|
+
ENV[key.to_s] = value.to_s
|
|
23
|
+
base_env[key.to_s] = value.to_s
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def rake(task, *args)
|
|
27
|
+
logger.arrow "rake #{task}"
|
|
28
|
+
rake_app[task].invoke(*args)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def archive(name, **opts, &block)
|
|
32
|
+
require_relative 'code_archive'
|
|
33
|
+
revision = ENV["BUILD_NUMBER"] || "unknown"
|
|
34
|
+
archive = CodeArchive.new(name, revision: revision)
|
|
35
|
+
archive.build(**opts, &block)
|
|
36
|
+
return archive
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def role(*roles, &block)
|
|
40
|
+
roles << :all
|
|
41
|
+
if r = roles.find { |r| dply_roles.include? r }
|
|
42
|
+
yield r
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def role?(*roles)
|
|
47
|
+
roles << :all
|
|
48
|
+
roles.find { |r| dply_roles.include? r }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def venv
|
|
52
|
+
@venv ||= begin
|
|
53
|
+
require_relative 'venv'
|
|
54
|
+
Venv.new
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def base_env
|
|
61
|
+
@base_env ||= begin
|
|
62
|
+
env = {}
|
|
63
|
+
env.merge! env_from_yml(".env.yml")
|
|
64
|
+
env.merge! env_from_yml("config/env.yml")
|
|
65
|
+
env
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def env_from_yml(path)
|
|
70
|
+
if not File.readable? path
|
|
71
|
+
logger.debug "skipped loading env from #{path}"
|
|
72
|
+
return {}
|
|
73
|
+
end
|
|
74
|
+
require 'yaml'
|
|
75
|
+
YAML.load_file(path)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def rake_app
|
|
79
|
+
@rake_app ||= begin
|
|
80
|
+
require 'rake'
|
|
81
|
+
app = Rake.application
|
|
82
|
+
app.init
|
|
83
|
+
silence_warnings { app.load_rakefile }
|
|
84
|
+
app
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def dply_roles
|
|
89
|
+
@dply_roles ||= (ENV["DPLY_ROLES"] || "").strip.split(",").map { |r| r.to_sym }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def silence_warnings(&block)
|
|
93
|
+
warn_level = $VERBOSE
|
|
94
|
+
$VERBOSE = nil
|
|
95
|
+
yield
|
|
96
|
+
ensure
|
|
97
|
+
$VERBOSE = warn_level
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
end
|
data/lib/dply/util.rb
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
require_relative 'app_config'
|
|
3
|
+
require_relative 'helper'
|
|
4
|
+
require_relative 'bundle'
|
|
5
|
+
require_relative 'linker'
|
|
6
|
+
require_relative 'pkgs'
|
|
7
|
+
require 'etc'
|
|
8
|
+
|
|
9
|
+
module Dply
|
|
10
|
+
class Util
|
|
11
|
+
|
|
12
|
+
include Helper
|
|
13
|
+
|
|
14
|
+
def rake(task, args)
|
|
15
|
+
cmd_arr = ["bundle", "exec", "rake", task, *args]
|
|
16
|
+
cmd cmd_arr
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def report_changes(previous_version, current_version)
|
|
20
|
+
info = {}
|
|
21
|
+
info[:current] = current_version
|
|
22
|
+
info[:previous] = previous_version
|
|
23
|
+
logger.remote "#{previous_version} => #{current_version}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def install_pkgs(build_mode: false)
|
|
27
|
+
return if not File.exists? "pkgs.yml"
|
|
28
|
+
pkgs = Pkgs.new("pkgs.yml")
|
|
29
|
+
return if pkgs.installed?(build_mode: build_mode)
|
|
30
|
+
drake_install build_mode
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def link(source, map)
|
|
34
|
+
return if not map
|
|
35
|
+
logger.bullet "symlinking #{source}"
|
|
36
|
+
dest = Dir.pwd
|
|
37
|
+
linker = Linker.new(source, dest, map: map)
|
|
38
|
+
linker.create_symlinks
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def run(task, optional: false)
|
|
42
|
+
app_config = AppConfig.new
|
|
43
|
+
logger.arrow task
|
|
44
|
+
app_config.run_task task, optional: optional
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def drake_install(build_mode)
|
|
50
|
+
command = "#{drake_command} install-pkgs"
|
|
51
|
+
command << " -b" if build_mode
|
|
52
|
+
check_sudo_permission command
|
|
53
|
+
cmd "sudo -n #{command}"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def drake_command
|
|
57
|
+
@drake_command ||= (ENV["DRAKE_COMMAND"] || "/opt/ruby/bin/drake")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def check_sudo_permission(command)
|
|
61
|
+
output = `sudo -n -l #{command}`
|
|
62
|
+
if output.chomp.strip == command
|
|
63
|
+
return true
|
|
64
|
+
else
|
|
65
|
+
msg = []
|
|
66
|
+
user = Etc.getpwuid(Process.uid).name
|
|
67
|
+
msg << %{unable to run "#{command}" with sudo permissions}
|
|
68
|
+
msg << %{To resolve add the following line to sudoers: }
|
|
69
|
+
msg << %{#{user} ALL=(ALL) NOPASSWD: /opt/ruby/bin/drake install-pkgs *, /opt/ruby/bin/drake install-pkgs}.yellow
|
|
70
|
+
raise Error, msg.join("\n")
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
data/lib/dply/venv.rb
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require_relative 'helper'
|
|
3
|
+
|
|
4
|
+
module Dply
|
|
5
|
+
class Venv
|
|
6
|
+
|
|
7
|
+
include Helper
|
|
8
|
+
|
|
9
|
+
def install(system_site_packages: false, pip_version: "9.0.1", setuptools_version: "38.4.1", &block)
|
|
10
|
+
init(system_site_packages)
|
|
11
|
+
update_pip_setuptools(pip_version, setuptools_version)
|
|
12
|
+
yield if block_given?
|
|
13
|
+
pip_install
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def build(system_site_packages: false, pip_version: "9.0.1", setuptools_version: "38.4.1", &block)
|
|
17
|
+
FileUtils.mkdir_p "tmp/venv"
|
|
18
|
+
symlink "tmp/venv", "venv"
|
|
19
|
+
init(system_site_packages)
|
|
20
|
+
update_pip_setuptools(pip_version, setuptools_version)
|
|
21
|
+
yield if block_given?
|
|
22
|
+
pip_install
|
|
23
|
+
sh "virtualenv-relocate -s venv"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def unpack
|
|
27
|
+
sh "virtualenv-relocate -d venv"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def init(system_site_packages = false)
|
|
33
|
+
return if File.exist? "venv/.setup_done"
|
|
34
|
+
system_flag = system_site_packages ? "--system-site-packages" : ""
|
|
35
|
+
sh "virtualenv #{system_flag} venv"
|
|
36
|
+
FileUtils.touch "venv/.setup_done"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def pip_install
|
|
40
|
+
sh "venv/bin/pip install -r requirements.txt"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def python(command)
|
|
44
|
+
sh "venv/bin/python #{command}"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def update_pip_setuptools(pip_version, setuptools_version)
|
|
48
|
+
sh "venv/bin/pip install pip==#{pip_version}"
|
|
49
|
+
sh "venv/bin/pip install setuptools==#{setuptools_version}"
|
|
50
|
+
# sh "venv/bin/pip install urllib3[secure]"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
data/lib/dply/version.rb
CHANGED
data/lib/dply/yum.rb
CHANGED
|
@@ -1,46 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative 'helper'
|
|
2
2
|
|
|
3
3
|
module Dply
|
|
4
|
-
|
|
4
|
+
module Yum
|
|
5
|
+
extend Helper
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@sudo = sudo
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def install
|
|
14
|
-
return if installed?
|
|
15
|
-
command = ""
|
|
16
|
-
command << "sudo -n " if @sudo
|
|
17
|
-
command << "yum install -y #{not_installed_pkgs.join(' ')}"
|
|
18
|
-
cmd command
|
|
19
|
-
not_installed = query_not_installed
|
|
7
|
+
def self.install(pkgs)
|
|
8
|
+
return if installed?(pkgs)
|
|
9
|
+
cmd install_command(pkgs)
|
|
10
|
+
not_installed = not_installed(pkgs)
|
|
20
11
|
if not_installed.size != 0
|
|
21
12
|
error "following pkgs not installed: #{not_installed.join(" ")}"
|
|
22
13
|
end
|
|
23
14
|
end
|
|
24
15
|
|
|
25
|
-
def installed?
|
|
26
|
-
|
|
16
|
+
def self.installed?(pkgs)
|
|
17
|
+
not_installed(pkgs).size == 0
|
|
27
18
|
end
|
|
28
19
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def pkgs_str
|
|
32
|
-
@pkgs.join " "
|
|
33
|
-
end
|
|
20
|
+
class << self
|
|
21
|
+
private
|
|
34
22
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
23
|
+
def not_installed(pkgs)
|
|
24
|
+
return [] if pkgs.empty?
|
|
25
|
+
command = %w(rpm -V --noscripts --nodeps --nofiles)
|
|
26
|
+
command.concat pkgs
|
|
27
|
+
out = IO.popen(command).read
|
|
28
|
+
out.scan(/^package (.*) is not installed$/).flatten
|
|
29
|
+
end
|
|
38
30
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
matches = `#{command}`.scan(/^package (.*) is not installed$/)
|
|
31
|
+
def install_command(pkgs)
|
|
32
|
+
%w(yum install -y).concat(not_installed pkgs)
|
|
33
|
+
end
|
|
43
34
|
end
|
|
44
|
-
|
|
45
35
|
end
|
|
46
36
|
end
|