mpw 2.0.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6bb4b82dd0d113ea933f35498f0c06d204da9dd4
4
- data.tar.gz: 6e8e787417bab3e9e5a467af6f44f99569385c0b
3
+ metadata.gz: 4d0eff317597b9307b65264bd5c42547b32588d6
4
+ data.tar.gz: a374e4ec216d629846f5848e7648d606634eaf2f
5
5
  SHA512:
6
- metadata.gz: a64bfc419f4a5ff32bf19e4c187840a0ae5929695da310d9efa7fdbc7d3f1352e6fc11270a74b6b609996eda13079f946a6faf30342cb95529337847a4f0901a
7
- data.tar.gz: 6783a408ea98e5994845d552f5797a5cd3a30c7a921d4162ca03f46b5a2bb5bd8d9065df30a84fa8c2631b321d1e81ee9ea970ff00e062c739f9581894c823a3
6
+ metadata.gz: d4b873e23e0065cbe83eb0273e16186a721acfb162974f73036d8eee8f49588172e64cc4ef2ad859971989bf141a2253f7af3cf184a6e730b53d8f967454a7ed
7
+ data.tar.gz: 1d6c99d6e62f544139ffd11aa5185b99346f2e8b6c9777a32b42cd472be4db9f067a21a9a2fe9e11658c14649b8b997f08fa998c35fc78e88abdaf3137b6180e
data/Gemfile CHANGED
@@ -1,10 +1,8 @@
1
1
  source 'https://rubygems.org'
2
2
  gem 'highline'
3
- gem 'i18n', '0.6.9'
3
+ gem 'i18n'
4
4
  gem 'locale'
5
5
  gem 'gpgme'
6
6
  gem 'colorize'
7
-
8
- group :ssh do
9
- gem 'net-sftp'
10
- end
7
+ gem 'net-ssh'
8
+ gem 'net-scp'
data/README.md CHANGED
@@ -1,18 +1,127 @@
1
1
  # Manage your passwords!
2
2
 
3
3
  MPW is a little software which stores your passwords in an GPG encrypted file.
4
- MPW can synchronize your password with a MPW Server or via SSH or via FTP.
4
+ MPW can synchronize your password with via SSH or FTP.
5
5
 
6
6
  # Installation
7
7
 
8
- You must generate a GPG Key with GPG or with Seahorse (GUI on linux).
9
- This program work with ruby >= 1.9
8
+ This program work with ruby >= 2.0
10
9
 
11
10
  * install ruby and rubygems on your computer
12
11
  * gem install mpw
13
12
 
14
- If you want use mpw-ssh, you must install sshpass
15
-
16
13
  # How to use
17
14
 
