sym 2.8.2 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +29 -22
- data/.envrc +7 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +158 -920
- data/.rubocop_todo.yml +115 -0
- data/.travis.yml +16 -26
- data/CHANGELOG.md +239 -167
- data/Gemfile +1 -0
- data/LICENSE +2 -2
- data/README.adoc +675 -0
- data/README.pdf +29732 -19
- data/Rakefile +10 -4
- data/bin/changelog +34 -0
- data/bin/sym.completion.bash +6 -4
- data/codecov.yml +29 -0
- data/design/sym-class-dependency-future-refactor.png +0 -0
- data/design/sym-class-dependency-vertical.png +0 -0
- data/design/sym-class-dependency.graffle +0 -0
- data/design/sym-class-dependency.png +0 -0
- data/design/sym-help.png +0 -0
- data/exe/keychain +3 -3
- data/exe/sym +8 -5
- data/lib/ruby_warnings.rb +7 -0
- data/lib/sym.rb +2 -8
- data/lib/sym/app.rb +7 -9
- data/lib/sym/app/args.rb +3 -2
- data/lib/sym/app/cli.rb +34 -23
- data/lib/sym/app/cli_slop.rb +17 -11
- data/lib/sym/app/commands.rb +1 -1
- data/lib/sym/app/commands/base_command.rb +2 -1
- data/lib/sym/app/commands/bash_completion.rb +3 -3
- data/lib/sym/app/commands/keychain_add_key.rb +1 -1
- data/lib/sym/app/commands/open_editor.rb +1 -1
- data/lib/sym/app/commands/password_protect_key.rb +4 -4
- data/lib/sym/app/commands/show_examples.rb +6 -6
- data/lib/sym/app/input/handler.rb +8 -2
- data/lib/sym/app/keychain.rb +15 -9
- data/lib/sym/app/output/base.rb +1 -1
- data/lib/sym/app/output/noop.rb +2 -1
- data/lib/sym/app/password/cache.rb +1 -1
- data/lib/sym/app/password/providers.rb +3 -6
- data/lib/sym/app/private_key/decryptor.rb +2 -2
- data/lib/sym/app/private_key/detector.rb +4 -7
- data/lib/sym/app/private_key/key_source_check.rb +2 -3
- data/lib/sym/application.rb +9 -14
- data/lib/sym/configuration.rb +1 -5
- data/lib/sym/constants.rb +40 -24
- data/lib/sym/data.rb +2 -2
- data/lib/sym/data/wrapper_struct.rb +20 -12
- data/lib/sym/errors.rb +13 -2
- data/lib/sym/extensions/instance_methods.rb +11 -12
- data/lib/sym/extensions/stdlib.rb +2 -3
- data/lib/sym/extensions/with_retry.rb +1 -1
- data/lib/sym/extensions/with_timeout.rb +1 -1
- data/lib/sym/version.rb +54 -5
- data/sym.gemspec +38 -35
- metadata +132 -66
- data/.codeclimate.yml +0 -30
- data/README.md +0 -623
- data/lib/sym/app/password/providers/drb_provider.rb +0 -41
data/lib/sym/app/commands.rb
CHANGED
@@ -37,7 +37,7 @@ module Sym
|
|
37
37
|
# Sort commands based on the #dependencies array, which itself is sorted
|
38
38
|
# based on command dependencies.
|
39
39
|
def sorted_commands
|
40
|
-
@sorted_commands ||= self.commands.to_a.sort_by{|klass| dependencies.index(klass.short_name) }
|
40
|
+
@sorted_commands ||= self.commands.to_a.sort_by{ |klass| dependencies.index(klass.short_name) }
|
41
41
|
@sorted_commands
|
42
42
|
end
|
43
43
|
|
@@ -50,6 +50,7 @@ module Sym
|
|
50
50
|
extend Forwardable
|
51
51
|
|
52
52
|
attr_accessor :application
|
53
|
+
|
53
54
|
def_delegators :@application, :opts, :opts_slop, :key, :stdin, :stdout, :stderr, :kernel
|
54
55
|
|
55
56
|
def initialize(application)
|
@@ -73,7 +74,7 @@ module Sym
|
|
73
74
|
end
|
74
75
|
|
75
76
|
def add_to_keychain_if_needed(key)
|
76
|
-
if opts[:keychain] && Sym::App.
|
77
|
+
if opts[:keychain] && Sym::App.osx?
|
77
78
|
Sym::App::KeyChain.new(opts[:keychain], opts).add(key)
|
78
79
|
else
|
79
80
|
key
|
@@ -15,7 +15,7 @@ module Sym
|
|
15
15
|
file = opts[:bash_support]
|
16
16
|
|
17
17
|
out = ''
|
18
|
-
Sym::Constants
|
18
|
+
Sym::Constants.config.each_pair do |key, config|
|
19
19
|
script_name = key.to_s
|
20
20
|
|
21
21
|
# This removes the old version of this file.
|
@@ -43,14 +43,14 @@ module Sym
|
|
43
43
|
out << "\nPlease reload your terminal session to activate bash completion\n"
|
44
44
|
out << "and other installed BASH utilities.\n"
|
45
45
|
out << "\nAlternatively, just type #{"source #{file}".bold.green} to reload BASH.\n"
|
46
|
-
out << "Also — go ahead and try running #{
|
46
|
+
out << "Also — go ahead and try running #{'sym -h'.bold.blue} and #{'symit -h'.bold.blue}.\n"
|
47
47
|
end
|
48
48
|
|
49
49
|
private
|
50
50
|
|
51
51
|
def append_completion_script(file, script)
|
52
52
|
File.open(file, 'a') do |fd|
|
53
|
-
fd.write(script
|
53
|
+
fd.write("#{script}\n")
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -13,7 +13,7 @@ module Sym
|
|
13
13
|
|
14
14
|
def execute
|
15
15
|
if Sym.default_key? && Sym.default_key == self.key
|
16
|
-
raise
|
16
|
+
raise "Refusing to import key specified in the default key file #{Sym.default_key_file.italic}"
|
17
17
|
end
|
18
18
|
raise Sym::Errors::NoPrivateKeyFound.new("Unable to resolve private key from argument '#{opts[:key]}'") if self.key.nil?
|
19
19
|
add_to_keychain_if_needed(self.key)
|
@@ -48,7 +48,7 @@ module Sym
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def timestamp
|
51
|
-
@timestamp ||= Time.now.to_a.select { |d| d.is_a?(
|
51
|
+
@timestamp ||= Time.now.to_a.select { |d| d.is_a?(Integer) }.map { |d| '%02d' % d }[0..-3].reverse.join
|
52
52
|
end
|
53
53
|
|
54
54
|
def process(code)
|
@@ -16,10 +16,10 @@ module Sym
|
|
16
16
|
the_key = self.key
|
17
17
|
|
18
18
|
if opts[:password]
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
encrypted_key, password = encrypt_with_password(the_key)
|
20
|
+
add_password_to_the_cache(encrypted_key, password)
|
21
|
+
the_key = encrypted_key
|
22
|
+
end
|
23
23
|
|
24
24
|
add_to_keychain_if_needed(the_key)
|
25
25
|
|
@@ -16,12 +16,12 @@ module Sym
|
|
16
16
|
result: '75ngenJpB6zL47/8Wo7Ne6JN1pnOsqNEcIqblItpfg4='.green)
|
17
17
|
|
18
18
|
output << example(comment: 'generate a new key with a cached password & save to the default key file',
|
19
|
-
command:
|
20
|
-
echo:
|
21
|
-
result:
|
19
|
+
command: "sym -gcpqo #{Sym.default_key_file}",
|
20
|
+
echo: "New Password : #{'••••••••••'.green}",
|
21
|
+
result: "Confirm Password : #{'••••••••••'.green}")
|
22
22
|
|
23
23
|
output << example(comment: 'encrypt a plain text string with default key file, and immediately decrypt it',
|
24
|
-
command:
|
24
|
+
command: "sym -es #{'"secret string"'.bold.yellow} | sym -d",
|
25
25
|
result: 'secret string'.green)
|
26
26
|
|
27
27
|
output << example(comment: 'encrypt secrets file using key in the environment, and --negate option:',
|
@@ -35,7 +35,7 @@ module Sym
|
|
35
35
|
result: 'secret string'.green)
|
36
36
|
|
37
37
|
output << example(comment: 'encrypt/decrypt sym.yml using the default key file',
|
38
|
-
command:
|
38
|
+
command: "sym -gcq > #{Sym.default_key_file}",
|
39
39
|
echo: 'sym -n secrets.yml',
|
40
40
|
result: 'sym -df secrets.yml.enc',
|
41
41
|
)
|
@@ -56,7 +56,7 @@ Diff:
|
|
56
56
|
# (c) 2016 Konstantin Gredeskoul. All rights reserved.'.green.bold)
|
57
57
|
|
58
58
|
|
59
|
-
if Sym::App.
|
59
|
+
if Sym::App.osx?
|
60
60
|
output << example(comment: 'generate a new password-encrypted key, save it to your Keychain:',
|
61
61
|
command: 'sym -gpcx staging.key')
|
62
62
|
|
@@ -6,7 +6,7 @@ module Sym
|
|
6
6
|
class Handler
|
7
7
|
attr_accessor :stdin, :stdout, :stderr, :kernel
|
8
8
|
|
9
|
-
def initialize(stdin =
|
9
|
+
def initialize(stdin = $stdin, stdout = $stdout, stderr = $stderr, kernel = nil)
|
10
10
|
self.stdin = stdin
|
11
11
|
self.stdout = stdout
|
12
12
|
self.stderr = stderr
|
@@ -27,7 +27,13 @@ module Sym
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def prompt(message, color)
|
30
|
-
|
30
|
+
unless $stdin.isatty && $stdin.tty?
|
31
|
+
raise Sym::Errors::CantReadPasswordNoTTY.new('key requires a password, however STDIN is not a TTY')
|
32
|
+
end
|
33
|
+
highline(message, color)
|
34
|
+
end
|
35
|
+
|
36
|
+
def highline(message, color)
|
31
37
|
HighLine.new(stdin, stderr).ask(message.bold) { |q| q.echo = '•'.send(color) }
|
32
38
|
end
|
33
39
|
|
data/lib/sym/app/keychain.rb
CHANGED
@@ -39,11 +39,13 @@ module Sym
|
|
39
39
|
self.key_name = key_name
|
40
40
|
self.opts = opts
|
41
41
|
self.class.validate!
|
42
|
-
stderr_off
|
42
|
+
opts[:trace] ? stderr_on : stderr_off
|
43
43
|
end
|
44
44
|
|
45
45
|
def add(password)
|
46
|
-
|
46
|
+
delete rescue nil
|
47
|
+
sleep 0.1
|
48
|
+
execute command(:add, " -T /usr/bin/security -w '#{password}' ")
|
47
49
|
end
|
48
50
|
|
49
51
|
def find
|
@@ -56,10 +58,14 @@ module Sym
|
|
56
58
|
|
57
59
|
def execute(command)
|
58
60
|
command += ' 2>/dev/null' if stderr_disabled
|
59
|
-
puts "> #{command.yellow
|
61
|
+
puts "> #{command.yellow}" if opts[:verbose]
|
60
62
|
output = `#{command}`
|
61
63
|
result = $?
|
62
|
-
|
64
|
+
unless result.success?
|
65
|
+
warn "> ERROR running command:\n> $ #{output.red}" if !stderr_disabled && opts[:verbose]
|
66
|
+
raise Sym::Errors::KeyChainCommandError.new("Command error: #{result}, command: #{command}")
|
67
|
+
end
|
68
|
+
|
63
69
|
output.chomp
|
64
70
|
rescue Errno::ENOENT => e
|
65
71
|
raise Sym::Errors::KeyChainCommandError.new("Command error: #{e.message}, command: #{command}")
|
@@ -80,16 +86,16 @@ module Sym
|
|
80
86
|
out << extras if extras
|
81
87
|
out = out.join
|
82
88
|
# Do not actually ever run these commands on non MacOSX
|
83
|
-
out = "echo Run this –\"#{out}\", on #{Sym::App.this_os}?\nAre you sure?" unless Sym::App.
|
89
|
+
out = "echo Run this –\"#{out}\", on #{Sym::App.this_os}?\nAre you sure?" unless Sym::App.osx?
|
84
90
|
out
|
85
91
|
end
|
86
92
|
|
87
93
|
def base_command(action)
|
88
94
|
[
|
89
|
-
"security #{action}-#{self.class.sub_section} ",
|
90
|
-
"-a
|
91
|
-
"-D
|
92
|
-
"-s
|
95
|
+
"/usr/bin/security #{action}-#{self.class.sub_section} ",
|
96
|
+
"-a #{self.class.user} ",
|
97
|
+
"-D #{self.class.kind} ",
|
98
|
+
"-s #{self.key_name} "
|
93
99
|
]
|
94
100
|
end
|
95
101
|
end
|
data/lib/sym/app/output/base.rb
CHANGED
@@ -6,7 +6,7 @@ module Sym
|
|
6
6
|
|
7
7
|
attr_accessor :opts, :stdin, :stdout, :stderr, :kernel
|
8
8
|
|
9
|
-
def initialize(opts, stdin =
|
9
|
+
def initialize(opts, stdin = $stdin, stdout = $stdout, stderr = $stderr, kernel = nil)
|
10
10
|
self.opts = opts
|
11
11
|
self.stdin = stdin
|
12
12
|
self.stdout = stdout
|
data/lib/sym/app/output/noop.rb
CHANGED
@@ -36,7 +36,7 @@ module Sym
|
|
36
36
|
self.enabled = opts[:enabled]
|
37
37
|
self.verbose = opts[:verbose]
|
38
38
|
self.timeout = opts[:timeout] || ::Sym::Configuration.config.password_cache_timeout
|
39
|
-
self.provider = Providers.provider(opts[:provider], opts[:provider_opts] || {})
|
39
|
+
self.provider = Providers.provider(opts[:provider], **(opts[:provider_opts] || {}))
|
40
40
|
self.enabled = false unless self.provider
|
41
41
|
self
|
42
42
|
end
|
@@ -4,9 +4,7 @@ module Sym
|
|
4
4
|
module Providers
|
5
5
|
|
6
6
|
class << self
|
7
|
-
attr_accessor :registry
|
8
|
-
attr_accessor :providers
|
9
|
-
attr_accessor :detected
|
7
|
+
attr_accessor :registry, :providers, :detected
|
10
8
|
|
11
9
|
def register(provider_class)
|
12
10
|
self.registry ||= {}
|
@@ -15,7 +13,7 @@ module Sym
|
|
15
13
|
self.providers << provider_class
|
16
14
|
end
|
17
15
|
|
18
|
-
# Detect first instance
|
16
|
+
# Detect first instance tht is "alive?" and return it.
|
19
17
|
def detect
|
20
18
|
self.detected ||= self.providers.inject(nil) do |instance, provider_class|
|
21
19
|
instance || (p = provider_class.new; p.alive? ? p : nil)
|
@@ -38,7 +36,7 @@ module Sym
|
|
38
36
|
|
39
37
|
def provider_from_argument(p, **opts, &block)
|
40
38
|
case p
|
41
|
-
|
39
|
+
when String, Symbol
|
42
40
|
provider_class_name = "#{p.to_s.capitalize}Provider"
|
43
41
|
Sym::App::Password::Providers.const_defined?(provider_class_name) ?
|
44
42
|
Sym::App::Password::Providers.const_get(provider_class_name).new(**opts, &block) :
|
@@ -53,4 +51,3 @@ end
|
|
53
51
|
|
54
52
|
# Order is important — they are tried in this order for auto detect
|
55
53
|
require 'sym/app/password/providers/memcached_provider'
|
56
|
-
require 'sym/app/password/providers/drb_provider'
|
@@ -31,10 +31,10 @@ module Sym
|
|
31
31
|
rescue ::OpenSSL::Cipher::CipherError => e
|
32
32
|
input_handler.puts 'Invalid password. Please try again.'
|
33
33
|
|
34
|
-
if (
|
34
|
+
if (retries += 1) < 3
|
35
35
|
retry
|
36
36
|
else
|
37
|
-
raise(Sym::Errors::
|
37
|
+
raise(Sym::Errors::WrongPasswordForKey.new('Invalid password.'))
|
38
38
|
end
|
39
39
|
end
|
40
40
|
else
|
@@ -23,11 +23,10 @@ module Sym
|
|
23
23
|
# procs on a given string.
|
24
24
|
def read!
|
25
25
|
KeySourceCheck::CHECKS.each do |source_check|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
26
|
+
next unless result = source_check.detect(self) rescue nil
|
27
|
+
if key_ = normalize_key(result.key)
|
28
|
+
key_source_ = result.to_s
|
29
|
+
return key_, key_source_
|
31
30
|
end
|
32
31
|
end
|
33
32
|
nil
|
@@ -51,8 +50,6 @@ module Sym
|
|
51
50
|
rescue
|
52
51
|
nil
|
53
52
|
end
|
54
|
-
else
|
55
|
-
nil
|
56
53
|
end
|
57
54
|
end
|
58
55
|
end
|
@@ -16,9 +16,8 @@ module Sym
|
|
16
16
|
attr_accessor :name, :reducted, :input, :output
|
17
17
|
|
18
18
|
def initialize(name:,
|
19
|
-
reducted: false,
|
20
|
-
input: ->(detector) { detector.opts[:key] }
|
21
|
-
output:)
|
19
|
+
output:, reducted: false,
|
20
|
+
input: ->(detector) { detector.opts[:key] })
|
22
21
|
|
23
22
|
self.name = name
|
24
23
|
self.reducted = reducted
|
data/lib/sym/application.rb
CHANGED
@@ -31,8 +31,7 @@ module Sym
|
|
31
31
|
:password_cache,
|
32
32
|
:stdin, :stdout, :stderr, :kernel
|
33
33
|
|
34
|
-
def initialize(opts, stdin =
|
35
|
-
|
34
|
+
def initialize(opts, stdin = $stdin, stdout = $stdout, stderr = $stderr, kernel = nil)
|
36
35
|
self.stdin = stdin
|
37
36
|
self.stdout = stdout
|
38
37
|
self.stderr = stderr
|
@@ -111,16 +110,12 @@ module Sym
|
|
111
110
|
end
|
112
111
|
|
113
112
|
def editor
|
114
|
-
editors_to_try.find { |editor| File.exist?(editor) }
|
113
|
+
editors_to_try.compact.find { |editor| File.exist?(editor) }
|
115
114
|
end
|
116
115
|
|
117
116
|
def process_output(result)
|
118
|
-
unless result.is_a?(Hash)
|
119
|
-
|
120
|
-
result
|
121
|
-
else
|
122
|
-
result
|
123
|
-
end
|
117
|
+
self.output.call(result) unless result.is_a?(Hash)
|
118
|
+
result
|
124
119
|
end
|
125
120
|
|
126
121
|
private
|
@@ -182,7 +177,7 @@ module Sym
|
|
182
177
|
args[:verbose] = opts[:verbose]
|
183
178
|
args[:provider] = opts[:cache_provider] if opts[:cache_provider]
|
184
179
|
|
185
|
-
self.password_cache = Sym::App::Password::Cache.instance.configure(args)
|
180
|
+
self.password_cache = Sym::App::Password::Cache.instance.configure(**args)
|
186
181
|
end
|
187
182
|
|
188
183
|
def process_edit_option
|
@@ -207,7 +202,7 @@ module Sym
|
|
207
202
|
end
|
208
203
|
|
209
204
|
def initialize_action
|
210
|
-
self.action = if opts[:encrypt]
|
205
|
+
self.action = if opts[:encrypt]
|
211
206
|
:encr
|
212
207
|
elsif opts[:decrypt]
|
213
208
|
:decr
|
@@ -217,7 +212,7 @@ module Sym
|
|
217
212
|
# If we are encrypting or decrypting, and no data has been provided, check if we
|
218
213
|
# should read from STDIN
|
219
214
|
def initialize_data_source
|
220
|
-
if self.action && opts[:string].nil? && opts[:file].nil? && !
|
215
|
+
if self.action && opts[:string].nil? && opts[:file].nil? && !self.stdin.tty?
|
221
216
|
opts[:file] = '-'
|
222
217
|
end
|
223
218
|
end
|
@@ -229,9 +224,9 @@ module Sym
|
|
229
224
|
detect_key_source
|
230
225
|
if args.require_key? && !self.key
|
231
226
|
log :error, 'Unable to determine the key, which appears to be required with current args'
|
232
|
-
raise Sym::Errors::NoPrivateKeyFound,
|
227
|
+
raise Sym::Errors::NoPrivateKeyFound, "Private key is required when #{self.action ? "#{self.action.to_s}ypting" : provided_flags.join(', ')}"
|
233
228
|
end
|
234
|
-
log :debug, "initialize_key_source: detected key ends with [...#{(key ? key[-5
|
229
|
+
log :debug, "initialize_key_source: detected key ends with [...#{(key ? key[-5..] : 'nil').bold.magenta}]"
|
235
230
|
log :debug, "opts: #{self.provided_value_options.to_s.green.bold}"
|
236
231
|
log :debug, "flags: #{self.provided_flags.to_s.green.bold}"
|
237
232
|
end
|
data/lib/sym/configuration.rb
CHANGED
@@ -35,10 +35,6 @@ module Sym
|
|
35
35
|
|
36
36
|
# See file +lib/sym.rb+ where these values are defined.
|
37
37
|
|
38
|
-
attr_accessor :data_cipher, :password_cipher, :private_key_cipher
|
39
|
-
attr_accessor :compression_enabled, :compression_level
|
40
|
-
attr_accessor :password_cache_default_provider, :password_cache_timeout
|
41
|
-
attr_accessor :password_cache_arguments
|
42
|
-
attr_accessor :default_key_file, :encrypted_file_extension
|
38
|
+
attr_accessor :data_cipher, :password_cipher, :private_key_cipher, :compression_enabled, :compression_level, :password_cache_default_provider, :password_cache_timeout, :password_cache_arguments, :default_key_file, :encrypted_file_extension
|
43
39
|
end
|
44
40
|
end
|
data/lib/sym/constants.rb
CHANGED
@@ -1,43 +1,59 @@
|
|
1
1
|
require 'logger'
|
2
2
|
module Sym
|
3
|
+
#
|
4
|
+
# This module is responsible for installing Sym BASH extensions.
|
5
|
+
#
|
3
6
|
module Constants
|
4
|
-
module Bash
|
5
7
|
|
6
|
-
|
8
|
+
BASH_FILES = Dir.glob("#{File.expand_path('../../bin', __dir__)}/sym.*.bash").freeze
|
7
9
|
|
8
|
-
|
10
|
+
class << self
|
11
|
+
attr_reader :user_home
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
13
|
+
def user_home=(value)
|
14
|
+
@user_home = value
|
15
|
+
register_bash_files!
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
+
def config
|
19
|
+
@config ||= {}
|
20
|
+
end
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
+
def sym_key_file
|
23
|
+
"#{user_home}/.sym.key"
|
24
|
+
end
|
22
25
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
script: "[[ -f #{home_file} ]] && source #{home_file}"
|
27
|
-
}
|
26
|
+
def register_bash_files!
|
27
|
+
BASH_FILES.each do |bash_file|
|
28
|
+
register_bash_extension bash_file
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
|
-
|
32
|
+
private
|
33
|
+
|
34
|
+
def register_bash_extension(bash_file)
|
35
|
+
return unless user_home && Dir.exist?(user_home)
|
36
|
+
|
37
|
+
source_file = File.basename(bash_file)
|
38
|
+
home_file = "#{user_home}/.#{source_file}"
|
39
|
+
config_key = source_file.gsub(/sym\./, '').gsub(/\.bash/, '').to_sym
|
40
|
+
|
41
|
+
config[config_key] = {
|
42
|
+
dest: home_file,
|
43
|
+
source: bash_file,
|
44
|
+
script: "[[ -f #{home_file} ]] && source #{home_file}"
|
45
|
+
}
|
46
|
+
end
|
32
47
|
end
|
33
48
|
|
49
|
+
self.user_home ||= ::Dir.home rescue nil
|
50
|
+
self.user_home ||= '/tmp'
|
51
|
+
|
52
|
+
self.register_bash_files!
|
53
|
+
|
34
54
|
module Log
|
35
55
|
NIL = Logger.new(nil).freeze # empty logger
|
36
|
-
LOG = Logger.new(
|
56
|
+
LOG = Logger.new($stderr).freeze
|
37
57
|
end
|
38
|
-
|
39
|
-
ENV_ARGS_VARIABLE_NAME = 'SYM_ARGS'.freeze
|
40
|
-
SYM_KEY_FILE = "#{ENV['HOME']}/.sym.key"
|
41
|
-
|
42
58
|
end
|
43
59
|
end
|