regurgitator 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.manifest CHANGED
@@ -22,6 +22,7 @@ lib/regurgitator/domain_path.rb
22
22
  lib/regurgitator/endpoint.rb
23
23
  lib/regurgitator/file_info.rb
24
24
  lib/regurgitator/file_request.rb
25
+ lib/regurgitator/list_keys.rb
25
26
  lib/regurgitator/local.rb
26
27
  lib/regurgitator/local_file.rb
27
28
  lib/regurgitator/one_domain.rb
@@ -42,5 +43,6 @@ t/t0001-domain_path.sh
42
43
  t/t0002-domain_host.sh
43
44
  t/t0003-one_domain.sh
44
45
  t/test-lib.sh
46
+ test/test_list_keys.rb
45
47
  test/test_local.rb
46
48
  test/test_server_settings.rb
data/ChangeLog CHANGED
@@ -1,5 +1,68 @@
1
1
  ChangeLog from http://bogomips.org/regurgitator.git
2
2
 
3
+ commit 4874e7d38453a0b4b3f47d8dc8095a314083bd11
4
+ Author: Eric Wong <normalperson@yhbt.net>
5
+ Date: Thu Dec 15 18:11:02 2011 -0800
6
+
7
+ regurgitator 0.2.0
8
+
9
+ * add list_keys module for listing keys
10
+ * add :reproxy_key, overriding global REPROXY_KEY constant
11
+ * remove support for altip/altmask (hardly ever used)
12
+
13
+ commit ed9f6b55d3acbe8bf0ee8599fff466fbe9eabd5d
14
+ Author: Eric Wong <normalperson@yhbt.net>
15
+ Date: Thu Dec 15 18:16:19 2011 -0800
16
+
17
+ strip out the altmask/altip handling stuff
18
+
19
+ Hardly anyone ever uses/used it, so stop attempting to support
20
+ it to remove the risk of supporting it improperly.
21
+
22
+ commit 3052e1b0f75523b46f43ddb1163b37c12e6ed57e
23
+ Author: Eric Wong <normalperson@yhbt.net>
24
+ Date: Thu Dec 1 00:13:43 2011 -0800
25
+
26
+ list_keys: force case-sensitive key name matching for MySQL
27
+
28
+ Case-insensitivity kills millions each year...
29
+
30
+ We require Sequel 3.29+ for SQLite, so we avoid this problem
31
+ there already.
32
+
33
+ commit 045b555d7404ca5bfac5cf69a5e7ab35872602ef
34
+ Author: Eric Wong <normalperson@yhbt.net>
35
+ Date: Wed Nov 16 19:25:32 2011 -0800
36
+
37
+ add :reproxy_key, overriding global REPROXY_KEY constant
38
+
39
+ Users may never want reproxy behavior, or they may want to
40
+ use a different key, so support both use cases.
41
+
42
+ Reproxy support (for nginx) is now off now by default.
43
+
44
+ commit 80982a28eafda2b439bbb1545e649509f29e83d4
45
+ Author: Eric Wong <normalperson@yhbt.net>
46
+ Date: Wed Nov 16 19:24:59 2011 -0800
47
+
48
+ t: update my-tap-lib.sh
49
+
50
+ Fix race conditions in verbose mode
51
+
52
+ commit 530ab82be1608f6a136169aee71dc5745b9b1785
53
+ Author: Eric Wong <normalperson@yhbt.net>
54
+ Date: Wed Nov 16 18:58:47 2011 -0800
55
+
56
+ add list_keys module for listing keys
57
+
58
+ This may be useful for building directory indices.
59
+
60
+ commit 611cb7223064f99126388062c8197d4271859b92
61
+ Author: Eric Wong <normalperson@yhbt.net>
62
+ Date: Fri Nov 11 08:49:49 2011 +0000
63
+
64
+ pkg.mk: update to the latest version
65
+
3
66
  commit 84e48c63074049f32660672b5a3c195d12dc3896
4
67
  Author: Eric Wong <normalperson@yhbt.net>
5
68
  Date: Fri Nov 11 08:46:12 2011 +0000
