posgra 0.1.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.
@@ -0,0 +1,53 @@
1
+ class Posgra::DSL::Grants
2
+ include Posgra::Logger::Helper
3
+ include Posgra::TemplateHelper
4
+ include Posgra::Utils::Helper
5
+
6
+ def self.eval(dsl, path, options = {})
7
+ self.new(path, options) do
8
+ eval(dsl, binding, path)
9
+ end
10
+ end
11
+
12
+ attr_reader :result
13
+
14
+ def initialize(path, options = {}, &block)
15
+ @path = path
16
+ @options = options
17
+ @result = {}
18
+
19
+ @context = Hashie::Mash.new(
20
+ :path => path,
21
+ :options => options,
22
+ :templates => {},
23
+ )
24
+
25
+ instance_eval(&block)
26
+ end
27
+
28
+ private
29
+
30
+ def template(name, &block)
31
+ @context.templates[name.to_s] = block
32
+ end
33
+
34
+ def require(file)
35
+ pgrantfile = (file =~ %r|\A/|) ? file : File.expand_path(File.join(File.dirname(@path), file))
36
+
37
+ if File.exist?(pgrantfile)
38
+ instance_eval(File.read(pgrantfile), pgrantfile)
39
+ elsif File.exist?(pgrantfile + '.rb')
40
+ instance_eval(File.read(pgrantfile + '.rb'), pgrantfile + '.rb')
41
+ else
42
+ Kernel.require(file)
43
+ end
44
+ end
45
+
46
+ def role(name, &block)
47
+ name = name.to_s
48
+
49
+ if matched?(name, @options[:include_role], @options[:exclude_role])
50
+ @result[name] = Posgra::DSL::Grants::Role.new(@context, name, @options, &block).result
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,23 @@
1
+ class Posgra::DSL::Grants::Role
2
+ include Posgra::Logger::Helper
3
+ include Posgra::TemplateHelper
4
+ include Posgra::Utils::Helper
5
+
6
+ attr_reader :result
7
+
8
+ def initialize(context, role, options, &block)
9
+ @role = role
10
+ @options = options
11
+ @context = context.merge(:role => role)
12
+ @result = {}
13
+ instance_eval(&block)
14
+ end
15
+
16
+ def schema(name, &block)
17
+ name = name.to_s
18
+
19
+ if matched?(name, @options[:include_schema], @options[:exclude_schema])
20
+ @result[name] = Posgra::DSL::Grants::Role::Schema.new(@context, name, @options, &block).result
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ class Posgra::DSL::Grants::Role::Schema
2
+ include Posgra::Logger::Helper
3
+ include Posgra::TemplateHelper
4
+
5
+ attr_reader :result
6
+
7
+ def initialize(context, schema, options, &block)
8
+ @schema = schema
9
+ @options = options
10
+ @context = context.merge(:schema => schema)
11
+ @result = {}
12
+ instance_eval(&block)
13
+ end
14
+
15
+ def on(name, &block)
16
+ unless name.is_a?(Regexp)
17
+ name = name.to_s
18
+ end
19
+
20
+ @result[name] = Posgra::DSL::Grants::Role::Schema::On.new(@context, name, @options, &block).result
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ class Posgra::DSL::Grants::Role::Schema::On
2
+ include Posgra::Logger::Helper
3
+ include Posgra::TemplateHelper
4
+
5
+ attr_reader :result
6
+
7
+ def initialize(context, object, options, &block)
8
+ @object = object
9
+ @options = options
10
+ @context = context.merge(:object => object)
11
+ @result = {}
12
+ instance_eval(&block)
13
+ end
14
+
15
+ def grant(name, options = {})
16
+ name = name.to_s
17
+
18
+ @result[name] = {
19
+ 'is_grantable' => !!options[:grantable]
20
+ }
21
+ end
22
+ end
@@ -0,0 +1,67 @@
1
+ class Posgra::DSL::Roles
2
+ include Posgra::Logger::Helper
3
+ include Posgra::TemplateHelper
4
+ include Posgra::Utils::Helper
5
+
6
+ def self.eval(dsl, path, options = {})
7
+ self.new(path, options) do
8
+ eval(dsl, binding, path)
9
+ end
10
+ end
11
+
12
+ def result
13
+ @result.fetch(:users).uniq
14
+ @result
15
+ end
16
+
17
+ def initialize(path, options = {}, &block)
18
+ @path = path
19
+ @options = options
20
+ @result = {
21
+ :users => [],
22
+ :users_by_group => {},
23
+ }
24
+
25
+ @context = Hashie::Mash.new(
26
+ :path => path,
27
+ :options => options,
28
+ :templates => {},
29
+ )
30
+
31
+ instance_eval(&block)
32
+ end
33
+
34
+ private
35
+
36
+ def template(name, &block)
37
+ @context.templates[name.to_s] = block
38
+ end
39
+
40
+ def require(file)
41
+ pgrantfile = (file =~ %r|\A/|) ? file : File.expand_path(File.join(File.dirname(@path), file))
42
+
43
+ if File.exist?(pgrantfile)
44
+ instance_eval(File.read(pgrantfile), pgrantfile)
45
+ elsif File.exist?(pgrantfile + '.rb')
46
+ instance_eval(File.read(pgrantfile + '.rb'), pgrantfile + '.rb')
47
+ else
48
+ Kernel.require(file)
49
+ end
50
+ end
51
+
52
+ def user(name, &block)
53
+ name = name.to_s
54
+
55
+ if matched?(name, @options[:include_role], @options[:exclude_role])
56
+ @result[:users] << name
57
+ end
58
+ end
59
+
60
+ def group(name, &block)
61
+ name = name.to_s
62
+
63
+ if matched?(name, @options[:include_role], @options[:exclude_role])
64
+ @result[:users_by_group][name] = Posgra::DSL::Roles::Group.new(@context, name, @options, &block).result
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,24 @@
1
+ class Posgra::DSL::Roles::Group
2
+ include Posgra::Logger::Helper
3
+ include Posgra::TemplateHelper
4
+ include Posgra::Utils::Helper
5
+
6
+ attr_reader :result
7
+
8
+ def initialize(context, group, options, &block)
9
+ @group = group
10
+ @options = options
11
+ @context = context.merge(:group => group)
12
+ @result = []
13
+ instance_eval(&block) if block
14
+ end
15
+
16
+ def user(name)
17
+ name = name.to_s
18
+
19
+ if matched?(name, @options[:include_role], @options[:exclude_role])
20
+ name = name.kind_of?(Regexp) ? name : name.to_s
21
+ @result << name
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ class Posgra::Exporter
2
+ def self.export_roles(driver, options = {}, &block)
3
+ self.new(driver, options).export_roles(&block)
4
+ end
5
+
6
+ def self.export_grants(driver, options = {}, &block)
7
+ self.new(driver, options).export_grants(&block)
8
+ end
9
+
10
+ def initialize(driver, options = {})
11
+ @driver = driver
12
+ @options = options
13
+ end
14
+
15
+ def export_roles
16
+ {
17
+ :users => @driver.describe_users.keys,
18
+ :users_by_group => @driver.describe_groups,
19
+ }
20
+ end
21
+
22
+ def export_grants
23
+ @driver.describe_grants
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ class String
2
+ @@colorize = false
3
+
4
+ class << self
5
+ def colorize=(value)
6
+ @@colorize = value
7
+ end
8
+
9
+ def colorize
10
+ @@colorize
11
+ end
12
+ end # of class methods
13
+
14
+ Term::ANSIColor::Attribute.named_attributes.map do |attribute|
15
+ class_eval(<<-EOS, __FILE__, __LINE__ + 1)
16
+ def #{attribute.name}
17
+ if @@colorize
18
+ Term::ANSIColor.send(#{attribute.name.inspect}, self)
19
+ else
20
+ self
21
+ end
22
+ end
23
+ EOS
24
+ end
25
+ end
@@ -0,0 +1,2 @@
1
+ module Posgra::Identifier
2
+ end
@@ -0,0 +1,38 @@
1
+ class Posgra::Identifier::Auto
2
+ def initialize(output, options = {})
3
+ @output = output
4
+ @options = options
5
+ end
6
+
7
+ def identify(user)
8
+ password = mkpasswd
9
+ puts_password(user, password)
10
+ password
11
+ end
12
+
13
+ private
14
+
15
+ def mkpasswd(len = 8)
16
+ [*1..9, *'A'..'Z', *'a'..'z'].shuffle.slice(0, len).join
17
+ end
18
+
19
+ def puts_password(user, password)
20
+ open_output do |f|
21
+ f.puts("#{user},#{password}")
22
+ end
23
+ end
24
+
25
+ def open_output
26
+ return if @options[:dry_run]
27
+
28
+ if @output == '-'
29
+ yield($stdout)
30
+ $stdout.flush
31
+ else
32
+ open(@output, 'a') do |f|
33
+ yield(f)
34
+ f.flush
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,33 @@
1
+ class Posgra::Logger < ::Logger
2
+ include Singleton
3
+
4
+ def initialize
5
+ super($stdout)
6
+
7
+ self.formatter = proc do |severity, datetime, progname, msg|
8
+ "#{msg}\n"
9
+ end
10
+
11
+ self.level = Logger::INFO
12
+ end
13
+
14
+ def set_debug(value)
15
+ self.level = value ? Logger::DEBUG : Logger::INFO
16
+ end
17
+
18
+ module Helper
19
+ def log(level, message, options = {})
20
+ global_options = @options || {}
21
+ message = "#{@object_identifier}: #{message}" if @object_identifier
22
+ message = "[#{level.to_s.upcase}] #{message}" unless level == :info
23
+
24
+ if global_options[:dry_run] and options[:dry_run] != false
25
+ message << ' (dry-run)' if global_options[:dry_run]
26
+ end
27
+
28
+ message = message.send(options[:color]) if options[:color]
29
+ logger = global_options[:logger] || Posgra::Logger.instance
30
+ logger.send(level, message)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ module Posgra::TemplateHelper
2
+ def include_template(template_name, context = {})
3
+ tmplt = @context.templates[template_name.to_s]
4
+
5
+ unless tmplt
6
+ raise "Template `#{template_name}` is not defined"
7
+ end
8
+
9
+ context_orig = @context
10
+ @context = @context.merge(context)
11
+ instance_eval(&tmplt)
12
+ @context = context_orig
13
+ end
14
+
15
+ def context
16
+ @context
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ class Posgra::Utils
2
+ module Helper
3
+ def matched?(name, include_r, exclude_r)
4
+ result = true
5
+
6
+ if exclude_r
7
+ result &&= name !~ exclude_r
8
+ end
9
+
10
+ if include_r
11
+ result &&= name =~ include_r
12
+ end
13
+
14
+ result
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module Posgra
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'posgra/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'posgra'
8
+ spec.version = Posgra::VERSION
9
+ spec.authors = ['winebarrel']
10
+ spec.email = ['sgwr_dts@yahoo.co.jp']
11
+
12
+ spec.summary = %q{Posgra is a tool to manage PostgreSQL roles/permissions.}
13
+ spec.description = %q{Posgra is a tool to manage PostgreSQL roles/permissions.}
14
+ spec.homepage = 'https://github.com/winebarrel/posgra'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_dependency 'pg'
23
+ spec.add_dependency 'term-ansicolor'
24
+ spec.add_dependency 'hashie'
25
+ spec.add_dependency 'thor'
26
+
27
+ spec.add_development_dependency 'bundler'
28
+ spec.add_development_dependency 'rake'
29
+ spec.add_development_dependency 'rspec', '~> 3.0'
30
+ spec.add_development_dependency 'coveralls'
31
+ spec.add_development_dependency 'unindent'
32
+ end
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: posgra
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - winebarrel
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-01-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pg
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: term-ansicolor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: hashie
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: unindent
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Posgra is a tool to manage PostgreSQL roles/permissions.
140
+ email:
141
+ - sgwr_dts@yahoo.co.jp
142
+ executables:
143
+ - posgra
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".gitignore"
148
+ - ".rspec"
149
+ - ".travis.yml"
150
+ - Gemfile
151
+ - LICENSE.txt
152
+ - README.md
153
+ - Rakefile
154
+ - bin/console
155
+ - bin/setup
156
+ - exe/posgra
157
+ - lib/posgra.rb
158
+ - lib/posgra/cli.rb
159
+ - lib/posgra/cli/app.rb
160
+ - lib/posgra/cli/grant.rb
161
+ - lib/posgra/cli/helper.rb
162
+ - lib/posgra/cli/role.rb
163
+ - lib/posgra/client.rb
164
+ - lib/posgra/driver.rb
165
+ - lib/posgra/dsl.rb
166
+ - lib/posgra/dsl/converter.rb
167
+ - lib/posgra/dsl/grants.rb
168
+ - lib/posgra/dsl/grants/role.rb
169
+ - lib/posgra/dsl/grants/role/schema.rb
170
+ - lib/posgra/dsl/grants/role/schema/on.rb
171
+ - lib/posgra/dsl/roles.rb
172
+ - lib/posgra/dsl/roles/group.rb
173
+ - lib/posgra/exporter.rb
174
+ - lib/posgra/ext/string_ext.rb
175
+ - lib/posgra/identifier.rb
176
+ - lib/posgra/identifier/auto.rb
177
+ - lib/posgra/logger.rb
178
+ - lib/posgra/template.rb
179
+ - lib/posgra/utils.rb
180
+ - lib/posgra/version.rb
181
+ - posgra.gemspec
182
+ homepage: https://github.com/winebarrel/posgra
183
+ licenses:
184
+ - MIT
185
+ metadata: {}
186
+ post_install_message:
187
+ rdoc_options: []
188
+ require_paths:
189
+ - lib
190
+ required_ruby_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ requirements: []
201
+ rubyforge_project:
202
+ rubygems_version: 2.4.5.1
203
+ signing_key:
204
+ specification_version: 4
205
+ summary: Posgra is a tool to manage PostgreSQL roles/permissions.
206
+ test_files: []