rfusefs 1.0.1 → 1.0.2.RC0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,12 +1,14 @@
1
1
  require 'fusefs/pathmapper'
2
2
  require 'sqlite3'
3
- require 'rb-inotify'
4
3
  require 'thread'
5
4
 
6
5
  module FuseFS
7
6
 
8
7
  class SqliteMapperFS < PathMapperFS
9
8
 
9
+ # The database file
10
+ attr_reader :db_path
11
+
10
12
  # The database connection
11
13
  attr_reader :db
12
14
 
@@ -43,19 +45,13 @@ module FuseFS
43
45
  end
44
46
 
45
47
  # FuseFS callback when the filesystem is mounted
46
- # performs the initial scan and starts watching the database for changes
48
+ # Starts the scanning loop and performs the initial scan
47
49
  # @api FuseFS
48
50
  def mounted()
51
+ @mounted = true
49
52
  @mutex = Mutex.new
50
53
  @cv = ConditionVariable.new
51
- @mounted = true
52
-
53
- notifier = start_notifier
54
-
55
-
56
- @scan_thread = Thread.new() do
57
- scan_loop(notifier)
58
- end
54
+ @scan_thread = Thread.new() { scan_loop() }
59
55
  end
60
56
 
61
57
  # FuseFS callback when filesystem is unmounted
@@ -64,10 +60,16 @@ module FuseFS
64
60
  # @api FuseFS
65
61
  def unmounted()
66
62
  @mounted = false
67
- @mutex.synchronize { @cv.signal }
63
+ @mutex.synchronize { @cv.signal() }
68
64
  @scan_thread.join
69
65
  end
70
66
 
67
+
68
+ # Trigger a rescan of the database
69
+ def rescan()
70
+ @mutex.synchronize { @cv.signal() }
71
+ end
72
+
71
73
  # Executes the sql query and passes each row to map_row (or the block passed in {#initialize})
72
74
  #
73
75
  # Subclasses can override this method for pre/post scan processing, calling super as required
@@ -76,30 +78,19 @@ module FuseFS
76
78
  new_path, real_path, options = map_row(row)
77
79
  options ||= {}
78
80
  options[:sqlite_scan_id] = @scan_id
79
- map_file(new_path, real_path, options)
81
+ begin
82
+ map_file(new_path, real_path, options)
83
+ rescue StandardError => e
84
+ puts e
85
+ puts e.backtrace.join("\n")
86
+ end
80
87
  end
81
88
  cleanup() { |file_node| file_node.options[:sqlite_scan_id] != @scan_id }
82
89
  end
83
90
 
84
91
  private
85
92
 
86
- def start_notifier
87
- notifier = INotify::Notifier.new()
88
- modified = false
89
- notifier.watch(@db_path,:modify, :close_write) do |event|
90
- modified = true if event.flags.include?(:modify)
91
- if event.flags.include?(:close_write) && modified
92
- @mutex.synchronize {@cv.signal}
93
- modified = false
94
- end
95
- end
96
-
97
- Thread.new { notifier.run }
98
-
99
- notifier
100
- end
101
-
102
- def scan_loop(notifier)
93
+ def scan_loop()
103
94
  @mutex.synchronize() do
104
95
  @scan_id = 0
105
96
  while @mounted
@@ -118,7 +109,6 @@ module FuseFS
118
109
  end
119
110
  @cv.wait(@mutex)
120
111
  end
121
- notifier.stop
122
112
  end
123
113
  end
124
114
  end
data/lib/rfusefs.rb CHANGED
@@ -48,7 +48,12 @@ module FuseFS
48
48
  options = RFuse.parse_options(argv,*options)
49
49
 
50
50
  if options[:mountpoint]
51
- fs = yield options
51
+ begin
52
+ fs = yield options
53
+ rescue StandardError => ex
54
+ puts ex.message
55
+ puts ex.backtrace.join("\n")
56
+ end
52
57
 
53
58
  puts RFuse.usage(device,exec) if options[:help] || !fs
54
59
  puts "Options:\n" if options[:help]
@@ -62,18 +67,24 @@ module FuseFS
62
67
  end
63
68
 
64
69
  # Start the FuseFS root at mountpoint with opts.
70
+ #
71
+ # If not previously set, Signal traps for "TERM" and "INT" are added
72
+ # to exit the filesystem
73
+ #
65
74
  # @param [Object] root see {set_root}
66
75
  # @param mountpoint [String] {mount_under}
67
76
  # @param [String...] opts FUSE mount options see {mount_under}
68
77
  # @note RFuseFS extension
69
78
  # @return [void]
70
79
  def FuseFS.start(root,mountpoint,*opts)
