processwanker 0.0.12 → 0.0.13

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
  SHA256:
3
- metadata.gz: '099be78411089bd946e89545a0a1a60739fcc484b0360642baf44caad62db663'
4
- data.tar.gz: a048938a92a999d686050d6a560b0edd40c2e16cd6dc7c00ea8247da68f1a02d
3
+ metadata.gz: bdbff70c0aafb84b989efd3b5fa877353c92914ec98b4c2dead92f3b491e68bd
4
+ data.tar.gz: 7f3f5fc365fd1abef1d240889a8dbf476cce1d55cefd73a24956e6007a070511
5
5
  SHA512:
6
- metadata.gz: cb088e295737eff9d74c5d4af60bad6178dce388d8d7337a6b9164c273b53131745d799f5db9372d0195b3061bab141ac7b6f9330f2ddebb2215782394008a55
7
- data.tar.gz: 529eaa9febd6bf27c9edeff0e020ce35f140ec86dc5041c08df3bd99f1d1a54d706314c66a7ac3ff7d0d7beab0aca8915d0fe67789750fad323dff639c7f7dd6
6
+ metadata.gz: b86a12d0cc175c254b4e7c035edd0586ee8ed4c8702e8595160b4d84439537a31087bbb2a9af82212a9691f9948e874910e36756a67895879b6e746b9b3706c8
7
+ data.tar.gz: 9cb0bbdd3aaaf74fa0b622838de5d80f94783d4f2b460e3718c35f9c7d0a296c69ea9298a4e0d9b4b494f36f05a5c03fa136ddd5de02823f0dfc1ea042d2c1ad
data/Manifest CHANGED
@@ -31,4 +31,5 @@ lib/service_classes/process_service.rb
31
31
  lib/service_classes/upstart_service.rb
32
32
  lib/service_mgr.rb
33
33
  lib/util.rb
34
+ processwanker.gemspec
34
35
  Manifest
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('processwanker', '0.0.12') do |p|
5
+ Echoe.new('processwanker', '0.0.13') do |p|
6
6
  p.description = "Process monitoring and remote control system"
7
7
  p.url = "https://github.com/strags/processwanker"
8
8
  p.author = "Ben Stragnell"
data/bin/pw CHANGED
File without changes
@@ -25,7 +25,7 @@ module ProcessWanker
25
25
  # walk from the current object up to the root, looking for the named attribute
26
26
  #
27
27
  ############################################################################
28
-
28
+
29
29
  def find_attributes(name)
30
30
  r=[]
31
31
  p=self
@@ -44,7 +44,7 @@ module ProcessWanker
44
44
  def get_auth()
45
45
  find_attributes("auth").first
46
46
  end
47
-
47
+
48
48
  end
49
49
 
50
50
  ############################################################################
@@ -62,7 +62,7 @@ module ProcessWanker
62
62
  ############################################################################
63
63
 
64
64
  class Deferred
65
-
65
+
66
66
  def initialize(deferred_container,deferred_args,deferred_block,deferred_builder)
67
67
  @deferred_container=deferred_container
68
68
  @deferred_args=deferred_args
@@ -70,7 +70,7 @@ module ProcessWanker
70
70
  @deferred_builder=deferred_builder
71
71
  @deferred_object=nil
72
72
  end
73
-
73
+
74
74
  def method_missing(name,*args)
75
75
  if(!@deferred_object)
