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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0bc143410b56c2bf8941c1304cbd80299b97dec6
4
- data.tar.gz: 0edd86910443f5ab7fa85af5b5fb6759b0cc72a3
3
+ metadata.gz: 9def1caf50b60b2a1a77ab47c0878a90375e73fd
4
+ data.tar.gz: d506dc1c06a51c97e32d4ac80cfc9fb857da6781
5
5
  SHA512:
6
- metadata.gz: adb1d29896b87a270060d69ca9b504928444d63fd0cb630951a9b37dcf30220b1c430ca492fd82346d5fd6a285a9fcebf8ca56768b00018f690031f53d557abb
7
- data.tar.gz: 661aedc9bc6ed135bbb95d95130b5f5c5290472b0cbabaeb366a34af41006995254ca8b27f427e2c2560b48139c34668e8ba94c50a9f2c8cdfe8ab4f74fab975
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
- # Set path to your Grouper API installation
8
- JGrouper.home '/path/to/your/grouper/api/installation/directory'
58
+ % jgrouper-exporter -h
9
59
 
10
60
  == Installation
11
61
 
@@ -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__) } [-h] [-s col1,colN] [-v]"
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.collect { |c| c.downcase.to_sym }
20
+ archiver.skip_columns = columns
15
21
  end
16
- opts.on( '-v', '--[no-]verbose', 'Enable verbose mode [DEFAULT: no]' ) do |verbose|
17
- archiver.verbose = verbose
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
- # == USAGE
8
+ # == Usage
9
9
  #
10
10
  # require 'jgrouper'
11
11
  # require 'jgrouper/audit_archiver'
12
12
  #
13
- # JGrouper::AuditArchiver.new { |archiver| archiver.archive }
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, :skip_columns, :verbose
35
+ attr_writer :directory, :number_of_days, :verbose
21
36
 
22
37
  def initialize
23
- @config = {}
24
- @conn = nil
25
- @directory = Dir.pwd
26
- @fh = nil
27
- @mappings = {}
28
- @skip_columns = []
29
- @start, @stop = Time.at(0), Time.at(0)
30
- @date = nil
31
- @verbose = false
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
- start_at = time_to_microseconds @start
47
- stop_at = time_to_microseconds @stop
48
-
49
- filehandle @directory, "grouper-audit-entries-#{ @date }.csv" do
50
- log "archiving #{ @date } ..."
51
-
52
- # TODO Extract!
53
- # TODO Use prepared statement when I get JRuby, JDBC & Oracle to better cooperate on BigDecimal-ish data types
54
- qry = "SELECT * FROM #{GROUPER_AUDIT_ENTRY} WHERE created_on BETWEEN #{start_at} AND #{stop_at} ORDER BY created_on"
55
- stmt = @conn.create_statement
56
- rs = stmt.execute_query qry
57
- md = rs.meta_data
58
- num_cols = md.column_count
59
- while rs.next
60
- entry = []
61
- 1.upto(num_cols) do |n|
62
- k = md.column_name(n).downcase.to_sym
63
- v = rs.get_object(n)
64
-
65
- next if v.nil?
66
- entry << k << v.to_s.gsub(/\n/, ', ')
67
- end
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
- entry = transform(entry)
70
- entries << entry.each_slice(2).reject { |slice| skip? slice.first }.collect { |slice| "#{slice.first}=#{slice.last}" }
88
+ entry = transform(entry)
89
+ entries << entry.each_slice(2).reject { |slice| skip? slice.first }.collect { |slice| "#{slice.first}=#{slice.last}" }
71
90
 
72
- @fh.puts CSV.generate_line( entries.last, col_sep: "\t" )
73
- yield entries.last if block_given?
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
- prune(entries.size, start_at, stop_at) unless entries.empty?
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
- entries
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
  #
@@ -1,4 +1,4 @@
1
1
  module JGrouper
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
4
4
 
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
- # # Set path to your Grouper API installation
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.1.1
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-15 00:00:00.000000000 Z
11
+ date: 2013-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler