Class: BBFS::FileMonitoring::FileStat

Inherits:
Object
  • Object
show all
Defined in:
lib/file_monitoring/monitor_path.rb

Overview

This class holds current state of file and methods to control and report changes

Direct Known Subclasses

DirStat

Constant Summary collapse

DEFAULT_STABLE_STATE =
10
@@log =
nil

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, stable_state = DEFAULT_STABLE_STATE) ⇒ FileStat

Initializes new file monitoring object

Arguments:

  • path - File location

  • stable_state - Number of iterations to move unchanged file to stable state



35
36
37
38
39
40
41
42
43
44
# File 'lib/file_monitoring/monitor_path.rb', line 35

def initialize(path, stable_state = DEFAULT_STABLE_STATE)
  @path ||= path
  @size = nil
  @creation_time = nil
  @modification_time = nil
  @cycles = 0  # number of iterations from the last file modification
  @state = FileStatEnum::NON_EXISTING

  @stable_state = stable_state  # number of iteration to move unchanged file to stable state
end

Instance Attribute Details

#cyclesObject (readonly)

Returns the value of attribute cycles.



24
25
26
# File 'lib/file_monitoring/monitor_path.rb', line 24

def cycles
  @cycles
end

#modification_timeObject (readonly)

Returns the value of attribute modification_time.



24
25
26
# File 'lib/file_monitoring/monitor_path.rb', line 24

def modification_time
  @modification_time
end

#pathObject (readonly)

Returns the value of attribute path.



24
25
26
# File 'lib/file_monitoring/monitor_path.rb', line 24

def path
  @path
end

#sizeObject (readonly)

Returns the value of attribute size.



24
25
26
# File 'lib/file_monitoring/monitor_path.rb', line 24

def size
  @size
end

#stable_stateObject (readonly)

Returns the value of attribute stable_state.



24
25
26
# File 'lib/file_monitoring/monitor_path.rb', line 24

def stable_state
  @stable_state
end

#stateObject

Returns the value of attribute state.



24
25
26
# File 'lib/file_monitoring/monitor_path.rb', line 24

def state
  @state
end

Class Method Details

.set_log(log) ⇒ Object

Sets a log file to report changes

Arguments:

  • log - already opened ruby File object



54
55
56
# File 'lib/file_monitoring/monitor_path.rb', line 54

def self.set_log (log)
  @@log = log
end

Instance Method Details

#==(other) ⇒ Object

Checks whether path and state are the same as of the argument



120
121
122
# File 'lib/file_monitoring/monitor_path.rb', line 120

def == (other)
  @path == other.path and @stable_state == other.stable_state
end

#changed?(file_stats) ⇒ Boolean

Checks that stored file attributes are the same as file attributes taken from file system.

Returns:

  • (Boolean)


94
95
96
97
98
# File 'lib/file_monitoring/monitor_path.rb', line 94

def changed?(file_stats)
  not (file_stats.size == @size &&
      file_stats.ctime.utc == @creation_time.utc &&
      file_stats.mtime.utc == @modification_time.utc)
end

#cur_statObject

Reports current state with identification.

# This format used by log file.


131
132
133
134
# File 'lib/file_monitoring/monitor_path.rb', line 131

def cur_stat
  # TODO what output format have to be ?
  Time.now.utc.to_s + " : " + self.state + " : " + self.path
end

#monitorObject

Checks whether file was changed from the last iteration.

For files size and modification time are checked.


60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/file_monitoring/monitor_path.rb', line 60

def monitor
  file_stats = File.lstat(@path) rescue nil
  new_state = nil
  if file_stats == nil
    new_state = FileStatEnum::NON_EXISTING
    @size = nil
    @creation_time = nil
    @modification_time = nil
    @cycles = 0
  elsif @size == nil
    new_state = FileStatEnum::NEW
    @size = file_stats.size
    @creation_time = file_stats.ctime.utc
    @modification_time = file_stats.mtime.utc
    @cycles = 0
  elsif changed?(file_stats)
    new_state = FileStatEnum::CHANGED
    @size = file_stats.size
    @creation_time = file_stats.ctime.utc
    @modification_time = file_stats.mtime.utc
    @cycles = 0
  else
    new_state = FileStatEnum::UNCHANGED
    @cycles += 1
    if @cycles >= @stable_state
      new_state = FileStatEnum::STABLE
    end
  end

  # The assignment
  self.state= new_state
end

#set_event_queue(queue) ⇒ Object



100
101
102
# File 'lib/file_monitoring/monitor_path.rb', line 100

def set_event_queue(queue)
  @event_queue = queue
end

#set_output_queue(event_queue) ⇒ Object



46
47
48
# File 'lib/file_monitoring/monitor_path.rb', line 46

def set_output_queue(event_queue)
  @event_queue = event_queue
end

#to_s(indent = 0) ⇒ Object

Returns path and state of the file with indentation



125
126
127
# File 'lib/file_monitoring/monitor_path.rb', line 125

def to_s (indent = 0)
  (" " * indent) + path.to_s + " : " + state.to_s
end