marionette 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +5 -4
- data/bin/marionette +6 -2
- data/lib/marionette/connect.rb +7 -2
- data/lib/marionette/master.rb +90 -11
- data/lib/marionette/setup.rb +2 -2
- data/lib/marionette/version.rb +1 -1
- data/marionette.gemspec +1 -0
- metadata +23 -19
data/README.md
CHANGED
@@ -5,10 +5,11 @@ Marionette connects a headstartapp server instance (puppet node) to its
|
|
5
5
|
master and executes puppet runs on demand. Marionette uses fast and lightweight
|
6
6
|
0MQ <http://zeromq.org> messaging system.
|
7
7
|
|
8
|
-
From version 0.0.
|
9
|
-
From version 0.0.
|
10
|
-
From version 0.0.7 onward,
|
11
|
-
From version 0.0.
|
8
|
+
* From version 0.0.9 onward, Marionette.setup automatically run at connect.
|
9
|
+
* From version 0.0.8 onward, use puppet agent for puppet runs
|
10
|
+
* From version 0.0.7 onward, talk replaces send and receive.
|
11
|
+
* From version 0.0.7 onward, marionette reconnects after n-poll attempts (10 by default).
|
12
|
+
* From version 0.0.6 onward, marionette polls before receives.
|
12
13
|
|
13
14
|
|
14
15
|
Installation
|
data/bin/marionette
CHANGED
@@ -4,8 +4,12 @@ require 'rubygems'
|
|
4
4
|
require 'daemons'
|
5
5
|
require 'marionette'
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
options = nil
|
8
|
+
|
9
|
+
if ARGV.size > 1
|
10
|
+
tcp = ARGV[1] rescue nil
|
11
|
+
options = { :uri => tcp }
|
12
|
+
end
|
9
13
|
|
10
14
|
Daemons.run_proc('marionette',:dir_mode => :system, :log_output => true) do
|
11
15
|
HeadStartApp::Marionette::Connect.new(options).puppet
|
data/lib/marionette/connect.rb
CHANGED
@@ -15,8 +15,13 @@ module HeadStartApp
|
|
15
15
|
def initialize(options = nil)
|
16
16
|
|
17
17
|
# Set default(s)
|
18
|
-
|
19
|
-
|
18
|
+
if options.nil?
|
19
|
+
|
20
|
+
HeadStartApp::Marionette.setup() if not File.exists? "/etc/marionette.tcp"
|
21
|
+
options = { :uri => `cat /etc/marionette.tcp` }
|
22
|
+
|
23
|
+
end
|
24
|
+
|
20
25
|
# Set URI
|
21
26
|
@uri = URI(options[:uri])
|
22
27
|
|
data/lib/marionette/master.rb
CHANGED
@@ -18,26 +18,85 @@ module HeadStartApp
|
|
18
18
|
# Sends a msg to puppet node
|
19
19
|
# and stands by for a reply
|
20
20
|
# and processes reply
|
21
|
-
def talk(msg)
|
21
|
+
def talk(msg, send_guarantee = false, poll_guarantee = false)
|
22
22
|
|
23
23
|
# Initial connection to socket
|
24
24
|
@socket = socket_connect
|
25
|
+
@poll = true
|
25
26
|
|
26
|
-
#
|
27
|
-
|
27
|
+
# Initiate send
|
28
|
+
begin
|
29
|
+
|
30
|
+
# if send successful start polling
|
31
|
+
@socket.send_string Marshal.dump(msg), ZMQ::NOBLOCK
|
32
|
+
|
33
|
+
rescue
|
34
|
+
|
35
|
+
if send_guarantee
|
36
|
+
|
37
|
+
# Keep sending till successful
|
38
|
+
while true do
|
39
|
+
|
40
|
+
begin
|
41
|
+
|
42
|
+
@socket.send_string Marshal.dump(msg), ZMQ::NOBLOCK
|
43
|
+
break
|
44
|
+
|
45
|
+
rescue
|
46
|
+
|
47
|
+
# sleep half a second before next attempt
|
48
|
+
sleep 500
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
else
|
55
|
+
|
56
|
+
# don't poll if send failed and no guarantee
|
57
|
+
@poll = false
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
if poll?
|
64
|
+
|
65
|
+
options = {:max => 10, :interval => 500}
|
66
|
+
poller = Poller.new @socket, options
|
67
|
+
|
68
|
+
if not poller.pull? and poll_guarantee
|
69
|
+
|
70
|
+
# Repeat poll till reply receive-able
|
71
|
+
while true do
|
72
|
+
|
73
|
+
@socket = socket_reconnect(@socket)
|
74
|
+
poller = Poller.new @socket, options
|
75
|
+
break if poller.pull?
|
76
|
+
|
77
|
+
end
|
28
78
|
|
29
|
-
|
30
|
-
|
79
|
+
end
|
80
|
+
|
81
|
+
if poller.pull?
|
82
|
+
|
83
|
+
# Fetch reply
|
84
|
+
@reply = process_message(@socket.recv_string)
|
85
|
+
|
86
|
+
else
|
87
|
+
|
88
|
+
# Polled but no reply
|
89
|
+
@reply = "Polled #{options[:max]} times every #{options[:interval]} milliseconds but no reply."
|
31
90
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
@socket = socket_reconnect(@socket)
|
91
|
+
end
|
92
|
+
|
93
|
+
else
|
36
94
|
|
95
|
+
# Send failed
|
96
|
+
@reply = "Send failed!"
|
97
|
+
|
37
98
|
end
|
38
99
|
|
39
|
-
@reply = process_message(@socket.recv_string)
|
40
|
-
|
41
100
|
end
|
42
101
|
|
43
102
|
private
|
@@ -50,6 +109,10 @@ module HeadStartApp
|
|
50
109
|
|
51
110
|
end
|
52
111
|
|
112
|
+
def poll?
|
113
|
+
@poll
|
114
|
+
end
|
115
|
+
|
53
116
|
# Connect master to puppet socket
|
54
117
|
def socket_connect(uri = @uri)
|
55
118
|
|
@@ -79,6 +142,22 @@ module HeadStartApp
|
|
79
142
|
end
|
80
143
|
|
81
144
|
end
|
145
|
+
|
146
|
+
def send_successful
|
147
|
+
|
148
|
+
while true do
|
149
|
+
|
150
|
+
# Send the message and catch send failure
|
151
|
+
begin
|
152
|
+
|
153
|
+
@socket.send_string Marshal.dump(msg), ZMQ::NOBLOCK
|
154
|
+
|
155
|
+
rescue
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
82
161
|
|
83
162
|
class Poller < ZMQ::Poller
|
84
163
|
attr_accessor :pull, :reconnect
|
data/lib/marionette/setup.rb
CHANGED
@@ -5,8 +5,8 @@ module HeadStartApp
|
|
5
5
|
def setup(options={})
|
6
6
|
|
7
7
|
# Set default(s)
|
8
|
-
ip = `
|
9
|
-
options
|
8
|
+
ip = `ifconfig eth1 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`
|
9
|
+
options[:uri] = "tcp://#{ip.strip}:5555" if options.nil? or options[:uri].nil? or options[:uri].blank?
|
10
10
|
|
11
11
|
# Set up marionette as a service to start at boot.
|
12
12
|
# define task:
|
data/lib/marionette/version.rb
CHANGED
data/marionette.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.executables << 'marionette'
|
21
21
|
s.executables << 'marionette-setup'
|
22
|
+
s.add_dependency('puppet')
|
22
23
|
s.add_dependency('bundler')
|
23
24
|
s.add_dependency('facter')
|
24
25
|
s.add_dependency('zmq')
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: marionette
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
8
|
+
- 9
|
9
|
+
version: 0.0.9
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Dan Lee
|
@@ -19,89 +18,96 @@ date: 2011-01-17 00:00:00 -08:00
|
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
21
|
+
name: puppet
|
23
22
|
prerelease: false
|
24
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
24
|
none: false
|
26
25
|
requirements:
|
27
26
|
- - ">="
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
28
|
segments:
|
31
29
|
- 0
|
32
30
|
version: "0"
|
33
31
|
type: :runtime
|
34
32
|
version_requirements: *id001
|
35
33
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
34
|
+
name: bundler
|
37
35
|
prerelease: false
|
38
36
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
37
|
none: false
|
40
38
|
requirements:
|
41
39
|
- - ">="
|
42
40
|
- !ruby/object:Gem::Version
|
43
|
-
hash: 3
|
44
41
|
segments:
|
45
42
|
- 0
|
46
43
|
version: "0"
|
47
44
|
type: :runtime
|
48
45
|
version_requirements: *id002
|
49
46
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
47
|
+
name: facter
|
51
48
|
prerelease: false
|
52
49
|
requirement: &id003 !ruby/object:Gem::Requirement
|
53
50
|
none: false
|
54
51
|
requirements:
|
55
52
|
- - ">="
|
56
53
|
- !ruby/object:Gem::Version
|
57
|
-
hash: 3
|
58
54
|
segments:
|
59
55
|
- 0
|
60
56
|
version: "0"
|
61
57
|
type: :runtime
|
62
58
|
version_requirements: *id003
|
63
59
|
- !ruby/object:Gem::Dependency
|
64
|
-
name:
|
60
|
+
name: zmq
|
65
61
|
prerelease: false
|
66
62
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
63
|
none: false
|
68
64
|
requirements:
|
69
65
|
- - ">="
|
70
66
|
- !ruby/object:Gem::Version
|
71
|
-
hash: 3
|
72
67
|
segments:
|
73
68
|
- 0
|
74
69
|
version: "0"
|
75
70
|
type: :runtime
|
76
71
|
version_requirements: *id004
|
77
72
|
- !ruby/object:Gem::Dependency
|
78
|
-
name: ffi
|
73
|
+
name: ffi
|
79
74
|
prerelease: false
|
80
75
|
requirement: &id005 !ruby/object:Gem::Requirement
|
81
76
|
none: false
|
82
77
|
requirements:
|
83
78
|
- - ">="
|
84
79
|
- !ruby/object:Gem::Version
|
85
|
-
hash: 3
|
86
80
|
segments:
|
87
81
|
- 0
|
88
82
|
version: "0"
|
89
83
|
type: :runtime
|
90
84
|
version_requirements: *id005
|
91
85
|
- !ruby/object:Gem::Dependency
|
92
|
-
name:
|
86
|
+
name: ffi-rzmq
|
93
87
|
prerelease: false
|
94
88
|
requirement: &id006 !ruby/object:Gem::Requirement
|
95
89
|
none: false
|
96
90
|
requirements:
|
97
91
|
- - ">="
|
98
92
|
- !ruby/object:Gem::Version
|
99
|
-
hash: 3
|
100
93
|
segments:
|
101
94
|
- 0
|
102
95
|
version: "0"
|
103
96
|
type: :runtime
|
104
97
|
version_requirements: *id006
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: daemons
|
100
|
+
prerelease: false
|
101
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
type: :runtime
|
110
|
+
version_requirements: *id007
|
105
111
|
description: Marionette connects a headstartapp server instance (puppet node) to its master and executes puppet runs on demand. Marionette uses fast and lightweight 0MQ <http://zeromq.org> messaging system.
|
106
112
|
email:
|
107
113
|
- dan@headstartapp.com
|
@@ -143,7 +149,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
143
149
|
requirements:
|
144
150
|
- - ">="
|
145
151
|
- !ruby/object:Gem::Version
|
146
|
-
hash: 3
|
147
152
|
segments:
|
148
153
|
- 0
|
149
154
|
version: "0"
|
@@ -152,14 +157,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
157
|
requirements:
|
153
158
|
- - ">="
|
154
159
|
- !ruby/object:Gem::Version
|
155
|
-
hash: 3
|
156
160
|
segments:
|
157
161
|
- 0
|
158
162
|
version: "0"
|
159
163
|
requirements: []
|
160
164
|
|
161
165
|
rubyforge_project: marionette
|
162
|
-
rubygems_version: 1.
|
166
|
+
rubygems_version: 1.3.7
|
163
167
|
signing_key:
|
164
168
|
specification_version: 3
|
165
169
|
summary: 0MQ connection between puppet and master.
|