data/GIT-VERSION-FILE CHANGED
@@ -1 +1 @@
1
- GIT_VERSION = 0.1.0
1
+ GIT_VERSION = 0.2.0
data/GIT-VERSION-GEN CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  GVF=GIT-VERSION-FILE
4
- DEF_VER=v0.1.0.GIT
4
+ DEF_VER=v0.2.0.GIT
5
5
 
6
6
  LF='
7
7
  '
data/LATEST CHANGED
@@ -1,6 +1,6 @@
1
- === regurgitator 0.1.0 / 2011-11-11 08:47 UTC
1
+ === regurgitator 0.2.0 / 2011-12-16 02:27 UTC
2
2
 
3
- * local_file: support HTTP Range: requests
4
- * minor code cleanups
5
- * update/fix install dependencies (include rpatricia)
3
+ * add list_keys module for listing keys
4
+ * add :reproxy_key, overriding global REPROXY_KEY constant
5
+ * remove support for altip/altmask (hardly ever used)
6
6
 
data/NEWS CHANGED
@@ -1,3 +1,9 @@
1
+ === regurgitator 0.2.0 / 2011-12-16 02:27 UTC
2
+
3
+ * add list_keys module for listing keys
4
+ * add :reproxy_key, overriding global REPROXY_KEY constant
5
+ * remove support for altip/altmask (hardly ever used)
6
+
1
7
  === regurgitator 0.1.0 / 2011-11-11 08:47 UTC
2
8
 
3
9
  * local_file: support HTTP Range: requests
data/lib/regurgitator.rb CHANGED
@@ -13,10 +13,6 @@ require 'rpatricia'
13
13
  # so just "require 'regurgitator'" in your code.
14
14
  module Regurgitator
15
15
 
16
- # This HTTP header is read to determine a location to reproxy to.
17
- # Add this header in your nginx config.
18
- REPROXY_KEY = 'HTTP_X_REPROXY_PATH'
19
-
20
16
  autoload :ServerSettings, 'regurgitator/server_settings'
21
17
  autoload :Domain, 'regurgitator/domain'
22
18
  autoload :Device, 'regurgitator/device'
@@ -25,7 +21,7 @@ module Regurgitator
25
21
  autoload :FileRequest, 'regurgitator/file_request'
26
22
  autoload :Local, 'regurgitator/local'
27
23
  autoload :LocalFile, 'regurgitator/local_file'
28
-
24
+ autoload :ListKeys, 'regurgitator/list_keys'
29
25
  # Rack middlewares/apps
30
26
  autoload :DomainPath, 'regurgitator/domain_path'
31
27
  autoload :DomainHost, 'regurgitator/domain_host'
@@ -5,7 +5,7 @@ module Regurgitator::Device
5
5
 
6
6
  # :stopdoc:
7
7
  REFRESH_DEVICE = <<-EOS
8
- SELECT d.devid, h.hostip, h.altip, h.altmask, h.http_port, h.http_get_port
8
+ SELECT d.devid, h.hostip, h.http_port, h.http_get_port
9
9
  FROM device d
10
10
  LEFT JOIN host h ON d.hostid = h.hostid
11
11
  WHERE d.status IN ('readonly','alive','drain') AND h.status = 'alive'
@@ -54,18 +54,7 @@ module Regurgitator::Device
54
54
  x[:zone] = zone_for(hostip)
55
55
  devid = x[:devid]
56
56
  o = { :path => "/dev#{devid}", :port => port, :host => hostip }
57
-
58
57
  x[:uris] = { :pri => device_uri_pair!(o, get_port) }
59
- x[:ipaddr][:altmask] = pat = Patricia.new
60
- altmask = x[:altmask] and pat.add(altmask)
61
-
62
- if altip = x[:altip]
63
- x[:ipaddr][:altip] = altip
64
- o[:host] = altip
65
- o[:port] = port
66
- x[:uris][:alt] = device_uri_pair!(o, get_port)
67
- end
68
-
69
58
  tmp[devid] = x
70
59
  end
