nuri 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +12 -0
  4. data/CHANGELOG +146 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +28 -0
  7. data/README.md +64 -0
  8. data/Rakefile +15 -0
  9. data/VERSION +1 -0
  10. data/bin/delete_modules +11 -0
  11. data/bin/install_agent +18 -0
  12. data/bin/install_module +65 -0
  13. data/bin/nuri +519 -0
  14. data/bin/nuri.old +183 -0
  15. data/bin/push_model +16 -0
  16. data/examples/.gitignore +3 -0
  17. data/examples/bonfire.sfp +95 -0
  18. data/examples/bonfire/epcc.sfp +43 -0
  19. data/examples/bonfire/epcc0.sfp +49 -0
  20. data/examples/bonfire/epcc2.sfp +52 -0
  21. data/examples/bonfire/epcc2a.sfp +25 -0
  22. data/examples/bonfire/inria.sfp +72 -0
  23. data/examples/bonfire/inria0.sfp +49 -0
  24. data/examples/bonfire/inria2.sfp +71 -0
  25. data/examples/bonfire/inria2a.sfp +44 -0
  26. data/examples/bonfire/inria2b.sfp +54 -0
  27. data/examples/bonfire/inria2c.sfp +62 -0
  28. data/examples/bonfire/inria2d.sfp +71 -0
  29. data/examples/bonfire/inria2e.sfp +80 -0
  30. data/examples/bonfire/main.sfp +33 -0
  31. data/examples/bonfire/old/bonfire-1-1-1.sfp +76 -0
  32. data/examples/bonfire/old/bonfire-1-10-1.sfp +77 -0
  33. data/examples/bonfire/old/bonfire-1-2-1.sfp +58 -0
  34. data/examples/bonfire/old/bonfire-1-3-1.sfp +61 -0
  35. data/examples/bonfire/old/bonfire-1-4-1.sfp +64 -0
  36. data/examples/bonfire/old/bonfire-1-5-1.sfp +67 -0
  37. data/examples/bonfire/old/bonfire-1-6-1.sfp +82 -0
  38. data/examples/bonfire/old/bonfire-1-7-1.sfp +82 -0
  39. data/examples/bonfire/old/bonfire-1-8-1.sfp +79 -0
  40. data/examples/bonfire/old/bonfire-1-9-1.sfp +83 -0
  41. data/examples/bonfire/old/wp-test1a.sfp +38 -0
  42. data/examples/bonfire/old/wp-test1b.sfp +18 -0
  43. data/examples/bonfire/old/wp-test1c.sfp +7 -0
  44. data/examples/bonfire/old/wp-test2.sfp +47 -0
  45. data/examples/bonfire/old3/bonfire-epcc.sfp +57 -0
  46. data/examples/bonfire/old3/bonfire-inria.sfp +72 -0
  47. data/examples/bonfire/old3/bonfire-master.sfp +18 -0
  48. data/examples/bonfire/old3/bonfire.sfp +23 -0
  49. data/examples/bonfire/old3/bonfire2.sfp +49 -0
  50. data/examples/bonfire/old3/bonfire3.sfp +76 -0
  51. data/examples/bonfire/old3/bonfire4.sfp +78 -0
  52. data/examples/bonfire/old3/bonfire5.sfp +34 -0
  53. data/examples/bonfire/old3/bonfire5b.sfp +84 -0
  54. data/examples/bonfire/old3/hpvm6.sfp +22 -0
  55. data/examples/bonfire/old3/model.json +1 -0
  56. data/examples/bonfire/old3/test0.sfp +16 -0
  57. data/examples/bonfire/old3/test1.sfp +5 -0
  58. data/examples/bonfire/old3/test10.sfp +5 -0
  59. data/examples/bonfire/old3/test2.sfp +18 -0
  60. data/examples/bonfire/old3/test3.sfp +10 -0
  61. data/examples/bonfire/old3/test4.sfp +11 -0
  62. data/examples/bonfire/old3/test5.sfp +18 -0
  63. data/examples/bonfire/old3/test6.sfp +19 -0
  64. data/examples/bonfire/old3/test7.sfp +34 -0
  65. data/examples/bonfire/old3/test8.sfp +5 -0
  66. data/examples/bonfire/old3/test9.sfp +16 -0
  67. data/examples/bonfire/old3/wordpress-test-cluster.sfp +38 -0
  68. data/examples/bonfire/old3/wordpress-test.sfp +22 -0
  69. data/examples/bonfire/old3/wp-test-2.sfp +49 -0
  70. data/examples/bonfire/test.sfp +13 -0
  71. data/examples/generator.rb +66 -0
  72. data/examples/hadoop2.sfp +20 -0
  73. data/examples/hpcloud.sfp +18 -0
  74. data/examples/run.rb +17 -0
  75. data/examples/test.inc +0 -0
  76. data/examples/test.sfp +11 -0
  77. data/lib/naas/d3.js +5 -0
  78. data/lib/naas/d3.v3.min.js +5 -0
  79. data/lib/naas/index.css +0 -0
  80. data/lib/naas/index.html +18 -0
  81. data/lib/naas/index.js +18 -0
  82. data/lib/naas/jquery-1.10.2.min.js +6 -0
  83. data/lib/naas/jquery.js +6 -0
  84. data/lib/naas/naas.rb +160 -0
  85. data/lib/nuri.rb +62 -0
  86. data/lib/nuri/choreographer.rb +151 -0
  87. data/lib/nuri/constraint_helper.rb +9 -0
  88. data/lib/nuri/directory.rb +40 -0
  89. data/lib/nuri/master.rb +725 -0
  90. data/lib/nuri/net_helper.rb +65 -0
  91. data/lib/nuri/orchestrator.rb +224 -0
  92. data/lib/nuri/server.rb +212 -0
  93. data/modules/.gitignore +4 -0
  94. data/modules/apache/apache.rb +255 -0
  95. data/modules/apache/apache.rb.old +167 -0
  96. data/modules/apache/apache.sfp +146 -0
  97. data/modules/apache/apache.sfp.future +100 -0
  98. data/modules/apache/load_balancer +20 -0
  99. data/modules/apache/model.json +1 -0
  100. data/modules/apache/test.sfp +8 -0
  101. data/modules/aptpackage/aptpackage.rb +82 -0
  102. data/modules/aptpackage/aptpackage.sfp +5 -0
  103. data/modules/bonfire/.gitignore +2 -0
  104. data/modules/bonfire/README.md +12 -0
  105. data/modules/bonfire/bonfire.rb +60 -0
  106. data/modules/bonfire/bonfire.sfp +9 -0
  107. data/modules/bonfire/config.yml +4 -0
  108. data/modules/bonfire/helper.rb +149 -0
  109. data/modules/bonfire/stresstest.rb +144 -0
  110. data/modules/bonfire/test.sfp +8 -0
  111. data/modules/client/client.rb +22 -0
  112. data/modules/client/client.sfp +14 -0
  113. data/modules/cloud/cloud.rb +11 -0
  114. data/modules/cloud/cloud.sfp +26 -0
  115. data/modules/file/file.rb +91 -0
  116. data/modules/file/file.sfp +9 -0
  117. data/modules/hadoop1/core-site.xml +17 -0
  118. data/modules/hadoop1/hadoop-env.sh +55 -0
  119. data/modules/hadoop1/hadoop1.rb +384 -0
  120. data/modules/hadoop1/hadoop1.sfp +93 -0
  121. data/modules/hadoop1/hdfs-site.xml +16 -0
  122. data/modules/hadoop1/mapred-site.xml +17 -0
  123. data/modules/hadoop2/core-site.xml +31 -0
  124. data/modules/hadoop2/hadoop-env.sh +77 -0
  125. data/modules/hadoop2/hadoop2.rb +401 -0
  126. data/modules/hadoop2/hadoop2.sfp +114 -0
  127. data/modules/hadoop2/hdfs-site.xml +47 -0
  128. data/modules/hadoop2/mapred-site.xml +71 -0
  129. data/modules/hadoop2/ports +14 -0
  130. data/modules/hadoop2/yarn-env.sh +112 -0
  131. data/modules/hadoop2/yarn-site.xml +107 -0
  132. data/modules/hpcloud/.gitignore +2 -0
  133. data/modules/hpcloud/README.md +16 -0
  134. data/modules/hpcloud/config.yml +3 -0
  135. data/modules/hpcloud/example.sfp +18 -0
  136. data/modules/hpcloud/hpcloud.rb +241 -0
  137. data/modules/hpcloud/hpcloud.sfp +22 -0
  138. data/modules/hpcloud/test.sfp +5 -0
  139. data/modules/install_module +65 -0
  140. data/modules/machine/machine.rb +95 -0
  141. data/modules/machine/machine.sfp +9 -0
  142. data/modules/mockcloud/mockcloud.rb +20 -0
  143. data/modules/mockcloud/mockcloud.sfp +6 -0
  144. data/modules/mysql/mysql.rb +118 -0
  145. data/modules/mysql/mysql.sfp +38 -0
  146. data/modules/mysql/test.sfp +3 -0
  147. data/modules/node/node.rb +8 -0
  148. data/modules/node/node.sfp +7 -0
  149. data/modules/object/object.rb +7 -0
  150. data/modules/object/object.sfp +1 -0
  151. data/modules/os/os.rb +38 -0
  152. data/modules/os/os.sfp +11 -0
  153. data/modules/package/package.rb +26 -0
  154. data/modules/package/package.sfp +22 -0
  155. data/modules/package/test.sfp +6 -0
  156. data/modules/service/model.json +1 -0
  157. data/modules/service/service.rb +50 -0
  158. data/modules/service/service.sfp +46 -0
  159. data/modules/service/test.sfp +6 -0
  160. data/modules/tarpackage/tarpackage.rb +93 -0
  161. data/modules/tarpackage/tarpackage.sfp +5 -0
  162. data/modules/vm/vm.rb +8 -0
  163. data/modules/vm/vm.sfp +18 -0
  164. data/modules/wordpress/wordpress.rb +98 -0
  165. data/modules/wordpress/wordpress.sfp +34 -0
  166. data/modules/wordpresscluster/wordpresscluster.rb +150 -0
  167. data/modules/wordpresscluster/wordpresscluster.sfp +74 -0
  168. data/nuri.gemspec +26 -0
  169. metadata +281 -0
