cknife 0.1.8 → 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 +4 -4
- data/Gemfile +9 -8
- data/Gemfile.lock +106 -87
- data/README.md +74 -38
- data/Rakefile +6 -6
- data/VERSION +1 -1
- data/bin/cknifeaws +2 -502
- data/bin/cknifemon +5 -0
- data/cknife.gemspec +61 -51
- data/cknife.yml.sample +3 -0
- data/doc/remote_ubuntu_machine.md +87 -0
- data/lib/cknife/backgrounded_polling.rb +71 -0
- data/lib/cknife/cknife_aws.rb +572 -0
- data/lib/cknife/cknife_mon.rb +88 -0
- data/lib/cknife/cknife_mysql.rb +0 -1
- data/lib/cknife/cknife_pg.rb +11 -6
- data/lib/cknife/config.rb +2 -1
- data/lib/cknife/monitor.rb +42 -0
- data/lib/cknife/repetition.rb +12 -0
- metadata +84 -69
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'daemons'
|
3
|
+
require 'active_support/all'
|
4
|
+
require 'rest_client'
|
5
|
+
|
6
|
+
require 'cknife/config'
|
7
|
+
require 'cknife/monitor'
|
8
|
+
require 'cknife/repetition'
|
9
|
+
|
10
|
+
module CKnife
|
11
|
+
class CKnifeMon < Thor
|
12
|
+
|
13
|
+
no_tasks do
|
14
|
+
def config
|
15
|
+
@config ||= Config
|
16
|
+
end
|
17
|
+
|
18
|
+
def conf
|
19
|
+
@conf ||= {
|
20
|
+
:url => config['mon.url'],
|
21
|
+
:api_key => config['mon.api_key']
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def monitor
|
26
|
+
@monitor ||= CKnife::Monitor.new(conf[:url], :api_key => conf[:api_key])
|
27
|
+
end
|
28
|
+
|
29
|
+
def daemonized_task
|
30
|
+
conf # cache file before we lose descriptor
|
31
|
+
|
32
|
+
if @daemonized_task.nil?
|
33
|
+
|
34
|
+
p = proc do
|
35
|
+
while true
|
36
|
+
sleep 5
|
37
|
+
monitor.poll_background
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
options = {
|
42
|
+
:app_name => 'cknife_monitor',
|
43
|
+
:mode => :proc,
|
44
|
+
:proc => p,
|
45
|
+
:log_output => true,
|
46
|
+
:output_logfilename => "cknife_monitor.log",
|
47
|
+
:dir_mode => :normal,
|
48
|
+
:dir => File.expand_path('.')
|
49
|
+
}
|
50
|
+
@group ||= Daemons::ApplicationGroup.new(options[:app_name], options)
|
51
|
+
|
52
|
+
|
53
|
+
@daemonized_task = @group.new_application(options)
|
54
|
+
end
|
55
|
+
|
56
|
+
@daemonized_task
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
desc "start", "Start monitor."
|
61
|
+
def start
|
62
|
+
say("Starting.")
|
63
|
+
daemonized_task.start
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "status", "Show status of monitor."
|
67
|
+
def status
|
68
|
+
daemonized_task.show_status
|
69
|
+
end
|
70
|
+
|
71
|
+
desc "restart", "Restart monitor."
|
72
|
+
def restart
|
73
|
+
stop
|
74
|
+
start
|
75
|
+
end
|
76
|
+
|
77
|
+
desc "stop", "Stop monitor."
|
78
|
+
def stop
|
79
|
+
if !daemonized_task.running?
|
80
|
+
say("Not running.", :red)
|
81
|
+
return
|
82
|
+
end
|
83
|
+
|
84
|
+
daemonized_task.stop
|
85
|
+
say("Stopped.")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/cknife/cknife_mysql.rb
CHANGED
data/lib/cknife/cknife_pg.rb
CHANGED
@@ -67,7 +67,7 @@ class CKnifePg < Thor
|
|
67
67
|
# pgpass format
|
68
68
|
File.open(pg_pass_file, "w", 0600) { |f| f.write "#{conf[:host]}:#{conf[:port]}:*:#{conf[:username]}:#{conf[:password]}" }
|
69
69
|
|
70
|
-
result = yield
|
70
|
+
result = yield # don't know what we're planning to do with the result here...
|
71
71
|
|
72
72
|
FileUtils.rm(pg_pass_file)
|
73
73
|
if File.exists?(pg_pass_file)
|
@@ -109,12 +109,17 @@ class CKnifePg < Thor
|
|
109
109
|
with_pg_pass_file do
|
110
110
|
my_pid = pg_pass_file_execute(psql_invocation, "select pg_backend_pid();").split.first
|
111
111
|
ids_output = pg_pass_file_execute(psql_invocation, "SELECT procpid, application_name FROM pg_stat_activity WHERE datname = '#{conf[:database]}' AND procpid != #{my_pid};")
|
112
|
-
table = ids_output.split.map { |line| line.split("|") }
|
113
|
-
print_table([["PID", "Application Name"]] + table, :indent => 2)
|
114
|
-
ids = table.map { |row| row.first }
|
115
112
|
|
116
|
-
|
117
|
-
|
113
|
+
if ids_output.nil?
|
114
|
+
say("Error while looking for session information. Possibly a failed login.")
|
115
|
+
else
|
116
|
+
table = ids_output.split.map { |line| line.split("|") }
|
117
|
+
print_table([["PID", "Application Name"]] + table, :indent => 2)
|
118
|
+
ids = table.map { |row| row.first }
|
119
|
+
|
120
|
+
say("If you would like to kill these sessions, you can do so with this command:")
|
121
|
+
say("kill -9 #{ids.join(' ')}")
|
122
|
+
end
|
118
123
|
end
|
119
124
|
end
|
120
125
|
|
data/lib/cknife/config.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'action_view'
|
2
2
|
require 'pathname'
|
3
|
+
require 'yaml'
|
3
4
|
|
4
5
|
module CKnife
|
5
6
|
class Formatter
|
@@ -29,7 +30,7 @@ module CKnife
|
|
29
30
|
begin
|
30
31
|
@config.merge!(YAML.load(config_file.read))
|
31
32
|
rescue
|
32
|
-
|
33
|
+
puts "Found, but could not parse config: #{config_file}"
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'cknife/backgrounded_polling'
|
2
|
+
|
3
|
+
module CKnife
|
4
|
+
class Monitor
|
5
|
+
attr_accessor :url, :api_key, :last_error, :last_result, :last_polled_at, :consecutive_error_count, :active
|
6
|
+
|
7
|
+
include BackgroundedPolling
|
8
|
+
|
9
|
+
def initialize(url, options = {})
|
10
|
+
self.url = url
|
11
|
+
self.active = true
|
12
|
+
self.consecutive_error_count = 0
|
13
|
+
self.last_polled_at = nil
|
14
|
+
self.api_key = options[:api_key] if options[:api_key]
|
15
|
+
end
|
16
|
+
|
17
|
+
def target_endpoint
|
18
|
+
u = URI.parse(url)
|
19
|
+
u.userinfo = "#{api_key}:#{api_key}" if api_key
|
20
|
+
u.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
def before_poll
|
24
|
+
self.last_result = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def handle_poll_result(response, request, result)
|
28
|
+
self.last_result = response.net_http_res.code.to_i
|
29
|
+
end
|
30
|
+
|
31
|
+
def payload
|
32
|
+
res = `cat /proc/meminfo`
|
33
|
+
lines = res.split("\n")
|
34
|
+
matcher = /:\s+(\d+)/
|
35
|
+
lines[0] =~ matcher
|
36
|
+
total = $1
|
37
|
+
lines[1] =~ matcher
|
38
|
+
free = $1
|
39
|
+
stats = { :free => free.to_i, :total => total.to_i }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# This used to be in the morality directory in the MRivera CRM app.
|
4
|
+
# It may be refactored to retain that name again in some fashion
|
5
|
+
# in the future. - M. Rivera 12/15/15
|
6
|
+
#
|
7
|
+
|
8
|
+
module CKnife
|
9
|
+
class Repetition
|
10
|
+
MAX_CONSECUTIVE = 3
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,220 +1,228 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cknife
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Michael Rivera
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
- - ~>
|
19
|
+
version: 1.8.0
|
20
|
+
- - "~>"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '1'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
- - ~>
|
29
|
+
version: 1.8.0
|
30
|
+
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '1'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: nokogiri
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- -
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
40
|
-
- - ~>
|
39
|
+
version: 1.8.2
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '1'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- -
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
50
|
-
- - ~>
|
49
|
+
version: 1.8.2
|
50
|
+
- - "~>"
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '1'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: i18n
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
|
-
- -
|
57
|
+
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version:
|
59
|
+
version: 0.6.6
|
60
60
|
type: :runtime
|
61
61
|
prerelease: false
|
62
62
|
version_requirements: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
|
-
- -
|
64
|
+
- - ">="
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version:
|
66
|
+
version: 0.6.6
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
68
|
name: activesupport
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
|
-
- - ~>
|
71
|
+
- - "~>"
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
73
|
+
version: 4.2.9
|
74
74
|
type: :runtime
|
75
75
|
prerelease: false
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
|
-
- - ~>
|
78
|
+
- - "~>"
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version:
|
80
|
+
version: 4.2.9
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: actionpack
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- - ~>
|
85
|
+
- - "~>"
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
87
|
+
version: 4.2.9
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
|
-
- - ~>
|
92
|
+
- - "~>"
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
94
|
+
version: 4.2.9
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
96
|
name: mail
|
97
97
|
requirement: !ruby/object:Gem::Requirement
|
98
98
|
requirements:
|
99
|
-
- - ~>
|
99
|
+
- - "~>"
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
101
|
+
version: 2.5.5
|
102
102
|
type: :runtime
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
|
-
- - ~>
|
106
|
+
- - "~>"
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
version:
|
108
|
+
version: 2.5.5
|
109
109
|
- !ruby/object:Gem::Dependency
|
110
110
|
name: thor
|
111
111
|
requirement: !ruby/object:Gem::Requirement
|
112
112
|
requirements:
|
113
|
-
- -
|
113
|
+
- - ">="
|
114
114
|
- !ruby/object:Gem::Version
|
115
115
|
version: '0.14'
|
116
|
-
- - ~>
|
116
|
+
- - "~>"
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: '0'
|
119
119
|
type: :runtime
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
|
-
- -
|
123
|
+
- - ">="
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0.14'
|
126
|
-
- - ~>
|
126
|
+
- - "~>"
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: '0'
|
129
129
|
- !ruby/object:Gem::Dependency
|
130
130
|
name: builder
|
131
131
|
requirement: !ruby/object:Gem::Requirement
|
132
132
|
requirements:
|
133
|
-
- - ~>
|
133
|
+
- - "~>"
|
134
134
|
- !ruby/object:Gem::Version
|
135
135
|
version: '3.0'
|
136
136
|
type: :runtime
|
137
137
|
prerelease: false
|
138
138
|
version_requirements: !ruby/object:Gem::Requirement
|
139
139
|
requirements:
|
140
|
-
- - ~>
|
140
|
+
- - "~>"
|
141
141
|
- !ruby/object:Gem::Version
|
142
142
|
version: '3.0'
|
143
143
|
- !ruby/object:Gem::Dependency
|
144
|
-
name: fog
|
144
|
+
name: fog-aws
|
145
145
|
requirement: !ruby/object:Gem::Requirement
|
146
146
|
requirements:
|
147
|
-
- -
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
version: '1.17'
|
150
|
-
- - '>='
|
147
|
+
- - "<"
|
151
148
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
149
|
+
version: '3.0'
|
153
150
|
type: :runtime
|
154
151
|
prerelease: false
|
155
152
|
version_requirements: !ruby/object:Gem::Requirement
|
156
153
|
requirements:
|
157
|
-
- -
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '1.17'
|
160
|
-
- - '>='
|
154
|
+
- - "<"
|
161
155
|
- !ruby/object:Gem::Version
|
162
|
-
version: '
|
156
|
+
version: '3.0'
|
163
157
|
- !ruby/object:Gem::Dependency
|
164
158
|
name: unf
|
165
159
|
requirement: !ruby/object:Gem::Requirement
|
166
160
|
requirements:
|
167
|
-
- -
|
161
|
+
- - ">="
|
168
162
|
- !ruby/object:Gem::Version
|
169
163
|
version: '0.1'
|
170
|
-
- - ~>
|
164
|
+
- - "~>"
|
171
165
|
- !ruby/object:Gem::Version
|
172
166
|
version: '0'
|
173
167
|
type: :runtime
|
174
168
|
prerelease: false
|
175
169
|
version_requirements: !ruby/object:Gem::Requirement
|
176
170
|
requirements:
|
177
|
-
- -
|
171
|
+
- - ">="
|
178
172
|
- !ruby/object:Gem::Version
|
179
173
|
version: '0.1'
|
180
|
-
- - ~>
|
174
|
+
- - "~>"
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
177
|
+
- !ruby/object:Gem::Dependency
|
178
|
+
name: daemons
|
179
|
+
requirement: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
181
|
+
- - ">="
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: '0'
|
184
|
+
type: :runtime
|
185
|
+
prerelease: false
|
186
|
+
version_requirements: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - ">="
|
181
189
|
- !ruby/object:Gem::Version
|
182
190
|
version: '0'
|
183
191
|
- !ruby/object:Gem::Dependency
|
184
192
|
name: bundler
|
185
193
|
requirement: !ruby/object:Gem::Requirement
|
186
194
|
requirements:
|
187
|
-
- - ~>
|
195
|
+
- - "~>"
|
188
196
|
- !ruby/object:Gem::Version
|
189
197
|
version: '1.0'
|
190
198
|
type: :development
|
191
199
|
prerelease: false
|
192
200
|
version_requirements: !ruby/object:Gem::Requirement
|
193
201
|
requirements:
|
194
|
-
- - ~>
|
202
|
+
- - "~>"
|
195
203
|
- !ruby/object:Gem::Version
|
196
204
|
version: '1.0'
|
197
205
|
- !ruby/object:Gem::Dependency
|
198
206
|
name: jeweler
|
199
207
|
requirement: !ruby/object:Gem::Requirement
|
200
208
|
requirements:
|
201
|
-
- - ~>
|
209
|
+
- - "~>"
|
202
210
|
- !ruby/object:Gem::Version
|
203
|
-
version: '2.
|
211
|
+
version: '2.1'
|
204
212
|
type: :development
|
205
213
|
prerelease: false
|
206
214
|
version_requirements: !ruby/object:Gem::Requirement
|
207
215
|
requirements:
|
208
|
-
- - ~>
|
216
|
+
- - "~>"
|
209
217
|
- !ruby/object:Gem::Version
|
210
|
-
version: '2.
|
211
|
-
description:
|
212
|
-
|
213
|
-
email: mikedll@mikedll.com
|
218
|
+
version: '2.1'
|
219
|
+
description: A collection of command line tools, especially for popular API services.
|
220
|
+
email: soymrmike@gmail.com
|
214
221
|
executables:
|
215
222
|
- cknifeaws
|
216
223
|
- cknifedub
|
217
224
|
- cknifemail
|
225
|
+
- cknifemon
|
218
226
|
- cknifemysql
|
219
227
|
- cknifenowtimestamp
|
220
228
|
- cknifepg
|
@@ -225,8 +233,8 @@ extra_rdoc_files:
|
|
225
233
|
- LICENSE
|
226
234
|
- README.md
|
227
235
|
files:
|
228
|
-
- .ruby-gemset
|
229
|
-
- .ruby-version
|
236
|
+
- ".ruby-gemset"
|
237
|
+
- ".ruby-version"
|
230
238
|
- Gemfile
|
231
239
|
- Gemfile.lock
|
232
240
|
- LICENSE
|
@@ -236,6 +244,7 @@ files:
|
|
236
244
|
- bin/cknifeaws
|
237
245
|
- bin/cknifedub
|
238
246
|
- bin/cknifemail
|
247
|
+
- bin/cknifemon
|
239
248
|
- bin/cknifemysql
|
240
249
|
- bin/cknifenowtimestamp
|
241
250
|
- bin/cknifepg
|
@@ -243,13 +252,19 @@ files:
|
|
243
252
|
- bin/cknifezerigo
|
244
253
|
- cknife.gemspec
|
245
254
|
- cknife.yml.sample
|
255
|
+
- doc/remote_ubuntu_machine.md
|
256
|
+
- lib/cknife/backgrounded_polling.rb
|
257
|
+
- lib/cknife/cknife_aws.rb
|
258
|
+
- lib/cknife/cknife_mon.rb
|
246
259
|
- lib/cknife/cknife_mysql.rb
|
247
260
|
- lib/cknife/cknife_pg.rb
|
248
261
|
- lib/cknife/command_line.rb
|
249
262
|
- lib/cknife/config.rb
|
250
|
-
|
263
|
+
- lib/cknife/monitor.rb
|
264
|
+
- lib/cknife/repetition.rb
|
265
|
+
homepage: http://github.com/mikedll/cknife
|
251
266
|
licenses:
|
252
|
-
-
|
267
|
+
- ''
|
253
268
|
metadata: {}
|
254
269
|
post_install_message:
|
255
270
|
rdoc_options: []
|
@@ -257,18 +272,18 @@ require_paths:
|
|
257
272
|
- lib
|
258
273
|
required_ruby_version: !ruby/object:Gem::Requirement
|
259
274
|
requirements:
|
260
|
-
- -
|
275
|
+
- - ">="
|
261
276
|
- !ruby/object:Gem::Version
|
262
277
|
version: '0'
|
263
278
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
264
279
|
requirements:
|
265
|
-
- -
|
280
|
+
- - ">="
|
266
281
|
- !ruby/object:Gem::Version
|
267
282
|
version: '0'
|
268
283
|
requirements: []
|
269
284
|
rubyforge_project:
|
270
|
-
rubygems_version: 2.
|
285
|
+
rubygems_version: 2.6.14.1
|
271
286
|
signing_key:
|
272
287
|
specification_version: 4
|
273
|
-
summary:
|
288
|
+
summary: CKnife
|
274
289
|
test_files: []
|