Thanks for the patches. How do you expect to use this type? Can you provide some example use cases?
I've got a comment below, too. On May 16, 2011, at 8:22 PM, Mo Morsi wrote: > Adds a new resource type to puppet for web requests > and implements a provider of that type using the > ruby curl interface provided by the 'curb' rubygem > > Signed-off-by: Mo Morsi <[email protected]> > --- > Local-branch: feature/master/7474 > lib/puppet/provider/web_request/curl.rb | 128 +++++++++++++++++++++++++++++++ > lib/puppet/type/web_request.rb | 50 ++++++++++++ > 2 files changed, 178 insertions(+), 0 deletions(-) > create mode 100644 lib/puppet/provider/web_request/curl.rb > create mode 100644 lib/puppet/type/web_request.rb > > diff --git a/lib/puppet/provider/web_request/curl.rb > b/lib/puppet/provider/web_request/curl.rb > new file mode 100644 > index 0000000..479bfd5 > --- /dev/null > +++ b/lib/puppet/provider/web_request/curl.rb > @@ -0,0 +1,128 @@ > +require 'curb' > +require 'uuid' > +require 'fileutils' > + > +# Helper to invoke the web request w/ curl > +def web_request(method, uri, request_params, params = {}) These methods should really all be in the provider, rather than at the global level. > + raise Puppet::Error, "Must specify valid http method and uri" if > method.nil? || uri.nil? || method == "" || uri == "" > + > + curl = Curl::Easy.new > + > + if params.has_key?(:cookie) > + curl.enable_cookies = true > + curl.cookiefile = params[:cookie] > + curl.cookiejar = params[:cookie] > + end > + > + curl.follow_location = (params.has_key?(:follow) && params[:follow]) > + > + case(method) > + when 'get' > + url = uri > + url += ";" + request_params.collect { |k,v| "#{k}=#{v}" }.join("&") > unless request_params.nil? > + curl.url = url > + curl.http_get > + return curl > + > + when 'post' > + cparams = [] > + request_params.each_pair { |k,v| cparams << Curl::PostField.content(k,v) > } unless request_params.nil? > + curl.url = uri > + curl.http_post(cparams) > + return curl > + > + #when 'put' > + #when 'delete' > + end > +end > + > +# Helper to verify the response > +def verify_result(result, verify = {}) > + returns = (verify.has_key?(:returns) && !verify[:returns].nil?) ? > verify[:returns] : "200" > + returns = [returns] unless returns.is_a? Array > + unless returns.include?(result.response_code.to_s) > + raise Puppet::Error, "Invalid HTTP Return Code: #{result.response_code}, > + was expecting one of #{returns.join(", ")}" > + end > + > + if verify.has_key?(:body) && !verify[:body].nil? && !(result.body_str =~ > Regexp.new(verify[:body])) > + raise Puppet::Error, "Expecting #{verify[:body]} in the result" > + end > +end > + > +# Helper to process/parse web parameters > +def process_params(request_method, params, uri) > + begin > + # Set request method and generate a unique session key > + session = "/tmp/#{UUID.new.generate}" > + > + # Invoke a login request if necessary > + if params[:login] > + login_params = params[:login].reject { |k,v| ['http_method', > 'uri'].include?(k) } > + web_request(params[:login]['http_method'], params[:login]['uri'], > + login_params, :cookie => session, :follow => > params[:follow]).close > + end > + > + # Check to see if we should actually run the request > + skip_request = !params[:unless].nil? > + if params[:unless] > + result = web_request(params[:unless]['http_method'], > params[:unless]['uri'], > + params[:unless]['parameters'], > + :cookie => session, :follow => params[:follow]) > + begin > + verify_result(result, > + :returns => params[:unless]['returns'], > + :body => params[:unless]['verify']) > + rescue Puppet::Error => e > + skip_request = false > + end > + result.close > + end > + return if skip_request > + > + # Actually run the request and verify the result > + uri = params[:name] if uri.nil? > + result = web_request(request_method, uri, params[:parameters], > + :cookie => session, :follow => params[:follow]) > + verify_result(result, > + :returns => params[:returns], > + :body => params[:verify]) > + result.close > + > + # Invoke a logout request if necessary > + if params[:logout] > + logout_params = params[:login].reject { |k,v| ['http_method', > 'uri'].include?(k) } > + web_request(params[:logout]['http_method'], params[:logout]['uri'], > + logout_params, :cookie => session, :follow => > params[:follow]).close > + end > + > + rescue Exception => e > + raise Puppet::Error, "An exception was raised when invoking web request: > #{e}" > + > + ensure > + FileUtils.rm_f(session) if params[:logout] > + end > +end > + > +# Puppet provider definition > +Puppet::Type.type(:web_request).provide :curl do > + desc "Use curl to access web resources" > + > + def get > + @uri > + end > + > + def post > + @uri > + end > + > + def get=(uri) > + @uri = uri > + process_params('get', @resource, uri) > + end > + > + def post=(uri) > + @uri = uri > + process_params('post', @resource, uri) > + end > +end > diff --git a/lib/puppet/type/web_request.rb b/lib/puppet/type/web_request.rb > new file mode 100644 > index 0000000..d95e286 > --- /dev/null > +++ b/lib/puppet/type/web_request.rb > @@ -0,0 +1,50 @@ > +Puppet::Type.newtype(:web_request) do > + @doc = "Issue a request via the world wide web" > + > + newparam :name > + > + newproperty(:get) do > + desc "Issue get request to the specified uri" > + # TODO valid value to be a uri > + end > + > + newproperty(:post) do > + desc "Issue get request to the specified uri" > + # TODO valid value to be a uri > + end > + > + # TODO implement > + #newproperty(:delete) > + #newproperty(:put) > + > + newparam(:parameters) do > + desc "Hash of parameters to include in the web request" > + end > + > + newparam(:returns) do > + desc "Expected http return codes of the request" > + defaultto "200" > + # TODO validate value(s) is among possible valid http return codes > + end > + > + newparam(:follow) do > + desc "Boolean indicating if redirects should be followed" > + newvalues(:true, :false) > + end > + > + newparam(:verify) do > + desc "String to verify as being part of the result" > + end > + > + newparam(:login) do > + desc "Login parameters to be used if a login is required before making > the request" > + end > + > + newparam(:logout) do > + desc "Logout parameters to be used if a logout is requred after making > the request" > + end > + > + newparam(:unless) do > + desc "Do not run request if the request specified here succeeds" > + end > +end > -- > 1.7.2.3 > > -- > You received this message because you are subscribed to the Google Groups > "Puppet Developers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/puppet-dev?hl=en. > -- The trouble with the rat race is that even if you win, you're still a rat. -- Lily Tomlin --------------------------------------------------------------------- Luke Kanies -|- http://puppetlabs.com -|- http://about.me/lak -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
