nuri 0.5.1

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.
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
+ }