postfix_admin 0.1.1 → 0.2.1

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.
Files changed (46) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +37 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +2 -0
  5. data/CHANGELOG.md +22 -0
  6. data/README.md +47 -32
  7. data/Rakefile +6 -0
  8. data/bin/console +18 -0
  9. data/docker-admin/Dockerfile +6 -0
  10. data/docker-admin/config.local.php +21 -0
  11. data/docker-app-2.5/Dockerfile +15 -0
  12. data/docker-app/Dockerfile +25 -0
  13. data/docker-app/docker-entrypoint.sh +5 -0
  14. data/docker-app/my.cnf +5 -0
  15. data/docker-compose.yml +46 -0
  16. data/docker-db/postfix.v1841.sql +383 -0
  17. data/{spec/postfix_test.sql → docker-db/postfix.v352.sql} +1 -28
  18. data/docker-db/postfix.v740.sql +269 -0
  19. data/{bin → exe}/postfix_admin +1 -0
  20. data/lib/postfix_admin.rb +1 -1
  21. data/lib/postfix_admin/admin.rb +62 -0
  22. data/lib/postfix_admin/alias.rb +65 -0
  23. data/lib/postfix_admin/application_record.rb +44 -0
  24. data/lib/postfix_admin/base.rb +120 -75
  25. data/lib/postfix_admin/cli.rb +173 -58
  26. data/lib/postfix_admin/concerns/.keep +0 -0
  27. data/lib/postfix_admin/concerns/dovecot_cram_md5_password.rb +30 -0
  28. data/lib/postfix_admin/concerns/existing_timestamp.rb +18 -0
  29. data/lib/postfix_admin/domain.rb +98 -0
  30. data/lib/postfix_admin/domain_admin.rb +8 -0
  31. data/lib/postfix_admin/doveadm.rb +37 -0
  32. data/lib/postfix_admin/log.rb +5 -0
  33. data/lib/postfix_admin/mail_domain.rb +9 -0
  34. data/lib/postfix_admin/mailbox.rb +89 -0
  35. data/lib/postfix_admin/models.rb +10 -170
  36. data/lib/postfix_admin/quota.rb +6 -0
  37. data/lib/postfix_admin/runner.rb +108 -36
  38. data/lib/postfix_admin/version.rb +1 -1
  39. data/postfix_admin.gemspec +22 -12
  40. metadata +80 -55
  41. data/spec/base_spec.rb +0 -235
  42. data/spec/cli_spec.rb +0 -286
  43. data/spec/models_spec.rb +0 -146
  44. data/spec/postfix_admin.conf +0 -5
  45. data/spec/runner_spec.rb +0 -194
  46. data/spec/spec_helper.rb +0 -159
@@ -0,0 +1,6 @@
1
+ module PostfixAdmin
2
+ class Quota < ApplicationRecord
3
+ self.table_name = :quota2
4
+ self.primary_key = :username
5
+ end
6
+ end
@@ -1,54 +1,59 @@
1
1
  require 'thor'
2
2
  require 'postfix_admin'
3
3
  require 'postfix_admin/cli'
4
+ require 'postfix_admin/doveadm'
4
5
 
5
6
  module PostfixAdmin
6
7
  class Runner < Thor
8
+ def self.exit_on_failure?
9
+ true
10
+ end
11
+
7
12
  def initialize(*args)
8
13
  super
9
14
  @cli = CLI.new
10
15
  end
11
16
 
12
17
  desc "summary [example.com]", "Summarize the usage of PostfixAdmin"
13
- def summary(domain_name=nil)
14
- runner{ @cli.show_summary(domain_name) }
18
+ def summary(domain_name = nil)
19
+ runner { @cli.show_summary(domain_name) }
15
20
  end
16
21
 
17
- desc "show [example.com | user@example.com]", "Show domains or mailboxes"
18
- def show(domain_name=nil)
19
- runner{ @cli.show(domain_name) }
22
+ desc "schemes", "List all supported password schemes"
23
+ def schemes
24
+ runner { puts PostfixAdmin::Doveadm.schemes.join(' ') }
20
25
  end
