lita-ssh-run 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b793719e3aa195e2c62439c4c422ffbc6265a454
4
- data.tar.gz: 08c14c7a3c181c3bc538c326ed9f7011e110bff1
3
+ metadata.gz: 6668cf973bb770f5e4780e4158e3fb040bcaff6b
4
+ data.tar.gz: ceea91c7635db468810021111e925bafb7068886
5
5
  SHA512:
6
- metadata.gz: 6d93b40502d91f6c41c65a9417721401920358d6e59bdf7d7a02d1d34d1a475b5f1e1572f32ed0307f45f3f74efb0ca5d134400889a0431d54d618264981ff44
7
- data.tar.gz: eaa9647d43663756f0cc236c90589568287b9812acd43b13ba8c6d2150c27ac5233fefacbb35a611a1ad6b8c4ba0aff5614073c0def836b33c22a2ef4cb5675f
6
+ metadata.gz: f696b54d60afebd72c8b4e0df86efaf4c7f11cae81a86c7968d82f84ce192c67c041e6998a79aaf4914c6b1a0bf0278d6fbce54b1bfc40bb4de019f979f898ec
7
+ data.tar.gz: b4d3c3df2b10daf7415b272539e09cc627579ce63812b8486e09ffeb2bc7a07ab0e66a61d9c1ff0db86b429166b1007f1d46f0ab27861d48ef96ee8494895ae2
data/README.md CHANGED
@@ -1,13 +1,17 @@
1
1
  # lita-ssh-run
2
2
 
3
- This will allow you to run commands via ssh
3
+ This will allow you to run commands via ssh and powershell via winrm
4
+
4
5
  Example:
5
6
  `Lita, run uptime on 192.168.1.10`
7
+ `Lita, run Get-Service on 192.168.1.20`
6
8
 
7
- Usernames and passwords are stored in redis memory by chat userid and host passed. **Only tested on slack**
8
- If not found, it will prompt via private message on how to enter user and password:
9
+ Usernames, passwords, and OS type are stored in redis memory by chat userid and host passed.
10
+
11
+ If not found, it will prompt via private message on how to enter user, password, and OS:
9
12
  Currently passwords are passed via plaintext in private message. I have requested to Slack to add an obfuscation format block for things like this.
10
13
 
14
+ **Tested on slack and hipchat**
11
15
  ## Installation
12
16
 
13
17
  Add lita-ssh-run to your Lita instance's Gemfile:
@@ -16,7 +20,6 @@ Add lita-ssh-run to your Lita instance's Gemfile:
16
20
  gem "lita-ssh-run"