76
76
  @deferred_object=@deferred_builder.new.build(
@@ -80,9 +80,9 @@ module ProcessWanker
80
80
  end
81
81
  @deferred_object.send(name,*args)
82
82
  end
83
-
83
+
84
84
  end
85
-
85
+
86
86
  ############################################################################
87
87
  #
88
88
  #
@@ -97,16 +97,16 @@ module ProcessWanker
97
97
  instance_eval(&block) if(block)
98
98
  @config
99
99
  end
100
-
100
+
101
101
  def klass
102
- cn=self.class.name
102
+ cn=self.class.name + ""
103
103
  cn.gsub!("Builder","")
104
104
  cn=cn.split("::")[-1]
105
105
  ProcessWanker::const_get(cn)
106
106
  end
107
-
107
+
108
108
  end
109
-
109
+
110
110
  ############################################################################
111
111
  #
112
112
  #
@@ -118,17 +118,17 @@ module ProcessWanker
118
118
  require 'erb'
119
119
 
120
120
  @@config_path=ENV["PW_CFG"] || "/etc/pw/pw.cfg"
121
-
121
+
122
122
  def get_config_path()
123
123
  @@config_path
124
124
  end
125
125
  module_function :get_config_path
126
-
126
+
127
127
  def set_config_path(path)
128
128
  @@config_path=path
129
129
  end
130
130
  module_function :set_config_path
131
-
131
+
132
132
  def load_config(path)
133
133
  ProcessWanker::loaded_config=nil
134
134
  # load(path)
@@ -137,9 +137,9 @@ module ProcessWanker
137
137
  ProcessWanker::loaded_config
138
138
  end
139
139
  module_function :load_config
140
-
140
+
141
141
  end
142
-
142
+
143
143
 
144
144
  ############################################################################
145
145
  #
@@ -155,6 +155,6 @@ module ProcessWanker
155
155
  @loaded_config=ConfigurationBuilder.new.build(nil,[],block)
156
156
  end
157
157
  module_function :config
158
-
159
-
158
+
159
+
160
160
  end
data/lib/service.rb CHANGED
@@ -11,17 +11,17 @@ require 'log'
11
11
  require 'events'
12
12
 
13
13
  module ProcessWanker
14
-
14
+
15
15
  class Service
16
-
16
+
17
17
  include Log
18
-
18
+
19
19
  ############################################################################
20
20
  #
21
21
  # current state
22
22
  #
23
23
  ############################################################################
24
-
24
+
25
25
  attr_accessor :params
26
26
  attr_accessor :want_state
27
27
  attr_accessor :last_action_time
@@ -37,7 +37,7 @@ module ProcessWanker
37
37
  attr_accessor :config_node
38
38
  attr_accessor :want_state_mode
39
39
  attr_accessor :stable
40
-
40
+
41
41
  ############################################################################
42
42
  #
43
43
  # initialize
@@ -55,11 +55,13 @@ module ProcessWanker
55
55
  # :fail_trigger_count number of transitions to trigger failing
56
56
  # :fail_suppress_secs seconds to delay actions after failing detected
57
57
  # :initial_state (defaults to current state) :up or :down
58
+ # :watchdog_file file to watch for mtime
59
+ # :watchdog_timeout_secs restart service if watchdog_file hasn't been modified in this number of seconds
58
60
  #
59
61
  ############################################################################
60
-
62
+
61
63
  def initialize(iparams)
62
-
64
+
63
65
  # extract params
64
66
  extract_params(
65
67
  iparams,
@@ -76,13 +78,15 @@ module ProcessWanker
76
78
  :initial_state,
77
79
  :dependencies,
78
80
  :log_file,
81
+ :watchdog_file,
82
+ :watchdog_timeout_secs
79
83
  ])
80
84
 
81
85
  # warn about extra params
82
86
  iparams.keys.each do |k|
83
87
  warn "warning: ignoring unrecognized parameter: #{k.to_s}"
84
88
  end
85
-
89
+
86
90
  # apply defaults
87
91
  @params={
88
92
  :min_action_delay_secs => 1,
@@ -92,11 +96,11 @@ module ProcessWanker
92
96
  :group_name => "default",
93
97
  :start_grace_secs => 5,
94
98
  :stop_grace_secs => 5,
95
- :dependencies => []
99
+ :dependencies => [],
96
100
  }.merge(@params)
97
-
98
- @params[:tags] ||= []
99
-
101
+
102
+ @params[:tags] ||= []
103
+
100
104
  # convert necessary things to symbols
101
105
  @params[:initial_state] = @params[:initial_state].to_sym if(@params[:initial_state])
102
106
 
@@ -113,11 +117,11 @@ module ProcessWanker
113
117
  @suppress=false
114
118
  @want_state_mode=:boot
115
119
  @stable=false
116
-
120
+
117
121
  # register with the manager
