autossh 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +20 -0
- data/README.md +30 -0
- data/assh_completion.sh +6 -0
- data/autossh.gemspec +15 -0
- data/bin/assh +4 -0
- data/examples/config.yml +28 -0
- data/examples/example_aws.yml +8 -0
- data/examples/example_include.yml +43 -0
- data/examples/random.yml +11 -0
- data/lib/autossh.rb +24 -0
- data/lib/command.rb +77 -0
- data/lib/configuration.rb +55 -0
- data/lib/generator.rb +20 -0
- data/lib/helpers.rb +11 -0
- data/lib/host.rb +46 -0
- data/lib/provider.rb +61 -0
- data/lib/providers/aws_provider.rb +67 -0
- data/lib/providers/file_provider.rb +54 -0
- data/lib/providers/random_provider.rb +23 -0
- metadata +64 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 422069342456b2404cae7a17b2c5d295107406b2
|
4
|
+
data.tar.gz: 10a10355f20583451dcb018d657afb8ead2c7e9a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fe533461dd980868e15f4fadd8ed0eaf91b3b2eb8f9ed95d64e083aa8042f6e2fd7f91e01e471e8c00e79bdec68d947c9843f17457de83147951cfa277433967
|
7
|
+
data.tar.gz: 0daa89f3800cb89908093fe642e303bd1e62c386307540beeb253c8e91b69cd02164a0e3ede23a0d1bcd6edf963f2aa5e6a876422d50378b0c9b8718cc355925
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
aws-sdk (1.54.0)
|
5
|
+
aws-sdk-v1 (= 1.54.0)
|
6
|
+
aws-sdk-v1 (1.54.0)
|
7
|
+
json (~> 1.4)
|
8
|
+
nokogiri (>= 1.4.4)
|
9
|
+
colorize (0.7.3)
|
10
|
+
json (1.8.1)
|
11
|
+
mini_portile (0.6.0)
|
12
|
+
nokogiri (1.6.3.1)
|
13
|
+
mini_portile (= 0.6.0)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
ruby
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
aws-sdk
|
20
|
+
colorize
|
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
Available on Rubygems at https://rubygems.org/gems/autossh
|
2
|
+
|
3
|
+
Github repository at https://github.com/paul-ridgway/autossh
|
4
|
+
|
5
|
+
To Install
|
6
|
+
==========
|
7
|
+
|
8
|
+
1. Clone the repository
|
9
|
+
|
10
|
+
2. Ensure aash is available on the PATH:
|
11
|
+
|
12
|
+
ln -s /full/path/to/assh /usr/local/bin/assh
|
13
|
+
|
14
|
+
|
15
|
+
To do
|
16
|
+
=====
|
17
|
+
|
18
|
+
1. Example configurations
|
19
|
+
|
20
|
+
2. Safely handle no config (make dir, etc)
|
21
|
+
|
22
|
+
3. Validate config files
|
23
|
+
|
24
|
+
4. Gemify?
|
25
|
+
|
26
|
+
5. Command line override config path (to test examples, and other uses)
|
27
|
+
|
28
|
+
6. Decent logger/log levels, etc
|
29
|
+
|
30
|
+
7. Tests
|
data/assh_completion.sh
ADDED
data/autossh.gemspec
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'autossh'
|
3
|
+
s.version = '0.0.3'
|
4
|
+
s.date = '2015-02-01'
|
5
|
+
s.summary = "AutoSSH"
|
6
|
+
s.description = "An SSH connection helper"
|
7
|
+
s.authors = ["Paul Ridgway"]
|
8
|
+
s.email = 'myself@paulridgway.co.uk'
|
9
|
+
s.homepage = 'https://github.com/paul-ridgway/autossh'
|
10
|
+
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
13
|
+
|
14
|
+
s.executables << 'assh'
|
15
|
+
end
|
data/bin/assh
ADDED
data/examples/config.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
---
|
2
|
+
|
3
|
+
Includes: [example_include.yml, example_aws.yml, random.yml]
|
4
|
+
|
5
|
+
Port: 22
|
6
|
+
IdentityFile: ~/.ssh/id_rsa
|
7
|
+
|
8
|
+
Groups:
|
9
|
+
|
10
|
+
- Group: Home
|
11
|
+
Port: 22
|
12
|
+
User: other
|
13
|
+
Hosts:
|
14
|
+
- Host: nas
|
15
|
+
HostName: 192.168.1.1
|
16
|
+
|
17
|
+
- Group: Personal
|
18
|
+
Port: 22
|
19
|
+
User: me
|
20
|
+
Hosts:
|
21
|
+
- Host: a1-vm
|
22
|
+
HostName: 1a-vm.example.com
|
23
|
+
- Host: 2b-vm
|
24
|
+
HostName: 2b-vm.example.com
|
25
|
+
- Host: 3c-vm
|
26
|
+
HostName: 3c-vm.example.com
|
27
|
+
- Host: 4d
|
28
|
+
HostName: 4d.example.com
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
|
3
|
+
Groups:
|
4
|
+
- Group: Blade Custer
|
5
|
+
Port: 2212
|
6
|
+
User: bladeuser
|
7
|
+
IdentityFile: ~/.ssh/blade_key
|
8
|
+
StrictHostKeyChecking: no
|
9
|
+
UserKnownHostsFile: /dev/null
|
10
|
+
LogLevel: quiet
|
11
|
+
Hosts:
|
12
|
+
- Host: node-01
|
13
|
+
HostName: 10.10.11.101
|
14
|
+
- Host: node-02
|
15
|
+
HostName: 10.10.11.102
|
16
|
+
- Host: node-03
|
17
|
+
HostName: 10.10.11.103
|
18
|
+
- Host: node-04
|
19
|
+
HostName: 10.10.11.104
|
20
|
+
- Host: node-05
|
21
|
+
HostName: 10.10.11.105
|
22
|
+
- Host: node-06
|
23
|
+
HostName: 10.10.11.106
|
24
|
+
- Host: node-07
|
25
|
+
HostName: 10.10.11.107
|
26
|
+
- Host: node-08
|
27
|
+
HostName: 10.10.11.108
|
28
|
+
- Host: node-09
|
29
|
+
HostName: 10.10.11.109
|
30
|
+
- Host: node-10
|
31
|
+
HostName: 10.10.11.110
|
32
|
+
- Host: node-11
|
33
|
+
HostName: 10.10.11.111
|
34
|
+
- Host: node-12
|
35
|
+
HostName: 10.10.11.112
|
36
|
+
- Host: node-13
|
37
|
+
HostName: 10.10.11.113
|
38
|
+
- Host: node-14
|
39
|
+
HostName: 10.10.11.114
|
40
|
+
- Host: node-15
|
41
|
+
HostName: 10.10.11.115
|
42
|
+
- Host: node-16
|
43
|
+
HostName: 10.10.11.116
|
data/examples/random.yml
ADDED
data/lib/autossh.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'colorize'
|
3
|
+
|
4
|
+
require_relative 'helpers'
|
5
|
+
require_relative 'configuration'
|
6
|
+
require_relative 'provider'
|
7
|
+
require_relative 'providers/file_provider'
|
8
|
+
require_relative 'providers/random_provider'
|
9
|
+
require_relative 'providers/aws_provider'
|
10
|
+
require_relative 'command'
|
11
|
+
require_relative 'generator'
|
12
|
+
require_relative 'host'
|
13
|
+
|
14
|
+
module Assh
|
15
|
+
|
16
|
+
ROOT = File.expand_path('~/.autossh')
|
17
|
+
|
18
|
+
GENERATED_CONFIG = "#{ROOT}/.assh-generated-config"
|
19
|
+
CONFIG_CACHE = "#{ROOT}/.assh-config-cache"
|
20
|
+
CONFIG_CACHE_AT = "#{ROOT}/.assh-config-cached-at"
|
21
|
+
|
22
|
+
VERSION = '0.0.3'
|
23
|
+
|
24
|
+
end
|
data/lib/command.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
module Assh
|
2
|
+
|
3
|
+
class Command
|
4
|
+
|
5
|
+
def initialize(argv)
|
6
|
+
@args = argv
|
7
|
+
parse_arguments!
|
8
|
+
|
9
|
+
@configuration = Configuration.new
|
10
|
+
|
11
|
+
@generator = Generator.new
|
12
|
+
|
13
|
+
Provider.verbose! if @cmd_generate
|
14
|
+
|
15
|
+
if @configuration.needs_generating? || @cmd_generate
|
16
|
+
puts "Refreshing..."
|
17
|
+
Provider.load_configuration!(@configuration, 'config.yml')
|
18
|
+
@configuration.save_cache!
|
19
|
+
else
|
20
|
+
@configuration.load_cache!
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def execute!
|
26
|
+
if @cmd_ls
|
27
|
+
puts "Host List (cached at #{Time.at(@configuration.generated_at)})".green
|
28
|
+
max_name = 0
|
29
|
+
@configuration.groups.each do |name, hosts|
|
30
|
+
hosts.each do |name, host|
|
31
|
+
max_name = name.size if name.size > max_name
|
32
|
+
end
|
33
|
+
end
|
34
|
+
@configuration.groups.each do |name, hosts|
|
35
|
+
puts " #{name.yellow}"
|
36
|
+
hosts = Hash[hosts.sort]
|
37
|
+
hosts.each do |name, host|
|
38
|
+
padded_name = name + (" " * (max_name - name.size))
|
39
|
+
puts " #{padded_name.light_white} #{"-".green} #{host.address.cyan}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
elsif @cmd_generate
|
43
|
+
puts "Generating config in #{@generator.output_file}"
|
44
|
+
generate!
|
45
|
+
puts "Done"
|
46
|
+
else
|
47
|
+
generate!
|
48
|
+
execute_default!
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def parse_arguments!
|
54
|
+
return unless @args.size > 0
|
55
|
+
first_arg = @args[0].downcase
|
56
|
+
if first_arg == 'ls'
|
57
|
+
@cmd_ls = true
|
58
|
+
elsif first_arg == 'generate'
|
59
|
+
@cmd_generate = true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def generate!
|
64
|
+
#Generates up-to-date config
|
65
|
+
@generator.run!(@configuration.hosts)
|
66
|
+
end
|
67
|
+
|
68
|
+
def execute_default!
|
69
|
+
# Generates safe args and replaces assh process with ssh call
|
70
|
+
args = @args.map { |x| x.include?(' ') ? "\"#{x}\"" : x }.join(' ')
|
71
|
+
command = "ssh -F #{Assh::GENERATED_CONFIG} #{args}"
|
72
|
+
exec(command)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Assh
|
2
|
+
|
3
|
+
class Configuration
|
4
|
+
|
5
|
+
attr_accessor :hosts, :groups
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@hosts = {}
|
9
|
+
@groups = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_host(group_name, host_name, host)
|
13
|
+
puts "WARNING: Duplicate host named: #{name}. Only latest host is included" if @hosts[host_name]
|
14
|
+
|
15
|
+
@groups[group_name] = {} unless @groups.has_key?(group_name)
|
16
|
+
@groups[group_name][host_name] = host
|
17
|
+
@hosts[host_name] = host
|
18
|
+
end
|
19
|
+
|
20
|
+
#TODO: Move generated-at to here and call config-cached-at
|
21
|
+
|
22
|
+
def save_cache!(config_file = File.expand_path(Assh::CONFIG_CACHE),
|
23
|
+
timestamp_file = File.expand_path(Assh::CONFIG_CACHE_AT))
|
24
|
+
cache = {
|
25
|
+
hosts: @hosts,
|
26
|
+
groups: @groups
|
27
|
+
}
|
28
|
+
File.open(config_file, 'w') { |f| f << cache.to_yaml }
|
29
|
+
File.open(timestamp_file, 'w') { |f| f << current_time }
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
def load_cache!(config_file = File.expand_path(Assh::CONFIG_CACHE))
|
34
|
+
cache = YAML::load_file(config_file)
|
35
|
+
@hosts = cache[:hosts]
|
36
|
+
@groups = cache[:groups]
|
37
|
+
end
|
38
|
+
|
39
|
+
def needs_generating?(timestamp_file = File.expand_path(Assh::CONFIG_CACHE_AT))
|
40
|
+
(current_time - generated_at(timestamp_file)) > 72000
|
41
|
+
end
|
42
|
+
|
43
|
+
def generated_at(timestamp_file = File.expand_path(Assh::CONFIG_CACHE_AT))
|
44
|
+
return File.read(timestamp_file).to_i if File.exists?(timestamp_file)
|
45
|
+
0
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def current_time
|
50
|
+
Time.now.to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/lib/generator.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Assh
|
2
|
+
class Generator
|
3
|
+
|
4
|
+
attr_accessor :output_file
|
5
|
+
|
6
|
+
def initialize(output_file = File.expand_path(Assh::GENERATED_CONFIG))
|
7
|
+
@output_file = output_file
|
8
|
+
end
|
9
|
+
|
10
|
+
def run!(hosts)
|
11
|
+
File.open(@output_file, 'w') do |f|
|
12
|
+
hosts.each do |_, host|
|
13
|
+
f << host.to_ssh_config
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/lib/helpers.rb
ADDED
data/lib/host.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'providers/file_provider'
|
2
|
+
|
3
|
+
module Assh
|
4
|
+
|
5
|
+
class Host
|
6
|
+
|
7
|
+
PORT_KEY = "Port"
|
8
|
+
HOST_KEY = Assh::FileProvider::HOST_KEY
|
9
|
+
HOSTNAME_KEY = "HostName"
|
10
|
+
HOSTS_KEY = Assh::FileProvider::HOSTS_KEY
|
11
|
+
GROUP_KEY = Assh::FileProvider::GROUP_KEY
|
12
|
+
GROUPS_KEY = Assh::FileProvider::GROUPS_KEY
|
13
|
+
|
14
|
+
|
15
|
+
attr_accessor :name, :hostname, :port
|
16
|
+
|
17
|
+
def initialize(params)
|
18
|
+
raise 'Unexpected params type' unless params.is_a? Hash
|
19
|
+
@name = params.delete(HOST_KEY)
|
20
|
+
@hostname = params.delete(HOSTNAME_KEY)
|
21
|
+
@port = params.delete(PORT_KEY) || 22
|
22
|
+
@params = params
|
23
|
+
end
|
24
|
+
|
25
|
+
def address
|
26
|
+
"#{hostname}:#{port}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
"#{name} - #{hostname}:#{port}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_ssh_config
|
34
|
+
f = ""
|
35
|
+
f << "Host #{name}\n"
|
36
|
+
f << " Hostname #{hostname}\n"
|
37
|
+
f << " Port #{port}\n"
|
38
|
+
@params.each do |k,v|
|
39
|
+
f << " #{k} #{v}\n"
|
40
|
+
end
|
41
|
+
f
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/lib/provider.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
module Assh
|
2
|
+
|
3
|
+
class Provider
|
4
|
+
|
5
|
+
@@verbose = false
|
6
|
+
|
7
|
+
@@providers ||= {}
|
8
|
+
|
9
|
+
def initialize(configuration)
|
10
|
+
@configuration = configuration
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.load_configuration!(configuration, file)
|
14
|
+
status "Loading: #{file}"
|
15
|
+
|
16
|
+
config = YAML::load_file(File.expand_path(file, Assh::ROOT))
|
17
|
+
|
18
|
+
includes = config.delete(Assh::FileProvider::INCLUDES_KEY) || []
|
19
|
+
|
20
|
+
provider_name = (config.delete('Provider') || 'file').downcase
|
21
|
+
provider_class = @@providers[provider_name]
|
22
|
+
raise "Provider not found: #{provider_name}" unless provider_class
|
23
|
+
|
24
|
+
provider = provider_class.new(configuration)
|
25
|
+
provider.parse_config!(config)
|
26
|
+
|
27
|
+
includes.each do |inc|
|
28
|
+
Provider.load_configuration!(configuration, File.expand_path(inc, ROOT))
|
29
|
+
end
|
30
|
+
|
31
|
+
provider
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_config!(config)
|
35
|
+
raise 'parse_config! must be overridden'
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_host(group_name, host_name, host)
|
39
|
+
@configuration.add_host(group_name, host_name, host)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.status(message = "", inline = false)
|
43
|
+
return unless @@verbose
|
44
|
+
if inline
|
45
|
+
print message
|
46
|
+
else
|
47
|
+
puts message
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.verbose!
|
52
|
+
@@verbose = true
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.register_provider!(name, clazz)
|
56
|
+
@@providers[name] = clazz
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module Assh
|
4
|
+
|
5
|
+
class AwsProvider < Assh::Provider
|
6
|
+
|
7
|
+
def initialize(configuration)
|
8
|
+
super(configuration)
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse_config!(config)
|
12
|
+
return unless config
|
13
|
+
raise 'Unexpected config type' unless config.is_a? Hash
|
14
|
+
|
15
|
+
name_match = config.delete 'NameMatch'
|
16
|
+
access_key_id = config.delete 'AccessKeyId'
|
17
|
+
secret_access_key = config.delete 'SecretAccessKey'
|
18
|
+
|
19
|
+
AWS.config(
|
20
|
+
access_key_id: access_key_id,
|
21
|
+
secret_access_key: secret_access_key)
|
22
|
+
|
23
|
+
|
24
|
+
Provider::status "Downloading regions list..."
|
25
|
+
|
26
|
+
regions = AWS.ec2.regions.map { |r| r.name }
|
27
|
+
|
28
|
+
Provider::status "Downloading instances..."
|
29
|
+
|
30
|
+
regions.each do |region|
|
31
|
+
|
32
|
+
ec2 = AWS::EC2.new(
|
33
|
+
access_key_id: access_key_id,
|
34
|
+
secret_access_key: secret_access_key,
|
35
|
+
region: region)
|
36
|
+
|
37
|
+
hosts = {}
|
38
|
+
ec2.instances.each do |i|
|
39
|
+
Provider::status '.', true
|
40
|
+
name = (i.tags.Name || i.instance_id).underscore
|
41
|
+
ip = i.public_ip_address
|
42
|
+
hosts[name] = ip
|
43
|
+
end
|
44
|
+
|
45
|
+
hosts.each do |name, ip|
|
46
|
+
|
47
|
+
if name_match
|
48
|
+
m = Regexp.new(name_match).match(name)
|
49
|
+
if m
|
50
|
+
name = m.captures[0]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
add_host(region, name, Host.new(config.merge({'Host' => name, 'HostName' => ip})))
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
Provider::status
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
Assh::Provider.register_provider!("aws", Assh::AwsProvider)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative '../provider'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Assh
|
5
|
+
|
6
|
+
class FileProvider < Provider
|
7
|
+
|
8
|
+
ROOT = File.expand_path('~/.autossh')
|
9
|
+
|
10
|
+
INCLUDES_KEY = "Includes"
|
11
|
+
HOST_KEY = "Host"
|
12
|
+
HOSTS_KEY = "Hosts"
|
13
|
+
GROUP_KEY = "Group"
|
14
|
+
GROUPS_KEY = "Groups"
|
15
|
+
|
16
|
+
def initialize(configuration)
|
17
|
+
super(configuration)
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_config!(config)
|
21
|
+
return unless config
|
22
|
+
raise 'Unexpected config type' unless config.is_a? Hash
|
23
|
+
|
24
|
+
groups = config.delete(GROUPS_KEY)
|
25
|
+
|
26
|
+
if hosts = config.delete(HOSTS_KEY)
|
27
|
+
groups << {GROUP_KEY => 'ungrouped', HOSTS_KEY => hosts}
|
28
|
+
end
|
29
|
+
|
30
|
+
groups.each { |g| parse_group!(config, g) }
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def parse_group!(parent_config, group)
|
35
|
+
return unless group
|
36
|
+
parent_config ||= {}
|
37
|
+
name = group.delete(GROUP_KEY)
|
38
|
+
hosts = group.delete(HOSTS_KEY)
|
39
|
+
hosts.each { |h| parse_host!(name, parent_config.merge(group), h) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse_host!(group_name, parent_config, host)
|
43
|
+
return unless host
|
44
|
+
parent_config ||= {}
|
45
|
+
name = host[HOST_KEY]
|
46
|
+
|
47
|
+
add_host(group_name, name, Host.new(parent_config.merge(host)))
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
Assh::Provider.register_provider!("file", Assh::FileProvider)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative '../provider'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Assh
|
5
|
+
|
6
|
+
class RandomProvider < Provider
|
7
|
+
|
8
|
+
def initialize(configuration)
|
9
|
+
super(configuration)
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse_config!(config)
|
13
|
+
return unless config
|
14
|
+
raise 'Unexpected config type' unless config.is_a? Hash
|
15
|
+
|
16
|
+
add_host('Random', 'rnd', Host.new({'Host' => 'rnd', 'HostName' => '123.1.2.3'}))
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
Assh::Provider.register_provider!("random", Assh::RandomProvider)
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: autossh
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Paul Ridgway
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-01 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: An SSH connection helper
|
14
|
+
email: myself@paulridgway.co.uk
|
15
|
+
executables:
|
16
|
+
- assh
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ".gitignore"
|
21
|
+
- Gemfile
|
22
|
+
- Gemfile.lock
|
23
|
+
- README.md
|
24
|
+
- assh_completion.sh
|
25
|
+
- autossh.gemspec
|
26
|
+
- bin/assh
|
27
|
+
- examples/config.yml
|
28
|
+
- examples/example_aws.yml
|
29
|
+
- examples/example_include.yml
|
30
|
+
- examples/random.yml
|
31
|
+
- lib/autossh.rb
|
32
|
+
- lib/command.rb
|
33
|
+
- lib/configuration.rb
|
34
|
+
- lib/generator.rb
|
35
|
+
- lib/helpers.rb
|
36
|
+
- lib/host.rb
|
37
|
+
- lib/provider.rb
|
38
|
+
- lib/providers/aws_provider.rb
|
39
|
+
- lib/providers/file_provider.rb
|
40
|
+
- lib/providers/random_provider.rb
|
41
|
+
homepage: https://github.com/paul-ridgway/autossh
|
42
|
+
licenses: []
|
43
|
+
metadata: {}
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 2.4.5
|
61
|
+
signing_key:
|
62
|
+
specification_version: 4
|
63
|
+
summary: AutoSSH
|
64
|
+
test_files: []
|