ssh-manager 1.0.7 → 1.1.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: f4ef77e66250887d77ec7236a8f20eb845df7394
4
- data.tar.gz: 637e713f4b840cd3017333f1b29da0d0da7fb9de
3
+ metadata.gz: 56dbc7d6e9248cc66a7a3840669ffc4cf0056555
4
+ data.tar.gz: 54cae9ac4705336ad6dbbb39628cb18003d101c2
5
5
  SHA512:
6
- metadata.gz: ce685710f5976949842c3a0bd5b6d98105aa0460dc66658c1a92df11a37595c52eb8040601f89b9c10b9a87f9b69aaae677659ba1c1ad99f42c4ccfefcea02eb
7
- data.tar.gz: b16ea06b519546be7bdf05aeaf5fdd270e63c52ca84dc87979255c1fec178b2f99f589146d588439cff8a4f4be045dab8894fc38a986e01e279651f73d34c534
6
+ metadata.gz: e15cc62eb68e761da4214faa7b1e5b4191aef724436386b045e593cfc7b8ed7fc4bf67481d599b2550aaeed28fb3849f1bc161c30e0c36fe763f444b67ea8ec2
7
+ data.tar.gz: 603a5b658f4db6f72a9725448f53f671fd09bfb875c9c7c19baeaee71db7d11e742700f979b28b3b5b0672302e5309a85d6be7c4180626aa3a8c033d7fb94089
@@ -0,0 +1,10 @@
1
+ function ask {
2
+
3
+ local QUESTION="$1"
4
+ local DEFAULT_ANSWER="$2"
5
+
6
+ local PROMPT="$QUESTION"
7
+
8
+ read -e -p "${PROMPT}: " -i "$DEFAULT_ANSWER" USER_ANSWER
9
+ echo $USER_ANSWER
10
+ }
@@ -12,44 +12,58 @@ module SSH
12
12
 
13
13
  def initialize(opts = {})
14
14
  @options = opts
15
+ @pretty_names = {:id => "ID", #TODO :connect_via
16
+ :ip => "IP or hostname",
17
+ :user => "Username",
18
+ :hostname => "Alias",
19
+ :port => "Port",
20
+ :note => "Note",
21
+ :options => "Options",
22
+ :group => "Group",
23
+ :connect_via => "Connect via (id)"}
24
+ @visible_fields = [:id, :ip, :group, :note]
25
+ @input_fields = [:ip, :hostname, :user, :port, :options, :note, :group, :connect_via]
26
+ @column_width = 15 #TODO make this dynamic or a yaml setting
15
27
  end
16
28
 