118
122
  ServiceMgr::register_service(self)
119
123
  end
120
-
124
+
121
125
  ############################################################################
122
126
  #
123
127
  #
@@ -132,7 +136,7 @@ module ProcessWanker
132
136
  end
133
137
  end
134
138
  end
135
-
139
+
136
140
  ############################################################################
137
141
  #
138
142
  #
@@ -146,70 +150,70 @@ module ProcessWanker
146
150
  params.delete(k)
147
151
  end
148
152
  end
149
-
153
+
150
154
  ############################################################################
151
155
  #
152
156
  # return the host-wide unique name of the service
153
157
  #
154
158
  ############################################################################
155
-
159
+
156
160
  def name
157
161
  @params[:name]
158
- end
159
-
162
+ end
163
+
160
164
  ############################################################################
161
165
  #
162
166
  # return the name of the group this process belongs to
163
167
  #
164
168
  ############################################################################
165
-
169
+
166
170
  def group_name
167
171
  @params[:group_name]
168
- end
169
-
172
+ end
173
+
170
174
  ############################################################################
171
175
  #
172
176
  # start the service. should not block for a considerable amount of time
173
177
  #
174
178
  ############################################################################
175
-
179
+
176
180
  def do_start(attempt_ct)
177
181
  raise "method not defined in base class"
178
182
  end
179
-
183
+
180
184
  ############################################################################
181
185
  #
182
186
  # stop the service - should not block for a considerable amount of time
183
187
  #
184
188
  ############################################################################
185
-
189
+
186
190
  def do_stop(attempt_ct)
187
191
  raise "method not defined in base class"
188
192
  end
189
-
193
+
190
194
  ############################################################################
191
195
  #
192
196
  # return state (:up, :down)
193
197
  #
194
198
  ############################################################################
195
-
199
+
196
200
  def do_ping
197
201
  raise "method not defined in base class"
198
202
  end
199
-
203
+
200
204
  ############################################################################
201
205
  #
202
206
  # resolve dependencies through name lookup
203
207
  #
204
208
  ############################################################################
205
-
209
+
206
210
  def resolve_dependencies
207
-
211
+
208
212
  @dependencies=[]
209
213
  params[:dependencies].each do |dep|
210
214
  ServiceMgr::instance.match_services(dep.service).each do |k,v|
211
215
  @dependencies << { :service => v, :dep => dep }
212
- end
216
+ end
213
217
  end
214
218
  end
215
219
 
@@ -218,13 +222,13 @@ module ProcessWanker
218
222
  # safe, exception-catching methods
219
223
  #
220
224
  ############################################################################
221
-
225
+
222
226
  def safe_do(name)
223
227
  ProcessWanker::with_logged_rescue("#{name} - safe_do") do
224
228
  yield
225
229
  end
226
230
  end
227
-
231
+
228
232
  def safe_do_start(attempt_ct)
229
233
  safe_do("#{name}:do_start") { do_start(attempt_ct) }
230
234
  end
@@ -232,31 +236,31 @@ module ProcessWanker
232
236
  def safe_do_stop(attempt_ct)
233
237
  safe_do("#{name}:do_start") { do_stop(attempt_ct) }
234
238
  end
235
-
239
+
236
240
  def safe_do_ping()
237
241
  p=:down
238
242
  safe_do("#{name}:do_start") { p=do_ping }
239
243
  p
240
244
  end
241
-
245
+
242
246
  ############################################################################
243
247
  #
244
248
  # main logic
245
249
  #
246
250
  ############################################################################
247
-
251
+
248
252
  def tick
249
-
253
+
250
254
  #
251
255
  # get current time
252
256
  #
253
-
257
+
254
258
  now=Time.now
255
-
259
+
256
260
  #
257
261
  # get current state, check for change, record transition time
258
262
  #
259
-
263
+
260
264
  state = safe_do_ping()
261
265
  if(@current_state != state)
262
266
  @prev_state = @current_state
@@ -265,11 +269,11 @@ module ProcessWanker
265
269
  @stable = false
266
270
  @show_state = state.to_s
267
271
  end
268
-
272
+
269
273
  #
