processwanker 0.0.12 → 0.0.13

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
  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