diff --git a/Gopkg.lock b/Gopkg.lock new file mode 100644 index 0000000..d3be0b9 --- /dev/null +++ b/Gopkg.lock @@ -0,0 +1,48 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/BurntSushi/toml" + packages = ["."] + revision = "99064174e013895bbd9b025c31100bd1d9b590ca" + version = "v0.3.0" + +[[projects]] + branch = "master" + name = "github.com/armon/go-radix" + packages = ["."] + revision = "4239b77079c7b5d1243b7b4736304ce8ddb6f0f2" + +[[projects]] + name = "github.com/bgentry/speakeasy" + packages = ["."] + revision = "a1ccbf2c40dfc8ce514b5c5c6e6d1429ea6880da" + +[[projects]] + branch = "master" + name = "github.com/jsimonetti/pwscheme" + packages = ["ssha"] + revision = "76804708ecad54773871b35dbaa44f517973e395" + +[[projects]] + name = "github.com/mattn/go-isatty" + packages = ["."] + revision = "66b8e73f3f5cda9f96b69efd03dd3d7fc4a5cdb8" + +[[projects]] + branch = "master" + name = "github.com/mitchellh/cli" + packages = ["."] + revision = "fcf521421aa29bde1d93b6920dfce826d7932208" + +[[projects]] + name = "golang.org/x/sys" + packages = ["unix"] + revision = "8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "d88d2668ae10b500606e3ebb1e719897e62e423f5ede8e4b470d12c1d255fe31" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml new file mode 100644 index 0000000..e69de29 diff --git a/Makefile b/Makefile index 2e0bb08..407c5ef 100644 --- a/Makefile +++ b/Makefile @@ -1,29 +1,42 @@ GOVERSION=$(shell go version) -GOOS=$(word 1,$(subst /, ,$(lastword $(GOVERSION)))) -GOARCH=$(word 2,$(subst /, ,$(lastword $(GOVERSION)))) +THIS_GOOS=$(word 1,$(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_RELEASE=release 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 default: build -installdeps: - glide install -v +$(DIR_BUILD)/bin/$(THIS_GOOS)_$(THIS_GOARCH)/dep: + 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 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: - docker run --rm -v $(PWD):/go/src/github.com/directorz/mailfull-go -w /go/src/github.com/directorz/mailfull-go \ - -e GOOS=linux -e GOARCH=amd64 golang:1.7.4 \ - go build -v -ldflags "-X main.gittag=`git rev-parse --short HEAD`" -o "build/mailfull_linux_amd64/mailfull" cmd/mailfull/mailfull.go + @$(MAKE) .build-docker GOOS=linux GOARCH=amd64 build-linux-386: - docker run --rm -v $(PWD):/go/src/github.com/directorz/mailfull-go -w /go/src/github.com/directorz/mailfull-go \ - -e GOOS=linux -e GOARCH=386 golang:1.7.4 \ - go build -v -ldflags "-X main.gittag=`git rev-parse --short HEAD`" -o "build/mailfull_linux_386/mailfull" cmd/mailfull/mailfull.go + @$(MAKE) .build-docker GOOS=linux GOARCH=386 release: release-linux-amd64 release-linux-386 diff --git a/aliasdomain.go b/aliasdomain.go index b1fc2f7..4563f0b 100644 --- a/aliasdomain.go +++ b/aliasdomain.go @@ -15,13 +15,6 @@ type AliasDomain struct { 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. func NewAliasDomain(name, target string) (*AliasDomain, error) { ad := &AliasDomain{} @@ -190,7 +183,7 @@ func (r *Repository) writeAliasDomainsFile(aliasDomains []*AliasDomain) error { } 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 { if _, err := fmt.Fprintf(file, "%s:%s\n", aliasDomain.Name(), aliasDomain.Target()); err != nil { diff --git a/aliasuser.go b/aliasuser.go index 647bcfe..cd9d66c 100644 --- a/aliasuser.go +++ b/aliasuser.go @@ -21,13 +21,6 @@ type AliasUser struct { 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. func NewAliasUser(name string, targets []string) (*AliasUser, error) { au := &AliasUser{} @@ -233,7 +226,7 @@ func (r *Repository) writeAliasUsersFile(domainName string, aliasUsers []*AliasU } 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 { if _, err := fmt.Fprintf(file, "%s:%s\n", aliasUser.Name(), strings.Join(aliasUser.Targets(), ",")); err != nil { diff --git a/cmd/mailfull/command/aliasdomainadd.go b/cmd/mailfull/cmd_aliasdomainadd.go similarity index 61% rename from cmd/mailfull/command/aliasdomainadd.go rename to cmd/mailfull/cmd_aliasdomainadd.go index 2eb90d5..d7b51e1 100644 --- a/cmd/mailfull/command/aliasdomainadd.go +++ b/cmd/mailfull/cmd_aliasdomainadd.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" - mailfull "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// AliasDomainAddCommand represents a AliasDomainAddCommand. -type AliasDomainAddCommand struct { - Meta +// CmdAliasDomainAdd represents a CmdAliasDomainAdd. +type CmdAliasDomainAdd struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *AliasDomainAddCommand) Synopsis() string { +func (c *CmdAliasDomainAdd) Synopsis() string { return "Create a new aliasdomain." } // Help returns long-form help text. -func (c *AliasDomainAddCommand) Help() string { +func (c *CmdAliasDomainAdd) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] domain target @@ -42,7 +43,7 @@ Optional Args: } // 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()) @@ -59,34 +60,26 @@ func (c *AliasDomainAddCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } aliasDomain, err := mailfull.NewAliasDomain(aliasDomainName, targetDomainName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if err := repo.AliasDomainCreate(aliasDomain); err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/aliasdomaindel.go b/cmd/mailfull/cmd_aliasdomaindel.go similarity index 58% rename from cmd/mailfull/command/aliasdomaindel.go rename to cmd/mailfull/cmd_aliasdomaindel.go index 1310f93..370dcfc 100644 --- a/cmd/mailfull/command/aliasdomaindel.go +++ b/cmd/mailfull/cmd_aliasdomaindel.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" - mailfull "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// AliasDomainDelCommand represents a AliasDomainDelCommand. -type AliasDomainDelCommand struct { - Meta +// CmdAliasDomainDel represents a CmdAliasDomainDel. +type CmdAliasDomainDel struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *AliasDomainDelCommand) Synopsis() string { +func (c *CmdAliasDomainDel) Synopsis() string { return "Delete a aliasdomain." } // Help returns long-form help text. -func (c *AliasDomainDelCommand) Help() string { +func (c *CmdAliasDomainDel) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] domain @@ -40,7 +41,7 @@ Optional Args: } // 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()) @@ -56,28 +57,20 @@ func (c *AliasDomainDelCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if err := repo.AliasDomainRemove(aliasDomainName); err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/aliasdomains.go b/cmd/mailfull/cmd_aliasdomains.go similarity index 67% rename from cmd/mailfull/command/aliasdomains.go rename to cmd/mailfull/cmd_aliasdomains.go index 62cbac7..43a07fe 100644 --- a/cmd/mailfull/command/aliasdomains.go +++ b/cmd/mailfull/cmd_aliasdomains.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "sort" - mailfull "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// AliasDomainsCommand represents a AliasDomainsCommand. -type AliasDomainsCommand struct { - Meta +// CmdAliasDomains represents a CmdAliasDomains. +type CmdAliasDomains struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *AliasDomainsCommand) Synopsis() string { +func (c *CmdAliasDomains) Synopsis() string { return "Show aliasdomains." } // Help returns long-form help text. -func (c *AliasDomainsCommand) Help() string { +func (c *CmdAliasDomains) Help() string { txt := fmt.Sprintf(` Usage: %s %s [domain] @@ -37,7 +38,7 @@ Optional Args: } // 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 { fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) return 1 @@ -50,16 +51,16 @@ func (c *AliasDomainsCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } aliasDomains, err := repo.AliasDomains() if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) 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 { if targetDomainName != "" { diff --git a/cmd/mailfull/command/aliasuseradd.go b/cmd/mailfull/cmd_aliasuseradd.go similarity index 64% rename from cmd/mailfull/command/aliasuseradd.go rename to cmd/mailfull/cmd_aliasuseradd.go index 9d6ee93..edef4c6 100644 --- a/cmd/mailfull/command/aliasuseradd.go +++ b/cmd/mailfull/cmd_aliasuseradd.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "strings" - mailfull "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// AliasUserAddCommand represents a AliasUserAddCommand. -type AliasUserAddCommand struct { - Meta +// CmdAliasUserAdd represents a CmdAliasUserAdd. +type CmdAliasUserAdd struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *AliasUserAddCommand) Synopsis() string { +func (c *CmdAliasUserAdd) Synopsis() string { return "Create a new aliasuser." } // Help returns long-form help text. -func (c *AliasUserAddCommand) Help() string { +func (c *CmdAliasUserAdd) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] address target [target...] @@ -43,7 +44,7 @@ Optional Args: } // 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()) @@ -68,34 +69,26 @@ func (c *AliasUserAddCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } aliasUser, err := mailfull.NewAliasUser(aliasUserName, targets) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } 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 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/aliasuserdel.go b/cmd/mailfull/cmd_aliasuserdel.go similarity index 63% rename from cmd/mailfull/command/aliasuserdel.go rename to cmd/mailfull/cmd_aliasuserdel.go index 0eb5d12..56dc398 100644 --- a/cmd/mailfull/command/aliasuserdel.go +++ b/cmd/mailfull/cmd_aliasuserdel.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "strings" - mailfull "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// AliasUserDelCommand represents a AliasUserDelCommand. -type AliasUserDelCommand struct { - Meta +// CmdAliasUserDel represents a CmdAliasUserDel. +type CmdAliasUserDel struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *AliasUserDelCommand) Synopsis() string { +func (c *CmdAliasUserDel) Synopsis() string { return "Delete a aliasuser." } // Help returns long-form help text. -func (c *AliasUserDelCommand) Help() string { +func (c *CmdAliasUserDel) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] address @@ -41,7 +42,7 @@ Optional Args: } // 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()) @@ -64,28 +65,20 @@ func (c *AliasUserDelCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } 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 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/aliasusermod.go b/cmd/mailfull/cmd_aliasusermod.go similarity index 62% rename from cmd/mailfull/command/aliasusermod.go rename to cmd/mailfull/cmd_aliasusermod.go index 459cd67..5081138 100644 --- a/cmd/mailfull/command/aliasusermod.go +++ b/cmd/mailfull/cmd_aliasusermod.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "strings" - mailfull "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// AliasUserModCommand represents a AliasUserModCommand. -type AliasUserModCommand struct { - Meta +// CmdAliasUserMod represents a CmdAliasUserMod. +type CmdAliasUserMod struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *AliasUserModCommand) Synopsis() string { +func (c *CmdAliasUserMod) Synopsis() string { return "Modify a aliasuser." } // Help returns long-form help text. -func (c *AliasUserModCommand) Help() string { +func (c *CmdAliasUserMod) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] address target [target...] @@ -43,7 +44,7 @@ Optional Args: } // 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()) @@ -68,43 +69,35 @@ func (c *AliasUserModCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } aliasUser, err := repo.AliasUser(domainName, aliasUserName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if aliasUser == nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrAliasUserNotExist) + c.Meta.Errorf("%v\n", mailfull.ErrAliasUserNotExist) return 1 } if err := aliasUser.SetTargets(targets); err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } 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 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/aliasusers.go b/cmd/mailfull/cmd_aliasusers.go similarity index 65% rename from cmd/mailfull/command/aliasusers.go rename to cmd/mailfull/cmd_aliasusers.go index 036b23a..c153994 100644 --- a/cmd/mailfull/command/aliasusers.go +++ b/cmd/mailfull/cmd_aliasusers.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "sort" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// AliasUsersCommand represents a AliasUsersCommand. -type AliasUsersCommand struct { - Meta +// CmdAliasUsers represents a CmdAliasUsers. +type CmdAliasUsers struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *AliasUsersCommand) Synopsis() string { +func (c *CmdAliasUsers) Synopsis() string { return "Show aliasusers." } // Help returns long-form help text. -func (c *AliasUsersCommand) Help() string { +func (c *CmdAliasUsers) Help() string { txt := fmt.Sprintf(` Usage: %s %s domain @@ -37,7 +38,7 @@ Required Args: } // 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 { fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) return 1 @@ -47,16 +48,16 @@ func (c *AliasUsersCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } aliasUsers, err := repo.AliasUsers(targetDomainName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) 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 { fmt.Fprintf(c.UI.Writer, "%s\n", aliasUser.Name()) diff --git a/cmd/mailfull/command/catchall.go b/cmd/mailfull/cmd_catchall.go similarity index 69% rename from cmd/mailfull/command/catchall.go rename to cmd/mailfull/cmd_catchall.go index 3c1db48..43615a3 100644 --- a/cmd/mailfull/command/catchall.go +++ b/cmd/mailfull/cmd_catchall.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// CatchAllCommand represents a CatchAllCommand. -type CatchAllCommand struct { - Meta +// CmdCatchAll represents a CmdCatchAll. +type CmdCatchAll struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *CatchAllCommand) Synopsis() string { +func (c *CmdCatchAll) Synopsis() string { return "Show a catchall user." } // Help returns long-form help text. -func (c *CatchAllCommand) Help() string { +func (c *CmdCatchAll) Help() string { txt := fmt.Sprintf(` Usage: %s %s domain @@ -36,7 +37,7 @@ Required Args: } // 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 { fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) return 1 @@ -46,13 +47,13 @@ func (c *CatchAllCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } catchAllUser, err := repo.CatchAllUser(domainName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/catchallset.go b/cmd/mailfull/cmd_catchallset.go similarity index 63% rename from cmd/mailfull/command/catchallset.go rename to cmd/mailfull/cmd_catchallset.go index 24acd67..632e0f1 100644 --- a/cmd/mailfull/command/catchallset.go +++ b/cmd/mailfull/cmd_catchallset.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// CatchAllSetCommand represents a CatchAllSetCommand. -type CatchAllSetCommand struct { - Meta +// CmdCatchAllSet represents a CmdCatchAllSet. +type CmdCatchAllSet struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *CatchAllSetCommand) Synopsis() string { +func (c *CmdCatchAllSet) Synopsis() string { return "Set a catchall user." } // Help returns long-form help text. -func (c *CatchAllSetCommand) Help() string { +func (c *CmdCatchAllSet) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] domain user @@ -42,7 +43,7 @@ Optional Args: } // 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()) @@ -59,34 +60,26 @@ func (c *CatchAllSetCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } catchAllUser, err := mailfull.NewCatchAllUser(userName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } 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 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/catchallunset.go b/cmd/mailfull/cmd_catchallunset.go similarity index 60% rename from cmd/mailfull/command/catchallunset.go rename to cmd/mailfull/cmd_catchallunset.go index a6f3fe9..81859f8 100644 --- a/cmd/mailfull/command/catchallunset.go +++ b/cmd/mailfull/cmd_catchallunset.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// CatchAllUnsetCommand represents a CatchAllUnsetCommand. -type CatchAllUnsetCommand struct { - Meta +// CmdCatchAllUnset represents a CmdCatchAllUnset. +type CmdCatchAllUnset struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *CatchAllUnsetCommand) Synopsis() string { +func (c *CmdCatchAllUnset) Synopsis() string { return "Unset a catchall user." } // Help returns long-form help text. -func (c *CatchAllUnsetCommand) Help() string { +func (c *CmdCatchAllUnset) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] domain @@ -40,7 +41,7 @@ Optional Args: } // 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()) @@ -56,28 +57,20 @@ func (c *CatchAllUnsetCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if err := repo.CatchAllUserUnset(domainName); err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/cmd_commit.go b/cmd/mailfull/cmd_commit.go new file mode 100644 index 0000000..ade21f1 --- /dev/null +++ b/cmd/mailfull/cmd_commit.go @@ -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 +} diff --git a/cmd/mailfull/command/domainadd.go b/cmd/mailfull/cmd_domainadd.go similarity index 62% rename from cmd/mailfull/command/domainadd.go rename to cmd/mailfull/cmd_domainadd.go index 1983d30..72a47b1 100644 --- a/cmd/mailfull/command/domainadd.go +++ b/cmd/mailfull/cmd_domainadd.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// DomainAddCommand represents a DomainAddCommand. -type DomainAddCommand struct { - Meta +// CmdDomainAdd represents a CmdDomainAdd. +type CmdDomainAdd struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *DomainAddCommand) Synopsis() string { +func (c *CmdDomainAdd) Synopsis() string { return "Create a new domain and postmaster." } // Help returns long-form help text. -func (c *DomainAddCommand) Help() string { +func (c *CmdDomainAdd) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] domain @@ -40,7 +41,7 @@ Optional Args: } // 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()) @@ -56,45 +57,37 @@ func (c *DomainAddCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } domain, err := mailfull.NewDomain(domainName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if err := repo.DomainCreate(domain); err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } user, err := mailfull.NewUser("postmaster", mailfull.NeverMatchHashedPassword, nil) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } 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 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/domaindel.go b/cmd/mailfull/cmd_domaindel.go similarity index 61% rename from cmd/mailfull/command/domaindel.go rename to cmd/mailfull/cmd_domaindel.go index a8b9be9..5845ff9 100644 --- a/cmd/mailfull/command/domaindel.go +++ b/cmd/mailfull/cmd_domaindel.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// DomainDelCommand represents a DomainDelCommand. -type DomainDelCommand struct { - Meta +// CmdDomainDel represents a CmdDomainDel. +type CmdDomainDel struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *DomainDelCommand) Synopsis() string { +func (c *CmdDomainDel) Synopsis() string { return "Delete and backup a domain." } // Help returns long-form help text. -func (c *DomainDelCommand) Help() string { +func (c *CmdDomainDel) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] domain @@ -40,7 +41,7 @@ Optional Args: } // 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()) @@ -56,28 +57,20 @@ func (c *DomainDelCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if err := repo.DomainRemove(domainName); err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/domaindisable.go b/cmd/mailfull/cmd_domaindisable.go similarity index 59% rename from cmd/mailfull/command/domaindisable.go rename to cmd/mailfull/cmd_domaindisable.go index c254c77..ff44139 100644 --- a/cmd/mailfull/command/domaindisable.go +++ b/cmd/mailfull/cmd_domaindisable.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// DomainDisableCommand represents a DomainDisableCommand. -type DomainDisableCommand struct { - Meta +// CmdDomainDisable represents a CmdDomainDisable. +type CmdDomainDisable struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *DomainDisableCommand) Synopsis() string { +func (c *CmdDomainDisable) Synopsis() string { return "Disable a domain temporarily." } // Help returns long-form help text. -func (c *DomainDisableCommand) Help() string { +func (c *CmdDomainDisable) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] domain @@ -40,7 +41,7 @@ Optional Args: } // 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()) @@ -56,40 +57,32 @@ func (c *DomainDisableCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } domain, err := repo.Domain(domainName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if domain == nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrDomainNotExist) + c.Meta.Errorf("%v\n", mailfull.ErrDomainNotExist) return 1 } domain.SetDisabled(true) if err := repo.DomainUpdate(domain); err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/domainenable.go b/cmd/mailfull/cmd_domainenable.go similarity index 59% rename from cmd/mailfull/command/domainenable.go rename to cmd/mailfull/cmd_domainenable.go index 6fff76d..42f1542 100644 --- a/cmd/mailfull/command/domainenable.go +++ b/cmd/mailfull/cmd_domainenable.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// DomainEnableCommand represents a DomainEnableCommand. -type DomainEnableCommand struct { - Meta +// CmdDomainEnable represents a CmdDomainEnable. +type CmdDomainEnable struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *DomainEnableCommand) Synopsis() string { +func (c *CmdDomainEnable) Synopsis() string { return "Enable a domain." } // Help returns long-form help text. -func (c *DomainEnableCommand) Help() string { +func (c *CmdDomainEnable) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] domain @@ -40,7 +41,7 @@ Optional Args: } // 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()) @@ -56,40 +57,32 @@ func (c *DomainEnableCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } domain, err := repo.Domain(domainName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if domain == nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrDomainNotExist) + c.Meta.Errorf("%v\n", mailfull.ErrDomainNotExist) return 1 } domain.SetDisabled(false) if err := repo.DomainUpdate(domain); err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/domains.go b/cmd/mailfull/cmd_domains.go similarity index 64% rename from cmd/mailfull/command/domains.go rename to cmd/mailfull/cmd_domains.go index 83b65d5..9c3ba38 100644 --- a/cmd/mailfull/command/domains.go +++ b/cmd/mailfull/cmd_domains.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "sort" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// DomainsCommand represents a DomainsCommand. -type DomainsCommand struct { - Meta +// CmdDomains represents a CmdDomains. +type CmdDomains struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *DomainsCommand) Synopsis() string { +func (c *CmdDomains) Synopsis() string { return "Show domains." } // Help returns long-form help text. -func (c *DomainsCommand) Help() string { +func (c *CmdDomains) Help() string { txt := fmt.Sprintf(` Usage: %s %s @@ -34,19 +35,19 @@ Description: } // 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(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } domains, err := repo.Domains() if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) 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 { disableStr := "" diff --git a/cmd/mailfull/command/genconfig.go b/cmd/mailfull/cmd_genconfig.go similarity index 71% rename from cmd/mailfull/command/genconfig.go rename to cmd/mailfull/cmd_genconfig.go index e2a4b27..5cf4dd8 100644 --- a/cmd/mailfull/command/genconfig.go +++ b/cmd/mailfull/cmd_genconfig.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// GenConfigCommand represents a GenConfigCommand. -type GenConfigCommand struct { - Meta +// CmdGenConfig represents a CmdGenConfig. +type CmdGenConfig struct { + cmd.Meta } // 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." } // Help returns long-form help text. -func (c *GenConfigCommand) Help() string { +func (c *CmdGenConfig) Help() string { txt := fmt.Sprintf(` Usage: %s %s name @@ -37,7 +38,7 @@ Required Args: } // 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 { fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) return 1 @@ -47,7 +48,7 @@ func (c *GenConfigCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } @@ -59,7 +60,7 @@ func (c *GenConfigCommand) Run(args []string) int { fmt.Fprintf(c.UI.Writer, "%s", repo.GenerateConfigDovecot()) default: - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] Specify \"postfix\" or \"dovecot\".\n") + c.Meta.Errorf("Specify \"postfix\" or \"dovecot\".\n") return 1 } diff --git a/cmd/mailfull/command/init.go b/cmd/mailfull/cmd_init.go similarity index 63% rename from cmd/mailfull/command/init.go rename to cmd/mailfull/cmd_init.go index b915c7c..922e30d 100644 --- a/cmd/mailfull/command/init.go +++ b/cmd/mailfull/cmd_init.go @@ -1,23 +1,24 @@ -package command +package main import ( "fmt" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// InitCommand represents a InitCommand. -type InitCommand struct { - Meta +// CmdInit represents a CmdInit. +type CmdInit struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *InitCommand) Synopsis() string { +func (c *CmdInit) Synopsis() string { return "Initializes current directory as a Mailfull repository." } // Help returns long-form help text. -func (c *InitCommand) Help() string { +func (c *CmdInit) Help() string { txt := fmt.Sprintf(` Usage: %s %s @@ -32,9 +33,9 @@ Description: } // 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 { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/useradd.go b/cmd/mailfull/cmd_useradd.go similarity index 66% rename from cmd/mailfull/command/useradd.go rename to cmd/mailfull/cmd_useradd.go index 943f493..5259db4 100644 --- a/cmd/mailfull/command/useradd.go +++ b/cmd/mailfull/cmd_useradd.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "strings" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// UserAddCommand represents a UserAddCommand. -type UserAddCommand struct { - Meta +// CmdUserAdd represents a CmdUserAdd. +type CmdUserAdd struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *UserAddCommand) Synopsis() string { +func (c *CmdUserAdd) Synopsis() string { return "Create a new user." } // Help returns long-form help text. -func (c *UserAddCommand) Help() string { +func (c *CmdUserAdd) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] address @@ -41,7 +42,7 @@ Optional Args: } // 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()) @@ -65,34 +66,26 @@ func (c *UserAddCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } user, err := mailfull.NewUser(userName, mailfull.NeverMatchHashedPassword, nil) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } 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 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/usercheckpw.go b/cmd/mailfull/cmd_usercheckpw.go similarity index 77% rename from cmd/mailfull/command/usercheckpw.go rename to cmd/mailfull/cmd_usercheckpw.go index 4ef780a..65542aa 100644 --- a/cmd/mailfull/command/usercheckpw.go +++ b/cmd/mailfull/cmd_usercheckpw.go @@ -1,25 +1,26 @@ -package command +package main import ( "fmt" "strings" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" "github.com/jsimonetti/pwscheme/ssha" ) -// UserCheckPwCommand represents a UserCheckPwCommand. -type UserCheckPwCommand struct { - Meta +// CmdUserCheckPw represents a CmdUserCheckPw. +type CmdUserCheckPw struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *UserCheckPwCommand) Synopsis() string { +func (c *CmdUserCheckPw) Synopsis() string { return "Check user's password." } // Help returns long-form help text. -func (c *UserCheckPwCommand) Help() string { +func (c *CmdUserCheckPw) Help() string { txt := fmt.Sprintf(` Usage: %s %s address [password] @@ -43,7 +44,7 @@ Optional Args: } // 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 { fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) return 1 @@ -66,24 +67,24 @@ func (c *UserCheckPwCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } user, err := repo.User(domainName, userName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if user == nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrUserNotExist) + c.Meta.Errorf("%v\n", mailfull.ErrUserNotExist) return 1 } if len(args) != 2 { input, err := c.UI.AskSecret(fmt.Sprintf("Enter password for %s:", address)) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/userdel.go b/cmd/mailfull/cmd_userdel.go similarity index 64% rename from cmd/mailfull/command/userdel.go rename to cmd/mailfull/cmd_userdel.go index 858b8ff..448f7fd 100644 --- a/cmd/mailfull/command/userdel.go +++ b/cmd/mailfull/cmd_userdel.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "strings" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// UserDelCommand represents a UserDelCommand. -type UserDelCommand struct { - Meta +// CmdUserDel represents a CmdUserDel. +type CmdUserDel struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *UserDelCommand) Synopsis() string { +func (c *CmdUserDel) Synopsis() string { return "Delete and backup a user." } // Help returns long-form help text. -func (c *UserDelCommand) Help() string { +func (c *CmdUserDel) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] address @@ -41,7 +42,7 @@ Optional Args: } // 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()) @@ -65,33 +66,25 @@ func (c *UserDelCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if userName == "postmaster" { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] Cannot delete postmaster.\n") + c.Meta.Errorf("Cannot delete postmaster.\n") return 1 } 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 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/userpasswd.go b/cmd/mailfull/cmd_userpasswd.go similarity index 69% rename from cmd/mailfull/command/userpasswd.go rename to cmd/mailfull/cmd_userpasswd.go index bbd724c..07ea488 100644 --- a/cmd/mailfull/command/userpasswd.go +++ b/cmd/mailfull/cmd_userpasswd.go @@ -1,25 +1,26 @@ -package command +package main import ( "fmt" "strings" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" "github.com/jsimonetti/pwscheme/ssha" ) -// UserPasswdCommand represents a UserPasswdCommand. -type UserPasswdCommand struct { - Meta +// CmdUserPasswd represents a CmdUserPasswd. +type CmdUserPasswd struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *UserPasswdCommand) Synopsis() string { +func (c *CmdUserPasswd) Synopsis() string { return "Update user's password." } // Help returns long-form help text. -func (c *UserPasswdCommand) Help() string { +func (c *CmdUserPasswd) Help() string { txt := fmt.Sprintf(` Usage: %s %s [-n] address [password] @@ -45,7 +46,7 @@ Optional Args: } // 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()) @@ -74,33 +75,33 @@ func (c *UserPasswdCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } user, err := repo.User(domainName, userName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if user == nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", mailfull.ErrUserNotExist) + c.Meta.Errorf("%v\n", mailfull.ErrUserNotExist) return 1 } if len(args) != 2 { input1, err := c.UI.AskSecret(fmt.Sprintf("Enter new password for %s:", address)) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } input2, err := c.UI.AskSecret("Retype new password:") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } if input1 != input2 { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] inputs do not match.\n") + c.Meta.Errorf("inputs do not match.\n") return 1 } rawPassword = input1 @@ -110,7 +111,7 @@ func (c *UserPasswdCommand) Run(args []string) int { if rawPassword != "" { str, err := ssha.Generate(rawPassword, 4) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } hashedPassword = str @@ -119,23 +120,15 @@ func (c *UserPasswdCommand) Run(args []string) int { user.SetHashedPassword(hashedPassword) 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 } if noCommit { return 0 } - - 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) + if err = repo.GenerateDatabases(); err != nil { + c.Meta.Errorf("%v\n", err) return 1 } diff --git a/cmd/mailfull/command/users.go b/cmd/mailfull/cmd_users.go similarity index 66% rename from cmd/mailfull/command/users.go rename to cmd/mailfull/cmd_users.go index 2f5038d..66d5741 100644 --- a/cmd/mailfull/command/users.go +++ b/cmd/mailfull/cmd_users.go @@ -1,24 +1,25 @@ -package command +package main import ( "fmt" "sort" "github.com/directorz/mailfull-go" + "github.com/directorz/mailfull-go/cmd" ) -// UsersCommand represents a UsersCommand. -type UsersCommand struct { - Meta +// CmdUsers represents a CmdUsers. +type CmdUsers struct { + cmd.Meta } // Synopsis returns a one-line synopsis. -func (c *UsersCommand) Synopsis() string { +func (c *CmdUsers) Synopsis() string { return "Show users." } // Help returns long-form help text. -func (c *UsersCommand) Help() string { +func (c *CmdUsers) Help() string { txt := fmt.Sprintf(` Usage: %s %s domain @@ -37,7 +38,7 @@ Required Args: } // 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 { fmt.Fprintf(c.UI.ErrorWriter, "%v\n", c.Help()) return 1 @@ -47,16 +48,16 @@ func (c *UsersCommand) Run(args []string) int { repo, err := mailfull.OpenRepository(".") if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) return 1 } users, err := repo.Users(targetDomainName) if err != nil { - fmt.Fprintf(c.UI.ErrorWriter, "[ERR] %v\n", err) + c.Meta.Errorf("%v\n", err) 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 { fmt.Fprintf(c.UI.Writer, "%s\n", user.Name()) diff --git a/cmd/mailfull/command/commit.go b/cmd/mailfull/command/commit.go deleted file mode 100644 index 790b071..0000000 --- a/cmd/mailfull/command/commit.go +++ /dev/null @@ -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 -} diff --git a/cmd/mailfull/command/main.go b/cmd/mailfull/command/main.go deleted file mode 100644 index 66be466..0000000 --- a/cmd/mailfull/command/main.go +++ /dev/null @@ -1,30 +0,0 @@ -package command - -import ( - "bytes" - "flag" - - "github.com/mitchellh/cli" -) - -// Meta is for `*Command` struct. -type Meta struct { - UI *cli.BasicUi - CmdName string - SubCmdName string - Version string -} - -// 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 -} diff --git a/cmd/mailfull/mailfull.go b/cmd/mailfull/main.go similarity index 65% rename from cmd/mailfull/mailfull.go rename to cmd/mailfull/main.go index 905a77a..ca74d78 100644 --- a/cmd/mailfull/mailfull.go +++ b/cmd/mailfull/main.go @@ -4,12 +4,14 @@ Command mailfull is a CLI application using the mailfull package. package main import ( + "bytes" + "flag" "fmt" "os" "path/filepath" "github.com/directorz/mailfull-go" - "github.com/directorz/mailfull-go/cmd/mailfull/command" + "github.com/directorz/mailfull-go/cmd" "github.com/mitchellh/cli" ) @@ -31,7 +33,7 @@ func main() { Args: os.Args[1:], } - meta := command.Meta{ + meta := cmd.Meta{ UI: &cli.BasicUi{ Reader: os.Stdin, Writer: os.Stdout, @@ -44,95 +46,95 @@ func main() { c.Commands = map[string]cli.CommandFactory{ "init": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.InitCommand{Meta: meta}, nil + return &CmdInit{Meta: meta}, nil }, "genconfig": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.GenConfigCommand{Meta: meta}, nil + return &CmdGenConfig{Meta: meta}, nil }, "domains": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.DomainsCommand{Meta: meta}, nil + return &CmdDomains{Meta: meta}, nil }, "domainadd": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.DomainAddCommand{Meta: meta}, nil + return &CmdDomainAdd{Meta: meta}, nil }, "domaindel": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.DomainDelCommand{Meta: meta}, nil + return &CmdDomainDel{Meta: meta}, nil }, "domaindisable": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.DomainDisableCommand{Meta: meta}, nil + return &CmdDomainDisable{Meta: meta}, nil }, "domainenable": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.DomainEnableCommand{Meta: meta}, nil + return &CmdDomainEnable{Meta: meta}, nil }, "aliasdomains": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.AliasDomainsCommand{Meta: meta}, nil + return &CmdAliasDomains{Meta: meta}, nil }, "aliasdomainadd": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.AliasDomainAddCommand{Meta: meta}, nil + return &CmdAliasDomainAdd{Meta: meta}, nil }, "aliasdomaindel": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.AliasDomainDelCommand{Meta: meta}, nil + return &CmdAliasDomainDel{Meta: meta}, nil }, "users": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.UsersCommand{Meta: meta}, nil + return &CmdUsers{Meta: meta}, nil }, "useradd": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.UserAddCommand{Meta: meta}, nil + return &CmdUserAdd{Meta: meta}, nil }, "userdel": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.UserDelCommand{Meta: meta}, nil + return &CmdUserDel{Meta: meta}, nil }, "userpasswd": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.UserPasswdCommand{Meta: meta}, nil + return &CmdUserPasswd{Meta: meta}, nil }, "usercheckpw": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.UserCheckPwCommand{Meta: meta}, nil + return &CmdUserCheckPw{Meta: meta}, nil }, "aliasusers": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.AliasUsersCommand{Meta: meta}, nil + return &CmdAliasUsers{Meta: meta}, nil }, "aliasuseradd": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.AliasUserAddCommand{Meta: meta}, nil + return &CmdAliasUserAdd{Meta: meta}, nil }, "aliasusermod": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.AliasUserModCommand{Meta: meta}, nil + return &CmdAliasUserMod{Meta: meta}, nil }, "aliasuserdel": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.AliasUserDelCommand{Meta: meta}, nil + return &CmdAliasUserDel{Meta: meta}, nil }, "catchall": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.CatchAllCommand{Meta: meta}, nil + return &CmdCatchAll{Meta: meta}, nil }, "catchallset": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.CatchAllSetCommand{Meta: meta}, nil + return &CmdCatchAllSet{Meta: meta}, nil }, "catchallunset": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.CatchAllUnsetCommand{Meta: meta}, nil + return &CmdCatchAllUnset{Meta: meta}, nil }, "commit": func() (cli.Command, error) { meta.SubCmdName = c.Subcommand() - return &command.CommitCommand{Meta: meta}, nil + return &CmdCommit{Meta: meta}, nil }, } @@ -143,3 +145,17 @@ func main() { 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 +} diff --git a/cmd/meta.go b/cmd/meta.go new file mode 100644 index 0000000..02e5334 --- /dev/null +++ b/cmd/meta.go @@ -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...) +} diff --git a/database.go b/database.go index e12cf5c..3dd0d30 100644 --- a/database.go +++ b/database.go @@ -9,33 +9,84 @@ import ( "strings" ) -// GenerateDatabases generates databases from the MailData directory. -func (r *Repository) GenerateDatabases(md *MailData) error { - sort.Sort(DomainSlice(md.Domains)) - sort.Sort(AliasDomainSlice(md.AliasDomains)) +// repoData represents a repoData. +type repoData struct { + Domains []*Domain + AliasDomains []*AliasDomain +} - for _, domain := range md.Domains { - sort.Sort(UserSlice(domain.Users)) - sort.Sort(AliasUserSlice(domain.AliasUsers)) +// repoData returns a repoData. +func (r *Repository) repoData() (*repoData, 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 + } + + 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 - if err := r.generateDbDomains(md); err != nil { + if err := r.generateDbDomains(rd); err != nil { return err } - if err := r.generateDbDestinations(md); err != nil { + if err := r.generateDbDestinations(rd); err != nil { return err } - if err := r.generateDbMaildirs(md); err != nil { + if err := r.generateDbMaildirs(rd); err != nil { return err } - if err := r.generateDbLocaltable(md); err != nil { + if err := r.generateDbLocaltable(rd); err != nil { return err } - if err := r.generateDbForwards(md); err != nil { + if err := r.generateDbForwards(rd); err != nil { return err } - if err := r.generateDbPasswords(md); err != nil { + if err := r.generateDbPasswords(rd); err != nil { return err } @@ -59,7 +110,7 @@ func (r *Repository) GenerateDatabases(md *MailData) error { 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)) if err != nil { return err @@ -69,7 +120,7 @@ func (r *Repository) generateDbDomains(md *MailData) error { } defer dbDomains.Close() - for _, domain := range md.Domains { + for _, domain := range rd.Domains { if domain.Disabled() { 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 { return err } @@ -88,7 +139,7 @@ func (r *Repository) generateDbDomains(md *MailData) error { 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)) if err != nil { return err @@ -98,7 +149,7 @@ func (r *Repository) generateDbDestinations(md *MailData) error { } defer dbDestinations.Close() - for _, domain := range md.Domains { + for _, domain := range rd.Domains { if domain.Disabled() { 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 _, err := fmt.Fprintf(dbDestinations, "%s@%s %s@%s\n", userName, aliasDomain.Name(), user.Name(), domain.Name()); err != nil { return err @@ -137,7 +188,7 @@ func (r *Repository) generateDbDestinations(md *MailData) error { return err } - for _, aliasDomain := range md.AliasDomains { + for _, aliasDomain := range rd.AliasDomains { 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 { return err @@ -150,7 +201,7 @@ func (r *Repository) generateDbDestinations(md *MailData) error { 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)) if err != nil { return err @@ -160,7 +211,7 @@ func (r *Repository) generateDbMaildirs(md *MailData) error { } defer dbMaildirs.Close() - for _, domain := range md.Domains { + for _, domain := range rd.Domains { if domain.Disabled() { continue } @@ -175,7 +226,7 @@ func (r *Repository) generateDbMaildirs(md *MailData) error { 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)) if err != nil { return err @@ -185,7 +236,7 @@ func (r *Repository) generateDbLocaltable(md *MailData) error { } defer dbLocaltable.Close() - for _, domain := range md.Domains { + for _, domain := range rd.Domains { if domain.Disabled() { continue } @@ -203,7 +254,7 @@ func (r *Repository) generateDbLocaltable(md *MailData) error { 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)) if err != nil { return err @@ -213,7 +264,7 @@ func (r *Repository) generateDbForwards(md *MailData) error { } defer dbForwards.Close() - for _, domain := range md.Domains { + for _, domain := range rd.Domains { if domain.Disabled() { continue } @@ -243,7 +294,7 @@ func (r *Repository) generateDbForwards(md *MailData) error { 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)) if err != nil { return err @@ -253,7 +304,7 @@ func (r *Repository) generateDbPasswords(md *MailData) error { } defer dbPasswords.Close() - for _, domain := range md.Domains { + for _, domain := range rd.Domains { if domain.Disabled() { continue } diff --git a/doc/configuration.md b/doc/configuration.md index aa73a0d..649b1d7 100644 --- a/doc/configuration.md +++ b/doc/configuration.md @@ -3,10 +3,10 @@ Configuration `.mailfull/config` -| key | type | default | required | description | -|:----|:-----|:--------|:---------|:------------| -| 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) | -| 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_postmap | string | `"postmap"` | no | Command name or path | +| key | type | default | required | description | +|:--------------|:-------|:------------------------------------------|:---------|:----------------------------------------------------------------| +| 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) | +| 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_postmap | string | `"postmap"` | no | Command name or path | diff --git a/domain.go b/domain.go index c0089d7..f5e5044 100644 --- a/domain.go +++ b/domain.go @@ -17,13 +17,6 @@ type Domain struct { 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. func NewDomain(name string) (*Domain, error) { d := &Domain{} diff --git a/glide.lock b/glide.lock deleted file mode 100644 index 76c8ba5..0000000 --- a/glide.lock +++ /dev/null @@ -1,22 +0,0 @@ -hash: 451657f03f297af9163863497cf6c2f60abfe12d88a282f5aab6deb865d91119 -updated: 2016-09-29T12:05:32.00075722+09:00 -imports: -- name: github.com/armon/go-radix - version: 4239b77079c7b5d1243b7b4736304ce8ddb6f0f2 -- name: github.com/bgentry/speakeasy - version: a1ccbf2c40dfc8ce514b5c5c6e6d1429ea6880da -- name: github.com/BurntSushi/toml - version: 99064174e013895bbd9b025c31100bd1d9b590ca -- name: github.com/jsimonetti/pwscheme - version: 76804708ecad54773871b35dbaa44f517973e395 - subpackages: - - ssha -- name: github.com/mattn/go-isatty - version: 66b8e73f3f5cda9f96b69efd03dd3d7fc4a5cdb8 -- name: github.com/mitchellh/cli - version: fcf521421aa29bde1d93b6920dfce826d7932208 -- name: golang.org/x/sys - version: 8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9 - subpackages: - - unix -testImports: [] diff --git a/glide.yaml b/glide.yaml deleted file mode 100644 index 00937dd..0000000 --- a/glide.yaml +++ /dev/null @@ -1,7 +0,0 @@ -package: github.com/directorz/mailfull-go -import: -- package: github.com/BurntSushi/toml -- package: github.com/jsimonetti/pwscheme - subpackages: - - ssha -- package: github.com/mitchellh/cli diff --git a/maildata.go b/maildata.go deleted file mode 100644 index 7e32b38..0000000 --- a/maildata.go +++ /dev/null @@ -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 -} diff --git a/user.go b/user.go index cdf3bec..c502cb8 100644 --- a/user.go +++ b/user.go @@ -19,13 +19,6 @@ type User struct { 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. func NewUser(name, hashedPassword string, forwards []string) (*User, error) { u := &User{} diff --git a/version.go b/version.go index e92ef57..383d0a1 100644 --- a/version.go +++ b/version.go @@ -1,4 +1,4 @@ package mailfull // Version is a version number. -const Version = "v0.0.7" +const Version = "v1.0.0"