270
274
  # handle special :restart case
271
275
  #
272
-
276
+
273
277
  want=@want_state
274
278
  if(want == :restart)
275
279
  if(@current_state == :down)
@@ -280,11 +284,11 @@ module ProcessWanker
280
284
  want = :down
281
285
  end
282
286
  end
283
-
287
+
284
288
  #
285
289
  # check dependencies
286
- #
287
-
290
+ #
291
+
288
292
  deps_ok=true
289
293
  @dependencies.each do |d|
290
294
  s=d[:service]
@@ -301,24 +305,47 @@ module ProcessWanker
301
305
  if(@suppress)
302
306
  want = :down
303
307
  end
304
-
308
+
305
309
  #
306
310
  # have we been in the same state for a while?
307
311
  #
308
-
312
+
309
313
  stabilized=false
310
314
  elapsed = now - @last_transition_time
311
315
  if(!@stable && elapsed >= @params[:stable_secs])
312
316
  stabilized=true
313
317
  @stable=true
314
318
  end
315
-
319
+
320
+ #
321
+ # if we're up and stable, check watchdog timer
322
+ #
323
+
324
+ if(@stable && @current_state == :up && want == :up)
325
+ if(@params[:watchdog_file] && @params[:watchdog_timeout_secs])
326
+ timeout=true
327
+ begin
328
+ st = File.stat(@params[:watchdog_file])
329
+ if((now - st.mtime) < @params[:watchdog_timeout_secs])
330
+ timeout=false
331
+ end
332
+ rescue Exception => e
333
+ end
334
+ if(timeout)
335
+ info("#{self.name}: watchdog file: #{@params[:watchdog_file]} has timed out")
336
+ Event.dispatch("watchdog_timeout",self)
337
+ @want_state = :restart
338
+ want = :down
339
+ end
340
+ end
341
+ end
342
+
316
343
  #
317
344
  # are we in the desired state?
318
345
  #
319
-
346
+
320
347
  if(@current_state == want)
321
-
348
+
322
349
  # did we just stabilize?
323
350
  if(stabilized)
324
351
 
@@ -333,40 +360,40 @@ module ProcessWanker
333
360
  # clear request mode
334
361
  @want_state_mode=:none
335
362
  end
336
-
363
+
337
364
  # nothing more to do
338
365
  return
339
366
  end
340
-
367
+
341
368
  #
342
369
  # are we ignoring the process?
343
370
  #
344
-
371
+
345
372
  if(want == :ignore)
346
373
  @show_state = "#{@current_state.to_s} (ignored)"
347
374
  return
348
375
  end
349
-
376
+
350
377
  #
351
378
  # is it too soon to do anything?
352
379
  #
353
380
 
354
381
  proposed_action = { :up => :start , :down => :stop }[want]
355
382
  return if(!check_action_delay(now,proposed_action))
356
-
383
+
357
384
  #
358
385
  # actually attempt to cause a change
359
386
  #
360
-
387
+
361
388
  # update state
362
389
  @attempt_count=0 if(proposed_action != @last_action)
363
390
  @last_action=proposed_action
364
391
  @last_action_time=now
365
-
392
+
366
393
  # check for failing
367
394
  if(@attempt_count >= @params[:fail_trigger_count])
368
395
  info("#{self.name} has now had #{@attempt_count} attempts. considering it failed.")
369
-
396
+
370
397
  @show_state = "failing(#{proposed_action})"
371
398
  @last_fail_time = now
372
399
  @attempt_count = 0 # reset for next time
@@ -380,61 +407,61 @@ module ProcessWanker
380
407
  if(@want_state_mode == :none && proposed_action == :start && @attempt_count==0)
381
408
  Event::dispatch("restarting",self)
382
409
  end
383
-
410
+
384
411
  # do it
385
412
  @show_state = "#{proposed_action} [#{@attempt_count}]"
386
413
  if(proposed_action == :start)
387
414
 
388
415
  Event::dispatch("pre-launch",self)
389
-
416
+
390
417
  info("calling do_start for #{self.name}")
391
418
  safe_do_start(@attempt_count)
