1
0
mirror of https://github.com/directorz/mailfull-go.git synced 2025-12-20 19:17:02 +00:00

36 Commits

Author SHA1 Message Date
teru
4c9781ad71 Merge pull request #36 from directorz/release/v1.0.1
Release/v1.0.1
2017-12-13 15:17:27 +09:00
teru
e32523d0b2 Bump version to v1.0.1 2017-12-13 15:16:35 +09:00
teru
188be4c3e8 Update libraries 2017-12-13 15:15:54 +09:00
teru
de4bddc161 Merge pull request #35 from directorz/feature/dep_flag
Added `-vendor-only` flag
2017-12-13 15:13:05 +09:00
teru
f618eb24e6 Added -vendor-only flag 2017-12-13 15:12:07 +09:00
teru
096193d93d Merge pull request #34 from directorz/feature/show_runtime_version
Now show runtime version in `mailfull --version`
2017-12-13 15:11:23 +09:00
teru
e32ed61771 Now show runtime version in mailfull --version 2017-12-13 15:07:44 +09:00
teru
3ae4d8d590 Merge pull request #30 from directorz/feature/v1.0.0
Feature/v1.0.0
2017-07-25 13:05:27 +09:00
teru
d4343eacce Merge pull request #29 from directorz/feature/bump_version
Bump version to v1.0.0
2017-07-25 13:05:04 +09:00
teru
a97a9e343b Bump version to v1.0.0 2017-07-25 13:04:25 +09:00
teru
f61d18f31f Merge pull request #28 from directorz/feature/remove_type_maildata
Remove type MailData
2017-07-25 13:02:30 +09:00
teru
9c92ac9656 Remove type MailData 2017-07-25 12:48:54 +09:00
teru
30f0279751 Merge pull request #27 from directorz/feature/remove_types_for_sort
Remove types for sort.Interface #26
2017-07-25 12:31:39 +09:00
teru
c7e56f26af Remove types for sort.Interface 2017-07-25 12:29:23 +09:00
teru
58b50cb3f6 Merge pull request #25 from directorz/feature/flatten
Feature/flatten
2017-07-25 11:58:26 +09:00
teru
146ab299d0 Use Errorf 2017-07-25 11:57:30 +09:00
teru
2e87209ad2 Move Meta to cmd package 2017-07-25 11:40:51 +09:00
teru
5a178c350b Change structs name 2017-07-25 11:35:42 +09:00
teru
b884655a7c Renamed 2017-07-25 11:22:11 +09:00
teru
552ed95a0f Integrate subpackage 2017-07-25 11:19:25 +09:00
teru
2bb46731d0 Merge pull request #24 from directorz/feature/cosme
cosmetic
2017-07-25 11:06:30 +09:00
teru
5a64a543ca cosmetic 2017-07-25 11:05:28 +09:00
teru
d0dd68e2b6 Merge pull request #23 from directorz/feature/build
Feature/build
2017-07-25 11:03:49 +09:00
teru
1daea44e49 Use golang:1.8.3 2017-07-25 11:01:55 +09:00
teru
3ac5856917 Use golang/dep instead of glide #21 2017-07-25 10:43:07 +09:00
teru
3cf4815565 Merge pull request #20 from directorz/feature/update_golang
Feature/update golang
2016-12-19 13:25:09 +09:00
teru
52e5d32c01 Bump version to v0.0.7 2016-12-19 13:24:41 +09:00
teru
b1d13b49f5 Use golang:1.7.4 2016-12-19 13:24:16 +09:00
teru
46cf349015 Merge pull request #19 from directorz/feature/vendoring_glide
Feature/vendoring glide
2016-09-29 12:12:28 +09:00
teru
9be507565d Bump version to v0.0.6 2016-09-29 12:12:03 +09:00
teru
58b4e49fe8 Use golang:1.7.1 2016-09-29 12:10:15 +09:00
teru
cb6e9ce2c5 Use Glide instead of gom 2016-09-29 12:08:07 +09:00
teru
db554a1da1 Merge pull request #18 from directorz/feature/no_commit_flag
Feature/no commit flag
2016-08-28 17:12:46 +09:00
teru
708e132ccc Bump version to v0.0.5 2016-08-28 17:10:32 +09:00
teru
3a1d4a588c Add a option to subcommands #7 2016-08-28 17:09:09 +09:00
teru
50d429ad78 Implement to parse -n flag #7 2016-08-28 17:06:52 +09:00
39 changed files with 757 additions and 582 deletions

View File

@@ -1,6 +0,0 @@
gom 'github.com/BurntSushi/toml'
gom 'github.com/armon/go-radix'
gom 'github.com/bgentry/speakeasy'
gom 'github.com/jsimonetti/pwscheme'
gom 'github.com/mattn/go-isatty'
gom 'github.com/mitchellh/cli'

69
Gopkg.lock generated Normal file
View File

@@ -0,0 +1,69 @@
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
name = "github.com/BurntSushi/toml"
packages = ["."]
revision = "b26d9c308763d68093482582cea63d69be07a0f0"
version = "v0.3.0"
[[projects]]
branch = "master"
name = "github.com/armon/go-radix"
packages = ["."]
revision = "1fca145dffbcaa8fe914309b1ec0cfc67500fe61"
[[projects]]
name = "github.com/bgentry/speakeasy"
packages = ["."]
revision = "4aabc24848ce5fd31929f7d1e4ea74d3709c14cd"
version = "v0.1.0"
[[projects]]
branch = "master"
name = "github.com/hashicorp/errwrap"
packages = ["."]
revision = "7554cd9344cec97297fa6649b055a8c98c2a1e55"
[[projects]]
branch = "master"
name = "github.com/hashicorp/go-multierror"
packages = ["."]
revision = "b7773ae218740a7be65057fc60b366a49b538a44"
[[projects]]
branch = "master"
name = "github.com/jsimonetti/pwscheme"
packages = ["ssha"]
revision = "76804708ecad54773871b35dbaa44f517973e395"
[[projects]]
name = "github.com/mattn/go-isatty"
packages = ["."]
revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39"
version = "v0.0.3"
[[projects]]
branch = "master"
name = "github.com/mitchellh/cli"
packages = ["."]
revision = "33edc47170b5df54d2588696d590c5e20ee583fe"
[[projects]]
name = "github.com/posener/complete"
packages = [".","cmd","cmd/install","match"]
revision = "dc2bc5a81accba8782bebea28628224643a8286a"
version = "v1.1"
[[projects]]
branch = "master"
name = "golang.org/x/sys"
packages = ["unix"]
revision = "53aa286056ef226755cd898109dbcdaba8ac0b81"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "d88d2668ae10b500606e3ebb1e719897e62e423f5ede8e4b470d12c1d255fe31"
solver-name = "gps-cdcl"
solver-version = 1

0
Gopkg.toml Normal file
View File

View File