17
21
  ```
18
22
 
19
-
20
23
  ## Configuration
21
24
 
22
25
  None
@@ -29,6 +32,12 @@ None
29
32
 
30
33
  `Lita, set password for 192.168.1.0 to PASSWORD`
31
34
 
35
+ `Lita, set OS for 192.168.1.0 to linux`
36
+
37
+ `Lita, set OS for 192.168.1.0 to windows`
38
+
39
+ `List, set port for 192.168.1.0 to 2222`
40
+
32
41
 
33
42
  ## License
34
43
 
@@ -1,73 +1,190 @@
1
1
  module Lita
2
2
  module Handlers
3
3
  class SshRun < Handler
4
- require 'net/ssh'
4
+ require 'net/ssh'
5
+ require 'winrm'
5
6
 
6
- route(/^run\s+(.+)\s+on\s+(.+)/i, :run_ssh, command: true)
7
+ route(/^run\s+(.+)\s+on\s+(.+)/i,
8
+ :run_command,
9
+ command: true,
10
+ help: { "run <command> on <machine>" => "runs an ssh or powershell command on remote machine" })
7
11
 
8
- route(/^set\s+(username|password)\s+for\s+(.+)\s+to\s+(.+)/i, :set_user_pass, command: true)
12
+ route(/^set\s+(username|password)\s+for\s+(.+)\s+to\s+(.+)/i,
13
+ :set_user_pass,
14
+ command: true,
15
+ help: { "set <username or password> for <machineName>" =>
16
+ "sets a username or password for a machine you want to run commands on" })
9
17
 
10
- route(/^clear\s+all\s+stored\s+(creds|credentials)/i, :flush_redis, command: true, restrict_to: :admins)
18
+ route(/^set\s+(port)\s+for\s+(.+)\s+to\s+(.+)/i,
19
+ :set_server_port,
20
+ command: true,
21
+ help: { "set port for <machinename>" =>
22
+ "changes default port for machine connection (defaults are 22 for SSH and 5985 for winrm" })
11
23
 
12
- def run_ssh(response)
24
+ route(/^set\s+(os)\s+for\s+(.+)\s+to\s+(.+)/i,
25
+ :set_server_os,
26
+ command: true,
27
+ help: { "set os for <machineName>" =>
28
+ "choices are 'windows' and 'linux'. This tells us to use ssh or winrm for the specified machine" })
13
29
 
14
- cmd = response.matches[0][0]
15
- server = response.matches[0][1]
16
- id_server_user = response.user.id + "_" + server + "_username"
17
- id_server_pass = response.user.id + "_" + server + "_password"
18
- usernm = redis.get(id_server_user)
19
- passwd = redis.get(id_server_pass)
20
- get_user_pass(response, server, "Username") unless usernm
21
- get_user_pass(response, server, "Password") unless passwd
30
+ route(/^clear\s+all\s+stored\s+(creds|credentials)/i,
31
+ :flush_redis,
32
+ command: true,
33
+ restrict_to: :admins,
34
+ help: { "clear all stored cred" =>
35
+ "blows away our redis data for lita-run-ssh" })
36
+
37
+ def run_command(response)
38
+ server = response.matches[0][1]
39
+ id_server_os = response.user.id + "_" + server + "_os"
40
+ os = redis.get(id_server_os)
41
+ get_os(response, server) unless['WINDOWS', 'LINUX'].include? os.to_s.upcase
42
+ if (os.to_s.upcase.eql? 'WINDOWS')
43
+ run_winrm(response)
44
+ elsif (os.to_s.upcase.eql? 'LINUX')
45
+ run_ssh(response)
46
+ else
47
+ response.reply("I was unable to find an OS for you on #{server}, please check you direct messages from me.")
48
+ end
49
+ end
22
50
 
23
- if usernm && passwd
24
- Net::SSH.start(server, usernm, :password => passwd) do |ssh|
25
- output = ssh.exec!(cmd)
26
- response.reply("```" + output + "```")
51
+ def run_ssh(response)
52
+ cmd = response.matches[0][0]
53
+ server = response.matches[0][1]
54
+ id_server_port = response.user.id + "_" + server + "_port"
55
+ port = redis.get(id_server_port)
56
+ if (port.nil?)
57
+ port = 22
58
+ end
59
+ id_server_user = response.user.id + "_" + server + "_username"
60
+ id_server_pass = response.user.id + "_" + server + "_password"
61
+ usernm = redis.get(id_server_user)
62
+ passwd = redis.get(id_server_pass)
63
+ get_user_pass(response, server, "Username") unless usernm
64
+ get_user_pass(response, server, "Password") unless passwd
65
+ if usernm && passwd && port
66
+ Net::SSH.start(server, usernm, :port => port, :password => passwd, :timeout => 10) do |ssh |
67
+ output = ssh.exec!(cmd)
68
+ if !output
69
+ response.reply("Command was run, but it appears there was no output to stdout or stderr.")
70
+ else
71
+ response.reply("```" + output.encode('utf-8', :invalid => :replace, :undef => :replace, :replace => '_') + "```")
27
72
  end
28
- elsif usernm
29
- response.reply_with_mention("I was unable to find a password for you on #{server}, please check you direct messages from me.")
30
- elsif passwd
31
- response.reply_with_mention("I was unable to find a username for you on #{server}, please check you direct messages from me.")
32
- else
33
- response.reply_with_mention("I was unable to find a username or password for you on #{server}, please check you direct messages from me.")
34
73
  end
74
+ elsif usernm
75
+ response.reply_with_mention("I was unable to find a password for you on #{server}, please check you direct messages from me.")
76
+ elsif passwd
77
+ response.reply_with_mention("I was unable to find a username for you on #{server}, please check you direct messages from me.")
78
+ else
79
+ response.reply_with_mention("I was unable to find a username or password for you on #{server}, please check you direct messages from me.")
80
+ end
81
+ end
35
82
 
83
+ def run_winrm(response)
84
+ cmd = response.matches[0][0]
85
+ server = response.matches[0][1]
86
+ id_server_port = response.user.id + "_" + server + "_port"
87
+ port = redis.get(id_server_port)
88
+ if (port.nil?)
89
+ port = 5985
36
90
  end
91
+ id_server_user = response.user.id + "_" + server + "_username"
92
+ id_server_pass = response.user.id + "_" + server + "_password"
93
+ usernm = redis.get(id_server_user)
94
+ passwd = redis.get(id_server_pass)
95
+ get_user_pass(response, server, "Username") unless usernm
96
+ get_user_pass(response, server, "Password") unless passwd
97
+ if usernm && passwd && port
98
+ endpoint = "http://#{server}:#{port}/wsman"
99
+ winrm = WinRM::WinRMWebService.new(endpoint, :negotiate, :user => usernm, :pass => passwd)
100
+ winrm.create_executor do |executor|
101
+ executor.run_powershell_script(cmd) do |stdout, stderr|
102
+ if stdout.to_s == '' && stderr.to_s == ''
103
+ response.reply("Command was run, but it appears there was no output to stdout or stderr.")
104
+ else
105
+ out = StringIO.new
106
+ out.puts stdout
107
+ response.reply(out.string)
108
+ end
109
+ end
110
+ end
111
+ elsif usernm
112
+ response.reply_with_mention("I was unable to find a password for you on #{server}, please check you direct messages from me.")
113
+ elsif passwd
114
+ response.reply_with_mention("I was unable to find a username for you on #{server}, please check you direct messages from me.")
115
+ else
116
+ response.reply_with_mention("I was unable to find a username or password for you on #{server}, please check you direct messages from me.")
117
+ end
118
+ end
119
+
120
+ def get_user_pass(response, server, * user_pass)
121
+ user_pass.each do |blah|
122
+ response.reply_privately("No #{blah.capitalize} found for you on #{server}\nPlease privately reply with:\n`Lita, set #{blah.capitalize} for #{server} to #{blah.upcase}`")
123
+ end
124
+ end
37
125
 
