pvcglue 0.1.5

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 (65) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +91 -0
  6. data/Rakefile +1 -0
  7. data/bin/pvc +13 -0
  8. data/lib/pvcglue.rb +43 -0
  9. data/lib/pvcglue/all_the_things.rb +7 -0
  10. data/lib/pvcglue/bootstrap.rb +8 -0
  11. data/lib/pvcglue/capistrano.rb +35 -0
  12. data/lib/pvcglue/cli.rb +150 -0
  13. data/lib/pvcglue/cloud.rb +278 -0
  14. data/lib/pvcglue/configuration.rb +157 -0
  15. data/lib/pvcglue/db.rb +145 -0
  16. data/lib/pvcglue/deploy.rb +4 -0
  17. data/lib/pvcglue/env.rb +141 -0
  18. data/lib/pvcglue/manager.rb +137 -0
  19. data/lib/pvcglue/nodes.rb +29 -0
  20. data/lib/pvcglue/packages.rb +47 -0
  21. data/lib/pvcglue/packages/bootstrap.rb +92 -0
  22. data/lib/pvcglue/packages/env.rb +80 -0
  23. data/lib/pvcglue/packages/firewall.rb +48 -0
  24. data/lib/pvcglue/packages/manager.rb +102 -0
  25. data/lib/pvcglue/packages/nginx.rb +10 -0
  26. data/lib/pvcglue/packages/nodejs.rb +17 -0
  27. data/lib/pvcglue/packages/passenger.rb +28 -0
  28. data/lib/pvcglue/packages/postgresql.rb +10 -0
  29. data/lib/pvcglue/packages/role_db.rb +47 -0
  30. data/lib/pvcglue/packages/role_lb.rb +64 -0
  31. data/lib/pvcglue/packages/role_memcached.rb +14 -0
  32. data/lib/pvcglue/packages/role_web.rb +60 -0
  33. data/lib/pvcglue/packages/rvm.rb +75 -0
  34. data/lib/pvcglue/packages/timezone.rb +17 -0
  35. data/lib/pvcglue/packages/ubuntu.rb +100 -0
  36. data/lib/pvcglue/railtie.rb +11 -0
  37. data/lib/pvcglue/ssl.rb +37 -0
  38. data/lib/pvcglue/templates/20auto-upgrades.erb +2 -0
  39. data/lib/pvcglue/templates/authorized_keys.erb +3 -0
  40. data/lib/pvcglue/templates/capfile.erb +20 -0
  41. data/lib/pvcglue/templates/database.yml.erb +57 -0
  42. data/lib/pvcglue/templates/denial_of_service.erb +3 -0
  43. data/lib/pvcglue/templates/deploy.rb.erb +81 -0
  44. data/lib/pvcglue/templates/gemrc.erb +1 -0
  45. data/lib/pvcglue/templates/hosts.erb +9 -0
  46. data/lib/pvcglue/templates/lb.nginx.conf.erb +88 -0
  47. data/lib/pvcglue/templates/lb.sites-enabled.erb +74 -0
  48. data/lib/pvcglue/templates/maintenance_mode.erb +46 -0
  49. data/lib/pvcglue/templates/memcached.conf.erb +55 -0
  50. data/lib/pvcglue/templates/passenger.list.erb +2 -0
  51. data/lib/pvcglue/templates/pg_hba.conf.erb +101 -0
  52. data/lib/pvcglue/templates/postgresql.conf.erb +557 -0
  53. data/lib/pvcglue/templates/sshd_config.erb +91 -0
  54. data/lib/pvcglue/templates/stage-deploy.rb.erb +33 -0
  55. data/lib/pvcglue/templates/timezone.erb +1 -0
  56. data/lib/pvcglue/templates/ufw.rules.erb +42 -0
  57. data/lib/pvcglue/templates/ufw.rules6.erb +25 -0
  58. data/lib/pvcglue/templates/web.bashrc.erb +120 -0
  59. data/lib/pvcglue/templates/web.env.erb +3 -0
  60. data/lib/pvcglue/templates/web.nginx.conf.erb +82 -0
  61. data/lib/pvcglue/templates/web.sites-enabled.erb +8 -0
  62. data/lib/pvcglue/toml_pvc_dumper.rb +53 -0
  63. data/lib/pvcglue/version.rb +3 -0
  64. data/pvcglue.gemspec +33 -0
  65. metadata +296 -0