18
- mpw -h
15
+ * Show help
16
+ ```
17
+ mpw --help
18
+ ```
19
+
20
+ * Setup a new config file
21
+ ```
22
+ mpw --setup
23
+ mpw --setup --config /path/conf/file.cfg
24
+ ```
25
+
26
+ * Create and setup a new wallet
27
+ ```
28
+ mpw --setup-wallet --wallet new_wallet_name
29
+ mpw --setup-wallet --wallet new_wallet_name --config /path/conf/file.cfg
30
+ ```
31
+
32
+ * Add a GPG key in wallet
33
+ ```
34
+ mpw --add --key root@localhost.local
35
+ mpw --add --key root@localhost.local --config /path/conf/file.cfg
36
+ mpw --add --key root@localhost.local --wallet wallet_name
37
+ mpw --add --key root@localhost.local --config /path/conf/file.cfg --wallet wallet_name
38
+ ```
39
+
40
+ * Add a new GPG key in wallet
41
+ ```
42
+ mpw --add --key root@localhost.local --file /path/gpg/file.pub
43
+ mpw --add --key root@localhost.local --file /path/gpg/file.pub --config /path/conf/file.cfg
44
+ mpw --add --key root@localhost.local --file /path/gpg/file.pub --wallet wallet_name
45
+ mpw --add --key root@localhost.local --file /path/gpg/file.pub --config /path/conf/file.cfg --wallet wallet_name
46
+ ```
47
+
48
+ * Delete a GPG key in wallet
49
+ ```
50
+ mpw --delete --key root@localhost.local
51
+ mpw --delete --key root@localhost.local --wallet wallet_name
52
+ mpw --delete --key root@localhost.local --wallet wallet_name --config /path/conf/file.cfg
53
+ ```
54
+
55
+ * Add a new item in wallet
56
+ ```
57
+ mpw --add
58
+ mpw --add --config /path/conf/file.cfg
59
+ mpw --add --wallet wallet_name
60
+ mpw --add --config /path/conf/file.cfg --wallet wallet_name
61
+ ```
62
+
63
+ * Update an item
64
+ ```
65
+ mpw --update --id uniq_id
66
+ mpw --update --id uniq_id --config /path/conf/file.cfg
67
+ mpw --update --id uniq_id --wallet wallet_name
68
+ mpw --update --id uniq_id --config /path/conf/file.cfg --wallet wallet_name
69
+ ```
70
+
71
+ * Delete an item
72
+ ```
73
+ mpw --delete --id uniq_id
74
+ mpw --delete --id uniq_id --config /path/conf/file.cfg
75
+ mpw --delete --id uniq_id --wallet wallet_name
76
+ mpw --delete --id uniq_id --config /path/conf/file.cfg --wallet wallet_name
77
+ ```
78
+
79
+ * Show an item
80
+ ```
81
+ mpw --show 'string to search'
82
+ mpw --show 'string to search' --config /path/conf/file.cfg
83
+ mpw --show 'string to search' --wallet wallet_name
84
+ mpw --show 'string to search' --config /path/conf/file.cfg --wallet wallet_name
85
+ mpw --show 'string to search' --group group_name
86
+ mpw --show 'string to search' --group group_name --config /path/conf/file.cfg
87
+ mpw --show 'string to search' --group group_name --wallet wallet_name
88
+ mpw --show 'string to search' --group group_name --config /path/conf/file.cfg --wallet wallet_name
89
+ ```
90
+
91
+ * Export data in YAML file
92
+ ```
93
+ mpw --export --file /path/file/to/export.yml
94
+ mpw --export --file /path/file/to/export.yml --config /path/conf/file.cfg
95
+ mpw --export --file /path/file/to/export.yml --wallet wallet_name
96
+ mpw --export --file /path/file/to/export.yml --config /path/conf/file.cfg --wallet wallet_name
97
+ ```
98
+
99
+ * Import data from YAML file
100
+ ```
101
+ mpw --import --file /path/file/to/export.yml
102
+ mpw --import --file /path/file/to/export.yml --config /path/conf/file.cfg
103
+ mpw --import --file /path/file/to/export.yml --wallet wallet_name
104
+ mpw --import --file /path/file/to/export.yml --config /path/conf/file.cfg --wallet wallet_name
105
+ ```
106
+
107
+ Format file to import:
108
+ ```
109
+ 1:
110
+ name: Website perso
111
+ group: Perso
112
+ host: localhost.local
113
+ protocol: ftp
114
+ user: test
115
+ password: letoortue
116
+ port: 21
117
+ comment: Mysuper website
118
+ 2:
119
+ name: Linuxfr
120
+ group: Pro
121
+ host: Linuxfr.org
122
+ protocol: https
123
+ user: test
124
+ password: coucou
125
+ port:
126
+ comment:
127
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.3
1
+ 3.0.0
data/bin/mpw CHANGED
@@ -1,17 +1,26 @@
1
1
  #!/usr/bin/ruby
2
- # author: nishiki
3
- # mail: nishiki@yaegashi.fr
4
- # info: a simple script who manage your passwords
2
+ # MPW is a software to crypt and manage your passwords
3
+ # Copyright (C) 2016 Adrien Waksberg <mpw@yae.im>
4
+ #
5
+ # This program is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU General Public License
7
+ # as published by the Free Software Foundation; either version 2
8
+ # of the License, or (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
5
18
 
6
- require 'rubygems'
7
19
  require 'optparse'
8
20
  require 'pathname'
9
21
  require 'locale'
10
22
  require 'set'
11
23
  require 'i18n'
12
- require 'mpw/mpw'
13
- require 'mpw/config'
14
- require 'mpw/ui/cli'
15
24
 
16
25
  # --------------------------------------------------------- #
17
26
  # Set local
@@ -25,8 +34,13 @@ end
25
34
 
26
35
  APP_ROOT = File.dirname(Pathname.new(__FILE__).realpath)
27
36
 
37
+ # TODO
38
+ require "#{APP_ROOT}/../lib/mpw/mpw.rb"
39
+ require "#{APP_ROOT}/../lib/mpw/config.rb"
40
+ require "#{APP_ROOT}/../lib/mpw/ui/cli.rb"
41
+
28
42
  I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
29
- I18n.load_path = Dir["#{APP_ROOT}/../i18n/cli/*.yml"]
43
+ I18n.load_path = Dir["#{APP_ROOT}/../i18n/*.yml"]
30
44
  I18n.default_locale = :en
31
45
  I18n.locale = lang.to_sym
32
46
 
@@ -36,16 +50,16 @@ I18n.locale = lang.to_sym
36
50
 
37
51
  options = {}
38
52
  options[:force] = false
39
- options[:format] = false
40
53
  options[:sync] = true
41
54
  options[:group] = nil
42
55
  options[:config] = nil
56
+ options[:wallet] = nil
43
57
 
44
58
  OptionParser.new do |opts|
45
59
  opts.banner = "#{I18n.t('option.usage')}: mpw [options]"
46
60
 
47
- opts.on('-s', '--show [SEARCH]', I18n.t('option.show')) do |search|
48
- search.nil? ? (options[:show] = '') : (options[:show] = search)
61
+ opts.on('-a', '--add', I18n.t('option.add')) do
62
+ options[:add] = true
49
63
  end
50
64
 
51
65
  opts.on('-A', '--show-all', I18n.t('option.show_all')) do
@@ -53,64 +67,74 @@ OptionParser.new do |opts|
53
67
  options[:show] = ''
54
68
  end
55
69
 
56
- opts.on('-u', '--update ID', I18n.t('option.update')) do |id|
57
- options[:update] = id
70
+ opts.on('-c', '--config CONFIG', I18n.t('option.config')) do |config|
71
+ options[:config] = config
58
72
  end
59
73
 
60
- opts.on('-d', '--delete ID', I18n.t('option.remove')) do |id|
61
- options[:delete] = id
74
+ opts.on('-d', '--delete', I18n.t('option.remove')) do
75
+ options[:delete] = true
62
76
  end
63
77
 
64
- opts.on('-g', '--group GROUP', I18n.t('option.group')) do |group|
65
- options[:group] = group
78
+ opts.on('-e', '--export', I18n.t('option.export')) do
79
+ options[:export] = true
66
80
  end
67
81
 
68
- opts.on('-a', '--add', I18n.t('option.add')) do
69
- options[:add] = true
82
+ opts.on('-f', '--file FILE', I18n.t('option.file')) do |file|
83
+ options[:file] = file
70
84
  end
71
85
 
72
- opts.on('-c', '--config CONFIG', I18n.t('option.config')) do |config|
73
- options[:config] = config
86
+ opts.on('-F', '--force', I18n.t('option.force')) do
87
+ options[:force] = true
74
88
  end
75
89
 
76
- opts.on('-S', '--setup', I18n.t('option.setup')) do
77
- options[:setup] = true
90
+ opts.on('-g', '--group GROUP', I18n.t('option.group')) do |group|
91
+ options[:group] = group
78
92
  end
79
93
 
80
- opts.on('-p', '--protocol PROTOCOL', I18n.t('option.protocol')) do |protocol|
81
- options[:protocol] = protocol
94
+ opts.on('-G', '--generate-password [LENGTH]', I18n.t('option.generate_password')) do |length|
95
+ puts MPW::MPW::password(length)
96
+ exit 0
82
97
  end
83
98
 
84
- opts.on('-e', '--export FILE', I18n.t('option.export')) do |file|
85
- options[:export] = file
86
- options[:type] = :yaml
99
+ opts.on('-h', '--help', I18n.t('option.help')) do
100
+ puts opts
101
+ exit 0
87
102
  end
88
103
 
89
- opts.on('-t', '--type TYPE', I18n.t('option.type')) do |type|
90
- options[:type] = type.to_sym
104
+ opts.on('-i', '--id ID', I18n.t('option.id')) do |id|
105
+ options[:id] = id
91
106
  end
92
107
 
93
- opts.on('-i', '--import FILE', I18n.t('option.import')) do |file|
94
- options[:import] = file
95
- options[:type] = :yaml
108
+ opts.on('-I', '--import', I18n.t('option.import')) do
109
+ options[:import] = true
96
110
  end
97
111
 
98
- opts.on('-f', '--force', I18n.t('option.force')) do
99
- options[:force] = true
112
+ opts.on('-k', '--key KEY', I18n.t('option.key')) do |key|
113
+ options[:key] = key
100
114
  end
101
115
 
102
116
  opts.on('-N', '--no-sync', I18n.t('option.no_sync')) do
103
117
  options[:sync] = false
104
118
  end
105
119
 
106
- opts.on('-G', '--generate-password [LENGTH]', I18n.t('option.generate_password')) do |length|
107
- puts MPW::MPW::password(length)
108
- exit 0
120
+ opts.on('-s', '--show [SEARCH]', I18n.t('option.show')) do |search|
121
+ search.nil? ? (options[:show] = '') : (options[:show] = search)
109
122
  end
110
123
 
111
- opts.on('-h', '--help', I18n.t('option.help')) do
112
- puts opts
113
- exit 0
124
+ opts.on('-S', '--setup', I18n.t('option.setup')) do
125
+ options[:setup] = true
126
+ end
127
+
128
+ opts.on('-u', '--update', I18n.t('option.update')) do
129
+ options[:update] = true
130
+ end
131
+
132
+ opts.on('-w', '--wallet WALLET', I18n.t('option.wallet')) do |wallet|
133
+ options[:wallet] = wallet
134
+ end
135
+
136
+ opts.on('-W', '--setup-wallet', I18n.t('option.setup_wallet')) do
137
+ options[:setup_wallet] = true
114
138
  end
115
139
  end.parse!
116
140
 
@@ -118,51 +142,59 @@ end.parse!
118
142
  # Main
119
143
  # --------------------------------------------------------- #
120
144
 
121
- config = MPW::Config.new(options[:config])
122
- check_error = config.checkconfig
123
-
124
- cli = Cli.new(config)
145
+ config = MPW::Config.new(options[:config])
146
+ cli = MPW::Cli.new(config, options[:sync])
125
147
 
126
148
  # Setup a new config
127
- if not check_error or not options[:setup].nil?
149
+ if not config.is_valid? or not options[:setup].nil?
128
150
  cli.setup(lang)
129
151
  elsif not config.check_gpg_key?
130
152
  cli.setup_gpg_key
131
153
  end
132
154
 
155
+ cli.get_wallet(options[:wallet])
133
156
  cli.decrypt
134
- cli.sync(options[:sync])
135
157
 
136
158
  # Display the item's informations
137
159
  if not options[:show].nil?
138
160
  opts = {search: options[:show],
139
161
  group: options[:group],
140
- protocol: options[:protocol],
141
162
  }
142
163
 
143
164
  cli.display(opts)
144
165
 
145
166
  # Remove an item
146
- elsif not options[:delete].nil?
147
- cli.delete(options[:delete], options[:force])
167
+ elsif not options[:delete].nil? and not options[:id].nil?
168
+ cli.delete(options[:id], options[:force])
148
169
 
149
170
  # Update an item
150
- elsif not options[:update].nil?
151
- cli.update(options[:update])
171
+ elsif not options[:update].nil? and not options[:id].nil?
172
+ cli.update(options[:id])
152
173
 
153
174
  # Add a new item
154
- elsif not options[:add].nil?
175
+ elsif not options[:add].nil? and options[:key].nil?
155
176
  cli.add
156
177
 
178
+ # Add a new public key in wallet
179
+ elsif not options[:add].nil? and not options[:key].nil?
180
+ cli.add_key(options[:key], options[:file])
181
+
182
+ # Delete a public key in wallet
183
+ elsif not options[:delete].nil? and not options[:key].nil?
184
+ cli.delete_key(options[:key])
185
+
157
186
  # Export
158
- elsif not options[:export].nil?
159
- cli.export(options[:export], options[:type])
187
+ elsif not options[:export].nil? and not options[:file].nil?
188
+ cli.export(options[:file])
160
189
 
161
190
  # Add a new item
162
- elsif not options[:import].nil?
163
- cli.import(options[:import], options[:type], options[:force])
191
+ elsif not options[:import].nil? and not options[:file].nil?
192
+ cli.import(options[:file])
193
+
194
+ # Setup wallet config
195
+ elsif not options[:setup_wallet].nil?
196
+ cli.setup_wallet_config
164
197
 
165
- # Interactive mode
166
198
  end
167
199
 
168
200
  cli = nil
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  en:
3
3
  error:
4
- client:
5
- no_authorized: "You aren't authorized."
6
4
  config:
7
5
  write: "Can't write the config file!"
8
6
  check: "Checkconfig failed!"
@@ -14,52 +12,56 @@ en:
14
12
  password: "You must define a password for your GPG key!"
15
13
  delete:
16
14
  id_no_exist: "Can't delete the item %{id}, it doesn't exist!"
17
- export:
18
- unknown_type: "The data type %{type} is unknown!"
19
- write: "Can't export, unable to write in %{file}!"
15
+ export: "Can't export, unable to write in %{file}!"
20
16
  gpg_file:
21
17
  decrypt: "Can't decrypt file!"
22
18
  encrypt: "Can't encrypt the GPG file!"
23
- import:
24
- bad_format: "Can't import, the file is badly formated!"
25
- read: "Can't import, unable to read %{file}!"
19
+ mpw_file:
20
+ read_data: "Can't to read the MPW file!"
21
+ write_data: "Can't to write the MPW file!"
22
+ import: "Can't import, unable to read %{file}!"
26
23
  update:
27
24
  name_empty: "You must define a name!"
28
25
  sync:
26
+ general: "An error is appeared durint the sync"
29
27
  connection: "Connection fail!"
30
28
  communication: "A communication problem with the server is appeared!"
31
29
  download: "Can't download the file!"
32
30
  not_authorized: "You haven't the access to remote file!"
33
31
  upload: "Can't upload the file on the server!"
34
- unknown: "An unknown error is occured!"
35
- unknown_type: "The sync type is unknown"
32
+ unknown: "An unknown error is occured!"
33
+ unknown_type: "The sync type is unknown"
36
34
 
37
35
  warning:
38
36
  select: 'Your choice is not a valid element!'
39
37
 
40
38
  option:
41
- usage: "Usage"
42
- show: "Search and show the items"
43
- show_all: "Show all items"
44
- update: "Update an item"
45
- remove: "Delete an item"
46
- group: "Search the items with specified group"
47
- add: "Add an item"
39
+ add: "Add an item or key"
48
40
  config: "Specify the configuration file to use"
49
- setup: "Create a new configuration file"
50
- protocol: "Select the items with the specified protocol"
51
- export: "Export all items in a file"
52
- type: "Data's type export file [csv|yaml]"
53
- import: "Import item since a yaml or csv file"
54
- force: "Force an action"
55
- no_sync: "Disable synchronization with the server"
56
- format: "Change the display items format by an alternative format"
41
+ export: "Export a wallet in an yaml file"
42
+ file: "Specify a file, to use with the options [--import | --export | --add]"
43
+ force: "No ask to confirm when you delete an item"
57
44
  generate_password: "Generate a random password (default 8 characters)"
45
+ group: "Search the items with specified group"
58
46
  help: "Show this help message"
47
+ id: "Specify an id, to use with the options [--delete | --update]"
48
+ import: "Import item since a yaml file"
49
+ key: "Specify the key name, to use with the options [--add | --delete | --update]"
50
+ no_sync: "Disable synchronization with the server"
51
+ setup: "Create a new configuration file"
52
+ setup_wallet: "Create a new configuration file for a wallet"
53
+ show: "Search and show the items"
54
+ show_all: "Show all items"
55
+ remove: "Delete an item"
56
+ update: "Update an item"
57
+ usage: "Usage"
58
+ wallet: "Specify a wallet to use"
59
59
 
60
60
  form:
61
61
  select: "Select the item: "
62
- add:
62
+ add_key:
63
+ valid: "Key has been added!"
64
+ add_item:
63
65
  title: "Add a new item"
64
66
  name: "Enter the name: "
65
67
  group: "Enter the group (optional): "
@@ -70,7 +72,9 @@ en:
70
72
  port: "Enter the connection port (optional): "
71
73
  comment: "Enter a comment (optional): "
72
74
  valid: "Item has been added!"
73
- delete:
75
+ delete_key:
76
+ valid: "Key has been deleted!"
77
+ delete_item:
74
78
  ask: "Are you sure you want to remove the item %{id} ?"
75
79
  valid: "The item %{id} has been removed!"
76
80
  not_valid: "The item %{id} hasn't been removed, because it doesn't exist!"
@@ -78,20 +82,21 @@ en:
78
82
  ask: "Are you sure you want to import this file %{file} ?"
79
83
  valid: "The import is succesfull!"
80
84
  not_valid: "No data to import!"
81
- setup:
85
+ setup_config:
82
86
  title: "Setup a new config file"
83
- lang: "Choose your language (en, fr, ...): "
84
- gpg_key: "Enter the GPG key: "
85
- share_gpg_keys: "Enter the GPG keys with who you want to share the passwords: "
86
- gpg_file: "Enter the path to encrypt file [default=%{home}/db/default.gpg]: "
87
- timeout: "Enter the timeout (in seconde) to GPG password [default=60]: "
88
- sync_type: "Synchronization type (mpw, ssh, ftp, or nil): "
87
+ lang: "Choose your language (en, fr, ...) [default=%{lang}]: "
88
+ gpg_key: "Enter the GPG key [ex: test@host.local]: "
89
+ wallet_dir: "Enter the wallets's folder path [default=%{home}/wallets]: "
90
+ valid: "The config file has been created!"
91
+ setup_wallet:
92
+ title: "Wallet setup"
93
+ sync_type: "Synchronization type (ssh, ftp, or nil): "
89
94
  sync_host: "Synchronization server: "
90
95
  sync_port: "Port of the synchronization server: "
91
96
  sync_user: "Username for the synchronization: "
92
97
  sync_pwd: "Password for the synchronization: "
93
98
  sync_path: "File path for the synchronization : "
94
- valid: "The config file has been created!"
99
+ valid: "The wallet config file has been created!"
95
100
  setup_gpg_key:
96
101
  title: "Setup a GPG key"
97
102
  ask: "Do you want create your GPG key ? (Y/n)"
@@ -104,7 +109,7 @@ en:
104
109
  expire: "Expire time of the GPG key [default=0 (unlimited)]: "
105
110
  wait: "Please waiting during the GPG key generate, this process can take few minutes."
106
111
  valid: "Your GPG key has been created ;-)"
107
- update:
112
+ update_item:
108
113
  title: "Update an item"
109
114
  name: "Enter the name [%{name}]: "
110
115
  group: "Enter the group [%{group}]: "
@@ -121,28 +126,17 @@ en:
121
126
  display:
122
127
  comment: "Comment"
123
128
  error: "ERROR"
124
- gpg_password: "Password GPG: "
129
+ gpg_password: "GPG passphrase: "
125
130
  group: "Group"
126
131
  login: "Login"
127
132
  name: "Name"
128
- nothing: "Nothing result!"
133
+ nothing: "No matches!"
129
134
  password: "Password"
130
135
  port: "Port"
131
136
  protocol: "Protocol"
132
137
  server: "Server"
133
138
  warning: "Warning"
134
139
 
135
- ssh:
136
- option:
137
- usage: "Usage"
138
- login: "Change the login"
139
- server: "Change the host or the ip"
140
- port: "Change the port"
141
- help: "Show this help message"
142
- display:
143
- connect: "Connection to:"
144
- nothing: "Nothing result!"
145
-
146
140
  formats:
147
141
  default: ! '%Y-%m-%d'
148
142
  long: ! '%B %d, %Y'