jgrouper 0.1.1 → 0.2.0
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 +4 -4
- data/HISTORY.md +7 -0
- data/README.rdoc +52 -2
- data/bin/jgrouper-audit-archiver +13 -4
- data/lib/jgrouper/audit_archiver.rb +86 -50
- data/lib/jgrouper/version.rb +1 -1
- data/lib/jgrouper.rb +52 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9def1caf50b60b2a1a77ab47c0878a90375e73fd
|
4
|
+
data.tar.gz: d506dc1c06a51c97e32d4ac80cfc9fb857da6781
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdce81b2d092b14ce5e754e77533dd814c9ba5079a8a0c03cd87e14c346546e67dac986cdb441e850bd95f01069788b46f58c0c6801efb95570704569b2cc8fa
|
7
|
+
data.tar.gz: 4f1a97bf662d5ad4a3f5b2041469c275dd6ba98a45cab039d5ccdf32c6c6a2622895dd56e6fb61e649687e72f7dfa6314ba134db1daeca3ac458135025a7abbf
|
data/HISTORY.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
JGrouper History
|
2
2
|
================
|
3
3
|
|
4
|
+
2013-05-17 JGrouper v0.2.0
|
5
|
+
--------------------------
|
6
|
+
* Add "-d directory" option to "jgrouper-audit-archiver"
|
7
|
+
* Add "-n number of days" option to "jgrouper-audit-archiver"
|
8
|
+
* Add "-S stop date" option to "jgrouper-audit-archiver"
|
9
|
+
|
10
|
+
|
4
11
|
2013-05-15 JGrouper v0.1.1
|
5
12
|
--------------------------
|
6
13
|
* Fix executables to make runnable
|
data/README.rdoc
CHANGED
@@ -2,10 +2,60 @@
|
|
2
2
|
|
3
3
|
== Usage
|
4
4
|
|
5
|
+
=== API
|
6
|
+
|
5
7
|
require 'jgrouper'
|
8
|
+
JGrouper.home! '/path/to/your/grouper/api/installation/directory'
|
9
|
+
|
10
|
+
==== Members
|
11
|
+
|
12
|
+
# Find Member by UUID
|
13
|
+
m = JGrouper::Member.find uuid
|
14
|
+
|
15
|
+
==== Stems
|
16
|
+
|
17
|
+
# Find root stem
|
18
|
+
root = JGrouper::Stem.root
|
19
|
+
|
20
|
+
# Child stems
|
21
|
+
root.stems
|
22
|
+
|
23
|
+
# Child Groups
|
24
|
+
root.groups
|
25
|
+
|
26
|
+
# Find stem by name
|
27
|
+
stem = JGrouper::Stem.find name
|
28
|
+
|
29
|
+
==== Archiver
|
30
|
+
|
31
|
+
require 'jgrouper/audit_archiver'
|
32
|
+
|
33
|
+
JGrouper::AuditArchiver.new do |archiver|
|
34
|
+
# Write output to this directory
|
35
|
+
archiver.directory = '/some/directory'
|
36
|
+
|
37
|
+
# Archive this many days of audit log entries
|
38
|
+
archive.number_of_days = 5
|
39
|
+
|
40
|
+
# Omit these columns from the archive
|
41
|
+
archiver.skip_columns = %w( duration_microseconds hibernate_version_number query_count )
|
42
|
+
|
43
|
+
# Do not archive from this date onward.
|
44
|
+
archiver.stop_date = '2013-01-01'
|
45
|
+
|
46
|
+
# Perform archive, optionally yielding audit log entries being archived if block given
|
47
|
+
archiver.archive { |entry| ... audit log entry being archived ... }
|
48
|
+
end
|
49
|
+
|
50
|
+
=== Scripts
|
51
|
+
|
52
|
+
Archive Grouper audit log entries to disk:
|
53
|
+
|
54
|
+
% jgrouper-audit-archiver -h
|
55
|
+
|
56
|
+
Export (some of the) Groups registry to CSV:
|
6
57
|
|
7
|
-
|
8
|
-
JGrouper.home '/path/to/your/grouper/api/installation/directory'
|
58
|
+
% jgrouper-exporter -h
|
9
59
|
|
10
60
|
== Installation
|
11
61
|
|
data/bin/jgrouper-audit-archiver
CHANGED
@@ -8,18 +8,27 @@ require 'optparse'
|
|
8
8
|
JGrouper::AuditArchiver.new do |archiver|
|
9
9
|
|
10
10
|
opts = OptionParser.new do |opts|
|
11
|
-
opts.banner = "USAGE: #{ File.basename(__FILE__) } [
|
11
|
+
opts.banner = "USAGE: #{ File.basename(__FILE__) } [options]"
|
12
12
|
|
13
|
+
opts.on( '-d', '--directory DIR', 'Write output to this diretory [DEFAULT: .]' ) do |directory|
|
14
|
+
archiver.directory = directory
|
15
|
+
end
|
16
|
+
opts.on( '-n', '--number DAYS', Integer, 'Archive this many days [DEFAULT: 1]' ) do |number|
|
17
|
+
archiver.number_of_days = number
|
18
|
+
end
|
13
19
|
opts.on( '-s', '--skip COLUMNS', Array, 'Exclude these GROUPER_AUDIT_ENTRY comma-separated column names from archive [DEFAULT: none]' ) do |columns|
|
14
|
-
archiver.skip_columns = columns
|
20
|
+
archiver.skip_columns = columns
|
15
21
|
end
|
16
|
-
opts.on( '-
|
17
|
-
archiver.
|
22
|
+
opts.on( '-S', '--stop DATE', 'So not archive entries from this date onward [DEFAULT: none]' ) do |date|
|
23
|
+
archiver.stop_date = date
|
18
24
|
end
|
19
25
|
opts.on_tail('-h', '--help', "Show this message") do
|
20
26
|
puts opts
|
21
27
|
exit
|
22
28
|
end
|
29
|
+
opts.on_tail( '-v', '--[no-]verbose', 'Enable verbose mode [DEFAULT: no]' ) do |verbose|
|
30
|
+
archiver.verbose = verbose
|
31
|
+
end
|
23
32
|
end.parse!
|
24
33
|
|
25
34
|
# TODO DRY
|
@@ -5,30 +5,46 @@ module JGrouper # :nodoc:
|
|
5
5
|
#
|
6
6
|
# = JGrouper::AuditArchiver - Archive Grouper audit log entries
|
7
7
|
#
|
8
|
-
# ==
|
8
|
+
# == Usage
|
9
9
|
#
|
10
10
|
# require 'jgrouper'
|
11
11
|
# require 'jgrouper/audit_archiver'
|
12
12
|
#
|
13
|
-
# JGrouper::AuditArchiver.new
|
13
|
+
# JGrouper::AuditArchiver.new do |archiver|
|
14
|
+
# # Write output to this directory
|
15
|
+
# archiver.directory = '/some/directory'
|
16
|
+
#
|
17
|
+
# # Archive this many days of audit log entries
|
18
|
+
# archive.number_of_days = 5
|
19
|
+
#
|
20
|
+
# # Omit these columns from the archive
|
21
|
+
# archiver.skip_columns = %w( duration_microseconds hibernate_version_number query_count )
|
22
|
+
#
|
23
|
+
# # Do not archive from this date onward.
|
24
|
+
# archiver.stop_date = '2013-01-01'
|
25
|
+
#
|
26
|
+
# # Perform archive, optionally yielding audit log entries being archived if block given
|
27
|
+
# archiver.archive { |entry| ... audit log entry being archived ... }
|
28
|
+
# end
|
14
29
|
#
|
15
30
|
class AuditArchiver
|
16
31
|
|
17
32
|
GROUPER_AUDIT_ENTRY = 'grouper_audit_entry'
|
18
33
|
GROUPER_AUDIT_TYPE = 'grouper_audit_type'
|
19
34
|
|
20
|
-
attr_writer :directory, :
|
35
|
+
attr_writer :directory, :number_of_days, :verbose
|
21
36
|
|
22
37
|
def initialize
|
23
|
-
@config
|
24
|
-
@conn
|
25
|
-
@
|
26
|
-
@
|
27
|
-
@
|
28
|
-
@
|
29
|
-
@
|
30
|
-
@
|
31
|
-
@
|
38
|
+
@config = {}
|
39
|
+
@conn = nil
|
40
|
+
@date = nil
|
41
|
+
@directory = Dir.pwd
|
42
|
+
@fh = nil
|
43
|
+
@mappings = {}
|
44
|
+
@number_of_days = 1
|
45
|
+
@skip_columns = []
|
46
|
+
@stop_date = nil
|
47
|
+
@verbose = false
|
32
48
|
yield self if block_given?
|
33
49
|
self
|
34
50
|
end
|
@@ -37,54 +53,70 @@ module JGrouper # :nodoc:
|
|
37
53
|
# Archive oldest date from 'grouper_audit_entry' table to file.
|
38
54
|
#
|
39
55
|
def archive
|
40
|
-
entries = []
|
41
|
-
|
42
56
|
log 'starting ...'
|
43
57
|
|
44
58
|
connect do
|
45
59
|
mappings do
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
60
|
+
1.upto @number_of_days do
|
61
|
+
@date = oldest_entry # Date of oldest entry
|
62
|
+
break if stop?
|
63
|
+
|
64
|
+
start_at = time_to_microseconds @date.to_time # @date start-of-day
|
65
|
+
stop_at = time_to_microseconds ( @date + 1 ).to_time - 1 # @date end-of-day
|
66
|
+
entries = []
|
67
|
+
|
68
|
+
filehandle @directory, "grouper-audit-entries-#{ @date }.csv" do
|
69
|
+
log "archiving #{ @date } ..."
|
70
|
+
|
71
|
+
# TODO Extract!
|
72
|
+
# TODO Use prepared statement when I get JRuby, JDBC & Oracle to better cooperate on BigDecimal-ish data types
|
73
|
+
qry = "SELECT * FROM #{GROUPER_AUDIT_ENTRY} WHERE created_on BETWEEN #{start_at} AND #{stop_at} ORDER BY created_on"
|
74
|
+
stmt = @conn.create_statement
|
75
|
+
rs = stmt.execute_query qry
|
76
|
+
md = rs.meta_data
|
77
|
+
num_cols = md.column_count
|
78
|
+
while rs.next
|
79
|
+
entry = []
|
80
|
+
1.upto(num_cols) do |n|
|
81
|
+
k = md.column_name(n).downcase.to_sym
|
82
|
+
v = rs.get_object(n)
|
83
|
+
|
84
|
+
next if v.nil?
|
85
|
+
entry << k << v.to_s.gsub(/\n/, ', ')
|
86
|
+
end
|
68
87
|
|
69
|
-
|
70
|
-
|
88
|
+
entry = transform(entry)
|
89
|
+
entries << entry.each_slice(2).reject { |slice| skip? slice.first }.collect { |slice| "#{slice.first}=#{slice.last}" }
|
71
90
|
|
72
|
-
|
73
|
-
|
91
|
+
@fh.puts CSV.generate_line( entries.last, col_sep: "\t" )
|
92
|
+
yield entries.last if block_given?
|
93
|
+
end
|
94
|
+
rs.close
|
95
|
+
stmt.close
|
96
|
+
|
97
|
+
log "archiving #{ @date } (#{entries.size} entries) - done"
|
74
98
|
end
|
75
|
-
rs.close
|
76
|
-
stmt.close
|
77
|
-
|
78
|
-
log "archiving #{ @date } (#{entries.size} entries) - done"
|
79
|
-
end
|
80
99
|
|
81
|
-
|
100
|
+
prune(entries.size, start_at, stop_at) unless entries.empty?
|
101
|
+
end
|
82
102
|
end
|
83
103
|
end
|
84
104
|
|
85
105
|
log 'done'
|
106
|
+
end
|
86
107
|
|
87
|
-
|
108
|
+
#
|
109
|
+
# Array of column names to omit from archive.
|
110
|
+
#
|
111
|
+
def skip_columns=(columns)
|
112
|
+
@skip_columns = columns.collect { |c| c.downcase.to_sym }
|
113
|
+
end
|
114
|
+
|
115
|
+
#
|
116
|
+
# Do not archive from this date onward.
|
117
|
+
#
|
118
|
+
def stop_date=(date)
|
119
|
+
@stop_date = Date.parse date
|
88
120
|
end
|
89
121
|
|
90
122
|
|
@@ -121,9 +153,6 @@ module JGrouper # :nodoc:
|
|
121
153
|
|
122
154
|
@conn = DriverManager.get_connection @config[:url], @config[:username], @config[:password]
|
123
155
|
@conn.auto_commit = false
|
124
|
-
@date = oldest_entry unless @date # Date of oldest entry
|
125
|
-
@start = @date.to_time # Start-of-day on @date
|
126
|
-
@stop = ( @date + 1 ).to_time - 1 # End-of-day on @date
|
127
156
|
yield self if block_given?
|
128
157
|
@conn.close
|
129
158
|
|
@@ -262,6 +291,13 @@ module JGrouper # :nodoc:
|
|
262
291
|
@skip_columns.include? name
|
263
292
|
end
|
264
293
|
|
294
|
+
#
|
295
|
+
# Have we reached stop date?
|
296
|
+
#
|
297
|
+
def stop?
|
298
|
+
@stop_date && @date >= @stop_date
|
299
|
+
end
|
300
|
+
|
265
301
|
#
|
266
302
|
# Convert time to microseconds
|
267
303
|
#
|
data/lib/jgrouper/version.rb
CHANGED
data/lib/jgrouper.rb
CHANGED
@@ -10,10 +10,60 @@ require 'jgrouper/version'
|
|
10
10
|
#
|
11
11
|
# == Usage
|
12
12
|
#
|
13
|
+
# === API
|
14
|
+
#
|
13
15
|
# require 'jgrouper'
|
16
|
+
# JGrouper.home! '/path/to/your/grouper/api/installation/directory'
|
17
|
+
#
|
18
|
+
# ==== Members
|
19
|
+
#
|
20
|
+
# # Find Member by UUID
|
21
|
+
# m = JGrouper::Member.find uuid
|
22
|
+
#
|
23
|
+
# ==== Stems
|
24
|
+
#
|
25
|
+
# # Find root stem
|
26
|
+
# root = JGrouper::Stem.root
|
27
|
+
#
|
28
|
+
# # Child stems
|
29
|
+
# root.stems
|
30
|
+
#
|
31
|
+
# # Child Groups
|
32
|
+
# root.groups
|
33
|
+
#
|
34
|
+
# # Find stem by name
|
35
|
+
# stem = JGrouper::Stem.find name
|
36
|
+
#
|
37
|
+
# ==== Archiver
|
38
|
+
#
|
39
|
+
# require 'jgrouper/audit_archiver'
|
40
|
+
#
|
41
|
+
# JGrouper::AuditArchiver.new do |archiver|
|
42
|
+
# # Write output to this directory
|
43
|
+
# archiver.directory = '/some/directory'
|
44
|
+
#
|
45
|
+
# # Archive this many days of audit log entries
|
46
|
+
# archive.number_of_days = 5
|
47
|
+
#
|
48
|
+
# # Omit these columns from the archive
|
49
|
+
# archiver.skip_columns = %w( duration_microseconds hibernate_version_number query_count )
|
50
|
+
#
|
51
|
+
# # Do not archive from this date onward.
|
52
|
+
# archiver.stop_date = '2013-01-01'
|
53
|
+
#
|
54
|
+
# # Perform archive, optionally yielding audit log entries being archived if block given
|
55
|
+
# archiver.archive { |entry| ... audit log entry being archived ... }
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# === Scripts
|
59
|
+
#
|
60
|
+
# Archive Grouper audit log entries to disk:
|
61
|
+
#
|
62
|
+
# % jgrouper-audit-archiver -h
|
63
|
+
#
|
64
|
+
# Export (some of the) Groups registry to CSV:
|
14
65
|
#
|
15
|
-
#
|
16
|
-
# JGrouper.home '/path/to/your/grouper/api/installation/directory'
|
66
|
+
# % jgrouper-exporter -h
|
17
67
|
#
|
18
68
|
# == Installation
|
19
69
|
#
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jgrouper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- blair christensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|