jgrouper 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|