Rework error messages

This commit reworks error messages for all commands and makes sure they
pass liniting.
This commit is contained in:
Tom Wiesing 2023-03-09 11:13:19 +01:00
parent d22784e6f5
commit c31c46ee44
No known key found for this signature in database
40 changed files with 249 additions and 110 deletions

View file

@ -34,11 +34,13 @@ func (blindUpdate) Description() wisski_distillery.Description {
} }
var errBlindUpdateFailed = exit.Error{ var errBlindUpdateFailed = exit.Error{
Message: "failed to run blind update script for instance %q: exited with code %s", Message: "failed to run blind update",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
func (bu blindUpdate) Run(context wisski_distillery.Context) error { func (bu blindUpdate) Run(context wisski_distillery.Context) (err error) {
defer errBlindUpdateFailed.DeferWrap(&err)
// find all the instances! // find all the instances!
wissKIs, err := context.Environment.Instances().Load(context.Context, bu.Positionals.Slug...) wissKIs, err := context.Environment.Instances().Load(context.Context, bu.Positionals.Slug...)
if err != nil { if err != nil {

View file

@ -34,7 +34,7 @@ func (cBootstrap) Description() wisski_distillery.Description {
} }
var errBootstrapDifferent = exit.Error{ var errBootstrapDifferent = exit.Error{
Message: "refusing to bootstrap: base directory is already set to %s.", Message: "refusing to bootstrap: base directory is already set to %s",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
@ -54,17 +54,17 @@ var errBoostrapFailedToCopyExe = exit.Error{
} }
var errBootstrapWriteConfig = exit.Error{ var errBootstrapWriteConfig = exit.Error{
Message: "failed to write configuration file: %s", Message: "failed to write configuration file",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
var errBootstrapOpenConfig = exit.Error{ var errBootstrapOpenConfig = exit.Error{
Message: "failed to open configuration file: %s", Message: "failed to open configuration file",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
var errBootstrapCreateFile = exit.Error{ var errBootstrapCreateFile = exit.Error{
Message: "failed to touch configuration file: %s", Message: "failed to touch configuration file",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
@ -82,10 +82,10 @@ func (bs cBootstrap) Run(context wisski_distillery.Context) error {
{ {
logging.LogMessage(context.Stderr, context.Context, "Creating root deployment directory") logging.LogMessage(context.Stderr, context.Context, "Creating root deployment directory")
if err := fsx.MkdirAll(root, fsx.DefaultDirPerm); err != nil { if err := fsx.MkdirAll(root, fsx.DefaultDirPerm); err != nil {
return errBootstrapFailedToCreateDirectory.WithMessageF(root) return errBootstrapFailedToCreateDirectory.WithMessageF(root).Wrap(err)
} }
if err := cli.WriteBaseDirectory(root); err != nil { if err := cli.WriteBaseDirectory(root); err != nil {
return errBootstrapFailedToSaveDirectory.WithMessageF(root) return errBootstrapFailedToSaveDirectory.WithMessageF(root).Wrap(err)
} }
context.Println(root) context.Println(root)
} }
@ -101,7 +101,7 @@ func (bs cBootstrap) Run(context wisski_distillery.Context) error {
// and use thge defaults // and use thge defaults
if err := tpl.SetDefaults(); err != nil { if err := tpl.SetDefaults(); err != nil {
return errBootstrapWriteConfig.WithMessageF(err) return errBootstrapWriteConfig.Wrap(err)
} }
{ {
@ -145,7 +145,7 @@ func (bs cBootstrap) Run(context wisski_distillery.Context) error {
return nil return nil
}, context.Stderr, context.Context, "Creating custom config files"); err != nil { }, context.Stderr, context.Context, "Creating custom config files"); err != nil {
return errBootstrapCreateFile.WithMessageF(err) return errBootstrapCreateFile.Wrap(err)
} }
// Validate configuration file! // Validate configuration file!
@ -171,7 +171,7 @@ func (bs cBootstrap) Run(context wisski_distillery.Context) error {
return err return err
} }
}, context.Stderr, context.Context, "Installing primary configuration file"); err != nil { }, context.Stderr, context.Context, "Installing primary configuration file"); err != nil {
return errBootstrapWriteConfig.WithMessageF(err) return errBootstrapWriteConfig.Wrap(err)
} }
} }
@ -181,13 +181,13 @@ func (bs cBootstrap) Run(context wisski_distillery.Context) error {
logging.LogMessage(context.Stderr, context.Context, "Configuration is now complete") logging.LogMessage(context.Stderr, context.Context, "Configuration is now complete")
f, err := os.Open(cfgPath) f, err := os.Open(cfgPath)
if err != nil { if err != nil {
return errBootstrapOpenConfig.WithMessageF(err) return errBootstrapOpenConfig.Wrap(err)
} }
defer f.Close() defer f.Close()
var cfg config.Config var cfg config.Config
if err := cfg.Unmarshal(f); err != nil { if err := cfg.Unmarshal(f); err != nil {
return errBootstrapOpenConfig.WithMessageF(err) return errBootstrapOpenConfig.Wrap(err)
} }
context.Println(cfg) context.Println(cfg)

View file

@ -3,6 +3,7 @@ package cmd
import ( import (
wisski_distillery "github.com/FAU-CDI/wisski-distillery" wisski_distillery "github.com/FAU-CDI/wisski-distillery"
"github.com/FAU-CDI/wisski-distillery/internal/cli" "github.com/FAU-CDI/wisski-distillery/internal/cli"
"github.com/tkw1536/goprogram/exit"
) )
// Config is the configuration command // Config is the configuration command
@ -20,6 +21,14 @@ func (c cfg) Description() wisski_distillery.Description {
} }
} }
func (cfg) Run(context wisski_distillery.Context) error { var errMarshalConfig = exit.Error{
return context.Environment.Config.Marshal(context.Stdout) Message: "unable to marshal config",
ExitCode: exit.ExitGeneric,
}
func (cfg) Run(context wisski_distillery.Context) error {
if err := context.Environment.Config.Marshal(context.Stdout); err != nil {
return errMarshalConfig.Wrap(err)
}
return nil
} }

View file

@ -7,6 +7,7 @@ import (
wisski_distillery "github.com/FAU-CDI/wisski-distillery" wisski_distillery "github.com/FAU-CDI/wisski-distillery"
"github.com/FAU-CDI/wisski-distillery/internal/cli" "github.com/FAU-CDI/wisski-distillery/internal/cli"
"github.com/FAU-CDI/wisski-distillery/internal/wisski" "github.com/FAU-CDI/wisski-distillery/internal/wisski"
"github.com/tkw1536/goprogram/exit"
"github.com/tkw1536/goprogram/status" "github.com/tkw1536/goprogram/status"
) )
@ -31,7 +32,14 @@ func (cron) Description() wisski_distillery.Description {
} }
} }
func (cr cron) Run(context wisski_distillery.Context) error { var errCronFailed = exit.Error{
Message: "failed to run cron",
ExitCode: exit.ExitGeneric,
}
func (cr cron) Run(context wisski_distillery.Context) (err error) {
defer errCronFailed.DeferWrap(&err)
// find all the instances! // find all the instances!
wissKIs, err := context.Environment.Instances().Load(context.Context, cr.Positionals.Slug...) wissKIs, err := context.Environment.Instances().Load(context.Context, cr.Positionals.Slug...)
if err != nil { if err != nil {

View file

@ -63,7 +63,14 @@ func (dg disGrant) AfterParse() error {
return nil return nil
} }
func (dg disGrant) Run(context wisski_distillery.Context) error { var errFailedGrant = exit.Error{
Message: "unable to manage grants",
ExitCode: exit.ExitGeneric,
}
func (dg disGrant) Run(context wisski_distillery.Context) (err error) {
defer errFailedGrant.DeferWrap(&err)
switch { switch {
case dg.AddUser: case dg.AddUser:
return dg.runAddUser(context) return dg.runAddUser(context)

View file

@ -21,7 +21,7 @@ type disSSH struct {
Positionals struct { Positionals struct {
User string `positional-arg-name:"USER" required:"1-1" description:"distillery username"` User string `positional-arg-name:"USER" required:"1-1" description:"distillery username"`
Path string `positional-arg-name:"PATH" required:"1-1" description:"Path of key to add"` Path string `positional-arg-name:"PATH" required:"1-1" description:"path of key to add"`
} `positional-args:"true"` } `positional-args:"true"`
} }
@ -53,6 +53,11 @@ func (ds disSSH) AfterParse() error {
return nil return nil
} }
var errSSHManageFailed = exit.Error{
Message: "unable to manage ssh keys",
ExitCode: exit.ExitCommandArguments,
}
func (ds disSSH) Run(context wisski_distillery.Context) error { func (ds disSSH) Run(context wisski_distillery.Context) error {
switch { switch {
case ds.Add: case ds.Add:
@ -71,12 +76,12 @@ var errNoKey = exit.Error{
func (ds disSSH) parseOpts(context wisski_distillery.Context) (user *auth.AuthUser, key gossh.PublicKey, err error) { func (ds disSSH) parseOpts(context wisski_distillery.Context) (user *auth.AuthUser, key gossh.PublicKey, err error) {
user, err = context.Environment.Auth().User(context.Context, ds.Positionals.User) user, err = context.Environment.Auth().User(context.Context, ds.Positionals.User)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, errSSHManageFailed.Wrap(err)
} }
content, err := os.ReadFile(ds.Positionals.Path) content, err := os.ReadFile(ds.Positionals.Path)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, errSSHManageFailed.Wrap(err)
} }
pk, _, _, _, err := gossh.ParseAuthorizedKey(content) pk, _, _, _, err := gossh.ParseAuthorizedKey(content)
@ -93,7 +98,10 @@ func (ds disSSH) runAdd(context wisski_distillery.Context) error {
return err return err
} }
return context.Environment.Keys().Add(context.Context, user.User.User, ds.Comment, key) if err := context.Environment.Keys().Add(context.Context, user.User.User, ds.Comment, key); err != nil {
return errSSHManageFailed.Wrap(err)
}
return nil
} }
func (ds disSSH) runRemove(context wisski_distillery.Context) error { func (ds disSSH) runRemove(context wisski_distillery.Context) error {
@ -102,5 +110,8 @@ func (ds disSSH) runRemove(context wisski_distillery.Context) error {
return err return err
} }
return context.Environment.Keys().Remove(context.Context, user.User.User, key) if err := context.Environment.Keys().Remove(context.Context, user.User.User, key); err != nil {
return errSSHManageFailed.Wrap(err)
}
return nil
} }

View file

@ -28,7 +28,7 @@ type disUser struct {
DisableTOTP bool `short:"v" long:"disable-totp" description:"disable totp for a user"` DisableTOTP bool `short:"v" long:"disable-totp" description:"disable totp for a user"`
Positionals struct { Positionals struct {
User string `positional-arg-name:"USER" description:"username to manage. May be omitted for some actions"` User string `positional-arg-name:"USER" description:"username to manage. may be omitted for some actions"`
} `positional-args:"true"` } `positional-args:"true"`
} }
@ -78,7 +78,14 @@ func (du disUser) AfterParse() error {
return nil return nil
} }
func (du disUser) Run(context wisski_distillery.Context) error { var errDisUserActionFailed = exit.Error{
Message: "action failed",
ExitCode: exit.ExitGeneric,
}
func (du disUser) Run(context wisski_distillery.Context) (err error) {
defer errDisUserActionFailed.DeferWrap(&err)
switch { switch {
case du.InfoUser: case du.InfoUser:
return du.runInfo(context) return du.runInfo(context)

View file

@ -39,10 +39,15 @@ var errSettingSet = exit.Error{
Message: "unable to set setting", Message: "unable to set setting",
} }
var errSettingWissKI = exit.Error{
Message: "unable to get WissKI",
ExitCode: exit.ExitGeneric,
}
func (ds setting) Run(context wisski_distillery.Context) error { func (ds setting) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(context.Context, ds.Positionals.Slug) instance, err := context.Environment.Instances().WissKI(context.Context, ds.Positionals.Slug)
if err != nil { if err != nil {
return err return errSettingWissKI.Wrap(err)
} }
if ds.Positionals.Value == "" { if ds.Positionals.Value == "" {

View file

@ -74,7 +74,14 @@ var errPasswordsNotIdentical = exit.Error{
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
func (du drupalUser) Run(context wisski_distillery.Context) error { var errDrupalUserActionFailed = exit.Error{
Message: "action failed",
ExitCode: exit.ExitGeneric,
}
func (du drupalUser) Run(context wisski_distillery.Context) (err error) {
defer errDrupalUserActionFailed.DeferWrap(&err)
instance, err := context.Environment.Instances().WissKI(context.Context, du.Positionals.Slug) instance, err := context.Environment.Instances().WissKI(context.Context, du.Positionals.Slug)
if err != nil { if err != nil {
return err return err
@ -102,11 +109,6 @@ func (du drupalUser) login(context wisski_distillery.Context, instance *wisski.W
return nil return nil
} }
var errPasswordFound = exit.Error{
Message: "user had a dictionary password",
ExitCode: 5,
}
func (du drupalUser) checkCommonPassword(context wisski_distillery.Context, instance *wisski.WissKI) error { func (du drupalUser) checkCommonPassword(context wisski_distillery.Context, instance *wisski.WissKI) error {
users := instance.Users() users := instance.Users()

View file

@ -5,6 +5,7 @@ import (
wisski_distillery "github.com/FAU-CDI/wisski-distillery" wisski_distillery "github.com/FAU-CDI/wisski-distillery"
"github.com/FAU-CDI/wisski-distillery/internal/cli" "github.com/FAU-CDI/wisski-distillery/internal/cli"
"github.com/tkw1536/goprogram/exit"
"github.com/tkw1536/pkglib/collection" "github.com/tkw1536/pkglib/collection"
) )
@ -28,7 +29,14 @@ func (info) Description() wisski_distillery.Description {
} }
} }
func (i info) Run(context wisski_distillery.Context) error { var errInfoFailed = exit.Error{
Message: "failed to get info",
ExitCode: exit.ExitGeneric,
}
func (i info) Run(context wisski_distillery.Context) (err error) {
defer errInfoFailed.DeferWrap(&err)
instance, err := context.Environment.Instances().WissKI(context.Context, i.Positionals.Slug) instance, err := context.Environment.Instances().WissKI(context.Context, i.Positionals.Slug)
if err != nil { if err != nil {
return err return err

View file

@ -45,10 +45,15 @@ var errNotUnlock = exit.Error{
ExitCode: exit.ExitCommandArguments, ExitCode: exit.ExitCommandArguments,
} }
var errInstanceLockWissKI = exit.Error{
Message: "unable to get WissKI",
ExitCode: exit.ExitGeneric,
}
func (l instanceLock) Run(context wisski_distillery.Context) error { func (l instanceLock) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(context.Context, l.Positionals.Slug) instance, err := context.Environment.Instances().WissKI(context.Context, l.Positionals.Slug)
if err != nil { if err != nil {
return err return errInstanceLockWissKI.Wrap(err)
} }
if l.Unlock { if l.Unlock {

View file

@ -3,6 +3,7 @@ package cmd
import ( import (
wisski_distillery "github.com/FAU-CDI/wisski-distillery" wisski_distillery "github.com/FAU-CDI/wisski-distillery"
"github.com/FAU-CDI/wisski-distillery/internal/cli" "github.com/FAU-CDI/wisski-distillery/internal/cli"
"github.com/tkw1536/goprogram/exit"
) )
// InstancePause is the 'instance_pause' command // InstancePause is the 'instance_pause' command
@ -33,10 +34,15 @@ func (i instancepause) AfterParse() error {
return nil return nil
} }
var errInstancePauseWissKI = exit.Error{
Message: "unable to get WissKI",
ExitCode: exit.ExitGeneric,
}
func (i instancepause) Run(context wisski_distillery.Context) error { func (i instancepause) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(context.Context, i.Positionals.Slug) instance, err := context.Environment.Instances().WissKI(context.Context, i.Positionals.Slug)
if err != nil { if err != nil {
return err return errInstancePauseWissKI.Wrap(err)
} }
if i.Stop { if i.Stop {

View file

@ -3,6 +3,7 @@ package cmd
import ( import (
wisski_distillery "github.com/FAU-CDI/wisski-distillery" wisski_distillery "github.com/FAU-CDI/wisski-distillery"
"github.com/FAU-CDI/wisski-distillery/internal/cli" "github.com/FAU-CDI/wisski-distillery/internal/cli"
"github.com/tkw1536/goprogram/exit"
) )
// Ls is the 'ls' command // Ls is the 'ls' command
@ -24,10 +25,15 @@ func (ls) Description() wisski_distillery.Description {
} }
} }
var errLsWissKI = exit.Error{
Message: "unable to get WissKIs",
ExitCode: exit.ExitGeneric,
}
func (l ls) Run(context wisski_distillery.Context) error { func (l ls) Run(context wisski_distillery.Context) error {
instances, err := context.Environment.Instances().Load(context.Context, l.Positionals.Slug...) instances, err := context.Environment.Instances().Load(context.Context, l.Positionals.Slug...)
if err != nil { if err != nil {
return err return errLsWissKI.Wrap(err)
} }
for _, instance := range instances { for _, instance := range instances {

View file

@ -27,12 +27,17 @@ func (makeMysqlAccount) Description() wisski_distillery.Description {
var errUnableToReadUsername = exit.Error{ var errUnableToReadUsername = exit.Error{
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
Message: "unable to read username: %s", Message: "unable to read username",
} }
var errUnableToReadPassword = exit.Error{ var errUnableToReadPassword = exit.Error{
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
Message: "unable to read password: %s", Message: "unable to read password",
}
var errUnableToMakeAccount = exit.Error{
ExitCode: exit.ExitGeneric,
Message: "unable to create account",
} }
func (mma makeMysqlAccount) Run(context wisski_distillery.Context) error { func (mma makeMysqlAccount) Run(context wisski_distillery.Context) error {
@ -41,17 +46,17 @@ func (mma makeMysqlAccount) Run(context wisski_distillery.Context) error {
context.Printf("Username>") context.Printf("Username>")
username, err := context.ReadLine() username, err := context.ReadLine()
if err != nil { if err != nil {
return errUnableToReadUsername.WithMessageF(err) return errUnableToReadUsername.Wrap(err)
} }
context.Printf("Password>") context.Printf("Password>")
password, err := context.ReadPassword() password, err := context.ReadPassword()
if err != nil { if err != nil {
return errUnableToReadPassword.WithMessageF(err) return errUnableToReadPassword.Wrap(err)
} }
if err := dis.SQL().CreateSuperuser(context.Context, username, password, false); err != nil { if err := dis.SQL().CreateSuperuser(context.Context, username, password, false); err != nil {
return err return errUnableToMakeAccount.Wrap(err)
} }
return nil return nil

View file

@ -27,7 +27,7 @@ func (pathbuilders) Description() wisski_distillery.Description {
} }
var errPathbuilders = exit.Error{ var errPathbuilders = exit.Error{
Message: "unable to export pathbuilder: %s", Message: "unable to export pathbuilder",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
@ -36,19 +36,24 @@ var errNoPathbuilder = exit.Error{
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
var errPathbuilderWissKI = exit.Error{
Message: "unable to find WissKI",
ExitCode: exit.ExitGeneric,
}
func (pb pathbuilders) Run(context wisski_distillery.Context) error { func (pb pathbuilders) Run(context wisski_distillery.Context) error {
// get the wisski // get the wisski
instance, err := context.Environment.Instances().WissKI(context.Context, pb.Positionals.Slug) instance, err := context.Environment.Instances().WissKI(context.Context, pb.Positionals.Slug)
if err != nil { if err != nil {
return err return errPathbuilderWissKI.Wrap(err)
} }
// get all of the pathbuilders // get all of the pathbuilders
if pb.Positionals.Name == "" { if pb.Positionals.Name == "" {
names, err := instance.Pathbuilder().All(context.Context, nil) names, err := instance.Pathbuilder().All(context.Context, nil)
if err != nil { if err != nil {
return errPathbuilders.WithMessageF(err) return errPathbuilders.Wrap(err)
} }
for _, name := range names { for _, name := range names {
context.Println(name) context.Println(name)

View file

@ -30,10 +30,15 @@ var errPrefixesGeneric = exit.Error{
Message: "unable to load prefixes", Message: "unable to load prefixes",
} }
var errPrefixesWissKI = exit.Error{
Message: "unable to find WissKI",
ExitCode: exit.ExitGeneric,
}
func (p prefixes) Run(context wisski_distillery.Context) error { func (p prefixes) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(context.Context, p.Positionals.Slug) instance, err := context.Environment.Instances().WissKI(context.Context, p.Positionals.Slug)
if err != nil { if err != nil {
return err return errPrefixesWissKI.Wrap(err)
} }
prefixes, err := instance.Prefixes().All(context.Context, nil) prefixes, err := instance.Prefixes().All(context.Context, nil)

View file

@ -28,7 +28,7 @@ func (pv) Description() wisski_distillery.Description {
} }
var errProvisionGeneric = exit.Error{ var errProvisionGeneric = exit.Error{
Message: "unable to provision instance %s: %s", Message: "unable to provision instance %s",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
@ -39,7 +39,7 @@ func (p pv) Run(context wisski_distillery.Context) error {
Slug: p.Positionals.Slug, Slug: p.Positionals.Slug,
}) })
if err != nil { if err != nil {
return errProvisionGeneric.WithMessageF(p.Positionals.Slug, err) return errProvisionGeneric.WithMessageF(p.Positionals.Slug).Wrap(err)
} }
// and we're done! // and we're done!

View file

@ -31,6 +31,11 @@ var errPurgeNoConfirmation = exit.Error{
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
var errPurgeFailed = exit.Error{
Message: "failed to run purge",
ExitCode: exit.ExitGeneric,
}
func (p purge) Run(context wisski_distillery.Context) error { func (p purge) Run(context wisski_distillery.Context) error {
dis := context.Environment dis := context.Environment
slug := p.Positionals.Slug slug := p.Positionals.Slug
@ -45,5 +50,9 @@ func (p purge) Run(context wisski_distillery.Context) error {
} }
} }
return dis.Purger().Purge(context.Context, context.Stdout, slug) // do the purge!
if err := dis.Purger().Purge(context.Context, context.Stdout, slug); err != nil {
return errPurgeFailed.Wrap(err)
}
return nil
} }

View file

@ -32,11 +32,13 @@ func (rebuild) Description() wisski_distillery.Description {
} }
var errRebuildFailed = exit.Error{ var errRebuildFailed = exit.Error{
Message: "failed to run rebuild script for instance %q: exited with code %s", Message: "failed to run rebuild",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
func (rb rebuild) Run(context wisski_distillery.Context) error { func (rb rebuild) Run(context wisski_distillery.Context) (err error) {
defer errRebuildFailed.DeferWrap(&err)
dis := context.Environment dis := context.Environment
// find the instances // find the instances

View file

@ -36,11 +36,13 @@ var errReserveAlreadyExists = exit.Error{
} }
var errReserveGeneric = exit.Error{ var errReserveGeneric = exit.Error{
Message: "unable to provision instance %s: %s", Message: "unable to provision instance",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
func (r reserve) Run(context wisski_distillery.Context) error { func (r reserve) Run(context wisski_distillery.Context) (err error) {
defer errReserveGeneric.DeferWrap(&err)
dis := context.Environment dis := context.Environment
slug := r.Positionals.Slug slug := r.Positionals.Slug

View file

@ -8,6 +8,7 @@ import (
"github.com/FAU-CDI/wisski-distillery/internal/cli" "github.com/FAU-CDI/wisski-distillery/internal/cli"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"github.com/tkw1536/goprogram/exit" "github.com/tkw1536/goprogram/exit"
"github.com/tkw1536/pkglib/errorx"
) )
// Server is the 'server' command // Server is the 'server' command
@ -34,12 +35,24 @@ var errServerListen = exit.Error{
Message: "unable to listen", Message: "unable to listen",
} }
var errServerTrigger = exit.Error{
Message: "failed to trigger",
ExitCode: exit.ExitGeneric,
}
var errServerGeneric = exit.Error{
ExitCode: exit.ExitGeneric,
Message: "unable to instantiate server",
}
func (s server) Run(context wisski_distillery.Context) error { func (s server) Run(context wisski_distillery.Context) error {
dis := context.Environment dis := context.Environment
// if the caller requested a trigger, just trigger the cron tasks // if the caller requested a trigger, just trigger the cron tasks
if s.Trigger { if s.Trigger {
return dis.Control().Trigger(context.Context) if err := dis.Control().Trigger(context.Context); err != nil {
return errServerTrigger.Wrap(err)
}
} }
{ {
@ -57,7 +70,7 @@ func (s server) Run(context wisski_distillery.Context) error {
// and start the server // and start the server
public, internal, err := dis.Control().Server(context.Context, context.Stderr) public, internal, err := dis.Control().Server(context.Context, context.Stderr)
if err != nil { if err != nil {
return err return errServerGeneric.Wrap(err)
} }
// start the public listener // start the public listener
@ -92,17 +105,11 @@ func (s server) Run(context wisski_distillery.Context) error {
go func() { go func() {
<-context.Context.Done() <-context.Context.Done()
zerolog.Ctx(context.Context).Info().Msg("shutting down server") zerolog.Ctx(context.Context).Info().Msg("shutting down server")
publicS.Shutdown(context.Context) publicS.Shutdown(context.Context)
internalS.Shutdown(context.Context) internalS.Shutdown(context.Context)
}() }()
if err2 := <-internalC; err2 != nil { return errServerListen.Wrap(errorx.First(<-internalC, <-publicC, err))
err = err2
}
if err1 := <-publicC; err1 != nil {
err = err1
}
return errServerListen.Wrap(err)
} }

View file

@ -32,15 +32,15 @@ func (shell) Description() wisski_distillery.Description {
} }
} }
var errShell = exit.Error{ var errShellWissKI = exit.Error{
Message: "unable to start shell: %s", Message: "unable to find WissKI",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
func (sh shell) Run(context wisski_distillery.Context) error { func (sh shell) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(context.Context, sh.Positionals.Slug) instance, err := context.Environment.Instances().WissKI(context.Context, sh.Positionals.Slug)
if err != nil { if err != nil {
return err return errShellWissKI.Wrap(err)
} }
code := instance.Barrel().Shell(context.Context, context.IOStream, sh.Positionals.Args...)() code := instance.Barrel().Shell(context.Context, context.IOStream, sh.Positionals.Args...)()

View file

@ -35,13 +35,18 @@ var errSnapshotFailed = exit.Error{
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
var errSnapshotWissKI = exit.Error{
Message: "unable to find WissKI",
ExitCode: exit.ExitGeneric,
}
func (sn snapshot) Run(context wisski_distillery.Context) error { func (sn snapshot) Run(context wisski_distillery.Context) error {
dis := context.Environment dis := context.Environment
// find the instance! // find the instance!
instance, err := dis.Instances().WissKI(context.Context, sn.Positionals.Slug) instance, err := dis.Instances().WissKI(context.Context, sn.Positionals.Slug)
if err != nil { if err != nil {
return err return errSnapshotWissKI.Wrap(err)
} }
// do a snapshot of it! // do a snapshot of it!

View file

@ -26,6 +26,11 @@ func (s ssh) Description() wisski_distillery.Description {
} }
} }
var errSSHServer = exit.Error{
ExitCode: exit.ExitGeneric,
Message: "unable to listen server",
}
var errSSHListen = exit.Error{ var errSSHListen = exit.Error{
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
Message: "unable to listen", Message: "unable to listen",
@ -35,7 +40,7 @@ func (s ssh) Run(context wisski_distillery.Context) error {
dis := context.Environment dis := context.Environment
server, err := dis.SSH().Server(context.Context, s.PrivateKeyPath, context.Stderr) server, err := dis.SSH().Server(context.Context, s.PrivateKeyPath, context.Stderr)
if err != nil { if err != nil {
return err return errSSHServer.Wrap(err)
} }
context.Printf("Listening on %s\n", s.Bind) context.Printf("Listening on %s\n", s.Bind)
@ -43,7 +48,7 @@ func (s ssh) Run(context wisski_distillery.Context) error {
// make a new listener // make a new listener
listener, err := net.Listen("tcp", s.Bind) listener, err := net.Listen("tcp", s.Bind)
if err != nil { if err != nil {
return errServerListen.Wrap(err) return errSSHListen.Wrap(err)
} }
go func() { go func() {

View file

@ -5,6 +5,7 @@ import (
wisski_distillery "github.com/FAU-CDI/wisski-distillery" wisski_distillery "github.com/FAU-CDI/wisski-distillery"
"github.com/FAU-CDI/wisski-distillery/internal/cli" "github.com/FAU-CDI/wisski-distillery/internal/cli"
"github.com/tkw1536/goprogram/exit"
) )
// Info is then 'info' command // Info is then 'info' command
@ -24,10 +25,15 @@ func (cStatus) Description() wisski_distillery.Description {
} }
} }
var errStatusGeneric = exit.Error{
ExitCode: exit.ExitGeneric,
Message: "unable to get status",
}
func (s cStatus) Run(context wisski_distillery.Context) error { func (s cStatus) Run(context wisski_distillery.Context) error {
status, _, err := context.Environment.Info().Status(context.Context, true) status, _, err := context.Environment.Info().Status(context.Context, true)
if err != nil { if err != nil {
return err return errStatusGeneric.Wrap(err)
} }
if s.JSON { if s.JSON {

View file

@ -33,7 +33,7 @@ func (systempause) Description() wisski_distillery.Description {
} }
var errStopStartExcluded = exit.Error{ var errStopStartExcluded = exit.Error{
Message: "exactly one of `--stop` and `--start` must be provied", Message: "exactly one of `--stop` and `--start` must be provided",
ExitCode: exit.ExitCommandArguments, ExitCode: exit.ExitCommandArguments,
} }
@ -44,7 +44,14 @@ func (s systempause) AfterParse() error {
return nil return nil
} }
func (sp systempause) Run(context wisski_distillery.Context) error { var errPauseGeneric = exit.Error{
ExitCode: exit.ExitGeneric,
Message: "unable to pause or resume system",
}
func (sp systempause) Run(context wisski_distillery.Context) (err error) {
defer errPauseGeneric.DeferWrap(&err)
if sp.Start { if sp.Start {
return sp.start(context, context.Environment) return sp.start(context, context.Environment)
} else { } else {

View file

@ -53,26 +53,33 @@ func (s systemupdate) AfterParse() error {
} }
var errBoostrapFailedToCreateDirectory = exit.Error{ var errBoostrapFailedToCreateDirectory = exit.Error{
Message: "failed to create directory %s: %s", Message: "failed to create directory %s",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
var errBootstrapComponent = exit.Error{ var errBootstrapComponent = exit.Error{
Message: "unable to bootstrap %s: %s", Message: "unable to bootstrap %s",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
var errDockerUnreachable = exit.Error{ var errDockerUnreachable = exit.Error{
Message: "unable to reach docker api: %s", Message: "unable to reach docker api",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
var errNetworkCreateFailed = exit.Error{ var errNetworkCreateFailed = exit.Error{
Message: "unable to create docker network: %s", Message: "unable to create docker network",
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
func (si systemupdate) Run(context wisski_distillery.Context) error { var errSystemUpdateGeneric = exit.Error{
Message: "generic system update error",
ExitCode: exit.ExitGeneric,
}
func (si systemupdate) Run(context wisski_distillery.Context) (err error) {
defer errSystemUpdateGeneric.DeferWrap(&err)
dis := context.Environment dis := context.Environment
// create all the other directories // create all the other directories
@ -86,7 +93,7 @@ func (si systemupdate) Run(context wisski_distillery.Context) error {
} { } {
context.Println(d) context.Println(d)
if err := fsx.MkdirAll(d, fsx.DefaultDirPerm); err != nil { if err := fsx.MkdirAll(d, fsx.DefaultDirPerm); err != nil {
return errBoostrapFailedToCreateDirectory.WithMessageF(d, err) return errBoostrapFailedToCreateDirectory.WithMessageF(d).Wrap(err)
} }
} }
@ -116,7 +123,7 @@ func (si systemupdate) Run(context wisski_distillery.Context) error {
logging.LogMessage(context.Stderr, context.Context, "Checking that the 'docker' api is reachable") logging.LogMessage(context.Stderr, context.Context, "Checking that the 'docker' api is reachable")
ping, err := dis.Docker().Ping(context.Context) ping, err := dis.Docker().Ping(context.Context)
if err != nil { if err != nil {
return errDockerUnreachable.WithMessageF(err) return errDockerUnreachable.Wrap(err)
} }
context.Printf("API Version: %s (experimental: %t)\nBuilder Version: %s\n", ping.APIVersion, ping.Experimental, ping.BuilderVersion) context.Printf("API Version: %s (experimental: %t)\nBuilder Version: %s\n", ping.APIVersion, ping.Experimental, ping.BuilderVersion)
} }
@ -134,7 +141,7 @@ func (si systemupdate) Run(context wisski_distillery.Context) error {
name := dis.Config.Docker.Network name := dis.Config.Docker.Network
id, existed, err := dis.Docker().CreateNetwork(context.Context, name) id, existed, err := dis.Docker().CreateNetwork(context.Context, name)
if err != nil { if err != nil {
return errNetworkCreateFailed.WithMessageF(err) return errNetworkCreateFailed.Wrap(err)
} }
if existed { if existed {
context.Printf("Network %s (id %s) already existed\n", name, id) context.Printf("Network %s (id %s) already existed\n", name, id)
@ -198,7 +205,7 @@ func (si systemupdate) Run(context wisski_distillery.Context) error {
} }
return item.Update(context.Context, context.Stderr) return item.Update(context.Context, context.Stderr)
}, context.Stderr, context.Context, "Updating Component: %s", name); err != nil { }, context.Stderr, context.Context, "Updating Component: %s", name); err != nil {
return errBootstrapComponent.WithMessageF(name, err) return errBootstrapComponent.WithMessageF(name).Wrap(err)
} }
} }
return nil return nil

View file

@ -35,19 +35,21 @@ var errPrefixUpdateFailed = exit.Error{
ExitCode: exit.ExitGeneric, ExitCode: exit.ExitGeneric,
} }
func (upc updateprefixconfig) Run(context wisski_distillery.Context) error { func (upc updateprefixconfig) Run(context wisski_distillery.Context) (err error) {
defer errPrefixUpdateFailed.DeferWrap(&err)
dis := context.Environment dis := context.Environment
wissKIs, err := dis.Instances().All(context.Context) wissKIs, err := dis.Instances().All(context.Context)
if err != nil { if err != nil {
return errPrefixUpdateFailed.Wrap(err) return err
} }
return status.WriterGroup(context.Stderr, upc.Parallel, func(instance *wisski.WissKI, writer io.Writer) error { return status.WriterGroup(context.Stderr, upc.Parallel, func(instance *wisski.WissKI, writer io.Writer) error {
logging.Progress(writer, context.Context, "reading prefixes") logging.Progress(writer, context.Context, "reading prefixes")
err := instance.Prefixes().Update(context.Context) err := instance.Prefixes().Update(context.Context)
if err != nil { if err != nil {
return errPrefixUpdateFailed.Wrap(err) return err
} }
return nil return nil
}, wissKIs, status.SmartMessage(func(item *wisski.WissKI) string { }, wissKIs, status.SmartMessage(func(item *wisski.WissKI) string {

4
go.mod
View file

@ -15,8 +15,8 @@ require (
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/pquerna/otp v1.4.0 github.com/pquerna/otp v1.4.0
github.com/rs/zerolog v1.29.0 github.com/rs/zerolog v1.29.0
github.com/tkw1536/goprogram v0.3.0 github.com/tkw1536/goprogram v0.3.2
github.com/tkw1536/pkglib v0.0.0-20230308113336-6db7d9cd2d5a github.com/tkw1536/pkglib v0.0.0-20230309100913-ec9fed77413a
github.com/yuin/goldmark v1.5.4 github.com/yuin/goldmark v1.5.4
github.com/yuin/goldmark-meta v1.1.0 github.com/yuin/goldmark-meta v1.1.0
golang.org/x/crypto v0.3.0 golang.org/x/crypto v0.3.0

8
go.sum
View file

@ -114,10 +114,10 @@ github.com/tdewolff/minify v2.3.6+incompatible/go.mod h1:9Ov578KJUmAWpS6NeZwRZyT
github.com/tdewolff/parse v2.3.4+incompatible h1:x05/cnGwIMf4ceLuDMBOdQ1qGniMoxpP46ghf0Qzh38= github.com/tdewolff/parse v2.3.4+incompatible h1:x05/cnGwIMf4ceLuDMBOdQ1qGniMoxpP46ghf0Qzh38=
github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ= github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ=
github.com/tdewolff/test v1.0.7 h1:8Vs0142DmPFW/bQeHRP3MV19m1gvndjUb1sn8yy74LM= github.com/tdewolff/test v1.0.7 h1:8Vs0142DmPFW/bQeHRP3MV19m1gvndjUb1sn8yy74LM=
github.com/tkw1536/goprogram v0.3.0 h1:bMnr+PMZHRaaw3atIHz2I0/vCdwl2Bx8KaNutTD7psg= github.com/tkw1536/goprogram v0.3.2 h1:qEGPVD/x9nmGrCZLqCAJ67coz4UECbtnNXXHVMR+NOs=
github.com/tkw1536/goprogram v0.3.0/go.mod h1:lIWTpzLCbji7b9mSU+iPrQYTJOa0DgOE5is8UyW9/n0= github.com/tkw1536/goprogram v0.3.2/go.mod h1:/R+2nAG7l1nP3ty4axPwycksDg4eU4uBrZp0dsGq4Dw=
github.com/tkw1536/pkglib v0.0.0-20230308113336-6db7d9cd2d5a h1:IS5BHeyfagcrOuvPpubc65v/KmZbGhVk8oJ6hze/0nM= github.com/tkw1536/pkglib v0.0.0-20230309100913-ec9fed77413a h1:j6Z6uDiEyY8a0M+W3QJ0rv7KXoPqBjJ4yRS51RF3d44=
github.com/tkw1536/pkglib v0.0.0-20230308113336-6db7d9cd2d5a/go.mod h1:R+8tKMAkSXC1+XGzxNUKx2DnPJqObycYeo4PKjWYkMg= github.com/tkw1536/pkglib v0.0.0-20230309100913-ec9fed77413a/go.mod h1:R+8tKMAkSXC1+XGzxNUKx2DnPJqObycYeo4PKjWYkMg=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=

View file

@ -28,7 +28,7 @@ func MetaConfigPath() (string, error) {
return filepath.Join(usr.HomeDir, metaConfigFile), nil return filepath.Join(usr.HomeDir, metaConfigFile), nil
} }
var errReadBaseDirectoryEmpty = errors.New("ReadBaseDirectory: Directory is empty") var errReadBaseDirectoryEmpty = errors.New("`ReadBaseDirectory': directory is empty")
// ReadBaseDirectory reads the base deployment directory from the environment. // ReadBaseDirectory reads the base deployment directory from the environment.
// Use [ParamsFromEnv] to initialize parameters completely. // Use [ParamsFromEnv] to initialize parameters completely.

View file

@ -66,7 +66,7 @@ func AllPermissions(clauses ...Permission) Permission {
} }
} }
var errPermissionPanic = errors.New("permission: panic()") var errPermissionPanic = errors.New("permission: `panic()'")
// Permit checks if the given user has this permission. // Permit checks if the given user has this permission.
func (perm Permission) Permit(user *AuthUser, r *http.Request) (ok Grant, err error) { func (perm Permission) Permit(user *AuthUser, r *http.Request) (ok Grant, err error) {

View file

@ -128,12 +128,7 @@ var loginTemplate = templating.ParseForm(
templating.Assets(assets.AssetsUser), templating.Assets(assets.AssetsUser),
) )
var loginResponse = httpx.Response{ var errLoginFailed = errors.New("login failed")
ContentType: "text/plain",
Body: []byte("user is signed in"),
}
var errLoginFailed = errors.New("Login failed")
// authLogin implements a view to login a user // authLogin implements a view to login a user
func (auth *Auth) authLogin(ctx context.Context) http.Handler { func (auth *Auth) authLogin(ctx context.Context) http.Handler {

View file

@ -9,7 +9,7 @@ import (
"github.com/tkw1536/goprogram/stream" "github.com/tkw1536/goprogram/stream"
) )
var errSQLBackup = errors.New("SQLBackup: Mysqldump returned non-zero exit code") var errSQLBackup = errors.New("`SQLBackup': mysqldump returned non-zero exit code")
func (*SQL) BackupName() string { func (*SQL) BackupName() string {
return "sql.sql" return "sql.sql"

View file

@ -9,8 +9,8 @@ import (
"github.com/tkw1536/pkglib/sqlx" "github.com/tkw1536/pkglib/sqlx"
) )
var errProvisionInvalidDatabaseParams = errors.New("Provision: Invalid parameters") var errProvisionInvalidDatabaseParams = errors.New("`Provision': invalid parameters")
var errProvisionInvalidGrant = errors.New("Provision: Grant failed") var errProvisionInvalidGrant = errors.New("`Provision': grant failed")
// Provision provisions sql-specific resource for the given instance // Provision provisions sql-specific resource for the given instance
func (sql *SQL) Provision(ctx context.Context, instance models.Instance, domain string) error { func (sql *SQL) Provision(ctx context.Context, instance models.Instance, domain string) error {
@ -58,7 +58,7 @@ func (sql *SQL) CreateDatabase(ctx context.Context, name, user, password string)
return nil return nil
} }
var errCreateSuperuserGrant = errors.New("CreateSuperUser: Grant failed") var errCreateSuperuserGrant = errors.New("`CreateSuperUser': grant failed")
// CreateSuperuser createsa new user, with the name 'user' and the password 'password'. // CreateSuperuser createsa new user, with the name 'user' and the password 'password'.
// It then grants this user superuser status in the database. // It then grants this user superuser status in the database.
@ -93,7 +93,7 @@ func (sql *SQL) CreateSuperuser(ctx context.Context, user, password string, allo
return nil return nil
} }
var errPurgeUser = errors.New("PurgeUser: Failed to drop user") var errPurgeUser = errors.New("`PurgeUser': failed to drop user")
// SQLPurgeUser deletes the specified user from the database // SQLPurgeUser deletes the specified user from the database
func (sql *SQL) PurgeUser(ctx context.Context, user string) error { func (sql *SQL) PurgeUser(ctx context.Context, user string) error {

View file

@ -60,7 +60,7 @@ func (sb SQLBit1) Value() (driver.Value, error) {
} }
} }
var errBadBool = errors.New("SQLBit1: Database does not contain Bit(1)") var errBadBool = errors.New("`SQLBit1': database does not contain `Bit(1)'")
func (sb *SQLBit1) Scan(src interface{}) error { func (sb *SQLBit1) Scan(src interface{}) error {
if bytes, ok := src.([]byte); ok && len(bytes) == 1 { if bytes, ok := src.([]byte); ok && len(bytes) == 1 {

View file

@ -46,7 +46,7 @@ func (b Boolean) MarshalJSON() ([]byte, error) {
return []byte("false"), nil return []byte("false"), nil
} }
var errNotABoolean = errors.New("Boolean.UnmarshalJSON: Not an integer") var errNotABoolean = errors.New("`Boolean': not an integer")
func (b *Boolean) UnmarshalJSON(data []byte) (err error) { func (b *Boolean) UnmarshalJSON(data []byte) (err error) {
return UnmarshalIntermediate(b, func(a any) (Boolean, error) { return UnmarshalIntermediate(b, func(a any) (Boolean, error) {
@ -100,7 +100,7 @@ func (s String) MarshalJSON() ([]byte, error) {
return json.Marshal(string(s)) return json.Marshal(string(s))
} }
var errNotAString = errors.New("String.UnmarshalJSON: Not a string") var errNotAString = errors.New("`String': not a string")
func (s *String) UnmarshalJSON(data []byte) (err error) { func (s *String) UnmarshalJSON(data []byte) (err error) {
return UnmarshalIntermediate(s, func(a any) (String, error) { return UnmarshalIntermediate(s, func(a any) (String, error) {
@ -148,7 +148,7 @@ func (i Integer) MarshalJSON() ([]byte, error) {
return json.Marshal(int64(i)) return json.Marshal(int64(i))
} }
var errNotAnInteger = errors.New("Integer.UnmarshalJSON: Not an integer") var errNotAnInteger = errors.New("`Integer': not an integer")
func (i *Integer) UnmarshalJSON(data []byte) (err error) { func (i *Integer) UnmarshalJSON(data []byte) (err error) {
return UnmarshalIntermediate(i, func(a any) (Integer, error) { return UnmarshalIntermediate(i, func(a any) (Integer, error) {

View file

@ -14,6 +14,7 @@ import (
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/php" "github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/php"
"github.com/FAU-CDI/wisski-distillery/pkg/fsx" "github.com/FAU-CDI/wisski-distillery/pkg/fsx"
"github.com/tkw1536/pkglib/collection" "github.com/tkw1536/pkglib/collection"
"golang.org/x/exp/slices"
_ "embed" _ "embed"
) )
@ -110,7 +111,7 @@ func (prefixes *Prefixes) blocked() ([]string, error) {
} }
func hasAnyPrefix(candidate string, prefixes []string) bool { func hasAnyPrefix(candidate string, prefixes []string) bool {
return collection.Any( return slices.ContainsFunc(
prefixes, prefixes,
func(prefix string) bool { func(prefix string) bool {
return strings.HasPrefix(candidate, prefix) return strings.HasPrefix(candidate, prefix)

View file

@ -11,7 +11,7 @@ import (
"github.com/tkw1536/pkglib/password" "github.com/tkw1536/pkglib/password"
) )
var errGetValidator = errors.New("GetPasswordValidator: Unknown Error") var errGetValidator = errors.New("`GetPasswordValidator': unknown error")
func (u *Users) GetPasswordValidator(ctx context.Context, username string) (pv PasswordValidator, err error) { func (u *Users) GetPasswordValidator(ctx context.Context, username string) (pv PasswordValidator, err error) {
server := u.Dependencies.PHP.NewServer() server := u.Dependencies.PHP.NewServer()
@ -53,7 +53,7 @@ func (pv PasswordValidator) Check(ctx context.Context, password string) bool {
return bool(result) return bool(result)
} }
var errPasswordUsername = errors.New("username === password") var errPasswordUsername = errors.New("username equals password")
func (pv PasswordValidator) CheckDictionary(ctx context.Context, writer io.Writer) error { func (pv PasswordValidator) CheckDictionary(ctx context.Context, writer io.Writer) error {
var counter int var counter int

View file

@ -32,7 +32,7 @@ func (u *Users) All(ctx context.Context, server *phpx.Server) (users []status.Dr
return return
} }
var errLoginUnknownError = errors.New("Login: Unknown Error") var errLoginUnknownError = errors.New("`Login': unknown error")
// Login generates a login link for the user with the given username // Login generates a login link for the user with the given username
func (u *Users) Login(ctx context.Context, server *phpx.Server, username string) (dest *url.URL, err error) { func (u *Users) Login(ctx context.Context, server *phpx.Server, username string) (dest *url.URL, err error) {
@ -75,7 +75,7 @@ func (u *Users) LoginWithOpt(ctx context.Context, server *phpx.Server, username
return return
} }
var errSetPassword = errors.New("SetPassword: Unknown Error") var errSetPassword = errors.New("`SetPassword': unknown error")
// SetPassword sets the password for a given user // SetPassword sets the password for a given user
func (u *Users) SetPassword(ctx context.Context, server *phpx.Server, username, password string) error { func (u *Users) SetPassword(ctx context.Context, server *phpx.Server, username, password string) error {