boxen-linux 2.7.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 (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +2 -0
  5. data/LICENSE +20 -0
  6. data/README.md +50 -0
  7. data/boxen.gemspec +26 -0
  8. data/lib/boxen/check.rb +72 -0
  9. data/lib/boxen/checkout.rb +25 -0
  10. data/lib/boxen/cli.rb +63 -0
  11. data/lib/boxen/config.rb +330 -0
  12. data/lib/boxen/error.rb +4 -0
  13. data/lib/boxen/flags.rb +272 -0
  14. data/lib/boxen/hook.rb +47 -0
  15. data/lib/boxen/hook/github_issue.rb +120 -0
  16. data/lib/boxen/hook/web.rb +56 -0
  17. data/lib/boxen/keychain.rb +63 -0
  18. data/lib/boxen/postflight.rb +13 -0
  19. data/lib/boxen/postflight/active.rb +16 -0
  20. data/lib/boxen/postflight/env.rb +34 -0
  21. data/lib/boxen/preflight.rb +13 -0
  22. data/lib/boxen/preflight/creds.rb +108 -0
  23. data/lib/boxen/preflight/directories.rb +32 -0
  24. data/lib/boxen/preflight/etc_my_cnf.rb +12 -0
  25. data/lib/boxen/preflight/homebrew.rb +13 -0
  26. data/lib/boxen/preflight/identity.rb +16 -0
  27. data/lib/boxen/preflight/os.rb +33 -0
  28. data/lib/boxen/preflight/rbenv.rb +12 -0
  29. data/lib/boxen/preflight/rvm.rb +12 -0
  30. data/lib/boxen/project.rb +20 -0
  31. data/lib/boxen/puppeteer.rb +122 -0
  32. data/lib/boxen/runner.rb +149 -0
  33. data/lib/boxen/service.rb +58 -0
  34. data/lib/boxen/util.rb +17 -0
  35. data/lib/facter/boxen.rb +34 -0
  36. data/lib/system_timer.rb +13 -0
  37. data/script/Boxen +0 -0
  38. data/script/Boxen-linux +0 -0
  39. data/script/bootstrap +7 -0
  40. data/script/build-keychain-helper +6 -0
  41. data/script/build-keyring-helper +9 -0
  42. data/script/release +38 -0
  43. data/script/tests +10 -0
  44. data/src/keychain-helper.c +85 -0
  45. data/src/keyring-helper.c +86 -0
  46. data/test/boxen/test.rb +7 -0
  47. data/test/boxen_check_test.rb +55 -0
  48. data/test/boxen_checkout_test.rb +42 -0
  49. data/test/boxen_cli_test.rb +39 -0
  50. data/test/boxen_config_test.rb +393 -0
  51. data/test/boxen_directories_test.rb +40 -0
  52. data/test/boxen_flags_test.rb +217 -0
  53. data/test/boxen_hook_github_issue_test.rb +294 -0
  54. data/test/boxen_hook_web_test.rb +58 -0
  55. data/test/boxen_keychain_test.rb +24 -0
  56. data/test/boxen_postflight_active_test.rb +29 -0
  57. data/test/boxen_postflight_env_test.rb +6 -0
  58. data/test/boxen_preflight_creds_test.rb +80 -0
  59. data/test/boxen_preflight_etc_my_cnf_test.rb +10 -0
  60. data/test/boxen_preflight_homebrew_test.rb +10 -0
  61. data/test/boxen_preflight_rvm_test.rb +10 -0
  62. data/test/boxen_project_test.rb +14 -0
  63. data/test/boxen_puppeteer_test.rb +101 -0
  64. data/test/boxen_runner_test.rb +171 -0
  65. data/test/boxen_service_test.rb +39 -0
  66. data/test/boxen_util_test.rb +21 -0
  67. data/test/fixtures/repo/modules/projects/manifests/first-project.pp +0 -0
  68. data/test/fixtures/repo/modules/projects/manifests/second-project.pp +0 -0
  69. data/test/system_timer.rb +10 -0
  70. metadata +279 -0
@@ -0,0 +1,4 @@
1
+ module Boxen
2
+ class Error < RuntimeError
3
+ end
4
+ end
@@ -0,0 +1,272 @@
1
+ require "optparse"
2
+ require "boxen/error"
3
+
4
+ module Boxen
5
+
6
+ # Various flags and settings parsed from the command line. See
7
+ # Setup::Configuration for more info.
8
+
9
+ class Flags
10
+
11
+ attr_reader :args
12
+ attr_reader :homedir
13
+ attr_reader :logfile
14
+ attr_reader :login
15
+ attr_reader :token
16
+ attr_reader :srcdir
17
+ attr_reader :user
18
+
19
+ attr_reader :disable_service
20
+ attr_reader :enable_service
21
+ attr_reader :restart_service
22
+
23
+ # Create a new instance, optionally providing CLI `args` to
24
+ # parse immediately.
25
+
26
+ def initialize(*args)
27
+ @args = []
28
+ @debug = false
29
+ @env = false
30
+ @fde = true
31
+ @help = false
32
+ @pretend = false
33
+ @profile = false
34
+ @report = false
35
+ @graph = false
36
+ @projects = false
37
+ @stealth = false
38
+ @disable_service = false
39
+ @enable_service = false
40
+ @restart_service = false
41
+ @disable_services = false
42
+ @enable_services = false
43
+ @restart_services = false
44
+ @list_services = false
45
+ @color = true
46
+
47
+ @options = OptionParser.new do |o|
48
+ o.banner = "Usage: #{File.basename $0} [options] [projects...]\n\n"
49
+
50
+ o.on "--debug", "Be really verbose." do
51
+ @debug = true
52
+ end
53
+
54
+ o.on "--pretend", "--noop", "Don't make changes." do
55
+ @pretend = true
56
+ end
57
+
58
+ o.on "--report", "Enable puppet reports." do
59
+ @report = true
60
+ end
61
+
62
+ o.on "--graph", "Enable generation of dependency graphs." do
63
+ @graph = true
64
+ end
65
+
66
+ o.on "--env", "Show useful environment variables." do
67
+ @env = true
68
+ end
69
+
70
+ o.on "--help", "-h", "-?", "Show help." do
71
+ @help = true
72
+ end
73
+
74
+ o.on "--disable-service SERVICE", "Disable a Boxen service." do |service|
75
+ @disable_service = service
76
+ end
77
+
78
+ o.on "--enable-service SERVICE", "Enable a Boxen service." do |service|
79
+ @enable_service = service
80
+ end
81
+
82
+ o.on "--restart-service SERVICE", "Restart a Boxen service." do |service|
83
+ @restart_service = service
84
+ end
85
+
86
+ o.on "--disable-services", "Disable all Boxen services." do
87
+ @disable_services = true
88
+ end
89
+
90
+ o.on "--enable-services", "Enable all Boxen services." do
91
+ @enable_services = true
92
+ end
93
+
94
+ o.on "--restart-services", "Restart all Boxen services." do
95
+ @restart_services = true
96
+ end
97
+
98
+ o.on "--list-services", "List Boxen services." do
99
+ @list_services = true
100
+ end
101
+
102
+ o.on "--homedir DIR", "Boxen's home directory." do |homedir|
103
+ @homedir = homedir
104
+ end
105
+
106
+ o.on "--logfile DIR", "Boxen's log file." do |logfile|
107
+ @logfile = logfile
108
+ end
109
+
110
+ o.on "--login LOGIN", "Your GitHub login." do |login|
111
+ @login = login
112
+ end
113
+
114
+ o.on "--no-fde", "Don't require full disk encryption." do
115
+ @fde = false
116
+ end
117
+
118
+ # --no-pull is used before options are parsed, but consumed here.
119
+
120
+ o.on "--no-pull", "Don't try to update code before applying."
121
+
122
+ o.on "--no-issue", "--stealth", "Don't open an issue on failure." do
123
+ @stealth = true
124
+ end
125
+
126
+ o.on "--token TOKEN", "Your GitHub OAuth token." do |token|
127
+ @token = token
128
+ end
129
+
130
+ o.on "--profile", "Profile the Puppet run." do
131
+ @profile = true
132
+ end
133
+
134
+ o.on "--future-parser", "Enable the Puppet future parser" do
135
+ @future_parser = true
136
+ end
137
+
138
+ o.on "--projects", "Show available projects." do
139
+ @projects = true
140
+ end
141
+
142
+ o.on "--srcdir DIR", "The directory where repos live." do |srcdir|
143
+ @srcdir = srcdir
144
+ end
145
+
146
+ o.on "--user USER", "Your local user." do |user|
147
+ @user = user
148
+ end
149
+
150
+ o.on "--no-color", "Disable colors." do
151
+ @color = false
152
+ end
153
+ end
154
+
155
+ parse args.flatten.compact
156
+ end
157
+
158
+ # Apply these flags to `config`. Returns `config`.
159
+
160
+ def apply(config)
161
+ config.debug = debug?
162
+ config.fde = fde? if config.fde?
163
+ config.homedir = homedir if homedir
164
+ config.logfile = logfile if logfile
165
+ config.login = login if login
166
+ config.token = token if token
167
+ config.pretend = pretend?
168
+ config.profile = profile?
169
+ config.future_parser = future_parser?
170
+ config.report = report?
171
+ config.graph = graph?
172
+ config.srcdir = srcdir if srcdir
173
+ config.stealth = stealth?
174
+ config.user = user if user
175
+ config.color = color?
176
+
177
+ config
178
+ end
179
+
180
+ def debug?
181
+ @debug
182
+ end
183
+
184
+ def env?
185
+ @env
186
+ end
187
+
188
+ def fde?
189
+ @fde
190
+ end
191
+
192
+ def help?
193
+ @help
194
+ end
195
+
196
+ def disable_services?
197
+ @disable_services
198
+ end
199
+
200
+ def enable_services?
201
+ @enable_services
202
+ end
203
+
204
+ def disable_service?
205
+ @disable_service
206
+ end
207
+
208
+ def enable_service?
209
+ @enable_service
210
+ end
211
+
212
+ def restart_service?
213
+ @restart_service
214
+ end
215
+
216
+ def restart_services?
217
+ @restart_services
218
+ end
219
+
220
+ def list_services?
221
+ @list_services
222
+ end
223
+
224
+ # Parse `args` as an array of CLI argument Strings. Raises
225
+ # Boxen::Error if anything goes wrong. Returns `self`.
226
+
227
+ def parse(*args)
228
+ @args = @options.parse! args.flatten.compact.map(&:to_s)
229
+
230
+ self
231
+
232
+ rescue OptionParser::MissingArgument, OptionParser::InvalidOption => e
233
+ raise Boxen::Error, "#{e.message}\n#@options"
234
+ end
235
+
236
+ def pretend?
237
+ @pretend
238
+ end
239
+
240
+ def profile?
241
+ @profile
242
+ end
243
+
244
+ def future_parser?
245
+ @future_parser
246
+ end
247
+
248
+ def report?
249
+ @report
250
+ end
251
+
252
+ def graph?
253
+ @graph
254
+ end
255
+
256
+ def projects?
257
+ @projects
258
+ end
259
+
260
+ def stealth?
261
+ @stealth
262
+ end
263
+
264
+ def color?
265
+ @color
266
+ end
267
+
268
+ def to_s
269
+ @options.to_s
270
+ end
271
+ end
272
+ end
@@ -0,0 +1,47 @@
1
+ module Boxen
2
+ class Hook
3
+ attr_reader :config
4
+ attr_reader :checkout
5
+ attr_reader :puppet
6
+ attr_reader :result
7
+
8
+ @hooks = []
9
+
10
+ def self.register(hook)
11
+ @hooks << hook
12
+ end
13
+
14
+ def self.unregister(hook)
15
+ @hooks.delete hook
16
+ end
17
+
18
+ def self.all
19
+ @hooks || []
20
+ end
21
+
22
+ def initialize(config, checkout, puppet, result)
23
+ @config = config
24
+ @checkout = checkout
25
+ @puppet = puppet
26
+ @result = result
27
+ end
28
+
29
+ def enabled?
30
+ required_vars = Array(required_environment_variables)
31
+ required_vars.any? && required_vars.all? do |var|
32
+ ENV[var] && !ENV[var].empty?
33
+ end
34
+ end
35
+
36
+ def perform?
37
+ false
38
+ end
39
+
40
+ def run
41
+ call if perform?
42
+ end
43
+ end
44
+ end
45
+
46
+ require "boxen/hook/github_issue"
47
+ require "boxen/hook/web"
@@ -0,0 +1,120 @@
1
+ require "boxen/hook"
2
+
3
+ module Boxen
4
+ class Hook
5
+ class GitHubIssue < Hook
6
+ def perform?
7
+ enabled? &&
8
+ !config.stealth? && !config.pretend? &&
9
+ !config.login.to_s.empty? &&
10
+ checkout.master?
11
+ end
12
+
13
+ def call
14
+ if result.success?
15
+ close_failures
16
+ else
17
+ warn "Sorry! Creating an issue on #{config.reponame}."
18
+ record_failure
19
+ end
20
+ end
21
+
22
+ def compare_url
23
+ return unless config.reponame
24
+ "#{config.ghurl}/#{config.reponame}/compare/#{checkout.sha}...master"
25
+ end
26
+
27
+ def hostname
28
+ `hostname`.strip
29
+ end
30
+
31
+ def os
32
+ `sw_vers -productVersion`.strip
33
+ end
34
+
35
+ def shell
36
+ ENV["SHELL"]
37
+ end
38
+
39
+ def log
40
+ File.read config.logfile
41
+ end
42
+
43
+ def record_failure
44
+ return unless issues?
45
+
46
+ title = "Failed for #{config.user}"
47
+ config.api.create_issue(config.reponame, title, failure_details,
48
+ :labels => [failure_label])
49
+ end
50
+
51
+ def close_failures
52
+ return unless issues?
53
+
54
+ comment = "Succeeded at version #{checkout.sha}."
55
+ failures.each do |issue|
56
+ config.api.add_comment(config.reponame, issue.number, comment)
57
+ config.api.close_issue(config.reponame, issue.number)
58
+ end
59
+ end
60
+
61
+ def failures
62
+ return [] unless issues?
63
+
64
+ issues = config.api.list_issues(config.reponame, :state => 'open',
65
+ :labels => failure_label, :creator => config.login)
66
+ issues.reject! {|i| i.labels.collect(&:name).include?(ongoing_label)}
67
+ issues
68
+ end
69
+
70
+ def failure_details
71
+ body = ''
72
+ body << "Running on `#{hostname}` (OS X #{os}) under `#{shell}`, "
73
+ body << "version #{checkout.sha} ([compare to master](#{compare_url}))."
74
+ body << "\n\n"
75
+
76
+ if checkout.dirty?
77
+ body << "### Changes"
78
+ body << "\n\n"
79
+ body << "```\n#{checkout.changes}\n```"
80
+ body << "\n\n"
81
+ end
82
+
83
+ body << "### Puppet Command"
84
+ body << "\n\n"
85
+ body << "```\n#{puppet.command.join(' ')}\n```"
86
+ body << "\n\n"
87
+
88
+ body << "### Output (from #{config.logfile})"
89
+ body << "\n\n"
90
+ body << "```\n#{log}\n```\n"
91
+
92
+ body
93
+ end
94
+
95
+ def failure_label
96
+ @failure_label ||= 'failure'
97
+ end
98
+ attr_writer :failure_label
99
+
100
+ def ongoing_label
101
+ @ongoing_label ||= 'ongoing'
102
+ end
103
+ attr_writer :ongoing_label
104
+
105
+ def issues?
106
+ return unless config.reponame
107
+ return if config.reponame == 'boxen/our-boxen'
108
+
109
+ config.api.repository(config.reponame).has_issues
110
+ end
111
+
112
+ private
113
+ def required_environment_variables
114
+ ['BOXEN_ISSUES_ENABLED']
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ Boxen::Hook.register Boxen::Hook::GitHubIssue
@@ -0,0 +1,56 @@
1
+ require "boxen/hook"
2
+ require "json"
3
+ require "net/http"
4
+
5
+ module Boxen
6
+ class Hook
7
+ class Web < Hook
8
+ def perform?
9
+ enabled?
10
+ end
11
+
12
+ private
13
+ def call
14
+ payload = {
15
+ :login => config.user,
16
+ :sha => checkout.sha,
17
+ :status => result.success? ? 'success' : 'failure',
18
+ :time => "#{Time.now.utc.to_i}"
19
+ }
20
+
21
+ post_web_hook payload
22
+ end
23
+
24
+ def post_web_hook(payload)
25
+ headers = { 'Content-Type' => 'application/json' }
26
+
27
+ uri = URI.parse(URI.escape(ENV['BOXEN_WEB_HOOK_URL']))
28
+
29
+ user, pass, host, port, path = \
30
+ uri.user, uri.pass, uri.host, uri.port, uri.path
31
+
32
+ request = Net::HTTP::Post.new(path, initheader = headers)
33
+
34
+ if uri.scheme =~ /https/
35
+ http.use_ssl = true
36
+ end
37
+
38
+ if user && pass
39
+ request.basic_auth user, pass
40
+ end
41
+
42
+ request.body = payload.to_json
43
+
44
+ response = Net::HTTP.new(host, port).start do |http|
45
+ http.request(request)
46
+ end
47
+ end
48
+
49
+ def required_environment_variables
50
+ ['BOXEN_WEB_HOOK_URL']
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ Boxen::Hook.register Boxen::Hook::Web