392
-
419
+
393
420
  else
394
-
421
+
395
422
  info("calling do_stop for #{self.name}")
396
423
  safe_do_stop(@attempt_count)
397
-
398
- end
424
+
425
+ end
399
426
  @attempt_count += 1
400
-
427
+
401
428
  end
402
-
429
+
403
430
  ############################################################################
404
431
  #
405
432
  # check the various timers, and see if we're allowed to take action
406
433
  # on a specific service at this point...
407
434
  #
408
435
  ############################################################################
409
-
436
+
410
437
  def check_action_delay(now,proposed_action)
411
-
438
+
412
439
  elapsed=now - @last_action_time
413
440
 
414
441
  # check general-purpose between-action-delay
415
442
  return(false) if(elapsed < @params[:min_action_delay_secs])
416
443
 
417
444
  if(proposed_action == @last_action)
418
-
445
+
419
446
  # check grace periods
420
447
  return(false) if(@last_action == :start && elapsed < @params[:start_grace_secs])
421
448
  return(false) if(@last_action == :stop && elapsed < @params[:stop_grace_secs])
422
-
449
+
423
450
  # check failing suppression
424
451
  since_fail=now - @last_fail_time
425
452
  return(false) if(since_fail < @params[:fail_suppress_secs])
426
453
  end
427
454
 
428
455
  true
429
- end
430
-
456
+ end
457
+
431
458
  ############################################################################
432
459
  #
433
460
  # set want state in response to a user request - clear all delay state,
434
461
  # start with a clean slate.
435
462
  #
436
463
  ############################################################################
437
-
464
+
438
465
  def set_want_state(state)
439
466
  @want_state = state
440
467
  @want_state_mode = :user
@@ -444,31 +471,31 @@ module ProcessWanker
444
471
  if(@want_state != @current_state)
445
472
  @show_state = "received #{state.inspect}"
446
473
  end
447
- end
474
+ end
448
475
 
449
476
  ############################################################################
450
477
  #
451
478
  #
452
479
  #
453
480
  ############################################################################
454
-
481
+
455
482
  def matches_spec(spec)
456
-
483
+
457
484
  # ensure it's in array form
458
485
  spec=spec.split(",")
459
-
486
+
460
487
  # check for inversion on first item
461
488
  if(spec.first[0..0]=="~")
462
489
  # insert implicit "all" at front
463
490
  spec=["all"] + spec
464
491
  end
465
-
492
+
466
493
  matches=false
467
494
  spec.each do |p|
468
495
  matches = matches_single(p,matches)
469
496
  end
470
497
  matches
471
-
498
+
472
499
  end
473
500
 
474
501
  ############################################################################
@@ -478,7 +505,7 @@ module ProcessWanker
478
505
  ############################################################################
479
506
 
480
507
  def matches_single(p,prev)
481
-
508
+
482
509
  if(p == "all")
483
510
  return(true)
484
511
  elsif(p[0..0] == "/")
@@ -495,18 +522,18 @@ module ProcessWanker
495
522
  elsif(p == group_name)
496
523
  return(true)
497
524
  end
498
-
525
+
499
526
  prev
500
527
  end
501
-
502
-
528
+
529
+
503
530
  ############################################################################
504
531
  #
505
532
  #
506
533
  #
507
534
  ############################################################################
508
-
509
-
535
+
536
+
510
537
  end
511
-
538
+
512
539
  end
@@ -1,15 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: processwanker 0.0.12 ruby lib
2
+ # stub: processwanker 0.0.13 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "processwanker".freeze
6
- s.version = "0.0.12"
6
+ s.version = "0.0.13"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Ben Stragnell".freeze]
11
11
  s.cert_chain = ["/home/ben/nas/docs/personal/keys/rubygems/gem-public_cert.pem".freeze]
12
- s.date = "2020-03-01"
12
+ s.date = "2020-05-12"
13
13
  s.description = "Process monitoring and remote control system".freeze
14
14
  s.email = "pw@codepuppies.com".freeze
15
15
  s.executables = ["pw".freeze]