71
60
  Regurgitator::Local.refresh_addrs!
@@ -27,7 +27,7 @@ class Regurgitator::DomainHost
27
27
  raise TypeError, ":suffix must be a String or Regexp #{suffix.inspect}"
28
28
  end
29
29
  @domain_regexp = suffix
30
- endpoint_init(app, opts[:db])
30
+ endpoint_init(app, opts[:db], opts[:reproxy_key])
31
31
  end
32
32
 
33
33
  def call(env) # :nodoc:
@@ -27,7 +27,8 @@ class Regurgitator::DomainPath
27
27
  end
28
28
  end
29
29
 
30
- def initialize(app, db) # :nodoc:
31
- endpoint_init(app, Hash === db ? db[:db] : db)
30
+ def initialize(app, opts) # :nodoc:
31
+ opts = { :db => opts } unless Hash === opts
32
+ endpoint_init(app, opts[:db], opts[:reproxy_key])
32
33
  end
33
34
  end
@@ -5,21 +5,20 @@ module Regurgitator::Endpoint
5
5
  include Rack::Utils
6
6
  include Rack::Mime
7
7
 
8
- REPROXY_KEY = Regurgitator::REPROXY_KEY # :nodoc:
9
-
10
- def endpoint_init(app, db)
8
+ def endpoint_init(app, db, reproxy_key = nil)
11
9
  @app = app
12
10
  @db = db
11
+ @reproxy_key = reproxy_key
13
12
  file_info_init
14
13
  end
15
14
 
16
15
  def best_addr(env)
17
- env.include?(REPROXY_KEY) ? env['REMOTE_ADDR'] : Regurgitator::Local.addr
16
+ env.include?(@reproxy_key) ? env['REMOTE_ADDR'] : Regurgitator::Local.addr
18
17
  end
19
18
 
20
19
  # see nginx config examples for reproxy
21
20
  def reproxy_path(env)
22
- env[REPROXY_KEY]
21
+ env[@reproxy_key]
23
22
  end
24
23
 
25
24
  # allow users to specify desired "Save As" filenames in the query string
@@ -37,7 +37,7 @@ module Regurgitator::FileInfo
37
37
  devinfo = devices[x[:devid]] or next
38
38
  fid >= 10_000_000_000 and next # TODO: support larger FIDs
39
39
 
40
- uris = devinfo[:uris][alt_zone?(zone, devinfo) ? :alt : :pri]
40
+ uris = devinfo[:uris][:pri]
41
41
  nfid = sprintf('%010u', fid)
42
42
  /\A(\d)(\d{3})(\d{3})(?:\d{3})\z/ =~ nfid
43
43
  fid_path = "/#$1/#$2/#$3/#{nfid}.fid"
@@ -51,8 +51,4 @@ module Regurgitator::FileInfo
51
51
  uris = info[:uris] = read_uris.empty? ? drain_uris : read_uris
52
52
  (uris.empty? && ! update) ? file_info(env, domain, dkey, true) : info
53
53
  end
54
-
55
- def alt_zone?(zone, devinfo)
56
- zone == :alt || devinfo[:ipaddr][:altmask].include?(zone)
57
- end
58
54
  end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: binary -*-
2
+ module Regurgitator::ListKeys
3
+ include Regurgitator::Domain
4
+
5
+ LIST_KEYS_MAX = 1000
6
+
7
+ def list_keys(domain, opts = {})
8
+ dmid = get_dmid(domain) or return
9
+
10
+ after, limit, prefix = opts[:after], opts[:limit], opts[:prefix]
11
+ limit ||= LIST_KEYS_MAX
12
+
13
+ Integer === limit or
14
+ raise ArgumentError, ":limit not an Integer=#{limit.inspect}"
15
+
16
+ limit = LIST_KEYS_MAX if limit > LIST_KEYS_MAX
17
+ sql = "SELECT fid,dkey,length,devcount,classid " \
18
+ "FROM file WHERE dmid = #{dmid}"
19
+ sql << " AND dkey LIKE /*! BINARY */ #{@db.literal(prefix+'%')}" if prefix
20
+ sql << " AND dkey > #{@db.literal(after)}" if after
21
+ sql << " ORDER BY dkey LIMIT #{limit}"
22
+
23
+ # we don't enforce collation here, give DBAs some freedom...
24
+ ds = @db[sql]
25
+ block_given? ? ds.each { |row| yield(row) } : ds.to_a
26
+ end
27
+ end
@@ -19,7 +19,7 @@ class Regurgitator::OneDomain
19
19
 
