dply 0.0.8 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/TODO +3 -0
- data/bin/dplyr +2 -2
- data/bin/drake +4 -2
- data/dply.gemspec +2 -0
- data/lib/dply/build.rb +3 -3
- data/lib/dply/cli/build.rb +4 -0
- data/lib/dply/cli/depcheck.rb +26 -0
- data/lib/dply/cli/deploy.rb +4 -0
- data/lib/dply/cli/install_pkgs.rb +42 -0
- data/lib/dply/config.rb +6 -1
- data/lib/dply/config_struct.rb +5 -1
- data/lib/dply/deplist.rb +85 -0
- data/lib/dply/helper.rb +0 -2
- data/lib/dply/linker.rb +1 -0
- data/lib/dply/pkgs_config.rb +63 -0
- data/lib/dply/rpm.rb +27 -0
- data/lib/dply/strategy/archive.rb +4 -7
- data/lib/dply/strategy/git.rb +5 -5
- data/lib/dply/tasks.rb +29 -2
- data/lib/dply/version.rb +1 -1
- data/lib/dply/yum.rb +12 -19
- data/lib/{dply/dplyr.rb → dplyr/cli.rb} +7 -7
- data/lib/{dply → dplyr}/remote_task.rb +31 -9
- data/lib/{dply → dplyr}/report.rb +7 -3
- data/lib/dplyr/stage.rb +68 -0
- data/lib/dplyr/stages_config.rb +39 -0
- data/lib/dplyr/tasks_config.rb +33 -0
- metadata +42 -6
- data/lib/dply/stages_config.rb +0 -103
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0cb8b78720dfacebae2f3c70eb5a73ee9c8355ed
|
4
|
+
data.tar.gz: a428544177c09f38238a5bf2128ea2dd82038749
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 508041596cef6f13c18a66532a7875c022784d8df7e158693c33433b049f0593139ef340e6b7ebfd2722d6c17111b97b864cf241889d46b02dfe70bf0b5fd772
|
7
|
+
data.tar.gz: 6146f87d6669c0e813ab3e4f85fc287263d586749c7d395b22162e7701f5126c760c1fe5bd3d84ad35f1f07c7cbd81c2f077c38ffb22ca57f2d3204a5bd483cd
|
data/TODO
ADDED
data/bin/dplyr
CHANGED
@@ -5,7 +5,7 @@ require 'optparse'
|
|
5
5
|
require 'dply/error'
|
6
6
|
require 'dply/version'
|
7
7
|
require 'dply/logger'
|
8
|
-
require '
|
8
|
+
require 'dplyr/cli'
|
9
9
|
require 'pathname'
|
10
10
|
|
11
11
|
logger = ::Dply::Logger.logger
|
@@ -57,7 +57,7 @@ begin
|
|
57
57
|
|
58
58
|
stage = ARGV.shift
|
59
59
|
|
60
|
-
dplyr = ::
|
60
|
+
dplyr = ::Dplyr::Cli.new(stage, ARGV)
|
61
61
|
dplyr.run
|
62
62
|
|
63
63
|
rescue OptionParser::InvalidOption, OptionParser::MissingArgument, ::Dply::Error => e
|
data/bin/drake
CHANGED
@@ -54,8 +54,10 @@ opts_parser = OptionParser.new do |opts|
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def run_cli(command, argv)
|
57
|
+
command = command.to_s.gsub("-", "_")
|
57
58
|
require "dply/cli/#{command}"
|
58
|
-
|
59
|
+
klass_name = command.split('_').collect(&:capitalize).join
|
60
|
+
const = "::Dply::Cli::#{klass_name}"
|
59
61
|
klass = Module.const_get const
|
60
62
|
cli = klass.new(argv)
|
61
63
|
cli.run
|
@@ -67,7 +69,7 @@ begin
|
|
67
69
|
|
68
70
|
command = (ARGV.shift || "").to_sym
|
69
71
|
case command
|
70
|
-
when :deploy, :reload, :task, :build
|
72
|
+
when :deploy, :reload, :task, :build, :depcheck, :"install-pkgs"
|
71
73
|
run_cli command, ARGV
|
72
74
|
when /[a-zA-Z_\-0-9]+[:][a-zA-Z_\-0-9]+/
|
73
75
|
require 'dply/task_runner'
|
data/dply.gemspec
CHANGED
@@ -16,6 +16,8 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ["lib"]
|
19
|
+
spec.add_dependency "ruby-elf", "~> 1.0"
|
20
|
+
spec.add_dependency "ruby-filemagic", "~> 0.6"
|
19
21
|
|
20
22
|
spec.add_development_dependency "bundler", "~> 1.6"
|
21
23
|
spec.add_development_dependency "rake"
|
data/lib/dply/build.rb
CHANGED
@@ -30,7 +30,7 @@ module Dply
|
|
30
30
|
git.clean
|
31
31
|
link_dirs
|
32
32
|
link_config
|
33
|
-
|
33
|
+
install_pkgs
|
34
34
|
clean_build_dir
|
35
35
|
link_build_dir
|
36
36
|
tasks.build config.task
|
@@ -77,8 +77,8 @@ module Dply
|
|
77
77
|
linker.create_symlinks
|
78
78
|
end
|
79
79
|
|
80
|
-
def
|
81
|
-
|
80
|
+
def install_pkgs
|
81
|
+
tasks.install_pkgs(build_mode: true, use_yum: config.use_yum)
|
82
82
|
end
|
83
83
|
|
84
84
|
def clean_build_dir
|
data/lib/dply/cli/build.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'dply/pkgs_config'
|
2
|
+
require 'dply/deplist'
|
3
|
+
require 'dply/helper'
|
4
|
+
|
5
|
+
module Dply
|
6
|
+
module Cli
|
7
|
+
class Depcheck
|
8
|
+
|
9
|
+
include Helper
|
10
|
+
|
11
|
+
def initialize(argv)
|
12
|
+
@argv = argv
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
tar_path = @argv.shift
|
17
|
+
error "tar path not specified" if not tar_path
|
18
|
+
tar_path = "#{Dir.pwd}/#{tar_path}"
|
19
|
+
pkgs = PkgsConfig.new.pkgs
|
20
|
+
deplist = Deplist.new(tar_path)
|
21
|
+
deplist.verify! pkgs
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/dply/cli/deploy.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'dply/pkgs_config'
|
2
|
+
require 'dply/yum'
|
3
|
+
require 'dply/helper'
|
4
|
+
|
5
|
+
module Dply
|
6
|
+
module Cli
|
7
|
+
class InstallPkgs
|
8
|
+
|
9
|
+
include Helper
|
10
|
+
|
11
|
+
def initialize(argv)
|
12
|
+
@argv = argv
|
13
|
+
@options = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
opts.parse!(@argv)
|
18
|
+
error "pkgs.yml cannot be a symlink" if File.symlink? "pkgs.yml"
|
19
|
+
pkgs = PkgsConfig.new(build_mode: @options[:build_mode]).pkgs
|
20
|
+
Yum.new(pkgs).install
|
21
|
+
end
|
22
|
+
|
23
|
+
def opts
|
24
|
+
OptionParser.new do |opts|
|
25
|
+
|
26
|
+
opts.banner = "Usage: drake install-pkgs [options] [target]"
|
27
|
+
|
28
|
+
opts.on("-b" , "Build mode") do |b|
|
29
|
+
@options[:build_mode] = true
|
30
|
+
end
|
31
|
+
|
32
|
+
opts.on("-h", "--help", "Help") do
|
33
|
+
puts opts
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/dply/config.rb
CHANGED
data/lib/dply/config_struct.rb
CHANGED
data/lib/dply/deplist.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'filemagic'
|
2
|
+
require 'elf'
|
3
|
+
require 'dply/helper'
|
4
|
+
require 'dply/rpm'
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
module Dply
|
8
|
+
class Deplist
|
9
|
+
|
10
|
+
include Helper
|
11
|
+
|
12
|
+
def initialize(path)
|
13
|
+
@path = path
|
14
|
+
end
|
15
|
+
|
16
|
+
def deps
|
17
|
+
@deps ||= load_deps
|
18
|
+
end
|
19
|
+
|
20
|
+
def verify!(pkgs_list)
|
21
|
+
deps.each do |pkgs|
|
22
|
+
if not pkgs.any? { |pkg| pkgs_list.include? pkg }
|
23
|
+
logger.error "missing from pkgs.yml : any of #{pkgs}"
|
24
|
+
@error = true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
error "packages dependencies not satisfied" if @error
|
28
|
+
puts "all dependencies satisfied".green
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def magic
|
34
|
+
@magic ||= begin
|
35
|
+
flags = FileMagic::FLAGS_BY_SYM.select { |k,v| k.to_s =~ /no_check_/ }.keys
|
36
|
+
not_required_flags = [:no_check_soft, :no_check_elf, :no_check_builtin]
|
37
|
+
not_required_flags.each {|x| flags.delete(x) }
|
38
|
+
fm = FileMagic.new
|
39
|
+
fm.flags = flags
|
40
|
+
fm
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def load_deps
|
45
|
+
error "#{@path} not readable" if not File.readable? @path
|
46
|
+
tmp_dir do
|
47
|
+
logger.info "(in #{Dir.pwd})"
|
48
|
+
cmd "tar xf #{@path}"
|
49
|
+
@libs = get_libs
|
50
|
+
logger.debug @libs.inspect
|
51
|
+
@deps = rpm.libs_to_packages @libs
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def tmp_dir(&block)
|
56
|
+
dir = File.exist?("tmp") ? "tmp" : "/tmp"
|
57
|
+
Dir.mktmpdir(nil, dir) do |d|
|
58
|
+
Dir.chdir(d) { yield }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_libs
|
63
|
+
libs = Set.new
|
64
|
+
Dir["./**/*"].each do |f|
|
65
|
+
type = magic.file(f)
|
66
|
+
if type =~ /ELF/
|
67
|
+
dynamic_libs(f).each { |k| libs << k }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
return libs
|
71
|
+
end
|
72
|
+
|
73
|
+
def dynamic_libs(file)
|
74
|
+
Elf::File.open(file) do |ef|
|
75
|
+
return [] if not ef.has_section? ".dynamic"
|
76
|
+
ef[".dynamic"].needed_libraries.keys
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def rpm
|
81
|
+
@rpm ||= Rpm.new
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
data/lib/dply/helper.rb
CHANGED
data/lib/dply/linker.rb
CHANGED
@@ -19,6 +19,7 @@ module Dply
|
|
19
19
|
source = link_source(f)
|
20
20
|
relative_source = link_relative_source(source, target)
|
21
21
|
logger.debug "linking #{target} -> #{source}"
|
22
|
+
error "source #{source} doesn't exist" if not File.exist? source
|
22
23
|
symlink(relative_source, target)
|
23
24
|
end
|
24
25
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'yaml'
|
3
|
+
require 'dply/helper'
|
4
|
+
|
5
|
+
module Dply
|
6
|
+
class PkgsConfig
|
7
|
+
|
8
|
+
include Helper
|
9
|
+
|
10
|
+
def initialize(pkgs_yml = nil, build_mode: false)
|
11
|
+
@pkgs_yml = pkgs_yml || "pkgs.yml"
|
12
|
+
@build_mode = build_mode
|
13
|
+
@pkgs = Set.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def pkgs
|
17
|
+
populate_all if not @populated
|
18
|
+
@pkgs
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def config
|
24
|
+
@config ||= load_yml
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_yml
|
28
|
+
if not File.readable? @pkgs_yml
|
29
|
+
logger.debug "skipping yum pkgs"
|
30
|
+
return {}
|
31
|
+
end
|
32
|
+
YAML.safe_load(File.read(@pkgs_yml))
|
33
|
+
rescue => e
|
34
|
+
error "error loading pkgs list"
|
35
|
+
end
|
36
|
+
|
37
|
+
def populate_all
|
38
|
+
populate :pkgs
|
39
|
+
populate :build_pkgs if @build_mode
|
40
|
+
@populated = true
|
41
|
+
end
|
42
|
+
|
43
|
+
def populate(pkg_set)
|
44
|
+
list = config[pkg_set.to_s] || []
|
45
|
+
list.each { |x| add x }
|
46
|
+
end
|
47
|
+
|
48
|
+
def add(pkg)
|
49
|
+
pkg = pkg.strip
|
50
|
+
validate! pkg
|
51
|
+
@pkgs << pkg
|
52
|
+
end
|
53
|
+
|
54
|
+
def validate!(pkg)
|
55
|
+
msg = "invalid pkg name #{pkg}"
|
56
|
+
error msg if pkg =~ /\.rpm\z/i
|
57
|
+
error msg if pkg =~/\A[A-Za-z_0-9\.\-]\z/
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
data/lib/dply/rpm.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'dply/helper'
|
2
|
+
|
3
|
+
module Dply
|
4
|
+
class Rpm
|
5
|
+
include Helper
|
6
|
+
|
7
|
+
def libs_to_packages(libs)
|
8
|
+
packages = Set.new
|
9
|
+
libs.each do |l|
|
10
|
+
lib = "#{l}()(64bit)"
|
11
|
+
command = %(rpm --queryformat "%{NAME} " -q --whatprovides "#{lib}")
|
12
|
+
logger.debug command
|
13
|
+
output = `#{command}`
|
14
|
+
error "running command #{command}" if not $?.exitstatus == 0
|
15
|
+
list = output.strip.split.select {|pkg| not filtered? pkg }
|
16
|
+
packages << list if not list.empty?
|
17
|
+
end
|
18
|
+
return packages
|
19
|
+
end
|
20
|
+
|
21
|
+
def filtered?(pkg)
|
22
|
+
@filtered ||= ["glibc", "libgcc", "libstdc++", "openssl", "ruby-alt"]
|
23
|
+
@filtered.include? pkg.strip
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'dply/helper'
|
2
|
+
require 'dply/tasks'
|
2
3
|
require 'dply/setup'
|
3
4
|
require 'dply/linker'
|
4
5
|
require 'dply/config_downloader'
|
@@ -28,8 +29,8 @@ module Dply
|
|
28
29
|
setup.archive
|
29
30
|
download_configs if config_download_url
|
30
31
|
install_release
|
31
|
-
release.make_current
|
32
32
|
previous_version = get_release
|
33
|
+
release.make_current
|
33
34
|
Dir.chdir current_dir do
|
34
35
|
tasks.deploy target
|
35
36
|
end
|
@@ -53,6 +54,7 @@ module Dply
|
|
53
54
|
end
|
54
55
|
|
55
56
|
def get_release
|
57
|
+
return "NA" if not File.symlink? current_dir
|
56
58
|
File.basename (File.readlink current_dir)
|
57
59
|
end
|
58
60
|
|
@@ -77,14 +79,10 @@ module Dply
|
|
77
79
|
Dir.chdir release.path do
|
78
80
|
link_dirs
|
79
81
|
link_config
|
80
|
-
|
82
|
+
tasks.install_pkgs(use_yum: options[:use_yum])
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
|
-
def yum_install
|
85
|
-
Yum.new("pkgs.yml").install
|
86
|
-
end
|
87
|
-
|
88
86
|
def git_step
|
89
87
|
return if options[:skip_git]
|
90
88
|
if options[:no_pull]
|
@@ -118,7 +116,6 @@ module Dply
|
|
118
116
|
linker.create_symlinks
|
119
117
|
end
|
120
118
|
|
121
|
-
|
122
119
|
end
|
123
120
|
end
|
124
121
|
end
|
data/lib/dply/strategy/git.rb
CHANGED
@@ -32,9 +32,9 @@ module Dply
|
|
32
32
|
current_version = git.commit_id
|
33
33
|
link_dirs
|
34
34
|
link_config
|
35
|
-
|
35
|
+
install_pkgs
|
36
36
|
tasks.deploy target
|
37
|
-
|
37
|
+
tasks.report_changes(previous_version, current_version)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -42,7 +42,7 @@ module Dply
|
|
42
42
|
download_configs if config_download_url
|
43
43
|
Dir.chdir current_dir do
|
44
44
|
link_dirs
|
45
|
-
|
45
|
+
link_config
|
46
46
|
tasks.reload target
|
47
47
|
end
|
48
48
|
end
|
@@ -77,8 +77,8 @@ module Dply
|
|
77
77
|
link "#{config.dir}/config", config_map
|
78
78
|
end
|
79
79
|
|
80
|
-
def
|
81
|
-
|
80
|
+
def install_pkgs
|
81
|
+
tasks.install_pkgs(use_yum: options[:use_yum])
|
82
82
|
end
|
83
83
|
|
84
84
|
def setup
|
data/lib/dply/tasks.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
require 'json'
|
1
2
|
require 'dply/shell'
|
2
3
|
require 'dply/bundle'
|
3
|
-
require '
|
4
|
+
require 'dply/yum'
|
5
|
+
require 'dply/pkgs_config'
|
6
|
+
|
4
7
|
module Dply
|
5
8
|
class Tasks
|
6
9
|
|
@@ -39,7 +42,16 @@ module Dply
|
|
39
42
|
info = {}
|
40
43
|
info[:current] = current_version
|
41
44
|
info[:previous] = previous_version
|
42
|
-
logger.remote "#{
|
45
|
+
logger.remote "#{previous_version} => #{current_version}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def install_pkgs(build_mode: false, use_yum: false)
|
49
|
+
drake_exists = File.exists? (drake_command)
|
50
|
+
if use_yum || !drake_exists
|
51
|
+
yum_install build_mode
|
52
|
+
else
|
53
|
+
command_install build_mode
|
54
|
+
end
|
43
55
|
end
|
44
56
|
|
45
57
|
private
|
@@ -48,5 +60,20 @@ module Dply
|
|
48
60
|
@bundle ||= Bundle.new(deployment: @deployment)
|
49
61
|
end
|
50
62
|
|
63
|
+
def yum_install(build_mode)
|
64
|
+
pkgs = PkgsConfig.new(build_mode: build_mode).pkgs
|
65
|
+
Yum.new(pkgs, sudo: true).install
|
66
|
+
end
|
67
|
+
|
68
|
+
def command_install(build_mode)
|
69
|
+
command = "sudo -n #{drake_command} install-pkgs"
|
70
|
+
command << " -b" if build_mode
|
71
|
+
cmd command
|
72
|
+
end
|
73
|
+
|
74
|
+
def drake_command
|
75
|
+
@drake_command ||= (ENV["DRAKE_COMMAND"] || "/opt/ruby/bin/drake")
|
76
|
+
end
|
77
|
+
|
51
78
|
end
|
52
79
|
end
|
data/lib/dply/version.rb
CHANGED
data/lib/dply/yum.rb
CHANGED
@@ -1,28 +1,31 @@
|
|
1
1
|
require 'dply/helper'
|
2
|
-
require 'yaml'
|
3
2
|
|
4
3
|
module Dply
|
5
4
|
class Yum
|
6
5
|
|
7
6
|
include Helper
|
8
7
|
|
9
|
-
def initialize(
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
def initialize(pkgs, sudo: false)
|
9
|
+
if pkgs.is_a? Set
|
10
|
+
@pkgs = pkgs.to_a
|
11
|
+
else
|
12
|
+
@pkgs = pkgs
|
13
|
+
end
|
14
|
+
@sudo = sudo
|
15
15
|
end
|
16
16
|
|
17
17
|
def install
|
18
18
|
return if installed?
|
19
|
-
|
19
|
+
command = ""
|
20
|
+
command << "sudo -n " if @sudo
|
21
|
+
command << "yum install -y #{not_installed_pkgs.join(' ')}"
|
22
|
+
cmd command
|
20
23
|
end
|
21
24
|
|
22
25
|
private
|
23
26
|
|
24
27
|
def pkgs_str
|
25
|
-
pkgs.join " "
|
28
|
+
@pkgs.join " "
|
26
29
|
end
|
27
30
|
|
28
31
|
def not_installed_pkgs
|
@@ -39,15 +42,5 @@ module Dply
|
|
39
42
|
not_installed_pkgs.size == 0
|
40
43
|
end
|
41
44
|
|
42
|
-
def load_pkgs
|
43
|
-
if not File.readable? @pkgs_yml
|
44
|
-
logger.debug "skipping yum pkgs"
|
45
|
-
return []
|
46
|
-
end
|
47
|
-
YAML.load_file(@pkgs_yml)
|
48
|
-
rescue => e
|
49
|
-
error "error loading pkgs list"
|
50
|
-
end
|
51
|
-
|
52
45
|
end
|
53
46
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'dplyr/stages_config'
|
2
|
+
require 'dplyr/remote_task'
|
3
3
|
require 'dply/logger'
|
4
4
|
|
5
|
-
module
|
6
|
-
class
|
5
|
+
module Dplyr
|
6
|
+
class Cli
|
7
7
|
|
8
|
-
include Logger
|
8
|
+
include ::Dply::Logger
|
9
9
|
|
10
10
|
attr_reader :stage, :argv
|
11
11
|
def initialize(stage, argv)
|
@@ -28,7 +28,7 @@ module Dply
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def stage_data
|
31
|
-
@stage_data ||= StagesConfig.new
|
31
|
+
@stage_data ||= StagesConfig.new.fetch(@stage).data
|
32
32
|
end
|
33
33
|
|
34
34
|
def hosts
|
@@ -52,7 +52,7 @@ module Dply
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def run_remote_task
|
55
|
-
remote_task =
|
55
|
+
remote_task = RemoteTask.new(hosts, argv_str, parallel_jobs: parallel_jobs, env: env_str)
|
56
56
|
remote_task.run
|
57
57
|
end
|
58
58
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'pty'
|
2
|
-
require '
|
2
|
+
require 'dplyr/report'
|
3
3
|
require 'dply/logger'
|
4
4
|
|
5
|
-
module
|
5
|
+
module Dplyr
|
6
6
|
class RemoteTask
|
7
7
|
|
8
|
-
include Logger
|
8
|
+
include ::Dply::Logger
|
9
9
|
|
10
10
|
attr_reader :hosts, :parallel_jobs, :task, :env
|
11
11
|
|
@@ -77,23 +77,28 @@ module Dply
|
|
77
77
|
def remote_cmd(host_info)
|
78
78
|
user = host_info[:user]
|
79
79
|
host = host_info[:host]
|
80
|
-
|
80
|
+
dir = host_info[:dir]
|
81
81
|
if logger.debug?
|
82
|
-
%(ssh -tt -oBatchMode=yes -l #{user} #{host} "#{env} drake --debug -d #{
|
82
|
+
%(ssh -tt -oBatchMode=yes -l #{user} #{host} "#{env} drake --remote --debug -d #{dir} #{task} 2>&1")
|
83
83
|
else
|
84
|
-
%(ssh -tt -oBatchMode=yes -l #{user} #{host} "#{env} drake -d #{
|
84
|
+
%(ssh -tt -oBatchMode=yes -l #{user} #{host} "#{env} drake --remote -d #{dir} #{task} 2>&1" 2>/dev/null)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
88
|
def pty_read(file, id)
|
89
89
|
file.each do |line|
|
90
|
-
|
90
|
+
if line =~ /\Adply_msg\|/
|
91
|
+
receive_message line
|
92
|
+
else
|
93
|
+
printf @job_output_template, id, line
|
94
|
+
end
|
91
95
|
end
|
92
96
|
rescue EOFError,Errno::ECONNRESET, Errno::EPIPE, Errno::EIO => e
|
93
97
|
end
|
94
98
|
|
95
99
|
def popen(cmd, host_info)
|
96
|
-
t = Thread.new do
|
100
|
+
t = Thread.new do |t|
|
101
|
+
Thread.current[:messages] = []
|
97
102
|
begin
|
98
103
|
r, w, pid = PTY.spawn(cmd)
|
99
104
|
pty_read(r, host_info[:id])
|
@@ -118,8 +123,25 @@ module Dply
|
|
118
123
|
end
|
119
124
|
end
|
120
125
|
|
126
|
+
def receive_message(msg_str)
|
127
|
+
msg = msg_str.partition("|")[2].strip
|
128
|
+
return if msg.empty?
|
129
|
+
messages = Thread.current[:messages]
|
130
|
+
messages << msg
|
131
|
+
end
|
132
|
+
|
121
133
|
def report
|
122
|
-
@report ||= Report.new(hosts, exit_statuses)
|
134
|
+
@report ||= Report.new(hosts, exit_statuses, messages)
|
135
|
+
end
|
136
|
+
|
137
|
+
def messages
|
138
|
+
@messages ||= begin
|
139
|
+
m = {}
|
140
|
+
@threads.each do |host, thread|
|
141
|
+
m[host] = thread[:messages]
|
142
|
+
end
|
143
|
+
m
|
144
|
+
end
|
123
145
|
end
|
124
146
|
|
125
147
|
def exit_statuses
|
@@ -1,11 +1,12 @@
|
|
1
|
-
module
|
1
|
+
module Dplyr
|
2
2
|
class Report
|
3
3
|
|
4
4
|
attr_reader :hosts, :exit_statuses
|
5
5
|
|
6
|
-
def initialize(hosts, exit_statuses)
|
6
|
+
def initialize(hosts, exit_statuses, messages)
|
7
7
|
@hosts = hosts
|
8
8
|
@exit_statuses = exit_statuses
|
9
|
+
@messages = messages
|
9
10
|
end
|
10
11
|
|
11
12
|
|
@@ -30,7 +31,10 @@ module Dply
|
|
30
31
|
def print_successful_jobs
|
31
32
|
puts "succeeded".green
|
32
33
|
succeeded.each do |host|
|
33
|
-
|
34
|
+
messages = @messages[host]
|
35
|
+
puts " - #{host[:id]}:"
|
36
|
+
next if not messages.is_a? Array
|
37
|
+
messages.each { |m| puts " #{m}"}
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
data/lib/dplyr/stage.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
module Dplyr
|
2
|
+
class Stage
|
3
|
+
|
4
|
+
attr_accessor :config_proc
|
5
|
+
|
6
|
+
def initialize(name)
|
7
|
+
@name = name.to_sym
|
8
|
+
@hosts = []
|
9
|
+
@parallel_runs = 1
|
10
|
+
end
|
11
|
+
|
12
|
+
def data
|
13
|
+
finalize
|
14
|
+
return ({
|
15
|
+
parallel_runs: @parallel_runs,
|
16
|
+
hosts: @hosts,
|
17
|
+
env: {}
|
18
|
+
})
|
19
|
+
end
|
20
|
+
|
21
|
+
def host(host, user: nil, dir: nil, id: nil)
|
22
|
+
@hosts << ({
|
23
|
+
host: host,
|
24
|
+
user: user,
|
25
|
+
dir: dir,
|
26
|
+
id: id || host
|
27
|
+
})
|
28
|
+
end
|
29
|
+
|
30
|
+
def dir(dir)
|
31
|
+
@dir = dir
|
32
|
+
end
|
33
|
+
|
34
|
+
def user(user)
|
35
|
+
@user = user
|
36
|
+
end
|
37
|
+
|
38
|
+
def parallel_runs(parallel_runs)
|
39
|
+
@parallel_runs = parallel_runs
|
40
|
+
end
|
41
|
+
|
42
|
+
def fill_hosts
|
43
|
+
@hosts.each do |host|
|
44
|
+
host[:user] ||= fetch(:user)
|
45
|
+
host[:dir] ||= fetch(:dir)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
alias_method :deploy_dir, :dir
|
50
|
+
|
51
|
+
def fetch(var)
|
52
|
+
value = instance_variable_get("@#{var}")
|
53
|
+
raise "error accessing var #{var} for stage #{name}" if not value
|
54
|
+
return value
|
55
|
+
end
|
56
|
+
|
57
|
+
def finalize
|
58
|
+
return if @finalized
|
59
|
+
instance_eval &config_proc if config_proc
|
60
|
+
fill_hosts
|
61
|
+
@hosts.freeze
|
62
|
+
@parallel_runs.freeze
|
63
|
+
@finalized = true
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'dply/helper'
|
2
|
+
require 'dplyr/stage'
|
3
|
+
|
4
|
+
module Dplyr
|
5
|
+
class StagesConfig
|
6
|
+
|
7
|
+
include ::Dply::Helper
|
8
|
+
attr_reader :config_file
|
9
|
+
attr_accessor :current_stage
|
10
|
+
|
11
|
+
def initialize(config_file = nil)
|
12
|
+
@config_file = config_file || "stages.rb"
|
13
|
+
@stages = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def stage(name, &block)
|
17
|
+
name = name.to_sym
|
18
|
+
stage = Stage.new(name)
|
19
|
+
stage.config_proc = block
|
20
|
+
@stages[name] = stage
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_from_file
|
24
|
+
return if @read
|
25
|
+
error "#{config_file} not readable" if not File.readable? config_file
|
26
|
+
instance_eval(File.read(config_file), config_file)
|
27
|
+
rescue NoMethodError => e
|
28
|
+
error "invalid option used in config: #{e.name} #{e.message}"
|
29
|
+
ensure
|
30
|
+
@read = true
|
31
|
+
end
|
32
|
+
|
33
|
+
def fetch(stage)
|
34
|
+
read_from_file
|
35
|
+
@stages[stage.to_sym]
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'dply/helper'
|
2
|
+
module Dplyr
|
3
|
+
class TasksConfig
|
4
|
+
|
5
|
+
include ::Dply::Helper
|
6
|
+
|
7
|
+
def initialize(config_file)
|
8
|
+
@config_file = config_file || "tasks.rb"
|
9
|
+
@tasks = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def task(name, &block)
|
13
|
+
@tasks[name.to_sym] = block
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_task
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def read_from_file
|
23
|
+
if not File.readable? @config_file
|
24
|
+
error "#{config_file} not readable"
|
25
|
+
return
|
26
|
+
end
|
27
|
+
instance_eval(File.read(config_file), config_file)
|
28
|
+
rescue NoMethodError => e
|
29
|
+
error "invalid option used in config: #{e.name} #{e.message}"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dply
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neeraj
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ruby-elf
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ruby-filemagic
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.6'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.6'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -51,6 +79,7 @@ files:
|
|
51
79
|
- LICENSE.txt
|
52
80
|
- README.md
|
53
81
|
- Rakefile
|
82
|
+
- TODO
|
54
83
|
- bin/dplyr
|
55
84
|
- bin/drake
|
56
85
|
- code_dump/alt_remote_task.rb
|
@@ -67,13 +96,15 @@ files:
|
|
67
96
|
- lib/dply/build_config.rb
|
68
97
|
- lib/dply/bundle.rb
|
69
98
|
- lib/dply/cli/build.rb
|
99
|
+
- lib/dply/cli/depcheck.rb
|
70
100
|
- lib/dply/cli/deploy.rb
|
101
|
+
- lib/dply/cli/install_pkgs.rb
|
71
102
|
- lib/dply/cli/reload.rb
|
72
103
|
- lib/dply/config.rb
|
73
104
|
- lib/dply/config_downloader.rb
|
74
105
|
- lib/dply/config_struct.rb
|
75
106
|
- lib/dply/custom_logger.rb
|
76
|
-
- lib/dply/
|
107
|
+
- lib/dply/deplist.rb
|
77
108
|
- lib/dply/error.rb
|
78
109
|
- lib/dply/ext/string.rb
|
79
110
|
- lib/dply/git.rb
|
@@ -82,20 +113,25 @@ files:
|
|
82
113
|
- lib/dply/linker.rb
|
83
114
|
- lib/dply/lock.rb
|
84
115
|
- lib/dply/logger.rb
|
116
|
+
- lib/dply/pkgs_config.rb
|
85
117
|
- lib/dply/release.rb
|
86
|
-
- lib/dply/remote_task.rb
|
87
118
|
- lib/dply/repo.rb
|
88
|
-
- lib/dply/
|
119
|
+
- lib/dply/rpm.rb
|
89
120
|
- lib/dply/setup.rb
|
90
121
|
- lib/dply/shared_dirs.rb
|
91
122
|
- lib/dply/shell.rb
|
92
|
-
- lib/dply/stages_config.rb
|
93
123
|
- lib/dply/strategy.rb
|
94
124
|
- lib/dply/strategy/archive.rb
|
95
125
|
- lib/dply/strategy/git.rb
|
96
126
|
- lib/dply/tasks.rb
|
97
127
|
- lib/dply/version.rb
|
98
128
|
- lib/dply/yum.rb
|
129
|
+
- lib/dplyr/cli.rb
|
130
|
+
- lib/dplyr/remote_task.rb
|
131
|
+
- lib/dplyr/report.rb
|
132
|
+
- lib/dplyr/stage.rb
|
133
|
+
- lib/dplyr/stages_config.rb
|
134
|
+
- lib/dplyr/tasks_config.rb
|
99
135
|
homepage: ''
|
100
136
|
licenses:
|
101
137
|
- MIT
|
data/lib/dply/stages_config.rb
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
require 'dply/helper'
|
2
|
-
|
3
|
-
module Dply
|
4
|
-
class StagesConfig
|
5
|
-
|
6
|
-
include Helper
|
7
|
-
attr_reader :config_file
|
8
|
-
attr_accessor :current_stage
|
9
|
-
|
10
|
-
def initialize(config_file)
|
11
|
-
@config_file = config_file
|
12
|
-
end
|
13
|
-
|
14
|
-
def config
|
15
|
-
return @config if @config
|
16
|
-
@config = {
|
17
|
-
stages: {}
|
18
|
-
}
|
19
|
-
read_from_file
|
20
|
-
@config
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
def user(user)
|
25
|
-
set_in_current_stage :user, user
|
26
|
-
end
|
27
|
-
|
28
|
-
def deploy_dir(deploy_dir)
|
29
|
-
set_in_current_stage :deploy_dir, deploy_dir
|
30
|
-
end
|
31
|
-
|
32
|
-
def host(host, user: nil, deploy_dir: nil, id: nil)
|
33
|
-
hosts = get_from_current_stage(:hosts)
|
34
|
-
host_info = {
|
35
|
-
host: host,
|
36
|
-
user: user || get_from_current_stage(:user),
|
37
|
-
deploy_dir: deploy_dir || get_from_current_stage(:deploy_dir),
|
38
|
-
id: id || host
|
39
|
-
}
|
40
|
-
hosts << host_info
|
41
|
-
end
|
42
|
-
|
43
|
-
def parallel_runs(parallel_runs)
|
44
|
-
set_in_current_stage :parallel_runs, parallel_runs
|
45
|
-
end
|
46
|
-
|
47
|
-
def set_in_current_stage(key, value)
|
48
|
-
stages[current_stage][key] = value
|
49
|
-
end
|
50
|
-
|
51
|
-
def get_from_current_stage(key)
|
52
|
-
stages[current_stage][key]
|
53
|
-
end
|
54
|
-
|
55
|
-
def stages
|
56
|
-
config[:stages]
|
57
|
-
end
|
58
|
-
|
59
|
-
def get_stage(stage)
|
60
|
-
stage = stage.to_sym
|
61
|
-
config[:stages][stage]
|
62
|
-
end
|
63
|
-
|
64
|
-
def stage(name)
|
65
|
-
begin
|
66
|
-
name = name.to_sym
|
67
|
-
self.current_stage = name
|
68
|
-
init_stage name
|
69
|
-
yield
|
70
|
-
ensure
|
71
|
-
self.current_stage = nil
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def ask(key)
|
76
|
-
print "Enter #{key}: "
|
77
|
-
value = STDIN.gets.chomp
|
78
|
-
env = get_from_current_stage(:env)
|
79
|
-
env[key] = value
|
80
|
-
end
|
81
|
-
|
82
|
-
def init_stage(name)
|
83
|
-
stages[name] = {
|
84
|
-
hosts: [],
|
85
|
-
parallel_runs: 1,
|
86
|
-
env: {}
|
87
|
-
}
|
88
|
-
end
|
89
|
-
|
90
|
-
|
91
|
-
def read_from_file
|
92
|
-
if not File.readable? config_file
|
93
|
-
error "#{config_file} not readable"
|
94
|
-
return
|
95
|
-
end
|
96
|
-
instance_eval(File.read(config_file), config_file)
|
97
|
-
rescue NoMethodError => e
|
98
|
-
error "invalid option used in config: #{e.name} #{e.message}"
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
|
-
end
|
103
|
-
end
|