21
26
 
22
- desc "setup example.com password", "Setup a domain"
23
- def setup(domain_name, password)
24
- runner{ @cli.setup_domain(domain_name, password) }
27
+ desc "show [example.com | admin@example.com | user@example.com]", "Show domains or admins or mailboxes"
28
+ def show(name = nil)
29
+ runner { @cli.show(name) }
25
30
  end
26
31
 
27
- desc "super_admin admin@example.com", "Enable super admin flag of an admin"
28
- method_option :disable, :type => :boolean, :aliases => "-d", :desc => "Disable super admin flag"
29
- def super_admin(user_name)
30
- runner{ @cli.super_admin(user_name, options[:disable]) }
32
+ desc "setup example.com password", "Setup a domain"
33
+ def setup(domain_name, password)
34
+ runner { @cli.setup_domain(domain_name, password) }
31
35
  end
32
36
 
33
37
  desc "admin_passwd admin@example.com new_password", "Change password of admin"
34
38
  def admin_passwd(user_name, password)
35
- runner{ @cli.change_admin_password(user_name, password) }
39
+ runner { @cli.change_admin_password(user_name, password) }
36
40
  end
37
41
 
38
42
  desc "account_passwd user@example.com new_password", "Change password of account"
39
43
  def account_passwd(user_name, password)
40
- runner{ @cli.change_account_password(user_name, password) }
44
+ runner { @cli.change_account_password(user_name, password) }
41
45
  end
42
46
 
43
47
  desc "add_domain example.com", "Add a domain"
44
48
  def add_domain(domain_name)
45
- runner{ @cli.add_domain(domain_name) }
49
+ runner { @cli.add_domain(domain_name) }
46
50
  end
47
51
 
48
52
  desc "edit_domain example.com", "Edit a domain limitation"
49
- method_option :aliases, :type => :numeric, :aliases => "-a", :desc => "Edit aliases limitation"
50
- method_option :mailboxes, :type => :numeric, :aliases => "-m", :desc => "Edit mailboxes limitation"
51
- method_option :maxquota, :type => :numeric, :aliases => "-q", :desc => "Edit max quota limitation"
53
+ method_option :aliases, type: :numeric, aliases: "-a", desc: "Edit aliases limitation"
54
+ method_option :mailboxes, type: :numeric, aliases: "-m", desc: "Edit mailboxes limitation"
55
+ method_option :maxquota, type: :numeric, aliases: "-q", desc: "Edit max quota limitation"
56
+ method_option :active, type: :boolean, desc: "Update active status"
52
57
  def edit_domain(domain_name)
53
58
  runner do
54
59
  if options.size == 0
@@ -62,78 +67,145 @@ module PostfixAdmin
62
67
 
63
68
  desc "delete_domain example.com", "Delete a domain"
64
69
  def delete_domain(domain_name)
65
- runner{ @cli.delete_domain(domain_name) }
70
+ runner { @cli.delete_domain(domain_name) }
66
71
  end
67
72
 
68
73
  desc "delete_admin admin@example.com", "Delete an admin"
69
74
  def delete_admin(user_name)
70
- runner{ @cli.delete_admin(user_name) }
75
+ runner { @cli.delete_admin(user_name) }
71
76
  end
72
77
 
73
78
  desc "delete_account user@example.com", "Delete an account"
74
79
  def delete_account(address)
75
- runner{ @cli.delete_account(address) }
80
+ runner { @cli.delete_account(address) }
76
81
  end
77
82
 
78
83
  desc "add_account user@example.com password", "Add an account"
84
+ method_option :scheme, type: :string, aliases: "-s", desc: "password scheme"
85
+ method_option :name, type: :string, aliases: "-n", desc: "full name"
79
86
  def add_account(address, password)
80
- runner{ @cli.add_account(address, password) }
87
+ runner do
88
+ if options[:scheme] == 'scheme'
89
+ warn "Specify password scheme"
90
+ help('add_account')
91
+ else
92
+ if options[:name] == 'name'
93
+ warn "Specify name"
94
+ help('add_account')
95
+ else
96
+ @cli.add_account(address, password, options[:scheme], options[:name])
97
+ end
98
+ end
99
+ end
81
100
  end