17
- def check_term(ip, user, via)
18
- if CONFIG['terminal'] == "xfce4-terminal" || CONFIG['terminal'] == "gnome-terminal"
19
- if CONFIG['tabbed'] == 'true'
20
- command = "--title=#{user}@#{ip} --tab --command="
21
- else
22
- command = "--title=#{user}@#{ip} --command="
23
- end
24
- #TODO: add title --title='connection name to identify '
25
- #TODO: bug when no terminal is open => wants to open 2 terms
26
- #TODO: dnslookup
27
- if via.nil? or via.empty?
28
- %x(#{CONFIG['terminal']} #{command}"ssh #{user}@#{ip}")
29
+ def connect_to(id)
30
+ id.each do |conn|
31
+ conn.to_i
32
+ ssh_command = ""
33
+ i = conn
34
+ begin
35
+ connection = DATABASE.get_connection_by_id(i)
36
+ ip = connection[:ip]
37
+ user = connection[:user]
38
+ user = ENV['USER'] if user == ""
39
+ options = connection[:options]
40
+ via = connection[:connect_via]
41
+ ssh_command = "ssh -A -t #{options} #{user}@#{ip} #{ssh_command}"
42
+ i = via
43
+ #TODO prevent endless via-loops
44
+ end while via
45
+ connection[:count] += 1
46
+ connection[:last_time] = Time.now
47
+ DATABASE.update_connection(connection)
48
+ if CONFIG['target'] == "self"
49
+ exec ssh_command
50
+ elsif CONFIG['terminal'] == "xfce4-terminal" || CONFIG['terminal'] == "gnome-terminal"
51
+ if CONFIG['tabbed'] == 'true'
52
+ command = "--title=#{user}@#{ip} --tab --command="
53
+ else
54
+ command = "--title=#{user}@#{ip} --command="
55
+ end
56
+ #TODO: add title --title='connection name to identify '
57
+ #TODO: bug when no terminal is open => wants to open 2 terms
58
+ #TODO: dnslookup
59
+ %x(#{CONFIG['terminal']} #{command}"#{ssh_command}")
60
+ elsif CONFIG['terminal'] == "xterm" || CONFIG['terminal'] == "urxvt"
61
+ %x(#{CONFIG['terminal']} -e "#{ssh_command}")
29
62
  else
30
- %x(#{CONFIG['terminal']} #{command}"ssh -A -t #{via} ssh -A -t #{user}@#{ip}")
63
+ puts "We dont support #{CONFIG['terminal']} right now"
64
+ puts 'Check Github for further development or contributing'
31
65
  end
32
- elsif CONFIG['terminal'] == "xterm" || CONFIG['terminal'] == "urxvt"
33
- %x(#{CONFIG['terminal']} -e "ssh #{user}@#{ip}")
34
- else
35
- puts "We dont support #{CONFIG['terminal']} right now"
36
- puts 'Check Github for further development or contributing'
37
66
  end
38
- end
39
-
40
- def connect_to(id)
41
- via = DATABASE.get_connection_data[id.to_i-1][-1] =~ /@/
42
- if via.nil?
43
- @ip = DATABASE.get_connection_data[id.to_i-1][0]
44
- @user = DATABASE.get_connection_data[id.to_i-1][1]
45
- check_term(@ip, @user, via)
46
- else
47
- @ip = DATABASE.get_connection_data[id.to_i-1][0]
48
- @user = DATABASE.get_connection_data[id.to_i-1][1]
49
- via = DATABASE.get_connection_data[id.to_i-1][-1]
50
- check_term(@ip, @user, via)
51
- end
52
- #TODO: check for options
53
67
  #TODO: if db[secure_login] = false => http://linuxcommando.blogspot.de/2008/10/how-to-disable-ssh-host-key-checking.html
54
68
  end
55
69
 
@@ -59,119 +73,125 @@ module SSH
59
73
  if new_version<old_version
60
74
  puts "There is a update available #{new_version} was released. -> sudo gem update ssh-manager"
61
75
  else
62
- puts "Version: #{old_version} is up to date."
76
+ puts "Version: #{old_version} is up to date."
63
77
  end
64
78
  end
65
79
 
80
+ def show_info(id)
81
+ @input_fields << :count
82
+ @input_fields << :last_time
83
+ id.each do |conn|
84
+ connections = DATABASE.get_connection_by_id(conn.to_i)
85
+ puts "\n"
86
+ @input_fields.each do |field|
87
+ if field == :connect_via && connections[field] != nil
88
+ via_ip = DATABASE.get_connection_by_id(connections[field])[:ip]
89
+ printf "%s: %s -|- %s ", field, connections[field], via_ip
90
+ else
91
+ printf "%s: %s", field, connections[field]
92
+ end
93
+ puts "\n"
94
+ end
95
+ end
96
+ end
97
+
98
+ def transfer_key(id)
99
+ #TODO connect_via
100
+ #TODO options
101
+ connection = DATABASE.get_connection_by_id(id)
102
+ user = connection[:user]
103
+ user = ENV['USER'] if user == ""
104
+ %x(ssh-copy-id #{user}@#{connection[:ip]})
105
+ end
106
+
66
107
  def ping(id)
67
- via = DATABASE.get_connection_data[id.to_i-1][-1] =~ /@/
68
- @ip = DATABASE.get_connection_data[id.to_i-1][0]
69
- if via.nil?
70
- exec("ping #{@ip}")
108
+ connection = DATABASE.get_connection_by_id(id)
109
+ if connection[:connect_via]
110
+ connect_via = DATABASE.get_connection_by_id(connection[:connect_via])
111
+ ssh = "ssh #{connect_via[:user]}@#{connect_via[:ip]}"
112
+ exec("#{ssh} ping #{connection[:ip]} -c 3")
71
113
  else
72
- via = DATABASE.get_connection_data[id.to_i-1][-1]
73
- exec("ssh #{via} ping #{@ip}")
114
+ exec("ping #{connection[:ip]} -c 3")
74
115
  end
75
116
  end
76
117
 
77
- def transfer_key(id)
78
- @ip = DATABASE.get_connection_data[id.to_i-1][0]
79
- @user = DATABASE.get_connection_data[id.to_i-1][1]
80
- %x(ssh-copy-id #{@user}@#{@ip})
118
+ def test(type)
119
+ require 'byebug'
120
+ byebug
81
121
  end
82
122
 
83
123
  def transfer_file(filename, id='', dest_path="/home/#{user}/")
84
- @ip = DATABASE.get_connection_data[id.to_i-1][0]
85
- @user = DATABASE.get_connection_data[id.to_i-1][1]
86
- %x(scp #{filename} #{@user}@#{@ip}:#{dest_path}) if File.file?(filename)
87
- %x(scp -r #{filename} #{@user}@#{@ip}:#{dest_path}) if File.directory?(filename)
124
+ #TODO connect_via
125
+ #TODO options
126
+ connection = DATABASE.get_connection_by_id(id)
127
+ user = connection[:user]
128
+ user = ENV['USER'] if user == ""
129
+ %x(scp #{filename} #{user}@#{connection[:ip]}:#{dest_path}) if File.file?(filename)
130
+ %x(scp -r #{filename} #{@user}@#{connection[:ip]}:#{dest_path}) if File.directory?(filename)
88
131
  end
89
132
 
90
- def add_connection(ip)
91
- puts 'Username: '
92
- user = $stdin.gets.chomp
93
- user = 'root' if user == ''
94
- puts 'Hostname: '
95
- hostname = $stdin.gets.chomp
96
- puts 'port: '
97
- port = $stdin.gets.chomp
98
- port = '22' if port == ''
99
- puts 'Notes: '
100
- note = $stdin.gets.chomp
101
- puts 'Options: '
102
- options = $stdin.gets.chomp
103
- options = '' if options == ''
104
- puts 'Group: '
105
- group = $stdin.gets.chomp
106
- puts 'Connect via(ip): '
107
- connect_via_ip = $stdin.gets.chomp
108
- puts 'With Username: '
109
- connect_via_user = $stdin.gets.chomp
110
- connect_via = ""
111
- connect_via= "#{connect_via_user}@#{connect_via_ip}" unless connect_via_user.empty?
112
- count = 0
113
- created_at = Time.now.to_s
114
- last_time = Time.now.to_s
115
- DATABASE.add_new_connection(ip, user, hostname, port, note, connect_via, created_at, options, count, group, last_time)
133
+ def add_connection
134
+ connection = {:user => ENV['USER'],
135
+ :port => "22"}
136
+ @input_fields.each do |key|
137
+ #TODO make this a method
138
+ connection[key] = %x{source #{File.dirname(__FILE__)}/ask.sh; ask '#{@pretty_names[key]}' '#{connection[key]}'}.chomp
139
+ end
140
+ connection[:count] = 0
141
+ connection[:created_at] = Time.now.to_s
142
+ connection[:last_time] = Time.now.to_s
143
+ connection[:connect_via] = nil if connection[:connect_via] == ""
144
+ DATABASE.add_new_connection(connection)
145
+ #TODO catch SQLite3::ConstraintException
116
146
  end
117
147
 
118
148
  def delete(id)
119
- id = id.to_i - 1
120
- DATABASE.delete_connection(DATABASE.get_connection_data[id][0])
149
+ id.each do |conn|
150
+ conn.to_i
151
+ DATABASE.delete_connection(conn)
152
+ end
121
153
  end
122
154
 
123
155
  def list_all
124
- cnt = 0
125
- connections = Hash[DATABASE.get_connection_data.collect { |x| [cnt+=1, x]}]
126
- puts 'ID IP USERNAME NOTES GROUP'
127
- connections.each do |x|
128
- print "#{x[0]}: "
129
- x[1].each do |a|
130
- printf '%-15s', a
131
- end
156
+ connections = DATABASE.get_connection_data
157
+ @visible_fields.each { |f| printf "%-#{@column_width}s", @pretty_names[f] }
158
+ puts "\n"
159
+ connections.each do |c|
160
+ @visible_fields.each { |f| printf "%-#{@column_width}s", c[f] }
132
161
  puts "\n"
133
162
  end
134
163
  end
135
164
 
136
165
  def update(id)
137
- puts 'Entries wont change of left out blank.'
138
- puts 'Username: '
139
- user =$stdin.gets.chomp
140
- user = DATABASE.get_connection_data[id.to_i][1] if user == ''
141
- puts 'Hostname: '
142
- hostname = $stdin.gets.chomp
143
- hostname = DATABASE.get_connection_data[id.to_i][2] if hostname == ''
144
- puts 'port: '
145
- port = $stdin.gets.chomp
146
- port = DATABASE.get_connection_data[id.to_i][3] if port == ''
147
- puts 'Notes: '
148
- note = $stdin.gets.chomp
149
- note = DATABASE.get_connection_data[id.to_i][4] if note == ''
150
- DATABASE.update_connection(DATABASE.get_connection_data[id.to_i][0], user, hostname, port, note)
166
+ connection = DATABASE.get_connection_by_id(id)
167
+ @input_fields.each do |key|
168
+ #TODO make this a method
169
+ connection[key] = %x{source #{File.dirname(__FILE__)}/ask.sh; ask '#{@pretty_names[key]}' '#{connection[key]}'}.chomp
170
+ end
171
+ connection[:connect_via] = nil if connection[:connect_via] == ""
172
+ DATABASE.update_connection(connection)
173
+ #TODO catch SQLite3::ConstraintException
151
174
  end
152
175
 
153
176
  def search_for(term)
154
- puts 'IP USERNAME HOSTNAME PORT NOTES GROUP'
177
+ puts "All results for searchterm: #{term}"
178
+ @visible_fields.each { |f| printf "%-#{@column_width}s", @pretty_names[f] }
179
+ print "\n"
155
180
  DATABASE.search_for(term).each do |x|
156
181
  x.all.each do |cons|
157
- cons.values.each do |each_con|
158
- printf '%-20s', each_con
159
- end
182
+ @visible_fields.each { |f| printf "%-#{@column_width}s", cons[f] }
160
183
  puts "\n"
161
184
  end
162
185
  end
163
- puts "All results for searchterm: #{term}"
164
186
  end
165
187
 
166
188
  def multiple_connection(term)
167
189
  DATABASE.search_for(term).each do |x|
168
190
  x.all.each do |dataset|
169
- check_term(dataset[:ip], dataset[:user], dataset[:connect_via])
170
- #TODO: Add terminalposition
191
+ self.connect_to(dataset[:id])
171
192
  end
172
193
  end
173
194
  end
174
-
175
195
  end
176
196
  end
177
197
  end
@@ -18,15 +18,24 @@ module SSH
18
18
 
19
19
  def execute!
20
20
  cli = SSH::Manager::Cli
21
+ # TODO id.to_i is not good enough. we want to support hostnames too
22
+ # Checking and casting in the methods itself could solve the problem
23
+ # futhermore this could reside in a separate method
21
24
  if @options[:add]
22
25
  puts 'Adding ..'
23
- cli.new(@options).add_connection(@options[:add])
26
+ cli.new(@options).add_connection
24
27
  elsif @options[:connect]
25
28
  puts 'Connecting ..'
26
29
  cli.new(@options).connect_to(@options[:connect])
30
+ elsif @options[:info]
31
+ puts 'Printing info ..'
32
+ cli.new(@options).show_info(@options[:info])
27
33
  elsif @options[:transfer_file]
28
34
  puts 'Transfering file..'
29
- cli.new(@options).transfer_file(@options[:transfer_file], @argv[2], @argv[3])
35
+ cli.new(@options).transfer_file(@options[:transfer_file].to_i, @argv[2], @argv[3])
36
+ elsif @options[:ping]
37
+ puts 'Pinging..'
38
+ cli.new(@options).ping(@options[:ping].to_i)
30
39
  elsif @options[:delete]
31
40
  puts 'Deleting ..'
32
41
  cli.new(@options).delete(@options[:delete])
@@ -38,16 +47,13 @@ module SSH
38
47
  cli.new(@options).update_available
39
48
  elsif @options[:update]
40
49
  puts 'Updating ..'
41
- cli.new(@options).update(@options[:update])
50
+ cli.new(@options).update(@options[:update].to_i)
42
51
  elsif @options[:multi]
43
52
  puts 'Connecting to multiple ips..'
44
53
  cli.new(@options).multiple_connection(@options[:multi])
45
54
  elsif @options[:transfer_key]
46
55
  puts 'Transfering key..'
47
- cli.new(@options).transfer_key(@options[:transfer_key])
48
- elsif @options[:ping]
49
- puts 'Ping Pong..'
50
- cli.new(@options).ping(@options[:ping])
56
+ cli.new(@options).transfer_key(@options[:transfer_key].to_i)
51
57
  elsif @options[:search]
52
58
  puts 'Searching ..'
53
59
  cli.new(@options).search_for(@options[:search])
@@ -65,27 +71,31 @@ module SSH
65
71
  @optparse = OptionParser.new do |opts|
66
72
  opts.banner = "Usage: sshm [options] ..."
67
73
  @options[:add] = false
68
- opts.on( '-a', '--add ip', 'Add ip to your Connection list' ) do |opt|
69
- @options[:add] = opt
74
+ opts.on( '-a', '--add', 'add a new connection' ) do
75
+ @options[:add] = true
70
76
  end
71
77
  @options[:transfer_key] = false
72
78
  opts.on( '-t', '--transferkey id', 'transfer key to <id>' ) do |opt|
73
79
  @options[:transfer_key] = opt
74
80
  end
75
- @options[:ping] = false
76
- opts.on( '-p', '--ping connection id', 'ping connection/)' ) do |opt|
77
- @options[:ping] = opt
78
- end
79
81
  @options[:transfer_file] = false
80
82
  opts.on( '-r', '--transferfile filename', 'file or dir / connection_ID / dest_path(default is /home/user/)' ) do |opt|
81
83
  @options[:transfer_file] = opt
82
84
  end
83
85
  @options[:connect] = false
84
- opts.on( '-c', '--connect id', 'connect to <id>' ) do |opt|
86
+ opts.on( '-c', '--connect x y z', Array, 'connect to <ids>' ) do |opt|
85
87
  @options[:connect] = opt
86
88
  end
89
+ @options[:info] = false
90
+ opts.on( '-i', '--info id1 id2 id3',Array, 'info about to <id>' ) do |opt|
91
+ @options[:info] = opt
92
+ end
93
+ @options[:ping] = false
94
+ opts.on( '-p', '--ping id', 'test connection of <id>' ) do |opt|
95
+ @options[:ping] = opt
96
+ end
87
97
  @options[:delete] = false
88
- opts.on( '-d', '--delete id', 'delete connection <id>' ) do |opt|
98
+ opts.on( '-d', '--delete id1 id2 id3',Array, 'delete connection <ids>' ) do |opt|
89
99
  @options[:delete] = opt
90
100
  end
91
101
  @options[:update] = false
@@ -108,11 +118,11 @@ module SSH
108
118
  opts.on( '-g', '--upgrade', 'checks for upgrade' ) do
109
119
  @options[:upgrade] = true
110
120
  end
111
- opts.on( '-h', '--help', 'Display this screen' ) do
121
+ opts.on( '-h', '--help', 'display this screen' ) do
112
122
  puts opts
113
123
  exit
114
124
  end
115
- opts.on( '-v', '--version', 'Print programs version' ) do
125
+ opts.on( '-v', '--version', 'print programs version' ) do
116
126
  puts SSH::Manager::VERSION
117
127
  exit
118
128
  end
@@ -5,41 +5,65 @@ module SSH
5
5
  module Manager
6
6
  class Database
7
7
 
8
- FileUtils.mkdir_p("#{File.join(ENV['HOME'])}/.config/sshm/") unless Dir.exists?("#{ENV['HOME']}/.config/sshm")
9
- FileUtils.cp ("#{File.dirname(__FILE__)}/../../../config/sshm.db"), ("#{File.join(Dir.home)}" + '/.config/sshm/') unless File.exists?(("#{File.join(Dir.home)}" + '/.config/sshm/sshm.db'))
8
+ @config_dir = "#{ENV['HOME']}/.config/sshm"
9
+ FileUtils.mkdir_p(@config_dir) unless Dir.exists?(@config_dir)
10
10
 
11
- @path = "#{File.join(ENV['HOME'])}/.config/sshm"
12
- DATABASE = Sequel.connect("sqlite://#{@path}/sshm.db")
11
+ @database_file = "#{@config_dir}/sshm.sqlite3"
12
+ unless File.exists?(@database_file)
13
+ Sequel.sqlite(@database_file).run <<-NEW_DB
14
+ CREATE TABLE connection (
15
+ "id" INTEGER PRIMARY KEY AUTOINCREMENT,
16
+ "ip" TEXT,
17
+ "user" TEXT,
18
+ "hostname" TEXT,
19
+ "port" INTEGER,
20
+ "note" TEXT,
21
+ "created_at" TEXT,
22
+ "options" TEXT,
23
+ "group" TEXT,
24
+ "count" INTEGER,
25
+ "last_time" TEXT,
26
+ "secure_check" INTEGER,
27
+ "connect_via" INTEGER NULL,
28
+ FOREIGN KEY("connect_via") REFERENCES connection("id")
29
+ );
30
+
31
+ INSERT INTO connection ("ip", "hostname") VALUES ("127.0.0.1", "localhost");
32
+ NEW_DB
33
+ #TODO make group a n:m relation to extra table
34
+ end
35
+ DATABASE = Sequel.sqlite(@database_file)
13
36
 
14
37
  attr_accessor :connections
15
38
 
16
39
  def initialize
17
- @connections= DATABASE.from(:connection)
40
+ @connections = DATABASE[:connection]
41
+ end
42
+
43
+ def get_connection_by_id(id)
44
+ @connections[:id => id].to_hash
18
45
  end
19
46
 
20
47
  def get_connection_data
21
- @connections.map([:ip, :user, :note, :group, :connect_via])
48
+ @connections.all
22
49
  end
23
50
 
24
- def add_new_connection(ip, user='root', hostname='', port=22, note='', connect_via='', created_at, option, count, group, last_time)
25
- @connections.insert(:ip => ip, :user => user, :hostname => hostname, :port => port, :note => note, :connect_via => connect_via, :created_at => created_at, :options => option, :group => group, :count => count, :last_time => last_time)
51
+ def add_new_connection(connection)
52
+ @connections.insert(connection)
26
53
  end
27
54
 
28
- def delete_connection(ip)
29
- # add && :user => user to ensure deletion
30
- @connections.where(:ip => ip).delete
55
+ def delete_connection(id)
56
+ @connections.where(:id => id).delete
31
57
  end
32
58
 
33
- def update_connection(ip, user, hostname, port, note)
34
- @connections.where(:ip => ip).update(:user => user, :hostname => hostname, :port => port, :note => note)
59
+ def update_connection(connection)
60
+ @connections.where(:id => connection[:id]).update(connection)
35
61
  end
36
62
 
37
63
  def search_for(term)
38
64
  # check online: search for 'contains' not for complete matching
39
65
  return @connections.where(:ip => term), @connections.where(:user => term), @connections.where(:hostname => term), @connections.where(:port => term), @connections.where(:note => term), @connections.where(:group => term), @connections.where(:options => term)
40
66
  end
41
-
42
-
43
67
  end
44
68
  end
45
69
  end
@@ -1,5 +1,5 @@
1
1
  module SSH
2
2
  module Manager
3
- VERSION = "1.0.7"
3
+ VERSION = "1.1.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ssh-manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Schmid
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-18 00:00:00.000000000 Z
11
+ date: 2015-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -88,9 +88,9 @@ files:
88
88
  - Rakefile
89
89
  - bin/sshm
90
90
  - config/settings.yml
91
- - config/sshm.db
92
91
  - doc/user_spec
93
92
  - lib/ssh/manager.rb
93
+ - lib/ssh/manager/ask.sh
94
94
  - lib/ssh/manager/cli.rb
95
95
  - lib/ssh/manager/client.rb
96
96
  - lib/ssh/manager/db.rb
data/config/sshm.db DELETED
Binary file