gflocator 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ .rbenv-version
2
+ *.gem
3
+ .bundle
4
+ Gemfile.lock
5
+ pkg/*
6
+ test/.t
7
+ tmp/*
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2012, Internet Initiative Japan Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are
6
+ met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above
12
+ copyright notice, this list of conditions and the following
13
+ disclaimer in the documentation and/or other materials provided
14
+ with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,14 @@
1
+ # gflocator
2
+
3
+ gflocator is a daemon for providing responses to queries against file locations of GlusterFS
4
+
5
+ ## Installation and Usage
6
+
7
+ gem install gflocator
8
+ sudo gflocator
9
+
10
+ (gflocator must run as root)
11
+
12
+ ## Copyright
13
+
14
+ Copyright:: Copyright (c) 2012, Internet Initiative Japan Inc. All rights reserved.
@@ -0,0 +1,4 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new
@@ -0,0 +1,5 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'gflocator'
4
+
5
+ Gflocator::Main.run
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "gflocator/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "gflocator"
7
+ s.version = Gflocator::VERSION
8
+ s.authors = ["maebashi"]
9
+ s.homepage = ""
10
+ s.summary = %q{file location server for GlusterFS}
11
+ s.description = %q{a daemon for providing responses to queries against file locations of GlusterFS}
12
+
13
+ s.files = `git ls-files`.split("\n").select {|e| /^tmp/!~e}
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.require_paths = ["lib"]
17
+
18
+ s.add_runtime_dependency "msgpack-rpc"
19
+ s.add_runtime_dependency "ffi-xattr"
20
+ end
@@ -0,0 +1,5 @@
1
+ Encoding.default_external = 'ascii-8bit' if RUBY_VERSION > '1.9'
2
+
3
+ require 'gflocator/util_daemon'
4
+ require 'gflocator/handler'
5
+ require 'gflocator/main'
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ begin
3
+ require 'xattr'
4
+ rescue LoadError
5
+ end
6
+ unless defined? XAttr
7
+ require 'ffi-xattr'
8
+ end
9
+
10
+ module Gflocator
11
+ class Handler
12
+ if defined? XAttr
13
+ def xattr_get path, name
14
+ XAttr.get path, name
15
+ end
16
+ else
17
+ def xattr_get path, name
18
+ Xattr::Lib.get path, false, name
19
+ end
20
+ end
21
+
22
+ def get_locations args, glob_flag
23
+ if glob_flag
24
+ paths = Dir.glob args.join("\0")
25
+ else
26
+ paths = args
27
+ end
28
+ name = 'trusted.glusterfs.pathinfo'
29
+ locations = {}
30
+ for path in paths
31
+ if (loc_str = xattr_get(path, name))
32
+ res = loc_str.scan(/<POSIX(?:\([^\)]+\))?:([-\w\.]+):([^>]+)>/)
33
+ locations[path] = res
34
+ else
35
+ raise RuntimeError, 'getxattr failed'
36
+ end
37
+ end
38
+ locations
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ require 'optparse'
2
+
3
+ require 'rubygems'
4
+ require 'msgpack-rpc'
5
+
6
+ module Gflocator
7
+ class Main
8
+ OPTS = {:daemonize=>true}
9
+
10
+ def self.run
11
+ new.run OPTS
12
+ end
13
+
14
+ def run options={}
15
+ optparser = optparse options
16
+ optparser.parse!
17
+ host = options[:bind_host] || '0.0.0.0'
18
+ port = options[:bind_port] || 7076
19
+
20
+ raise RuntimeError, 'must run as root' unless Process.euid.zero?
21
+ handler = Handler.new
22
+ server = MessagePack::RPC::Server.new
23
+ server.listen host, port, handler
24
+ Process.daemon true if options[:daemonize] and !$debug
25
+ server.run
26
+ end
27
+
28
+ def optparse options={}
29
+ optparser = OptionParser.new
30
+ optparser.on('--debug') {$debug = true; STDOUT.sync = true}
31
+ optparser.on('-h', '--bind-host=HOST', 'bind to HOST address') {|a|
32
+ options[:bind_host] = a}
33
+ optparser.on('-p', '--bind-port=PORT', Integer, 'bind to port PORT') {|a|
34
+ options[:bind_port] = a}
35
+ class <<optparser
36
+ attr_accessor :options
37
+ end
38
+ optparser.options = options
39
+ optparser
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,18 @@
1
+ module Process
2
+ class << self
3
+ unless method_defined?(:daemon)
4
+ def daemon(nochdir = nil, noclose = nil)
5
+ exit!(0) if Process.fork
6
+ Process.setsid
7
+ exit!(0) if Process.fork
8
+ Dir.chdir("/") unless nochdir
9
+ unless noclose
10
+ STDIN.reopen("/dev/null", "r")
11
+ STDOUT.reopen("/dev/null", "w")
12
+ STDERR.reopen("/dev/null", "w")
13
+ end
14
+ 0
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Gflocator
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/unittest_helper')
2
+
3
+ require 'gflocator/handler'
4
+
5
+ class Gflocator::Handler
6
+ attr_accessor :t
7
+
8
+ def xattr_get path, name
9
+ path.sub!(%r{^/}, '')
10
+ case @t
11
+ when :g33b2
12
+ "(<DISTRIBUTE:test-dht> <POSIX:g33b2.example.com:/glusterfs/t/#{path}>)"
13
+ when :g33b2r
14
+ "(<DISTRIBUTE:test-dht> (<REPLICATE:test-replicate-6> <POSIX:a006.example.com:/glusterfs/t/test/#{path}> <POSIX:b006.example.com:/glusterfs/t/test/#{path}>))"
15
+ else
16
+ "(<DISTRIBUTE:test-dht> <POSIX(/glusterfs/t):g330.example.com:/glusterfs/t/#{path}>)"
17
+ end
18
+ end
19
+ end
20
+
21
+ class TestHandler < Test::Unit::TestCase
22
+ def setup
23
+ @handler = Gflocator::Handler.new
24
+ end
25
+
26
+ def test_handler
27
+ files = ['file1', 'file2']
28
+ res = @handler.get_locations files, false
29
+ ae 2, res.size
30
+ files.each {|f|
31
+ ae 1, res[f].size
32
+ ae 2, res[f].first.size
33
+ }
34
+ @handler.t = :g33b2
35
+ res = @handler.get_locations files, false
36
+ files.each {|f|
37
+ ae 1, res[f].size
38
+ ae 2, res[f].first.size
39
+ }
40
+ @handler.t = :g33b2r
41
+ res = @handler.get_locations files, false
42
+ files.each {|f|
43
+ ae 2, res[f].size
44
+ ae 2, res[f].first.size
45
+ }
46
+ end
47
+ end
@@ -0,0 +1,56 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'pp'
4
+
5
+ $test_dir = File.expand_path File.dirname(__FILE__)
6
+ $:.unshift $test_dir
7
+ $:.unshift($test_dir + '/../lib')
8
+ $test = true
9
+ $debug = true
10
+
11
+ begin
12
+ require 'rubygems'
13
+ require 'test/unit/ui/console/testrunner'
14
+ require 'term/ansicolor'
15
+ Term::ANSIColor::coloring = STDERR.tty?
16
+ module Test
17
+ module Unit
18
+ module UI
19
+ module Console
20
+ class TestRunner
21
+ include Term::ANSIColor
22
+ def output_single(something, level=NORMAL)
23
+ if output?(level)
24
+ @io.write(send(something == '.' ? 'on_green' : 'on_red', something))
25
+ end
26
+ @io.flush
27
+ end
28
+ def output(something, level=NORMAL)
29
+ if output?(level)
30
+ if something.respond_to?('passed?')
31
+ @io.puts(send(something.passed? ? 'on_green' : 'on_red', something.to_s))
32
+ else
33
+ @io.puts(something)
34
+ end
35
+ end
36
+ @io.flush
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ rescue LoadError
44
+ end
45
+
46
+ module Test
47
+ module Unit
48
+ module Assertions
49
+ alias ae assert_equal
50
+ end
51
+ end
52
+ end
53
+
54
+ unless ARGV.grep(/--show-log/).empty?
55
+ $show_log = true
56
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gflocator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - maebashi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: msgpack-rpc
16
+ requirement: &22849380 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *22849380
25
+ - !ruby/object:Gem::Dependency
26
+ name: ffi-xattr
27
+ requirement: &22848940 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *22848940
36
+ description: a daemon for providing responses to queries against file locations of
37
+ GlusterFS
38
+ email:
39
+ executables:
40
+ - gflocator
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - LICENSE
46
+ - README.md
47
+ - Rakefile
48
+ - bin/gflocator
49
+ - gflocator.gemspec
50
+ - lib/gflocator.rb
51
+ - lib/gflocator/handler.rb
52
+ - lib/gflocator/main.rb
53
+ - lib/gflocator/util_daemon.rb
54
+ - lib/gflocator/version.rb
55
+ - test/test_handler.rb
56
+ - test/unittest_helper.rb
57
+ homepage: ''
58
+ licenses: []
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubyforge_project:
77
+ rubygems_version: 1.8.11
78
+ signing_key:
79
+ specification_version: 3
80
+ summary: file location server for GlusterFS
81
+ test_files:
82
+ - test/test_handler.rb
83
+ - test/unittest_helper.rb