Mercurial > projects > sievemgr
annotate cmd/sievemgr/main.go @ 5:4dff4c3f0fbb
Introduce configuration file where account information is specified
Introduce a configuration file where account information must be specified
instead of passing it with each invocation on the command line. Each account
has a name by which it can be selected and one may be specified as the default
account. This is intended to improve usability for productive usage.
Enforce strict permissions since passwords may be specified for non-interactive
usage.
Remove command-line flags for passing account information.
author | Guido Berhoerster <guido+sievemgr@berhoerster.name> |
---|---|
date | Tue, 03 Nov 2020 23:44:45 +0100 |
parents | f925f15d8ce5 |
children | 2130614cd64a |
rev | line source |
---|---|
1
0cd5a454dfb4
Add README file
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
0
diff
changeset
|
1 // Copyright (C) 2020 Guido Berhoerster <guido+sievemgr@berhoerster.name> |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
2 // |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
3 // Permission is hereby granted, free of charge, to any person obtaining |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
4 // a copy of this software and associated documentation files (the |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
5 // "Software"), to deal in the Software without restriction, including |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
6 // without limitation the rights to use, copy, modify, merge, publish, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
7 // distribute, sublicense, and/or sell copies of the Software, and to |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
8 // permit persons to whom the Software is furnished to do so, subject to |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
9 // the following conditions: |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
10 // |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
11 // The above copyright notice and this permission notice shall be included |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
12 // in all copies or substantial portions of the Software. |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
13 // |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
17 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
18 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
19 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
20 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
21 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
22 package main |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
23 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
24 import ( |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
25 "errors" |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
26 "flag" |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
27 "fmt" |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
28 "os" |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
29 |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
30 "go.guido-berhoerster.org/sievemgr/cmd/sievemgr/internal/config" |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
31 ) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
32 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
33 const ( |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
34 exitSuccess = iota |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
35 exitFailure |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
36 exitUsage |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
37 ) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
38 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
39 type usageError string |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
40 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
41 func (e usageError) Error() string { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
42 return string(e) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
43 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
44 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
45 // command-line flags |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
46 var ( |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
47 confFilename string |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
48 acctName string |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
49 ) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
50 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
51 var conf config.Configuration |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
52 |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
53 func init() { |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
54 var err error |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
55 confFilename, err = config.DefaultFilename() |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
56 if err != nil { |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
57 fmt.Fprintln(flag.CommandLine.Output(), err) |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
58 os.Exit(exitFailure) |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
59 } |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
60 } |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
61 |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
62 var cmds = []*command{ |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
63 cmdList, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
64 cmdPut, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
65 cmdGet, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
66 cmdActivate, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
67 cmdDeactivate, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
68 cmdDelete, |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
69 cmdInfo, |
4
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
1
diff
changeset
|
70 cmdCheck, |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
71 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
72 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
73 func usage() { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
74 fmt.Fprintf(flag.CommandLine.Output(), |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
75 "usage:\n %s [options] [subcommand [options] [arguments]]\n", |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
76 flag.CommandLine.Name()) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
77 fmt.Fprintln(flag.CommandLine.Output(), "subcommands:") |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
78 for _, cmd := range cmds { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
79 fmt.Fprintf(flag.CommandLine.Output(), " %s\n", cmd.Name()) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
80 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
81 fmt.Fprintln(flag.CommandLine.Output(), "global options:") |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
82 flag.PrintDefaults() |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
83 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
84 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
85 func main() { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
86 flag.Usage = usage |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
87 flag.StringVar(&confFilename, "f", confFilename, |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
88 "Set the name of the configuration file") |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
89 flag.Parse() |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
90 if flag.NArg() == 0 { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
91 fmt.Fprintln(flag.CommandLine.Output(), "missing subcommand") |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
92 usage() |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
93 os.Exit(exitUsage) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
94 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
95 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
96 if err := config.ParseFile(confFilename, &conf); err != nil { |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
97 fmt.Fprintln(flag.CommandLine.Output(), err) |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
98 os.Exit(exitFailure) |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
99 } |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
100 |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
101 name := flag.Arg(0) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
102 var cmd *command |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
103 for _, c := range cmds { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
104 if c.Name() == name { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
105 cmd = c |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
106 break |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
107 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
108 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
109 if cmd == nil { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
110 fmt.Fprintf(flag.CommandLine.Output(), |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
111 "unknown subcommand %q\n", name) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
112 usage() |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
113 os.Exit(exitUsage) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
114 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
115 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
116 cmd.Flag.Init(cmd.Name(), flag.ExitOnError) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
117 cmd.Flag.Usage = cmd.Usage |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
118 args := flag.Args() |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
119 if err := cmd.Flag.Parse(args[1:]); err != nil { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
120 fmt.Fprintln(flag.CommandLine.Output(), err) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
121 os.Exit(exitFailure) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
122 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
123 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
124 if err := cmd.Run(cmd, cmd.Flag.Args()); err != nil { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
125 fmt.Fprintln(flag.CommandLine.Output(), err) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
126 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
127 var uerr usageError |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
128 if errors.As(err, &uerr) { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
129 cmd.Usage() |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
130 os.Exit(exitUsage) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
131 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
132 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
133 os.Exit(exitFailure) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
134 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
135 } |