web47command 0.0.4 → 0.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/README.md +2 -0
- data/lib/app/models/command_job.rb +102 -42
- data/lib/web47command/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 507c57273933c17f93c493bc950163b4434ffc5ac3a0396ee83aabc3c60d9355
|
4
|
+
data.tar.gz: 2036dbb4fcb481b60c377c91dd2eaec8b9fbf61628526a063358b1b7bab58b95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 391a11146443d5312c30d595a2e494339f1461854117512a9ebd1cb13b24f32c25f91fff710290265e94b774ecc27c4b31437e5cc3e48953110ca20fee965991
|
7
|
+
data.tar.gz: 16b2084ce7f199e310462056e386d69fb559ef227b20e48b1f4b92e169826a9543c24e13e61fba045b30935ddb7febd5f8bc1b1283bc84fa6fc5e37ec49d731a
|
data/README.md
CHANGED
@@ -41,7 +41,7 @@ class CommandJob
|
|
41
41
|
# Who started this job
|
42
42
|
#
|
43
43
|
def display_started_by
|
44
|
-
started_by.present? ? started_by.
|
44
|
+
started_by.present? ? started_by.name : 'System'
|
45
45
|
end
|
46
46
|
|
47
47
|
#
|
@@ -62,113 +62,164 @@ class CommandJob
|
|
62
62
|
# True if in new status
|
63
63
|
#
|
64
64
|
def new_job?
|
65
|
-
|
65
|
+
job_state?(STATE_NEW)
|
66
66
|
end
|
67
67
|
|
68
68
|
#
|
69
69
|
# True if in WIP status
|
70
70
|
#
|
71
71
|
def work_in_progress?
|
72
|
-
[
|
72
|
+
job_state?([STATE_WIP, STATE_RETRYING])
|
73
73
|
end
|
74
74
|
|
75
75
|
#
|
76
76
|
# True if in success status
|
77
77
|
#
|
78
78
|
def succeeded?
|
79
|
-
|
79
|
+
job_state?(STATE_SUCCESS)
|
80
80
|
end
|
81
81
|
|
82
82
|
#
|
83
83
|
# True if in fail status
|
84
84
|
#
|
85
|
-
def
|
86
|
-
|
85
|
+
def failure?
|
86
|
+
job_state?(STATE_FAIL)
|
87
87
|
end
|
88
88
|
|
89
89
|
#
|
90
90
|
# If we is finished, failed or success
|
91
91
|
#
|
92
92
|
def completed?
|
93
|
-
[STATE_CANCELLED, STATE_FAIL, STATE_SUCCESS]
|
93
|
+
job_state?([STATE_CANCELLED, STATE_FAIL, STATE_SUCCESS])
|
94
94
|
end
|
95
95
|
|
96
96
|
#
|
97
97
|
# Job has not finished, failure or success
|
98
98
|
#
|
99
|
-
def
|
99
|
+
def running?
|
100
100
|
!completed?
|
101
101
|
end
|
102
102
|
|
103
|
-
alias
|
103
|
+
alias incomplete? running?
|
104
104
|
|
105
105
|
#
|
106
106
|
# If we are cancelled
|
107
107
|
#
|
108
108
|
def cancelled?
|
109
|
-
|
109
|
+
job_state?(STATE_CANCELLED)
|
110
110
|
end
|
111
111
|
|
112
|
-
def
|
113
|
-
|
114
|
-
job.cancelled?
|
115
|
-
rescue StandardError => error
|
116
|
-
App47Logger.log_warn "Unable to check job cancelled #{job}", error
|
117
|
-
true
|
112
|
+
def failure_or_cancelled?
|
113
|
+
job_state?([STATE_FAIL, STATE_CANCELLED], true)
|
118
114
|
end
|
119
115
|
|
120
|
-
|
121
|
-
|
122
|
-
|
116
|
+
#
|
117
|
+
# Fetch the latest version of this instance from the database and check the state against the required
|
118
|
+
# state. If there is a match, then return true, otherwise return false.
|
119
|
+
# If there is an error, return the default.
|
120
|
+
#
|
121
|
+
def job_state?(states, default = false)
|
122
|
+
states.is_a?(Array) ? states.include?(state) : states.eql?(state)
|
123
123
|
rescue StandardError => error
|
124
|
-
App47Logger.log_warn "Unable to check job cancelled #{
|
125
|
-
|
124
|
+
App47Logger.log_warn "Unable to check job failed or cancelled #{self.inspect}", error
|
125
|
+
default
|
126
126
|
end
|
127
127
|
|
128
128
|
#
|
129
129
|
# Return the job's status and information in a hash that could be used to return to a calling
|
130
130
|
# api
|
131
131
|
#
|
132
|
-
def
|
132
|
+
def current_status
|
133
133
|
status = { state: state }
|
134
134
|
status[:message] = error_message if error_message.present?
|
135
135
|
status
|
136
136
|
end
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
138
|
+
#
|
139
|
+
# Perform this job in the background
|
140
|
+
#
|
141
|
+
def perform_later
|
142
|
+
perform
|
143
|
+
end
|
144
|
+
|
145
|
+
handle_asynchronously :perform_later
|
146
|
+
|
147
|
+
#
|
148
|
+
# Steps to execute before a run
|
149
|
+
#
|
150
|
+
def before_run
|
151
|
+
case state
|
152
|
+
when STATE_NEW
|
153
|
+
set retries: 0,
|
154
|
+
started_at: Time.now.utc,
|
155
|
+
finished_at: nil,
|
156
|
+
error_message: nil,
|
157
|
+
result: nil,
|
158
|
+
state: STATE_WIP
|
159
|
+
when STATE_RETRYING
|
160
|
+
set retries: 0,
|
161
|
+
started_at: Time.now.utc,
|
162
|
+
finished_at: nil,
|
163
|
+
error_message: nil,
|
164
|
+
result: nil
|
165
|
+
when STATE_FAIL
|
166
|
+
set retries: 0,
|
167
|
+
started_at: Time.now.utc,
|
168
|
+
finished_at: nil,
|
169
|
+
error_message: nil,
|
170
|
+
state: STATE_RETRYING,
|
171
|
+
result: nil
|
172
|
+
else
|
173
|
+
set retries: 0, started_at: Time.now.utc, finished_at: nil, result: nil
|
142
174
|
end
|
175
|
+
end
|
143
176
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
177
|
+
#
|
178
|
+
# Steps to execute after a run
|
179
|
+
#
|
180
|
+
def after_run
|
181
|
+
case state
|
182
|
+
when STATE_RETRYING, STATE_WIP
|
183
|
+
set finished_at: Time.now.utc, error_message: nil, state: STATE_SUCCESS
|
184
|
+
when STATE_SUCCESS
|
185
|
+
set finished_at: Time.now.utc, error_message: nil
|
186
|
+
else
|
187
|
+
set finished_at: Time.now.utc
|
150
188
|
end
|
151
189
|
end
|
152
190
|
|
191
|
+
#
|
192
|
+
#
|
193
|
+
# Perform the command job
|
194
|
+
#
|
195
|
+
def perform
|
196
|
+
before_run
|
197
|
+
run
|
198
|
+
after_run
|
199
|
+
rescue StandardError => error
|
200
|
+
log_error 'Unable to start job', error
|
201
|
+
set state: STATE_FAIL, error_message: error.message
|
202
|
+
end
|
203
|
+
|
204
|
+
alias perform_now perform
|
205
|
+
|
206
|
+
#
|
207
|
+
# Run the job, handling any failures that might happen
|
208
|
+
#
|
153
209
|
def run
|
154
|
-
|
155
|
-
# Run the job
|
156
|
-
run!
|
157
|
-
set error_message: '', state: STATE_SUCCESS
|
210
|
+
run! unless cancelled?
|
158
211
|
rescue StandardError => error
|
159
|
-
if retries >= max_retries
|
212
|
+
if (retries + 1) >= max_retries
|
160
213
|
log_error "Unable to run job id: #{id}, done retrying", error
|
161
214
|
set state: STATE_FAIL, error_message: "Failed final attempt: #{error.message}"
|
162
215
|
else
|
163
216
|
log_error "Unable to run job id: #{id}, retrying!!", error
|
164
217
|
add_log "Unable to run job: #{error.message}, retrying!!"
|
165
|
-
set error_message: "Failed attempt # #{retries}: #{error.message}", retries: retries + 1
|
166
|
-
|
218
|
+
set error_message: "Failed attempt # #{retries}: #{error.message}", retries: retries + 1, state: STATE_RETRYING
|
219
|
+
run
|
167
220
|
end
|
168
221
|
end
|
169
222
|
|
170
|
-
handle_asynchronously :run if Delayed::Worker.delay_jobs
|
171
|
-
|
172
223
|
#
|
173
224
|
# Determine the correct action to take and get it started
|
174
225
|
#
|
@@ -191,6 +242,8 @@ class CommandJob
|
|
191
242
|
download = URI.parse(file_url).open
|
192
243
|
IO.copy_stream(download, file_path)
|
193
244
|
add_log "Downloaded file: #{file_url} to #{file_path}"
|
245
|
+
rescue StandardError => error
|
246
|
+
raise "Unable to download file from #{file_url} to #{file_path}, error: ##{error.message}"
|
194
247
|
end
|
195
248
|
|
196
249
|
#
|
@@ -203,6 +256,8 @@ class CommandJob
|
|
203
256
|
else
|
204
257
|
add_log "File not found: #{from_path}, copy not performed"
|
205
258
|
end
|
259
|
+
rescue StandardError => error
|
260
|
+
raise "Unable to copy file from #{from_path} to #{to_path}, error: ##{error.message}"
|
206
261
|
end
|
207
262
|
|
208
263
|
#
|
@@ -263,7 +318,11 @@ class CommandJob
|
|
263
318
|
end
|
264
319
|
output = 'Success' if output.blank?
|
265
320
|
command = mask_keywords(command, options[:mask_texts])
|
266
|
-
|
321
|
+
if block_given?
|
322
|
+
yield output
|
323
|
+
else
|
324
|
+
logs.create!(dir: dir, command: command, message: output)
|
325
|
+
end
|
267
326
|
check_for_text(output, options[:error_texts], true)
|
268
327
|
check_for_text(output, options[:required_texts], false)
|
269
328
|
output
|
@@ -311,4 +370,5 @@ class CommandJob
|
|
311
370
|
def sort_fields
|
312
371
|
%i[created_at]
|
313
372
|
end
|
373
|
+
|
314
374
|
end
|
data/lib/web47command/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web47command
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Schroeder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|