@@ -0,0 +1,137 @@
1
+ require 'pp'
2
+
3
+ module Pvcglue
4
+ class Manager < Thor
5
+
6
+ desc "bootstrap", "bootstrap"
7
+
8
+ def bootstrap
9
+ Pvcglue::Packages.apply('bootstrap-manager'.to_sym, :manager, self.class.manager_node, 'root', 'manager')
10
+ end
11
+
12
+ desc "push", "push"
13
+
14
+ def push
15
+ Pvcglue::Manager.push_configuration
16
+ end
17
+
18
+ desc "pull", "pull"
19
+
20
+ def pull
21
+ Pvcglue::Packages.apply('manager-pull'.to_sym, :manager, self.class.manager_node, 'pvcglue', 'manager')
22
+ self.class.clear_cloud_data_cache
23
+ end
24
+
25
+ desc "show", "show manager data"
26
+
27
+ def show
28
+ self.class.initialize_cloud_data
29
+ pp Pvcglue.cloud.data
30
+ end
31
+
32
+ desc "info", "show manager data"
33
+
34
+ def info
35
+ show
36
+ end
37
+
38
+ desc "s", "run shell"
39
+
40
+ def s # `shell` is a Thor reserved word
41
+ sh
42
+ end
43
+
44
+ desc "shell", "run shell"
45
+
46
+ def sh # `shell` is a Thor reserved word
47
+ working_dir = self.class.manager_dir
48
+ cloud_manager = Pvcglue.configuration.cloud_manager
49
+ user_name = self.class.user_name
50
+ cloud_name = Pvcglue.configuration.cloud_name
51
+ puts "Connection to #{cloud_name} cloud on manager at (#{cloud_manager}) as user '#{user_name}'..."
52
+ system(%(ssh #{Pvcglue.cloud.port_in_context(:manager)} -t #{user_name}@#{cloud_manager} "cd #{working_dir} && bash -i"))
53
+ end
54
+
55
+ desc "configure", "configure"
56
+
57
+ def configure
58
+ Pvcglue.configuration.configure_manager
59
+ end
60
+
61
+ # ------------------------------------------------------------------------------------------------------------------
62
+
63
+ def self.initialize_cloud_data
64
+ unless read_cached_cloud_data
65
+ Pvcglue::Packages.apply('manager-get-config'.to_sym, :manager, manager_node, 'pvcglue', 'manager')
66
+ # Pvcglue::Packages.apply('manager-get-config'.to_sym, :manager, manager_node, 'pvcglue') # Can not use package as it causes infinite recursion, we'll just do it manually
67
+ data = `ssh pvcglue@#{manager_node[:manager][:public_ip]} "cat #{Pvcglue::Manager.manager_file_name}"`
68
+ # puts "*"*80
69
+ # puts data
70
+ # puts "*"*80
71
+ if data.empty?
72
+ raise(Thor::Error, "Remote manager file not found (or empty): #{::Pvcglue::Manager.manager_file_name}")
73
+ else
74
+ ::Pvcglue.cloud.data = TOML.parse(data)
75
+ end
76
+ write_cloud_data_cache
77
+ end
78
+ end
79
+
80
+ def self.write_cloud_data_cache
81
+ File.write(Pvcglue.configuration.cloud_cache_file_name, TOML.dump(Pvcglue.cloud.data))
82
+ end
83
+
84
+ def self.read_cached_cloud_data
85
+ # TODO: Expire cache after given interval
86
+ if File.exists?(Pvcglue.configuration.cloud_cache_file_name)
87
+ data = File.read(Pvcglue.configuration.cloud_cache_file_name)
88
+ Pvcglue.cloud.data = TOML.parse(data)
89
+ return true
90
+ end
91
+ false
92
+ end
93
+
94
+ def self.clear_cloud_data_cache
95
+ Pvcglue.configuration.clear_cloud_cache
96
+ end
97
+
98
+ def self.manager_node
99
+ {manager: {public_ip: Pvcglue.configuration.cloud_manager}}
100
+ end
101
+
102
+ def self.cloud_data_file_name_base
103
+ @file_name_base ||= "#{Pvcglue.configuration.cloud_name}.pvcglue.toml"
104
+ end
105
+
106
+ def self.manager_file_name
107
+ File.join(manager_dir, cloud_data_file_name_base)
108
+ end
109
+
110
+ def self.user_name
111
+ 'pvcglue'
112
+ end
113
+
114
+ def self.home_dir
115
+ File.join('/home', user_name)
116
+ end
117
+
118
+ def self.authorized_keys_file_name
119
+ File.join(ssh_dir, 'authorized_keys')
120
+ end
121
+
122
+ def self.ssh_dir
123
+ File.join(home_dir, '.ssh')
124
+ end
125
+
126
+ def self.manager_dir
127
+ File.join(home_dir, '.pvc_manager')
128
+ end
129
+
130
+ def self.push_configuration
131
+ Pvcglue::Packages.apply('manager-push'.to_sym, :manager, manager_node, 'pvcglue', 'manager')
132
+ clear_cloud_data_cache
133
+ end
134
+
135
+ end
136
+
137
+ end
@@ -0,0 +1,29 @@
1
+ module Pvcglue
2
+ class Nodes
3
+ def self.build(roles_filter)
4
+ Pvcglue::Nodes.new(roles_filter).run
5
+ end
6
+
7
+ def initialize(roles_filter)
8
+ @roles_filter = roles_filter
9
+ end
10
+
11
+ def apply_role?(role)
12
+ @roles_filter == 'all' || role == @roles_filter
13
+ end
14
+
15
+ def run
16
+ puts "This is where it should configure the nodes for #{@roles_filter}. :)"
17
+
18
+ %w(lb db web caching).each do |role|
19
+ if apply_role?(role)
20
+ Pvcglue::Packages.apply(role.to_sym, :build, Pvcglue.cloud.nodes_in_stage(role))
21
+ end
22
+ end
23
+
24
+ Pvcglue::Capistrano.capify
25
+
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ module Pvcglue
2
+ class Packages
3
+ def self.apply(package, context, nodes, user = 'deploy', package_filter = nil)
4
+ # puts nodes.inspect
5
+ orca_suite = OrcaSuite.init(package_filter)
6
+ nodes.each do |node, data|
7
+ orca_node = ::Orca::Node.new(node, data[:public_ip], {user: user, port: Pvcglue.cloud.port_in_context(context)})
8
+ ::Pvcglue.cloud.current_node = {node => data}
9
+ begin
10
+ orca_suite.run(orca_node.name, package.to_s, :apply)
11
+ ensure
12
+ ::Pvcglue.cloud.current_node = nil
13
+ ::Pvcglue.cloud.current_hostname = nil
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ class OrcaSuite
20
+
21
+ def self.init(package_filter)
22
+ ::Orca.verbose(package_filter != 'manager') # show details for all packages except manager, for now
23
+
24
+ # Load orca extensions
25
+ orca_file = File.join(File.dirname(__FILE__), 'all_the_things.rb')
26
+ ENV['ORCA_FILE'] = orca_file
27
+ suite = ::Orca::Suite.new
28
+ suite.load_file(orca_file)
29
+ packages_loaded = []
30
+
31
+ Dir[File.join(Pvcglue::gem_dir, 'lib', 'pvcglue', 'packages', '*.rb')].each do |file|
32
+ # package filter is used to load the manager package by itself when stage is not specified
33
+ next if package_filter && package_filter != File.basename(file, ".rb")
34
+ begin
35
+ suite.load_file(file)
36
+ rescue Exception => e
37
+ puts "Error loading #{file}: #{e.message}"
38
+ raise
39
+ end
40
+ packages_loaded << File.basename(file, ".rb")
41
+ end
42
+ puts "Packages loaded: #{packages_loaded.sort.join(' ')}."
43
+ suite
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,92 @@
1
+ #=======================================================================================================================
2
+ package 'bootstrap' do
3
+ #=======================================================================================================================
4
+ depends_on 'time-zone'
5
+ depends_on 'hostname'
6
+ depends_on 'htop'
7
+ depends_on 'ufw'
8
+ depends_on 'applications_dir'
9
+ depends_on 'authorized_keys'
10
+ depends_on 'sshd-config'
11
+ depends_on 'firewall-config'
12
+ depends_on 'firewall-enabled'
13
+ depends_on 'unattended-security-upgrades'
14
+ end
15
+
16
+ package 'applications_dir' do
17
+ depends_on 'deploy-user'
18
+ validate do
19
+ stat = run("stat --format=%U:%G:%a #{Pvcglue.configuration.web_app_base_dir}").strip
20
+ stat == 'deploy:deploy:2755'
21
+ end
22
+
23
+ apply do
24
+ dir = Pvcglue.configuration.web_app_base_dir
25
+ # used following as a guide for next line: http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/
26
+ run "mkdir -p #{dir} && chown deploy:deploy #{dir} && umask 0002 && chmod g+s #{dir}"
27
+ end
28
+ end
29
+
30
+ package 'deploy-user' do
31
+ apply do
32
+ run "mkdir -p ~/.pvc && chmod 600 ~/.pvc"
33
+ #run 'adduser --disabled-password --gecos "" deploy'
34
+ run "useradd -d /home/deploy -G sudo -m -U deploy"
35
+ run "usermod -s /bin/bash deploy"
36
+ # this next line will also append this every time this is run...which is less than ideal. But it *should* only get run once per server due to the validate method
37
+ run "echo 'deploy ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers" # this may be a security issue, and need refactoring, see the end of http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/
38
+ end
39
+
40
+ remove do
41
+ raise "removing user not supported, yet. It needs some 'Are you *really* sure?' stuff."
42
+ # run "userdel -f deploy"
43
+ # run "rm -rf /home/deploy"
44
+ end
45
+
46
+ validate do
47
+ sudo('getent passwd deploy') =~ /^deploy:/ &&
48
+ sudo('groups deploy') =~ /deploy sudo/
49
+ end
50
+
51
+
52
+ end
53
+
54
+ package 'authorized_keys' do
55
+
56
+ file({
57
+ :template => ::Pvcglue.template_file_name('authorized_keys.erb'),
58
+ :destination => '/home/deploy/.ssh/authorized_keys',
59
+ :create_dirs => true,
60
+ :permissions => 0644,
61
+ :user => 'deploy',
62
+ :group => 'deploy'
63
+ })
64
+ end
65
+
66
+ package 'sshd-config' do
67
+
68
+ file({
69
+ :template => Pvcglue.template_file_name('sshd_config.erb'),
70
+ :destination => '/etc/ssh/sshd_config',
71
+ :create_dirs => false,
72
+ :permissions => 0644,
73
+ :user => 'root',
74
+ :group => 'root'
75
+ }) { sudo('service ssh restart') }
76
+
77
+ end
78
+
79
+ apt_package 'unattended-upgrades'
80
+
81
+ package 'unattended-security-upgrades' do
82
+ depends_on 'unattended-upgrades'
83
+ file({
84
+ :template => Pvcglue.template_file_name('20auto-upgrades.erb'),
85
+ :destination => '/etc/apt/apt.conf.d/20auto-upgrades',
86
+ :create_dirs => false,
87
+ :permissions => 0644,
88
+ :user => 'root',
89
+ :group => 'root'
90
+ }) { sudo('service unattended-upgrades restart') }
91
+ end
92
+
@@ -0,0 +1,80 @@
1
+ package 'env-initialized' do
2
+ apply do
3
+ ::Pvcglue::Env.initialize_stage_env
4
+ end
5
+ end
6
+
7
+ package 'env-get-stage' do
8
+ apply do
9
+ data = run("cat #{::Pvcglue::Env.stage_env_file_name}")
10
+ ::Pvcglue.cloud.stage_env = TOML.parse(data)
11
+ end
12
+
13
+ end
14
+
15
+ package 'env-set-stage' do
16
+ apply do
17
+ data = TOML.dump(Pvcglue.cloud.stage_env)
18
+ run(%Q[echo '#{data}' | tee #{::Pvcglue::Env.stage_env_file_name} && chmod 600 #{::Pvcglue::Env.stage_env_file_name}])
19
+ end
20
+
21
+ end
22
+
23
+ package 'deploy-to-base' do
24
+ validate do
25
+ stat = run("stat --format=%U:%G:%a #{Pvcglue.cloud.deploy_to_app_shared_dir}").strip
26
+ stat == 'deploy:deploy:2775'
27
+ end
28
+
29
+ apply do
30
+ # Reference: http://capistranorb.com/documentation/getting-started/authentication-and-authorisation/
31
+ run "mkdir -p #{Pvcglue.cloud.deploy_to_app_shared_dir}"
32
+ # sudo "chown deploy:deploy #{ENV['PVC_DEPLOY_TO_BASE']}"
33
+ run "umask 0002 && chmod g+s #{Pvcglue.cloud.deploy_to_app_shared_dir}"
34
+ end
35
+ end
36
+
37
+ package 'app-env' do
38
+ depends_on 'deploy-to-base'
39
+ depends_on 'app-env-file'
40
+ end
41
+
42
+ package 'app-env-file' do
43
+ depends_on 'env-initialized'
44
+
45
+ file({
46
+ :template => Pvcglue.template_file_name('web.env.erb'),
47
+ :destination => Pvcglue.cloud.env_file_name,
48
+ :create_dirs => true,
49
+ :permissions => 0640 # TODO: Double check permissions
50
+ }) do
51
+ run("touch #{Pvcglue.cloud.restart_txt_file_name}")
52
+ end
53
+
54
+ end
55
+
56
+
57
+ package 'env-push' do
58
+ apply do
59
+ if File.exists?(::Pvcglue.cloud.env_local_file_name)
60
+ data = File.read(::Pvcglue.cloud.env_local_file_name)
61
+ run(%Q[echo '#{data}' | tee #{::Pvcglue::Env.stage_env_file_name}])
62
+ run(%Q[chmod 600 #{::Pvcglue::Env.stage_env_file_name}])
63
+ else
64
+ puts "Local env file not found: #{::Pvcglue.cloud.env_local_file_name}"
65
+ end
66
+ end
67
+ end
68
+
69
+ package 'env-pull' do
70
+ apply do
71
+ data = run("cat #{::Pvcglue::Env.stage_env_file_name}")
72
+ if data.empty?
73
+ puts "Remote env file not found: #{::Pvcglue::Env.stage_env_file_name}"
74
+ else
75
+ File.write(::Pvcglue.cloud.env_local_file_name, data)
76
+ puts "Saved as: #{::Pvcglue.cloud.env_local_file_name}"
77
+ end
78
+ end
79
+ end
80
+
@@ -0,0 +1,48 @@
1
+ # Reference: http://manpages.ubuntu.com/manpages/precise/en/man8/ufw-framework.8.html
2
+ package 'firewall-config' do
3
+
4
+ file({
5
+ :template => Pvcglue.template_file_name('ufw.rules6.erb'),
6
+ :destination => '/lib/ufw/user6.rules',
7
+ :create_dirs => false,
8
+ :permissions => 0640,
9
+ :user => 'root',
10
+ :group => 'root'
11
+ }) { }
12
+
13
+ file({
14
+ :template => Pvcglue.template_file_name('ufw.rules.erb'),
15
+ :destination => '/lib/ufw/user.rules',
16
+ :create_dirs => false,
17
+ :permissions => 0640,
18
+ :user => 'root',
19
+ :group => 'root'
20
+ }) { sudo('service ufw restart') }
21
+
22
+ end
23
+
24
+ package 'firewall-enabled' do
25
+ validate do
26
+ result = sudo('ufw status verbose')
27
+ result =~ /Status: active/ && result =~ /Default: deny \(incoming\), allow \(outgoing\)/
28
+ end
29
+
30
+ apply do
31
+ sudo('ufw --force enable')
32
+ end
33
+ end
34
+
35
+ # TODO: add command line command for this
36
+ package 'update-firewall' do
37
+ # quick update of firewall settings only. Full bootstrap must be performed first.
38
+ depends_on 'firewall-config'
39
+ depends_on 'firewall-enabled'
40
+ end
41
+
42
+
43
+ # TODO: add command line command for this
44
+ package 'firewall-status' do
45
+ apply do
46
+ run "ufw status verbose"
47
+ end
48
+ end
@@ -0,0 +1,102 @@
1
+ require 'toml'
2
+ apt_package 'htop'
3
+ apt_package 'ufw'
4
+
5
+ package 'bootstrap-manager' do
6
+ # TODO: firewall and ssh port config
7
+ #depends_on 'time-zone'
8
+ depends_on 'htop'
9
+ # depends_on 'ufw'
10
+ #depends_on 'deploy-user'
11
+ #depends_on 'sshd-config'
12
+ #depends_on 'firewall-config'
13
+ depends_on 'pvcglue-user'
14
+ depends_on 'manager-copy-id'
15
+ end
16
+
17
+ package 'pvcglue-user' do
18
+ apply do
19
+ # Local variables used to improve readability of bash commands :)
20
+ user_name = Pvcglue::Manager.user_name
21
+ home_dir = Pvcglue::Manager.home_dir
22
+ manager_dir = Pvcglue::Manager.manager_dir
23
+ ssh_dir = Pvcglue::Manager.ssh_dir
24
+
25
+ sudo "useradd -d #{home_dir} -m -U #{user_name}"
26
+ sudo "usermod -s /bin/bash #{user_name}"
27
+ sudo "mkdir -p #{manager_dir} && chown #{user_name}:#{user_name} #{manager_dir} && chmod 700 #{manager_dir}"
28
+ sudo "mkdir -p #{ssh_dir} && chown #{user_name}:#{user_name} #{ssh_dir} && chmod 700 #{ssh_dir}"
29
+ end
30
+
31
+ remove do
32
+ raise "removing user not supported, yet. It needs some 'Are you *really* sure?' stuff."
33
+ # user_name = Pvcglue::Manager.user_name
34
+ # home_dir = Pvcglue::Manager.home_dir
35
+ #sudo "userdel -f #{user_name}"
36
+ #sudo "rm -rf #{home_dir}"
37
+ end
38
+
39
+ validate do
40
+ user_name = Pvcglue::Manager.user_name
41
+ # home_dir = Pvcglue::Manager.home_dir
42
+ #sudo "userdel -f #{user_name}"; sudo "rm -rf #{home_dir}"; raise "User has been deleted"
43
+ sudo("getent passwd #{user_name}") =~ /^#{user_name}:/
44
+ end
45
+ end
46
+
47
+ package 'manager-copy-id' do
48
+ validate do
49
+ authorized_keys_file_name = Pvcglue::Manager.authorized_keys_file_name
50
+ user_key = `cat ~/.ssh/id_rsa.pub`.strip
51
+ auth = run("cat #{authorized_keys_file_name}")
52
+ auth.include?(user_key)
53
+ end
54
+
55
+ apply do
56
+ authorized_keys_file_name = Pvcglue::Manager.authorized_keys_file_name
57
+ user_name = Pvcglue::Manager.user_name
58
+ copy_id = %Q[cat ~/.ssh/id_rsa.pub | ssh #{node.get(:user)}@#{node.host} "cat >> #{authorized_keys_file_name}"]
59
+ system "#{copy_id}"
60
+ run(%Q[cat "" >> #{authorized_keys_file_name}])
61
+ sudo "chown #{user_name}:#{user_name} #{authorized_keys_file_name} && chmod 600 #{authorized_keys_file_name}"
62
+ end
63
+ end
64
+
65
+ package 'manager-push' do
66
+ apply do
67
+ if File.exists?(::Pvcglue.cloud.local_file_name)
68
+ data = File.read(::Pvcglue.cloud.local_file_name)
69
+ run(%Q[echo '#{data}' | tee #{::Pvcglue::Manager.manager_file_name}])
70
+ run(%Q[chmod 600 #{::Pvcglue::Manager.manager_file_name}])
71
+ else
72
+ puts "Local file not found: #{::Pvcglue.cloud.local_file_name}"
73
+ end
74
+ end
75
+ end
76
+
77
+ package 'manager-pull' do
78
+ apply do
79
+ data = run("cat #{::Pvcglue::Manager.manager_file_name}")
80
+ if data.empty?
81
+ puts "Remote manager file not found: #{::Pvcglue::Manager.manager_file_name}"
82
+ else
83
+ File.write(::Pvcglue.cloud.local_file_name, data)
84
+ puts "Saved as: #{::Pvcglue.cloud.local_file_name}"
85
+ end
86
+ end
87
+ end
88
+
89
+ package 'manager-get-config' do
90
+ apply do
91
+ data = run("cat #{::Pvcglue::Manager.manager_file_name}")
92
+ #puts "*"*80
93
+ #puts data
94
+ #puts "*"*80
95
+ if data.empty?
96
+ raise "Remote manager file not found: #{::Pvcglue::Manager.manager_file_name}"
97
+ else
98
+ ::Pvcglue.cloud.data = TOML.parse(data)
99
+ end
100
+ end
101
+ end
102
+