71
- Signal.trap("TERM") { FuseFS.exit() }
72
- Signal.trap("INT") { FuseFS.exit() }
80
+ set_default_traps("TERM","INT") { FuseFS.exit }
73
81
  FuseFS.set_root(root)
74
- FuseFS.mount_under(mountpoint,*opts)
75
- FuseFS.run
76
- FuseFS.unmount()
82
+ begin
83
+ FuseFS.mount_under(mountpoint,*opts)
84
+ FuseFS.run
85
+ ensure
86
+ FuseFS.unmount()
87
+ end
77
88
  end
78
89
 
79
90
  # Forks {FuseFS.start} so you can access your filesystem with ruby File
@@ -100,7 +111,6 @@ module FuseFS
100
111
  if (mountpoint)
101
112
  if @mounts.has_key?(mountpoint)
102
113
  pid = @mounts[mountpoint]
103
- print "Sending TERM to forked FuseFS (#{pid})\n"
104
114
  Process.kill("TERM",pid)
105
115
  Process.waitpid(pid)
106
116
  else
@@ -143,16 +153,14 @@ module FuseFS
143
153
  def FuseFS.run
144
154
  @fs.mounted()
145
155
  @fuse.loop if @fuse.mounted?
156
+ ensure
146
157
  @fs.unmounted()
147
158
  end
148
159
 
149
160
  # Exit the run loop and teardown FUSE
150
161
  # Most useful from Signal.trap() or Kernel.at_exit()
151
162
  def FuseFS.exit
152
- @running = false
153
-
154
163
  if @fuse
155
- print "Exitting FUSE #{@fuse.mountname}\n"
156
164
  @fuse.exit
157
165
  end
158
166
  end
@@ -176,5 +184,16 @@ module FuseFS
176
184
  def self.handle_editor(bool)
177
185
  #do nothing
178
186
  end
187
+
188
+ private
189
+
190
+ def self.set_default_traps(*signals,&block)
191
+ signals.each do |sig|
192
+ old_proc = Signal.trap(sig,block)
193
+ unless "DEFAULT".eql?(old_proc)
194
+ Signal.trap(sig,old_proc)
195
+ end
196
+ end
197
+ end
179
198
  end
180
199
 
@@ -1,3 +1,3 @@
1
1
  module RFuseFS
2
- VERSION="1.0.1"
2
+ VERSION="1.0.2.RC0"
3
3
  end
data/rfusefs.gemspec CHANGED
@@ -26,5 +26,4 @@ Gem::Specification.new do |s|
26
26
  s.add_development_dependency("yard")
27
27
  s.add_development_dependency("redcarpet")
28
28
  s.add_development_dependency("sqlite3")
29
- s.add_development_dependency("rb-inotify")
30
29
  end
@@ -102,14 +102,14 @@ describe "SqliteMapper" do
102
102
  it "should add new files" do
103
103
  fixture.pathmap("added.txt","/textfiles/added.txt")
104
104
  fixture.db_force_write()
105
- sleep(0.3)
105
+ fs.rescan; sleep(0.3)
106
106
  fs.file?("/textfiles/added.txt").should be_true
107
107
  end
108
108
 
109
109
  it "should remove files and directories no longer mapped" do
110
110
  fixture.unpathmap("/textfiles/hello")
111
111
  fixture.db_force_write()
112
- sleep(0.3)
112
+ fs.rescan; sleep(0.3)
113
113
  fs.file?("/textfiles/hello").should be_false
114
114
  fs.directory?("/textfiles").should be_false
115
115
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rfusefs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: 1.0.2.RC0
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Grant Gardner
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-19 00:00:00.000000000 Z
12
+ date: 2014-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rfuse
@@ -107,22 +107,6 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
- - !ruby/object:Gem::Dependency
111
- name: rb-inotify
112
- requirement: !ruby/object:Gem::Requirement
113
- none: false
114
- requirements:
115
- - - ! '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ! '>='
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
110
  description: A more Ruby like way to write FUSE filesystems - inspired by (compatible
127
111
  with) FuseFS, implemented over RFuse
128
112
  email:
@@ -178,12 +162,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
178
162
  required_rubygems_version: !ruby/object:Gem::Requirement
179
163
  none: false
180
164
  requirements:
181
- - - ! '>='
165
+ - - ! '>'
182
166
  - !ruby/object:Gem::Version
183
- version: '0'
167
+ version: 1.3.1
184
168
  requirements: []
185
169
  rubyforge_project:
186
- rubygems_version: 1.8.24
170
+ rubygems_version: 1.8.23
187
171
  signing_key:
188
172
  specification_version: 3
189
173
  summary: Filesystem in Ruby Userspace