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 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.8 onward, use puppet agent for puppet runs
9
- From version 0.0.7 onward, talk replaces send and receive.
10
- From version 0.0.7 onward, marionette reconnects after n-poll attempts (10 by default).
11
- From version 0.0.6 onward, marionette polls before receives.
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
- tcp = ARGV[1] rescue nil
8
- options = { :uri => tcp } unless ARGV.nil?
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
@@ -15,8 +15,13 @@ module HeadStartApp
15
15
  def initialize(options = nil)
16
16
 
17
17
  # Set default(s)
18
- options = { :uri => `cat /etc/marionette.tcp` } if options.nil?
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
 
@@ -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
- # Repeat until talk succeeds.
27
- while true do
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
- # Send the message
30
- @socket.send_string Marshal.dump(msg)
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
- # Poll server until it is receive-able and re-poll if necessary
33
- poller = Poller.new @socket, {:max => 10, :interval => 500}
34
- break if poller.pull?
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
@@ -5,8 +5,8 @@ module HeadStartApp
5
5
  def setup(options={})
6
6
 
7
7
  # Set default(s)
8
- ip = `sudo /sbin/ifconfig eth1 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`
9
- options = { :uri => "tcp://#{ip.strip}:5555" } if options.nil?
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:
@@ -1,5 +1,5 @@
1
1
  module HeadStartApp
2
2
  module Marionette
3
- VERSION = "0.0.8"
3
+ VERSION = "0.0.9"
4
4
  end
5
5
  end
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
- hash: 15
5
- prerelease:
4
+ prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 0
9
- - 8
10
- version: 0.0.8
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: bundler
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: facter
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: zmq
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: ffi
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-rzmq
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: daemons
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.4.2
166
+ rubygems_version: 1.3.7
163
167
  signing_key:
164
168
  specification_version: 3
165
169
  summary: 0MQ connection between puppet and master.