rfusefs 1.0.2 → 1.1.3
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.
- checksums.yaml +5 -13
- data/.yardopts +2 -0
- data/CHANGES.md +43 -0
- data/LICENSE +24 -0
- data/README.md +83 -0
- data/TODO.md +7 -0
- data/lib/fuse/fusedir.rb +17 -2
- data/lib/fuse/rfusefs-fuse.rb +446 -414
- data/lib/fusefs/metadir.rb +5 -5
- data/lib/fusefs/pathmapper.rb +7 -7
- data/lib/fusefs/sqlitemapper.rb +7 -2
- data/lib/rfusefs.rb +20 -48
- data/lib/rfusefs/version.rb +1 -1
- metadata +35 -53
- data/.gitignore +0 -9
- data/.travis.yml +0 -8
- data/Gemfile +0 -4
- data/History.rdoc +0 -28
- data/README.rdoc +0 -107
- data/Rakefile +0 -22
- data/TODO.txt +0 -6
- data/rfusefs.gemspec +0 -31
- data/samples/demo.rb +0 -57
- data/samples/dictfs.rb +0 -74
- data/samples/hello.rb +0 -20
- data/samples/openurifs.rb +0 -53
- data/samples/railsfs.rb +0 -77
- data/samples/sqlfs.rb +0 -134
- data/samples/yamlfs.rb +0 -168
- data/spec-fusefs/fusefs_spec.rb +0 -12
- data/spec/metadir_spec.rb +0 -364
- data/spec/mount_unmount_spec.rb +0 -21
- data/spec/pathmapper_spec.rb +0 -417
- data/spec/rfusefs_spec.rb +0 -497
- data/spec/sample_spec.rb +0 -30
- data/spec/spec_helper.rb +0 -42
- data/spec/sqlitemapper_spec.rb +0 -135
data/lib/fusefs/metadir.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module FuseFS
|
2
2
|
|
3
3
|
# A full in-memory filesystem defined with hashes. It is writable to the
|
4
|
-
# user that mounted it
|
4
|
+
# user that mounted it
|
5
5
|
# may create and edit files within it, as well as the programmer
|
6
6
|
# === Usage
|
7
7
|
# root = Metadir.new()
|
@@ -14,10 +14,10 @@ module FuseFS
|
|
14
14
|
# Because Metadir is fully recursive, you can mount your own or other defined
|
15
15
|
# directory structures under it. For example, to mount a dictionary filesystem
|
16
16
|
# (see samples/dictfs.rb), use:
|
17
|
-
#
|
17
|
+
#
|
18
18
|
# root.mkdir("/dict",DictFS.new())
|
19
|
-
#
|
20
|
-
class MetaDir
|
19
|
+
#
|
20
|
+
class MetaDir
|
21
21
|
|
22
22
|
DEFAULT_FS = FuseDir.new()
|
23
23
|
|
@@ -66,7 +66,7 @@ module FuseFS
|
|
66
66
|
# Extended attributes
|
67
67
|
def xattr(path)
|
68
68
|
pathmethod(:xattr,path) do | path |
|
69
|
-
@xattr[path]
|
69
|
+
@xattr[path]
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
data/lib/fusefs/pathmapper.rb
CHANGED
@@ -13,7 +13,7 @@ module FuseFS
|
|
13
13
|
#
|
14
14
|
class PathMapperFS < FuseDir
|
15
15
|
|
16
|
-
# Represents a
|
16
|
+
# Represents a mapped file or directory
|
17
17
|
class MNode
|
18
18
|
|
19
19
|
# Merge extended attributes with the ones from the underlying file
|
@@ -112,10 +112,10 @@ module FuseFS
|
|
112
112
|
end
|
113
113
|
|
114
114
|
# Compatibility and convenience method
|
115
|
-
# @param [:pm_real_path,String,Symbol] key
|
116
|
-
# @return [String] {#real_path} if key == :pm_real_path
|
115
|
+
# @param [:pm_real_path,String,Symbol] key
|
116
|
+
# @return [String] {#real_path} if key == :pm_real_path
|
117
117
|
# @return [MNode] the node representing the file named key
|
118
|
-
# @return [Object] shortcut for {#options}[key]
|
118
|
+
# @return [Object] shortcut for {#options}[key]
|
119
119
|
def[](key)
|
120
120
|
case key
|
121
121
|
when :pm_real_path
|
@@ -266,7 +266,7 @@ module FuseFS
|
|
266
266
|
# @yieldparam [Hash] filesystem node
|
267
267
|
# @yieldreturn [true,false] should this node be deleted
|
268
268
|
def cleanup(&block)
|
269
|
-
recursive_cleanup(@root,&block)
|
269
|
+
recursive_cleanup(@root,&block)
|
270
270
|
end
|
271
271
|
|
272
272
|
|
@@ -379,7 +379,7 @@ module FuseFS
|
|
379
379
|
file.sysseek(offset)
|
380
380
|
file.syswrite(buf[0,sz])
|
381
381
|
end
|
382
|
-
|
382
|
+
|
383
383
|
# @!visibility private
|
384
384
|
def raw_sync(path,datasync,file=nil)
|
385
385
|
file = @openfiles[path] unless file
|
@@ -393,7 +393,7 @@ module FuseFS
|
|
393
393
|
# @!visibility private
|
394
394
|
def raw_close(path,file=nil)
|
395
395
|
file = @openfiles.delete(path) unless file
|
396
|
-
|
396
|
+
|
397
397
|
if file && !file.closed?
|
398
398
|
begin
|
399
399
|
flags = file.fcntl(Fcntl::F_GETFL) & Fcntl::O_ACCMODE
|
data/lib/fusefs/sqlitemapper.rb
CHANGED
@@ -15,7 +15,7 @@ module FuseFS
|
|
15
15
|
# Maintains a count of the number of times through the scan loop
|
16
16
|
attr_reader :scan_id
|
17
17
|
|
18
|
-
#
|
18
|
+
#
|
19
19
|
#
|
20
20
|
# @param [String] db_path Path to Sqlite database
|
21
21
|
# @param [String] sql query
|
@@ -55,7 +55,7 @@ module FuseFS
|
|
55
55
|
end
|
56
56
|
|
57
57
|
# FuseFS callback when filesystem is unmounted
|
58
|
-
#
|
58
|
+
#
|
59
59
|
# Stops the database watching threads
|
60
60
|
# @api FuseFS
|
61
61
|
def unmounted()
|
@@ -88,6 +88,11 @@ module FuseFS
|
|
88
88
|
cleanup() { |file_node| file_node.options[:sqlite_scan_id] != @scan_id }
|
89
89
|
end
|
90
90
|
|
91
|
+
# Rescan on HUP signal
|
92
|
+
def sighup
|
93
|
+
rescan()
|
94
|
+
end
|
95
|
+
|
91
96
|
private
|
92
97
|
|
93
98
|
def scan_loop()
|
data/lib/rfusefs.rb
CHANGED
@@ -45,28 +45,14 @@ module FuseFS
|
|
45
45
|
# end
|
46
46
|
#
|
47
47
|
def FuseFS.main(argv=ARGV,options=[],option_usage="",device=nil,exec=File.basename($0))
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
fs = yield options
|
53
|
-
rescue StandardError => ex
|
54
|
-
puts ex.message
|
55
|
-
puts ex.backtrace.join("\n")
|
56
|
-
end
|
57
|
-
|
58
|
-
puts RFuse.usage(device,exec) if options[:help] || !fs
|
59
|
-
puts "Options:\n" if options[:help]
|
60
|
-
|
61
|
-
FuseFS.start(fs,*argv) if fs || options[:help]
|
62
|
-
|
63
|
-
puts option_usage if options[:help]
|
64
|
-
else
|
65
|
-
puts "rfusefs: failed, no mountpoint provided",RFuse.usage(device,exec)
|
48
|
+
RFuse.main(argv,options,option_usage,device,exec) do |options,argv|
|
49
|
+
root = yield options
|
50
|
+
FuseFS.set_root(root)
|
51
|
+
FuseFS.mount_under(*argv)
|
66
52
|
end
|
67
53
|
end
|
68
54
|
|
69
|
-
# Start the FuseFS root at mountpoint with opts.
|
55
|
+
# Start the FuseFS root at mountpoint with opts.
|
70
56
|
#
|
71
57
|
# If not previously set, Signal traps for "TERM" and "INT" are added
|
72
58
|
# to exit the filesystem
|
@@ -77,7 +63,6 @@ module FuseFS
|
|
77
63
|
# @note RFuseFS extension
|
78
64
|
# @return [void]
|
79
65
|
def FuseFS.start(root,mountpoint,*opts)
|
80
|
-
set_default_traps("TERM","INT") { FuseFS.exit }
|
81
66
|
FuseFS.set_root(root)
|
82
67
|
begin
|
83
68
|
FuseFS.mount_under(mountpoint,*opts)
|
@@ -88,7 +73,7 @@ module FuseFS
|
|
88
73
|
end
|
89
74
|
|
90
75
|
# Forks {FuseFS.start} so you can access your filesystem with ruby File
|
91
|
-
# operations (eg for testing).
|
76
|
+
# operations (eg for testing).
|
92
77
|
# @note This is an *RFuseFS* extension
|
93
78
|
# @return [void]
|
94
79
|
def FuseFS.mount(root,mountpoint,*opts)
|
@@ -126,43 +111,40 @@ module FuseFS
|
|
126
111
|
end
|
127
112
|
end
|
128
113
|
|
129
|
-
# Set the root virtual directory
|
114
|
+
# Set the root virtual directory
|
130
115
|
# @param root [Object] an object implementing a subset of {FuseFS::API}
|
131
116
|
# @return [void]
|
132
117
|
def FuseFS.set_root(root)
|
133
|
-
@fs=
|
118
|
+
@fs=Fuse::Root.new(root)
|
134
119
|
end
|
135
120
|
|
136
121
|
# This will cause FuseFS to virtually mount itself under the given path. {set_root} must have
|
137
122
|
# been called previously.
|
138
123
|
# @param [String] mountpoint an existing directory where the filesystem will be virtually mounted
|
139
124
|
# @param [Array<String>] args
|
125
|
+
# @return [Fuse] the mounted fuse filesystem
|
140
126
|
# These are as expected by the "mount" command. Note in particular that the first argument
|
141
127
|
# is expected to be the mount point. For more information, see http://fuse.sourceforge.net
|
142
128
|
# and the manual pages for "mount.fuse"
|
143
|
-
def FuseFS.mount_under(mountpoint, *args)
|
144
|
-
@fuse =
|
129
|
+
def FuseFS.mount_under(mountpoint, *args)
|
130
|
+
@fuse = Fuse.new(@fs,mountpoint,*args)
|
145
131
|
end
|
146
132
|
|
147
|
-
# This is the main loop waiting on then executing filesystem operations from the
|
148
|
-
# kernel.
|
149
|
-
#
|
133
|
+
# This is the main loop waiting on, then executing, filesystem operations from the
|
134
|
+
# kernel.
|
135
|
+
#
|
150
136
|
# Note: Running in a separate thread is generally not useful. In particular
|
151
|
-
# you cannot access your filesystem
|
137
|
+
# you cannot use Ruby File operations to access your filesystem from
|
138
|
+
# within the ruby process that calls run.
|
152
139
|
# @note RFuseFS extension
|
153
140
|
def FuseFS.run
|
154
|
-
@
|
155
|
-
@fuse.loop if @fuse.mounted?
|
156
|
-
ensure
|
157
|
-
@fs.unmounted()
|
141
|
+
@fuse.run()
|
158
142
|
end
|
159
143
|
|
160
|
-
# Exit the run loop and teardown FUSE
|
161
|
-
# Most useful from Signal.trap() or Kernel.at_exit()
|
144
|
+
# Exit the run loop and teardown FUSE
|
145
|
+
# Most useful from Signal.trap() or Kernel.at_exit()
|
162
146
|
def FuseFS.exit
|
163
|
-
if @fuse
|
164
|
-
@fuse.exit
|
165
|
-
end
|
147
|
+
@fuse.exit if @fuse
|
166
148
|
end
|
167
149
|
|
168
150
|
# @return [Fixnum] the calling process uid
|
@@ -188,15 +170,5 @@ module FuseFS
|
|
188
170
|
#do nothing
|
189
171
|
end
|
190
172
|
|
191
|
-
private
|
192
|
-
|
193
|
-
def self.set_default_traps(*signals,&block)
|
194
|
-
signals.each do |sig|
|
195
|
-
old_proc = Signal.trap(sig,block)
|
196
|
-
unless "DEFAULT".eql?(old_proc)
|
197
|
-
Signal.trap(sig,old_proc)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
173
|
end
|
202
174
|
|
data/lib/rfusefs/version.rb
CHANGED
metadata
CHANGED
@@ -1,125 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rfusefs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grant Gardner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rfuse
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: '1.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: '1.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: yard
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: redcarpet
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: sqlite3
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: sys-filesystem
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: ffi-xattr
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: 0.1.1
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 0.1.1
|
125
125
|
description: A more Ruby like way to write FUSE filesystems - inspired by (compatible
|
@@ -128,15 +128,14 @@ email:
|
|
128
128
|
- grant@lastweekend.com.au
|
129
129
|
executables: []
|
130
130
|
extensions: []
|
131
|
-
extra_rdoc_files:
|
131
|
+
extra_rdoc_files:
|
132
|
+
- CHANGES.md
|
132
133
|
files:
|
133
|
-
- .
|
134
|
-
- .
|
135
|
-
-
|
136
|
-
-
|
137
|
-
-
|
138
|
-
- Rakefile
|
139
|
-
- TODO.txt
|
134
|
+
- ".yardopts"
|
135
|
+
- CHANGES.md
|
136
|
+
- LICENSE
|
137
|
+
- README.md
|
138
|
+
- TODO.md
|
140
139
|
- lib/fuse/fusedir.rb
|
141
140
|
- lib/fuse/rfusefs-fuse.rb
|
142
141
|
- lib/fusefs.rb
|
@@ -146,24 +145,9 @@ files:
|
|
146
145
|
- lib/fusefs/sqlitemapper.rb
|
147
146
|
- lib/rfusefs.rb
|
148
147
|
- lib/rfusefs/version.rb
|
149
|
-
- rfusefs.gemspec
|
150
|
-
- samples/demo.rb
|
151
|
-
- samples/dictfs.rb
|
152
|
-
- samples/hello.rb
|
153
|
-
- samples/openurifs.rb
|
154
|
-
- samples/railsfs.rb
|
155
|
-
- samples/sqlfs.rb
|
156
|
-
- samples/yamlfs.rb
|
157
|
-
- spec-fusefs/fusefs_spec.rb
|
158
|
-
- spec/metadir_spec.rb
|
159
|
-
- spec/mount_unmount_spec.rb
|
160
|
-
- spec/pathmapper_spec.rb
|
161
|
-
- spec/rfusefs_spec.rb
|
162
|
-
- spec/sample_spec.rb
|
163
|
-
- spec/spec_helper.rb
|
164
|
-
- spec/sqlitemapper_spec.rb
|
165
148
|
homepage: http://rubygems.org/gems/rfusefs
|
166
|
-
licenses:
|
149
|
+
licenses:
|
150
|
+
- MIT
|
167
151
|
metadata: {}
|
168
152
|
post_install_message:
|
169
153
|
rdoc_options: []
|
@@ -171,19 +155,17 @@ require_paths:
|
|
171
155
|
- lib
|
172
156
|
required_ruby_version: !ruby/object:Gem::Requirement
|
173
157
|
requirements:
|
174
|
-
- -
|
158
|
+
- - ">="
|
175
159
|
- !ruby/object:Gem::Version
|
176
|
-
version: '
|
160
|
+
version: '2.5'
|
177
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
162
|
requirements:
|
179
|
-
- -
|
163
|
+
- - ">="
|
180
164
|
- !ruby/object:Gem::Version
|
181
165
|
version: '0'
|
182
166
|
requirements: []
|
183
|
-
|
184
|
-
rubygems_version: 2.1.11
|
167
|
+
rubygems_version: 3.0.8
|
185
168
|
signing_key:
|
186
169
|
specification_version: 4
|
187
170
|
summary: Filesystem in Ruby Userspace
|
188
171
|
test_files: []
|
189
|
-
has_rdoc: yard
|