82
101
 
83
102
  desc "edit_account user@example.com", "Edit an account"
84
- method_option :quota, :type => :numeric, :aliases => "-q", :desc => "Edit quota limitation"
103
+ method_option :goto, type: :string, aliases: "-g", desc: "mailboxes, addresses e-mails are delivered to"
104
+ method_option :quota, type: :numeric, aliases: "-q", desc: "quota limitation (MB)"
105
+ method_option :name, type: :string, aliases: "-n", desc: "full name"
106
+ method_option :active, type: :boolean, desc: "Update active status"
85
107
  def edit_account(address)
86
108
  runner do
87
109
  if options.size == 0
88
110
  warn "Use one or more options."
89
111
  help('edit_account')
90
112
  else
91
- @cli.edit_account(address, options)
113
+ if options[:name] == 'name'
114
+ warn "Specify name"
115
+ help('edit_account')
116
+ else
117
+ @cli.edit_account(address, options)
118
+ end
119
+ end
120
+ end
121
+ end
122
+
123
+ desc "edit_admin admin@example.com", "Edit an admin user"
124
+ method_option :active, type: :boolean, desc: "Update active status"
125
+ method_option :super, type: :boolean, desc: "Update super admin status"
126
+ def edit_admin(user_name)
127
+ runner do
128
+ if options.size == 0
129
+ warn "Use one or more options."
130
+ help('edit_admin')
131
+ else
132
+ @cli.edit_admin(user_name, options)
92
133
  end
93
134
  end
94
135
  end
95
136
 
96
137
  desc "add_admin admin@example.com password", "Add an admin user"
97
- method_option :super, :type => :boolean, :aliases => "-s", :desc => "register as a super admin"
138
+ method_option :super, type: :boolean, aliases: "-S", desc: "register as a super admin"
139
+ method_option :scheme, type: :string, aliases: "-s", desc: "password scheme"
98
140
  def add_admin(user_name, password)
99
- runner{ @cli.add_admin(user_name, password, options[:super]) }
141
+ runner do
142
+ if options[:scheme] == 'scheme'
143
+ warn "Specify password scheme"
144
+ help('add_admin')
145
+ else
146
+ @cli.add_admin(user_name, password, options[:super], options[:scheme])
147
+ end
148
+ end
100
149
  end
101
150
 
102
151
  desc "add_admin_domain admin@example.com example.com", "Add admin_domain"
103
152
  def add_admin_domain(user_name, domain_name)
104
- runner{ @cli.add_admin_domain(user_name, domain_name) }
153
+ runner { @cli.add_admin_domain(user_name, domain_name) }
105
154
  end
106
155
 
107
156
  desc "delete_admin_domain admin@example.com example.com", "Delete admin_domain"
108
157
  def delete_admin_domain(user_name, domain_name)
109
- runner{ @cli.delete_admin_domain(user_name, domain_name) }
158
+ runner { @cli.delete_admin_domain(user_name, domain_name) }
110
159
  end
111
160
 
161
+ desc "edit_alias alias@example.com", "Edit an alias"
162
+ method_option :goto, type: :string, aliases: "-g",
163
+ desc: "mailboxes, addresses e-mails are delivered to"
164
+ method_option :active, type: :boolean, desc: "Update active status"
165
+ def edit_alias(address)
166
+ runner do
167
+ if options.size == 0
168
+ warn "Use one or more options."
169
+ help('edit_alias')
170
+ else
171
+ @cli.edit_alias(address, options)
172
+ end
173
+ end
174
+ end
112
175
 
113
176
  desc "add_alias alias@example.com goto@example.net", "Add an alias"
114
177
  def add_alias(address, goto)
115
- runner{ @cli.add_alias(address, goto) }
178
+ runner { @cli.add_alias(address, goto) }
116
179
  end
117
180
 
118
181
  desc "delete_alias alias@example.com", "Delete an alias"
119
182
  def delete_alias(address)