@@ -17,21 +17,17 @@ Gem::Specification.new do |s|
17
17
  s.files = ["Manifest".freeze, "README".freeze, "Rakefile".freeze, "bin/pw".freeze, "lib/config/config.rb".freeze, "lib/config/config_auth.rb".freeze, "lib/config/config_client.rb".freeze, "lib/config/config_client_cluster.rb".freeze, "lib/config/config_client_clusters.rb".freeze, "lib/config/config_client_host.rb".freeze, "lib/config/config_daemon.rb".freeze, "lib/config/config_daemon_service.rb".freeze, "lib/config/config_daemon_service_dependency.rb".freeze, "lib/config/config_daemon_services.rb".freeze, "lib/config/config_hook.rb".freeze, "lib/config/config_node.rb".freeze, "lib/config/config_smtp.rb".freeze, "lib/events.rb".freeze, "lib/log.rb".freeze, "lib/net/net_api.rb".freeze, "lib/net/net_client.rb".freeze, "lib/net/net_connection.rb".freeze, "lib/net/net_server.rb".freeze, "lib/net/net_server_client.rb".freeze, "lib/net/net_util.rb".freeze, "lib/process_util.rb".freeze, "lib/pw_app.rb".freeze, "lib/service.rb".freeze, "lib/service_classes/dummy_service.rb".freeze, "lib/service_classes/pid_service.rb".freeze, "lib/service_classes/process_service.rb".freeze, "lib/service_classes/upstart_service.rb".freeze, "lib/service_mgr.rb".freeze, "lib/util.rb".freeze, "processwanker.gemspec".freeze]
18
18
  s.homepage = "https://github.com/strags/processwanker".freeze
19
19
  s.rdoc_options = ["--line-numbers".freeze, "--title".freeze, "Processwanker".freeze, "--main".freeze, "README".freeze]
20
- s.rubyforge_project = "processwanker".freeze
21
- s.rubygems_version = "2.7.6".freeze
22
- s.signing_key = "/home/ben/nas/docs/personal/keys/rubygems/gem-private_key.pem".freeze
20
+ s.rubygems_version = "3.1.2".freeze
21
+ # s.signing_key = "/home/ben/nas/docs/personal/keys/rubygems/gem-private_key.pem".freeze
23
22
  s.summary = "Process monitoring and remote control system".freeze
24
23
 
25
24
  if s.respond_to? :specification_version then
26
25
  s.specification_version = 4
26
+ end
27
27
 
28
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
29
- s.add_runtime_dependency(%q<echoe>.freeze, [">= 0"])
30
- s.add_runtime_dependency(%q<highline>.freeze, [">= 0"])
31
- else
32
- s.add_dependency(%q<echoe>.freeze, [">= 0"])
33
- s.add_dependency(%q<highline>.freeze, [">= 0"])
34
- end
28
+ if s.respond_to? :add_runtime_dependency then
29
+ s.add_runtime_dependency(%q<echoe>.freeze, [">= 0"])
30
+ s.add_runtime_dependency(%q<highline>.freeze, [">= 0"])
35
31
  else
36
32
  s.add_dependency(%q<echoe>.freeze, [">= 0"])
37
33
  s.add_dependency(%q<highline>.freeze, [">= 0"])