38
- def get_user_pass(response, server, *user_pass)
39
- user_pass.each do |blah|
40
- response.reply_privately("No #{blah.capitalize} found for you on #{server}\nPlease privately reply with:\n`Lita, Set #{blah.capitalize} for #{server} to #{blah.upcase}`")
126
+ def get_os(response, server)
127
+ response.reply_privately("No os found for you on #{server}\nPlease privately reply with:\n`Lita, set os for #{server} to windows` or \n`Lita, set os for #{server} to linux`")
128
+ end
129
+
130
+ def set_user_pass(response)
131
+ request = response.matches[0][0]
132
+ server = response.matches[0][1]
133
+ value = response.matches[0][2]
134
+ id_server_user_pass = response.user.id + "_" + server + "_" + request.downcase
135
+ if request && server && value
136
+ redis.set(id_server_user_pass, value)
137
+ response.reply_privately("#{request.capitalize} set")
138
+ id_server_user = response.user.id + "_" + server + "_username"
139
+ id_server_pass = response.user.id + "_" + server + "_password"
140
+ if redis.get(id_server_user) && redis.get(id_server_pass)
141
+ response.reply("Username and Password now set, please rerun your request")
41
142
  end
143
+ else
144
+ response.reply_privately("There seems to have been a problem setting that for you")
42
145
  end
146
+ end
43
147
 
44
- def set_user_pass(response)
45
- request = response.matches[0][0]
46
- server = response.matches[0][1]
47
- value = response.matches[0][2]
48
- id_server_user_pass = response.user.id + "_" + server + "_" + request.downcase
148
+ def flush_redis(response)
149
+ redis.flushdb
150
+ end
49
151
 
50
- if request && server && value
51
- redis.set(id_server_user_pass, value)
52
- response.reply_privately("#{request.capitalize} set")
53
- id_server_user = response.user.id + "_" + server + "_username"
54
- id_server_pass = response.user.id + "_" + server + "_password"
55
- if redis.get(id_server_user) && redis.get(id_server_pass)
56
- response.reply("Username and Password now set, please rerun your request")
152
+ def set_server_port(response)
153
+ request = response.matches[0][0]
154
+ server = response.matches[0][1]
155
+ value = response.matches[0][2]
156
+ id_server_port = response.user.id + "_" + server + "_port"
157
+ if request && server && value
158
+ redis.set(id_server_port, value)
159
+ if redis.get(id_server_port)
160
+ response.reply("Server Port now set to #{value}")
161
+ end
162
+ else
163
+ response.reply_privately("There seems to have been a problem setting that for you")
164
+ end
165
+ end
57
166
 
