forty 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/forty/configuration.rb +57 -0
- data/lib/forty/sync.rb +18 -7
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3100804368cd3b2645003487a70b7f7b20933482
|
4
|
+
data.tar.gz: ebbc10ef2bc8da5cc56dbc1a10c924765bd39f87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20f03889ad1ea334ec713ecea2f7b24647f351f36ff6012d5877a296f08447bfeaf69f933d799d8b6316ab2b7f639ae0e349acc61a6cff2940f7e75c38443e86
|
7
|
+
data.tar.gz: f8a78479552e2e2b75458d1519a0a552d9f28ee509d77f6935c5a6b172d6eb646ee05ccac655edef68fc45d4a246b79b569bb42d78dba1def1b54a5f59c8e868
|
data/lib/forty/configuration.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'logger'
|
2
|
+
require 'mail'
|
3
|
+
require 'erb'
|
2
4
|
|
3
5
|
module Forty
|
4
6
|
class Configuration
|
@@ -18,6 +20,7 @@ module Forty
|
|
18
20
|
end
|
19
21
|
|
20
22
|
class Database
|
23
|
+
attr_accessor :name
|
21
24
|
attr_accessor :host
|
22
25
|
attr_accessor :port
|
23
26
|
attr_accessor :user
|
@@ -25,9 +28,55 @@ module Forty
|
|
25
28
|
attr_accessor :database
|
26
29
|
end
|
27
30
|
|
31
|
+
class Mailer
|
32
|
+
attr_accessor :smtp_address
|
33
|
+
attr_accessor :smtp_host
|
34
|
+
attr_accessor :smtp_port
|
35
|
+
attr_accessor :smtp_username
|
36
|
+
attr_accessor :smtp_password
|
37
|
+
attr_accessor :smtp_authentication
|
38
|
+
attr_accessor :smtp_encryption
|
39
|
+
attr_accessor :enabled
|
40
|
+
attr_accessor :templates
|
41
|
+
|
42
|
+
def send_welcome(recipient, username, password)
|
43
|
+
mail = ::Mail.new
|
44
|
+
mail.delivery_method :smtp, {
|
45
|
+
smtp_envelope_from: @smtp_address,
|
46
|
+
address: @smtp_host,
|
47
|
+
port: @smtp_port.to_i,
|
48
|
+
user_name: @smtp_username,
|
49
|
+
password: @smtp_password,
|
50
|
+
authentication: @smtp_authentication,
|
51
|
+
encryption: @smtp_encryption,
|
52
|
+
}
|
53
|
+
mail.from @smtp_address
|
54
|
+
mail.to recipient
|
55
|
+
mail.subject "#{Forty.database_configuration.name.to_s.length == 0 ? '' : Forty.database_configuration.name + ' '}DB Credentials (User: #{username})"
|
56
|
+
|
57
|
+
parameters = binding
|
58
|
+
parameters.local_variable_set(:database_name, Forty.database_configuration.name)
|
59
|
+
parameters.local_variable_set(:username, username)
|
60
|
+
parameters.local_variable_set(:password, password)
|
61
|
+
parameters.local_variable_set(:host, Forty.database_configuration.host)
|
62
|
+
parameters.local_variable_set(:port, Forty.database_configuration.port)
|
63
|
+
parameters.local_variable_set(:database, Forty.database_configuration.database)
|
64
|
+
|
65
|
+
if @enabled
|
66
|
+
mail.body ERB.new(File.read(@templates[:user_created])).result(parameters)
|
67
|
+
Forty.configuration.logger.info('Sending \'user_created\' email to ' + recipient)
|
68
|
+
mail.deliver
|
69
|
+
Forty.configuration.logger.info('Sent \'user_created\' email successfully')
|
70
|
+
else
|
71
|
+
Forty.configuration.logger.warn('Mail not enabled, skipped sending welcome email. You will need to regenerate a password for user ' + username + '.')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
28
76
|
class << self
|
29
77
|
attr_writer :configuration
|
30
78
|
attr_writer :database_configuration
|
79
|
+
attr_writer :mailer_configuration
|
31
80
|
end
|
32
81
|
|
33
82
|
def self.configuration
|
@@ -45,4 +94,12 @@ module Forty
|
|
45
94
|
def self.database
|
46
95
|
yield(database_configuration)
|
47
96
|
end
|
97
|
+
|
98
|
+
def self.mailer_configuration
|
99
|
+
@mailer ||= Forty::Mailer.new
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.mailer
|
103
|
+
yield(mailer_configuration)
|
104
|
+
end
|
48
105
|
end
|
data/lib/forty/sync.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# require_relative 'configuration'
|
2
|
-
|
3
1
|
module Forty
|
4
2
|
|
5
3
|
def self.sync(dry_run=true)
|
@@ -9,6 +7,7 @@ module Forty
|
|
9
7
|
Forty.configuration.schemas,
|
10
8
|
Forty::ACL.new(Forty.configuration.acl_file),
|
11
9
|
Forty.instance_variable_get(:@database),
|
10
|
+
Forty.instance_variable_get(:@mailer),
|
12
11
|
dry_run
|
13
12
|
).run
|
14
13
|
end
|
@@ -16,7 +15,7 @@ module Forty
|
|
16
15
|
class Sync
|
17
16
|
class Error < StandardError; end
|
18
17
|
|
19
|
-
def initialize(logger, master_username, production_schemas, acl_config, executor, dry_run=true)
|
18
|
+
def initialize(logger, master_username, production_schemas, acl_config, executor, mailer, dry_run=true)
|
20
19
|
@logger = logger or raise Error, 'No logger provided'
|
21
20
|
@master_username = master_username or raise Error, 'No master username provided'
|
22
21
|
@production_schemas = production_schemas or raise Error, 'No production schemas provided'
|
@@ -26,7 +25,8 @@ module Forty
|
|
26
25
|
@acl_config['users'] ||= {}
|
27
26
|
@acl_config['groups'] ||= {}
|
28
27
|
|
29
|
-
@executor
|
28
|
+
@executor = executor or raise Error, 'No database executor provided'
|
29
|
+
@mailer = mailer or raise Error, 'No mailer provided'
|
30
30
|
@dry_run = dry_run
|
31
31
|
|
32
32
|
@logger.warn('Dry mode disabled, executing on production') unless @dry_run
|
@@ -49,7 +49,7 @@ Starting sync...
|
|
49
49
|
/ /_/ __ \\/ ___/ __/ / / /
|
50
50
|
/ __/ /_/ / / / /_/ /_/ /
|
51
51
|
/_/ \\____/_/ \\__/\\__, / Database ACL Sync
|
52
|
-
/____/ v0.
|
52
|
+
/____/ v0.3.0
|
53
53
|
|
54
54
|
===============================================================================
|
55
55
|
|
@@ -80,8 +80,9 @@ BANNER
|
|
80
80
|
roles = @acl_config['users'][user]['roles'] || []
|
81
81
|
password = @acl_config['users'][user]['password']
|
82
82
|
search_path = @production_schemas.join(',')
|
83
|
+
owner = @acl_config['users'][user]['email']
|
83
84
|
|
84
|
-
_create_user(user, password, roles, search_path)
|
85
|
+
_create_user(user, password, roles, search_path, owner)
|
85
86
|
end
|
86
87
|
|
87
88
|
@logger.info('All users are in sync') if (undefined_users.count + missing_users.count) == 0
|
@@ -308,9 +309,19 @@ BANNER
|
|
308
309
|
_execute_statement("drop group #{group};")
|
309
310
|
end
|
310
311
|
|
311
|
-
def _create_user(user, password, roles=[], search_path=nil)
|
312
|
+
def _create_user(user, password, roles=[], search_path=nil, owner='')
|
313
|
+
if password.to_s.length == 0
|
314
|
+
password = _generate_password()
|
315
|
+
end
|
316
|
+
|
312
317
|
_execute_statement("create user #{user} with password '#{password}' #{roles.join(' ')};")
|
313
318
|
|
319
|
+
if owner.to_s.length > 0 and owner.include?('@')
|
320
|
+
@mailer.send_welcome(owner, user, password)
|
321
|
+
else
|
322
|
+
@logger.warn("Email address of user '#{user}' is empty or malformed: '#{owner}'")
|
323
|
+
end
|
324
|
+
|
314
325
|
unless search_path.nil? or search_path.empty?
|
315
326
|
_execute_statement("alter user #{user} set search_path to #{search_path};")
|
316
327
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefanie Grunwald
|
@@ -70,6 +70,26 @@ dependencies:
|
|
70
70
|
- - "<"
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '12.0'
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: mail
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 2.6.0
|
80
|
+
- - "<"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.6.0
|
90
|
+
- - "<"
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '3.0'
|
73
93
|
- !ruby/object:Gem::Dependency
|
74
94
|
name: rspec
|
75
95
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,5 +166,5 @@ rubyforge_project:
|
|
146
166
|
rubygems_version: 2.4.5
|
147
167
|
signing_key:
|
148
168
|
specification_version: 3
|
149
|
-
summary: Manage users, groups and ACL (access control lists) for
|
169
|
+
summary: Manage users, groups and ACL (access control lists) for Postgres databases
|
150
170
|
test_files: []
|