@@ -0,0 +1,6 @@
1
+ include "service.sfp"
2
+
3
+ apache isa Service {
4
+ package_name = "apache2"
5
+ service_name = "apache2"
6
+ }
@@ -0,0 +1,93 @@
1
+ class Sfp::Module::TarPackage
2
+ include Sfp::Resource
3
+
4
+ Signature = '.tarpackage.log'
5
+
6
+ def update_state
7
+ @state['installed'] = installed?
8
+ @state['version'] = version?
9
+ @state['source'] = @model['source']
10
+ @state['package_name'] = @model['package_name']
11
+ @state['home'] = (@state['installed'] ? @model['home'] : '')
12
+ end
13
+
14
+ ##############################
15
+ #
16
+ # Action methods (see TarPackage.sfp)
17
+ #
18
+ ##############################
19
+
20
+ def install(p={})
21
+ src = url
22
+ dest = home
23
+ return false if dest.length <= 0
24
+
25
+ # create destination directory if not exist
26
+ system "mkdir -p #{dest}" if !::File.exist?(dest)
27
+
28
+ # install axel if it's not available
29
+ system "apt-get install axel" if `which axel`.strip.length <= 0
30
+
31
+ # download the file
32
+ system "cd #{dest} && axel -q #{src}"
33
+
34
+ file = src.split('/').last.to_s
35
+ # if downloaded file is not exist, then return false
36
+ if !::File.exist?("#{dest}/#{file}")
37
+ log.error "Failed to download file from #{url}"
38
+ return false
39
+ end
40
+
41
+ # extract tar file, and then delete it
42
+ system "cd #{dest} && tar xvzf #{file}"
43
+ system "rm -f #{dest}/#{file}"
44
+
45
+ basename = (::File.extname(file) == '.gz' ? ::File.basename(file, '.tar.gz') : ::File.basename(file, ::File.extname(file)))
46
+ system "bash -c 'cd #{dest}/#{basename} && shopt -s dotglob && mv -f * .. && cd .. && rm -rf #{basename}'"
47
+
48
+ File.open("#{dest}/#{Signature}", 'w') { |f| f.write(Time.now.to_s) }
49
+
50
+ true
51
+ end
52
+
53
+ def uninstall(p={})
54
+ !!system("rm -rf #{home}") if File.exist?(home)
55
+ true
56
+ end
57
+
58
+ ##############################
59
+ #
60
+ # Helper methods
61
+ #
62
+ ##############################
63
+
64
+ protected
65
+ def installed?
66
+ ::File.exist?("#{home}/#{Signature}")
67
+ end
68
+
69
+ def version?
70
+ if @model['version'].length > 0
71
+ @model['version']
72
+ else
73
+ file_version = home + "/VERSION"
74
+ (::File.exist?(file_version) ? File.read(file_version).strip : '')
75
+ end
76
+ end
77
+
78
+ def url
79
+ name = @model['package_name'].to_s.strip
80
+ version = @model['version'].to_s.strip
81
+ src = @model['source'].to_s.strip
82
+
83
+ if name.length > 0 and version.length > 0
84
+ "#{src}/#{name}-#{version}/#{name}-#{version}.tar.gz"
85
+ else
86
+ src
87
+ end
88
+ end
89
+
90
+ def home
91
+ @model['home'].to_s.strip
92
+ end
93
+ end
@@ -0,0 +1,5 @@
1
+ include "../package/package.sfp"
2
+
3
+ schema TarPackage extends Package {
4
+ final home = ""
5
+ }
data/modules/vm/vm.rb ADDED
@@ -0,0 +1,8 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + "/../machine/machine.rb"
2
+
3
+ class Sfp::Module::VM < Sfp::Module::Machine
4
+ def update_state
5
+ self.class.superclass.instance_method(:update_state).bind(self).call
6
+ @state['in_cloud'] = @model['in_cloud']
7
+ end
8
+ end
data/modules/vm/vm.sfp ADDED
@@ -0,0 +1,18 @@
1
+ include "../machine/machine.sfp"
2
+ include "../cloud/cloud.sfp"
3
+
4
+ schema VM extends Machine {
5
+ created = true
6
+ in_cloud isref Cloud
7
+
8
+ final cpus = 1
9
+ final memory = 512
10
+ final network { }
11
+ final disk { }
12
+
13
+ final username = ""
14
+ final flavor = ""
15
+ final image = ""
16
+ final security_group = ""
17
+ final ssh_key_name = ""
18
+ }
@@ -0,0 +1,98 @@
1
+ class Sfp::Module::Wordpress
2
+ include Sfp::Resource
3
+
4
+ def update_state
5
+ @state['installed'] = false
6
+ doc_root = resolve(@model['http'] + '.document_root')
7
+ db_address = resolve(@model['database'] + '.parent.sfpAddress')
8
+ root_password = resolve(@model['database'] + '.root_password')
9
+ if db_address.is_a?(String) and root_password.is_a?(String) and doc_root.is_a?(String)
10
+ #data = `echo "show databases;" | mysql -h #{db_address} -u root --password=#{root_password} mysql`.strip.split("\n")
11
+ data = `echo "show databases;" | mysql -u root --password=#{root_password} mysql`.strip.split("\n")
12
+ path = "#{doc_root}/#{@model['path']}/wp-config.php"
13
+ path.gsub! /\/\//, '/'
14
+ @state['installed'] = true if data.index(@model['db_name']) and File.exist?(path)
15
+ end
16
+
17
+ @state['http'] = @model['http']
18
+ @state['database'] = @model['database']
19
+ @state['db_name'] = @model['db_name']
20
+ @state['db_user'] = @model['db_user']
21
+ @state['db_password'] = @model['db_password']
22
+ @state['path'] = @model['path']
23
+ @state['source_url'] = @model['source_url']
24
+ end
25
+
26
+ def install(p={})
27
+ system('apt-get update; apt-get install -y wget') if `which wget`.strip.length <= 0
28
+ return false if `which wget`.strip.length <= 0
29
+
30
+ doc_root = resolve(@model['http'] + '.document_root')
31
+ db_address = resolve(@model['database'] + '.parent.sfpAddress')
32
+ root_password = resolve(@model['database'] + '.root_password')
33
+
34
+ system("wget --output-document='/tmp/wp.tgz' #{@model['source_url']}")
35
+ return false if not File.exist?('/tmp/wp.tgz')
36
+ system("cd /tmp; tar xvzf wp.tgz")
37
+
38
+ home_path = "#{doc_root}/#{@model['path']}"
39
+ home_path.gsub! /\/\//, '/'
40
+ wp_config_path = "#{home_path}/wp-config.php"
41
+ wp_config_sample_path = "#{home_path}/wp-config-sample.php"
42
+
43
+ File.delete(home_path) if File.file?(home_path)
44
+ Dir.mkdir(home_path, 0755) if not File.directory?(home_path)
45
+ system("cd /tmp; mv -f wordpress/* #{home_path}/; mv -f wordpress/.* #{home_path}/;rmdir wordpress;rm -f wp.tgz")
46
+ return false if not File.exist?(wp_config_sample_path)
47
+
48
+ system("cp -f #{wp_config_sample_path} #{wp_config_path}")
49
+
50
+ system("sed -i 's/.*DB_NAME.*/define(\"DB_NAME\",\"#{@model['db_name']}\");/' #{wp_config_path}")
51
+ system("sed -i 's/.*DB_USER.*/define(\"DB_USER\",\"#{@model['db_user']}\");/' #{wp_config_path}")
52
+ system("sed -i 's/.*DB_PASSWORD.*/define(\"DB_PASSWORD\",\"#{@model['db_password']}\");/' #{wp_config_path}")
53
+ system("sed -i 's/.*DB_HOST.*/define(\"DB_HOST\",\"#{db_address}\");/' #{wp_config_path}")
54
+
55
+ # install database
56
+ #mysql_cmd = "mysql -h #{db_address} -u root --pasword=#{root_password}"
57
+ mysql_cmd = "mysql -u root --password=#{root_password}"
58
+ sql1 = "CREATE USER '#{@model['db_user']}'@'%' IDENTIFIED BY '#{@model['db_password']}';"
59
+ return false if not system("echo \"#{sql1}\" | #{mysql_cmd}")
60
+ sql2 = "CREATE DATABASE #{@model['db_name']};"
61
+ return false if not system("echo \"#{sql2}\" | #{mysql_cmd}")
62
+ sql3 = "GRANT ALL PRIVILEGES ON #{@model['db_name']}.* TO '#{@model['db_user']}'@'%';"
63
+ return false if not system("echo \"#{sql3}\" | #{mysql_cmd}")
64
+ sql4 = "FLUSH PRIVILEGES;"
65
+ return false if not system("echo \"#{sql4}\" | #{mysql_cmd}")
66
+
67
+ system("cd #{home_path}; mv -f index.html index.html.bak")
68
+
69
+ true
70
+ end
71
+
72
+ def uninstall(p={})
73
+ doc_root = resolve(@model['http'] + '.document_root')
74
+ db_address = resolve(@model['database'] + '.parent.sfpAddress')
75
+ root_password = resolve(@model['database'] + '.root_password')
76
+
77
+ home_path = "#{doc_root}/#{@model['path']}"
78
+ home_path.gsub! /\/\//, '/'
79
+
80
+ # delete all files
81
+ if @model['path'] != '/'
82
+ system("rm -rf #{home_path}")
83
+ else
84
+ system("cd #{home_path}; mv -f index.html.bak /tmp; rm -rf *; mv -f /tmp/index.html.bak index.html")
85
+ end
86
+
87
+ # uninstall database
88
+ mysql_cmd = "mysql -u root --password=#{root_password}"
89
+ sql1 = "DROP USER '#{@model['db_user']}'@'%';"
90
+ sql2 = "DROP DATABASE #{@model['db_name']};"
91
+ sql3 = "REVOKE ALL PRIVILEGES ON *.* FROM '#{@model['db_user']}'@'%';"
92
+ sql4 = "FLUSH PRIVILEGES;"
93
+
94
+ system("echo \"#{sql1} #{sql2} #{sql3} #{sql4}\" | #{mysql_cmd}")
95
+
96
+ true
97
+ end
98
+ end
@@ -0,0 +1,34 @@
1
+ include "../mysql/mysql.sfp"
2
+ include "../apache/apache.sfp"
3
+
4
+ schema Wordpress {
5
+ installed : Bool
6
+ http isref Apache
7
+ database isref Mysql
8
+ db_name = "wordpress"
9
+ db_user = "wordpress"
10
+ db_password = "password"
11
+ path = "/wp"
12
+ source_url = "http://wordpress.org/latest.tar.gz"
13
+
14
+ sub install {
15
+ condition {
16
+ this.http.running = true
17
+ this.http.php_module = true
18
+ this.http.php_mysql_module = true
19
+ this.database.running = true
20
+ }
21
+ effect {
22
+ this.installed = true
23
+ }
24
+ }
25
+
26
+ sub uninstall {
27
+ condition {
28
+ this.installed = true
29
+ }
30
+ effect {
31
+ this.installed = false
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,150 @@
1
+ class Sfp::Module::WordpressDB
2
+ include Sfp::Resource
3
+
4
+ ConfigFile = '/tmp/sfp.module.wordpressdb.config'
5
+
6
+ def update_state
7
+ if ::File.exist?(ConfigFile)
8
+ config = JSON[::File.read(ConfigFile)]
9
+ root_password = resolve(config['mysql'] + '.root_password')
10
+ data = `echo "show databases;" | mysql -u root --password=#{root_password} mysql`.strip.split("\n")
11
+ @state['installed'] = !!data.index(config['db_name'])
12
+ @state['mysql'] = (@state['installed'] ? config['mysql'] : @model['mysql'])
13
+ @state['db_name'] = config['db_name']
14
+ @state['db_user'] = config['db_user']
15
+ @state['db_password'] = config['db_password']
16
+ else
17
+ @state['installed'] = false
18
+ @state['mysql'] = @model['mysql']
19
+ @state['db_name'] = @model['db_name']
20
+ @state['db_user'] = @model['db_user']
21
+ @state['db_password'] = @model['db_password']
22
+ end
23
+ end
24
+
25
+ def install(p={})
26
+ return false if @model['mysql'].nil?
27
+
28
+ root_password = resolve(@model['mysql'] + '.root_password')
29
+
30
+ # install database
31
+ mysql_cmd = "mysql -u root --password=#{root_password}"
32
+ sql1 = "CREATE USER '#{@model['db_user']}'@'%' IDENTIFIED BY '#{@model['db_password']}';"
33
+ system("echo \"#{sql1}\" | #{mysql_cmd}")
34
+ sql2 = "DROP DATABASE IF EXISTS #{@model['db_name']}; CREATE DATABASE #{@model['db_name']};"
35
+ return false if not system("echo \"#{sql2}\" | #{mysql_cmd}")
36
+ sql3 = "GRANT ALL PRIVILEGES ON #{@model['db_name']}.* TO '#{@model['db_user']}'@'%';"
37
+ return false if not system("echo \"#{sql3}\" | #{mysql_cmd}")
38
+ sql4 = "FLUSH PRIVILEGES;"
39
+ return false if not system("echo \"#{sql4}\" | #{mysql_cmd}")
40
+
41
+ config = { 'mysql' => @model['mysql'],
42
+ 'db_name' => @model['db_name'],
43
+ 'db_user' => @model['db_user'],
44
+ 'db_password' => @model['db_password'] }
45
+ ::File.open(ConfigFile, 'w') { |f|
46
+ f.write(JSON.generate(config))
47
+ f.flush
48
+ }
49
+
50
+ true
51
+ end
52
+
53
+ def uninstall(p={})
54
+ return false if not ::File.exist?(ConfigFile)
55
+
56
+ config = JSON[::File.read(ConfigFile)]
57
+
58
+ root_password = resolve(config['mysql'] + '.root_password')
59
+ # uninstall database
60
+ mysql_cmd = "mysql -u root --password=#{root_password}"
61
+ sql1 = "DROP USER '#{config['db_user']}'@'%';"
62
+ sql2 = "DROP DATABASE IF EXISTS #{config['db_name']};"
63
+ sql3 = "REVOKE ALL PRIVILEGES ON *.* FROM '#{config['db_user']}'@'%';"
64
+ sql4 = "FLUSH PRIVILEGES;"
65
+ system("echo \"#{sql1} #{sql2} #{sql3} #{sql4}\" | #{mysql_cmd}")
66
+
67
+ ::File.delete(ConfigFile) if ::File.exist?(ConfigFile)
68
+
69
+ true
70
+ end
71
+ end
72
+
73
+ class Sfp::Module::WordpressWeb
74
+ include Sfp::Resource
75
+
76
+ ConfigFile = '/tmp/sfp.module.wordpressweb.config'
77
+
78
+ def update_state
79
+ @state['installed'] = false
80
+ @state['installed'] = ::File.exist?(@model['path'])
81
+
82
+ if ::File.exist?(ConfigFile)
83
+ config = JSON[::File.read(ConfigFile)]
84
+ @state['http'] = config['http']
85
+ @state['database'] = config['database']
86
+ @state['path'] = config['path']
87
+ else
88
+ @state['http'] = nil
89
+ @state['database'] = nil
90
+ @state['path'] = @model['path']
91
+ end
92
+ @state['source_url'] = @model['source_url']
93
+ end
94
+
95
+ def install(p={})
96
+ return false if p['database'].nil? or p['http'].nil?
97
+
98
+ db_address = resolve(p['database'] + '.parent.sfpAddress')
99
+ return false if db_address.to_s.strip == ''
100
+ db = resolve(p['database'])
101
+
102
+ system('apt-get update; apt-get install -y wget') if `which wget`.strip.length <= 0
103
+ return false if `which wget`.strip.length <= 0
104
+
105
+ system("wget --output-document='/tmp/wp.tgz' #{@model['source_url']}")
106
+ return false if not ::File.exist?('/tmp/wp.tgz')
107
+ system("cd /tmp; tar xvzf wp.tgz")
108
+
109
+ home_path = @model['path']
110
+ wp_config_path = "#{home_path}/wp-config.php"
111
+ wp_config_sample_path = "#{home_path}/wp-config-sample.php"
112
+
113
+ system("rm -rf #{home_path}") if ::File.file?(home_path)
114
+ Dir.mkdir(home_path, 0755) if not ::File.directory?(home_path)
115
+ system("cd /tmp; mv -f wordpress/* #{home_path}/; mv -f wordpress/.* #{home_path}/;rmdir wordpress;rm -f wp.tgz")
116
+ return false if not ::File.exist?(wp_config_sample_path)
117
+
118
+ system("cp -f #{wp_config_sample_path} #{wp_config_path}")
119
+
120
+ system("sed -i 's/.*DB_NAME.*/define(\"DB_NAME\",\"#{db['db_name']}\");/' #{wp_config_path}")
121
+ system("sed -i 's/.*DB_USER.*/define(\"DB_USER\",\"#{db['db_user']}\");/' #{wp_config_path}")
122
+ system("sed -i 's/.*DB_PASSWORD.*/define(\"DB_PASSWORD\",\"#{db['db_password']}\");/' #{wp_config_path}")
123
+ system("sed -i 's/.*DB_HOST.*/define(\"DB_HOST\",\"#{db_address}\");/' #{wp_config_path}")
124
+
125
+ system("cd #{home_path}; mv -f index.html index.html.bak")
126
+
127
+ ::File.open(ConfigFile, 'w') { |f|
128
+ config = { 'http' => p['http'], 'database' => p['database'], 'path' => @model['path'] }
129
+ f.write(JSON.generate(config))
130
+ f.flush
131
+ }
132
+
133
+ true
134
+ end
135
+
136
+ def uninstall(p={})
137
+ home_path = @model['path']
138
+
139
+ # delete all files
140
+ if @model['path'] != '/'
141
+ system("rm -rf #{home_path}")
142
+ else
143
+ system("cd #{home_path}; mv -f index.html.bak /tmp; rm -rf *; mv -f /tmp/index.html.bak index.html")
144
+ end
145
+
146
+ ::File.delete(ConfigFile) if ::File.exist?(ConfigFile)
147
+
148
+ true
149
+ end
150
+ end
@@ -0,0 +1,74 @@
1
+ include "../apache/apache.sfp"
2
+ include "../mysql/mysql.sfp"
3
+
4
+ schema WordpressCluster
5
+
6
+ schema WordpressDB extends WordpressCluster {
7
+ installed : Bool
8
+ mysql isref Mysql
9
+ final db_name = "wordpress"
10
+ final db_user = "wordpress"
11
+ final db_password = "password"
12
+
13
+ sub install(mysql: Mysql) {
14
+ condition {
15
+ this.installed != true
16
+ mysql.running = true
17
+ mysql.public = true
18
+ }
19
+ effect {
20
+ this.installed = true
21
+ this.mysql = mysql
22
+ }
23
+ }
24
+ sub uninstall (mysql: Mysql) {
25
+ condition {
26
+ this.mysql = mysql
27
+ mysql.running = true
28
+ this.installed = true
29
+ }
30
+ effect {
31
+ this.installed = false
32
+ }
33
+ }
34
+ }
35
+
36
+ schema WordpressWeb extends WordpressCluster {
37
+ installed : Bool
38
+ http isref Apache
39
+ database isref WordpressDB
40
+ final path = "/var/www/wp"
41
+ final source_url = "http://wordpress.org/latest.tar.gz"
42
+
43
+ sub install (http: Apache, database: WordpressDB) {
44
+ condition {
45
+ this.installed != true
46
+ http.installed = true
47
+ http.running = false
48
+ http.php_module = true
49
+ http.php_mysql_module = true
50
+ database.installed = true
51
+ }
52
+ effect {
53
+ this.installed = true
54
+ this.http = http
55
+ this.database = database
56
+ }
57
+ }
58
+
59
+ sub uninstall (http: Apache, database: WordpressDB) {
60
+ condition {
61
+ this.installed = true
62
+ this.http = http
63
+ http.running = false
64
+ http.installed = true
65
+ this.database = database
66
+ database.installed = true
67
+ }
68
+ effect {
69
+ this.installed = false
70
+ this.http = null
71
+ this.database = null
72
+ }
73
+ }
74
+ }