Class: Travis::CLI::Sshkey
Constant Summary
Constants inherited
from RepoCommand
RepoCommand::GIT_REGEX, RepoCommand::TRAVIS
Constants inherited
from Command
Command::DAY, Command::HOUR, Command::MINUTE, Command::WEEK
Tools::Assets::BASE
Instance Attribute Summary
Attributes inherited from RepoCommand
#slug
Attributes inherited from ApiCommand
#enterprise_name, #session
Attributes inherited from Command
#arguments, #config, #debug, #force_interactive, #formatter, #input, #output
Instance Method Summary
collapse
Methods inherited from RepoCommand
#repository, #setup
Methods inherited from ApiCommand
#authenticate, #detected_endpoint?, #endpoint_config, #enterprise?, #initialize, #org?, #pro?, #setup, #sync
#access_token, #access_token=, #account, #accounts, #api_endpoint, #api_endpoint=, #artifact, #broadcasts, #build, #cancel, #explicit_api_endpoint?, #github_auth, #hooks, #job, #lint, #listen, #repo, #repos, #restart, #user
Methods inherited from Command
abstract, abstract?, #check_completion, #check_ruby, #check_version, command_name, #command_name, #debug?, description, #execute, #help, #info, #initialize, #last_check, #on_signal, #parse, #say, #setup, skip, subcommands, #terminal, #time, #usage, #usage_for, #write_to
#asset, #asset_path
Methods included from Parser
#new, #on, #on_initialize
Instance Method Details
#check_access(gh) ⇒ Object
88
89
90
91
92
|
# File 'lib/travis/cli/sshkey.rb', line 88
def check_access(gh)
gh["repos/#{slug}"]
rescue GH::Error
error "GitHub account has no read access to #{color slug, :bold}"
end
|
#delete_key ⇒ Object
45
46
47
48
49
50
51
|
# File 'lib/travis/cli/sshkey.rb', line 45
def delete_key
return if interactive? and not danger_zone? "Remove SSH key for #{color slug, :info}?"
say "Removing ssh key for #{color slug, :info}"
ssh_key.delete
rescue Travis::Client::NotFound
warn "no key found to remove"
end
|
#display_key ⇒ Object
28
29
30
31
32
33
34
|
# File 'lib/travis/cli/sshkey.rb', line 28
def display_key
say "Current SSH key: #{color(ssh_key.description, :info)}"
say "Finger print: #{color(ssh_key.fingerprint, :info)}"
rescue Travis::Client::NotFound
say "No custom SSH key installed."
exit 1 if check?
end
|
#generate_key ⇒ Object
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/travis/cli/sshkey.rb', line 53
def generate_key
github.with_basic_auth do |gh|
login = gh['user']['login']
check_access(gh)
empty_line
say "Generating RSA key."
private_key = Tools::SSLKey.generate_rsa
self.description ||= "key for fetching dependencies for #{slug} via #{login}"
say "Uploading public key to GitHub."
gh.post("/user/keys", :title => "#{description} (Travis CI)", :key => Tools::SSLKey.rsa_ssh(private_key.public_key))
say "Uploading private key to Travis CI."
ssh_key.update(:value => private_key.to_s, :description => description)
empty_line
say "You can store the private key to reuse it for other repositories (travis sshkey --upload FILE)."
if agree("Store private key? ") { |q| q.default = "no" }
path = ask("Path: ") { |q| q.default = "id_travis_rsa" }
File.write(path, private_key.to_s)
end
end
end
|
#github ⇒ Object
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
# File 'lib/travis/cli/sshkey.rb', line 94
def github
@github ||= begin
load_gh
Tools::Github.new(session.config['github']) do |g|
g.note = "token for fetching dependencies for #{slug} (Travis CI)"
g.explode = explode?
g.ask_login = proc { ask("Username: ") }
g.ask_password = proc { |user| ask("Password for #{user}: ") { |q| q.echo = "*" } }
g.ask_otp = proc { |user| ask("Two-factor authentication code for #{user}: ") }
g. = proc { }
g.debug = proc { |log| debug(log) }
g.after_tokens = proc { g.explode = true and error("no suitable github token found") }
end
end
end
|
110
111
112
113
114
115
|
# File 'lib/travis/cli/sshkey.rb', line 110
def
say "We need the #{color("GitHub login", :important)} for the account you want to add the key to."
say "This information will #{color("not be sent to Travis CI", :important)}, only to #{color(github_endpoint.host, :info)}."
say "The password will not be displayed."
empty_line
end
|
#remove_passphrase(value) ⇒ Object
78
79
80
81
82
83
84
85
86
|
# File 'lib/travis/cli/sshkey.rb', line 78
def remove_passphrase(value)
return value unless Tools::SSLKey.has_passphrase? value
return Tools::SSLKey.remove_passphrase(value, passphrase) || error("wrong pass phrase") if passphrase
error "Key is encrypted, but missing --passphrase option" unless interactive?
say "The private key is protected by a pass phrase."
result = Tools::SSLKey.remove_passphrase(value, ask("Enter pass phrase: ") { |q| q.echo = "*" }) until result
empty_line
result
end
|
#run ⇒ Object
19
20
21
22
23
24
25
26
|
# File 'lib/travis/cli/sshkey.rb', line 19
def run
error "SSH keys are not available on #{color(session.config['host'], :bold)}" if org?
delete_key if delete?
update_key File.read(upload), upload if upload?
update_key $stdin.read, 'stdin' if stdin?
generate_key if generate?
display_key
end
|
#update_key(value, file) ⇒ Object
36
37
38
39
40
41
42
43
|
# File 'lib/travis/cli/sshkey.rb', line 36
def update_key(value, file)
error "#{file} does not look like a private key" unless value.lines.first =~ /PRIVATE KEY/
value = remove_passphrase(value)
self.description ||= ask("Key description: ") { |q| q.default = "Custom Key" } if interactive?
say "Updating ssh key for #{color slug, :info} with key from #{color file, :info}"
empty_line
ssh_key.update(:value => value, :description => description || file)
end
|