ixtlan-audit 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -89,10 +89,11 @@ module Ixtlan
89
89
  list.each do |audit|
90
90
  begin
91
91
  audit.save
92
+ warn audit.errors.inspect unless audit.valid?
92
93
  rescue => e
93
94
  warn "unexpected error - skip entry"
94
95
  warn e.message
95
- warn audit
96
+ warn audit.inspect
96
97
  end
97
98
  end
98
99
  list.clear
@@ -1,12 +1,37 @@
1
- require 'slf4r/logger'
2
-
1
+ #
2
+ # Copyright (C) 2012 Christian Meier
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
5
+ # this software and associated documentation files (the "Software"), to deal in
6
+ # the Software without restriction, including without limitation the rights to
7
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
8
+ # the Software, and to permit persons to whom the Software is furnished to do so,
9
+ # subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in all
12
+ # copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
16
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
17
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
18
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
+ #
3
21
  module Ixtlan
4
22
  module Audit
5
23
  class Manager
6
24
 
7
25
  private
8
26
 
9
- include ::Slf4r::Logger
27
+ if defined? ::Slf4r
28
+ include ::Slf4r::Logger
29
+ else
30
+ require 'logger'
31
+ def logger
32
+ @logger ||= Logger.new( STDOUT )
33
+ end
34
+ end
10
35
 
11
36
  def list
12
37
  Thread.current[:audit] ||= []
@@ -14,56 +39,90 @@ module Ixtlan
14
39
 
15
40
  public
16
41
 
17
- def initialize
18
- @model = ::Audit if defined? ::Audit
19
- @username_method = :login
20
- @keep_log = 90
42
+ attr_accessor :model, :block, :keep_logs
43
+
44
+ def initialize( model = nil, &block )
45
+ @model = model
46
+ @keep_logs = 90
47
+ block.call( self ) if block
48
+ @block = block
21
49
  end
22
50
 
23
- def username_method=(method)
24
- @username_method = method.to_sym if method
51
+ def model
52
+ @model ||= (Ixtlan::Audit::Audit rescue nil)
25
53
  end
26
-
27
- def model=(model)
28
- @model = model if model
54
+
55
+ def keep_logs=( keep )
56
+ old = @keep_logs
57
+ @keep_logs = keep
58
+ daily_cleanup if old != @keep_logs
29
59
  end
30
60
 
31
- def keep_log=(days)
32
- @keep_log = days.to_i
61
+ def keep_logs
62
+ if block
63
+ block.call( self )
64
+ end
65
+ @keep_logs
33
66
  end
34
67
 
35
- def push(message, username)
36
- list << @model.new(:date => DateTime.now, :message => message, :login => username) if @model
68
+ def push( username, path, obj )
69
+ if model
70
+ message =
71
+ if !obj.is_a?( String ) && obj.respond_to?( :collect )
72
+ if o = obj.first
73
+ "#{o.class}[ #{obj.size} ]"
74
+ else
75
+ "[ 0 ] - <EMPTY ARRAY>"
76
+ end
77
+ else
78
+ obj.to_s
79
+ end
80
+ list << model.new( :path => path,
81
+ :message => message,
82
+ :login => username || '???' )
83
+ end
84
+ list.last
37
85
  end
38
86
 
39
87
  def save_all
88
+ daily_cleanup
40
89
  list.each do |audit|
41
- audit.save
90
+ begin
91
+ audit.save
92
+ rescue => e
93
+ warn "unexpected error - skip entry"
94
+ warn e.message
95
+ warn audit
96
+ end
42
97
  end
43
- Thread.current[:audit] = nil
44
- end
45
-
46
- def username_method
47
- @username_method
98
+ list.clear
48
99
  end
49
100
 
50
101
  def daily_cleanup
51
- if @model
52
- if(!@last_cleanup.nil? && @last_cleanup < 1.days.ago)
53
- @last_cleanup = Date.today
54
- begin
55
- if defined? ::DataMapper
56
- @model.all(:date.lt => @keep_log.days.ago).destroy!
57
- else # ActiveRecord
58
- @model.all(:conditions => ["date < ?", @keep_log.days.ago]).each(&:delete)
59
- end
60
- @logger.info("cleaned audit logs")
61
- rescue Error
62
- # TODO log this !!
63
- end
102
+ return unless model
103
+ now = DateTime.now
104
+ if(@last_cleanup.nil? || @last_cleanup < (now - 1))
105
+ @last_cleanup = now
106
+ begin
107
+ delete_all( now - keep_logs )
108
+ logger.info "cleaned audit logs"
109
+ rescue Exception => e
110
+ logger.warn "error cleaning up audit logs: #{e.message}"
64
111
  end
65
112
  end
66
113
  end
114
+
115
+ private
116
+
117
+ if defined? ::DataMapper
118
+ def delete_all( expired )
119
+ model.all( :created_at.lte => expired ).destroy!
120
+ end
121
+ else # ActiveRecord
122
+ def delete_all( expired )
123
+ model.all( :conditions => ["created_at <= ?", expired] ).each(&:delete)
124
+ end
125
+ end
67
126
  end
68
127
  end
