vagrant-bosh 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.gitmodules +6 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +20 -0
  6. data/README.md +73 -0
  7. data/Rakefile +2 -0
  8. data/dev/.gitignore +1 -0
  9. data/dev/Vagrantfile +30 -0
  10. data/dev/example-bosh-manifest.yml +188 -0
  11. data/dev/example-winston-manifest.yml +70 -0
  12. data/go/.gitignore +11 -0
  13. data/go/bin/build +10 -0
  14. data/go/bin/build-linux-amd64 +9 -0
  15. data/go/bin/env +13 -0
  16. data/go/bin/go +5 -0
  17. data/go/bin/golint +19 -0
  18. data/go/bin/test +37 -0
  19. data/go/src/boshprovisioner/agent/client/client_interface.go +73 -0
  20. data/go/src/boshprovisioner/agent/client/fakes/fake_client.go +81 -0
  21. data/go/src/boshprovisioner/agent/client/http_client.go +299 -0
  22. data/go/src/boshprovisioner/agent/client/http_client_envelope.go +107 -0
  23. data/go/src/boshprovisioner/deployment/deployment.go +221 -0
  24. data/go/src/boshprovisioner/deployment/instance.go +54 -0
  25. data/go/src/boshprovisioner/deployment/manifest/deployment.go +80 -0
  26. data/go/src/boshprovisioner/deployment/manifest/ips.go +23 -0
  27. data/go/src/boshprovisioner/deployment/manifest/manifest.go +143 -0
  28. data/go/src/boshprovisioner/deployment/manifest/manifest_suite_test.go +13 -0
  29. data/go/src/boshprovisioner/deployment/manifest/manifest_test.go +86 -0
  30. data/go/src/boshprovisioner/deployment/manifest/syntax_validator.go +186 -0
  31. data/go/src/boshprovisioner/deployment/manifest/watch_time.go +47 -0
  32. data/go/src/boshprovisioner/deployment/manifest_reader.go +46 -0
  33. data/go/src/boshprovisioner/deployment/reader_factory.go +25 -0
  34. data/go/src/boshprovisioner/deployment/semantic_validator.go +111 -0
  35. data/go/src/boshprovisioner/downloader/blobstore_downloader.go +55 -0
  36. data/go/src/boshprovisioner/downloader/default_mux_downloader.go +22 -0
  37. data/go/src/boshprovisioner/downloader/downloader_interface.go +6 -0
  38. data/go/src/boshprovisioner/downloader/http_downloader.go +53 -0
  39. data/go/src/boshprovisioner/downloader/local_fs_downloader.go +48 -0
  40. data/go/src/boshprovisioner/downloader/mux_downloader.go +69 -0
  41. data/go/src/boshprovisioner/eventlog/log.go +72 -0
  42. data/go/src/boshprovisioner/eventlog/stage.go +39 -0
  43. data/go/src/boshprovisioner/eventlog/task.go +58 -0
  44. data/go/src/boshprovisioner/index/file_index.go +289 -0
  45. data/go/src/boshprovisioner/index/file_index_test.go +296 -0
  46. data/go/src/boshprovisioner/index/index_interface.go +18 -0
  47. data/go/src/boshprovisioner/index/index_suite_test.go +13 -0
  48. data/go/src/boshprovisioner/instance/templatescompiler/concrete_templates_compiler.go +273 -0
  49. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erb_renderer.go +117 -0
  50. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erbrenderer_suite_test.go +13 -0
  51. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties.go +77 -0
  52. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties_test.go +142 -0
  53. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context.go +85 -0
  54. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context_rb.go +155 -0
  55. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_jobs_repository.go +64 -0
  56. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_runtime_packages_repository.go +105 -0
  57. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_template_to_job_repository.go +76 -0
  58. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/jobs_repository_interface.go +31 -0
  59. data/go/src/boshprovisioner/instance/templatescompiler/rendered_archives_compiler.go +81 -0
  60. data/go/src/boshprovisioner/instance/templatescompiler/templates_compiler_interface.go +20 -0
  61. data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/ct_repository.go +54 -0
  62. data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/templates_repository_interface.go +16 -0
  63. data/go/src/boshprovisioner/instance/updater/applier/applier.go +93 -0
  64. data/go/src/boshprovisioner/instance/updater/applier/empty_state.go +66 -0
  65. data/go/src/boshprovisioner/instance/updater/applier/job_state.go +178 -0
  66. data/go/src/boshprovisioner/instance/updater/drainer.go +72 -0
  67. data/go/src/boshprovisioner/instance/updater/preparer.go +39 -0
  68. data/go/src/boshprovisioner/instance/updater/starter.go +36 -0
  69. data/go/src/boshprovisioner/instance/updater/stopper.go +36 -0
  70. data/go/src/boshprovisioner/instance/updater/updater.go +102 -0
  71. data/go/src/boshprovisioner/instance/updater/updater_factory.go +83 -0
  72. data/go/src/boshprovisioner/instance/updater/updater_suite_test.go +13 -0
  73. data/go/src/boshprovisioner/instance/updater/waiter.go +77 -0
  74. data/go/src/boshprovisioner/instance/updater/waiter_test.go +103 -0
  75. data/go/src/boshprovisioner/main/config.go +77 -0
  76. data/go/src/boshprovisioner/main/main.go +183 -0
  77. data/go/src/boshprovisioner/main/repos_factory.go +96 -0
  78. data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/compiled_packages_repository_interface.go +17 -0
  79. data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/concrete_compiled_packages_repository.go +61 -0
  80. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +179 -0
  81. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler_factory.go +48 -0
  82. data/go/src/boshprovisioner/packagescompiler/packages_compiler_interface.go +20 -0
  83. data/go/src/boshprovisioner/packagescompiler/packagesrepo/concrete_packages_repository.go +65 -0
  84. data/go/src/boshprovisioner/packagescompiler/packagesrepo/packages_repository_interface.go +16 -0
  85. data/go/src/boshprovisioner/provisioner/blobstore_config.go +65 -0
  86. data/go/src/boshprovisioner/provisioner/blobstore_provisioner.go +38 -0
  87. data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +97 -0
  88. data/go/src/boshprovisioner/provisioner/instance_provisioner.go +48 -0
  89. data/go/src/boshprovisioner/provisioner/release_compiler.go +133 -0
  90. data/go/src/boshprovisioner/release/job/job.go +86 -0
  91. data/go/src/boshprovisioner/release/job/manifest/manifest.go +79 -0
  92. data/go/src/boshprovisioner/release/job/manifest/manifest_suite_test.go +13 -0
  93. data/go/src/boshprovisioner/release/job/manifest/manifest_test.go +42 -0
  94. data/go/src/boshprovisioner/release/job/manifest/syntax_validator.go +43 -0
  95. data/go/src/boshprovisioner/release/job/reader_factory.go +34 -0
  96. data/go/src/boshprovisioner/release/job/tar_reader.go +133 -0
  97. data/go/src/boshprovisioner/release/manifest/manifest.go +96 -0
  98. data/go/src/boshprovisioner/release/manifest_reader.go +29 -0
  99. data/go/src/boshprovisioner/release/reader_factory.go +34 -0
  100. data/go/src/boshprovisioner/release/release.go +144 -0
  101. data/go/src/boshprovisioner/release/release_suite_test.go +13 -0
  102. data/go/src/boshprovisioner/release/release_test.go +129 -0
  103. data/go/src/boshprovisioner/release/tar_reader.go +139 -0
  104. data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +114 -0
  105. data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +15 -0
  106. data/go/src/boshprovisioner/tar/cmd_compressor.go +68 -0
  107. data/go/src/boshprovisioner/tar/cmd_extractor.go +47 -0
  108. data/go/src/boshprovisioner/tar/compressor_interface.go +6 -0
  109. data/go/src/boshprovisioner/tar/extractor_interface.go +6 -0
  110. data/go/src/boshprovisioner/util/string_keyed.go +70 -0
  111. data/go/src/boshprovisioner/vm/agent_provisioner.go +266 -0
  112. data/go/src/boshprovisioner/vm/asset_manager.go +61 -0
  113. data/go/src/boshprovisioner/vm/deps_provisioner.go +92 -0
  114. data/go/src/boshprovisioner/vm/monit_provisioner.go +83 -0
  115. data/go/src/boshprovisioner/vm/runit_provisioner.go +225 -0
  116. data/go/src/boshprovisioner/vm/simple_cmds.go +54 -0
  117. data/go/src/boshprovisioner/vm/vcap_user_provisioner.go +120 -0
  118. data/go/src/boshprovisioner/vm/vm.go +19 -0
  119. data/go/src/boshprovisioner/vm/vm_provisioner.go +57 -0
  120. data/go/src/boshprovisioner/vm/vm_provisioner_factory.go +97 -0
  121. data/lib/vagrant-bosh/asset_uploader.rb +53 -0
  122. data/lib/vagrant-bosh/assets/agent/agent-log +5 -0
  123. data/lib/vagrant-bosh/assets/agent/agent-run +12 -0
  124. data/lib/vagrant-bosh/assets/agent/agent.cert +18 -0
  125. data/lib/vagrant-bosh/assets/agent/agent.json +9 -0
  126. data/lib/vagrant-bosh/assets/agent/agent.key +27 -0
  127. data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
  128. data/lib/vagrant-bosh/assets/agent/bosh-agent-rc +18 -0
  129. data/lib/vagrant-bosh/assets/agent/bosh-blobstore-dav +0 -0
  130. data/lib/vagrant-bosh/assets/monit/monit +0 -0
  131. data/lib/vagrant-bosh/assets/monit/monit-log +5 -0
  132. data/lib/vagrant-bosh/assets/monit/monit-run +9 -0
  133. data/lib/vagrant-bosh/assets/monit/monitrc +8 -0
  134. data/lib/vagrant-bosh/assets/provisioner +0 -0
  135. data/lib/vagrant-bosh/bootstrapper.rb +59 -0
  136. data/lib/vagrant-bosh/communicator.rb +50 -0
  137. data/lib/vagrant-bosh/config.rb +15 -0
  138. data/lib/vagrant-bosh/errors.rb +11 -0
  139. data/lib/vagrant-bosh/plugin.rb +25 -0
  140. data/lib/vagrant-bosh/provisioner.rb +46 -0
  141. data/lib/vagrant-bosh/provisioner_tracker.rb +41 -0
  142. data/lib/vagrant-bosh/ui.rb +77 -0
  143. data/lib/vagrant-bosh/version.rb +5 -0
  144. data/lib/vagrant-bosh.rb +15 -0
  145. data/templates/locales/en.yml +15 -0
  146. data/vagrant-bosh.gemspec +20 -0
  147. metadata +191 -0
