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 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