posgra 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []