cow 0.1.1

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.
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cow.gemspec
4
+ gemspec
@@ -0,0 +1,43 @@
1
+ # Cow
2
+
3
+ Cow - console server wrapper.
4
+
5
+ ## Installation
6
+
7
+ `gem install cow`
8
+
9
+ `mkdir /var/cache/cow`
10
+
11
+ `sudo cow add [hostname] [type] [community]`
12
+
13
+ ## Usage
14
+
15
+ Type `cow`. Then you can see usage.
16
+
17
+ `cow update` should be run periodically.
18
+
19
+ ## Example
20
+
21
+ ```
22
+ $ cow list
23
+ console.local/1 - tokyo-core01 | ssh -l kazubu:7001 console.local
24
+ console.local/2 - tokyo-core02 | ssh -l kazubu:7002 console.local
25
+ console.local/3 - tokyo-sw01 | ssh -l kazubu:7003 console.local
26
+ console.local/4 - tokyo-sw02 | ssh -l kazubu:7004 console.local
27
+ console.local/5 - tokyo-serv01 | ssh -l kazubu:7005 console.local
28
+ console.local/6 - tokyo-serv02 | ssh -l kazubu:7006 console.local
29
+ console.local/7 - tokyo-serv03 | ssh -l kazubu:7007 console.local
30
+ console.local/8 - 0F-B3-10P08 | ssh -l kazubu:7008 console.local
31
+
32
+ $ cow find core
33
+ console.local/1 - tokyo-core01 | ssh -l kazubu:7001 console.local
34
+ console.local/2 - tokyo-core02 | ssh -l kazubu:7002 console.local
35
+
36
+ $ cow connect tokyo-core01
37
+ Found on console.local/1. Connecting...
38
+ Password:
39
+
40
+ tokyo-core01 (ttyd0)
41
+
42
+ login:
43
+ ```
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "cow"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cow/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cow"
8
+ spec.version = Cow::VERSION
9
+ spec.authors = ["Kazuki Shimizu"]
10
+ spec.email = ["kazubu@kazubu.jp"]
11
+
12
+ spec.summary = %q{Console server Wrapper}
13
+ spec.description = %q{Ease to connect console server ports}
14
+ spec.homepage = "https://www.kazubu.jp/"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ #if spec.respond_to?(:metadata)
19
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
20
+ #else
21
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ #end
23
+
24
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.12"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_dependency 'snmp'
32
+ end
data/exe/cow ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'rubygems'
5
+ rescue LoadError
6
+ end
7
+
8
+ require 'cow/application'
9
+
10
+ Cow::Application.new.run
@@ -0,0 +1,17 @@
1
+ require "cow/version"
2
+ require "cow/plugins/acs"
3
+ require "cow/plugins/acs5000"
4
+ require "cow/plugins/acs6000"
5
+ require "cow/plugins/digi_ts"
6
+ require "cow/plugins/cisco"
7
+
8
+ module Cow
9
+ SERVER_TYPES = {
10
+ acs: Cow::ACS::Server,
11
+ acs5000: Cow::ACS5000::Server,
12
+ acs6000: Cow::ACS6000::Server,
13
+ digi_ts_telnet: Cow::DIGI_TS::Telnet::Server,
14
+ cisco_telnet: Cow::Cisco::Telnet::Server,
15
+ cisco_ssh: Cow::Cisco::SSH::Server
16
+ }
17
+ end
@@ -0,0 +1,237 @@
1
+ require 'cow'
2
+ require 'yaml'
3
+
4
+ module Cow
5
+ class Application
6
+ class Cache
7
+ attr_accessor :servers
8
+
9
+ def initialize
10
+ @servers = []
11
+ end
12
+
13
+ def add_server(_server)
14
+ @servers.each_with_index{|server, idx|
15
+ if server.hostname == _server.hostname
16
+ @servers[idx] = _server
17
+ return _server
18
+ end
19
+ }
20
+
21
+ @servers << _server
22
+ end
23
+
24
+ end
25
+
26
+ CACHE_FILE = '/var/cache/cow/cow.cache'
27
+
28
+ @cache = nil
29
+
30
+ def initialize
31
+ @name = 'cow'
32
+ end
33
+
34
+ def create_cache(_cache = CACHE_FILE)
35
+ File.write(_cache, Cow::Application::Cache.new.to_yaml)
36
+ end
37
+
38
+ def load_cache(_cache = CACHE_FILE)
39
+ unless File.exist?(_cache)
40
+ puts 'Cache file is not found. Creating...'
41
+ create_cache(_cache)
42
+ end
43
+
44
+ if File.size(_cache) < 5
45
+ puts 'Cache file looks empty. Creating...'
46
+ create_cache(_cache)
47
+ end
48
+
49
+ cache = YAML.load(File.read(_cache))
50
+
51
+ if cache.class == Cow::Application::Cache
52
+ @cache = cache
53
+ else
54
+ raise 'Cache file is corrupt?'
55
+ end
56
+ end
57
+
58
+ def edit_cache(_cache = CACHE_FILE)
59
+ unless @cache
60
+ load_cache
61
+ end
62
+
63
+ cache = @cache
64
+
65
+ File.open(_cache, 'w') do |file|
66
+ puts 'Updating cache file.'
67
+ if file.flock(File::LOCK_EX|File::LOCK_NB)
68
+
69
+ begin
70
+ yield cache
71
+ rescue
72
+ cache = @cache
73
+ end
74
+
75
+ if cache.class == Cow::Application::Cache
76
+ file.write(cache.to_yaml)
77
+ else
78
+ file.write(@cache.to_yaml)
79
+ end
80
+ else
81
+ raise 'File is already locked.'
82
+ end
83
+ end
84
+ load_cache(_cache)
85
+ end
86
+
87
+ def run
88
+ command = ARGV[0]
89
+ option1 = ARGV[1]
90
+ option2 = ARGV[2]
91
+ option3 = ARGV[3]
92
+
93
+ case command
94
+ when 'add', 'a'
95
+ cmd_add(option1, option2, option3)
96
+ when 'connect', 'c'
97
+ cmd_connect(option1)
98
+ when 'find', 'f'
99
+ cmd_find(option1)
100
+ when 'list', 'l'
101
+ cmd_list(option1)
102
+ when 'server-list', 's'
103
+ cmd_server_list
104
+ when 'update', 'u'
105
+ cmd_update(option1)
106
+ else
107
+ show_help
108
+ end
109
+ end
110
+
111
+ def cmd_add(_hostname, _type, _snmp_community)
112
+ raise ArgumentError unless _hostname.class == String && _type.class == String && _snmp_community.class == String
113
+ raise ArgumentError unless Cow::SERVER_TYPES.keys.include?(_type.to_sym)
114
+
115
+ puts "#{_hostname}(#{_type}) will be added"
116
+
117
+ server = Cow::SERVER_TYPES[_type.to_sym].new(_hostname, _snmp_community)
118
+
119
+ server.ports.each do |port|
120
+ puts "%s %s" % ["#{server.hostname.to_s}/#{port.port.to_s}".ljust(30), port.name.to_s.ljust(20) ]
121
+ end
122
+
123
+ load_cache
124
+
125
+ edit_cache do |cache|
126
+ cache.add_server server
127
+ end if server
128
+ end
129
+
130
+ def cmd_connect(_portname)
131
+ raise ArgumentError unless _portname.class == String
132
+
133
+ load_cache
134
+
135
+ @cache.servers.each do |server|
136
+ server.find(_portname).each do |port|
137
+ if port.name == _portname
138
+ puts "Found on #{server.hostname}/#{port.port}. Connecting..."
139
+ server.connect(port)
140
+ end
141
+ return
142
+ end
143
+ end
144
+ end
145
+
146
+ def cmd_find(_keyword)
147
+ raise ArgumentError unless _keyword.class == String
148
+
149
+ load_cache
150
+ puts "%s %s %s" % ["SERVER/PORT".ljust(30), "PORTNAME".ljust(20), "COMMAND"]
151
+
152
+ @cache.servers.each do |server|
153
+ server.find(_keyword).each do |port|
154
+ puts "%s %s %s" % ["#{server.hostname.to_s}/#{port.port.to_s}".ljust(30), port.name.to_s.ljust(20), server.connect_command(port)]
155
+ end
156
+ end
157
+ end
158
+
159
+ def cmd_list(_hostname)
160
+ load_cache
161
+ puts "%s %s %s" % ["SERVER/PORT".ljust(30), "PORTNAME".ljust(20), "COMMAND"]
162
+
163
+ @cache.servers.each do |server|
164
+ if _hostname.nil? || server.hostname == _hostname
165
+ server.ports.each do |port|
166
+ puts "%s %s %s" % ["#{server.hostname.to_s}/#{port.port.to_s}".ljust(30), port.name.to_s.ljust(20), server.connect_command(port)]
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ def cmd_server_list
173
+ load_cache
174
+ puts "SERVER(TYPE)"
175
+
176
+ @cache.servers.each do |server|
177
+ type = nil
178
+ Cow::SERVER_TYPES.each_key{|t| type = t if Cow::SERVER_TYPES[t] == server.class}
179
+
180
+ puts "#{server.hostname}(#{type})"
181
+ end
182
+ end
183
+
184
+ def cmd_update(_hostname)
185
+ load_cache
186
+
187
+ puts "Updating local cache..."
188
+ puts "%s %s" % ["SERVER/PORT".ljust(30), "PORTNAME".ljust(20)]
189
+
190
+ edit_cache do |cache|
191
+ cache.servers.each do |server|
192
+ if _hostname.nil? || server.hostname == _hostname
193
+ puts "Updating server #{server.hostname}"
194
+ server.update_ports
195
+
196
+ server.ports.each do |port|
197
+ puts "%s %s" % ["#{server.hostname.to_s}/#{port.port.to_s}".ljust(30), port.name.to_s.ljust(20) ]
198
+ end
199
+
200
+ cache.add_server server
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ def show_help
207
+ puts <<EOF
208
+ cow - Console Server Wrapper
209
+
210
+ Usage:
211
+ cow [command] [options]
212
+
213
+ Commands:
214
+ add [hostname] [type] [snmp_community]
215
+ Add new console server.
216
+ available types: #{Cow::SERVER_TYPES.keys.join(' ')}
217
+
218
+ connect [portname]
219
+ Connect to console port.
220
+
221
+ find [keyword]
222
+ Find console port which includes given name.
223
+
224
+ list [hostname(optional)]
225
+ Show console server port list. If hostname is not specified,
226
+ all console ports will be shown.
227
+
228
+ server-list
229
+ Show all console servers.
230
+
231
+ update [hostname(optional)]
232
+ Update console server port list. If hostname is not specified,
233
+ all port lists will be updated.
234
+ EOF
235
+ end
236
+ end
237
+ end
@@ -0,0 +1,40 @@
1
+ require 'cow/plugins/tmpl'
2
+ require 'snmp'
3
+
4
+ module Cow
5
+ module ACS
6
+ OID_DESCRIPTION_LIST = '1.3.6.1.4.1.2925.4.2.6.2.1.1.3'
7
+ OID_TCPPORT_LIST = '1.3.6.1.4.1.2925.4.2.6.2.1.1.26'
8
+
9
+ class Port < Cow::Tmpl::Port
10
+ end
11
+
12
+ class Server < Cow::Tmpl::Server
13
+ def port(_port)
14
+ return _port if _port.class == Cow::ACS::Port
15
+ super
16
+ end
17
+
18
+ def connect_command(_port, _user = ENV['USER'])
19
+ return "ssh -l #{_user}:#{port(_port).tcp_port} #{@hostname}"
20
+ end
21
+
22
+ private
23
+
24
+ def get_ports
25
+ ret = []
26
+ snmp{|s|
27
+ s.walk(OID_DESCRIPTION_LIST){|x|
28
+ next if x.name.last == 0
29
+ port = x.name.last
30
+ name = x.value.to_s
31
+ tcp_port = snmp{|s| break s.get_value(OID_TCPPORT_LIST + ".#{x.name.last.to_s}")}
32
+
33
+ ret << Cow::ACS::Port.new(port, name, tcp_port)
34
+ }
35
+ }
36
+ return ret
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'cow/plugins/tmpl'
2
+ require 'snmp'
3
+
4
+ module Cow
5
+ module ACS5000
6
+ OID_DESCRIPTION_LIST = '1.3.6.1.4.1.10418.15.2.2.6.2.1.1.3'
7
+ OID_TCPPORT_LIST = '1.3.6.1.4.1.10418.15.2.2.6.2.1.1.26'
8
+
9
+ class Port < Cow::Tmpl::Port
10
+ end
11
+
12
+ class Server < Cow::Tmpl::Server
13
+ def port(_port)
14
+ return _port if _port.class == Cow::ACS5000::Port
15
+ super
16
+ end
17
+
18
+ def connect_command(_port, _user = ENV['USER'])
19
+ return "ssh -l #{_user}:#{port(_port).tcp_port} #{@hostname}"
20
+ end
21
+
22
+ private
23
+
24
+ def get_ports
25
+ ret = []
26
+ snmp{|s|
27
+ s.walk(OID_DESCRIPTION_LIST){|x|
28
+ next if x.name.last == 0
29
+ port = x.name.last
30
+ name = x.value.to_s
31
+ tcp_port = snmp{|s| break s.get_value(OID_TCPPORT_LIST + ".#{x.name.last.to_s}")}
32
+
33
+ ret << Cow::ACS5000::Port.new(port, name, tcp_port)
34
+ }
35
+ }
36
+ return ret
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ require 'cow/plugins/tmpl'
2
+ require 'snmp'
3
+
4
+ module Cow
5
+ module ACS6000
6
+ OID_DESCRIPTION_LIST = '1.3.6.1.4.1.10418.16.2.3.2.1.4'
7
+
8
+ class Port < Cow::Tmpl::Port
9
+ end
10
+
11
+ class Server < Cow::Tmpl::Server
12
+ def port(_port)
13
+ return _port if _port.class == Cow::ACS6000::Port
14
+ super
15
+ end
16
+
17
+ def connect_command(_port, _user = ENV['USER'])
18
+ return "ssh -l #{_user}:#{port(_port).tcp_port} #{@hostname}"
19
+ end
20
+
21
+ private
22
+
23
+ def get_ports
24
+ ret = []
25
+ snmp{|s|
26
+ s.walk(OID_DESCRIPTION_LIST){|x|
27
+ next if x.name.last == 0
28
+ port = x.name.last
29
+ name = x.value.to_s
30
+ tcp_port = port.to_i + 7000
31
+
32
+ ret << Cow::ACS6000::Port.new(port, name, tcp_port)
33
+ }
34
+ }
35
+ return ret
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,54 @@
1
+ require 'cow/plugins/tmpl'
2
+ require 'snmp'
3
+
4
+ module Cow
5
+ module Cisco
6
+ OID_DESCRIPTION_LIST = '1.3.6.1.4.1.9.2.9.2.1.8'
7
+
8
+ class Port < Cow::Tmpl::Port
9
+ end
10
+
11
+ module Server
12
+ def port(_port)
13
+ return _port if _port.class == Cow::Cisco::Port
14
+ super
15
+ end
16
+
17
+ def get_ports
18
+ ret = []
19
+ snmp{|s|
20
+ s.walk(OID_DESCRIPTION_LIST){|x|
21
+ next if x.name.last == 0
22
+ next if x.value.to_s.length == 0
23
+ port = x.name.last
24
+ name = x.value.to_s
25
+ tcp_port = 2000 + port.to_i
26
+
27
+ ret << Cow::Cisco::Port.new(port, name, tcp_port)
28
+ }
29
+ }
30
+ return ret
31
+ end
32
+ end
33
+
34
+ module Telnet
35
+ class Server < Cow::Tmpl::Server
36
+ include Cow::Cisco::Server
37
+
38
+ def connect_command(_port, _user = ENV['USER'])
39
+ return "telnet #{@hostname} #{port(_port).tcp_port}"
40
+ end
41
+ end
42
+ end
43
+
44
+ module SSH
45
+ class Server < Cow::Tmpl::Server
46
+ include Cow::Cisco::Server
47
+
48
+ def connect_command(_port, _user = ENV['USER'])
49
+ return "ssh -l #{_user}:#{port(_port).port} #{@hostname}"
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,46 @@
1
+ require 'cow/plugins/tmpl'
2
+ require 'snmp'
3
+
4
+ module Cow
5
+ module DIGI_TS
6
+ OID_DESCRIPTION_LIST = '1.3.6.1.4.1.332.11.5.3.3.25.13.1.29'
7
+ OID_TCPPORT_BASE = '1.3.6.1.4.1.332.11.5.3.3.20.22.0'
8
+
9
+ class Port < Cow::Tmpl::Port
10
+ end
11
+
12
+ module Telnet
13
+ class Server < Cow::Tmpl::Server
14
+ def port(_port)
15
+ return _port if _port.class == Cow::DIGI_TS::Port
16
+ super
17
+ end
18
+
19
+ def connect_command(_port, _user = ENV['USER'])
20
+ #return "ssh -l #{_user}:#{port(_port).tcp_port+500} #{@hostname}"
21
+ return "telnet #{@hostname} #{port(_port).tcp_port}"
22
+ end
23
+
24
+ private
25
+
26
+ def get_ports
27
+ ret = []
28
+
29
+ base_port = snmp{|s| break s.get_value(OID_TCPPORT_BASE)}
30
+
31
+ snmp{|s|
32
+ s.walk(OID_DESCRIPTION_LIST){|x|
33
+ next if x.value.to_s.chomp.length == 0
34
+ port = x.name.last
35
+ name = x.value.to_s
36
+ tcp_port = base_port + port.to_i
37
+
38
+ ret << Cow::DIGI_TS::Port.new(port, name, tcp_port)
39
+ }
40
+ }
41
+ return ret
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,99 @@
1
+ require 'snmp'
2
+
3
+ module Cow
4
+ module Tmpl
5
+ class Port
6
+ attr_accessor :port, :name, :tcp_port
7
+
8
+ @port = nil
9
+ @name = nil
10
+ @tcp_port = nil
11
+
12
+ def initialize
13
+ end
14
+
15
+ def initialize(_port, _name, _tcp_port)
16
+ raise ArgumentError if _port.nil? or _name.nil? or _tcp_port.nil?
17
+
18
+ @port = _port.to_s
19
+ @name = _name.to_s
20
+ @tcp_port = _tcp_port.to_s
21
+ end
22
+ end
23
+
24
+ class Server
25
+ attr_accessor :hostname
26
+
27
+ @hostname = nil
28
+ @snmp_community = nil
29
+ @ports = nil
30
+
31
+ def initialize
32
+ end
33
+
34
+ def initialize(_hostname, _snmp_community)
35
+ @hostname = _hostname
36
+ @snmp_community = _snmp_community
37
+
38
+ @ports = get_ports
39
+ end
40
+
41
+ def ports
42
+ update_ports unless @ports
43
+ return @ports
44
+ end
45
+
46
+ def update_ports
47
+ @ports = get_ports
48
+ end
49
+
50
+ def port(_port)
51
+ case _port
52
+ when Fixnum
53
+ ports.each{|p|
54
+ return p if p.port == _port
55
+ }
56
+ when String
57
+ ports.each{|p|
58
+ return p if p.name == _port
59
+ }
60
+ else
61
+ end
62
+
63
+ nil
64
+ end
65
+
66
+ def find(_portname)
67
+ _ports = []
68
+ ports.each{|p|
69
+ _ports << p if p.name.include?(_portname)
70
+ }
71
+ return _ports
72
+ end
73
+
74
+ def connect_command(_port, _user = ENV['USER'])
75
+ raise NotImplementedError
76
+ end
77
+
78
+ def connect(_port, _user = nil)
79
+ if _user
80
+ system(connect_command(_port, _user))
81
+ else
82
+ system(connect_command(_port))
83
+ end
84
+ end
85
+
86
+ private
87
+
88
+ def get_ports
89
+ raise NotImplementedError
90
+ end
91
+
92
+ def snmp
93
+ SNMP::Manager.open(:host => @hostname, :community => @snmp_community) do|snmp|
94
+ yield(snmp)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,3 @@
1
+ module Cow
2
+ VERSION = "0.1.1"
3
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cow
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kazuki Shimizu
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2016-09-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.12'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.12'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '10.0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '10.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: snmp
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Ease to connect console server ports
63
+ email:
64
+ - kazubu@kazubu.jp
65
+ executables:
66
+ - cow
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - Gemfile
72
+ - README.md
73
+ - Rakefile
74
+ - bin/console
75
+ - bin/setup
76
+ - cow.gemspec
77
+ - exe/cow
78
+ - lib/cow.rb
79
+ - lib/cow/application.rb
80
+ - lib/cow/plugins/acs.rb
81
+ - lib/cow/plugins/acs5000.rb
82
+ - lib/cow/plugins/acs6000.rb
83
+ - lib/cow/plugins/cisco.rb
84
+ - lib/cow/plugins/digi_ts.rb
85
+ - lib/cow/plugins/tmpl.rb
86
+ - lib/cow/version.rb
87
+ homepage: https://www.kazubu.jp/
88
+ licenses: []
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ segments:
100
+ - 0
101
+ hash: -2846258190445444436
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ segments:
109
+ - 0
110
+ hash: -2846258190445444436
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 1.8.23
114
+ signing_key:
115
+ specification_version: 3
116
+ summary: Console server Wrapper
117
+ test_files: []