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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.travis.yml +7 -0
- data/Gemfile +2 -0
- data/LICENSE +20 -0
- data/README.md +50 -0
- data/boxen.gemspec +26 -0
- data/lib/boxen/check.rb +72 -0
- data/lib/boxen/checkout.rb +25 -0
- data/lib/boxen/cli.rb +63 -0
- data/lib/boxen/config.rb +330 -0
- data/lib/boxen/error.rb +4 -0
- data/lib/boxen/flags.rb +272 -0
- data/lib/boxen/hook.rb +47 -0
- data/lib/boxen/hook/github_issue.rb +120 -0
- data/lib/boxen/hook/web.rb +56 -0
- data/lib/boxen/keychain.rb +63 -0
- data/lib/boxen/postflight.rb +13 -0
- data/lib/boxen/postflight/active.rb +16 -0
- data/lib/boxen/postflight/env.rb +34 -0
- data/lib/boxen/preflight.rb +13 -0
- data/lib/boxen/preflight/creds.rb +108 -0
- data/lib/boxen/preflight/directories.rb +32 -0
- data/lib/boxen/preflight/etc_my_cnf.rb +12 -0
- data/lib/boxen/preflight/homebrew.rb +13 -0
- data/lib/boxen/preflight/identity.rb +16 -0
- data/lib/boxen/preflight/os.rb +33 -0
- data/lib/boxen/preflight/rbenv.rb +12 -0
- data/lib/boxen/preflight/rvm.rb +12 -0
- data/lib/boxen/project.rb +20 -0
- data/lib/boxen/puppeteer.rb +122 -0
- data/lib/boxen/runner.rb +149 -0
- data/lib/boxen/service.rb +58 -0
- data/lib/boxen/util.rb +17 -0
- data/lib/facter/boxen.rb +34 -0
- data/lib/system_timer.rb +13 -0
- data/script/Boxen +0 -0
- data/script/Boxen-linux +0 -0
- data/script/bootstrap +7 -0
- data/script/build-keychain-helper +6 -0
- data/script/build-keyring-helper +9 -0
- data/script/release +38 -0
- data/script/tests +10 -0
- data/src/keychain-helper.c +85 -0
- data/src/keyring-helper.c +86 -0
- data/test/boxen/test.rb +7 -0
- data/test/boxen_check_test.rb +55 -0
- data/test/boxen_checkout_test.rb +42 -0
- data/test/boxen_cli_test.rb +39 -0
- data/test/boxen_config_test.rb +393 -0
- data/test/boxen_directories_test.rb +40 -0
- data/test/boxen_flags_test.rb +217 -0
- data/test/boxen_hook_github_issue_test.rb +294 -0
- data/test/boxen_hook_web_test.rb +58 -0
- data/test/boxen_keychain_test.rb +24 -0
- data/test/boxen_postflight_active_test.rb +29 -0
- data/test/boxen_postflight_env_test.rb +6 -0
- data/test/boxen_preflight_creds_test.rb +80 -0
- data/test/boxen_preflight_etc_my_cnf_test.rb +10 -0
- data/test/boxen_preflight_homebrew_test.rb +10 -0
- data/test/boxen_preflight_rvm_test.rb +10 -0
- data/test/boxen_project_test.rb +14 -0
- data/test/boxen_puppeteer_test.rb +101 -0
- data/test/boxen_runner_test.rb +171 -0
- data/test/boxen_service_test.rb +39 -0
- data/test/boxen_util_test.rb +21 -0
- data/test/fixtures/repo/modules/projects/manifests/first-project.pp +0 -0
- data/test/fixtures/repo/modules/projects/manifests/second-project.pp +0 -0
- data/test/system_timer.rb +10 -0
- metadata +279 -0
data/lib/boxen/error.rb
ADDED
data/lib/boxen/flags.rb
ADDED
@@ -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
|
data/lib/boxen/hook.rb
ADDED
@@ -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
|