marionette 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
1
  pkg/*
2
2
  *.gem
3
3
  .bundle
4
+ *.output
5
+ *.pid
data/README.md CHANGED
@@ -7,27 +7,54 @@ master and executes puppet runs on demand. Marionette uses fast and lightweight
7
7
 
8
8
  For more about Headstartapp see <http://headstartapp.com>.
9
9
 
10
+
10
11
  Installation
11
12
  ------------
12
13
 
14
+ If you're using RVM, run this under the system context.
15
+ Be sure to have the appropriate port open (for the following example, port 5555)
16
+ on the puppet node.
17
+
13
18
  gem install marionette
14
19
 
20
+
21
+
15
22
  Example
16
23
  -------
17
24
 
25
+ In this example, puppet and master are on the same local network and the puppet's ip is 192.168.1.1.
26
+
27
+ Note: By default, Marionette connects to "tcp://127.0.0.1:5555"
28
+
29
+ Results:
30
+ 1) on the pupet, /tmp/test.out contains "test #{Time.now}"
31
+ 2) master.receive returns puppet's facts as a hash.
32
+ 3) Note: this example does not execute a puppet run.
33
+
34
+
18
35
  Ruby:
19
36
 
37
+ require 'rubygems'
20
38
  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
39
 
40
+ puppet = HeadStartApp::Marionette::Connect.new(:uri=>"192.168.1.1:5555) puppet
41
+ master = HeadStartApp::Marionette::Connect.new(:uri=>"192.168.1.1:5555").master
42
+ message = {:run=>{:system=>true,:facter=>true},:system=>{:command=>"echo 'test @ #{Time.now}' > /tmp/test.out"}}
43
+ master.send message
44
+ master.receive
45
+
46
+
47
+
48
+ CLI (start marionette-puppet as a daemon):
49
+
50
+ marionette start tcp://192.168.1.1:5555
51
+
52
+
53
+
54
+ Rake (set up marionette as a service:
26
55
 
27
- CLI (start as a daemon):
56
+ rake setup-service
28
57
 
29
- marionette-master start tcp://master.example.com:5555
30
- marionette-puppet start tcp://master.example.com:5555
31
58
 
32
59
 
33
60
  Meta
data/Rakefile CHANGED
@@ -1,2 +1,99 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake'
5
+
6
+ namespace :marionette do
7
+
8
+ # task description
9
+ desc 'Set up marionette as a service (run this as sudo/root)'
10
+
11
+ # define task:
12
+ # 1) write to init.d/marionette
13
+ # 2) set permissions
14
+ # 3) set ifconfig
15
+ # 4) start service
16
+ task :service do
17
+
18
+ script = <<CODE
19
+ #!/bin/bash
20
+
21
+ ### BEGIN INIT INFO
22
+ # Provides: marionette
23
+ # Default-Start: 2 3 4 5
24
+ # Default-Stop: 0 1 6
25
+ # Short-Description: start and stop marionette
26
+ # Description: 0mq connection for puppet and master.
27
+ # chkconfig: - 85 15
28
+ ### END INIT INFO
29
+
30
+ # source function library
31
+ . /etc/rc.d/init.d/functions
32
+
33
+ RETVAL=0
34
+ prog="marionette"
35
+
36
+ set -e
37
+
38
+ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
39
+ DESC="marionette daemon"
40
+ NAME=marionette
41
+ DAEMON=/usr/local/bin/$NAME
42
+ PIDFILE=/var/run/$NAME.pid
43
+ LOGFILE=/var/log/$NAME.log
44
+ SCRIPTNAME=/etc/init.d/$NAME
45
+ IP=`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`
46
+ TCP=tcp://$IP:5555
47
+
48
+ # Gracefully exit if the package has been removed.
49
+ # test -x $DAEMON || exit 0
50
+
51
+ d_start() {
52
+ $DAEMON start $TCP || echo -en "\n already running"
53
+ }
54
+
55
+ d_stop() {
56
+ kill -9 `cat $PIDFILE` || echo -en "\n not running"
57
+ }
58
+
59
+ case "$1" in
60
+ start)
61
+ echo -n "Starting $DESC: $NAME"
62
+ d_start
63
+ echo "."
64
+ ;;
65
+ stop)
66
+ echo -n "Stopping $DESC: $NAME"
67
+ d_stop
68
+ echo "."
69
+ ;;
70
+ restart)
71
+ echo -n "Restarting $DESC: $NAME"
72
+ d_stop
73
+ sleep 5
74
+ d_start
75
+ echo "."
76
+ ;;
77
+ *)
78
+ echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
79
+ exit 3
80
+ ;;
81
+ esac
82
+
83
+ exit 0
84
+
85
+ CODE
86
+ file = File.open('/etc/init.d/marionette','w')
87
+ file.write script
88
+ file.close
89
+
90
+ system "chmod 755 /etc/init.d/marionette"
91
+ system "chkconfig marionette on"
92
+ system "service marionette start"
93
+ end
94
+
95
+ # set "service" as the default task
96
+ task :default => [:service]
97
+
98
+ end
99
+
@@ -6,8 +6,7 @@ require 'marionette'
6
6
 
7
7
  tcp = ARGV[1] rescue nil
8
8
  options = { :uri => tcp } unless ARGV.nil?
9
- puts "Connecting on #{tcp}..."
10
9
 
11
- Daemons.run_proc('marionette-puppet',:dir => '/var/run', :log_output => true) do
10
+ Daemons.run_proc('marionette',:dir_mode => :system, :log_output => true) do
12
11
  HeadStartApp::Marionette::Connect.new(options).puppet
13
12
  end
@@ -2,11 +2,12 @@ module HeadStartApp
2
2
  module Marionette
3
3
 
4
4
  require 'uri'
5
+ require 'facter'
5
6
 
6
7
 
7
8
  # Puppet class is the active ZMQ connection on the puppet node
8
9
  class Puppet
9
- attr_accessor :socket, :thread
10
+ attr_accessor :socket, :thread, :message
10
11
 
11
12
  def initialize(socket)
12
13
 
@@ -19,13 +20,13 @@ module HeadStartApp
19
20
  def start
20
21
 
21
22
  # 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
23
+ # @thread.kill unless @thread.nil?
24
+ # Thread.abort_on_exception = true
25
+ # @thread = Thread.new do
25
26
  while true do
26
27
  pull
27
28
  end
28
- end
29
+ # end
29
30
 
30
31
  end
31
32
 
@@ -35,12 +36,16 @@ module HeadStartApp
35
36
  # Stand by for a response msg
36
37
  @response = @socket.recv
37
38
 
39
+ # Sets default message to current time
40
+ @message = "Response from node @ #{Time.now}."
41
+
38
42
  begin
39
43
 
40
44
  # Execute a puppet run and/or ad hoc system commands
41
45
  @response = Marshal.load(@response)
42
46
  puppet_run if @response[:run][:puppet]
43
47
  system_run if @response[:run][:system]
48
+ facter_run if @response[:run][:facter]
44
49
 
45
50
  rescue
46
51
 
@@ -51,7 +56,7 @@ module HeadStartApp
51
56
 
52
57
  # Send back system stats
53
58
  # @socket.send Marshal.dump(stats)
54
- @socket.send Marshal.dump(Time.now)
59
+ @socket.send Marshal.dump(@message)
55
60
 
56
61
  end
57
62
 
@@ -89,8 +94,16 @@ module HeadStartApp
89
94
  end
90
95
 
91
96
  end
97
+
98
+ # Fetches facts collection
99
+ def facter_run
100
+
101
+ Facter.loadfacts
102
+ @message = Facter.collection.to_hash
103
+
104
+ end
92
105
 
93
- # Gathers stats
106
+ # Some stats
94
107
  # - to be set up as a fact(s) later
95
108
  def stats
96
109
 
@@ -1,5 +1,5 @@
1
1
  module HeadStartApp
2
2
  module Marionette
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
data/marionette.gemspec CHANGED
@@ -17,13 +17,13 @@ Gem::Specification.new do |s|
17
17
  s.files = `git ls-files`.split("\n")
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
- s.executables << 'marionette-master'
21
- s.executables << 'marionette-puppet'
20
+ s.executables << 'marionette'
21
+ s.add_dependency('facter')
22
22
  s.add_dependency('zmq')
23
23
  s.add_dependency('ffi')
24
24
  s.add_dependency('ffi-rzmq')
25
25
  s.add_dependency('daemons')
26
26
  s.require_paths = ["lib"]
27
27
  s.bindir = "bin"
28
- s.require_paths = ["lib"]
29
- end
28
+ end
29
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marionette
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dan Lee
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-08 00:00:00 -08:00
18
+ date: 2011-01-10 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: zmq
22
+ name: facter
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
@@ -33,7 +33,7 @@ dependencies:
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- name: ffi
36
+ name: zmq
37
37
  prerelease: false
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
@@ -47,7 +47,7 @@ dependencies:
47
47
  type: :runtime
48
48
  version_requirements: *id002
49
49
  - !ruby/object:Gem::Dependency
50
- name: ffi-rzmq
50
+ name: ffi
51
51
  prerelease: false
52
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
53
  none: false
@@ -61,7 +61,7 @@ dependencies:
61
61
  type: :runtime
62
62
  version_requirements: *id003
63
63
  - !ruby/object:Gem::Dependency
64
- name: daemons
64
+ name: ffi-rzmq
65
65
  prerelease: false
66
66
  requirement: &id004 !ruby/object:Gem::Requirement
67
67
  none: false
@@ -74,14 +74,26 @@ dependencies:
74
74
  version: "0"
75
75
  type: :runtime
76
76
  version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: daemons
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :runtime
90
+ version_requirements: *id005
77
91
  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
92
  email:
79
93
  - dan@headstartapp.com
80
94
  executables:
81
- - marionette-master
82
- - marionette-puppet
83
- - marionette-master
84
- - marionette-puppet
95
+ - marionette
96
+ - marionette
85
97
  extensions: []
86
98
 
87
99
  extra_rdoc_files: []
@@ -92,8 +104,7 @@ files:
92
104
  - Gemfile.lock
93
105
  - README.md
94
106
  - Rakefile
95
- - bin/marionette-master
96
- - bin/marionette-puppet
107
+ - bin/marionette
97
108
  - lib/marionette.rb
98
109
  - lib/marionette/connect.rb
99
110
  - lib/marionette/master.rb
@@ -130,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
141
  requirements: []
131
142
 
132
143
  rubyforge_project: marionette
133
- rubygems_version: 1.4.1
144
+ rubygems_version: 1.4.2
134
145
  signing_key:
135
146
  specification_version: 3
136
147
  summary: 0MQ connection between puppet and master.
@@ -1,9 +0,0 @@
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