This FS, authored by Kent Sibilev, allows you to mount remote directories, by having a ruby Drb server, and Drb+FuseFS
client.
In other words: Rather than setting up samba, its passwords, etc etc, just run server.rb on your windows box, and client.rb
on your linux box!
Thanks, Kent!
###### server.rb: #####
#!/usr/bin/env ruby
require 'drb'
class RemoteDirectory
def initialize(dir)
@dir = dir
@files = {}
end
def contents(path)
Dir[File.join(@dir, path,'*')].map{|fn| File.basename fn}
end
%w|file? directory? executable? size delete|.each do |name|
define_method(name) do |path|
File.send name, File.join(@dir, path)
end
end
%w|mkdir rmdir|.each do |name|
define_method(name) do |path|
Dir.send name, File.join(@dir, path)
end
end
%w|can_write? can_delete? can_mkdir? can_rmdir?|.each do |name|
define_method(name) do |path|
true
end
end
def raw_open(path, mode)
return true if @files.has_key? path
@files[path] = File.open(File.join(@dir, path), mode)
return true
rescue
puts $!
false
end
def raw_read(path, off, size)
file = @files[path]
return unless file
file.seek(off, File::SEEK_SET)
file.read(size)
rescue
puts $!
nil
end
def raw_write(path, off, sz, buf)
file = @files[path]
return unless file
file.seek(off, File::SEEK_SET)
file.write(buf[0, sz])
rescue
puts $!
end
def raw_close(path)
file = @files[path]
return unless file
file.close
@files.delete path
rescue
puts $!
end
end
if $0 == __FILE__
dir = RemoteDirectory.new ARGV.shift || '.'
uri = ARGV.shift || 'druby://0.0.0.0:7777'
DRb.start_service uri, dir
puts DRb.uri
DRb.thread.join
end
####### rubyfs.rb: #######
#!/usr/bin/env ruby
require 'drb'
require 'fusefs'
unless (1..2).include? ARGV.size
puts "Usage: #$0 <directory> <uri>"
exit(1)
end
dir = ARGV.shift
uri = ARGV.shift || 'druby://0.0.0.0:7777'
DRb.start_service(nil, nil)
root = DRbObject.new_with_uri(uri)
FuseFS.set_root(root)
FuseFS.mount_under(dir)
FuseFS.run |