20
20
  def initialize(app, opts) # :nodoc:
21
21
  @domain = opts[:domain]
22
- endpoint_init(app, opts[:db])
22
+ endpoint_init(app, opts[:db], opts[:reproxy_key])
23
23
  end
24
24
 
25
25
  def call(env) # :nodoc:
data/pkg.mk CHANGED
@@ -69,7 +69,7 @@ doc:: .document .wrongdoc.yml $(pkg_extra)
69
69
  $(RM) -r doc
70
70
  $(WRONGDOC) all
71
71
  install -m644 COPYING doc/COPYING
72
- install -m644 $(shell grep '^[A-Z]' .document) doc/
72
+ install -m644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
73
73
 
74
74
  ifneq ($(VERSION),)
75
75
  pkggem := pkg/$(rfpackage)-$(VERSION).gem
@@ -168,7 +168,7 @@ doc_gz:
168
168
  for i in $(docs); do \
169
169
  gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
170
170
  check-warnings:
171
- @(for i in $$(git ls-files '*.rb'|grep -v '^setup\.rb$$'); \
171
+ @(for i in $$(git ls-files '*.rb'| grep -v '^setup\.rb$$'); \
172
172
  do $(RUBY) -d -W2 -c $$i; done) | grep -v '^Syntax OK$$' || :
173
173
 
174
174
  .PHONY: all .FORCE-GIT-VERSION-FILE doc test $(test_units) manifest
data/t/domain_host.ru CHANGED
@@ -4,5 +4,6 @@ use Rack::ContentType, 'text/plain'
4
4
  o = {
5
5
  :db => Sequel.connect(ENV['TEST_SEQUEL']),
6
6
  :suffix => '.example.com',
7
+ :reproxy_key => "HTTP_X_REPROXY_PATH",
7
8
  }
8
9
  run Regurgitator::DomainHost.new(lambda { |env| [ 404, [], [] ] }, o)
data/t/domain_path.ru CHANGED
@@ -1,5 +1,8 @@
1
1
  require 'regurgitator'
2
2
  use Rack::ContentLength
3
3
  use Rack::ContentType, 'text/plain'
4
- db = Sequel.connect(ENV['TEST_SEQUEL'])
5
- run Regurgitator::DomainPath.new(lambda { |env| [ 404, [], [] ] }, db)
4
+ o = {
5
+ :db => Sequel.connect(ENV['TEST_SEQUEL']),
6
+ :reproxy_key => "HTTP_X_REPROXY_PATH",
7
+ }
8
+ run Regurgitator::DomainPath.new(lambda { |env| [ 404, [], [] ] }, o)
data/t/my-tap-lib.sh CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/bin/sh
2
- # Copyright (c) 2009 Eric Wong <normalperson@yhbt.net>
2
+ # Copyright (c) 2009, 2010 Eric Wong <normalperson@yhbt.net>
3
3
  #
4
4
  # TAP-producing shell library for POSIX-compliant Bourne shells We do
5
5
  # not _rely_ on Bourne Again features, though we will use "set -o
@@ -188,9 +188,10 @@ then
188
188
 
189
189
  (
190
190
  # use a subshell so seds are not waitable
191
- $SED -e 's/^/#: /' $t_stdout &
192
- $SED -e 's/^/#! /' $t_stderr &
191
+ $SED -e 's/^/#: /' < $t_stdout &
192
+ $SED -e 's/^/#! /' < $t_stderr &
193
193
  ) &
194
+ wait
194
195
  exec > $t_stdout 2> $t_stderr
195
196
  else
196
197
  exec > /dev/null 2> /dev/null
data/t/one_domain.ru CHANGED
@@ -4,5 +4,6 @@ use Rack::ContentType, 'text/plain'
4
4
  o = {
5
5
  :db => Sequel.connect(ENV['TEST_SEQUEL']),
6
6
  :domain => 'd',
7
+ :reproxy_key => "HTTP_X_REPROXY_PATH",
7
8
  }
8
9
  run Regurgitator::OneDomain.new(lambda { |env| [ 404, [], [] ] }, o)
@@ -0,0 +1,40 @@
1
+ require "test/unit"
2
+ require "regurgitator"
3
+ require "tempfile"
4
+
5
+ class TestListKeys < Test::Unit::TestCase
6
+ include Regurgitator::ListKeys
7
+ def setup
8
+ @tmp = Tempfile.new(%w(regurgitator_list_keys .sqlite3))
9
+ rv = system("sqlite3 #{@tmp.path} < t/fixtures.sql")
10
+ assert rv, $?.inspect
11
+ @db = Sequel.connect("sqlite://#{@tmp.path}")
12
+ domain_init
13
+ end
14
+
15
+ def test_list_keys
16
+ a = list_keys("d", {})
17
+ assert_kind_of Array, a
18
+ row = a[0]
19
+ assert_equal "blah", row[:dkey]
20
+ [ :fid, :length, :devcount, :classid ].each do |key|
21
+ assert_kind_of Integer, row[key]
22
+ end
23
+
24
+ list_keys("d", {:prefix => "bla"})
25
+ assert_equal row, a[0]
26
+ assert_empty list_keys("d", {:prefix => "blahh"})
27
+ assert_empty list_keys("d", {:prefix => "bla", :after => "blah"})
28
+
29
+ assert_nil list_keys("afadf")
30
+ list_keys("d") { |r| assert_equal row, r }
31
+ end
32
+
33
+ def test_list_keys_insensitive
34
+ a = list_keys("d", :prefix => "B")
35
+ assert a.empty?, a.inspect << " not empty"
36
+ a = list_keys("d", :prefix => "b")
37
+ assert_equal 1, a.size
38
+ assert_equal "blah", a[0][:dkey]
39
+ end
40
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: regurgitator
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Regurgitators
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-11-11 00:00:00 Z
18
+ date: 2011-12-16 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rack
@@ -111,6 +111,7 @@ extra_rdoc_files:
111
111
  - lib/regurgitator/endpoint.rb
112
112
  - lib/regurgitator/file_info.rb
113
113
  - lib/regurgitator/file_request.rb
114
+ - lib/regurgitator/list_keys.rb
114
115
  - lib/regurgitator/local.rb
115
116
  - lib/regurgitator/local_file.rb
116
117
  - lib/regurgitator/one_domain.rb
@@ -143,6 +144,7 @@ files:
143
144
  - lib/regurgitator/endpoint.rb
144
145
  - lib/regurgitator/file_info.rb
145
146
  - lib/regurgitator/file_request.rb
147
+ - lib/regurgitator/list_keys.rb
146
148
  - lib/regurgitator/local.rb
147
149
  - lib/regurgitator/local_file.rb
148
150
  - lib/regurgitator/one_domain.rb
@@ -163,6 +165,7 @@ files:
163
165
  - t/t0002-domain_host.sh
164
166
  - t/t0003-one_domain.sh
165
167
  - t/test-lib.sh
168
+ - test/test_list_keys.rb
166
169
  - test/test_local.rb
167
170
  - test/test_server_settings.rb
168
171
  homepage: http://bogomips.org/regurgitator/
@@ -197,10 +200,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
200
  requirements: []
198
201
 
199
202
  rubyforge_project: rainbows
200
- rubygems_version: 1.8.5
203
+ rubygems_version: 1.8.11
201
204
  signing_key:
202
205
  specification_version: 3
203
206
  summary: read-only Rack endpoints for MogileFS
204
207
  test_files:
205
208
  - test/test_local.rb
206
209
  - test/test_server_settings.rb
210
+ - test/test_list_keys.rb