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 ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in marionette.gemspec
4
+ gemspec
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,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,9 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'rubygems'
4
+ require 'daemons'
5
+ require 'marionette'
6
+
7
+ Daemons.run_proc('marionette-master',:dir => '/var/run', :log_output => true) do
8
+ HeadStartApp::Marionette::Connect.new.master
9
+ end
@@ -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
@@ -0,0 +1,5 @@
1
+ module HeadStartApp
2
+ module Marionette
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
data/lib/marionette.rb ADDED
@@ -0,0 +1 @@
1
+ require 'marionette/connect'
@@ -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
+