@@ -0,0 +1,225 @@
1
+ package vm
2
+
3
+ import (
4
+ "fmt"
5
+ "regexp"
6
+ "strings"
7
+ "time"
8
+
9
+ bosherr "bosh/errors"
10
+ boshlog "bosh/logger"
11
+ boshsys "bosh/system"
12
+ )
13
+
14
+ const runitProvisionerLogTag = "RunitProvisioner"
15
+
16
+ var (
17
+ // Matches 'svlogd -tt /var/vcap/bosh/log'
18
+ runitSvlogdRegex = regexp.MustCompile(`\s*svlogd\s+\-tt\s+(.+)\s*`)
19
+
20
+ // Matches 'down: agent: 3s, normally up; run: log: (pid 15318) 7762s'
21
+ runitStatusDownRegex = regexp.MustCompile(`\Adown: [a-z\/]+: \d+`)
22
+ )
23
+
24
+ // RunitProvisioner installs runit via apt-get and
25
+ // adds specified service under runit's control.
26
+ type RunitProvisioner struct {
27
+ fs boshsys.FileSystem
28
+ cmds SimpleCmds
29
+ runner boshsys.CmdRunner
30
+ assetManager AssetManager
31
+ logger boshlog.Logger
32
+ }
33
+
34
+ func NewRunitProvisioner(
35
+ fs boshsys.FileSystem,
36
+ cmds SimpleCmds,
37
+ runner boshsys.CmdRunner,
38
+ assetManager AssetManager,
39
+ logger boshlog.Logger,
40
+ ) RunitProvisioner {
41
+ return RunitProvisioner{
42
+ fs: fs,
43
+ cmds: cmds,
44
+ runner: runner,
45
+ assetManager: assetManager,
46
+ logger: logger,
47
+ }
48
+ }
49
+
50
+ func (p RunitProvisioner) Provision(name string) error {
51
+ err := p.installRunit()
52
+ if err != nil {
53
+ return bosherr.WrapError(err, "Installing runit")
54
+ }
55
+
56
+ err = p.setUpService(name)
57
+ if err != nil {
58
+ return bosherr.WrapError(err, "Setting up service")
59
+ }
60
+
61
+ return nil
62
+ }
63
+
64
+ func (p RunitProvisioner) installRunit() error {
65
+ p.logger.Info(runitProvisionerLogTag, "Installing runit")
66
+
67
+ // todo non-bash
68
+ cmd := boshsys.Command{
69
+ Name: "bash",
70
+ Args: []string{
71
+ "-c", "apt-get -q -y -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' install runit",
72
+ },
73
+ Env: map[string]string{
74
+ "DEBIAN_FRONTEND": "noninteractive",
75
+ },
76
+ }
77
+
78
+ _, _, _, err := p.runner.RunComplexCommand(cmd)
79
+ if err != nil {
80
+ return err
81
+ }
82
+
83
+ return nil
84
+ }
85
+
86
+ func (p RunitProvisioner) setUpService(name string) error {
87
+ p.logger.Info(runitProvisionerLogTag, "Setting up %s service", name)
88
+
89
+ servicePath := fmt.Sprintf("/etc/sv/%s", name)
90
+ enableServicePath := fmt.Sprintf("/etc/service/%s", name)
91
+
92
+ err := p.stopRunAndLog(servicePath, enableServicePath, name)
93
+ if err != nil {
94
+ return bosherr.WrapError(err, "Stopping run and log")
95
+ }
96
+
97
+ err = p.setUpRun(servicePath, name)
98
+ if err != nil {
99
+ return bosherr.WrapError(err, "Setting up run")
100
+ }
101
+
102
+ err = p.setUpLog(servicePath, name)
103
+ if err != nil {
104
+ return bosherr.WrapError(err, "Setting up log")
105
+ }
106
+
107
+ err = p.startRunAndLog(servicePath, enableServicePath, name)
108
+ if err != nil {
109
+ return bosherr.WrapError(err, "Starting run and log")
110
+ }
111
+
112
+ return nil
113
+ }
114
+
115
+ // setUpRun sets up script that runit will execute for the primary process
116
+ func (p RunitProvisioner) setUpRun(servicePath, name string) error {
117
+ err := p.cmds.MkdirP(servicePath)
118
+ if err != nil {
119
+ return err
120
+ }
121
+
122
+ runPath := fmt.Sprintf("%s/run", servicePath)
123
+
124
+ err = p.assetManager.Place(fmt.Sprintf("%s/%s-run", name, name), runPath)
125
+ if err != nil {
126
+ return err
127
+ }
128
+
129
+ return p.cmds.ChmodX(runPath)
130
+ }
131
+
132
+ // setUpLog sets up logging destination for the service
133
+ func (p RunitProvisioner) setUpLog(servicePath, name string) error {
134
+ logPath := fmt.Sprintf("%s/log", servicePath)
135
+
136
+ err := p.cmds.MkdirP(logPath)
137
+ if err != nil {
138
+ return err
139
+ }
140
+
141
+ logRunPath := fmt.Sprintf("%s/run", logPath)
142
+
143
+ err = p.assetManager.Place(fmt.Sprintf("%s/%s-log", name, name), logRunPath)
144
+ if err != nil {
145
+ return err
146
+ }
147
+
148
+ err = p.cmds.ChmodX(logRunPath)
149
+ if err != nil {
150
+ return err
151
+ }
152
+
153
+ contens, err := p.fs.ReadFileString(logRunPath)
154
+ if err != nil {
155
+ return err
156
+ }
157
+
158
+ // First match is the whole string
159
+ svlogdPaths := runitSvlogdRegex.FindStringSubmatch(contens)
160
+
161
+ // Create log file destination so that runit process can properly log
162
+ if len(svlogdPaths) == 2 {
163
+ err = p.cmds.MkdirP(svlogdPaths[1])
164
+ if err != nil {
165
+ return err
166
+ }
167
+ }
168
+
169
+ return nil
170
+ }
171
+
172
+ func (p RunitProvisioner) stopRunAndLog(servicePath, enableServicePath, name string) error {
173
+ err := p.stopRunsv(name)
174
+ if err != nil {
175
+ return bosherr.WrapError(err, "Stopping service")
176
+ }
177
+
178
+ err = p.stopRunsv(fmt.Sprintf("%s/log", name))
179
+ if err != nil {
180
+ return bosherr.WrapError(err, "Stopping log service")
181
+ }
182
+
183
+ err = p.fs.RemoveAll(enableServicePath)
184
+ if err != nil {
185
+ return err
186
+ }
187
+
188
+ // Clear out all service state kept in supervise/ and control/ dirs
189
+ return p.fs.RemoveAll(servicePath)
190
+ }
191
+
192
+ func (p RunitProvisioner) startRunAndLog(servicePath, enableServicePath, name string) error {
193
+ // Enabling service will kick in monitoring
194
+ _, _, _, err := p.runner.RunCommand("ln", "-sf", servicePath, enableServicePath)
195
+
196
+ return err
197
+ }
198
+
199
+ func (p RunitProvisioner) stopRunsv(name string) error {
200
+ p.logger.Info(runitProvisionerLogTag, "Stopping runsv")
201
+
202
+ downStdout, _, _, err := p.runner.RunCommand("sv", "down", name)
203
+ if err != nil {
204
+ p.logger.Error(runitProvisionerLogTag, "Ignoring down error %s", err.Error())
205
+ }
206
+
207
+ // If runsv configuration does not exist, service was never started
208
+ if strings.Contains(downStdout, "file does not exist") {
209
+ return nil
210
+ }
211
+
212
+ var lastStatusStdout string
213
+
214
+ for i := 0; i < 20; i++ {
215
+ lastStatusStdout, _, _, _ = p.runner.RunCommand("sv", "status", name)
216
+
217
+ if runitStatusDownRegex.MatchString(lastStatusStdout) {
218
+ return nil
219
+ }
220
+
221
+ time.Sleep(100 * time.Millisecond)
222
+ }
223
+
224
+ return bosherr.New("Failed to stop runsv for %s. Output: %s", name, lastStatusStdout)
225
+ }
@@ -0,0 +1,54 @@
1
+ package vm
2
+
3
+ import (
4
+ boshlog "bosh/logger"
5
+ boshsys "bosh/system"
6
+ )
7
+
8
+ type SimpleCmds struct {
9
+ runner boshsys.CmdRunner
10
+ logger boshlog.Logger
11
+ }
12
+
13
+ func NewSimpleCmds(
14
+ runner boshsys.CmdRunner,
15
+ logger boshlog.Logger,
16
+ ) SimpleCmds {
17
+ return SimpleCmds{
18
+ runner: runner,
19
+ logger: logger,
20
+ }
21
+ }
22
+
23
+ func (r SimpleCmds) MkdirP(path string) error {
24
+ return r.run("mkdir", "-p", path)
25
+ }
26
+
27
+ func (r SimpleCmds) ChmodX(path string) error {
28
+ return r.run("chmod", "+x", path)
29
+ }
30
+
31
+ func (r SimpleCmds) Touch(path string) error {
32
+ return r.run("touch", path)
33
+ }
34
+
35
+ func (r SimpleCmds) Mv(srcPath, dstPath string) error {
36
+ return r.run("mv", srcPath, dstPath)
37
+ }
38
+
39
+ func (r SimpleCmds) Chmod(mode, path string) error {
40
+ return r.run("chmod", mode, path)
41
+ }
42
+
43
+ func (r SimpleCmds) Chown(user, group, path string) error {
44
+ return r.run("chmod", user+":"+group, path)
45
+ }
46
+
47
+ func (r SimpleCmds) Bash(script string) error {
48
+ return r.run("bash", "-c", script)
49
+ }
50
+
51
+ func (r SimpleCmds) run(cmd string, args ...string) error {
52
+ _, _, _, err := r.runner.RunCommand(cmd, args...)
53
+ return err
54
+ }
@@ -0,0 +1,120 @@
1
+ package vm
2
+
3
+ import (
4
+ bosherr "bosh/errors"
5
+ boshlog "bosh/logger"
6
+ boshsys "bosh/system"
7
+
8
+ bpeventlog "boshprovisioner/eventlog"
9
+ )
10
+
11
+ const vcapUserProvisionerLogTag = "VCAPUserProvisioner"
12
+
13
+ // VCAPUserProvisioner adds and configures vcap user.
14
+ type VCAPUserProvisioner struct {
15
+ cmds SimpleCmds
16
+ runner boshsys.CmdRunner
17
+ eventLog bpeventlog.Log
18
+ logger boshlog.Logger
19
+ }
20
+
21
+ func NewVCAPUserProvisioner(
22
+ cmds SimpleCmds,
23
+ runner boshsys.CmdRunner,
24
+ eventLog bpeventlog.Log,
25
+ logger boshlog.Logger,
26
+ ) VCAPUserProvisioner {
27
+ return VCAPUserProvisioner{
28
+ cmds: cmds,
29
+ runner: runner,
30
+ eventLog: eventLog,
31
+ logger: logger,
32
+ }
33
+ }
34
+
35
+ func (p VCAPUserProvisioner) Provision() error {
36
+ stage := p.eventLog.BeginStage("Setting up vcap user", 2)
37
+
38
+ task := stage.BeginTask("Adding vcap user")
39
+
40
+ err := task.End(p.setUpVcapUser())
41
+ if err != nil {
42
+ return bosherr.WrapError(err, "Setting up vcap user")
43
+ }
44
+
45
+ task = stage.BeginTask("Harden permissions")
46
+
47
+ err = task.End(p.hardenPermissinons())
48
+ if err != nil {
49
+ return bosherr.WrapError(err, "Harden permissions")
50
+ }
51
+
52
+ return nil
53
+ }
54
+
55
+ func (p VCAPUserProvisioner) setUpVcapUser() error {
56
+ p.logger.Info(vcapUserProvisionerLogTag, "Setting up vcap user")
57
+
58
+ userBash := `
59
+ groupadd --system admin
60
+ useradd -m --comment 'BOSH System User' vcap
61
+
62
+ echo "vcap:c1oudc0w" | chpasswd
63
+ echo "root:c1oudc0w" | chpasswd
64
+
65
+ usermod -G admin,adm,audio,cdrom,dialout,floppy,video,dip,plugdev vcap
66
+ usermod -s /bin/bash vcap
67
+ `
68
+
69
+ err := p.cmds.Bash(userBash)
70
+ if err != nil {
71
+ return err
72
+ }
73
+
74
+ // todo setup vcap no-password sudo access
75
+ _, _, _, err = p.runner.RunCommand("usermod", "-a", "-G", "vcap", "vagrant")
76
+ if err != nil {
77
+ return err
78
+ }
79
+
80
+ envBashs := []string{
81
+ "echo 'export PATH=/var/vcap/bosh/bin:$PATH' >> /root/.bashrc",
82
+ "echo 'export PATH=/var/vcap/bosh/bin:$PATH' >> /home/vcap/.bashrc",
83
+
84
+ // Configure vcap user locale (postgres initdb fails if mismatched)
85
+ "echo 'LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8' > /etc/default/locale",
86
+ }
87
+
88
+ for _, bash := range envBashs {
89
+ err := p.cmds.Bash(bash)
90
+ if err != nil {
91
+ return err
92
+ }
93
+ }
94
+
95
+ return nil
96
+ }
97
+
98
+ func (p VCAPUserProvisioner) hardenPermissinons() error {
99
+ permsBash := `
100
+ echo 'vcap' > /etc/cron.allow
101
+ echo 'vcap' > /etc/at.allow
102
+
103
+ chmod 0770 /var/lock
104
+ chown -h root:vcap /var/lock
105
+ chown -LR root:vcap /var/lock
106
+
107
+ chmod 0640 /etc/cron.allow
108
+ chown root:vcap /etc/cron.allow
109
+
110
+ chmod 0640 /etc/at.allow
111
+ chown root:vcap /etc/at.allow
112
+ `
113
+
114
+ err := p.cmds.Bash(permsBash)
115
+ if err != nil {
116
+ return err
117
+ }
118
+
119
+ return nil
120
+ }
@@ -0,0 +1,19 @@
1
+ package vm
2
+
3
+ import (
4
+ bpagclient "boshprovisioner/agent/client"
5
+ )
6
+
7
+ // VM represents already provisioned machine
8
+ // that can be communicated with via an AgentClient.
9
+ type VM struct {
10
+ agentClient bpagclient.Client
11
+ }
12
+
13
+ func NewVM(agentClient bpagclient.Client) VM {
14
+ return VM{agentClient: agentClient}
15
+ }
16
+
17
+ func (vm VM) AgentClient() bpagclient.Client {
18
+ return vm.agentClient
19
+ }
@@ -0,0 +1,57 @@
1
+ package vm
2
+
3
+ import (
4
+ bosherr "bosh/errors"
5
+ boshlog "bosh/logger"
6
+
7
+ bpdep "boshprovisioner/deployment"
8
+ )
9
+
10
+ const vmProvisionerLogTag = "VMProvisioner"
11
+
12
+ // VMProvisioner installs system dependencies that
13
+ // are usually found on a stemcell, adds vcap user,
14
+ // and finally install Agent and Monit.
15
+ type VMProvisioner struct {
16
+ vcapUserProvisioner VCAPUserProvisioner
17
+ depsProvisioner DepsProvisioner
18
+ agentProvisioner AgentProvisioner
19
+
20
+ logger boshlog.Logger
21
+ }
22
+
23
+ func NewVMProvisioner(
24
+ vcapUserProvisioner VCAPUserProvisioner,
25
+ depsProvisioner DepsProvisioner,
26
+ agentProvisioner AgentProvisioner,
27
+ logger boshlog.Logger,
28
+ ) VMProvisioner {
29
+ return VMProvisioner{
30
+ vcapUserProvisioner: vcapUserProvisioner,
31
+ depsProvisioner: depsProvisioner,
32
+ agentProvisioner: agentProvisioner,
33
+
34
+ logger: logger,
35
+ }
36
+ }
37
+
38
+ func (p VMProvisioner) Provision(instance bpdep.Instance) (VM, error) {
39
+ var vm VM
40
+
41
+ err := p.vcapUserProvisioner.Provision()
42
+ if err != nil {
43
+ return vm, bosherr.WrapError(err, "Provisioning vcap user")
44
+ }
45
+
46
+ err = p.depsProvisioner.Provision()
47
+ if err != nil {
48
+ return vm, bosherr.WrapError(err, "Provisioning dependencies")
49
+ }
50
+
51
+ agentClient, err := p.agentProvisioner.Provision(instance)
52
+ if err != nil {
53
+ return vm, bosherr.WrapError(err, "Provisioning agent")
54
+ }
55
+
56
+ return NewVM(agentClient), nil
57
+ }
@@ -0,0 +1,97 @@
1
+ package vm
2
+
3
+ import (
4
+ boshlog "bosh/logger"
5
+ boshsys "bosh/system"
6
+
7
+ bpeventlog "boshprovisioner/eventlog"
8
+ )
9
+
10
+ type VMProvisionerFactory struct {
11
+ fs boshsys.FileSystem
12
+ runner boshsys.CmdRunner
13
+
14
+ assetsDir string
15
+ mbus string
16
+ blobstoreConfig map[string]interface{}
17
+
18
+ eventLog bpeventlog.Log
19
+ logger boshlog.Logger
20
+ }
21
+
22
+ func NewVMProvisionerFactory(
23
+ fs boshsys.FileSystem,
24
+ runner boshsys.CmdRunner,
25
+ assetsDir string,
26
+ mbus string,
27
+ blobstoreConfig map[string]interface{},
28
+ eventLog bpeventlog.Log,
29
+ logger boshlog.Logger,
30
+ ) VMProvisionerFactory {
31
+ return VMProvisionerFactory{
32
+ fs: fs,
33
+ runner: runner,
34
+
35
+ assetsDir: assetsDir,
36
+ mbus: mbus,
37
+ blobstoreConfig: blobstoreConfig,
38
+
39
+ eventLog: eventLog,
40
+ logger: logger,
41
+ }
42
+ }
43
+
44
+ func (f VMProvisionerFactory) NewVMProvisioner() VMProvisioner {
45
+ cmds := NewSimpleCmds(f.runner, f.logger)
46
+
47
+ vcapUserProvisioner := NewVCAPUserProvisioner(
48
+ cmds,
49
+ f.runner,
50
+ f.eventLog,
51
+ f.logger,
52
+ )
53
+
54
+ assetManager := NewAssetManager(f.assetsDir, f.fs, f.runner, f.logger)
55
+
56
+ runitProvisioner := NewRunitProvisioner(
57
+ f.fs,
58
+ cmds,
59
+ f.runner,
60
+ assetManager,
61
+ f.logger,
62
+ )
63
+
64
+ monitProvisioner := NewMonitProvisioner(
65
+ cmds,
66
+ assetManager,
67
+ runitProvisioner,
68
+ f.logger,
69
+ )
70
+
71
+ depsProvisioner := NewDepsProvisioner(
72
+ f.runner,
73
+ f.eventLog,
74
+ f.logger,
75
+ )
76
+
77
+ agentProvisioner := NewAgentProvisioner(
78
+ f.fs,
79
+ cmds,
80
+ assetManager,
81
+ runitProvisioner,
82
+ monitProvisioner,
83
+ f.blobstoreConfig,
84
+ f.mbus,
85
+ f.eventLog,
86
+ f.logger,
87
+ )
88
+
89
+ vmProvisioner := NewVMProvisioner(
90
+ vcapUserProvisioner,
91
+ depsProvisioner,
92
+ agentProvisioner,
93
+ f.logger,
94
+ )
95
+
96
+ return vmProvisioner
97
+ }
@@ -0,0 +1,53 @@
1
+ require "log4r"
2
+ require "tempfile"
3
+ require "securerandom"
4
+
5
+ module VagrantPlugins
6
+ module VagrantBosh
7
+ class AssetUploader
8
+ def initialize(communicator, ui, assets_path)
9
+ @c = communicator
10
+ @ui = ui.for(:asset_uploader)
11
+ @assets_path = assets_path
12
+ @logger = Log4r::Logger.new("vagrant::provisioners::bosh::asset_uploader")
13
+ end
14
+
15
+ def sync(dst_path)
16
+ @ui.timed_msg(:upload, dst_path: dst_path) do
17
+ upload_path(@assets_path, dst_path)
18
+ end
19
+ end
20
+
21
+ def upload_text(text, dst_path)
22
+ @ui.timed_msg(:upload, dst_path: dst_path) do
23
+ begin
24
+ f = Tempfile.new("asset-uploader-upload-text")
25
+ f.write(text)
26
+ f.flush
27
+ upload_path(f.path, dst_path)
28
+ ensure
29
+ f.close if f
30
+ end
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def upload_path(src_path, dst_path)
37
+ dst_tmp_path = "/tmp/#{SecureRandom.hex(5)}"
38
+
39
+ @c.upload(src_path, dst_tmp_path)
40
+
41
+ if File.directory?(src_path)
42
+ @c.mkdir_p(dst_path) # create nested dst path
43
+ @c.rm_rf(dst_path)
44
+ @c.mv(dst_tmp_path, dst_path)
45
+ @c.chown("root", "root", dst_path, true)
46
+ else
47
+ @c.mv(dst_tmp_path, dst_path)
48
+ @c.chown("root", "root", dst_path)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ exec svlogd -tt /var/vcap/bosh/log
@@ -0,0 +1,12 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ export PATH=/var/vcap/bosh/bin:$PATH
6
+
7
+ exec 2>&1
8
+
9
+ # Get into directory with agent.{cert,key}
10
+ cd /var/vcap/bosh
11
+
12
+ exec nice -n -10 /var/vcap/bosh/bin/bosh-agent -I warden -P ubuntu -C /var/vcap/bosh/agent.json
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC3zCCAcegAwIBAgIBADANBgkqhkiG9w0BAQUFADAzMQswCQYDVQQGEwJVUzEQ
3
+ MA4GA1UECgwHUGl2b3RhbDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTEzMTIwMTIy
4
+ MTEzMloXDTE2MTIwMTIyMTEzMlowMzELMAkGA1UEBhMCVVMxEDAOBgNVBAoMB1Bp
5
+ dm90YWwxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEP
6
+ ADCCAQoCggEBALra3YIx0O6PLcQsHAXbFzJye1M/Am3gCMcX5BTui+I7vfyMXG4w
7
+ FyXHLf9lWwe23ypvP4c1+LNTq7UTTZuidrnadlADgdDned0C09bOKv5Nzk466XTR
8
+ fNyBEyxaZzHQLa9SmDLgq1GUun8oEsxZ+uXhMq6kikRu5LBCChtVCW6LzG/FE1qm
9
+ jSSH6iaOwk2yQxKVqUKNPfz1PqtRgaUBjVWrh2+Wf22KzOTORouBOrSfdxep1Cjz
10
+ lQWt2W5l05dvf2vZTlaqDCk8PBF36FWPlwmZxRsHGACVuckl3yJ69jIaa+i+mK3k
11
+ cfi05ZafWeFwm21ahqzwK/kGsK1ofPHKxE8CAwEAATANBgkqhkiG9w0BAQUFAAOC
12
+ AQEAD1VzwtWCx32pQi5l0oFfjWqktnqfhs/Rr0ZpwacBBXHBvKuz9ENXmblt5pZu
13
+ JP7je+uXQD+da/oVhl0US2L0upIdMmD1utVXYHfRji5r/tIPl2SEKTrFiNZR1Wp6
14
+ J0nE/BW7nm41dXRBIAZR71yproaQrt1tFDFZvdfhwHGLC51L6toOhk/7S604sxbk
15
+ qV0tzT+VaR4hh09FEt9xGmB/3yFh329Yib8ScT94nKzSzoNoDp4Ms/smFhF4lUio
16
+ 7SD2+b2/nt8Mcz7q58nYvZteipRrmkOFszlNF5dU31FjvRLITn0bhiOOFRD3qAou
17
+ cSOr1qwsAKuu6MzYNh2ubsLvfg==
18
+ -----END CERTIFICATE-----
@@ -0,0 +1,9 @@
1
+ {
2
+ "Platform": {
3
+ "Linux": {
4
+ "UseDefaultTmpDir": true,
5
+ "UsePreformattedPersistentDisk": true,
6
+ "BindMountPersistentDisk": true
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEogIBAAKCAQEAutrdgjHQ7o8txCwcBdsXMnJ7Uz8CbeAIxxfkFO6L4ju9/Ixc
3
+ bjAXJcct/2VbB7bfKm8/hzX4s1OrtRNNm6J2udp2UAOB0Od53QLT1s4q/k3OTjrp
4
+ dNF83IETLFpnMdAtr1KYMuCrUZS6fygSzFn65eEyrqSKRG7ksEIKG1UJbovMb8UT
5
+ WqaNJIfqJo7CTbJDEpWpQo09/PU+q1GBpQGNVauHb5Z/bYrM5M5Gi4E6tJ93F6nU
6
+ KPOVBa3ZbmXTl29/a9lOVqoMKTw8EXfoVY+XCZnFGwcYAJW5ySXfInr2Mhpr6L6Y
7
+ reRx+LTllp9Z4XCbbVqGrPAr+QawrWh88crETwIDAQABAoIBAFh3DrB5TWXku9JI
8
+ 3+uV0uG7ec/r4QaMLxuzn/SZC/lMN6K+AXTZp9vm9UwZfIOmfPnmObmWP+0HDCBq
9
+ xy+MN5G+cI1pW6jALt4IXKsyaQCFbctz8Nux4t+y7JTvKDRZT4fWHuDXpcS2GaXi
10
+ HyRI5ZS4jfpJRH0p03PvkEFofVKsZfLAlwnx7HhPqztyc6huu7njjP6XUYbvrhOS
11
+ otE/wyyLyT36rQvUVLHfrco2Ib1r58sWb1hL84/5HnbxwsEelBAAGL5VGu2f0zLP
12
+ qxmy4XWJg9U/UKzG9gXmbcpDUn1pUcZV1rSSJ/wfbdvBSLF+dQaE6QdjGeAyrt7M
13
+ I7gCViECgYEA5ui1aXomHIwqbzll/qotebYNL8AOcpgRJTtzODcnzoe/5aA7yVox
14
+ vOFTD9rODaVRhtdC/ZHsU6rID+tx9gQdjLUEXUqS3KsPXSiwbYBPXnEtpgWz/RAu
15
+ qpxpMn3kfVbQgJjkfksWvlHNzLj5q4ZhZyL/WV3P9DON8vuP/hwwQLMCgYEAzyiv
16
+ rXx/ERnEQOpXEvPtCj04QUGCyW2o4nYIrN3OfO3PM8PnNfB8Z2LKDyuzX9qvWghg
17
+ z81KSNByW4OLdvrnX5natfxdu/6qAl18N+z/DFXuTgXi8nG9/2R5c3Gn5CQ5yab7
18
+ S4G4Pt7YwfoiqFv9j2b0DE3e5UVicGQIuWmaQ/UCgYBf61swraUXRsJ54YYU++xY
19
+ Gt/vbgCSacj1hnSebYsDqDB22tD7G5R9ubwfYe0mjf4H3XPekbdyKgdhVZTJdXww
20
+ 7yEY/9lyAT0onbZsRliyCqHDzaqu/QHlrYOljdZUmrOSN/Dy5Y5VEPZEjLJqJjBf
21
+ /5HDNc0kzCWzQfzWui7xMQKBgGNA8ysEAz2GQul3XdDO3juRqWpaoPcxe0FFnFJ2
22
+ 04A30JbUveqyFmjShE1QetjqRim06e2mRnksph4CoMeY31KGvKuFBsQT+BC6CdIh
23
+ 0vFuGod3eoz+wjGjSi1tvysn0Cg1wSEkPcqhqukFl6VirdIPWc6rYKgo3klLJILx
24
+ feAhAoGABC0apuKQD2IZZXZtDuUI9I4AemPPh0yKvFfTJxmxQ0fTlWjqdcG5nYdh
25
+ tSMBlZwsd6DRlK7dWJ/WHZXuXNeOX6ehSQFmql5/XPNd7INa5My6DDPZr1chh0WJ
26
+ QgK94NXJDoDd1OZjpUBMPLVa8d20/RdGNW8OMolJpzEPhg0r7Ac=
27
+ -----END RSA PRIVATE KEY-----