inprovise-fork 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZmQyNThhZmIwOTkzOGJiYzU2NDk1ZjRmZTEyODAzYzk4NTI3Y2E1Ng==
5
+ data.tar.gz: !binary |-
6
+ OGU1MzRiNWM4MGE3NzhmZTMwMjJiMTM1NGJkZjI4YzU3NDMxMDg5Yg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZDc4MDJjYTAwNGY4ZGU5N2MwMzU2MjhjMDNmYWNiNDgzMmE5YTc4N2NiN2I1
10
+ N2NiOWE2YjFiMGMyZTBjYjQzN2FjYWI5YzExZTJjZDg3N2U2YTcwMTNlNTg0
11
+ MjY0MmMwYzI2ZjA1ZDc2OWQ0MTg1MWEzZDdiZjE4YTJlNDAzY2U=
12
+ data.tar.gz: !binary |-
13
+ ZWFjMTdmNWE1YmNhZjQ5ZjU4ODRkZmI2MWIyZTYzMTg1MTdmMzg5ZjI5NTBm
14
+ MWIzZGNiNzg3YmQwMDgwNzIwNjAyNGFjMTU0MWI2ZGY4MTc5YjdkYzVjMWMx
15
+ MWRiMzdlOTVmY2JjMWJlYTAxYTJiMTZhOTk2ZDA1MDVhNzlhMzM=
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+
2
+ .*
3
+ pkg/*.gem
4
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,28 @@
1
+ before_install:
2
+ - gem install bundler
3
+ bundler_args: "--verbose"
4
+ script: rake test
5
+ rvm:
6
+ - 2.0.0
7
+ - 2.1
8
+ - 2.2
9
+ - 2.3.1
10
+ - ruby-head
11
+ gemfile:
12
+ - Gemfile
13
+ matrix:
14
+ allow_failures:
15
+ - rvm: ruby-head
16
+ env: CODECLIMATE_REPO_TOKEN=3733be865016cababd969f8888810daf54fa824d10b126a2fec6123e8a21e2f5
17
+ bundle exec rake
18
+ addons:
19
+ code_climate:
20
+ repo_token: 3733be865016cababd969f8888810daf54fa824d10b126a2fec6123e8a21e2f5
21
+ deploy:
22
+ provider: rubygems
23
+ api_key:
24
+ secure: g5mnJR1siaBstvvifQVgJZRUcwLYLx5DeLimXMoRBJV2llBiZevSt6Heo4MgvWeNjvh6fRsp5NOhfXKDbLaxS6FLt+5buIMfYBFqJnFjzFoGf4PZj8Zd0XA3SGW82SGfFaHJepykGN7Jx9sOXwEBsbdEbssfiYqvm/uhpew7cAv5le9V3SVLqLsQnN5NwFkbgdHgrD2z1IkOhudkt2b9VZygg8Hj8WimLXq39+bc6eDz1xOV/q9N87r0lnZZqWI2HEL7MAA0pNkX3F8ca27BIe+VSQ9rNCYCmDrzHFpU3R+XjvjlVuv6i5lpQhRZBZCeOSI4/v69PQSosAovC5fIthW2h4XeS2XYHnYszeZKKwbfab8rjt9Mw6fWH3Y3FSMcvKAMNwuTpTYAVDvqLalfpzirryqT/a7Lwi2Hg2LqdoYuhoFrMP8q3vjB+LhxX+4tmTJI/2lt4LaR2HsKRSTZrgGWIr7re57onsSlZIcAXHdmIyXCuh5O9zHn2Bbv4XpAoyVUi7hDmR64oNncn3zTFGOyu6na2BnImoI/mQLm/BxnsQjeaYlV20MPA+Y5kXRhkIyaZzktjsQ+91JRp0JXzxl+cn1ozT1kVsGG8pFNJ0iXKRzy3/Xfcs0OAx6S0nCc7kVyUM2gV6BYvpADoQPm+Uquv7gC0zfjTWW08BBfERA=
25
+ gemspec: inprovise-fork.gemspec
26
+ on:
27
+ tags: true
28
+ repo: mcorino/Inprovise-Fork
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'rake'
6
+ gem 'minitest'
7
+ gem 'mocha', :require => false
8
+
9
+ gem "codeclimate-test-reporter", group: :test, require: nil
data/README.md ADDED
@@ -0,0 +1,120 @@
1
+
2
+ Inprovise Fork
3
+ ==============
4
+
5
+ This project implements an extension for the Inprovise provisioning tool providing a `fork` method to the execution contexts
6
+ of Inprovise scripts allowing scripts to fork off provisioning commands (`apply`, `revert`, `validate` or `trigger`) for
7
+ other nodes.
8
+
9
+ [![Build Status](https://travis-ci.org/mcorino/Inprovise-Fork.png)](https://travis-ci.org/mcorino/Inprovise-Fork)
10
+ [![Code Climate](https://codeclimate.com/github/mcorino/Inprovise-Fork/badges/gpa.png)](https://codeclimate.com/github/mcorino/Inprovise-Fork)
11
+ [![Test Coverage](https://codeclimate.com/github/mcorino/Inprovise-Fork/badges/coverage.png)](https://codeclimate.com/github/mcorino/Inprovise-Fork/coverage)
12
+ [![Gem Version](https://badge.fury.io/rb/inprovise-fork.png)](https://badge.fury.io/rb/inprovise-fork)
13
+
14
+ Installation
15
+ ------------
16
+
17
+ $ gem install inprovise-fork
18
+
19
+ Usage
20
+ -----
21
+
22
+ Add the following to (for example) your Inprovise project's `rigrc` file.
23
+
24
+ ````ruby
25
+ require 'inprovise/fork'
26
+ ````
27
+
28
+ Syntax
29
+ ------
30
+
31
+ ````ruby
32
+ fork(mode = :sync).apply('script', 'name'[, 'name'[, ...]][, config={}])
33
+ fork(mode = :sync).revert('script', 'name'[, 'name'[, ...]][, config={}])
34
+ fork(mode = :sync).validate('script', 'name'[, 'name'[, ...]][, config={}])
35
+ fork(mode = :sync).trigger('action', 'name'[, 'name'[, ...]][, config={}])
36
+ ````
37
+
38
+ or
39
+
40
+ ````ruby
41
+ fork(mode = :sync) do
42
+ apply('script', 'name'[, 'name'[, ...]][, config={}])
43
+ end
44
+ fork(mode = :sync) do
45
+ revert('script', 'name'[, 'name'[, ...]][, config={}])
46
+ end
47
+ fork(mode = :sync) do
48
+ validate('script', 'name'[, 'name'[, ...]][, config={}])
49
+ end
50
+ fork(mode = :sync) do
51
+ trigger('action', 'name'[, 'name'[, ...]][, config={}])
52
+ end
53
+ ````
54
+
55
+ The `mode` argument can be `:sync` (default) or `:async`. With the first the provisioning methods will not return
56
+ until the provisioning process they kicked off has finished. With the latter the provisioning methods kick off the
57
+ provisioning process in parallel and return immediately.
58
+
59
+ The provisioning methods return a reference to the forking execution context allowing provisioning methods to be
60
+ chained like:
61
+
62
+ ````ruby
63
+ fork.apply('script', 'node1').trigger('action', 'node1')
64
+
65
+ ````
66
+
67
+ Example
68
+ -------
69
+
70
+ By combining the [Inprovise-VBox](https://github.com/mcorino/Inprovise-VBox) plugin and the [Inprovise-Fork](https://github.com/mcorino/Inprovise-Fork) plugin
71
+ provisioning scripts could add a virtual machine on a host server, register an Inprovise node and provision that new node with a single
72
+ `rig` command using a scheme like this:
73
+
74
+ ````ruby
75
+ # assumes rigrc has been defined with
76
+ # require 'inprovise/vbox' and
77
+ # require 'inprovise/fork'
78
+
79
+ include 'rubysetup.rb' # includes a scheme defining scripts to control ruby provisioning dependencies
80
+
81
+ script 'vmSetup' do
82
+
83
+ validate do
84
+ # check node setup
85
+ trigger 'gem:exists', 'rails'
86
+ end
87
+
88
+ apply do
89
+ trigger 'gem:install', 'rails'
90
+ end
91
+
92
+ revert do
93
+ trigger 'gem:uninstall', 'rails'
94
+ end
95
+
96
+ end
97
+
98
+
99
+ vbox 'myVM' do
100
+ configuration ({
101
+ :name => 'MyVM',
102
+ :image => '/remote/image/path/MyVM.qcow2',
103
+ :memory => 1024,
104
+ :cpus => 2
105
+ })
106
+
107
+ apply do
108
+ fork(:async).apply('vmSetup', 'MyVM')
109
+ end
110
+
111
+ revert do
112
+ # in real life you may not want to do this to be able to reinstate
113
+ # the VM faster with all setup already in place
114
+ fork(:sync).revert('vmSetup', 'MyVM')
115
+ end
116
+ end
117
+
118
+ end
119
+
120
+ ````
data/Rakefile.rb ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.pattern = 'test/**/*_test.rb'
7
+ end
8
+
9
+ task :default => :test
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__), 'lib/inprovise/fork/version')
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.authors = ["Martin Corino"]
5
+ gem.email = ["mcorino@remedy.nl"]
6
+ gem.description = %q{Fork extension for Inprovise scripts}
7
+ gem.summary = %q{Simple, easy and intuitive virtual machine provisioning}
8
+ gem.homepage = ""
9
+
10
+ gem.files = `git ls-files`.split($\)
11
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
12
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
+ gem.name = "inprovise-fork"
14
+ gem.require_paths = ["lib"]
15
+ gem.version = Inprovise::Fork::VERSION
16
+ gem.add_dependency('inprovise')
17
+ gem.post_install_message = ''
18
+ end
@@ -0,0 +1,72 @@
1
+ # Fork support for Inprovise scripts
2
+ #
3
+ # Author:: Martin Corino
4
+ # License:: Distributes under the same license as Ruby
5
+
6
+ module Inprovise::Fork
7
+
8
+ module ContextDSLExt
9
+ def fork(mode=:sync, &action)
10
+ fork = Inprovise::Fork::DSL.new(@context, mode)
11
+ fork.instance_eval(&action) if block_given?
12
+ fork
13
+ end
14
+ end
15
+
16
+ Inprovise::ExecutionContext::DSL.send(:include, ContextDSLExt)
17
+
18
+ class DSL
19
+
20
+ def initialize(context, mode)
21
+ @context = context
22
+ @async = mode == :async
23
+ end
24
+
25
+ def verify_targets(*names)
26
+ if names.any? { |name| @context.node.name == name || Inprovise::Infrastructure.find(name).includes?(@context.node.name) }
27
+ raise ArgumentError, "Not allowed to fork for same node as running context : #{@context.node.name}"
28
+ end
29
+ end
30
+ private :verify_targets
31
+
32
+ def run_command(cmd, script_or_action, *args)
33
+ config = Hash === args.last ? args.pop : {}
34
+ verify_targets(*args)
35
+ if @async
36
+ Inprovise::Controller.run_provisioning_command(cmd, script_or_action, config, *args)
37
+ else
38
+ ctrl = Inprovise::Controller.new
39
+ ctrl.run_provisioning_command(cmd, script_or_action, config, *args)
40
+ ctrl.wait
41
+ end
42
+ self
43
+ end
44
+ private :run_command
45
+
46
+ def config
47
+ @context.config
48
+ end
49
+
50
+ def method_missing(meth, *args)
51
+ @context.config.send(meth, *args)
52
+ end
53
+
54
+ def apply(script, *args)
55
+ run_command(:apply, script, *args)
56
+ end
57
+
58
+ def revert(script, *args)
59
+ run_command(:revert, script, *args)
60
+ end
61
+
62
+ def validate(script, *args)
63
+ run_command(:validate, script, *args)
64
+ end
65
+
66
+ def trigger(action, *args)
67
+ run_command(:trigger, action, *args)
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -0,0 +1,10 @@
1
+ # Version for InproviseFork
2
+ #
3
+ # Author:: Martin Corino
4
+ # License:: Distributes under the same license as Ruby
5
+
6
+ module Inprovise; module Fork
7
+
8
+ VERSION = '0.2.1'
9
+
10
+ end; end
@@ -0,0 +1,10 @@
1
+ # Main loader for Inprovise::Fork
2
+ #
3
+ # Author:: Martin Corino
4
+ # License:: Distributes under the same license as Ruby
5
+
6
+ require 'rubygems'
7
+ require 'inprovise'
8
+
9
+ require_relative './fork/version'
10
+ require_relative './fork/fork'
@@ -0,0 +1 @@
1
+ # default test scheme
data/test/fork_test.rb ADDED
@@ -0,0 +1,141 @@
1
+ # Script tests for Inprovise::Fork
2
+ #
3
+ # Author:: Martin Corino
4
+ # License:: Distributes under the same license as Ruby
5
+
6
+ require_relative 'test_helper'
7
+
8
+ describe Inprovise::Fork do
9
+
10
+ before :each do
11
+ @node = Inprovise::Infrastructure::Node.new('myNode', {channel: 'test', helper: 'test'})
12
+ @node2 = Inprovise::Infrastructure::Node.new('myNode2', {channel: 'test', helper: 'test'})
13
+ @script = Inprovise::DSL.script('myScript') {}
14
+ end
15
+
16
+ after :each do
17
+ reset_script_index!
18
+ reset_infrastructure!
19
+ end
20
+
21
+ describe Inprovise::Fork::DSL do
22
+
23
+ describe 'fork' do
24
+
25
+ before :each do
26
+ @fork_dsl = Inprovise::Fork::DSL.new(nil, :sync)
27
+ @runner = Inprovise::ScriptRunner.new(@node, 'myScript')
28
+ end
29
+
30
+ it 'supports forking apply' do
31
+ @fork_dsl.expects(:run_command).with(:apply, 'anotherScript', 'myNode2')
32
+ @script.apply { fork.apply('anotherScript', 'myNode2') }
33
+ Inprovise::Fork::DSL.stub(:new, @fork_dsl) do
34
+ @runner.execute(:apply)
35
+ end
36
+ end
37
+
38
+ it 'supports forking revert' do
39
+ @fork_dsl.expects(:run_command).with(:revert, 'anotherScript', 'myNode2')
40
+ @script.revert { fork.revert('anotherScript', 'myNode2') }
41
+ Inprovise::Fork::DSL.stub(:new, @fork_dsl) do
42
+ @runner.execute(:revert)
43
+ end
44
+ end
45
+
46
+ it 'supports forking validate' do
47
+ @fork_dsl.expects(:run_command).with(:validate, 'anotherScript', 'myNode2')
48
+ @script.validate { fork.validate('anotherScript', 'myNode2'); true }
49
+ Inprovise::Fork::DSL.stub(:new, @fork_dsl) do
50
+ @runner.execute(:validate)
51
+ end
52
+ end
53
+
54
+ it 'supports forking trigger' do
55
+ @fork_dsl.expects(:run_command).with(:trigger, 'anotherScript:action[arg]', 'myNode2')
56
+ @script.apply { fork.trigger('anotherScript:action[arg]', 'myNode2') }
57
+ Inprovise::Fork::DSL.stub(:new, @fork_dsl) do
58
+ @runner.execute(:apply)
59
+ end
60
+ end
61
+
62
+ it 'executes a forked script' do
63
+ @script2 = Inprovise::DSL.script('anotherScript') { apply { config[:myMockup].do_something('test') } }
64
+ @script.apply { fork.apply('anotherScript', 'myNode2', {:myMockup => config[:myMockup]}) }
65
+ @mockObj = mock
66
+ @mockObj.expects(:do_something).with('test')
67
+ @runner.execute(:apply, {:myMockup => @mockObj})
68
+ end
69
+
70
+ end
71
+
72
+ describe 'fork block' do
73
+
74
+ before :each do
75
+ @fork_dsl = Inprovise::Fork::DSL.new(nil, :sync)
76
+ @runner = Inprovise::ScriptRunner.new(@node, 'myScript')
77
+ end
78
+
79
+ it 'supports forking apply' do
80
+ @fork_dsl.expects(:run_command).with(:apply, 'anotherScript', 'myNode2')
81
+ @script.apply { fork { apply('anotherScript', 'myNode2') } }
82
+ Inprovise::Fork::DSL.stub(:new, @fork_dsl) do
83
+ @runner.execute(:apply)
84
+ end
85
+ end
86
+
87
+ it 'supports forking revert' do
88
+ @fork_dsl.expects(:run_command).with(:revert, 'anotherScript', 'myNode2')
89
+ @script.revert { fork { revert('anotherScript', 'myNode2') } }
90
+ Inprovise::Fork::DSL.stub(:new, @fork_dsl) do
91
+ @runner.execute(:revert)
92
+ end
93
+ end
94
+
95
+ it 'supports forking validate' do
96
+ @fork_dsl.expects(:run_command).with(:validate, 'anotherScript', 'myNode2')
97
+ @script.validate { fork { validate('anotherScript', 'myNode2') }; true }
98
+ Inprovise::Fork::DSL.stub(:new, @fork_dsl) do
99
+ @runner.execute(:validate)
100
+ end
101
+ end
102
+
103
+ it 'supports forking trigger' do
104
+ @fork_dsl.expects(:run_command).with(:trigger, 'anotherScript:action[arg]', 'myNode2')
105
+ @script.apply { fork { trigger('anotherScript:action[arg]', 'myNode2') } }
106
+ Inprovise::Fork::DSL.stub(:new, @fork_dsl) do
107
+ @runner.execute(:apply)
108
+ end
109
+ end
110
+
111
+ it 'executes a forked script' do
112
+ @script2 = Inprovise::DSL.script('anotherScript') { apply { config[:myMockup].do_something('test') } }
113
+ @script.apply { fork { apply('anotherScript', 'myNode2', {:myMockup => config[:myMockup]}) } }
114
+ @mockObj = mock
115
+ @mockObj.expects(:do_something).with('test')
116
+ @runner.execute(:apply, {:myMockup => @mockObj})
117
+ end
118
+
119
+ end
120
+
121
+ describe 'checks target' do
122
+
123
+ before :each do
124
+ @fork_dsl = Inprovise::Fork::DSL.new(nil, :sync)
125
+ @runner = Inprovise::ScriptRunner.new(@node, 'myScript')
126
+ end
127
+
128
+ it 'does not allow fork for active node' do
129
+ @script2 = Inprovise::DSL.script('anotherScript') { apply { config[:myMockup].do_something('test') } }
130
+ @script.apply { fork.apply('anotherScript', 'myNode', {:myMockup => config[:myMockup]}) }
131
+ @mockObj = mock
132
+ assert_raises ArgumentError do
133
+ @runner.execute(:apply, {:myMockup => @mockObj})
134
+ end
135
+ end
136
+
137
+ end
138
+
139
+ end
140
+
141
+ end
@@ -0,0 +1,238 @@
1
+ # Test helper for Inprovise::Fork
2
+ #
3
+ # Author:: Martin Corino
4
+ # License:: Distributes under the same license as Ruby
5
+ require "codeclimate-test-reporter"
6
+ CodeClimate::TestReporter.start
7
+
8
+ gem 'minitest'
9
+ require 'minitest/autorun'
10
+ require 'mocha/setup'
11
+ gem 'inprovise'
12
+ require_relative '../lib/inprovise/fork'
13
+
14
+ # force root file
15
+ ENV['INPROVISE_INFRA'] = File.join(File.dirname(__FILE__), 'fixtures', Inprovise::INFRA_FILE)
16
+
17
+ def reset_script_index!
18
+ Inprovise::ScriptIndex.default.clear!
19
+ end
20
+
21
+ def reset_infrastructure!
22
+ Inprovise::Infrastructure.reset
23
+ end
24
+
25
+ # patch Infrastructure#load and #save to do nothing
26
+ module Inprovise::Infrastructure
27
+ class << self
28
+ def load
29
+ # noop
30
+ end
31
+ def save
32
+ # noop
33
+ end
34
+
35
+ # add reset
36
+ def reset
37
+ targets.synchronize do
38
+ targets.clear
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ # create mock test channel
45
+
46
+ Inprovise::CmdChannel.define('test') do
47
+
48
+ def initialize(node, user=nil)
49
+ @node = node
50
+ @user = user || node.user
51
+ end
52
+
53
+ # command execution
54
+
55
+ def run(command, forcelog=false)
56
+ @node.log.execute("RUN: #{command}") if Inprovise.verbosity > 0
57
+ "RUN: #{command}"
58
+ end
59
+
60
+ # file management
61
+
62
+ def upload(from, to)
63
+ @node.log.execute("UPLOAD: #{from} => #{to}") if Inprovise.verbosity > 0
64
+ end
65
+
66
+ def download(from, to)
67
+ @node.log.execute("DOWNLOAD: #{from} => #{to}") if Inprovise.verbosity > 0
68
+ end
69
+
70
+ def mkdir(path)
71
+ @node.log.execute("MKDIR: #{path}") if Inprovise.verbosity > 0
72
+ end
73
+
74
+ def exists?(path)
75
+ @node.log.execute("EXISTS?: #{path}") if Inprovise.verbosity > 0
76
+ true
77
+ end
78
+
79
+ def file?(path)
80
+ @node.log.execute("FILE?: #{path}") if Inprovise.verbosity > 0
81
+ true
82
+ end
83
+
84
+ def directory?(path)
85
+ @node.log.execute("DIRECTORY?: #{path}") if Inprovise.verbosity > 0
86
+ true
87
+ end
88
+
89
+ def content(path)
90
+ @node.log.execute("READ: #{path}") if Inprovise.verbosity > 0
91
+ "READ: #{path}"
92
+ end
93
+
94
+ def delete(path)
95
+ @node.log.execute("DELETE: #{path}") if Inprovise.verbosity > 0
96
+ end
97
+
98
+ def permissions(path)
99
+ @node.log.execute("PERMISSIONS: #{path}") if Inprovise.verbosity > 0
100
+ 0
101
+ end
102
+
103
+ def set_permissions(path, perm)
104
+ @node.log.execute("SETPERMISSIONS: #{path} #{perm}") if Inprovise.verbosity > 0
105
+ end
106
+
107
+ def owner(path)
108
+ @node.log.execute("OWNER: #{path}") if Inprovise.verbosity > 0
109
+ {:user => @user, :group => 'users'}
110
+ end
111
+
112
+ def set_owner(path, user, group=nil)
113
+ @node.log.execute("SET_OWNER: #{path} #{user} #{group}") if Inprovise.verbosity > 0
114
+ end
115
+
116
+ end
117
+
118
+ # create mock test helper
119
+
120
+ Inprovise::CmdHelper.define('test') do
121
+
122
+ def initialize(channel, sudo=false)
123
+ super(channel)
124
+ end
125
+
126
+ # platform properties
127
+
128
+ def admin_user
129
+ 'root'
130
+ end
131
+
132
+ def env_reference(varname)
133
+ "\$#{varname}"
134
+ end
135
+
136
+ # generic command execution
137
+
138
+ def sudo
139
+ return self
140
+ end
141
+
142
+ # basic commands
143
+
144
+ def echo(arg)
145
+ run("echo #{arg}")
146
+ end
147
+
148
+ def cat(path)
149
+ begin
150
+ @channel.content(path)
151
+ rescue
152
+ run("cat #{path}")
153
+ end
154
+ end
155
+
156
+ def hash_for(path)
157
+ Digest::SHA1.hexdigest(run("sha1sum #{path}"))
158
+ end
159
+
160
+ def mkdir(path)
161
+ run("mkdir -p #{path}")
162
+ end
163
+
164
+ def exists?(path)
165
+ begin
166
+ @channel.exists?(path)
167
+ rescue
168
+ run(%{if [ -f #{path} ]; then echo "true"; else echo "false"; fi}).strip == 'true'
169
+ end
170
+ end
171
+
172
+ def file?(path)
173
+ begin
174
+ @channel.file?(path)
175
+ rescue
176
+ (run("stat --format=%f #{path}").chomp.hex & 0x8000) == 0x8000
177
+ end
178
+ end
179
+
180
+ def directory?(path)
181
+ begin
182
+ @channel.file?(path)
183
+ rescue
184
+ (run("stat --format=%f #{path}").chomp.hex & 0x4000) == 0x4000
185
+ end
186
+ end
187
+
188
+ def copy(from, to)
189
+ run("cp #{from} #{to}")
190
+ end
191
+
192
+ def delete(path)
193
+ begin
194
+ @channel.delete(path)
195
+ rescue
196
+ run("rm #{path}")
197
+ end
198
+ end
199
+
200
+ def permissions(path)
201
+ begin
202
+ @channel.permissions(path)
203
+ rescue
204
+ run("stat --format=%a #{path}").strip.to_i(8)
205
+ end
206
+ end
207
+
208
+ def set_permissions(path, perm)
209
+ begin
210
+ @channel.set_permissions(path, perm)
211
+ rescue
212
+ run("chmod -R #{sprintf("%o",perm)} #{path}")
213
+ end
214
+ end
215
+
216
+ def owner(path)
217
+ begin
218
+ @channel.owner(path)
219
+ rescue
220
+ user, group = run("stat --format=%U:%G #{path}").chomp.split(":")
221
+ {:user => user, :group => group}
222
+ end
223
+ end
224
+
225
+ def set_owner(path, user, group=nil)
226
+ begin
227
+ @channel.set_owner(path, user, group)
228
+ rescue
229
+ run(%{chown -R #{user}#{group ? ":#{group}" : ''} #{path}})
230
+ end
231
+ end
232
+
233
+ def binary_exists?(bin)
234
+ run("which #{bin}") =~ /\/#{bin}/
235
+ end
236
+
237
+ end
238
+
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: inprovise-fork
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Martin Corino
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: inprovise
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Fork extension for Inprovise scripts
28
+ email:
29
+ - mcorino@remedy.nl
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - .gitignore
35
+ - .travis.yml
36
+ - Gemfile
37
+ - README.md
38
+ - Rakefile.rb
39
+ - inprovise-fork.gemspec
40
+ - lib/inprovise/fork.rb
41
+ - lib/inprovise/fork/fork.rb
42
+ - lib/inprovise/fork/version.rb
43
+ - test/fixtures/inprovise.rb
44
+ - test/fork_test.rb
45
+ - test/test_helper.rb
46
+ homepage: ''
47
+ licenses: []
48
+ metadata: {}
49
+ post_install_message: ''
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 2.4.5
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: Simple, easy and intuitive virtual machine provisioning
69
+ test_files:
70
+ - test/fixtures/inprovise.rb
71
+ - test/fork_test.rb
72
+ - test/test_helper.rb