nuri 0.5.4 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -3
- data/VERSION +1 -1
- data/bin/nuri +10 -7
- data/nuri.gemspec +17 -17
- metadata +19 -94
- data/examples/.gitignore +0 -4
- data/examples/bonfire.sfp +0 -87
- data/examples/bonfire/epcc.sfp +0 -43
- data/examples/bonfire/epcc0.sfp +0 -49
- data/examples/bonfire/epcc2.sfp +0 -52
- data/examples/bonfire/epcc2a.sfp +0 -25
- data/examples/bonfire/inria.sfp +0 -72
- data/examples/bonfire/inria0.sfp +0 -49
- data/examples/bonfire/inria2.sfp +0 -71
- data/examples/bonfire/inria2a.sfp +0 -44
- data/examples/bonfire/inria2b.sfp +0 -54
- data/examples/bonfire/inria2c.sfp +0 -62
- data/examples/bonfire/inria2d.sfp +0 -71
- data/examples/bonfire/inria2e.sfp +0 -80
- data/examples/bonfire/main.sfp +0 -33
- data/examples/bonfire/old/bonfire-1-1-1.sfp +0 -76
- data/examples/bonfire/old/bonfire-1-10-1.sfp +0 -77
- data/examples/bonfire/old/bonfire-1-2-1.sfp +0 -58
- data/examples/bonfire/old/bonfire-1-3-1.sfp +0 -61
- data/examples/bonfire/old/bonfire-1-4-1.sfp +0 -64
- data/examples/bonfire/old/bonfire-1-5-1.sfp +0 -67
- data/examples/bonfire/old/bonfire-1-6-1.sfp +0 -82
- data/examples/bonfire/old/bonfire-1-7-1.sfp +0 -82
- data/examples/bonfire/old/bonfire-1-8-1.sfp +0 -79
- data/examples/bonfire/old/bonfire-1-9-1.sfp +0 -83
- data/examples/bonfire/old/wp-test1a.sfp +0 -38
- data/examples/bonfire/old/wp-test1b.sfp +0 -18
- data/examples/bonfire/old/wp-test1c.sfp +0 -7
- data/examples/bonfire/old/wp-test2.sfp +0 -47
- data/examples/bonfire/old3/bonfire-epcc.sfp +0 -57
- data/examples/bonfire/old3/bonfire-inria.sfp +0 -72
- data/examples/bonfire/old3/bonfire-master.sfp +0 -18
- data/examples/bonfire/old3/bonfire.sfp +0 -23
- data/examples/bonfire/old3/bonfire2.sfp +0 -49
- data/examples/bonfire/old3/bonfire3.sfp +0 -76
- data/examples/bonfire/old3/bonfire4.sfp +0 -78
- data/examples/bonfire/old3/bonfire5.sfp +0 -34
- data/examples/bonfire/old3/bonfire5b.sfp +0 -84
- data/examples/bonfire/old3/hpvm6.sfp +0 -22
- data/examples/bonfire/old3/model.json +0 -1
- data/examples/bonfire/old3/test0.sfp +0 -16
- data/examples/bonfire/old3/test1.sfp +0 -5
- data/examples/bonfire/old3/test10.sfp +0 -5
- data/examples/bonfire/old3/test2.sfp +0 -18
- data/examples/bonfire/old3/test3.sfp +0 -10
- data/examples/bonfire/old3/test4.sfp +0 -11
- data/examples/bonfire/old3/test5.sfp +0 -18
- data/examples/bonfire/old3/test6.sfp +0 -19
- data/examples/bonfire/old3/test7.sfp +0 -34
- data/examples/bonfire/old3/test8.sfp +0 -5
- data/examples/bonfire/old3/test9.sfp +0 -16
- data/examples/bonfire/old3/wordpress-test-cluster.sfp +0 -38
- data/examples/bonfire/old3/wordpress-test.sfp +0 -22
- data/examples/bonfire/old3/wp-test-2.sfp +0 -49
- data/examples/bonfire/test.sfp +0 -13
- data/examples/hadoop1.sfp +0 -21
- data/examples/hadoop2.sfp +0 -21
- data/examples/hpcloud.sfp +0 -18
- data/examples/mockcloud/apache2.sfp +0 -14
- data/examples/mockcloud/generator.rb +0 -22
- data/examples/mockcloud/generator.rb.bak +0 -66
- data/examples/mockcloud/hadoop2.sfp.template +0 -25
- data/examples/mockcloud/ping.rb +0 -38
- data/examples/mockcloud/run.rb +0 -17
- data/examples/openstack/openstack-hadoop1-cluster.sfp +0 -37
- data/examples/openstack/openstack-hadoop2-cluster.sfp +0 -39
- data/examples/test.inc +0 -0
- data/examples/test.sfp +0 -11
- data/examples/v2/apache.sfp +0 -30
- data/examples/v2/aptpackage.sfp +0 -6
- data/examples/v2/mock1.sfp +0 -12
- data/examples/v2/package.sfp +0 -22
- data/examples/v2/service.sfp +0 -94
- data/examples/v2/tarpackage.sfp +0 -5
- data/examples/wordpress.sfp +0 -41
data/examples/hadoop1.sfp
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
include "modules/vm/vm.sfp"
|
2
|
-
include "modules/hpcloud/hpcloud.sfp"
|
3
|
-
include "modules/hadoop1/hadoop1.sfp"
|
4
|
-
proxy isa Node {
|
5
|
-
sfpAddress is "localhost"
|
6
|
-
hpcloud isa HPCloud {
|
7
|
-
vm_ssh_key_name = "nurikey"
|
8
|
-
}
|
9
|
-
}
|
10
|
-
master isa VM {
|
11
|
-
in_cloud is proxy.hpcloud
|
12
|
-
hadoop isa Hadoop1Master
|
13
|
-
}
|
14
|
-
slave1 isa VM {
|
15
|
-
in_cloud is proxy.hpcloud
|
16
|
-
hadoop isa Hadoop1Slave {
|
17
|
-
master is master.hadoop
|
18
|
-
}
|
19
|
-
}
|
20
|
-
slave2 extends slave1
|
21
|
-
slave3 extends slave1
|
data/examples/hadoop2.sfp
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
include "modules/vm/vm.sfp"
|
2
|
-
include "modules/hpcloud/hpcloud.sfp"
|
3
|
-
include "modules/hadoop2/hadoop2.sfp"
|
4
|
-
proxy isa Node {
|
5
|
-
sfpAddress is "localhost"
|
6
|
-
hpcloud isa HPCloud {
|
7
|
-
vm_ssh_key_name = "nurikey"
|
8
|
-
}
|
9
|
-
}
|
10
|
-
master isa VM {
|
11
|
-
in_cloud is proxy.hpcloud
|
12
|
-
hadoop isa Hadoop2Master
|
13
|
-
}
|
14
|
-
slave1 isa VM {
|
15
|
-
in_cloud is proxy.hpcloud
|
16
|
-
hadoop isa Hadoop2Slave {
|
17
|
-
master is master.hadoop
|
18
|
-
}
|
19
|
-
}
|
20
|
-
slave2 extends slave1
|
21
|
-
slave3 extends slave1
|
data/examples/hpcloud.sfp
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
include "../modules/node/node.sfp"
|
2
|
-
include "../modules/hpcloud/hpcloud.sfp"
|
3
|
-
include "../modules/vm/vm.sfp"
|
4
|
-
include "../modules/apache/apache.sfp"
|
5
|
-
|
6
|
-
proxy isa Node {
|
7
|
-
sfpAddress is "localhost"
|
8
|
-
hpcloud isa HPCloud {
|
9
|
-
key_name is "herry_key"
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
|
-
vm1 isa VM {
|
14
|
-
created = true
|
15
|
-
apache isa Apache {
|
16
|
-
running is true
|
17
|
-
}
|
18
|
-
}
|
@@ -1,14 +0,0 @@
|
|
1
|
-
include "modules/node/node.sfp"
|
2
|
-
include "modules/apache2/apache2.sfp"
|
3
|
-
include "modules/vm/vm.sfp"
|
4
|
-
include "modules/mockcloud/mockcloud.sfp"
|
5
|
-
|
6
|
-
local isa Node {
|
7
|
-
sfpAddress is "localhost"
|
8
|
-
hpcloud isa MockCloud
|
9
|
-
}
|
10
|
-
vm1 isa VM {
|
11
|
-
apache isa Apache2 {
|
12
|
-
running is true
|
13
|
-
}
|
14
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'erb'
|
4
|
-
require 'ostruct'
|
5
|
-
|
6
|
-
class ErbBinding < OpenStruct
|
7
|
-
def render(template)
|
8
|
-
ERB.new(template).result(binding)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
if ARGV.length <= 0
|
13
|
-
puts "Usage: generator.rb <template-file> [key=value]*"
|
14
|
-
else
|
15
|
-
template = File.read(ARGV.shift)
|
16
|
-
data = {}
|
17
|
-
ARGV.each do |arg|
|
18
|
-
key, value = arg.split('=')
|
19
|
-
data[key] = value
|
20
|
-
end
|
21
|
-
puts ErbBinding.new(data).render(template)
|
22
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
def generate(number_apps)
|
4
|
-
header = 'include "../modules/node/node.sfp"
|
5
|
-
include "../modules/mockcloud/mockcloud.sfp"
|
6
|
-
include "../modules/vm/vm.sfp"
|
7
|
-
include "../modules/apache/apache.sfp"
|
8
|
-
include "../modules/mysql/mysql.sfp"
|
9
|
-
include "../modules/wordpresscluster/wordpresscluster.sfp"
|
10
|
-
|
11
|
-
proxy isa Node {
|
12
|
-
sfpAddress is "localhost"
|
13
|
-
cloud isa MockCloud
|
14
|
-
}
|
15
|
-
'
|
16
|
-
vmlb = 'vmlb isa VM {
|
17
|
-
apache isa Apache {
|
18
|
-
running is true
|
19
|
-
is_load_balancer is true
|
20
|
-
lb_members is (%members%)
|
21
|
-
}
|
22
|
-
}'
|
23
|
-
vmapp = '%vmapp% isa VM {
|
24
|
-
apache isa Apache {
|
25
|
-
running is true
|
26
|
-
}
|
27
|
-
wp_web isa WordpressWeb {
|
28
|
-
installed is true
|
29
|
-
http is %vmapp%.apache
|
30
|
-
database is vmdb.wp_db
|
31
|
-
}
|
32
|
-
}'
|
33
|
-
vmdb = 'vmdb isa VM {
|
34
|
-
mysql isa Mysql {
|
35
|
-
running is true
|
36
|
-
}
|
37
|
-
wp_db isa WordpressDB {
|
38
|
-
installed is true
|
39
|
-
mysql is vmdb.mysql
|
40
|
-
}
|
41
|
-
}'
|
42
|
-
output = ''
|
43
|
-
members = ''
|
44
|
-
global = "global {\n"
|
45
|
-
1.upto(number_apps) do |i|
|
46
|
-
name = "vmapp#{i}"
|
47
|
-
output += vmapp.gsub(/%vmapp%/, name) + "\n"
|
48
|
-
members += "#{name},"
|
49
|
-
global += "\tif vmlb.apache.running is true then #{name}.apache.running is true\n"
|
50
|
-
global += "\tif #{name}.apache.running is true then vmdb.mysql.running is true\n"
|
51
|
-
end
|
52
|
-
global += "}\n"
|
53
|
-
output = header +
|
54
|
-
vmlb.sub(/%members%/, members.chop) + "\n" +
|
55
|
-
output + vmdb + "\n" + global
|
56
|
-
output
|
57
|
-
end
|
58
|
-
|
59
|
-
if $0 == __FILE__
|
60
|
-
if ARGV[0] == 'help'
|
61
|
-
puts "Usage: generator.rb [total-app-layer]"
|
62
|
-
else
|
63
|
-
number_apps = (ARGV.length > 0 ? ARGV[0].to_i : 3)
|
64
|
-
puts generate(number_apps)
|
65
|
-
end
|
66
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
/***
|
2
|
-
*
|
3
|
-
* Required parameters:
|
4
|
-
* - total : number of slaves
|
5
|
-
*
|
6
|
-
*/
|
7
|
-
|
8
|
-
include "modules/vm/vm.sfp"
|
9
|
-
include "modules/mockcloud/mockcloud.sfp"
|
10
|
-
include "modules/hadoop2/hadoop2.sfp"
|
11
|
-
proxy isa Node {
|
12
|
-
sfpAddress is "localhost"
|
13
|
-
cloud isa MockCloud
|
14
|
-
}
|
15
|
-
master isa VM {
|
16
|
-
hadoop isa Hadoop2Master
|
17
|
-
}
|
18
|
-
slave1 isa VM {
|
19
|
-
hadoop isa Hadoop2Slave {
|
20
|
-
master is master.hadoop
|
21
|
-
}
|
22
|
-
}
|
23
|
-
<% (2..total.to_i).each do |i| %>
|
24
|
-
slave<%= i %> extends slave1
|
25
|
-
<% end %>
|
data/examples/mockcloud/ping.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'net/http'
|
4
|
-
require 'thread'
|
5
|
-
|
6
|
-
len = 120
|
7
|
-
|
8
|
-
def ping(address, port=1314)
|
9
|
-
print "print #{address} "
|
10
|
-
url = "http://#{address}:#{port}/sfpstate"
|
11
|
-
uri = URI.parse(url)
|
12
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
13
|
-
http.open_timeout = 2
|
14
|
-
http.read_timeout = 5
|
15
|
-
begin
|
16
|
-
req = Net::HTTP::Get.new(uri.path)
|
17
|
-
http.start
|
18
|
-
http.request(req) { |res|
|
19
|
-
puts "[#{res.code}] [OK]"
|
20
|
-
}
|
21
|
-
rescue Exception => e
|
22
|
-
puts "[Failed] #{e}" #\n#{e.backtrace.join("\n")}"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
ping('hadoopmaster')
|
27
|
-
finished = []
|
28
|
-
(1..len).each do |i|
|
29
|
-
# Thread.new {
|
30
|
-
host = "hadoopslave#{i}"
|
31
|
-
ping(host)
|
32
|
-
finished << host
|
33
|
-
# }
|
34
|
-
end
|
35
|
-
|
36
|
-
until finished.length >= len do
|
37
|
-
sleep 1
|
38
|
-
end
|
data/examples/mockcloud/run.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
gen = "./generator.rb"
|
4
|
-
nuri = "../bin/nuri -u -h -n -p -l -m"
|
5
|
-
logdir = "mocktest"
|
6
|
-
|
7
|
-
Dir.mkdir(logdir) if not File.exist?(logdir)
|
8
|
-
|
9
|
-
1.upto(6) do |i|
|
10
|
-
logfile = "#{logdir}/mocktest.log.#{i}"
|
11
|
-
sfpfile = "mocktest-#{i}.sfp"
|
12
|
-
system("#{gen} #{i} > #{sfpfile}")
|
13
|
-
print "Processing #{sfpfile}..."
|
14
|
-
system("#{nuri} #{sfpfile} 1>#{logfile} 2>#{logfile}")
|
15
|
-
system("mv #{sfpfile} #{logdir}")
|
16
|
-
puts "[OK]"
|
17
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
include "modules/vm/vm.sfp"
|
2
|
-
include "modules/openstack/openstack.sfp"
|
3
|
-
|
4
|
-
proxy isa Node {
|
5
|
-
sfpAddress is "localhost"
|
6
|
-
herry isa OpenStack {
|
7
|
-
// replace the value of OpenStack Identity's URL plus "/tokens/"
|
8
|
-
auth_uri is "http://16.25.166.21:5000/v2.0/tokens/"
|
9
|
-
|
10
|
-
// replace the value with your SSH key name, and then put
|
11
|
-
// the private key (with name <key-name>.pem) in module's directory.
|
12
|
-
vm_ssh_key_name is "nurikey"
|
13
|
-
|
14
|
-
// an image that already has nuri agent
|
15
|
-
vm_image is "8fe14786-5388-4787-8aaf-96feebfa8aae"
|
16
|
-
}
|
17
|
-
}
|
18
|
-
|
19
|
-
include "modules/hadoop1/hadoop1.sfp"
|
20
|
-
|
21
|
-
vm1 isa VM {
|
22
|
-
hadoop isa Hadoop1Master {
|
23
|
-
// replace this with the URL of hadoop1 tar package file
|
24
|
-
source is "http://master.nuri.ext9.sup.hpl.hp.com/hadoop"
|
25
|
-
}
|
26
|
-
}
|
27
|
-
vm2 isa VM {
|
28
|
-
hadoop isa Hadoop1Slave {
|
29
|
-
master is vm1.hadoop
|
30
|
-
// replace this with the URL of hadoop1 tar package file
|
31
|
-
source is "http://master.nuri.ext9.sup.hpl.hp.com/hadoop"
|
32
|
-
}
|
33
|
-
}
|
34
|
-
vm3 extends vm2
|
35
|
-
vm4 extends vm2
|
36
|
-
vm5 extends vm2
|
37
|
-
vm6 extends vm2
|
@@ -1,39 +0,0 @@
|
|
1
|
-
include "modules/vm/vm.sfp"
|
2
|
-
include "modules/openstack/openstack.sfp"
|
3
|
-
|
4
|
-
proxy isa Node {
|
5
|
-
sfpAddress is "localhost"
|
6
|
-
herry isa OpenStack {
|
7
|
-
auth_uri is "http://16.25.166.21:5000/v2.0/tokens/"
|
8
|
-
|
9
|
-
// use m1.medium (id="2") flavor because Hadoop2 requires minimum 4GB of memory
|
10
|
-
vm_flavor is "3"
|
11
|
-
|
12
|
-
// - replace the value with your key name
|
13
|
-
// - put the key file <key-name>.pem in module's directory
|
14
|
-
vm_ssh_key_name is "nurikey"
|
15
|
-
|
16
|
-
// a VM image that already has Nuri agent
|
17
|
-
vm_image is "8fe14786-5388-4787-8aaf-96feebfa8aae"
|
18
|
-
}
|
19
|
-
}
|
20
|
-
|
21
|
-
include "modules/hadoop2/hadoop2.sfp"
|
22
|
-
|
23
|
-
vm1 isa VM {
|
24
|
-
hadoop isa Hadoop2Master {
|
25
|
-
// replace this with the URL of hadoop2 tar package file
|
26
|
-
source is "http://master.nuri.ext9.sup.hpl.hp.com/hadoop"
|
27
|
-
}
|
28
|
-
}
|
29
|
-
vm2 isa VM {
|
30
|
-
hadoop isa Hadoop2Slave {
|
31
|
-
master is vm1.hadoop
|
32
|
-
// replace this with the URL of hadoop2 tar package file
|
33
|
-
source is "http://master.nuri.ext9.sup.hpl.hp.com/hadoop"
|
34
|
-
}
|
35
|
-
}
|
36
|
-
vm3 extends vm2
|
37
|
-
vm4 extends vm2
|
38
|
-
vm5 extends vm2
|
39
|
-
vm6 extends vm2
|
data/examples/test.inc
DELETED
File without changes
|
data/examples/test.sfp
DELETED
data/examples/v2/apache.sfp
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
include "service.sfp"
|
2
|
-
|
3
|
-
schema Apache extends Service {
|
4
|
-
package_name = "apache2"
|
5
|
-
service_name = "apache2"
|
6
|
-
installed = true
|
7
|
-
running = true
|
8
|
-
configured = true
|
9
|
-
|
10
|
-
final port = 80
|
11
|
-
final document_root = "/var/www"
|
12
|
-
final modules isset String
|
13
|
-
final server_name = ""
|
14
|
-
|
15
|
-
// load balancer config
|
16
|
-
final load_balancer = false
|
17
|
-
final lb_members isset Node
|
18
|
-
final lb_method = "byrequests" // byrequests, bytraffic, bybusyness
|
19
|
-
|
20
|
-
sub configure {
|
21
|
-
condition {
|
22
|
-
this.installed = true
|
23
|
-
this.running = false
|
24
|
-
this.configured = false
|
25
|
-
}
|
26
|
-
effect {
|
27
|
-
this.configured = true
|
28
|
-
}
|
29
|
-
}
|
30
|
-
}
|
data/examples/v2/aptpackage.sfp
DELETED
data/examples/v2/mock1.sfp
DELETED
data/examples/v2/package.sfp
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
schema Package {
|
2
|
-
installed = true
|
3
|
-
|
4
|
-
final package_name = ""
|
5
|
-
final version = ""
|
6
|
-
final source = ""
|
7
|
-
|
8
|
-
synchronized sub install {
|
9
|
-
effect {
|
10
|
-
this.installed = true
|
11
|
-
}
|
12
|
-
}
|
13
|
-
|
14
|
-
synchronized sub uninstall {
|
15
|
-
condition {
|
16
|
-
this.installed = true
|
17
|
-
}
|
18
|
-
effect {
|
19
|
-
this.installed = false
|
20
|
-
}
|
21
|
-
}
|
22
|
-
}
|
data/examples/v2/service.sfp
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
include "aptpackage.sfp"
|
2
|
-
|
3
|
-
schema Service {
|
4
|
-
running = true
|
5
|
-
configured = true
|
6
|
-
|
7
|
-
final service_name = ""
|
8
|
-
|
9
|
-
sub start {
|
10
|
-
condition {
|
11
|
-
this.running != true
|
12
|
-
this.configured = true
|
13
|
-
}
|
14
|
-
effect {
|
15
|
-
this.running = true
|
16
|
-
}
|
17
|
-
}
|
18
|
-
|
19
|
-
sub stop {
|
20
|
-
condition {
|
21
|
-
this.running = true
|
22
|
-
}
|
23
|
-
effect {
|
24
|
-
this.running = false
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
sub configure {
|
29
|
-
condition {
|
30
|
-
this.running = false
|
31
|
-
}
|
32
|
-
effect {
|
33
|
-
this.configured = true
|
34
|
-
}
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
|
-
schema SysVService extends Service {
|
39
|
-
final runlevel isset String
|
40
|
-
}
|
41
|
-
|
42
|
-
schema AptService extends AptPackage {
|
43
|
-
synchronized sub install {
|
44
|
-
condition {
|
45
|
-
this.installed != true
|
46
|
-
}
|
47
|
-
effect {
|
48
|
-
this.installed = true
|
49
|
-
this.running = false
|
50
|
-
this.configured = false
|
51
|
-
}
|
52
|
-
}
|
53
|
-
|
54
|
-
synchronized sub uninstall {
|
55
|
-
condition {
|
56
|
-
this.running = false
|
57
|
-
this.installed = true
|
58
|
-
}
|
59
|
-
effect {
|
60
|
-
this.installed = false
|
61
|
-
this.configured = true
|
62
|
-
}
|
63
|
-
}
|
64
|
-
|
65
|
-
sub start {
|
66
|
-
condition {
|
67
|
-
this.running != true
|
68
|
-
this.installed = true
|
69
|
-
this.configured = true
|
70
|
-
}
|
71
|
-
effect {
|
72
|
-
this.running = true
|
73
|
-
}
|
74
|
-
}
|
75
|
-
|
76
|
-
sub stop {
|
77
|
-
condition {
|
78
|
-
this.running = true
|
79
|
-
}
|
80
|
-
effect {
|
81
|
-
this.running = false
|
82
|
-
}
|
83
|
-
}
|
84
|
-
|
85
|
-
sub configure {
|
86
|
-
condition {
|
87
|
-
this.installed = true
|
88
|
-
this.running = false
|
89
|
-
}
|
90
|
-
effect {
|
91
|
-
this.configured = true
|
92
|
-
}
|
93
|
-
}
|
94
|
-
}
|