summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/client.rb18
-rw-r--r--lib/puppet/client/master.rb27
-rw-r--r--lib/puppet/client/runner.rb17
-rwxr-xr-xlib/puppet/server/runner.rb63
-rw-r--r--lib/puppet/transaction.rb9
-rw-r--r--lib/puppet/type/pfile.rb3
6 files changed, 117 insertions, 20 deletions
diff --git a/lib/puppet/client.rb b/lib/puppet/client.rb
index 7f6ed2592..f1884ac85 100644
--- a/lib/puppet/client.rb
+++ b/lib/puppet/client.rb
@@ -145,25 +145,19 @@ module Puppet
# Start listening for events. We're pretty much just listening for
# timer events here.
def start
- # Create our timer
- timer = EventLoop::Timer.new(
+ # Create our timer. Puppet will handle observing it and such.
+ timer = Puppet.newtimer(
:interval => Puppet[:runinterval],
:tolerance => 1,
:start? => true
- )
-
- # Stick it in the loop
- EventLoop.current.monitor_timer timer
-
- # Run once before we start following the timer
- self.runnow
-
- # And run indefinitely
- observe_signal timer, :alarm do
+ ) do
if self.scheduled?
self.runnow
end
end
+
+ # Run once before we start following the timer
+ self.runnow
end
require 'puppet/client/proxy'
diff --git a/lib/puppet/client/master.rb b/lib/puppet/client/master.rb
index b1da61405..9194b86be 100644
--- a/lib/puppet/client/master.rb
+++ b/lib/puppet/client/master.rb
@@ -25,6 +25,12 @@ class Puppet::Client::MasterClient < Puppet::Client
attr_accessor :objects
+ class << self
+ # Puppetd should only have one instance running, and we need a way
+ # to retrieve it.
+ attr_accessor :instance
+ end
+
def self.facts
facts = {}
Facter.each { |name,fact|
@@ -39,7 +45,7 @@ class Puppet::Client::MasterClient < Puppet::Client
end
# This method actually applies the configuration.
- def apply
+ def apply(tags = nil, ignoreschedules = false)
dostorage()
unless defined? @objects
raise Puppet::Error, "Cannot apply; objects not defined"
@@ -52,6 +58,14 @@ class Puppet::Client::MasterClient < Puppet::Client
transaction = @objects.evaluate
transaction.toplevel = true
+ if tags
+ transaction.tags = tags
+ end
+
+ if ignoreschedules
+ transaction.ignoreschedules = true
+ end
+
begin
transaction.evaluate
rescue Puppet::Error => detail
@@ -267,6 +281,13 @@ class Puppet::Client::MasterClient < Puppet::Client
return @objects
end
+ # Just so we can specify that we are "the" instance.
+ def initialize(*args)
+ super
+
+ self.class.instance = self
+ end
+
# Make sure only one client runs at a time, and make sure only one thread
# runs at a time. However, this does not lock local clients -- you could have
# as many separate puppet scripts running as you want.
@@ -308,7 +329,7 @@ class Puppet::Client::MasterClient < Puppet::Client
end
# The code that actually runs the configuration.
- def run
+ def run(tags = nil, ignoreschedules = false)
if pid = locked?
t = ""
if pid == true
@@ -325,7 +346,7 @@ class Puppet::Client::MasterClient < Puppet::Client
Puppet.notice "Starting configuration run"
end
benchmark(:notice, "Finished configuration run") do
- self.apply
+ self.apply(tags, ignoreschedules)
end
end
end
diff --git a/lib/puppet/client/runner.rb b/lib/puppet/client/runner.rb
new file mode 100644
index 000000000..9bedf2374
--- /dev/null
+++ b/lib/puppet/client/runner.rb
@@ -0,0 +1,17 @@
+class Puppet::Client::Runner < Puppet::Client::ProxyClient
+ @drivername = :Runner
+
+ # set up the appropriate interface methods
+ @handler = Puppet::Server::Runner
+ self.mkmethods
+
+ def initialize(hash = {})
+ if hash.include?(:Runner)
+ hash[:Runner] = Puppet::Server::Runner.new()
+ end
+
+ super(hash)
+ end
+end
+
+# $Id$
diff --git a/lib/puppet/server/runner.rb b/lib/puppet/server/runner.rb
new file mode 100755
index 000000000..d53b6c9b1
--- /dev/null
+++ b/lib/puppet/server/runner.rb
@@ -0,0 +1,63 @@
+module Puppet
+class Server
+ class MissingMasterError < RuntimeError # Cannot find the master client
+ end
+ # A simple server for triggering a new run on a Puppet client.
+ class Runner < Handler
+ @interface = XMLRPC::Service::Interface.new("puppetrunner") { |iface|
+ iface.add_method("string run(string, string)")
+ }
+
+ # Run the client configuration right now, optionally specifying
+ # tags and whether to ignore schedules
+ def run(tags = [], ignoreschedules = false, bg = true, client = nil, clientip = nil)
+ # We need to retrieve the client
+ master = Puppet::Client::MasterClient.instance
+
+ unless master
+ raise MissingMasterError, "Could not find the master client"
+ end
+
+ if master.locked?
+ Puppet.notice "Could not trigger run; already running"
+ return "running"
+ end
+
+ if tags == ""
+ tags = nil
+ end
+
+ if ignoreschedules == ""
+ ignoreschedules == nil
+ end
+
+ if client
+ msg = "%s(%s) triggered run" % [client, clientip]
+ if tags
+ msg += " with tags %s" % tags.join(", ")
+ end
+
+ if ignoreschedules
+ msg += " without schedules"
+ end
+
+ Puppet.notice msg
+ end
+
+ # And then we need to tell it to run, with this extra info.
+ # By default, stick it in a thread
+ if bg
+ Puppet.newthread do
+ master.run(tags, ignoreschedules)
+ end
+ else
+ master.run(tags, ignoreschedules)
+ end
+
+ return "success"
+ end
+ end
+end
+end
+
+# $Id$
diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb
index 23d384b38..a451d85d4 100644
--- a/lib/puppet/transaction.rb
+++ b/lib/puppet/transaction.rb
@@ -6,7 +6,7 @@ require 'puppet/statechange'
module Puppet
class Transaction
- attr_accessor :toplevel, :component, :objects
+ attr_accessor :toplevel, :component, :objects, :tags, :ignoreschedules
Puppet.config.setdefaults(:transaction,
@@ -103,8 +103,9 @@ class Transaction
# [self.object_id, @changes.length]
@count = 0
- tags = Puppet[:tags]
- if tags == ""
+ # Allow the tags to be overriden
+ tags = self.tags || Puppet[:tags]
+ if tags.nil? or tags == ""
tags = nil
else
tags = tags.split(/\s*,\s*/)
@@ -113,7 +114,7 @@ class Transaction
allevents = @objects.collect { |child|
events = nil
if (tags.nil? or child.tagged?(tags))
- if child.scheduled?
+ if self.ignoreschedules or child.scheduled?
# Perform the actual changes
events = apply(child)
diff --git a/lib/puppet/type/pfile.rb b/lib/puppet/type/pfile.rb
index 63481566c..9124c5c54 100644
--- a/lib/puppet/type/pfile.rb
+++ b/lib/puppet/type/pfile.rb
@@ -34,7 +34,8 @@ module Puppet
desc "Whether files should be backed up before
being replaced. If a filebucket_ is specified, files will be
backed up there; else, they will be backed up in the same directory
- with a ``.puppet-bak`` extension.
+ with a ``.puppet-bak`` extension,, and no backups
+ will be made if backup is ``false``.
To use filebuckets, you must first create a filebucket in your
configuration::