120
- runner{ @cli.delete_alias(address) }
183
+ runner { @cli.delete_alias(address) }
184
+ end
185
+
186
+ desc "log", "Show action logs"
187
+ def log
188
+ runner { @cli.log }
189
+ end
190
+
191
+ desc "dump", "Dump all data"
192
+ def dump
193
+ runner { @cli.dump }
121
194
  end
122
195
 
123
196
  desc "version", "Show postfix_admin version"
124
197
  def version
125
198
  require 'postfix_admin/version'
126
- runner{ say "postfix_admin #{VERSION}" }
199
+ runner { say "postfix_admin #{VERSION}" }
127
200
  end
128
201
 
129
202
  private
130
203
 
131
204
  def runner
132
- begin
133
- yield
134
- rescue Error, ArgumentError => e
135
- warn e.message
136
- end
205
+ @cli.db_setup
206
+ yield
207
+ rescue StandardError => e
208
+ abort "Error: #{e.message}"
137
209
  end
138
210
  end
139
211
  end
@@ -1,3 +1,3 @@
1
1
  module PostfixAdmin
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -1,23 +1,33 @@
1
1
  require File.expand_path('../lib/postfix_admin/version', __FILE__)
2
2
 
3
3
  Gem::Specification.new do |gem|
4
- gem.add_dependency 'thor'
5
- gem.add_dependency 'data_mapper'
6
- gem.add_dependency 'do_mysql', '>= 0.10.9'
7
- gem.add_dependency 'dm-mysql-adapter'
8
- gem.add_development_dependency 'rspec', '~> 2.11.0'
9
- gem.add_development_dependency 'dm-sqlite-adapter'
10
-
4
+ gem.name = "postfix_admin"
5
+ gem.version = PostfixAdmin::VERSION
11
6
  gem.authors = ["Hitoshi Kurokawa"]
12
7
  gem.email = ["hitoshi@nextseed.jp"]
13
- gem.description = %q{Command Line Tools of PostfixAdmin}
8
+
14
9
  gem.summary = gem.description
10
+ gem.description = %q{Command Line Tools for Postfix Admin}
15
11
  gem.homepage = "https://github.com/krhitoshi/postfix_admin"
16
12
 
17
- gem.files = `git ls-files`.split($\)
18
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.required_ruby_version = ">= 2.5.0"
14
+
15
+ gem.add_dependency 'thor', '~> 1.0.1'
16
+ gem.add_dependency 'activerecord', '~> 6.0.3'
17
+ gem.add_dependency 'mysql2', '>= 0.5.3'
18
+ gem.add_development_dependency 'pry'
19
+ gem.add_development_dependency 'rake', '~> 13.0.1'
20
+ gem.add_development_dependency 'rubocop'
21
+ gem.add_development_dependency 'rspec', '~> 3.9.0'
22
+
23
+ # Specify which files should be added to the gem when it is released.
24
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
+ gem.files = Dir.chdir(File.expand_path('..', __FILE__)) do
26
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
+ end
28
+ gem.bindir = "exe"
29
+ gem.executables = gem.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
30
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
- gem.name = "postfix_admin"
31
+
21
32
  gem.require_paths = ["lib"]
22
- gem.version = PostfixAdmin::VERSION
23
33
  end
metadata CHANGED
@@ -1,100 +1,114 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postfix_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hitoshi Kurokawa
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2013-05-10 00:00:00.000000000 Z
11
+ date: 2020-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 1.0.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 1.0.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: data_mapper
28
+ name: activerecord
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 6.0.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 6.0.3
41
41
  - !ruby/object:Gem::Dependency
42
- name: do_mysql
42
+ name: mysql2
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.10.9
47
+ version: 0.5.3
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.10.9
54
+ version: 0.5.3
55
55
  - !ruby/object:Gem::Dependency
56
- name: dm-mysql-adapter
56
+ name: pry
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
- type: :runtime
62
+ type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
70
+ name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 2.11.0
75
+ version: 13.0.1
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 2.11.0
82
+ version: 13.0.1
83
83
  - !ruby/object:Gem::Dependency
