imapcli 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +4 -0
- data/NEWS +9 -0
- data/README.md +181 -53
- data/bin/imapcli +58 -18
- data/imapcli.gemspec +2 -1
- data/lib/imapcli.rb +2 -0
- data/lib/imapcli/client.rb +11 -22
- data/lib/imapcli/command.rb +106 -39
- data/lib/imapcli/mailbox.rb +95 -20
- data/lib/imapcli/option_validator.rb +70 -0
- data/lib/imapcli/stats.rb +62 -0
- data/lib/imapcli/version.rb +1 -1
- data/spec/lib/imapcli/client_spec.rb +3 -3
- data/spec/lib/imapcli/command_spec.rb +123 -0
- data/spec/lib/imapcli/mailbox_spec.rb +61 -3
- data/spec/lib/imapcli/option_validator_spec.rb +4 -0
- data/spec/lib/imapcli/stats_spec.rb +68 -0
- data/spec/spec_helper.rb +2 -0
- metadata +11 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0eea58453e11ea2b7a31df76ba5aa4d56152d1e6
|
4
|
+
data.tar.gz: 2c5d48c01d834adabd756cc6ea0c567ceb66eb2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7f5f2d62dcedb5e43dfa60b5b342bf7db7e7317f7e29809fcd6b5bac4c69e153bb8f7f5f1aef5040aca6802ec585faef16cf839a9d069621627b467ddc01d36
|
7
|
+
data.tar.gz: d5304ffda8cd1417592d9a9d5552ef969effd94c5d2d0a17ed68d0a93120495cbf206da27268a5e94223c7561d63959a07fd150ce4c83a0b1a4d07d8cc1a1fec
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -73,6 +73,9 @@ GEM
|
|
73
73
|
hitimes
|
74
74
|
tty-color (0.4.2)
|
75
75
|
tty-cursor (0.5.0)
|
76
|
+
tty-progressbar (0.13.0)
|
77
|
+
tty-cursor (~> 0.5.0)
|
78
|
+
tty-screen (~> 0.6.0)
|
76
79
|
tty-prompt (0.13.2)
|
77
80
|
necromancer (~> 0.4.0)
|
78
81
|
pastel (~> 0.7.0)
|
@@ -110,6 +113,7 @@ DEPENDENCIES
|
|
110
113
|
rake
|
111
114
|
rdoc
|
112
115
|
rspec
|
116
|
+
tty-progressbar
|
113
117
|
tty-prompt
|
114
118
|
tty-table
|
115
119
|
|
data/NEWS
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
|
2
|
+
Version 0.0.1 (2017-11-16)
|
3
|
+
------------------------------------------------------------------------
|
4
|
+
|
5
|
+
Initial alpha release. Stats working only for mailboxes that are
|
6
|
+
explicitly given on the command line.
|
7
|
+
|
8
|
+
|
9
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@ imapcli
|
|
8
8
|
|
9
9
|
`imapcli` is a command-line tool that offers a convenient way to query an IMAP
|
10
10
|
server for configuration details and e-mail statistics. It can be used to gather
|
11
|
-
IMAP
|
11
|
+
IMAP mailbox sizes.
|
12
12
|
|
13
13
|
|
14
14
|
Table of contents
|
@@ -18,7 +18,7 @@ Table of contents
|
|
18
18
|
* [Warning](#warning)
|
19
19
|
* [Installing and executing `imapcli`](#installing-and-executing-imapcli)
|
20
20
|
* [Terminology](#terminology)
|
21
|
-
* [
|
21
|
+
* [Usage](#usage)
|
22
22
|
* [Alternative resources](#alternative-resources)
|
23
23
|
* [State of the project](#state-of-the-project)
|
24
24
|
* [Credits](#credits)
|
@@ -42,9 +42,10 @@ with the server by telnet or OpenSSL.
|
|
42
42
|
Warning
|
43
43
|
-------
|
44
44
|
|
45
|
-
Some servers are configured to detect malicious login attempts by
|
46
|
-
of connections from a given source. **It may happen that
|
47
|
-
a server if you use `imapcli` to issue too many queries in
|
45
|
+
Some servers are configured to detect potentially malicious login attempts by
|
46
|
+
the frequency of repeat connections from a given source. **It may happen that
|
47
|
+
you get locked out of a server if you use `imapcli` to issue too many queries in
|
48
|
+
too short a time!**
|
48
49
|
|
49
50
|
If you happen to be the server administrator yourself, have
|
50
51
|
[fail2ban](https://www.fail2ban.org) running, and find your IP being denied
|
@@ -53,10 +54,10 @@ this:
|
|
53
54
|
|
54
55
|
sudo fail2ban-client set dovecot unbanip <your-ip>
|
55
56
|
|
56
|
-
If your IMAP server is not [Dovecot](https://www.dovecot.org), you need to
|
57
|
-
this command
|
57
|
+
If your IMAP server is not [Dovecot](https://www.dovecot.org), you need to adjust
|
58
|
+
this command to provide the appropriate 'jail' name.
|
58
59
|
|
59
|
-
To prevent `fail2ban` from blocking your IP, you may want to add
|
60
|
+
To prevent `fail2ban` from blocking your IP, you may want to add your network and
|
60
61
|
submask to `jail.local`:
|
61
62
|
|
62
63
|
# /etc/fail2ban/jail.local
|
@@ -67,52 +68,67 @@ Do not forget to reload the `jail2ban` configuration afterwards:
|
|
67
68
|
|
68
69
|
sudo service fail2ban reload
|
69
70
|
|
71
|
+
Of course this only works if your IP addresses do not change too much.
|
72
|
+
|
70
73
|
(On Ubuntu Linux, the [indicator-ip](https://github.com/bovender/indicator-ip)
|
71
74
|
applet may be useful to know your remote IP. Disclaimer: I am the author of this
|
72
75
|
tool.)
|
73
76
|
|
77
|
+
|
74
78
|
Installing and executing `imapcli`
|
75
79
|
--------------------------------
|
76
80
|
|
77
|
-
`imapcli` is a Ruby project and as such does not need to be compiled.
|
78
|
-
|
81
|
+
`imapcli` is a Ruby project and as such does not need to be compiled. To run it
|
82
|
+
on your machine, you can either pull the repository, install a Gem, or use a
|
83
|
+
Docker image.
|
79
84
|
|
85
|
+
Detailed usage instructions follow [below](#usage).
|
80
86
|
|
81
|
-
|
87
|
+
I don't currently provide a .deb package because Debian packaging done right
|
88
|
+
is kind of complicated.
|
82
89
|
|
83
|
-
Just clone this repository and run
|
84
90
|
|
85
|
-
|
91
|
+
### Run in the repository
|
86
92
|
|
93
|
+
Requirements: git, a recent Ruby, and [bundler](http://bundler.io).
|
87
94
|
|
88
|
-
|
95
|
+
Install:
|
89
96
|
|
90
|
-
|
97
|
+
git clone https://github.com/bovender/imapcli
|
91
98
|
|
92
99
|
Run:
|
93
100
|
|
94
|
-
imapcli
|
101
|
+
cd imapcli
|
102
|
+
bundle exec bin/imapcli
|
95
103
|
|
96
104
|
|
97
|
-
###
|
105
|
+
### Install the gem
|
98
106
|
|
99
|
-
|
107
|
+
Requirements: a recent Ruby and RubyGems.
|
108
|
+
|
109
|
+
Install:
|
110
|
+
|
111
|
+
gem install imapcli
|
112
|
+
|
113
|
+
Run:
|
114
|
+
|
115
|
+
imapcli
|
100
116
|
|
101
117
|
|
102
118
|
### Docker image
|
103
119
|
|
104
|
-
To follow.
|
120
|
+
To follow.
|
105
121
|
|
106
122
|
|
107
123
|
Terminology
|
108
124
|
-----------
|
109
125
|
|
110
126
|
`imapcli` attempts to use the typical IMAP terminology. I guess most people
|
111
|
-
have their mails organized in
|
127
|
+
have their mails organized in **folders**; in IMAP speak, a folder is a **maibox**.
|
112
128
|
|
113
129
|
|
114
|
-
|
115
|
-
|
130
|
+
Usage
|
131
|
+
-----
|
116
132
|
|
117
133
|
For basic usage instructions and possible options, run `imapcli` and examine
|
118
134
|
the output. Please note that `imapcli` distinguishes between global and
|
@@ -120,45 +136,144 @@ command-specific options. Global options *precede* and command-specific options
|
|
120
136
|
*follow* a `command`, see the output of `imapcli` (without command or options)
|
121
137
|
for more information.
|
122
138
|
|
139
|
+
Note: The following examples use the command `imapcli`. Depending on how you
|
140
|
+
[installed](#installing-and-executing-imapcli) `imapcli`, you may need to use a
|
141
|
+
different command.
|
123
142
|
|
124
|
-
### Commands
|
125
143
|
|
126
|
-
|
127
|
-
* `examine`: Examines a mailbox (i.e., folder) and returns statistics about it.
|
144
|
+
### Setting your server and account information
|
128
145
|
|
146
|
+
Server and account information are given as *global options*:
|
129
147
|
|
130
|
-
|
148
|
+
imapcli -s example.com -u username -p password
|
131
149
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
* `-u USER`: Set the login (user) name (e.g., `john@example.com`). May be
|
136
|
-
omitted if the information is given in the `IMAP_USER` environment variable
|
137
|
-
(see below).
|
138
|
-
* `-p PASSWORD`: Set the password. May be omitted if the `-P` option is used
|
139
|
-
or if the information is given in the `IMAP_PASS` environment variable (see below).
|
140
|
-
* `-P`: Prompt for the password.
|
150
|
+
Of course it is **not recommended** to type a password on the command line. If
|
151
|
+
you *must* give the password on the command line, and have the Bash shell,
|
152
|
+
precede the line with a space to prevent it from being saved in the shell history.
|
141
153
|
|
154
|
+
To have `imapcli` prompt you for a password, use the `-P` option:
|
142
155
|
|
143
|
-
|
156
|
+
imapcli -s example.com -u username -P
|
144
157
|
|
145
|
-
|
146
|
-
|
158
|
+
If you have one just IMAP server that you want to query, consider setting
|
159
|
+
environment variables:
|
147
160
|
|
148
161
|
IMAP_SERVER="imap.example.com"
|
149
162
|
IMAP_USER="your_imap_login"
|
150
|
-
IMAP_PASS="your_imap_password"
|
163
|
+
IMAP_PASS="your_imap_password" # OPTIONAL, NOT RECOMMENDED, VERY INSECURE!
|
164
|
+
|
165
|
+
These variables can also be set in a `.env` file that resides in the root
|
166
|
+
directory of the repository. Never add this `.env` file to the repository!
|
167
|
+
|
168
|
+
|
169
|
+
### Obtain general information about the IMAP server
|
170
|
+
|
171
|
+
$ bundle exec bin/imapcli -s yourserver.example.com -u myusername -P info
|
172
|
+
Enter password: ••••••••
|
173
|
+
server: yourserver.example.com
|
174
|
+
user: myusername
|
175
|
+
greeting: Dovecot ready.
|
176
|
+
capability: IMAP4REV1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE
|
177
|
+
hierarchy separator: /
|
178
|
+
quota: IMAP QUOTA extension not supported by this server
|
179
|
+
|
180
|
+
|
181
|
+
### List all mailboxes (folders) without size information
|
182
|
+
|
183
|
+
$ bundle exec bin/imapcli -s yourserver.example.com -u myusername -P list
|
184
|
+
Enter password: ••••••••
|
185
|
+
server: yourserver.example.com
|
186
|
+
user: myusername
|
187
|
+
- Work
|
188
|
+
- Boss
|
189
|
+
- Project
|
190
|
+
- Family
|
191
|
+
- Sports
|
192
|
+
...
|
193
|
+
|
194
|
+
|
195
|
+
### Obtain size information about mailboxes
|
151
196
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
will be able to read the clear-text credentials.
|
197
|
+
To obtain mailbox sizes, the server has to be queried for the message sizes for
|
198
|
+
each mailbox of interest. Depending on the number of mailboxes and the number
|
199
|
+
of messages in them, this may take a little while.
|
156
200
|
|
157
|
-
|
158
|
-
variable can be easily accessed by any other code running under your account.**
|
201
|
+
`imapcli` prints the following statistics about the message sizes in a mailbox:
|
159
202
|
|
160
|
-
|
161
|
-
|
203
|
+
* `Count`: Number of individual messages
|
204
|
+
* `Total size`: Total size of all messages in the mailbox (in kiB)
|
205
|
+
* `Min`: Size of the smallest message in the mailbox (in kiB)
|
206
|
+
* `Q1`: First quartile of message sizes in the mailbox (in kiB)
|
207
|
+
* `Median`: Median of all message sizes in the mailbox (in kiB)
|
208
|
+
* `Q3`: First quartile of message sizes in the mailbox (in kiB)
|
209
|
+
* `Max`: Size of the largest message in the mailbox (in kiB)
|
210
|
+
|
211
|
+
|
212
|
+
#### All mailboxes
|
213
|
+
|
214
|
+
To obtain stats for all mailboxes, use the `stats` command without the optional
|
215
|
+
mailbox argument:
|
216
|
+
|
217
|
+
$ bundle exec bin/imapcli -s yourserver.example.com -u myusername -P stats
|
218
|
+
Enter password: ••••••••
|
219
|
+
server: yourserver.example.com
|
220
|
+
user: myusername
|
221
|
+
info: collecting stats for 109 folders
|
222
|
+
┌────────────────────────────────┬─────┬─────────────┬──────┬───────┬─────────┬──────────┬──────────┐
|
223
|
+
│Mailbox │Count│ Total size│ Min│ Q1│ Median│ Q3│ Max│
|
224
|
+
├────────────────────────────────┼─────┼─────────────┼──────┼───────┼─────────┼──────────┼──────────┤
|
225
|
+
...
|
226
|
+
│Total │13168│2,498,517 kiB│ 0 kiB│ 4 kiB│ 7 kiB│ 25 kiB│33,681 kiB│
|
227
|
+
└────────────────────────────────┴─────┴─────────────┴──────┴───────┴─────────┴──────────┴──────────┘
|
228
|
+
|
229
|
+
#### Specific mailboxes without child mailboxes
|
230
|
+
|
231
|
+
$ bundle exec bin/imapcli -s yourserver.example.com -u myusername -P stats Archive Com
|
232
|
+
Enter password: ••••••••
|
233
|
+
server: yourserver.example.com
|
234
|
+
user: myusername
|
235
|
+
┌───────┬─────┬──────────┬─────┬─────┬──────┬──────┬───────┐
|
236
|
+
│Mailbox│Count│Total size│ Min│ Q1│Median│ Q3│ Max│
|
237
|
+
├───────┼─────┼──────────┼─────┼─────┼──────┼──────┼───────┤
|
238
|
+
│Archive│ 0│ 0 kiB│ NA│ NA│ NA│ NA│ NA│
|
239
|
+
│Com │ 60│ 3,276 kiB│2 kiB│5 kiB│13 kiB│65 kiB│478 kiB│
|
240
|
+
│Total │ 60│ 3,276 kiB│2 kiB│5 kiB│13 kiB│65 kiB│478 kiB│
|
241
|
+
└───────┴─────┴──────────┴─────┴─────┴──────┴──────┴───────┘
|
242
|
+
|
243
|
+
#### Specific mailboxes and child mailboxes
|
244
|
+
|
245
|
+
Use the `-r`/`--recurse` flag:
|
246
|
+
|
247
|
+
$ bundle exec bin/imapcli -s yourserver.example.com -u myusername -P stats -r Archive Com
|
248
|
+
Enter password: ••••••••
|
249
|
+
server: yourserver.example.com
|
250
|
+
user: myusername
|
251
|
+
info: collecting stats for 58 folders
|
252
|
+
┌──────────────────────────┬─────┬──────────┬──────┬───────┬───────┬───────┬─────────┐
|
253
|
+
│Mailbox │Count│Total size│ Min│ Q1│ Median│ Q3│ Max│
|
254
|
+
├──────────────────────────┼─────┼──────────┼──────┼───────┼───────┼───────┼─────────┤
|
255
|
+
...
|
256
|
+
|
257
|
+
#### Sorting the output
|
258
|
+
|
259
|
+
By default, mailboxes are sorted alphabetically. To sort by a specific statistic,
|
260
|
+
use an `-o`/`--sort` option:
|
261
|
+
|
262
|
+
* `-o count`
|
263
|
+
* `-o total_size`
|
264
|
+
* `-o min_size`
|
265
|
+
* `-o q1`
|
266
|
+
* `-o median_size`
|
267
|
+
* `-o q3`
|
268
|
+
* `-o max_size`
|
269
|
+
|
270
|
+
Example:
|
271
|
+
|
272
|
+
$ bundle exec bin/imapcli -s yourserver.example.com -u myusername -P stats -r -o max_size Archive
|
273
|
+
|
274
|
+
#### Obtaining comma-separated values (CSV)
|
275
|
+
|
276
|
+
Use the `--csv` flag.
|
162
277
|
|
163
278
|
|
164
279
|
Alternative resources
|
@@ -194,10 +309,11 @@ following:
|
|
194
309
|
State of the project
|
195
310
|
--------------------
|
196
311
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
312
|
+
While `imapcli` does what I need it to do, there are a lot of things that could
|
313
|
+
be improved. I'll be happy to take **pull request**. Please issue those against
|
314
|
+
the **develop** branch as I like to follow *[a successful Git branching
|
315
|
+
model](http://nvie.com/git-model)*.
|
316
|
+
|
201
317
|
|
202
318
|
### Versioning
|
203
319
|
|
@@ -205,8 +321,10 @@ This project is [semantically versioned](https://semver.org).
|
|
205
321
|
|
206
322
|
### To do
|
207
323
|
|
324
|
+
- More human-friendly number formatting (e.g., MiB/GiB as appropriate)
|
325
|
+
- Output to file
|
326
|
+
- Deal with server-specific mailbox separator characters (e.g. '.' vs. '/')
|
208
327
|
- Man page
|
209
|
-
- .deb installer
|
210
328
|
- More commands?
|
211
329
|
|
212
330
|
|
@@ -224,4 +342,14 @@ License
|
|
224
342
|
|
225
343
|
© 2017 Daniel Kraus (bovender)
|
226
344
|
|
227
|
-
Apache
|
345
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
346
|
+
you may not use this file except in compliance with the License.
|
347
|
+
You may obtain a copy of the License at
|
348
|
+
|
349
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
350
|
+
|
351
|
+
Unless required by applicable law or agreed to in writing, software
|
352
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
353
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
354
|
+
See the License for the specific language governing permissions and
|
355
|
+
limitations under the License.
|
data/bin/imapcli
CHANGED
@@ -11,6 +11,9 @@ end
|
|
11
11
|
require 'dotenv'
|
12
12
|
require 'tty-prompt'
|
13
13
|
require 'tty-table'
|
14
|
+
require 'tty-progressbar'
|
15
|
+
require 'csv'
|
16
|
+
# require 'pry'
|
14
17
|
# require 'pp'
|
15
18
|
|
16
19
|
Dotenv.load
|
@@ -70,30 +73,60 @@ end
|
|
70
73
|
|
71
74
|
desc 'Collects mailbox statistics'
|
72
75
|
arg_name :mailbox, optional: false, multiple: true
|
73
|
-
command :
|
76
|
+
command :stats do |c|
|
77
|
+
c.switch [:r, :recurse], desc: 'Recurse into sub mailboxes', negatable: false
|
78
|
+
c.switch [:R, :no_recurse], desc: 'Do not recurse into sub mailboxes', negatable: false
|
79
|
+
c.flag [:o, :sort], desc: 'Order', arg_name: 'property'
|
80
|
+
c.switch [:O, :reverse], desc: 'Reverse sort order (largest first)', negatable: false
|
81
|
+
c.switch [:csv], desc: 'Output comma-separated values (CSV)'
|
82
|
+
|
74
83
|
c.action do |global_options,options,args|
|
75
|
-
|
84
|
+
raise unless @validator.stats_options_valid?(options, args)
|
85
|
+
|
86
|
+
progress_bar = nil
|
87
|
+
body = @command.stats(args, @validator.options) do |n|
|
88
|
+
if progress_bar
|
89
|
+
progress_bar.advance
|
90
|
+
else
|
91
|
+
@prompt.say "info: collecting stats for #{n} folders" if n > 1
|
92
|
+
progress_bar = TTY::ProgressBar.new(
|
93
|
+
"collecting stats... :current/:total (:percent, :eta remaining)",
|
94
|
+
total: n, clear: true)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
76
98
|
head = [ 'Mailbox', 'Count', 'Total size', 'Min', 'Q1', 'Median', 'Q3', 'Max' ]
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
99
|
+
if options[:csv]
|
100
|
+
@prompt.warn 'notice: messages sizes in CSV output are in kiB (1024 bytes)'
|
101
|
+
@prompt.say head.to_csv
|
102
|
+
last_mailbox_line = body.length == 1 ? -1 : -2 # skip grand total if present
|
103
|
+
body[0..last_mailbox_line].each { |row| @prompt.say row.to_csv }
|
104
|
+
else
|
105
|
+
nice_body = body.map do |row|
|
106
|
+
row[0..1] + row[2..-1].map { |cell| format_kib(cell) }
|
107
|
+
end
|
108
|
+
table = TTY::Table.new(head, nice_body)
|
109
|
+
@prompt.say table.render(:unicode, alignments: [:left] + Array.new(7, :right) )
|
110
|
+
if body.any? { |line| line[0].start_with? Imapcli::Command.unknown_mailbox_prefix }
|
111
|
+
@prompt.warn "#{Imapcli::Command.unknown_mailbox_prefix}unknown mailbox"
|
112
|
+
end
|
81
113
|
end
|
82
114
|
end
|
83
115
|
end
|
84
116
|
|
117
|
+
def format_kib(kib)
|
118
|
+
if kib
|
119
|
+
kib.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse + ' kiB'.freeze
|
120
|
+
else
|
121
|
+
'NA'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
85
125
|
pre do |global,command,options,args|
|
86
126
|
@prompt = TTY::Prompt.new
|
127
|
+
@validator = Imapcli::OptionValidator.new()
|
128
|
+
raise unless @validator.global_options_valid?(global)
|
87
129
|
|
88
|
-
if global[:s].nil? || global[:s].empty?
|
89
|
-
raise 'missing server name (use -s option or set IMAP_SERVER environment variable)'
|
90
|
-
end
|
91
|
-
if global[:s].nil? || global[:s].empty?
|
92
|
-
raise 'missing server name (use -s option or set IMAP_SERVER environment variable)'
|
93
|
-
end
|
94
|
-
if global[:P] && global[:p]
|
95
|
-
raise '-p and -P options do not agree'
|
96
|
-
end
|
97
130
|
if global[:P]
|
98
131
|
global[:p] = @prompt.mask 'Enter password:'
|
99
132
|
end
|
@@ -123,9 +156,16 @@ end
|
|
123
156
|
|
124
157
|
on_error do |exception|
|
125
158
|
@client.logout if @client
|
126
|
-
|
127
|
-
|
128
|
-
|
159
|
+
if @validator && @validator.errors.any?
|
160
|
+
@validator.errors.each { |error| @prompt.error error }
|
161
|
+
else
|
162
|
+
@prompt&.error "error: #{exception}"
|
163
|
+
end
|
164
|
+
@prompt.nil? # if we do not have a prompt yet, let GLI handle the exception
|
165
|
+
end
|
166
|
+
|
167
|
+
def print_warnings
|
168
|
+
@validator.warnings.each { |warning| @prompt.warn warning }
|
129
169
|
end
|
130
170
|
|
131
171
|
exit run(ARGV)
|