sfpagent 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sfpagent might be problematic. Click here for more details.
- data/VERSION +1 -1
- data/bin/init_script +8 -1
- data/lib/sfpagent/bsig.rb +56 -6
- metadata +6 -6
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.2
|
data/bin/init_script
CHANGED
@@ -12,8 +12,15 @@
|
|
12
12
|
set -e
|
13
13
|
|
14
14
|
bin=`which sfpagent`
|
15
|
+
if [ $bin = "" ]; then
|
16
|
+
if [ -f "/usr/bin/sfpagent" ]; then
|
17
|
+
bin="/usr/bin/sfpagent"
|
18
|
+
elif [ -f "/usr/local/bin/sfpagent" ]; then
|
19
|
+
bin="/usr/local/bin/sfpagent"
|
20
|
+
fi
|
21
|
+
fi
|
15
22
|
|
16
|
-
test -x $bin || exit
|
23
|
+
test -x $bin || exit 1
|
17
24
|
|
18
25
|
umask 022
|
19
26
|
|
data/lib/sfpagent/bsig.rb
CHANGED
@@ -17,6 +17,7 @@ class Sfp::BSig
|
|
17
17
|
@enabled = false
|
18
18
|
@status = :stopped
|
19
19
|
@lock_postprocess = Mutex.new
|
20
|
+
@locked_operators = []
|
20
21
|
end
|
21
22
|
|
22
23
|
def stop
|
@@ -53,6 +54,7 @@ class Sfp::BSig
|
|
53
54
|
Sfp::Agent.logger.info "[main] Executing BSig model"
|
54
55
|
|
55
56
|
previous_exec_status = exec_status = nil
|
57
|
+
|
56
58
|
while @enabled
|
57
59
|
begin
|
58
60
|
|
@@ -131,6 +133,10 @@ class Sfp::BSig
|
|
131
133
|
# :repaired => some goal-flaws have been repaired, but the goal may have other flaws
|
132
134
|
#
|
133
135
|
def achieve_local_goal(id, goal, operators, pi, mode)
|
136
|
+
parallel_achieve_local_goal(id, goal, operators, pi, mode)
|
137
|
+
end
|
138
|
+
|
139
|
+
def parallel_achieve_local_goal(id, goal, operators, pi, mode)
|
134
140
|
current = get_current_state
|
135
141
|
flaws = compute_flaws(goal, current)
|
136
142
|
#Sfp::Agent.logger.info "[#{mode}] flaws: #{flaws.inspect}"
|
@@ -282,7 +288,6 @@ class Sfp::BSig
|
|
282
288
|
unregister_satisfier_thread
|
283
289
|
end
|
284
290
|
|
285
|
-
#protected
|
286
291
|
def register_satisfier_thread(mode=nil)
|
287
292
|
File.open(SatisfierLockFile, File::RDWR|File::CREAT, 0644) { |f|
|
288
293
|
f.flock(File::LOCK_EX)
|
@@ -305,19 +310,31 @@ class Sfp::BSig
|
|
305
310
|
}
|
306
311
|
end
|
307
312
|
|
313
|
+
# lock given operator by creating a lock file to avoid another thread
|
314
|
+
# executing the same operator
|
315
|
+
#
|
316
|
+
# @param operator operator to be locked
|
317
|
+
#
|
308
318
|
def lock_operator(operator)
|
309
319
|
@lock.synchronize {
|
310
320
|
operator_lock_file = "#{Home}/operator.#{operator['id']}.#{operator['name']}.lock"
|
311
321
|
return false if File.exist?(operator_lock_file)
|
312
322
|
File.open(operator_lock_file, 'w') { |f| f.write('1') }
|
323
|
+
@locked_operators << operator
|
313
324
|
return true
|
314
325
|
}
|
315
326
|
end
|
316
327
|
|
328
|
+
# unlock given operator by deleting lock file in order to allow another thread
|
329
|
+
# executing the operator
|
330
|
+
#
|
331
|
+
# @param operator operator to be unlocked
|
332
|
+
#
|
317
333
|
def unlock_operator(operator)
|
318
334
|
@lock.synchronize {
|
319
335
|
operator_lock_file = "#{Home}/operator.#{operator['id']}.#{operator['name']}.lock"
|
320
336
|
File.delete(operator_lock_file) if File.exist?(operator_lock_file)
|
337
|
+
@lock_operators.delete(operator)
|
321
338
|
}
|
322
339
|
end
|
323
340
|
|
@@ -419,20 +436,28 @@ class Sfp::BSig
|
|
419
436
|
# cannot be repaired by available operators
|
420
437
|
#
|
421
438
|
def select_operators(flaws, operators, pi)
|
422
|
-
|
439
|
+
selected_operators = []
|
423
440
|
repaired = {}
|
424
441
|
operators.each do |op|
|
425
442
|
next if op['pi'] < pi
|
426
|
-
if can_repair?(op, flaws)
|
427
|
-
|
443
|
+
if can_repair?(op, flaws) and # can the operator repair the flaws?
|
444
|
+
not threat?(op, selected_operators) and # does the operator threat other selected operators?
|
445
|
+
not threat?(op, @locked_operators) # does the operator threat locked (being executed) operators?
|
446
|
+
selected_operators << op
|
428
447
|
op['effect'].each { |var,val| repaired[var] = val if flaws[var] == val }
|
429
448
|
end
|
430
449
|
break if repaired.length >= flaws.length
|
431
450
|
end
|
432
451
|
return :failure if repaired.length < flaws.length
|
433
|
-
|
452
|
+
selected_operators
|
434
453
|
end
|
435
|
-
|
454
|
+
|
455
|
+
# @param flaws a map of flaws (variable-value) that should be repaired
|
456
|
+
# @param operators a sorted-list of operators (sorted by 'pi')
|
457
|
+
# @param pi minimum priority-index value
|
458
|
+
#
|
459
|
+
# @return an operator that can repair the flaws
|
460
|
+
#
|
436
461
|
def select_operator(flaws, operators, pi)
|
437
462
|
operators.each do |op|
|
438
463
|
next if op['pi'] < pi
|
@@ -441,11 +466,36 @@ class Sfp::BSig
|
|
441
466
|
nil
|
442
467
|
end
|
443
468
|
|
469
|
+
# An operator can repair the flaws iff there is an effect that fixes the flaw
|
470
|
+
#
|
444
471
|
def can_repair?(operator, flaws)
|
445
472
|
operator['effect'].each { |variable,value| return true if flaws[variable] == value }
|
446
473
|
false
|
447
474
|
end
|
448
475
|
|
476
|
+
# Check if an operator threats a set of operators.
|
477
|
+
#
|
478
|
+
# @param operator operator to be checked
|
479
|
+
# @param operators a set of operators
|
480
|
+
#
|
481
|
+
def threat_operators?(operator, operators)
|
482
|
+
operators.each do |op|
|
483
|
+
return true if threat?(operator, op)
|
484
|
+
end
|
485
|
+
false
|
486
|
+
end
|
487
|
+
|
488
|
+
# Return true if operator1 threats operator2: there is an effect's variable of operator1
|
489
|
+
# is in condition's or effect's variable of operator2
|
490
|
+
#
|
491
|
+
def threat?(operator1, operator2)
|
492
|
+
operator1['effect'].each_key do |variable1|
|
493
|
+
return true if operator2['condition'].keys.include?(variable1) or
|
494
|
+
operator2['effect'].keys.include?(variable1)
|
495
|
+
end
|
496
|
+
false
|
497
|
+
end
|
498
|
+
|
449
499
|
def split_preconditions(operator)
|
450
500
|
local = {}
|
451
501
|
remote = {}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sfpagent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-11-
|
12
|
+
date: 2013-11-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sfp
|
16
|
-
requirement: &
|
16
|
+
requirement: &11401760 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.3.17
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *11401760
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &11401020 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *11401020
|
36
36
|
description: A Ruby implementation of SFP agent.
|
37
37
|
email: herry13@gmail.com
|
38
38
|
executables:
|