<p><br>
Em 21/07/2011 03:57, <<a href="mailto:bdwalton@users.sourceforge.net">bdwalton@users.sourceforge.net</a>> escreveu:<br>
><br>
> Revision: 398<br>
>          <a href="http://opencsw.svn.sourceforge.net/opencsw/?rev=398&view=rev">http://opencsw.svn.sourceforge.net/opencsw/?rev=398&view=rev</a><br>
> Author:   bdwalton<br>
> Date:     2011-07-21 02:57:36 +0000 (Thu, 21 Jul 2011)<br>
><br>
> Log Message:<br>
> -----------<br>
> initial proof of concept for a restful catalog signing daemon<br>
><br>
> Signed-off-by: Ben Walton <<a href="mailto:bwalton@artsci.utoronto.ca">bwalton@artsci.utoronto.ca</a>><br>
><br>
> Added Paths:<br>
> -----------<br>
>    catalog_signatures/catalog_gpg<br>
><br>
> Added: catalog_signatures/catalog_gpg<br>
> ===================================================================<br>
> --- catalog_signatures/catalog_gpg                              (rev 0)<br>
> +++ catalog_signatures/catalog_gpg      2011-07-21 02:57:36 UTC (rev 398)<br>
> @@ -0,0 +1,80 @@<br>
> +#!/usr/bin/env ruby<br>
> +<br>
> +require 'webrick'<br>
> +require 'pp'<br>
> +<br>
> +class GPGDaemon < WEBrick::HTTPServlet::AbstractServlet<br>
> +  VALID_TREES = %w(unstable current)<br>
> +  VALID_ARCHES = %w(i386 sparc)<br>
> +  VALID_RELEASE = %w(5.9 5.10 5.11)</p>
<p>These are defined separately in many places now. Adding a new OS release can be a major event now. We need to think about creating a single point of truth.</p>
<p>> +<br>
> +  def initialize(server, mirror_path)<br>
> +    @mirror_path = mirror_path<br>
> +    @gpg = "gpg --batch --yes --no-tty -a --output /dev/stdout"<br>
> +  end<br>
> +<br>
> +  def do_GET(request, response)<br>
> +    mode, *rest = request.path.split('/')[1..-1]<br>
> +    mode = 'detach-sign' if mode.eql?('detachsign')<br>
> +<br>
> +    tmp = File.join(@mirror_path, rest.join('.'))<br>
> +    p = validate_path(rest.join('/'))<br>
> +<br>
> +    if p<br>
> +      cmd = "#{@gpg} --#{mode} '#{p}'"<br>
> +      content = `cmd`<br>
> +      if $?.eql?(0)<br>
> +        response.status = 200<br>
> +        response['Content-type'] = 'text/plain'<br>
> +        response.body = content<br>
> +      else<br>
> +        response.status = 500<br>
> +        response['Content-type'] = 'text/plain'<br>
> +        response.body = "500 There was a problem processing the request."<br>
> +      end<br>
> +    else<br>
> +      response.status = 400<br>
> +      response['Content-type'] = 'text/plain'<br>
> +      response.body = "400 Invalid request."<br>
> +    end<br>
> +  end<br>
> +<br>
> +  private<br>
> +  def validate_path(path)<br>
> +<br>
> +    begin<br>
> +      parts = path.split('/')<br>
> +      cat_file = File.join(@mirror_path, path, 'catalog')<br>
> +<br>
> +      return false unless parts.size.eql?(3)<br>
> +      return false unless VALID_TREES.include?(parts[0])<br>
> +      return false unless VALID_ARCHES.include?(parts[1])<br>
> +      return false unless VALID_RELEASE.include?(parts[2])<br>
> +<br>
> +      begin<br>
> +        cat_stat = File.stat(cat_file)<br>
> +        return false unless cat_stat.file? or cat.stat.symlink?<br>
> +      rescue Errno::ENOENT, Errno::ENOTDIR => e<br>
> +        #FIXME: Use the webrick logger here...<br>
> +        $stderr.puts "Bad catalog file lookup on #{cat_file}"<br>
> +        return false<br>
> +      end<br>
> +<br>
> +      return cat_file<br>
> +    rescue => e<br>
> +      # if we missed something here, we should log it, but return<br>
> +      # false to prevent leaking something<br>
> +      # FIXME: Use the webrick logger here...<br>
> +      #stderr.puts "Rescued exception: #{e.class} -> #{e.message}"<br>
> +      return false<br>
> +    end<br>
> +  end<br>
> +end<br>
> +<br>
> +mirror_path = File.dirname($0)<br>
> +<br>
> +server = WEBrick::HTTPServer.new({ :Port => 9981 })<br>
> +server.mount "/clearsign", GPGDaemon, mirror_path<br>
> +server.mount "/detachsign", GPGDaemon, mirror_path<br>
> +trap('INT') { server.shutdown }<br>
> +server.start<br>
><br>
><br>
> Property changes on: catalog_signatures/catalog_gpg<br>
> ___________________________________________________________________<br>
> Added: svn:executable<br>
>   + *<br>
><br>
><br>
> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.<br>
> _______________________________________________<br>
> devel mailing list<br>
> <a href="mailto:devel@lists.opencsw.org">devel@lists.opencsw.org</a><br>
> <a href="https://lists.opencsw.org/mailman/listinfo/devel">https://lists.opencsw.org/mailman/listinfo/devel</a><br>
</p>