167
+ def set_server_os(response)
168
+ request = response.matches[0][0]
169
+ server = response.matches[0][1]
170
+ value = response.matches[0][2]
171
+ id_server_os = response.user.id + "_" + server + "_os"
172
+ if ['WINDOWS', 'LINUX'].include? value.to_s.upcase
173
+ if request && server && value
174
+ redis.set(id_server_os, value)
175
+ id_server_os = response.user.id + "_" + server + "_os"
176
+ if redis.get(id_server_os)
177
+ response.reply("Server os now set to #{value}.")
58
178
  end
59
179
  else
60
180
  response.reply_privately("There seems to have been a problem setting that for you")
61
181
  end
182
+ else
183
+ response.reply_privately("valid options for os are: windows, linux")
62
184
  end
63
-
64
- def flush_redis(response)
65
- redis.flushdb
66
- end
67
-
68
-
69
185
  end
70
186
 
71
187
  Lita.register_handler(SshRun)
188
+ end
72
189
  end
73
- end
190
+ end
data/lita-ssh-run.gemspec CHANGED
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "lita-ssh-run"
3
- spec.version = "0.0.1"
3
+ spec.version = "0.0.3"
4
4
  spec.authors = ["Dan Cash"]
5
5
  spec.email = ["dancash04@gmail.com"]
6
- spec.description = %q{Runs commands against remote server via ssh}
6
+ spec.description = %q{Runs commands against remote server via ssh or winrm}
7
7
  spec.summary = %q{See description}
8
8
  spec.homepage = "https://github.com/cashman04/lita-ssh-run"
9
9
  spec.license = "MIT"
@@ -16,6 +16,7 @@ Gem::Specification.new do |spec|
16
16
 
17
17
  spec.add_runtime_dependency "lita", ">= 4.1"
18
18
  spec.add_runtime_dependency 'net-ssh'
19
+ spec.add_runtime_dependency 'winrm'
19
20
 
20
21
  spec.add_development_dependency "bundler", "~> 1.3"
21
22
  spec.add_development_dependency "rake"
metadata CHANGED
@@ -1,128 +1,142 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-ssh-run
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Cash
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-28 00:00:00.000000000 Z
11
+ date: 2016-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lita
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: net-ssh
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: winrm
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - "~>"
59
+ - - ~>
46
60
  - !ruby/object:Gem::Version
47
61
  version: '1.3'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - ~>
53
67
  - !ruby/object:Gem::Version
54
68
  version: '1.3'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ">="
73
+ - - '>='
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ">="
80
+ - - '>='
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rack-test
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ">="
87
+ - - '>='
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ">="
94
+ - - '>='
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rspec
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - '>='
88
102
  - !ruby/object:Gem::Version
89
103
  version: 3.0.0
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - '>='
95
109
  - !ruby/object:Gem::Version
96
110
  version: 3.0.0
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: simplecov
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ">="
115
+ - - '>='
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ">="
122
+ - - '>='
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: coveralls
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ">="
129
+ - - '>='
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ">="
136
+ - - '>='
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
- description: Runs commands against remote server via ssh
139
+ description: Runs commands against remote server via ssh or winrm
126
140
  email:
127
141
  - dancash04@gmail.com
128
142
  executables: []
@@ -150,17 +164,17 @@ require_paths:
150
164
  - lib
151
165
  required_ruby_version: !ruby/object:Gem::Requirement
152
166
  requirements:
153
- - - ">="
167
+ - - '>='
154
168
  - !ruby/object:Gem::Version
155
169
  version: '0'
156
170
  required_rubygems_version: !ruby/object:Gem::Requirement
157
171
  requirements:
158
- - - ">="
172
+ - - '>='
159
173
  - !ruby/object:Gem::Version
160
174
  version: '0'
161
175
  requirements: []
162
176
  rubyforge_project:
163
- rubygems_version: 2.4.5
177
+ rubygems_version: 2.0.14
164
178
  signing_key:
165
179
  specification_version: 4
166
180
  summary: See description