84
- name: dm-sqlite-adapter
84
+ name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- description: Command Line Tools of PostfixAdmin
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.9.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.9.0
111
+ description: Command Line Tools for Postfix Admin
98
112
  email:
99
113
  - hitoshi@nextseed.jp
100
114
  executables:
@@ -102,28 +116,48 @@ executables:
102
116
  extensions: []
103
117
  extra_rdoc_files: []
104
118
  files:
105
- - .gitignore
119
+ - ".github/workflows/ruby.yml"
120
+ - ".gitignore"
121
+ - ".rubocop.yml"
122
+ - CHANGELOG.md
106
123
  - Gemfile
107
124
  - LICENSE
108
125
  - README.md
126
+ - Rakefile
109
127
  - Thorfile
110
- - bin/postfix_admin
128
+ - bin/console
129
+ - docker-admin/Dockerfile
130
+ - docker-admin/config.local.php
131
+ - docker-app-2.5/Dockerfile
132
+ - docker-app/Dockerfile
133
+ - docker-app/docker-entrypoint.sh
134
+ - docker-app/my.cnf
135
+ - docker-compose.yml
136
+ - docker-db/postfix.v1841.sql
137
+ - docker-db/postfix.v352.sql
138
+ - docker-db/postfix.v740.sql
139
+ - exe/postfix_admin
111
140
  - lib/postfix_admin.rb
141
+ - lib/postfix_admin/admin.rb
142
+ - lib/postfix_admin/alias.rb
143
+ - lib/postfix_admin/application_record.rb
112
144
  - lib/postfix_admin/base.rb
113
145
  - lib/postfix_admin/cli.rb
146
+ - lib/postfix_admin/concerns/.keep
147
+ - lib/postfix_admin/concerns/dovecot_cram_md5_password.rb
148
+ - lib/postfix_admin/concerns/existing_timestamp.rb
149
+ - lib/postfix_admin/domain.rb
150
+ - lib/postfix_admin/domain_admin.rb
151
+ - lib/postfix_admin/doveadm.rb
114
152
  - lib/postfix_admin/error.rb
153
+ - lib/postfix_admin/log.rb
154
+ - lib/postfix_admin/mail_domain.rb
155
+ - lib/postfix_admin/mailbox.rb
115
156
  - lib/postfix_admin/models.rb
157
+ - lib/postfix_admin/quota.rb
116
158
  - lib/postfix_admin/runner.rb
117
159
  - lib/postfix_admin/version.rb
118
160
  - postfix_admin.gemspec
119
- - spec/base_spec.rb
120
- - spec/cli_spec.rb
121
- - spec/models_spec.rb
122
- - spec/postfix_admin.conf
123
- - spec/postfix_test.sql
124
- - spec/runner_spec.rb
125
- - spec/spec_helper.rb
126
- - spec/tmp/.gitkeep
127
161
  homepage: https://github.com/krhitoshi/postfix_admin
128
162
  licenses: []
129
163
  metadata: {}
@@ -133,26 +167,17 @@ require_paths:
133
167
  - lib
134
168
  required_ruby_version: !ruby/object:Gem::Requirement
135
169
  requirements:
136
- - - '>='
170
+ - - ">="
137
171
  - !ruby/object:Gem::Version
138
- version: '0'
172
+ version: 2.5.0
139
173
  required_rubygems_version: !ruby/object:Gem::Requirement
140
174
  requirements:
141
- - - '>='
175
+ - - ">="
142
176
  - !ruby/object:Gem::Version
143
177
  version: '0'
144
178
  requirements: []
145
- rubyforge_project:
146
- rubygems_version: 2.0.0
179
+ rubygems_version: 3.0.3
147
180
  signing_key:
148
181
  specification_version: 4
149
- summary: Command Line Tools of PostfixAdmin
150
- test_files:
151
- - spec/base_spec.rb
152
- - spec/cli_spec.rb
153
- - spec/models_spec.rb
154
- - spec/postfix_admin.conf
155
- - spec/postfix_test.sql
156
- - spec/runner_spec.rb
157
- - spec/spec_helper.rb
158
- - spec/tmp/.gitkeep
182
+ summary: ''
183
+ test_files: []