69
128
  end
@@ -18,14 +18,19 @@
18
18
  # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19
19
  # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
20
  #
21
- require 'slf4r/logger'
22
-
23
21
  module Ixtlan
24
22
  module Audit
25
23
  class UserLogger
26
24
 
27
- include ::Slf4r::Logger
28
-
25
+ if defined? ::Slf4r
26
+ include ::Slf4r::Logger
27
+ else
28
+ require 'logger'
29
+ def logger
30
+ @logger ||= Logger.new( STDOUT )
31
+ end
32
+ end
33
+
29
34
  def initialize(audit_manager)
30
35
  @manager = audit_manager
31
36
  end
@@ -80,9 +85,9 @@ module Ixtlan
80
85
  def log_user(user, message = nil, &block)
81
86
  user ||= "???"
82
87
  msg = "#{message}#{block.call if block}"
83
- @manager.push( user, msg.sub(/\ .*$/, ''), msg )
88
+ @manager.push( user, msg.sub(/\ .*$/, ''), msg.sub(/^[^\ ]*\ /, '') )
84
89
  logger.debug {"[#{user}] #{msg}" }
85
90
  end
86
91
  end
87
92
  end
88
- end
93
+ end
@@ -1,3 +1,23 @@
1
+ #
2
+ # Copyright (C) 2012 Christian Meier
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
5
+ # this software and associated documentation files (the "Software"), to deal in
6
+ # the Software without restriction, including without limitation the rights to
7
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
8
+ # the Software, and to permit persons to whom the Software is furnished to do so,
9
+ # subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in all
12
+ # copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
16
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
17
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
18
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
+ #
1
21
  require 'slf4r/logger'
2
22
 
3
23
  module Ixtlan
@@ -14,7 +34,7 @@ module Ixtlan
14
34
 
15
35
  def login_from(controller)
16
36
  user = controller.respond_to?(:current_user) ? controller.send(:current_user) : nil
17
- user.nil? ? nil: user.send(@manager.username_method)
37
+ user.nil? ? nil: (user.respond_to?(:login) ? user.login : user.username)
18
38
  end
19
39
 
20
40
  public
@@ -25,21 +45,30 @@ module Ixtlan
25
45
 
26
46
  def log_action(controller, message = nil)
27
47
  log_user(login_from(controller)) do
28
- as_xml = controller.response.content_type == 'application/xml' ? " - xml" : ""
29
48
  if controller.params[:controller]
30
- audits = controller.instance_variable_get("@#{controller.params[:controller].to_sym}")
31
- if(audits)
32
- "#{controller.params[:controller]}##{controller.params[:action]} #{audits.model.to_s.plural}[#{audits.size}]#{as_xml}#{message}"
49
+ clname = controller.params[:controller]
50
+ cname = clname.sub(/^.*\//, '')
51
+ audits = controller.instance_variable_get("@#{cname}")
52
+ if(audits && audits.respond_to?(:collect))
53
+ "#{clname}##{controller.params[:action]} #{cname.classify}[#{audits.size}]#{message}"
33
54
  else
34
- audit = controller.instance_variable_get("@#{controller.params[:controller].singular.to_sym}")
55
+ audit = audits || controller.instance_variable_get("@#{cname.singularize}")
35
56
  if(audit)
36
57
  errors = if(audit.respond_to?(:errors) && !audit.errors.empty?)
37
58
  " - errors: " + audit.errors.full_messages.join(", ")
38
59
  end
39
- audit_log = audit.respond_to?(:to_log) ? audit.to_log : "#{audit.model}(#{audit.key})"
40
- "#{controller.params[:controller]}##{controller.params[:action]} #{audit_log}#{as_xml}#{message}#{errors}"
60
+ audit_log = if audit.respond_to?(:to_log)
61
+ audit.to_log
62
+ elsif audit.is_a? String
63
+ audit
64
+ elsif audit.respond_to?(:model)
65
+ "#{audit.model}(#{audit.id})"
66
+ else
67
+ "#{audit.class.name}(#{audit.id})"
68
+ end
69
+ "#{clname}##{controller.params[:action]} #{audit_log}#{message}#{errors}"
41
70
  else
42
- "#{controller.params[:controller]}##{controller.params[:action]}#{as_xml}#{message}"
71
+ "#{clname}##{controller.params[:action]}#{message}"
43
72
  end
44
73
  end
45
74
  else
@@ -51,9 +80,9 @@ module Ixtlan
51
80
  def log_user(user, message = nil, &block)
52
81
  user ||= "???"
53
82
  msg = "#{message}#{block.call if block}"
54
- @manager.push( msg, user)
55
- @logger.debug {"[#{user}] #{msg}" }
83
+ @manager.push( user, msg.sub(/\ .*$/, ''), msg )
84
+ logger.debug {"[#{user}] #{msg}" }
56
85
  end
57
86
  end
58
87
  end
59
- end
88
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ixtlan-audit
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 2
10
- version: 0.3.2
9
+ - 3
10
+ version: 0.3.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Christian Meier
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-12-30 00:00:00 Z
18
+ date: 2013-01-16 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: slf4r