marionette 0.0.1
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.
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +28 -0
- data/README.md +39 -0
- data/Rakefile +2 -0
- data/bin/marionette-master +9 -0
- data/bin/marionette-puppet +13 -0
- data/lib/marionette/connect.rb +58 -0
- data/lib/marionette/master.rb +51 -0
- data/lib/marionette/puppet.rb +111 -0
- data/lib/marionette/version.rb +5 -0
- data/lib/marionette.rb +1 -0
- data/marionette.gemspec +29 -0
- metadata +138 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
marionette (0.0.1)
|
5
|
+
daemons
|
6
|
+
ffi
|
7
|
+
ffi-rzmq
|
8
|
+
zmq
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: http://rubygems.org/
|
12
|
+
specs:
|
13
|
+
daemons (1.1.0)
|
14
|
+
ffi (1.0.4)
|
15
|
+
rake (>= 0.8.7)
|
16
|
+
ffi-rzmq (0.7.0)
|
17
|
+
rake (0.8.7)
|
18
|
+
zmq (2.1.0.1)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
daemons
|
25
|
+
ffi
|
26
|
+
ffi-rzmq
|
27
|
+
marionette!
|
28
|
+
zmq
|
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Headstartapp::Marionette - ZMQ connection to puppet master
|
2
|
+
============================================================
|
3
|
+
|
4
|
+
Marionette connects a headstartapp server instance (puppet node) to its
|
5
|
+
master and executes puppet runs on demand. Marionette uses fast and lightweight
|
6
|
+
0MQ <http://zeromq.org> messaging system.
|
7
|
+
|
8
|
+
For more about Headstartapp see <http://headstartapp.com>.
|
9
|
+
|
10
|
+
Installation
|
11
|
+
------------
|
12
|
+
|
13
|
+
gem install marionette
|
14
|
+
|
15
|
+
Example
|
16
|
+
-------
|
17
|
+
|
18
|
+
Ruby:
|
19
|
+
|
20
|
+
require 'marionette'
|
21
|
+
# By default, Marionette connects to "tcp://master.headstartapp.com:5555"
|
22
|
+
Headstartapp::Marionette::Connect.new.master
|
23
|
+
# Connect to a different master
|
24
|
+
Headstartapp::Marionette::Connect.new("tcp://master.example.com:5555").master
|
25
|
+
|
26
|
+
|
27
|
+
CLI (start as a daemon):
|
28
|
+
|
29
|
+
marionette-master start tcp://master.example.com:5555
|
30
|
+
marionette-puppet start tcp://master.example.com:5555
|
31
|
+
|
32
|
+
|
33
|
+
Meta
|
34
|
+
----
|
35
|
+
|
36
|
+
Created and Maintained by Dan Lee
|
37
|
+
|
38
|
+
Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
|
39
|
+
<http://github.com/headstartapp/marionette>
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'daemons'
|
5
|
+
require 'marionette'
|
6
|
+
|
7
|
+
tcp = ARGV[1] rescue nil
|
8
|
+
options = { :uri => tcp } unless ARGV.nil?
|
9
|
+
puts "Connecting on #{tcp}..."
|
10
|
+
|
11
|
+
Daemons.run_proc('marionette-puppet',:dir => '/var/run', :log_output => true) do
|
12
|
+
HeadStartApp::Marionette::Connect.new(options).puppet
|
13
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module HeadStartApp
|
2
|
+
module Marionette
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
require 'marionette/master'
|
6
|
+
require 'marionette/puppet'
|
7
|
+
|
8
|
+
|
9
|
+
# PuppetString class establishes a zmq messaging system connection with the puppet master
|
10
|
+
# and sends back stats and receives instructions to execute puppet runs or ad hoc system commands.
|
11
|
+
class Connect
|
12
|
+
attr_accessor :uri, :connection
|
13
|
+
|
14
|
+
def initialize(options = nil)
|
15
|
+
|
16
|
+
# Set default(s)
|
17
|
+
options = { :uri => "tcp://127.0.0.1:5555" } if options.nil?
|
18
|
+
|
19
|
+
# Set URI
|
20
|
+
@uri = URI(options[:uri])
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# Connect puppet
|
25
|
+
# require 'zmq'
|
26
|
+
def puppet
|
27
|
+
require 'zmq'
|
28
|
+
|
29
|
+
# Set ZMQ context
|
30
|
+
context = ZMQ::Context.new(1)
|
31
|
+
|
32
|
+
# Set socket to talk to master
|
33
|
+
socket = context.socket(ZMQ::REP)
|
34
|
+
socket.bind(@uri.to_s)
|
35
|
+
@connection = HeadStartApp::Marionette::Puppet.new(socket)
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
# Connect master
|
40
|
+
# require 'ffi-rzmq'
|
41
|
+
def master
|
42
|
+
require 'ffi-rzmq'
|
43
|
+
|
44
|
+
# Set ZMQ context
|
45
|
+
context = ZMQ::Context.new(1)
|
46
|
+
|
47
|
+
# Set socket to talk to puppet
|
48
|
+
socket = context.socket(ZMQ::REQ)
|
49
|
+
socket.connect(@uri.to_s)
|
50
|
+
@connection = HeadStartApp::Marionette::Master.new(socket)
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module HeadStartApp
|
2
|
+
module Marionette
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
|
7
|
+
# Master class is the ZMQ socket connection on the puppet master
|
8
|
+
class Master
|
9
|
+
attr_accessor :socket, :threads
|
10
|
+
|
11
|
+
def initialize(socket)
|
12
|
+
|
13
|
+
# Set socket
|
14
|
+
@socket = socket
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# Sends a msg to puppet node
|
19
|
+
def send(msg)
|
20
|
+
|
21
|
+
# Send and Receive
|
22
|
+
@socket.send_string Marshal.dump(msg)
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Stands by for the next msg from puppet
|
27
|
+
# Processes and returns response
|
28
|
+
def receive
|
29
|
+
|
30
|
+
# Stand by for a response
|
31
|
+
begin
|
32
|
+
|
33
|
+
response = socket.recv_string
|
34
|
+
@response = Marshal.load(response)
|
35
|
+
|
36
|
+
rescue
|
37
|
+
|
38
|
+
# Catch non-marshal-able response
|
39
|
+
@response = response
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
@response
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module HeadStartApp
|
2
|
+
module Marionette
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
|
7
|
+
# Puppet class is the active ZMQ connection on the puppet node
|
8
|
+
class Puppet
|
9
|
+
attr_accessor :socket, :thread
|
10
|
+
|
11
|
+
def initialize(socket)
|
12
|
+
|
13
|
+
@socket = socket
|
14
|
+
start
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# Starts send and response thread
|
19
|
+
def start
|
20
|
+
|
21
|
+
# Kill existing and create new pull-loop thread
|
22
|
+
@thread.kill unless @thread.nil?
|
23
|
+
Thread.abort_on_exception = true
|
24
|
+
@thread = Thread.new do
|
25
|
+
while true do
|
26
|
+
pull
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
# Pulls down messages from the master and pushes up stats
|
33
|
+
def pull
|
34
|
+
|
35
|
+
# Stand by for a response msg
|
36
|
+
@response = @socket.recv
|
37
|
+
|
38
|
+
begin
|
39
|
+
|
40
|
+
# Execute a puppet run and/or ad hoc system commands
|
41
|
+
@response = Marshal.load(@response)
|
42
|
+
puppet_run if @response[:run][:puppet]
|
43
|
+
system_run if @response[:run][:system]
|
44
|
+
|
45
|
+
rescue
|
46
|
+
|
47
|
+
# Catch non-hash responses
|
48
|
+
puts @response
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
# Send back system stats
|
53
|
+
# @socket.send Marshal.dump(stats)
|
54
|
+
@socket.send Marshal.dump(Time.now)
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
# Fetches thread status
|
59
|
+
def status
|
60
|
+
|
61
|
+
# Returns Thread status
|
62
|
+
@thread.status
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
# Stop the pull-loop thread
|
67
|
+
def disconnect
|
68
|
+
|
69
|
+
# Exit returns the Thread
|
70
|
+
# - Note: @thread was never joined
|
71
|
+
@thread.exit
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
# Executes ad hoc system command msg'd from the master
|
76
|
+
def system_run
|
77
|
+
|
78
|
+
system "#{@response[:system][:command]}"
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
# Executes a puppet run
|
83
|
+
def puppet_run
|
84
|
+
|
85
|
+
if @response[:puppet].nil?
|
86
|
+
system "puppetd --onetime --no-daemonize"
|
87
|
+
else
|
88
|
+
system "puppetd #{@response[:puppet][:args]}"
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
# Gathers stats
|
94
|
+
# - to be set up as a fact(s) later
|
95
|
+
def stats
|
96
|
+
|
97
|
+
stats = {}
|
98
|
+
stats[:disk] = `df -h -P` rescue nil
|
99
|
+
stats[:network] = `vnstat` rescue nil
|
100
|
+
stats[:memory] = `vmstat -a` rescue nil
|
101
|
+
stats[:process] = `monit status` rescue nil
|
102
|
+
stats[:cpu] = `mpstat -P ALL | awk 'NR>2' | cut -c14-` rescue nil
|
103
|
+
stats
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
data/lib/marionette.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'marionette/connect'
|
data/marionette.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "marionette/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "marionette"
|
7
|
+
s.version = HeadStartApp::Marionette::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Dan Lee"]
|
10
|
+
s.email = ["dan@headstartapp.com"]
|
11
|
+
s.homepage = "http://headstartapp.com"
|
12
|
+
s.summary = %q{0MQ connection between puppet and master.}
|
13
|
+
s.description = %q{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.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "marionette"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.executables << 'marionette-master'
|
21
|
+
s.executables << 'marionette-puppet'
|
22
|
+
s.add_dependency('zmq')
|
23
|
+
s.add_dependency('ffi')
|
24
|
+
s.add_dependency('ffi-rzmq')
|
25
|
+
s.add_dependency('daemons')
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
s.bindir = "bin"
|
28
|
+
s.require_paths = ["lib"]
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: marionette
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Dan Lee
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-08 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: zmq
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: ffi
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: ffi-rzmq
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :runtime
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: daemons
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
type: :runtime
|
76
|
+
version_requirements: *id004
|
77
|
+
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.
|
78
|
+
email:
|
79
|
+
- dan@headstartapp.com
|
80
|
+
executables:
|
81
|
+
- marionette-master
|
82
|
+
- marionette-puppet
|
83
|
+
- marionette-master
|
84
|
+
- marionette-puppet
|
85
|
+
extensions: []
|
86
|
+
|
87
|
+
extra_rdoc_files: []
|
88
|
+
|
89
|
+
files:
|
90
|
+
- .gitignore
|
91
|
+
- Gemfile
|
92
|
+
- Gemfile.lock
|
93
|
+
- README.md
|
94
|
+
- Rakefile
|
95
|
+
- bin/marionette-master
|
96
|
+
- bin/marionette-puppet
|
97
|
+
- lib/marionette.rb
|
98
|
+
- lib/marionette/connect.rb
|
99
|
+
- lib/marionette/master.rb
|
100
|
+
- lib/marionette/puppet.rb
|
101
|
+
- lib/marionette/version.rb
|
102
|
+
- marionette.gemspec
|
103
|
+
has_rdoc: true
|
104
|
+
homepage: http://headstartapp.com
|
105
|
+
licenses: []
|
106
|
+
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
hash: 3
|
118
|
+
segments:
|
119
|
+
- 0
|
120
|
+
version: "0"
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 3
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
version: "0"
|
130
|
+
requirements: []
|
131
|
+
|
132
|
+
rubyforge_project: marionette
|
133
|
+
rubygems_version: 1.4.1
|
134
|
+
signing_key:
|
135
|
+
specification_version: 3
|
136
|
+
summary: 0MQ connection between puppet and master.
|
137
|
+
test_files: []
|
138
|
+
|