From 8e6bf2a0799476b5e29e98b4abe073f91127a4e4 Mon Sep 17 00:00:00 2001 From: Krzysztof Wilczynski Date: Sun, 13 Mar 2011 23:56:44 +0000 Subject: First version. --- persistent_crontab_minutes.rb | 56 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 persistent_crontab_minutes.rb (limited to 'persistent_crontab_minutes.rb') diff --git a/persistent_crontab_minutes.rb b/persistent_crontab_minutes.rb new file mode 100644 index 0000000..44c6328 --- /dev/null +++ b/persistent_crontab_minutes.rb @@ -0,0 +1,56 @@ +# +# persistent_crontab_minutes.rb +# + +require 'md5' + +module Puppet::Parser::Functions + newfunction(:persistent_crontab_minutes, :type => :rvalue) do |arguments| + + raise(Puppet::ParseError, "Wrong number of arguments " + + "given (#{arguments.size} for 2)") if arguments.size < 2 + + value = 0 + + job = arguments[0] + host = arguments[1] + + environment = Puppet[:environment] + + # We select first directory that exists. This might not be the best idea ... + modules = Puppet[:modulepath].split(':').select { |i| File.exists?(i) }.first + + raise(Puppet::ParseError, "Unable to determine the storage " + + "directory for Puppet modules") unless modules + + # Prepare the file where we store current value ... + file = "/puppet/state/crontab/#{host}-#{job}.minutes" + file = File.join(modules, file) + + if FileTest.exists?(file) + File.open(file, 'r') { |f| value = f.read.to_i } + + raise(Puppet::ParseError, "The value for minutes in the file `%s' " + + "is out of the range from 0 to 59 inclusive") unless value < 60 + else + # + # Pick a random number based on the job and host name. This will yield + # the same value for exactly the same combination of the job and host name. + # + value = MD5.new(job_name + host).to_s.hex % 60 + + # Minutes are from 0 to 59 inclusive ... + value = value < 60 ? value : 59 + + File.open(file, 'w') { |f| f.write(value) } + end + + # Tell Puppet to keep an eye on this file ... + parser = Puppet::Parser::Parser.new(environment) + parser.watch_file(file) if File.exists?(file) + + return value + end # def newfunction +end # module Puppet::Parser::Functions + +# vim: set ts=2 sw=2 et : -- cgit v1.2.3