metadata CHANGED
@@ -1,41 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: processwanker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Stragnell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIIEUjCCArqgAwIBAgIBATANBgkqhkiG9w0BAQsFADApMScwJQYDVQQDDB5ydWJ5
14
- Z2Vtcy9EQz1jb2RlcHVwcGllcy9EQz1jb20wHhcNMjAwMzAxMDI1ODI0WhcNMjEw
15
- MzAxMDI1ODI0WjApMScwJQYDVQQDDB5ydWJ5Z2Vtcy9EQz1jb2RlcHVwcGllcy9E
16
- Qz1jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDhCu9pU02a3l9M
17
- 91dnAGcSFSZmu2xxSIMZvBGVzxGba3Mx0t8Ih3EDUm6TWiT+5hCDdr9+ouEOGv9R
18
- Sjga5SNQDfBWUtzwgIKOf+ltGSD8KulpmSczcw6enVhzNu+Z6x9ZDRwjr+1/wDSY
19
- 8ilSXYFvG5MKxqw+bHOqozKhOELQX3bpvvrn2iM9HGoxFbdErTohuKLqt2zI28jD
20
- v/YUrraB7aHEriicrJ+wLCGkGjon+PU9cPaioNMVJl8/yd4zAkn4Ero57btVZAwF
21
- lTFqJZFv7iJ66Nhmz8D64WcT5SFDna3CmAZ9Jlew34F/m5sC8K4grbs8bWgdK9I6
22
- /jnq8jFhlmDVbSjlLGmYHgJJmAjD4UNYubSLeNSad4meOVN/0RMzPSsj0ANFmeeZ
23
- Fjd9O0dvgaDl7b9pzJ/5EvexdYb/GUsEuMo6t7vas6TC43l5l6jUZ8Zuan3U5lEm
24
- /hFW8TxtdvLWVC2kgOE4I8fd/X/gkldpIECk8trjWnzKmPf/T4cCAwEAAaOBhDCB
25
- gTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUF+4ZGptfGLlWmfl3
26
- k97y8Q0jLRkwIwYDVR0RBBwwGoEYcnVieWdlbXNAY29kZXB1cHBpZXMuY29tMCMG
27
- A1UdEgQcMBqBGHJ1YnlnZW1zQGNvZGVwdXBwaWVzLmNvbTANBgkqhkiG9w0BAQsF
28
- AAOCAYEAQIdSBokSX9oIK82wMTZyJs9o0R3TbqVfiwX8CcQHPUIAJrRO/oo1xoAW
29
- QL7MtgAB7OQzb5vjMg0E9ySai37sLi8+kh6LLkVvgn6O+fDxytzi+NTpPL45k1Su
30
- +3hdoF3LwwvMMmo+r0KXfxJMcmTkqhtPoHutXxSj1+8kvf7tCqhzIsXGyOGbl43J
31
- j2bNKvlsvj5gT7wxfio7BPdyo2dME4jmKZNzk26eEe6X+FejlgbwupIXNFJGbIWY
32
- mDHkMHklUlqD8yBbapxyZzQHj7P3pMBTqDwuSw9CBCSa5bjODzW4ypyLMubuyhX9
33
- /6UhoMPk1CQUVXq49uOQippAAV/2tb9Qj47itB+/HBbShRDGTa8T+ReOPdhtFMGM
34
- +pQgFI9v1u1a41xIsHL4ywvy/h3PhrxAIZUZWtli208wCbbMccC1ZJgaaMFTNKM+
35
- JBW+Lr7BWFNyaAFJI3yYU/sk8DGLCUOdPT2CzX/perzGScKgKscXT+Hys+HvHdMa
36
- K+mzJYQy
37
- -----END CERTIFICATE-----
38
- date: 2020-03-01 00:00:00.000000000 Z
11
+ - "/home/ben/nas/docs/personal/keys/rubygems/gem-public_cert.pem"
12
+ date: 2020-05-12 00:00:00.000000000 Z
39
13
  dependencies:
40
14
  - !ruby/object:Gem::Dependency
41
15
  name: echoe
@@ -162,8 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
136
  - !ruby/object:Gem::Version
163
137
  version: '1.2'
164
138
  requirements: []
165
- rubyforge_project: processwanker
166
- rubygems_version: 2.7.6
139
+ rubygems_version: 3.1.2
167
140
  signing_key:
168
141
  specification_version: 4
169
142
  summary: Process monitoring and remote control system
checksums.yaml.gz.sig DELETED
Binary file
data.tar.gz.sig DELETED
@@ -1,2 +0,0 @@
1
- �F�� ��v)�W���y��F� �����8����T���; 9���)O� �<p�W��3���.a�T�m���[�΋�e2�#L()�U���}JӖ�؋\����� �:$���j]��
2
- #>n"�J!�1�Y�p���A��^W ����e� �YL�!�U2�����Z;,C5V9n ��Z��Jqx9�_ ��M�{0+_G 3T�y�*�@o�0�|.괏=z_G�o��
metadata.gz.sig DELETED
Binary file