postfix_admin 0.0.2 → 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.
- data/README.md +21 -11
- data/Thorfile +30 -0
- data/bin/postfix_admin +5 -97
- data/lib/postfix_admin/base.rb +188 -0
- data/lib/postfix_admin/cli.rb +244 -79
- data/lib/postfix_admin/error.rb +4 -0
- data/lib/postfix_admin/models.rb +127 -17
- data/lib/postfix_admin/runner.rb +105 -0
- data/lib/postfix_admin/version.rb +2 -2
- data/lib/postfix_admin.rb +1 -157
- data/postfix_admin.gemspec +2 -1
- data/spec/base_spec.rb +218 -0
- data/spec/cli_spec.rb +165 -0
- data/spec/models_spec.rb +136 -0
- data/spec/postfix_admin.conf +5 -0
- data/spec/postfix_test.sql +250 -0
- data/spec/runner_spec.rb +144 -0
- data/spec/spec_helper.rb +160 -0
- metadata +38 -5
- data/Rakefile +0 -2
data/README.md
CHANGED
@@ -1,24 +1,34 @@
|
|
1
1
|
# PostfixAdmin
|
2
2
|
|
3
|
-
|
3
|
+
Command Line Tools of Postfix Admin
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
gem 'postfix_admin'
|
10
|
-
|
11
|
-
And then execute:
|
12
|
-
|
13
|
-
$ bundle
|
14
|
-
|
15
|
-
Or install it yourself as:
|
7
|
+
Install postfix_admin as:
|
16
8
|
|
17
9
|
$ gem install postfix_admin
|
18
10
|
|
19
11
|
## Usage
|
20
12
|
|
21
|
-
|
13
|
+
```
|
14
|
+
postfix_admin account_passwd user@example.com new_password # Change password of account
|
15
|
+
postfix_admin add_account user@example.com password # Add an account
|
16
|
+
postfix_admin add_admin admin@example.com password # Add an admin user
|
17
|
+
postfix_admin add_admin_domain admin@example.com example.com # Add admin_domain
|
18
|
+
postfix_admin add_alias alias@example.com goto@example.net # Add an alias
|
19
|
+
postfix_admin add_domain example.com # Add a domain
|
20
|
+
postfix_admin admin_passwd admin@example.com new_password # Change password of admin
|
21
|
+
postfix_admin delete_account user@example.com # Delete an account
|
22
|
+
postfix_admin delete_admin admin@example.com # Delete an admin
|
23
|
+
postfix_admin delete_alias alias@example.com # Delete an alias
|
24
|
+
postfix_admin delete_domain example.com # Delete a domain
|
25
|
+
postfix_admin help [TASK] # Describe available tasks or one specific task
|
26
|
+
postfix_admin setup example.com password # Setup a domain
|
27
|
+
postfix_admin show # List of domains
|
28
|
+
postfix_admin summary [example.com] # Summarize the usage of PostfixAdmin
|
29
|
+
postfix_admin super_admin admin@example.com # Enable super admin flag of an admin
|
30
|
+
postfix_admin version # Show postfix_admin version
|
31
|
+
```
|
22
32
|
|
23
33
|
## Contributing
|
24
34
|
|
data/Thorfile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
$:.unshift File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
require 'bundler'
|
5
|
+
require 'thor/rake_compat'
|
6
|
+
|
7
|
+
class Default < Thor
|
8
|
+
include Thor::RakeCompat
|
9
|
+
Bundler::GemHelper.install_tasks
|
10
|
+
|
11
|
+
desc "build", "Build postfix_admin-#{PostfixAdmin::VERSION}.gem into the pkg directory"
|
12
|
+
def build
|
13
|
+
Rake::Task["build"].execute
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "install", "Build and install postfix_admin-#{PostfixAdmin::VERSION}.gem into system gems"
|
17
|
+
def install
|
18
|
+
Rake::Task["install"].execute
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "release", "Create tag v#{PostfixAdmin::VERSION} and build and push postfix_admin-#{PostfixAdmin::VERSION}.gem to Rubygems"
|
22
|
+
def release
|
23
|
+
Rake::Task["release"].execute
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "spec", "Run RSpec code examples"
|
27
|
+
def spec
|
28
|
+
exec "rspec --color --format=documentation spec"
|
29
|
+
end
|
30
|
+
end
|
data/bin/postfix_admin
CHANGED
@@ -1,101 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'postfix_admin'
|
5
|
-
require 'postfix_admin/cli'
|
3
|
+
require 'postfix_admin/runner'
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
desc "show", "List of domains"
|
13
|
-
def show(domain=nil)
|
14
|
-
if domain
|
15
|
-
@cli.show_domain_account(domain)
|
16
|
-
else
|
17
|
-
@cli.show_domain
|
18
|
-
@cli.show_admin
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "add_domain", "add a domain"
|
23
|
-
def add_domain(domain=nil)
|
24
|
-
if domain
|
25
|
-
if @cli.add_domain(domain)
|
26
|
-
puts %Q!"#{domain}" is successfully registered.!
|
27
|
-
end
|
28
|
-
@cli.show_domain
|
29
|
-
else
|
30
|
-
puts "USAGE: #{$0} add_domain example.com"
|
31
|
-
exit
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
desc "delete_domain", "delete a domain"
|
36
|
-
def delete_domain(domain=nil)
|
37
|
-
if domain
|
38
|
-
if @cli.delete_domain(domain)
|
39
|
-
puts %Q!"#{domain}" is successfully deleted.!
|
40
|
-
end
|
41
|
-
@cli.show_domain
|
42
|
-
else
|
43
|
-
puts "USAGE: #{$0} delete_domain example.com"
|
44
|
-
exit
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
desc "add_account", "add an account"
|
49
|
-
def add_account(address=nil,password=nil)
|
50
|
-
if address && password
|
51
|
-
if @cli.add_account(address, password)
|
52
|
-
puts %Q!"#{address}" is successfully registered.!
|
53
|
-
end
|
54
|
-
@cli.show_domain_account(address.split(/@/)[1])
|
55
|
-
else
|
56
|
-
puts "USAGE: #{$0} add_account user@example.com password"
|
57
|
-
exit
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
desc "add_admin", "add an admin user"
|
62
|
-
def add_admin(user_name=nil, password=nil)
|
63
|
-
if user_name && password
|
64
|
-
if @cli.add_admin(user_name, password)
|
65
|
-
puts %Q!"#{user_name}" is successfully registered as admin.!
|
66
|
-
end
|
67
|
-
@cli.show_admin
|
68
|
-
else
|
69
|
-
puts "USAGE: #{$0} add_admin user@example.com password"
|
70
|
-
exit
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
desc "add_admin_domain", "add admin_domain"
|
75
|
-
def add_admin_domain(user_name=nil, domain=nil)
|
76
|
-
if user_name && domain
|
77
|
-
if @cli.add_admin_domain(user_name, domain)
|
78
|
-
puts %Q!"#{domain}" is appended in the domains of #{user_name}.!
|
79
|
-
end
|
80
|
-
@cli.show_admin_domain(user_name)
|
81
|
-
else
|
82
|
-
puts "USAGE: #{$0} add_admin_domain user@example.com example.com"
|
83
|
-
exit
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
desc "add_alias", "add an alias"
|
88
|
-
def add_alias(address=nil, goto=nil)
|
89
|
-
if address && goto
|
90
|
-
if @cli.add_alias(address, goto)
|
91
|
-
puts %Q!"#{address}: #{goto}" is successfully registered as alias.!
|
92
|
-
end
|
93
|
-
@cli.show_domain_account(address.split(/@/)[1])
|
94
|
-
else
|
95
|
-
puts "USAGE: #{$0} add_alias user@example.com goto@example.com"
|
96
|
-
exit
|
97
|
-
end
|
98
|
-
end
|
5
|
+
begin
|
6
|
+
PostfixAdmin::Runner.start
|
7
|
+
rescue => e
|
8
|
+
warn e.message
|
99
9
|
end
|
100
|
-
|
101
|
-
PostfixAdminCommand.start
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'postfix_admin/models'
|
2
|
+
require 'postfix_admin/error'
|
3
|
+
|
4
|
+
require 'date'
|
5
|
+
require 'data_mapper'
|
6
|
+
|
7
|
+
module PostfixAdmin
|
8
|
+
class Base
|
9
|
+
attr_reader :config
|
10
|
+
|
11
|
+
DEFAULT_CONFIG = {
|
12
|
+
'database' => 'mysql://postfix:password@localhost/postfix',
|
13
|
+
'aliases' => 30,
|
14
|
+
'mailboxes' => 30,
|
15
|
+
'maxquota' => 100
|
16
|
+
}
|
17
|
+
|
18
|
+
def initialize(config)
|
19
|
+
db_setup(config['database'])
|
20
|
+
@config = {}
|
21
|
+
@config[:aliases] = config['aliases'] || 30
|
22
|
+
@config[:mailboxes] = config['mailboxes'] || 30
|
23
|
+
@config[:maxquota] = config['maxquota'] || 100
|
24
|
+
@config[:mailbox_quota] = @config[:maxquota] * 1024 * 1000
|
25
|
+
end
|
26
|
+
|
27
|
+
def db_setup(database)
|
28
|
+
DataMapper.setup(:default, database)
|
29
|
+
DataMapper.finalize
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_admin_domain(username, domain_name)
|
33
|
+
unless Admin.exist?(username)
|
34
|
+
raise Error, "#{username} is not resistered as admin."
|
35
|
+
end
|
36
|
+
unless Domain.exist?(domain_name)
|
37
|
+
raise Error, "Could not find domain #{domain_name}"
|
38
|
+
end
|
39
|
+
|
40
|
+
admin = Admin.find(username)
|
41
|
+
if admin.has_domain?(domain_name)
|
42
|
+
raise Error, "#{username} is already resistered as admin of #{domain_name}."
|
43
|
+
end
|
44
|
+
|
45
|
+
domain = Domain.find(domain_name)
|
46
|
+
admin.domains << domain
|
47
|
+
admin.save or raise "Relation Error: Domain of Admin"
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_admin(username, password)
|
51
|
+
if Admin.exist?(username)
|
52
|
+
raise Error, "#{username} is already resistered as admin."
|
53
|
+
end
|
54
|
+
admin = Admin.new
|
55
|
+
admin.attributes = {
|
56
|
+
:username => username,
|
57
|
+
:password => password,
|
58
|
+
}
|
59
|
+
admin.save or raise "Could not save Admin"
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_account(address, password)
|
63
|
+
if address !~ /.+\@.+\..+/
|
64
|
+
raise Error, "Invalid mail address #{address}"
|
65
|
+
end
|
66
|
+
user, domain_name = address_split(address)
|
67
|
+
path = "#{domain_name}/#{address}/"
|
68
|
+
|
69
|
+
unless Domain.exist?(domain_name)
|
70
|
+
raise Error, "Could not find domain #{domain_name}"
|
71
|
+
end
|
72
|
+
|
73
|
+
if Alias.exist?(address)
|
74
|
+
raise Error, "#{address} is already resistered."
|
75
|
+
end
|
76
|
+
|
77
|
+
domain = Domain.find(domain_name)
|
78
|
+
mail_alias = Alias.new
|
79
|
+
mail_alias.attributes = {
|
80
|
+
:address => address,
|
81
|
+
:goto => address,
|
82
|
+
}
|
83
|
+
domain.aliases << mail_alias
|
84
|
+
|
85
|
+
mailbox = Mailbox.new
|
86
|
+
mailbox.attributes = {
|
87
|
+
:username => address,
|
88
|
+
:password => password,
|
89
|
+
:name => '',
|
90
|
+
:maildir => path,
|
91
|
+
:quota => @config[:mailbox_quota],
|
92
|
+
# :local_part => user,
|
93
|
+
}
|
94
|
+
domain.mailboxes << mailbox
|
95
|
+
domain.save or raise "Could not save Domain"
|
96
|
+
end
|
97
|
+
|
98
|
+
def add_alias(address, goto)
|
99
|
+
if Mailbox.exist?(address)
|
100
|
+
raise Error, "mailbox #{address} is already registered!"
|
101
|
+
end
|
102
|
+
if Alias.exist?(address)
|
103
|
+
raise Error, "alias #{address} is already registered!"
|
104
|
+
end
|
105
|
+
user, domain_name = address_split(address)
|
106
|
+
unless Domain.exist?(domain_name)
|
107
|
+
raise Error, "Invalid domain! #{domain_name}"
|
108
|
+
end
|
109
|
+
domain = Domain.find(domain_name)
|
110
|
+
|
111
|
+
new_alias = Alias.new
|
112
|
+
new_alias.attributes = {
|
113
|
+
:address => address,
|
114
|
+
:goto => goto,
|
115
|
+
}
|
116
|
+
domain.aliases << new_alias
|
117
|
+
domain.save or raise "Could not save Alias"
|
118
|
+
end
|
119
|
+
|
120
|
+
def delete_alias(address)
|
121
|
+
if Mailbox.exist?(address)
|
122
|
+
raise Error, "Can not delete mailbox by delete_alias. Use delete_account"
|
123
|
+
end
|
124
|
+
unless Alias.exist?(address)
|
125
|
+
raise Error, "#{address} is not found!"
|
126
|
+
end
|
127
|
+
Alias.all(:address => address).destroy or raise "Could not destroy Alias"
|
128
|
+
end
|
129
|
+
|
130
|
+
def add_domain(domain_name)
|
131
|
+
if domain_name !~ /.+\..+/
|
132
|
+
raise Error, "Ivalid domain! #{domain_name}"
|
133
|
+
end
|
134
|
+
if Domain.exist?(domain_name)
|
135
|
+
raise Error, "#{domain_name} is already registered!"
|
136
|
+
end
|
137
|
+
domain = Domain.new
|
138
|
+
domain.attributes = {
|
139
|
+
:domain_name => domain_name,
|
140
|
+
:description => domain_name,
|
141
|
+
:maxaliases => @config[:aliases],
|
142
|
+
:maxmailboxes => @config[:mailboxes],
|
143
|
+
:maxquota => @config[:maxquota],
|
144
|
+
}
|
145
|
+
domain.save or raise "Could not save Domain"
|
146
|
+
end
|
147
|
+
|
148
|
+
def delete_domain(domain_name)
|
149
|
+
unless Domain.exist?(domain_name)
|
150
|
+
raise Error, "Could not find domain #{domain_name}"
|
151
|
+
end
|
152
|
+
|
153
|
+
domain = Domain.find(domain_name)
|
154
|
+
domain.mailboxes.destroy or raise "Could not destroy Mailbox"
|
155
|
+
domain.aliases.destroy or raise "Could not destroy Alias"
|
156
|
+
domain.domain_admins.destroy or raise "Could not destroy DomainAdmin"
|
157
|
+
delete_unnecessary_admins
|
158
|
+
|
159
|
+
domain.destroy or raise "Could not destroy Domain"
|
160
|
+
end
|
161
|
+
|
162
|
+
def delete_admin(user_name)
|
163
|
+
unless Admin.exist?(user_name)
|
164
|
+
raise Error, "Could not find admin #{user_name}"
|
165
|
+
end
|
166
|
+
admin = Admin.find(user_name)
|
167
|
+
admin.domain_admins.destroy or raise "Could not destroy DomainAdmin"
|
168
|
+
admin.destroy or raise "Could not destroy Admin"
|
169
|
+
end
|
170
|
+
|
171
|
+
def delete_account(address)
|
172
|
+
unless Alias.exist?(address) && Mailbox.exist?(address)
|
173
|
+
raise Error, "Could not find account #{address}"
|
174
|
+
end
|
175
|
+
|
176
|
+
Mailbox.all(:username => address).destroy or raise "Could not destroy Mailbox"
|
177
|
+
Alias.all(:address => address).destroy or raise "Could not destroy Alias"
|
178
|
+
end
|
179
|
+
|
180
|
+
def delete_unnecessary_admins
|
181
|
+
Admin.unnecessary.destroy or raise "Could not destroy Admin"
|
182
|
+
end
|
183
|
+
|
184
|
+
def address_split(address)
|
185
|
+
address.split('@')
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
data/lib/postfix_admin/cli.rb
CHANGED
@@ -1,123 +1,288 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'postfix_admin'
|
3
3
|
|
4
|
-
|
4
|
+
module PostfixAdmin
|
5
5
|
class CLI
|
6
|
-
CONFIG_FILE = '
|
6
|
+
CONFIG_FILE = '~/.postfix_admin.conf'
|
7
7
|
MIN_NUM_PASSWORD_CHARACTER = 5
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
@config = load_config
|
11
|
-
@
|
11
|
+
@base = PostfixAdmin::Base.new(@config)
|
12
12
|
end
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
|
14
|
+
def show(domain)
|
15
|
+
show_summary(domain)
|
16
|
+
|
17
|
+
if domain
|
18
|
+
show_admin(domain)
|
19
|
+
show_address(domain)
|
20
|
+
show_alias(domain)
|
21
|
+
else
|
22
|
+
show_domain
|
23
|
+
show_admin
|
23
24
|
end
|
24
|
-
|
25
|
-
|
25
|
+
end
|
26
|
+
|
27
|
+
def show_summary(domain_name=nil)
|
28
|
+
title = "Summary"
|
29
|
+
if domain_name
|
30
|
+
domain_check(domain_name)
|
31
|
+
title = "Summary of #{domain_name}"
|
32
|
+
end
|
33
|
+
|
34
|
+
report(title) do
|
35
|
+
if domain_name
|
36
|
+
domain = Domain.find(domain_name)
|
37
|
+
puts "Mailboxes : %4d" % domain.mailboxes.count
|
38
|
+
puts "Aliases : %4d" % domain.num_total_aliases
|
39
|
+
puts "Quota : %4d MB" % domain.maxquota
|
40
|
+
else
|
41
|
+
puts "Domains : %4d" % Domain.all_without_special_domain.count
|
42
|
+
puts "Admins : %4d" % Admin.count
|
43
|
+
puts "Mailboxes : %4d" % Mailbox.count
|
44
|
+
puts "Aliases : %4d" % Domain.num_total_aliases
|
45
|
+
end
|
26
46
|
end
|
27
47
|
end
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
48
|
+
|
49
|
+
def setup_domain(domain, password)
|
50
|
+
admin = "admin@#{domain}"
|
51
|
+
add_domain(domain)
|
52
|
+
add_admin(admin, password)
|
53
|
+
add_admin_domain(admin, domain)
|
54
|
+
end
|
55
|
+
|
56
|
+
def show_domain
|
57
|
+
index = " No. Domain Aliases Mailboxes Quota (MB)"
|
58
|
+
report('Domains', index) do
|
59
|
+
if Domain.all_without_special_domain.count == 0
|
60
|
+
puts " No domains"
|
61
|
+
else
|
62
|
+
Domain.all_without_special_domain.each_with_index do |d, i|
|
63
|
+
puts "%4d %-20s %3d /%3d %3d /%3d %10d" %
|
64
|
+
[i+1, d.domain_name, d.num_total_aliases, d.maxaliases,
|
65
|
+
d.mailboxes.count, d.maxmailboxes, d.maxquota]
|
66
|
+
end
|
67
|
+
end
|
37
68
|
end
|
38
|
-
File.chmod(0600, config_file)
|
39
69
|
end
|
40
|
-
|
41
|
-
|
70
|
+
|
71
|
+
def add_domain(domain)
|
72
|
+
if @base.add_domain(domain)
|
73
|
+
puts %Q!"#{domain}" was successfully registered.!
|
74
|
+
end
|
42
75
|
end
|
43
|
-
|
44
|
-
|
76
|
+
|
77
|
+
def super_admin(user_name, disable)
|
78
|
+
unless Admin.exist?(user_name)
|
79
|
+
raise Error, "Could not find admin #{user_name}"
|
80
|
+
end
|
81
|
+
|
82
|
+
if disable
|
83
|
+
Admin.find(user_name).super_admin = false
|
84
|
+
puts "Successfully disabled super admin flag of #{user_name}"
|
85
|
+
else
|
86
|
+
Admin.find(user_name).super_admin = true
|
87
|
+
puts "Successfully enabled super admin flag of #{user_name}"
|
88
|
+
end
|
45
89
|
end
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
90
|
+
|
91
|
+
def change_admin_password(user_name, password)
|
92
|
+
change_password(Admin, user_name, password)
|
93
|
+
end
|
94
|
+
|
95
|
+
def change_account_password(user_name, password)
|
96
|
+
change_password(Mailbox, user_name, password)
|
97
|
+
end
|
98
|
+
|
99
|
+
def delete_domain(domain)
|
100
|
+
if @base.delete_domain(domain)
|
101
|
+
puts_deleted(domain)
|
52
102
|
end
|
53
|
-
print_line
|
54
103
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
104
|
+
|
105
|
+
def show_admin(domain=nil)
|
106
|
+
admins = domain ? Admin.select{|a| a.has_domain?(domain)} : Admin.all
|
107
|
+
index = " No. Admin Domains Password"
|
108
|
+
report("Admins", index) do
|
109
|
+
if admins.count == 0
|
110
|
+
puts " No admins"
|
111
|
+
else
|
112
|
+
admins.each_with_index do |a, i|
|
113
|
+
domains = a.super_admin? ? 'Super admin' : a.domains.count
|
114
|
+
puts "%4d %-30s %11s %s" % [i+1, a.username, domains, a.password]
|
115
|
+
end
|
116
|
+
end
|
60
117
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
def show_address(domain)
|
122
|
+
domain_check(domain)
|
123
|
+
|
124
|
+
mailboxes = Domain.find(domain).mailboxes
|
125
|
+
index = " No. Email Quota (MB) Password"
|
126
|
+
report("Addresses", index) do
|
127
|
+
if mailboxes.count == 0
|
128
|
+
puts " No addresses"
|
129
|
+
else
|
130
|
+
mailboxes.each_with_index do |m, i|
|
131
|
+
quota = m.quota.to_f/1024000.0
|
132
|
+
puts "%4d %-30s %10.1f %s" % [i+1, m.username, quota, m.password]
|
133
|
+
end
|
134
|
+
end
|
66
135
|
end
|
67
|
-
|
136
|
+
|
68
137
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
138
|
+
|
139
|
+
def show_alias(domain)
|
140
|
+
domain_check(domain)
|
141
|
+
|
142
|
+
aliases = Domain.find(domain).aliases.find_all do |mail_alias|
|
143
|
+
mail_alias.address != mail_alias.goto
|
74
144
|
end
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
145
|
+
|
146
|
+
index = " No. Address Go to"
|
147
|
+
report("Aliases", index) do
|
148
|
+
if aliases.count == 0
|
149
|
+
puts " No aliases"
|
150
|
+
else
|
151
|
+
aliases.each_with_index do |a, i|
|
152
|
+
puts "%4d %-30s %s" % [i+1, a.address, a.goto]
|
153
|
+
end
|
154
|
+
end
|
80
155
|
end
|
81
|
-
|
156
|
+
|
82
157
|
end
|
158
|
+
|
83
159
|
def show_admin_domain(user_name)
|
84
|
-
|
85
|
-
if
|
86
|
-
puts "
|
160
|
+
admin = Admin.find(user_name)
|
161
|
+
if admin.domains.count == 0
|
162
|
+
puts "\nNo domain in database"
|
87
163
|
return
|
88
164
|
end
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
printf("%4d %-20s\n", i+1, domain_admin.domain)
|
165
|
+
report("Domains (#{user_name})", " No. Domain") do
|
166
|
+
admin.domains.each_with_index do |d, i|
|
167
|
+
puts "%4d %-20s" % [i+1, d.domain_name]
|
168
|
+
end
|
94
169
|
end
|
95
|
-
print_line
|
96
170
|
end
|
97
|
-
|
98
|
-
|
99
|
-
end
|
100
|
-
def add_admin(user_name, password)
|
171
|
+
|
172
|
+
def add_admin(user_name, password, super_admin=false)
|
101
173
|
validate_password(password)
|
102
|
-
@
|
174
|
+
if @base.add_admin(user_name, password)
|
175
|
+
if super_admin
|
176
|
+
Admin.find(user_name).super_admin = true
|
177
|
+
puts_registered(user_name, "a super admin")
|
178
|
+
else
|
179
|
+
puts_registered(user_name, "an admin")
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def add_admin_domain(user_name, domain)
|
185
|
+
if @base.add_admin_domain(user_name, domain)
|
186
|
+
puts_registered(domain, "a domain of #{user_name}")
|
187
|
+
end
|
103
188
|
end
|
189
|
+
|
104
190
|
def add_account(address, password)
|
105
191
|
validate_password(password)
|
106
|
-
@
|
192
|
+
if @base.add_account(address, password)
|
193
|
+
puts_registered(address, "an account")
|
194
|
+
end
|
107
195
|
end
|
196
|
+
|
108
197
|
def add_alias(address, goto)
|
109
|
-
@
|
198
|
+
if @base.add_alias(address, goto)
|
199
|
+
puts_registered("#{address}: #{goto}", "an alias")
|
200
|
+
end
|
110
201
|
end
|
111
|
-
|
112
|
-
|
202
|
+
|
203
|
+
def delete_alias(address)
|
204
|
+
puts_deleted(address) if @base.delete_alias(address)
|
113
205
|
end
|
114
|
-
|
115
|
-
|
206
|
+
|
207
|
+
def delete_admin(user_name)
|
208
|
+
puts_deleted(user_name) if @base.delete_admin(user_name)
|
209
|
+
end
|
210
|
+
|
211
|
+
def delete_account(address)
|
212
|
+
puts_deleted(address) if @base.delete_account(address)
|
213
|
+
end
|
214
|
+
|
215
|
+
private
|
216
|
+
|
217
|
+
def puts_registered(name, as_str)
|
218
|
+
puts %Q!"#{name}" was successfully registered as #{as_str}.!
|
219
|
+
end
|
220
|
+
|
221
|
+
def puts_deleted(name)
|
222
|
+
puts %Q!"#{name}" was successfully deleted.!
|
116
223
|
end
|
224
|
+
|
225
|
+
def config_file
|
226
|
+
config_file = File.expand_path(CONFIG_FILE)
|
227
|
+
end
|
228
|
+
|
229
|
+
def load_config
|
230
|
+
unless File.exist?(config_file)
|
231
|
+
create_config(config_file)
|
232
|
+
puts "configure file: #{config_file} was generated.\nPlease execute after edit it."
|
233
|
+
exit
|
234
|
+
end
|
235
|
+
open(config_file) do |f|
|
236
|
+
YAML.load(f.read)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def create_config(config_file)
|
241
|
+
open(config_file, 'w') do |f|
|
242
|
+
f.write PostfixAdmin::Base::DEFAULT_CONFIG.to_yaml
|
243
|
+
end
|
244
|
+
File.chmod(0600, config_file)
|
245
|
+
end
|
246
|
+
|
247
|
+
def print_line
|
248
|
+
puts "-"*100
|
249
|
+
end
|
250
|
+
|
251
|
+
def report(title, index=nil)
|
252
|
+
puts "\n[#{title}]"
|
253
|
+
print_line if index
|
254
|
+
puts index if index
|
255
|
+
print_line
|
256
|
+
yield
|
257
|
+
print_line
|
258
|
+
end
|
259
|
+
|
260
|
+
def domain_check(domain_name)
|
261
|
+
unless Domain.exist?(domain_name)
|
262
|
+
raise Error, %Q!Could not find domain "#{domain_name}"!
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
117
266
|
def validate_password(password)
|
118
267
|
if password.size < MIN_NUM_PASSWORD_CHARACTER
|
119
|
-
raise "
|
268
|
+
raise ArgumentError, "Password is too short. It should be larger than #{MIN_NUM_PASSWORD_CHARACTER}"
|
120
269
|
end
|
121
270
|
end
|
271
|
+
|
272
|
+
def change_password(klass, user_name, password)
|
273
|
+
unless klass.exist?(user_name)
|
274
|
+
raise Error, "Could not find #{user_name}"
|
275
|
+
end
|
276
|
+
validate_password(password)
|
277
|
+
|
278
|
+
obj = klass.find(user_name)
|
279
|
+
obj.password = password
|
280
|
+
if obj.save
|
281
|
+
puts "the password of #{user_name} was successfully changed."
|
282
|
+
else
|
283
|
+
raise "Could not change password of #{klass.name}"
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
122
287
|
end
|
123
288
|
end
|