@@ -1,29 +1,42 @@
GOVERSION=$(shell go version) GOVERSION=$(shell go version)
GOOS=$(word 1,$(subst /, ,$(lastword $(GOVERSION)))) THIS_GOOS=$(word 1,$(subst /, ,$(lastword $(GOVERSION))))
GOARCH=$(word 2,$(subst /, ,$(lastword $(GOVERSION)))) THIS_GOARCH=$(word 2,$(subst /, ,$(lastword $(GOVERSION))))
GOOS?=$(THIS_GOOS)
GOARCH?=$(THIS_GOARCH)
DIR_PKG=$(subst /src/github.com/directorz/mailfull-go,/pkg,$(PWD))
DIR_BUILD=build DIR_BUILD=build
DIR_RELEASE=release DIR_RELEASE=release
VERSION=$(patsubst "%",%,$(lastword $(shell grep 'const Version' version.go))) VERSION=$(patsubst "%",%,$(lastword $(shell grep 'const Version' version.go)))
GITTAG=$(shell git rev-parse --short HEAD)
.PHONY: build build-linux-amd64 build-linux-386 clean .PHONY: build build-linux-amd64 build-linux-386 clean
default: build default: build
installdeps: $(DIR_BUILD)/bin/$(THIS_GOOS)_$(THIS_GOARCH)/dep:
gom install mkdir -p /tmp/go
GOPATH=/tmp/go go get -d -v github.com/golang/dep
GOPATH=/tmp/go go build -v -o $(DIR_BUILD)/bin/$(THIS_GOOS)_$(THIS_GOARCH)/dep github.com/golang/dep/cmd/dep
rm -rf /tmp/go
dep: $(DIR_BUILD)/bin/$(THIS_GOOS)_$(THIS_GOARCH)/dep
installdeps: dep
$(DIR_BUILD)/bin/$(THIS_GOOS)_$(THIS_GOARCH)/dep ensure -v -vendor-only
build: build:
go build -v -ldflags "-X main.gittag=`git rev-parse --short HEAD`" -o build/mailfull_$(GOOS)_$(GOARCH)/mailfull cmd/mailfull/mailfull.go go build -v -i -ldflags "-X main.gittag=$(GITTAG)" -o $(DIR_BUILD)/mailfull_$(GOOS)_$(GOARCH)/mailfull cmd/mailfull/*.go
.build-docker:
docker run --rm -v $(DIR_PKG):/go/pkg -v $(PWD):/go/src/github.com/directorz/mailfull-go -w /go/src/github.com/directorz/mailfull-go \
-e GOOS=$(GOOS) -e GOARCH=$(GOARCH) golang:1.8.3 \
go build -v -i -ldflags "-X main.gittag=$(GITTAG)" -o $(DIR_BUILD)/mailfull_$(GOOS)_$(GOARCH)/mailfull cmd/mailfull/*.go
build-linux-amd64: build-linux-amd64:
docker run --rm -v $(PWD):/go/src/github.com/directorz/mailfull-go -w /go/src/github.com/directorz/mailfull-go \ @$(MAKE) .build-docker GOOS=linux GOARCH=amd64
-e GOOS=linux -e GOARCH=amd64 golang:1.7 \
go build -v -ldflags "-X main.gittag=`git rev-parse --short HEAD`" -o "build/mailfull_linux_amd64/mailfull" cmd/mailfull/mailfull.go
build-linux-386: build-linux-386:
docker run --rm -v $(PWD):/go/src/github.com/directorz/mailfull-go -w /go/src/github.com/directorz/mailfull-go \ @$(MAKE) .build-docker GOOS=linux GOARCH=386
-e GOOS=linux -e GOARCH=386 golang:1.7 \
go build -v -ldflags "-X main.gittag=`git rev-parse --short HEAD`" -o "build/mailfull_linux_386/mailfull" cmd/mailfull/mailfull.go
release: release-linux-amd64 release-linux-386 release: release-linux-amd64 release-linux-386

View File

@@ -15,13 +15,6 @@ type AliasDomain struct {
target string target string
} }
// AliasDomainSlice attaches the methods of sort.Interface to []*AliasDomain.
type AliasDomainSlice []*AliasDomain
func (p AliasDomainSlice) Len() int { return len(p) }
func (p AliasDomainSlice) Less(i, j int) bool { return p[i].Name() < p[j].Name() }
func (p AliasDomainSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// NewAliasDomain creates a new AliasDomain instance. // NewAliasDomain creates a new AliasDomain instance.
func NewAliasDomain(name, target string) (*AliasDomain, error) { func NewAliasDomain(name, target string) (*AliasDomain, error) {
ad := &AliasDomain{} ad := &AliasDomain{}
@@ -190,7 +183,7 @@ func (r *Repository) writeAliasDomainsFile(aliasDomains []*AliasDomain) error {
} }
defer file.Close() defer file.Close()
sort.Sort(AliasDomainSlice(aliasDomains)) sort.Slice(aliasDomains, func(i, j int) bool { return aliasDomains[i].Name() < aliasDomains[j].Name() })
for _, aliasDomain := range aliasDomains { for _, aliasDomain := range aliasDomains {
if _, err := fmt.Fprintf(file, "%s:%s\n", aliasDomain.Name(), aliasDomain.Target()); err != nil { if _, err := fmt.Fprintf(file, "%s:%s\n", aliasDomain.Name(), aliasDomain.Target()); err != nil {

View File

@@ -21,13 +21,6 @@ type AliasUser struct {
targets []string targets []string
} }
// AliasUserSlice attaches the methods of sort.Interface to []*AliasUser.
type AliasUserSlice []*AliasUser
func (p AliasUserSlice) Len() int { return len(p) }
func (p AliasUserSlice) Less(i, j int) bool { return p[i].Name() < p[j].Name() }
func (p AliasUserSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// NewAliasUser creates a new AliasUser instance. // NewAliasUser creates a new AliasUser instance.
func NewAliasUser(name string, targets []string) (*AliasUser, error) { func NewAliasUser(name string, targets []string) (*AliasUser, error) {
au := &AliasUser{} au := &AliasUser{}
@@ -233,7 +226,7 @@ func (r *Repository) writeAliasUsersFile(domainName string, aliasUsers []*AliasU
} }
defer file.Close() defer file.Close()
sort.Sort(AliasUserSlice(aliasUsers)) sort.Slice(aliasUsers, func(i, j int) bool { return aliasUsers[i].Name() < aliasUsers[j].Name() })
for _, aliasUser := range aliasUsers { for _, aliasUser := range aliasUsers {
if _, err := fmt.Fprintf(file, "%s:%s\n", aliasUser.Name(), strings.Join(aliasUser.Targets(), ",")); err != nil { if _, err := fmt.Fprintf(file, "%s:%s\n", aliasUser.Name(), strings.Join(aliasUser.Targets(), ",")); err != nil {

View File

@@ -1,26 +1,27 @@
package command package main
import ( import (
"fmt" "fmt"
mailfull "github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// AliasDomainAddCommand represents a AliasDomainAddCommand. // CmdAliasDomainAdd represents a CmdAliasDomainAdd.
type AliasDomainAddCommand struct { type CmdAliasDomainAdd struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *AliasDomainAddCommand) Synopsis() string { func (c *CmdAliasDomainAdd) Synopsis() string {
return "Create a new aliasdomain." return "Create a new aliasdomain."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *AliasDomainAddCommand) Help() string { func (c *CmdAliasDomainAdd) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain target %s %s [-n] domain target
Description: Description:
%s %s
@@ -30,6 +31,10 @@ Required Args:
The domain name that you want to create. The domain name that you want to create.
target target
The target domain name. The target domain name.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -38,7 +43,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *AliasDomainAddCommand) Run(args []string) int { func (c *CmdAliasDomainAdd) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 2 { if len(args) != 2 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -49,30 +60,26 @@ func (c *AliasDomainAddCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
aliasDomain, err := mailfull.NewAliasDomain(aliasDomainName, targetDomainName) aliasDomain, err := mailfull.NewAliasDomain(aliasDomainName, targetDomainName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.AliasDomainCreate(aliasDomain); err != nil { if err := repo.AliasDomainCreate(aliasDomain); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,26 +1,27 @@
package command package main
import ( import (
"fmt" "fmt"
mailfull "github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// AliasDomainDelCommand represents a AliasDomainDelCommand. // CmdAliasDomainDel represents a CmdAliasDomainDel.
type AliasDomainDelCommand struct { type CmdAliasDomainDel struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *AliasDomainDelCommand) Synopsis() string { func (c *CmdAliasDomainDel) Synopsis() string {
return "Delete a aliasdomain." return "Delete a aliasdomain."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *AliasDomainDelCommand) Help() string { func (c *CmdAliasDomainDel) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s [-n] domain
Description: Description:
%s %s
@@ -28,6 +29,10 @@ Description:
Required Args: Required Args:
domain domain
The domain name that you want to delete. The domain name that you want to delete.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -36,7 +41,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *AliasDomainDelCommand) Run(args []string) int { func (c *CmdAliasDomainDel) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -46,24 +57,20 @@ func (c *AliasDomainDelCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.AliasDomainRemove(aliasDomainName); err != nil { if err := repo.AliasDomainRemove(aliasDomainName); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,24 +1,25 @@
package command package main
import ( import (
"fmt" "fmt"
"sort" "sort"
mailfull "github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// AliasDomainsCommand represents a AliasDomainsCommand. // CmdAliasDomains represents a CmdAliasDomains.
type AliasDomainsCommand struct { type CmdAliasDomains struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *AliasDomainsCommand) Synopsis() string { func (c *CmdAliasDomains) Synopsis() string {
return "Show aliasdomains." return "Show aliasdomains."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *AliasDomainsCommand) Help() string { func (c *CmdAliasDomains) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s [domain] %s %s [domain]
@@ -37,7 +38,7 @@ Optional Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *AliasDomainsCommand) Run(args []string) int { func (c *CmdAliasDomains) Run(args []string) int {
if len(args) > 1 { if len(args) > 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -50,16 +51,16 @@ func (c *AliasDomainsCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
aliasDomains, err := repo.AliasDomains() aliasDomains, err := repo.AliasDomains()
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
sort.Sort(mailfull.AliasDomainSlice(aliasDomains)) sort.Slice(aliasDomains, func(i, j int) bool { return aliasDomains[i].Name() < aliasDomains[j].Name() })
for _, aliasDomain := range aliasDomains { for _, aliasDomain := range aliasDomains {
if targetDomainName != "" { if targetDomainName != "" {

View File

@@ -1,27 +1,28 @@
package command package main
import ( import (
"fmt" "fmt"
"strings" "strings"
mailfull "github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// AliasUserAddCommand represents a AliasUserAddCommand. // CmdAliasUserAdd represents a CmdAliasUserAdd.
type AliasUserAddCommand struct { type CmdAliasUserAdd struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *AliasUserAddCommand) Synopsis() string { func (c *CmdAliasUserAdd) Synopsis() string {
return "Create a new aliasuser." return "Create a new aliasuser."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *AliasUserAddCommand) Help() string { func (c *CmdAliasUserAdd) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s address target [target...] %s %s [-n] address target [target...]
Description: Description:
%s %s
@@ -31,6 +32,10 @@ Required Args:
The email address that you want to create. The email address that you want to create.
target target
Target email addresses. Target email addresses.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -39,7 +44,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *AliasUserAddCommand) Run(args []string) int { func (c *CmdAliasUserAdd) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) < 2 { if len(args) < 2 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -58,30 +69,26 @@ func (c *AliasUserAddCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
aliasUser, err := mailfull.NewAliasUser(aliasUserName, targets) aliasUser, err := mailfull.NewAliasUser(aliasUserName, targets)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.AliasUserCreate(domainName, aliasUser); err != nil { if err := repo.AliasUserCreate(domainName, aliasUser); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,27 +1,28 @@
package command package main
import ( import (
"fmt" "fmt"
"strings" "strings"
mailfull "github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// AliasUserDelCommand represents a AliasUserDelCommand. // CmdAliasUserDel represents a CmdAliasUserDel.
type AliasUserDelCommand struct { type CmdAliasUserDel struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *AliasUserDelCommand) Synopsis() string { func (c *CmdAliasUserDel) Synopsis() string {
return "Delete a aliasuser." return "Delete a aliasuser."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *AliasUserDelCommand) Help() string { func (c *CmdAliasUserDel) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s address %s %s [-n] address
Description: Description:
%s %s
@@ -29,6 +30,10 @@ Description:
Required Args: Required Args:
address address
The email address that you want to delete. The email address that you want to delete.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -37,7 +42,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *AliasUserDelCommand) Run(args []string) int { func (c *CmdAliasUserDel) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -54,24 +65,20 @@ func (c *AliasUserDelCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.AliasUserRemove(domainName, aliasUserName); err != nil { if err := repo.AliasUserRemove(domainName, aliasUserName); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,27 +1,28 @@
package command package main
import ( import (
"fmt" "fmt"
"strings" "strings"
mailfull "github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// AliasUserModCommand represents a AliasUserModCommand. // CmdAliasUserMod represents a CmdAliasUserMod.
type AliasUserModCommand struct { type CmdAliasUserMod struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *AliasUserModCommand) Synopsis() string { func (c *CmdAliasUserMod) Synopsis() string {
return "Modify a aliasuser." return "Modify a aliasuser."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *AliasUserModCommand) Help() string { func (c *CmdAliasUserMod) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s address target [target...] %s %s [-n] address target [target...]
Description: Description:
%s %s
@@ -31,6 +32,10 @@ Required Args:
The email address that you want to modify. The email address that you want to modify.
target target
Target email addresses. Target email addresses.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -39,7 +44,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *AliasUserModCommand) Run(args []string) int { func (c *CmdAliasUserMod) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) < 2 { if len(args) < 2 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -58,39 +69,35 @@ func (c *AliasUserModCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
aliasUser, err := repo.AliasUser(domainName, aliasUserName) aliasUser, err := repo.AliasUser(domainName, aliasUserName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if aliasUser == nil { if aliasUser == nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrAliasUserNotExist) c.Meta.Errorf("%v\n", mailfull.ErrAliasUserNotExist)
return 1 return 1
} }
if err := aliasUser.SetTargets(targets); err != nil { if err := aliasUser.SetTargets(targets); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.AliasUserUpdate(domainName, aliasUser); err != nil { if err := repo.AliasUserUpdate(domainName, aliasUser); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,24 +1,25 @@
package command package main
import ( import (
"fmt" "fmt"
"sort" "sort"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// AliasUsersCommand represents a AliasUsersCommand. // CmdAliasUsers represents a CmdAliasUsers.
type AliasUsersCommand struct { type CmdAliasUsers struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *AliasUsersCommand) Synopsis() string { func (c *CmdAliasUsers) Synopsis() string {
return "Show aliasusers." return "Show aliasusers."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *AliasUsersCommand) Help() string { func (c *CmdAliasUsers) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s domain
@@ -37,7 +38,7 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *AliasUsersCommand) Run(args []string) int { func (c *CmdAliasUsers) Run(args []string) int {
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -47,16 +48,16 @@ func (c *AliasUsersCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
aliasUsers, err := repo.AliasUsers(targetDomainName) aliasUsers, err := repo.AliasUsers(targetDomainName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
sort.Sort(mailfull.AliasUserSlice(aliasUsers)) sort.Slice(aliasUsers, func(i, j int) bool { return aliasUsers[i].Name() < aliasUsers[j].Name() })
for _, aliasUser := range aliasUsers { for _, aliasUser := range aliasUsers {
fmt.Fprintf(c.UI.Writer, "%s\n", aliasUser.Name()) fmt.Fprintf(c.UI.Writer, "%s\n", aliasUser.Name())

View File

@@ -1,23 +1,24 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// CatchAllCommand represents a CatchAllCommand. // CmdCatchAll represents a CmdCatchAll.
type CatchAllCommand struct { type CmdCatchAll struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *CatchAllCommand) Synopsis() string { func (c *CmdCatchAll) Synopsis() string {
return "Show a catchall user." return "Show a catchall user."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *CatchAllCommand) Help() string { func (c *CmdCatchAll) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s domain
@@ -36,7 +37,7 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *CatchAllCommand) Run(args []string) int { func (c *CmdCatchAll) Run(args []string) int {
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -46,13 +47,13 @@ func (c *CatchAllCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
catchAllUser, err := repo.CatchAllUser(domainName) catchAllUser, err := repo.CatchAllUser(domainName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }

View File

@@ -1,26 +1,27 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// CatchAllSetCommand represents a CatchAllSetCommand. // CmdCatchAllSet represents a CmdCatchAllSet.
type CatchAllSetCommand struct { type CmdCatchAllSet struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *CatchAllSetCommand) Synopsis() string { func (c *CmdCatchAllSet) Synopsis() string {
return "Set a catchall user." return "Set a catchall user."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *CatchAllSetCommand) Help() string { func (c *CmdCatchAllSet) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain user %s %s [-n] domain user
Description: Description:
%s %s
@@ -30,6 +31,10 @@ Required Args:
The domain name. The domain name.
user user
The user name that you want to set as catchall user. The user name that you want to set as catchall user.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -38,7 +43,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *CatchAllSetCommand) Run(args []string) int { func (c *CmdCatchAllSet) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 2 { if len(args) != 2 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -49,30 +60,26 @@ func (c *CatchAllSetCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
catchAllUser, err := mailfull.NewCatchAllUser(userName) catchAllUser, err := mailfull.NewCatchAllUser(userName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.CatchAllUserSet(domainName, catchAllUser); err != nil { if err := repo.CatchAllUserSet(domainName, catchAllUser); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,26 +1,27 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// CatchAllUnsetCommand represents a CatchAllUnsetCommand. // CmdCatchAllUnset represents a CmdCatchAllUnset.
type CatchAllUnsetCommand struct { type CmdCatchAllUnset struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *CatchAllUnsetCommand) Synopsis() string { func (c *CmdCatchAllUnset) Synopsis() string {
return "Unset a catchall user." return "Unset a catchall user."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *CatchAllUnsetCommand) Help() string { func (c *CmdCatchAllUnset) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s [-n] domain
Description: Description:
%s %s
@@ -28,6 +29,10 @@ Description:
Required Args: Required Args:
domain domain
The domain name. The domain name.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -36,7 +41,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *CatchAllUnsetCommand) Run(args []string) int { func (c *CmdCatchAllUnset) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -46,24 +57,20 @@ func (c *CatchAllUnsetCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.CatchAllUserUnset(domainName); err != nil { if err := repo.CatchAllUserUnset(domainName); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -0,0 +1,49 @@
package main
import (
"fmt"
"github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
)
// CmdCommit represents a CmdCommit.
type CmdCommit struct {
cmd.Meta
}
// Synopsis returns a one-line synopsis.
func (c *CmdCommit) Synopsis() string {
return "Create databases from the structure of the MailData directory."
}
// Help returns long-form help text.
func (c *CmdCommit) Help() string {
txt := fmt.Sprintf(`
Usage:
%s %s
Description:
%s
`,
c.CmdName, c.SubCmdName,
c.Synopsis())
return txt[1:]
}
// Run runs the command and returns the exit status.
func (c *CmdCommit) Run(args []string) int {
repo, err := mailfull.OpenRepository(".")
if err != nil {
c.Meta.Errorf("%v\n", err)
return 1
}
if err = repo.GenerateDatabases(); err != nil {
c.Meta.Errorf("%v\n", err)
return 1
}
return 0
}

View File

@@ -1,26 +1,27 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// DomainAddCommand represents a DomainAddCommand. // CmdDomainAdd represents a CmdDomainAdd.
type DomainAddCommand struct { type CmdDomainAdd struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *DomainAddCommand) Synopsis() string { func (c *CmdDomainAdd) Synopsis() string {
return "Create a new domain and postmaster." return "Create a new domain and postmaster."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *DomainAddCommand) Help() string { func (c *CmdDomainAdd) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s [-n] domain
Description: Description:
%s %s
@@ -28,6 +29,10 @@ Description:
Required Args: Required Args:
domain domain
The domain name that you want to create. The domain name that you want to create.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -36,7 +41,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *DomainAddCommand) Run(args []string) int { func (c *CmdDomainAdd) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -46,41 +57,37 @@ func (c *DomainAddCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
domain, err := mailfull.NewDomain(domainName) domain, err := mailfull.NewDomain(domainName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.DomainCreate(domain); err != nil { if err := repo.DomainCreate(domain); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
user, err := mailfull.NewUser("postmaster", mailfull.NeverMatchHashedPassword, nil) user, err := mailfull.NewUser("postmaster", mailfull.NeverMatchHashedPassword, nil)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.UserCreate(domainName, user); err != nil { if err := repo.UserCreate(domainName, user); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,26 +1,27 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// DomainDelCommand represents a DomainDelCommand. // CmdDomainDel represents a CmdDomainDel.
type DomainDelCommand struct { type CmdDomainDel struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *DomainDelCommand) Synopsis() string { func (c *CmdDomainDel) Synopsis() string {
return "Delete and backup a domain." return "Delete and backup a domain."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *DomainDelCommand) Help() string { func (c *CmdDomainDel) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s [-n] domain
Description: Description:
%s %s
@@ -28,6 +29,10 @@ Description:
Required Args: Required Args:
domain domain
The domain name that you want to delete. The domain name that you want to delete.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -36,7 +41,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *DomainDelCommand) Run(args []string) int { func (c *CmdDomainDel) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -46,24 +57,20 @@ func (c *DomainDelCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.DomainRemove(domainName); err != nil { if err := repo.DomainRemove(domainName); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,26 +1,27 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// DomainDisableCommand represents a DomainDisableCommand. // CmdDomainDisable represents a CmdDomainDisable.
type DomainDisableCommand struct { type CmdDomainDisable struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *DomainDisableCommand) Synopsis() string { func (c *CmdDomainDisable) Synopsis() string {
return "Disable a domain temporarily." return "Disable a domain temporarily."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *DomainDisableCommand) Help() string { func (c *CmdDomainDisable) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s [-n] domain
Description: Description:
%s %s
@@ -28,6 +29,10 @@ Description:
Required Args: Required Args:
domain domain
The domain name that you want to disable. The domain name that you want to disable.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -36,7 +41,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *DomainDisableCommand) Run(args []string) int { func (c *CmdDomainDisable) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -46,36 +57,32 @@ func (c *DomainDisableCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
domain, err := repo.Domain(domainName) domain, err := repo.Domain(domainName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if domain == nil { if domain == nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrDomainNotExist) c.Meta.Errorf("%v\n", mailfull.ErrDomainNotExist)
return 1 return 1
} }
domain.SetDisabled(true) domain.SetDisabled(true)
if err := repo.DomainUpdate(domain); err != nil { if err := repo.DomainUpdate(domain); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,26 +1,27 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// DomainEnableCommand represents a DomainEnableCommand. // CmdDomainEnable represents a CmdDomainEnable.
type DomainEnableCommand struct { type CmdDomainEnable struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *DomainEnableCommand) Synopsis() string { func (c *CmdDomainEnable) Synopsis() string {
return "Enable a domain." return "Enable a domain."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *DomainEnableCommand) Help() string { func (c *CmdDomainEnable) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s [-n] domain
Description: Description:
%s %s
@@ -28,6 +29,10 @@ Description:
Required Args: Required Args:
domain domain
The domain name that you want to enable. The domain name that you want to enable.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -36,7 +41,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *DomainEnableCommand) Run(args []string) int { func (c *CmdDomainEnable) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -46,36 +57,32 @@ func (c *DomainEnableCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
domain, err := repo.Domain(domainName) domain, err := repo.Domain(domainName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if domain == nil { if domain == nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrDomainNotExist) c.Meta.Errorf("%v\n", mailfull.ErrDomainNotExist)
return 1 return 1
} }
domain.SetDisabled(false) domain.SetDisabled(false)
if err := repo.DomainUpdate(domain); err != nil { if err := repo.DomainUpdate(domain); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,24 +1,25 @@
package command package main
import ( import (
"fmt" "fmt"
"sort" "sort"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// DomainsCommand represents a DomainsCommand. // CmdDomains represents a CmdDomains.
type DomainsCommand struct { type CmdDomains struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *DomainsCommand) Synopsis() string { func (c *CmdDomains) Synopsis() string {
return "Show domains." return "Show domains."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *DomainsCommand) Help() string { func (c *CmdDomains) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s %s %s
@@ -34,19 +35,19 @@ Description:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *DomainsCommand) Run(args []string) int { func (c *CmdDomains) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
domains, err := repo.Domains() domains, err := repo.Domains()
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
sort.Sort(mailfull.DomainSlice(domains)) sort.Slice(domains, func(i, j int) bool { return domains[i].Name() < domains[j].Name() })
for _, domain := range domains { for _, domain := range domains {
disableStr := "" disableStr := ""

View File

@@ -1,23 +1,24 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// GenConfigCommand represents a GenConfigCommand. // CmdGenConfig represents a CmdGenConfig.
type GenConfigCommand struct { type CmdGenConfig struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *GenConfigCommand) Synopsis() string { func (c *CmdGenConfig) Synopsis() string {
return "Write a Postfix or Dovecot configuration to stdout." return "Write a Postfix or Dovecot configuration to stdout."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *GenConfigCommand) Help() string { func (c *CmdGenConfig) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s name %s %s name
@@ -37,7 +38,7 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *GenConfigCommand) Run(args []string) int { func (c *CmdGenConfig) Run(args []string) int {
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -47,7 +48,7 @@ func (c *GenConfigCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
@@ -59,7 +60,7 @@ func (c *GenConfigCommand) Run(args []string) int {
fmt.Fprintf(c.UI.Writer, "%s", repo.GenerateConfigDovecot()) fmt.Fprintf(c.UI.Writer, "%s", repo.GenerateConfigDovecot())
default: default:
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] Specify \"postfix\" or \"dovecot\".\n") c.Meta.Errorf("Specify \"postfix\" or \"dovecot\".\n")
return 1 return 1
} }

View File

@@ -1,23 +1,24 @@
package command package main
import ( import (
"fmt" "fmt"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// InitCommand represents a InitCommand. // CmdInit represents a CmdInit.
type InitCommand struct { type CmdInit struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *InitCommand) Synopsis() string { func (c *CmdInit) Synopsis() string {
return "Initializes current directory as a Mailfull repository." return "Initializes current directory as a Mailfull repository."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *InitCommand) Help() string { func (c *CmdInit) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s %s %s
@@ -32,9 +33,9 @@ Description:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *InitCommand) Run(args []string) int { func (c *CmdInit) Run(args []string) int {
if err := mailfull.InitRepository("."); err != nil { if err := mailfull.InitRepository("."); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }

View File

@@ -1,27 +1,28 @@
package command package main
import ( import (
"fmt" "fmt"
"strings" "strings"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// UserAddCommand represents a UserAddCommand. // CmdUserAdd represents a CmdUserAdd.
type UserAddCommand struct { type CmdUserAdd struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *UserAddCommand) Synopsis() string { func (c *CmdUserAdd) Synopsis() string {
return "Create a new user." return "Create a new user."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *UserAddCommand) Help() string { func (c *CmdUserAdd) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s address %s %s [-n] address
Description: Description:
%s %s
@@ -29,6 +30,10 @@ Description:
Required Args: Required Args:
address address
The email address that you want to create. The email address that you want to create.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -37,7 +42,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *UserAddCommand) Run(args []string) int { func (c *CmdUserAdd) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -55,30 +66,26 @@ func (c *UserAddCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
user, err := mailfull.NewUser(userName, mailfull.NeverMatchHashedPassword, nil) user, err := mailfull.NewUser(userName, mailfull.NeverMatchHashedPassword, nil)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if err := repo.UserCreate(domainName, user); err != nil { if err := repo.UserCreate(domainName, user); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,25 +1,26 @@
package command package main
import ( import (
"fmt" "fmt"
"strings" "strings"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
"github.com/jsimonetti/pwscheme/ssha" "github.com/jsimonetti/pwscheme/ssha"
) )
// UserCheckPwCommand represents a UserCheckPwCommand. // CmdUserCheckPw represents a CmdUserCheckPw.
type UserCheckPwCommand struct { type CmdUserCheckPw struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *UserCheckPwCommand) Synopsis() string { func (c *CmdUserCheckPw) Synopsis() string {
return "Check user's password." return "Check user's password."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *UserCheckPwCommand) Help() string { func (c *CmdUserCheckPw) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s address [password] %s %s address [password]
@@ -34,7 +35,7 @@ Required Args:
Optional Args: Optional Args:
password password
Specify the password instead of your typing. Specify the password instead of your typing.
This option is not recommended because the password will be visible in your shell history. This option is NOT recommended because the password will be visible in your shell history.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -43,7 +44,7 @@ Optional Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *UserCheckPwCommand) Run(args []string) int { func (c *CmdUserCheckPw) Run(args []string) int {
if len(args) != 1 && len(args) != 2 { if len(args) != 1 && len(args) != 2 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -66,24 +67,24 @@ func (c *UserCheckPwCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
user, err := repo.User(domainName, userName) user, err := repo.User(domainName, userName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if user == nil { if user == nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrUserNotExist) c.Meta.Errorf("%v\n", mailfull.ErrUserNotExist)
return 1 return 1
} }
if len(args) != 2 { if len(args) != 2 {
input, err := c.UI.AskSecret(fmt.Sprintf("Enter password for %s:", address)) input, err := c.UI.AskSecret(fmt.Sprintf("Enter password for %s:", address))
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }

View File

@@ -1,27 +1,28 @@
package command package main
import ( import (
"fmt" "fmt"
"strings" "strings"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// UserDelCommand represents a UserDelCommand. // CmdUserDel represents a CmdUserDel.
type UserDelCommand struct { type CmdUserDel struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *UserDelCommand) Synopsis() string { func (c *CmdUserDel) Synopsis() string {
return "Delete and backup a user." return "Delete and backup a user."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *UserDelCommand) Help() string { func (c *CmdUserDel) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s address %s %s [-n] address
Description: Description:
%s %s
@@ -29,6 +30,10 @@ Description:
Required Args: Required Args:
address address
The email address that you want to delete. The email address that you want to delete.
Optional Args:
-n
Don't update databases.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -37,7 +42,13 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *UserDelCommand) Run(args []string) int { func (c *CmdUserDel) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -55,29 +66,25 @@ func (c *UserDelCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if userName == "postmaster" { if userName == "postmaster" {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] Cannot delete postmaster.\n") c.Meta.Errorf("Cannot delete postmaster.\n")
return 1 return 1
} }
if err := repo.UserRemove(domainName, userName); err != nil { if err := repo.UserRemove(domainName, userName); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,28 +1,29 @@
package command package main
import ( import (
"fmt" "fmt"
"strings" "strings"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
"github.com/jsimonetti/pwscheme/ssha" "github.com/jsimonetti/pwscheme/ssha"
) )
// UserPasswdCommand represents a UserPasswdCommand. // CmdUserPasswd represents a CmdUserPasswd.
type UserPasswdCommand struct { type CmdUserPasswd struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *UserPasswdCommand) Synopsis() string { func (c *CmdUserPasswd) Synopsis() string {
return "Update user's password." return "Update user's password."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *UserPasswdCommand) Help() string { func (c *CmdUserPasswd) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s address [password] %s %s [-n] address [password]
Description: Description:
%s %s
@@ -32,9 +33,11 @@ Required Args:
The email address that you want to update the password. The email address that you want to update the password.
Optional Args: Optional Args:
-n
Don't update databases.
password password
Specify the password instead of your typing. Specify the password instead of your typing.
This option is not recommended because the password will be visible in your shell history. This option is NOT recommended because the password will be visible in your shell history.
`, `,
c.CmdName, c.SubCmdName, c.CmdName, c.SubCmdName,
c.Synopsis()) c.Synopsis())
@@ -43,7 +46,13 @@ Optional Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *UserPasswdCommand) Run(args []string) int { func (c *CmdUserPasswd) Run(args []string) int {
noCommit, err := noCommitFlag(&args)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1
}
if len(args) != 1 && len(args) != 2 { if len(args) != 1 && len(args) != 2 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -66,33 +75,33 @@ func (c *UserPasswdCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
user, err := repo.User(domainName, userName) user, err := repo.User(domainName, userName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if user == nil { if user == nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrUserNotExist) c.Meta.Errorf("%v\n", mailfull.ErrUserNotExist)
return 1 return 1
} }
if len(args) != 2 { if len(args) != 2 {
input1, err := c.UI.AskSecret(fmt.Sprintf("Enter new password for %s:", address)) input1, err := c.UI.AskSecret(fmt.Sprintf("Enter new password for %s:", address))
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
input2, err := c.UI.AskSecret("Retype new password:") input2, err := c.UI.AskSecret("Retype new password:")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
if input1 != input2 { if input1 != input2 {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] inputs do not match.\n") c.Meta.Errorf("inputs do not match.\n")
return 1 return 1
} }
rawPassword = input1 rawPassword = input1
@@ -102,7 +111,7 @@ func (c *UserPasswdCommand) Run(args []string) int {
if rawPassword != "" { if rawPassword != "" {
str, err := ssha.Generate(rawPassword, 4) str, err := ssha.Generate(rawPassword, 4)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
hashedPassword = str hashedPassword = str
@@ -111,19 +120,15 @@ func (c *UserPasswdCommand) Run(args []string) int {
user.SetHashedPassword(hashedPassword) user.SetHashedPassword(hashedPassword)
if err := repo.UserUpdate(domainName, user); err != nil { if err := repo.UserUpdate(domainName, user); err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
mailData, err := repo.MailData() if noCommit {
if err != nil { return 0
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
} }
if err = repo.GenerateDatabases(); err != nil {
err = repo.GenerateDatabases(mailData) c.Meta.Errorf("%v\n", err)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1 return 1
} }

View File

@@ -1,24 +1,25 @@
package command package main
import ( import (
"fmt" "fmt"
"sort" "sort"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd"
) )
// UsersCommand represents a UsersCommand. // CmdUsers represents a CmdUsers.
type UsersCommand struct { type CmdUsers struct {
Meta cmd.Meta
} }
// Synopsis returns a one-line synopsis. // Synopsis returns a one-line synopsis.
func (c *UsersCommand) Synopsis() string { func (c *CmdUsers) Synopsis() string {
return "Show users." return "Show users."
} }
// Help returns long-form help text. // Help returns long-form help text.
func (c *UsersCommand) Help() string { func (c *CmdUsers) Help() string {
txt := fmt.Sprintf(` txt := fmt.Sprintf(`
Usage: Usage:
%s %s domain %s %s domain
@@ -37,7 +38,7 @@ Required Args:
} }
// Run runs the command and returns the exit status. // Run runs the command and returns the exit status.
func (c *UsersCommand) Run(args []string) int { func (c *CmdUsers) Run(args []string) int {
if len(args) != 1 { if len(args) != 1 {
fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help())
return 1 return 1
@@ -47,16 +48,16 @@ func (c *UsersCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".") repo, err := mailfull.OpenRepository(".")
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
users, err := repo.Users(targetDomainName) users, err := repo.Users(targetDomainName)
if err != nil { if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) c.Meta.Errorf("%v\n", err)
return 1 return 1
} }
sort.Sort(mailfull.UserSlice(users)) sort.Slice(users, func(i, j int) bool { return users[i].Name() < users[j].Name() })
for _, user := range users { for _, user := range users {
fmt.Fprintf(c.UI.Writer, "%s\n", user.Name()) fmt.Fprintf(c.UI.Writer, "%s\n", user.Name())

View File

@@ -1,55 +0,0 @@
package command
import (
"fmt"
"github.com/directorz/mailfull-go"
)
// CommitCommand represents a CommitCommand.
type CommitCommand struct {
Meta
}
// Synopsis returns a one-line synopsis.
func (c *CommitCommand) Synopsis() string {
return "Create databases from the structure of the MailData directory."
}
// Help returns long-form help text.
func (c *CommitCommand) Help() string {
txt := fmt.Sprintf(`
Usage:
%s %s
Description:
%s
`,
c.CmdName, c.SubCmdName,
c.Synopsis())
return txt[1:]
}
// Run runs the command and returns the exit status.
func (c *CommitCommand) Run(args []string) int {
repo, err := mailfull.OpenRepository(".")
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
}
mailData, err := repo.MailData()
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
}
err = repo.GenerateDatabases(mailData)
if err != nil {
fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err)
return 1
}
return 0
}

View File

@@ -1,13 +0,0 @@
package command
import (
"github.com/mitchellh/cli"
)
// Meta is for `*Command` struct.
type Meta struct {
UI *cli.BasicUi
CmdName string
SubCmdName string
Version string
}

View File

@@ -4,12 +4,15 @@ Command mailfull is a CLI application using the mailfull package.
package main package main
import ( import (
"bytes"
"flag"
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
"runtime"
"github.com/directorz/mailfull-go" "github.com/directorz/mailfull-go"
"github.com/directorz/mailfull-go/cmd/mailfull/command" "github.com/directorz/mailfull-go/cmd"
"github.com/mitchellh/cli" "github.com/mitchellh/cli"
) )
@@ -20,8 +23,9 @@ var (
func init() { func init() {
if gittag != "" { if gittag != "" {
version = version + "-" + gittag version += "-" + gittag
} }
version += fmt.Sprintf(" (built with %s)", runtime.Version())
} }
func main() { func main() {
@@ -31,7 +35,7 @@ func main() {
Args: os.Args[1:], Args: os.Args[1:],
} }
meta := command.Meta{ meta := cmd.Meta{
UI: &cli.BasicUi{ UI: &cli.BasicUi{
Reader: os.Stdin, Reader: os.Stdin,
Writer: os.Stdout, Writer: os.Stdout,
@@ -44,95 +48,95 @@ func main() {
c.Commands = map[string]cli.CommandFactory{ c.Commands = map[string]cli.CommandFactory{
"init": func() (cli.Command, error) { "init": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.InitCommand{Meta: meta}, nil return &CmdInit{Meta: meta}, nil
}, },
"genconfig": func() (cli.Command, error) { "genconfig": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.GenConfigCommand{Meta: meta}, nil return &CmdGenConfig{Meta: meta}, nil
}, },
"domains": func() (cli.Command, error) { "domains": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.DomainsCommand{Meta: meta}, nil return &CmdDomains{Meta: meta}, nil
}, },
"domainadd": func() (cli.Command, error) { "domainadd": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.DomainAddCommand{Meta: meta}, nil return &CmdDomainAdd{Meta: meta}, nil
}, },
"domaindel": func() (cli.Command, error) { "domaindel": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.DomainDelCommand{Meta: meta}, nil return &CmdDomainDel{Meta: meta}, nil
}, },
"domaindisable": func() (cli.Command, error) { "domaindisable": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.DomainDisableCommand{Meta: meta}, nil return &CmdDomainDisable{Meta: meta}, nil
}, },
"domainenable": func() (cli.Command, error) { "domainenable": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.DomainEnableCommand{Meta: meta}, nil return &CmdDomainEnable{Meta: meta}, nil
}, },
"aliasdomains": func() (cli.Command, error) { "aliasdomains": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.AliasDomainsCommand{Meta: meta}, nil return &CmdAliasDomains{Meta: meta}, nil
}, },
"aliasdomainadd": func() (cli.Command, error) { "aliasdomainadd": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.AliasDomainAddCommand{Meta: meta}, nil return &CmdAliasDomainAdd{Meta: meta}, nil
}, },
"aliasdomaindel": func() (cli.Command, error) { "aliasdomaindel": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.AliasDomainDelCommand{Meta: meta}, nil return &CmdAliasDomainDel{Meta: meta}, nil
}, },
"users": func() (cli.Command, error) { "users": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.UsersCommand{Meta: meta}, nil return &CmdUsers{Meta: meta}, nil
}, },
"useradd": func() (cli.Command, error) { "useradd": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.UserAddCommand{Meta: meta}, nil return &CmdUserAdd{Meta: meta}, nil
}, },
"userdel": func() (cli.Command, error) { "userdel": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.UserDelCommand{Meta: meta}, nil return &CmdUserDel{Meta: meta}, nil
}, },
"userpasswd": func() (cli.Command, error) { "userpasswd": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.UserPasswdCommand{Meta: meta}, nil return &CmdUserPasswd{Meta: meta}, nil
}, },
"usercheckpw": func() (cli.Command, error) { "usercheckpw": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.UserCheckPwCommand{Meta: meta}, nil return &CmdUserCheckPw{Meta: meta}, nil
}, },
"aliasusers": func() (cli.Command, error) { "aliasusers": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.AliasUsersCommand{Meta: meta}, nil return &CmdAliasUsers{Meta: meta}, nil
}, },
"aliasuseradd": func() (cli.Command, error) { "aliasuseradd": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.AliasUserAddCommand{Meta: meta}, nil return &CmdAliasUserAdd{Meta: meta}, nil
}, },
"aliasusermod": func() (cli.Command, error) { "aliasusermod": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.AliasUserModCommand{Meta: meta}, nil return &CmdAliasUserMod{Meta: meta}, nil
}, },
"aliasuserdel": func() (cli.Command, error) { "aliasuserdel": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.AliasUserDelCommand{Meta: meta}, nil return &CmdAliasUserDel{Meta: meta}, nil
}, },
"catchall": func() (cli.Command, error) { "catchall": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.CatchAllCommand{Meta: meta}, nil return &CmdCatchAll{Meta: meta}, nil
}, },
"catchallset": func() (cli.Command, error) { "catchallset": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.CatchAllSetCommand{Meta: meta}, nil return &CmdCatchAllSet{Meta: meta}, nil
}, },
"catchallunset": func() (cli.Command, error) { "catchallunset": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.CatchAllUnsetCommand{Meta: meta}, nil return &CmdCatchAllUnset{Meta: meta}, nil
}, },
"commit": func() (cli.Command, error) { "commit": func() (cli.Command, error) {
meta.SubCmdName = c.Subcommand() meta.SubCmdName = c.Subcommand()
return &command.CommitCommand{Meta: meta}, nil return &CmdCommit{Meta: meta}, nil
}, },
} }
@@ -143,3 +147,17 @@ func main() {
os.Exit(exitCode) os.Exit(exitCode)
} }
// noCommitFlag returns true if `pargs` has "-n" flag.
// `pargs` is overwrites with non-flag arguments.
func noCommitFlag(pargs *[]string) (bool, error) {
nFlag := false
flagSet := flag.NewFlagSet("", flag.ContinueOnError)
flagSet.SetOutput(&bytes.Buffer{})
flagSet.BoolVar(&nFlag, "n", nFlag, "")
err := flagSet.Parse(*pargs)
*pargs = flagSet.Args()
return nFlag, err
}

20
cmd/meta.go Normal file
View File

@@ -0,0 +1,20 @@
package cmd
import (
"fmt"
"github.com/mitchellh/cli"
)
// Meta contains options to execute a command.
type Meta struct {
UI *cli.BasicUi
CmdName string
SubCmdName string
Version string
}
// Errorf prints the error to ErrorWriter with the prefix string.
func (m Meta) Errorf(format string, v ...interface{}) {
fmt.Fprintf(m.UI.ErrorWriter, "[ERR] "+format, v...)
}

View File

@@ -9,33 +9,84 @@ import (
"strings" "strings"
) )
// GenerateDatabases generates databases from the MailData directory. // repoData represents a repoData.
func (r *Repository) GenerateDatabases(md *MailData) error { type repoData struct {
sort.Sort(DomainSlice(md.Domains)) Domains []*Domain
sort.Sort(AliasDomainSlice(md.AliasDomains)) AliasDomains []*AliasDomain
}
for _, domain := range md.Domains { // repoData returns a repoData.
sort.Sort(UserSlice(domain.Users)) func (r *Repository) repoData() (*repoData, error) {
sort.Sort(AliasUserSlice(domain.AliasUsers)) domains, err := r.Domains()
if err != nil {
return nil, err
}
aliasDomains, err := r.AliasDomains()
if err != nil {
return nil, err
}
for _, domain := range domains {
users, err := r.Users(domain.Name())
if err != nil {
return nil, err
}
domain.Users = users
aliasUsers, err := r.AliasUsers(domain.Name())
if err != nil {
return nil, err
}
domain.AliasUsers = aliasUsers
catchAllUser, err := r.CatchAllUser(domain.Name())
if err != nil {
return nil, err
}
domain.CatchAllUser = catchAllUser
}
rd := &repoData{
Domains: domains,
AliasDomains: aliasDomains,
}
return rd, nil
}
// GenerateDatabases generates databases from the Repository.
func (r *Repository) GenerateDatabases() error {
rd, err := r.repoData()
if err != nil {
return err
}
sort.Slice(rd.Domains, func(i, j int) bool { return rd.Domains[i].Name() < rd.Domains[j].Name() })
sort.Slice(rd.AliasDomains, func(i, j int) bool { return rd.AliasDomains[i].Name() < rd.AliasDomains[j].Name() })
for _, domain := range rd.Domains {
sort.Slice(domain.Users, func(i, j int) bool { return domain.Users[i].Name() < domain.Users[j].Name() })
sort.Slice(domain.AliasUsers, func(i, j int) bool { return domain.AliasUsers[i].Name() < domain.AliasUsers[j].Name() })
} }
// Generate files // Generate files
if err := r.generateDbDomains(md); err != nil { if err := r.generateDbDomains(rd); err != nil {
return err return err
} }
if err := r.generateDbDestinations(md); err != nil { if err := r.generateDbDestinations(rd); err != nil {
return err return err
} }
if err := r.generateDbMaildirs(md); err != nil { if err := r.generateDbMaildirs(rd); err != nil {
return err return err
} }
if err := r.generateDbLocaltable(md); err != nil { if err := r.generateDbLocaltable(rd); err != nil {
return err return err
} }
if err := r.generateDbForwards(md); err != nil { if err := r.generateDbForwards(rd); err != nil {
return err return err
} }
if err := r.generateDbPasswords(md); err != nil { if err := r.generateDbPasswords(rd); err != nil {
return err return err
} }
@@ -59,7 +110,7 @@ func (r *Repository) GenerateDatabases(md *MailData) error {
return nil return nil
} }
func (r *Repository) generateDbDomains(md *MailData) error { func (r *Repository) generateDbDomains(rd *repoData) error {
dbDomains, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbDomains)) dbDomains, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbDomains))
if err != nil { if err != nil {
return err return err
@@ -69,7 +120,7 @@ func (r *Repository) generateDbDomains(md *MailData) error {
} }
defer dbDomains.Close() defer dbDomains.Close()
for _, domain := range md.Domains { for _, domain := range rd.Domains {
if domain.Disabled() { if domain.Disabled() {
continue continue
} }
@@ -79,7 +130,7 @@ func (r *Repository) generateDbDomains(md *MailData) error {
} }
} }
for _, aliasDomain := range md.AliasDomains { for _, aliasDomain := range rd.AliasDomains {
if _, err := fmt.Fprintf(dbDomains, "%s virtual\n", aliasDomain.Name()); err != nil { if _, err := fmt.Fprintf(dbDomains, "%s virtual\n", aliasDomain.Name()); err != nil {
return err return err
} }
@@ -88,7 +139,7 @@ func (r *Repository) generateDbDomains(md *MailData) error {
return nil return nil
} }
func (r *Repository) generateDbDestinations(md *MailData) error { func (r *Repository) generateDbDestinations(rd *repoData) error {
dbDestinations, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbDestinations)) dbDestinations, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbDestinations))
if err != nil { if err != nil {
return err return err
@@ -98,7 +149,7 @@ func (r *Repository) generateDbDestinations(md *MailData) error {
} }
defer dbDestinations.Close() defer dbDestinations.Close()
for _, domain := range md.Domains { for _, domain := range rd.Domains {
if domain.Disabled() { if domain.Disabled() {
continue continue
} }
@@ -123,7 +174,7 @@ func (r *Repository) generateDbDestinations(md *MailData) error {
} }
} }
for _, aliasDomain := range md.AliasDomains { for _, aliasDomain := range rd.AliasDomains {
if aliasDomain.Target() == domain.Name() { if aliasDomain.Target() == domain.Name() {
if _, err := fmt.Fprintf(dbDestinations, "%s@%s %s@%s\n", userName, aliasDomain.Name(), user.Name(), domain.Name()); err != nil { if _, err := fmt.Fprintf(dbDestinations, "%s@%s %s@%s\n", userName, aliasDomain.Name(), user.Name(), domain.Name()); err != nil {
return err return err
@@ -137,7 +188,7 @@ func (r *Repository) generateDbDestinations(md *MailData) error {
return err return err
} }
for _, aliasDomain := range md.AliasDomains { for _, aliasDomain := range rd.AliasDomains {
if aliasDomain.Target() == domain.Name() { if aliasDomain.Target() == domain.Name() {
if _, err := fmt.Fprintf(dbDestinations, "%s@%s %s@%s\n", aliasUser.Name(), aliasDomain.Name(), aliasUser.Name(), domain.Name()); err != nil { if _, err := fmt.Fprintf(dbDestinations, "%s@%s %s@%s\n", aliasUser.Name(), aliasDomain.Name(), aliasUser.Name(), domain.Name()); err != nil {
return err return err
@@ -150,7 +201,7 @@ func (r *Repository) generateDbDestinations(md *MailData) error {
return nil return nil
} }
func (r *Repository) generateDbMaildirs(md *MailData) error { func (r *Repository) generateDbMaildirs(rd *repoData) error {
dbMaildirs, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbMaildirs)) dbMaildirs, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbMaildirs))
if err != nil { if err != nil {
return err return err
@@ -160,7 +211,7 @@ func (r *Repository) generateDbMaildirs(md *MailData) error {
} }
defer dbMaildirs.Close() defer dbMaildirs.Close()
for _, domain := range md.Domains { for _, domain := range rd.Domains {
if domain.Disabled() { if domain.Disabled() {
continue continue
} }
@@ -175,7 +226,7 @@ func (r *Repository) generateDbMaildirs(md *MailData) error {
return nil return nil
} }
func (r *Repository) generateDbLocaltable(md *MailData) error { func (r *Repository) generateDbLocaltable(rd *repoData) error {
dbLocaltable, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbLocaltable)) dbLocaltable, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbLocaltable))
if err != nil { if err != nil {
return err return err
@@ -185,7 +236,7 @@ func (r *Repository) generateDbLocaltable(md *MailData) error {
} }
defer dbLocaltable.Close() defer dbLocaltable.Close()
for _, domain := range md.Domains { for _, domain := range rd.Domains {
if domain.Disabled() { if domain.Disabled() {
continue continue
} }
@@ -203,7 +254,7 @@ func (r *Repository) generateDbLocaltable(md *MailData) error {
return nil return nil
} }
func (r *Repository) generateDbForwards(md *MailData) error { func (r *Repository) generateDbForwards(rd *repoData) error {
dbForwards, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbForwards)) dbForwards, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbForwards))
if err != nil { if err != nil {
return err return err
@@ -213,7 +264,7 @@ func (r *Repository) generateDbForwards(md *MailData) error {
} }
defer dbForwards.Close() defer dbForwards.Close()
for _, domain := range md.Domains { for _, domain := range rd.Domains {
if domain.Disabled() { if domain.Disabled() {
continue continue
} }
@@ -243,7 +294,7 @@ func (r *Repository) generateDbForwards(md *MailData) error {
return nil return nil
} }
func (r *Repository) generateDbPasswords(md *MailData) error { func (r *Repository) generateDbPasswords(rd *repoData) error {
dbPasswords, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbPasswords)) dbPasswords, err := os.Create(filepath.Join(r.DirDatabasePath, FileNameDbPasswords))
if err != nil { if err != nil {
return err return err
@@ -253,7 +304,7 @@ func (r *Repository) generateDbPasswords(md *MailData) error {
} }
defer dbPasswords.Close() defer dbPasswords.Close()
for _, domain := range md.Domains { for _, domain := range rd.Domains {
if domain.Disabled() { if domain.Disabled() {
continue continue
} }

View File

@@ -3,10 +3,10 @@ Configuration
`.mailfull/config` `.mailfull/config`
| key | type | default | required | description | | key | type | default | required | description |
|:----|:-----|:--------|:---------|:------------| |:--------------|:-------|:------------------------------------------|:---------|:----------------------------------------------------------------|
| dir_database | string | `"./etc"` | no | A relative path from repository dir (or a absolute path) | | dir_database | string | `"./etc"` | no | A relative path from repository dir (or a absolute path) |
| dir_maildata | string | `"./domains"` | no | A relative path from repository dir (or a absolute path) | | dir_maildata | string | `"./domains"` | no | A relative path from repository dir (or a absolute path) |
| username | string | The username who executed `mailfull init` | **yes** | It used for setting owner of database files and maildata files. | | username | string | The username who executed `mailfull init` | **yes** | It used for setting owner of database files and maildata files. |
| cmd_postalias | string | `"postalias"` | no | Command name or path | | cmd_postalias | string | `"postalias"` | no | Command name or path |
| cmd_postmap | string | `"postmap"` | no | Command name or path | | cmd_postmap | string | `"postmap"` | no | Command name or path |

View File

@@ -17,13 +17,6 @@ type Domain struct {
CatchAllUser *CatchAllUser CatchAllUser *CatchAllUser
} }
// DomainSlice attaches the methods of sort.Interface to []*Domain.
type DomainSlice []*Domain
func (p DomainSlice) Len() int { return len(p) }
func (p DomainSlice) Less(i, j int) bool { return p[i].Name() < p[j].Name() }
func (p DomainSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// NewDomain creates a new Domain instance. // NewDomain creates a new Domain instance.
func NewDomain(name string) (*Domain, error) { func NewDomain(name string) (*Domain, error) {
d := &Domain{} d := &Domain{}

View File

@@ -1,47 +0,0 @@
package mailfull
// MailData represents a MailData.
type MailData struct {
Domains []*Domain
AliasDomains []*AliasDomain
}
// MailData returns a MailData.
func (r *Repository) MailData() (*MailData, error) {
domains, err := r.Domains()
if err != nil {
return nil, err
}
aliasDomains, err := r.AliasDomains()
if err != nil {
return nil, err
}
for _, domain := range domains {
users, err := r.Users(domain.Name())
if err != nil {
return nil, err
}
domain.Users = users
aliasUsers, err := r.AliasUsers(domain.Name())
if err != nil {
return nil, err
}
domain.AliasUsers = aliasUsers
catchAllUser, err := r.CatchAllUser(domain.Name())
if err != nil {
return nil, err
}
domain.CatchAllUser = catchAllUser
}
mailData := &MailData{
Domains: domains,
AliasDomains: aliasDomains,
}
return mailData, nil
}

View File

@@ -19,13 +19,6 @@ type User struct {
forwards []string forwards []string
} }
// UserSlice attaches the methods of sort.Interface to []*User.
type UserSlice []*User
func (p UserSlice) Len() int { return len(p) }
func (p UserSlice) Less(i, j int) bool { return p[i].Name() < p[j].Name() }
func (p UserSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// NewUser creates a new User instance. // NewUser creates a new User instance.
func NewUser(name, hashedPassword string, forwards []string) (*User, error) { func NewUser(name, hashedPassword string, forwards []string) (*User, error) {
u := &User{} u := &User{}

View File

@@ -1,4 +1,4 @@
package mailfull package mailfull
// Version is a version number. // Version is a version number.
const Version = "v0.0.4" const Version = "v1.0.1"