pupistry 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +34 -3
- data/exe/pupistry +38 -0
- data/lib/pupistry/bootstrap.rb +6 -0
- data/lib/pupistry/packer.rb +116 -0
- data/lib/pupistry/version.rb +1 -1
- data/lib/pupistry.rb +1 -0
- data/resources/bootstrap/freebsd-10.erb +3 -1
- data/resources/packer/PACKER_NOTES.md +49 -0
- data/resources/packer/aws_amazon-any.json.erb +38 -0
- data/resources/packer/aws_freebsd-10.json.erb +39 -0
- data/resources/packer/aws_ubuntu-14.04.json.erb +38 -0
- metadata +7 -4
- data/resources/packer/amazon_linux.json +0 -17
- data/resources/packer/test_user_data.txt +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19803e351862b0c1f835d5a9091f94cd980adb1e
|
4
|
+
data.tar.gz: bd052ce0fe5a40568c75fa53ab157653f70afaa8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ca14cd1082df16d9b2ade7d5e6d839abbd681195d8fe118ef5fe601540900ef067fabd7582dd436fc951031a4e1674debc10299c7e751c42caddb593a112fb4
|
7
|
+
data.tar.gz: b25c20084c6243a78eefcdd5163db87aa47ecc8a5116405177a39d68d5d14001005e8a496b810c05e068af621360329f944f88d3d2df26e08746308c4693ebe2
|
data/README.md
CHANGED
@@ -376,13 +376,44 @@ The bootstrap script goal is to get you from stock OS to running Pupistry and
|
|
376
376
|
doing your first Puppet run. After that - it's up to you and your Puppet
|
377
377
|
skills to make your node actually do something useful. :-)
|
378
378
|
|
379
|
+
|
380
|
+
## 5. (optional) Baking an image with Packer
|
381
|
+
|
379
382
|
Note that the node initialisation process is still susceptable to weaknesses
|
380
383
|
such as a bug in a new version of Puppet or Pupistry, or changes to the OS
|
381
384
|
packages. If this is a concern/issue for you and you want complete reliability,
|
382
385
|
then use the user data to build a host pre-loaded with Puppet and Pupistry and
|
383
|
-
then create an image of it using a tool like Packer. Doing
|
384
|
-
it possible to build all the way to Puppet execution with no
|
385
|
-
third parties other than your VM provider and AWS S3.
|
386
|
+
then create an image of it using a tool like [Packer](www.packer.io). Doing
|
387
|
+
this, you can make it possible to build all the way to Puppet execution with no
|
388
|
+
dependencies on any third parties other than your VM provider and AWS S3.
|
389
|
+
|
390
|
+
Pupistry includes support for generating some Packer examples that you can
|
391
|
+
either use as-is or built upon to meet your own needs. You can list all the
|
392
|
+
available Packer templates with:
|
393
|
+
|
394
|
+
pupistry packer
|
395
|
+
|
396
|
+
You can select a template and generate a Packer file by specifying the template
|
397
|
+
and the output file on the command line:
|
398
|
+
|
399
|
+
pupistry packer --template aws_amazon-any --file packer.json
|
400
|
+
|
401
|
+
Once the file has been generated, you can build your packer environment with
|
402
|
+
the `packer build` command. Note that some templates will require additional
|
403
|
+
variables to be passed to them at run time, for example the AWS template
|
404
|
+
requires a VPC ID and subnet ID specific to your account.
|
405
|
+
|
406
|
+
packer build \
|
407
|
+
-var 'aws_vpc_id=vpc-example' \
|
408
|
+
-var 'aws_subnet_id=subnet-example' \
|
409
|
+
output.json
|
410
|
+
|
411
|
+
By default any Packer machines are built with the hostname of "packer" which
|
412
|
+
allows you to specifically target them with your manifests. If you don't do any
|
413
|
+
targetting, the default manifests will be applied.
|
414
|
+
|
415
|
+
Templates tend to have other customisable variables, check the available
|
416
|
+
options and their defaults with `packer inspect output.json`.
|
386
417
|
|
387
418
|
|
388
419
|
# Tutorials
|
data/exe/pupistry
CHANGED
@@ -215,6 +215,44 @@ class CLI < Thor
|
|
215
215
|
end
|
216
216
|
end
|
217
217
|
|
218
|
+
desc 'packer', 'Generate a packer template for a particular provider with OS bootstrap script included'
|
219
|
+
method_option :template, type: :string, desc: 'The template you want to generate'
|
220
|
+
method_option :file, type: :string, desc: 'File to write the generated packer template into'
|
221
|
+
def packer
|
222
|
+
# Thor seems to force class options to be defined repeatedly? :-/
|
223
|
+
if options[:verbose]
|
224
|
+
$logger.level = Logger::DEBUG
|
225
|
+
else
|
226
|
+
$logger.level = Logger::INFO
|
227
|
+
end
|
228
|
+
|
229
|
+
if options[:config]
|
230
|
+
Pupistry::Config.load(options[:config])
|
231
|
+
else
|
232
|
+
Pupistry::Config.find_and_load
|
233
|
+
end
|
234
|
+
|
235
|
+
if options[:template]
|
236
|
+
$logger.info "Generating packer template #{options[:template]}"
|
237
|
+
|
238
|
+
templates = Pupistry::Packer.new
|
239
|
+
templates.build options[:template]
|
240
|
+
|
241
|
+
if options[:file]
|
242
|
+
templates.output_file options[:file]
|
243
|
+
else
|
244
|
+
templates.output_plain
|
245
|
+
end
|
246
|
+
else
|
247
|
+
templates = Pupistry::Packer.new
|
248
|
+
templates.list
|
249
|
+
|
250
|
+
puts '--'
|
251
|
+
puts 'Tip: Run `pupistry packer --template example` to generate a specific template'
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
|
218
256
|
## Other Commands
|
219
257
|
|
220
258
|
desc 'setup', 'Write a template configuration file'
|
data/lib/pupistry/bootstrap.rb
CHANGED
@@ -82,6 +82,12 @@ module Pupistry
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
def output_array
|
86
|
+
# Return the output as an array of lines. Useful by other internal
|
87
|
+
# methods such as Packer templates.
|
88
|
+
@contents.split(/\n/)
|
89
|
+
end
|
90
|
+
|
85
91
|
def output_plain
|
86
92
|
# Do nothing clever, just output the template data.
|
87
93
|
puts '-- Bootstrap Start --'
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# rubocop:disable Style/Documentation, Style/GlobalVars
|
2
|
+
require 'rubygems'
|
3
|
+
require 'erubis'
|
4
|
+
|
5
|
+
module Pupistry
|
6
|
+
# Pupistry::Packer
|
7
|
+
|
8
|
+
class Packer
|
9
|
+
attr_accessor :template_dir
|
10
|
+
attr_accessor :contents
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
# We need to find where the templates are located - either it should be
|
14
|
+
# in the current working directory, or if we are an installed gem, we
|
15
|
+
# can try the gem's installed path.
|
16
|
+
|
17
|
+
if Dir.exist?('resources/packer/')
|
18
|
+
# Use local PWD version first if possible
|
19
|
+
@template_dir = Dir.pwd
|
20
|
+
else
|
21
|
+
# Check for GEM installed location
|
22
|
+
begin
|
23
|
+
@template_dir = Gem::Specification.find_by_name('pupistry').gem_dir
|
24
|
+
rescue Gem::LoadError
|
25
|
+
$logger.error "Unable to find packer templates directory, doesn't appear we are running from project dir nor as a Gem"
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
@template_dir = @template_dir.chomp('/') + '/resources/packer/'
|
31
|
+
|
32
|
+
if Dir.exist?(@template_dir)
|
33
|
+
$logger.debug "Using directory #{@template_dir} for packer templates"
|
34
|
+
else
|
35
|
+
$logger.error "Unable to find packer templates dir at #{@template_dir}, unable to proceed."
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def list
|
41
|
+
# Simply glob the templates directory and list their names.
|
42
|
+
$logger.debug 'Finding all available templates'
|
43
|
+
|
44
|
+
Dir.glob("#{@template_dir}/*.erb").each do |file|
|
45
|
+
puts "- #{File.basename(file, '.json.erb')}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def build(template)
|
50
|
+
# Build a template with the configured parameters already to go and save
|
51
|
+
# into the object, so it can be outputted in the desired format.
|
52
|
+
|
53
|
+
$logger.debug "Generating a packer template using #{template}"
|
54
|
+
|
55
|
+
unless File.exist?("#{@template_dir}/#{template}.json.erb")
|
56
|
+
$logger.error 'The requested template does not exist, unable to build'
|
57
|
+
return 0
|
58
|
+
end
|
59
|
+
|
60
|
+
# Extract the OS bootstrap name from the template filename, we can then
|
61
|
+
# generate the bootstrap commands to be inserted inline into the packer
|
62
|
+
# configuration.
|
63
|
+
|
64
|
+
matches = template.match(/^\S*_(\S*)$/)
|
65
|
+
|
66
|
+
if matches[1]
|
67
|
+
$logger.debug "Fetching bootstrap data for #{matches[1]}..."
|
68
|
+
else
|
69
|
+
$logger.error 'Unable to parse the packer filename properly'
|
70
|
+
return 0
|
71
|
+
end
|
72
|
+
|
73
|
+
bootstrap = Pupistry::Bootstrap.new
|
74
|
+
unless bootstrap.build matches[1]
|
75
|
+
$logger.error 'An unexpected error occured when building the bootstrap data to go inside Packer'
|
76
|
+
end
|
77
|
+
|
78
|
+
# Pass the values we care about to the template
|
79
|
+
template_values = {
|
80
|
+
bootstrap_commands: bootstrap.output_array
|
81
|
+
}
|
82
|
+
|
83
|
+
# Generate template using ERB
|
84
|
+
begin
|
85
|
+
@contents = Erubis::Eruby.new(File.read("#{@template_dir}/#{template}.json.erb")).result(template_values)
|
86
|
+
rescue StandardError => e
|
87
|
+
$logger.error 'An unexpected error occured when trying to generate the packer template'
|
88
|
+
raise e
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def output_plain
|
93
|
+
# Do nothing clever, just output the template data.
|
94
|
+
puts '-- Packer Start --'
|
95
|
+
puts @contents
|
96
|
+
puts '-- Packer End --'
|
97
|
+
puts 'Tip: add --file output.json to write out the packer file directly and then run with `packer build output.json`'
|
98
|
+
end
|
99
|
+
|
100
|
+
def output_file(filename)
|
101
|
+
# Write the template to the specified file
|
102
|
+
begin
|
103
|
+
File.open(filename, 'w') do |f|
|
104
|
+
f.puts @contents
|
105
|
+
end
|
106
|
+
rescue StandardError => e
|
107
|
+
$logger.error "An unexpected erorr occured when attempting to write the template to #{filename}"
|
108
|
+
raise e
|
109
|
+
else
|
110
|
+
$logger.info "Wrote template into file #{filename} successfully."
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# vim:shiftwidth=2:tabstop=2:softtabstop=2:expandtab:smartindent
|
data/lib/pupistry/version.rb
CHANGED
data/lib/pupistry.rb
CHANGED
@@ -12,6 +12,8 @@
|
|
12
12
|
# * We can't rely on Bash, since it's not available in FreeBSD by default.
|
13
13
|
#
|
14
14
|
|
15
|
+
setenv PATH /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
|
16
|
+
|
15
17
|
env ASSUME_ALWAYS_YES=YES pkg bootstrap
|
16
18
|
env ASSUME_ALWAYS_YES=YES pkg upgrade --yes
|
17
19
|
env ASSUME_ALWAYS_YES=YES pkg install --yes ruby devel/ruby-gems puppet gnupg
|
@@ -37,5 +39,5 @@ agent:
|
|
37
39
|
EOF
|
38
40
|
chmod 700 /usr/local/etc/pupistry
|
39
41
|
chmod 700 /usr/local/etc/puppetlabs/code/environments
|
40
|
-
pupistry apply --verbose
|
42
|
+
/usr/local/bin/pupistry apply --verbose
|
41
43
|
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# Packer Templates
|
2
|
+
|
3
|
+
This directory contains templates for use with Packer (https://www.packer.io/).
|
4
|
+
|
5
|
+
It can be very useful to use Packer with Pupistry, since it allows you to
|
6
|
+
create your own image with Puppet, Pupistry and updates already loaded which
|
7
|
+
is very useful when doing autoscaling and you need fast, consistent startup
|
8
|
+
times.
|
9
|
+
|
10
|
+
The packer templates provided will build an image which has Pupistry installed
|
11
|
+
and will apply any manifests that match hostname of "packer". This should give
|
12
|
+
you a good general purpose image, but if you want to autoscale a particular app
|
13
|
+
you may wish to build packer images using specific hostnames to match your
|
14
|
+
Puppet manifests
|
15
|
+
|
16
|
+
Additional packer templates for major platforms are always welcome. Please
|
17
|
+
submit a pull request for review and if acceptable, will be merged.
|
18
|
+
|
19
|
+
|
20
|
+
# Usage
|
21
|
+
|
22
|
+
Refer to the main application README.md file for usage information.
|
23
|
+
|
24
|
+
|
25
|
+
# Development Notes
|
26
|
+
|
27
|
+
The filenames of the templates must be in the format of
|
28
|
+
PLATFORM_OPERATINGSYSTEM.json.erb, this is intentional since OPERATINGSYSTEM
|
29
|
+
then matches one of the OSes in the bootstrap directory and we can
|
30
|
+
automatically populate the inline shell commands.
|
31
|
+
|
32
|
+
When debugging broken packer template runs, add -debug to the build command
|
33
|
+
to have control over stepping through the build process. This will give you
|
34
|
+
the ability to log into the instance before it gets terminated to do any
|
35
|
+
debugging on the system if needed.
|
36
|
+
|
37
|
+
|
38
|
+
# Examples
|
39
|
+
|
40
|
+
See the "aws_amazon-any.json.erb" template for an example on how the templates
|
41
|
+
should be written for AWS.
|
42
|
+
|
43
|
+
|
44
|
+
# Life Span
|
45
|
+
|
46
|
+
Any distribution that is EOL and no longer supported by either the distribution
|
47
|
+
or by Puppetlabs will be subject to removal to keep the bootstrap selection
|
48
|
+
modern and clean. Pull requests to clean up cruft are accepted.
|
49
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
{
|
2
|
+
"variables": {
|
3
|
+
"aws_access_key": "",
|
4
|
+
"aws_secret_key": "",
|
5
|
+
"aws_ami": "ami-fd9cecc7",
|
6
|
+
"aws_region": "ap-southeast-2",
|
7
|
+
"aws_ami_name": "pupistry aws_amazon-any {{isotime \"2006-01-02\"}}",
|
8
|
+
"aws_vpc_id": null,
|
9
|
+
"aws_subnet_id": null,
|
10
|
+
"hostname": "packer"
|
11
|
+
},
|
12
|
+
"builders": [{
|
13
|
+
"type": "amazon-ebs",
|
14
|
+
"access_key": "{{user `aws_access_key`}}",
|
15
|
+
"secret_key": "{{user `aws_secret_key`}}",
|
16
|
+
"region": "{{user `aws_region`}}",
|
17
|
+
"source_ami": "{{user `aws_ami`}}",
|
18
|
+
"instance_type": "t2.micro",
|
19
|
+
"ssh_username": "ec2-user",
|
20
|
+
"vpc_id": "{{user `aws_vpc_id`}}",
|
21
|
+
"subnet_id": "{{user `aws_subnet_id`}}",
|
22
|
+
"ami_name": "{{user `aws_ami_name`}}"
|
23
|
+
}],
|
24
|
+
"provisioners": [{
|
25
|
+
"type": "shell",
|
26
|
+
"inline": ["sudo hostname {{user `hostname`}}"]
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"type": "shell",
|
30
|
+
"inline_shebang": "/bin/bash -x",
|
31
|
+
"execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo '{{ .Path }}'",
|
32
|
+
"inline": <%= bootstrap_commands %>
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"type": "shell",
|
36
|
+
"inline": ["sudo rm -rf /tmp/*"]
|
37
|
+
}]
|
38
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
{
|
2
|
+
"variables": {
|
3
|
+
"aws_access_key": "",
|
4
|
+
"aws_secret_key": "",
|
5
|
+
"aws_ami": "ami-193f5123",
|
6
|
+
"aws_region": "ap-southeast-2",
|
7
|
+
"aws_ami_name": "pupistry aws_freebsd-10 {{isotime \"2006-01-02\"}}",
|
8
|
+
"aws_vpc_id": null,
|
9
|
+
"aws_subnet_id": null,
|
10
|
+
"hostname": "packer"
|
11
|
+
},
|
12
|
+
"builders": [{
|
13
|
+
"type": "amazon-ebs",
|
14
|
+
"access_key": "{{user `aws_access_key`}}",
|
15
|
+
"secret_key": "{{user `aws_secret_key`}}",
|
16
|
+
"region": "{{user `aws_region`}}",
|
17
|
+
"source_ami": "{{user `aws_ami`}}",
|
18
|
+
"instance_type": "t2.micro",
|
19
|
+
"ssh_username": "ec2-user",
|
20
|
+
"ssh_timeout": "15m",
|
21
|
+
"vpc_id": "{{user `aws_vpc_id`}}",
|
22
|
+
"subnet_id": "{{user `aws_subnet_id`}}",
|
23
|
+
"ami_name": "{{user `aws_ami_name`}}"
|
24
|
+
}],
|
25
|
+
"provisioners": [{
|
26
|
+
"type": "shell",
|
27
|
+
"inline": ["su -m root -c 'hostname {{user `hostname`}}'"]
|
28
|
+
},
|
29
|
+
{
|
30
|
+
"type": "shell",
|
31
|
+
"inline_shebang": "/bin/tcsh",
|
32
|
+
"execute_command": "chmod +x {{ .Path }}; {{ .Vars }} su -m root -c '/bin/tcsh {{ .Path }}'",
|
33
|
+
"inline": <%= bootstrap_commands %>
|
34
|
+
},
|
35
|
+
{
|
36
|
+
"type": "shell",
|
37
|
+
"inline": ["su -m root -c 'rm -rf /tmp/*'"]
|
38
|
+
}]
|
39
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
{
|
2
|
+
"variables": {
|
3
|
+
"aws_access_key": "",
|
4
|
+
"aws_secret_key": "",
|
5
|
+
"aws_ami": "ami-19c8b123",
|
6
|
+
"aws_region": "ap-southeast-2",
|
7
|
+
"aws_ami_name": "pupistry aws_ubuntu-14.04 {{isotime \"2006-01-02\"}}",
|
8
|
+
"aws_vpc_id": null,
|
9
|
+
"aws_subnet_id": null,
|
10
|
+
"hostname": "packer"
|
11
|
+
},
|
12
|
+
"builders": [{
|
13
|
+
"type": "amazon-ebs",
|
14
|
+
"access_key": "{{user `aws_access_key`}}",
|
15
|
+
"secret_key": "{{user `aws_secret_key`}}",
|
16
|
+
"region": "{{user `aws_region`}}",
|
17
|
+
"source_ami": "{{user `aws_ami`}}",
|
18
|
+
"instance_type": "t2.micro",
|
19
|
+
"ssh_username": "ubuntu",
|
20
|
+
"vpc_id": "{{user `aws_vpc_id`}}",
|
21
|
+
"subnet_id": "{{user `aws_subnet_id`}}",
|
22
|
+
"ami_name": "{{user `aws_ami_name`}}"
|
23
|
+
}],
|
24
|
+
"provisioners": [{
|
25
|
+
"type": "shell",
|
26
|
+
"inline": ["sudo hostname {{user `hostname`}}"]
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"type": "shell",
|
30
|
+
"inline_shebang": "/bin/bash -x",
|
31
|
+
"execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo '{{ .Path }}'",
|
32
|
+
"inline": <%= bootstrap_commands %>
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"type": "shell",
|
36
|
+
"inline": ["sudo rm -rf /tmp/*"]
|
37
|
+
}]
|
38
|
+
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pupistry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jethro Carr
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -177,6 +177,7 @@ files:
|
|
177
177
|
- lib/pupistry/bootstrap.rb
|
178
178
|
- lib/pupistry/config.rb
|
179
179
|
- lib/pupistry/gpg.rb
|
180
|
+
- lib/pupistry/packer.rb
|
180
181
|
- lib/pupistry/storage_aws.rb
|
181
182
|
- lib/pupistry/version.rb
|
182
183
|
- lib/pupistry.rb
|
@@ -190,8 +191,10 @@ files:
|
|
190
191
|
- resources/bootstrap/fedora-any.erb
|
191
192
|
- resources/bootstrap/freebsd-10.erb
|
192
193
|
- resources/bootstrap/ubuntu-14.04.erb
|
193
|
-
- resources/packer/
|
194
|
-
- resources/packer/
|
194
|
+
- resources/packer/aws_amazon-any.json.erb
|
195
|
+
- resources/packer/aws_freebsd-10.json.erb
|
196
|
+
- resources/packer/aws_ubuntu-14.04.json.erb
|
197
|
+
- resources/packer/PACKER_NOTES.md
|
195
198
|
- README.md
|
196
199
|
- settings.example.yaml
|
197
200
|
homepage: https://github.com/jethrocarr/pupistry
|
@@ -1,17 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"variables": {
|
3
|
-
"aws_access_key": "",
|
4
|
-
"aws_secret_key": ""
|
5
|
-
},
|
6
|
-
"builders": [{
|
7
|
-
"type": "amazon-ebs",
|
8
|
-
"access_key": "{{user `aws_access_key`}}",
|
9
|
-
"secret_key": "{{user `aws_secret_key`}}",
|
10
|
-
"region": "ap-southeast-2",
|
11
|
-
"source_ami": "ami-fd9cecc7",
|
12
|
-
"instance_type": "m3.medium",
|
13
|
-
"ssh_username": "ec2-user",
|
14
|
-
"ami_name": "pupistry default {{timestamp}}",
|
15
|
-
"user_data": "test_user_data.txt"
|
16
|
-
}]
|
17
|
-
}
|
@@ -1,33 +0,0 @@
|
|
1
|
-
-- Bootstrap Start --
|
2
|
-
IyEvYmluL2Jhc2ggLXgKIyBUaGlzIGJvb3RzdHJhcCBpcyBzcGVjaWZjaWFs
|
3
|
-
bHkgZm9yIEFtYXpvbidzIExpbnV4IEFNSXMsIGlmIHlvdSBhcmUgdXNpbmcK
|
4
|
-
IyBvdGhlciBkaXN0cmlidXRpb25zIGxpa2UgVWJ1bnR1IG9yIENlbnRPUyBv
|
5
|
-
biBBV1MsIHVzZSB0aG9zZSBib290c3RyYXAKIyB0ZW1wbGF0ZXMuCiMKIyBB
|
6
|
-
bWF6b24gTGludXggaXMgYmFzZWQgb24gUkhFTCwgYnV0IGhhcyBhIGxvdCBt
|
7
|
-
b3JlIHZhcmlhdGlvbnMgdGhhdCBvdGhlcgojIGNsb25lcyBsaWtlIENlbnRP
|
8
|
-
Uywgc3VjaCBhcyBzaGlwcGluZyB3aXRoIG11bHRpcGxlIHZlcnNpb25zIG9m
|
9
|
-
IFB1cHBldAojIGFuZCBSdWJ5IC0gd2hpY2ggaXMgdXNlZnVsLCBidXQgY2Fu
|
10
|
-
IGFsc28gbWFrZSBsaWZlLi4uLiBpbnRlcmVzdGluZy4KKApleGVjIDE+ID4o
|
11
|
-
bG9nZ2VyIC1zIC10IHVzZXItZGF0YSkgMj4mMQoKZXhwb3J0IFBBVEg9JFBB
|
12
|
-
VEg6L3Vzci9sb2NhbC9iaW4KCnl1bSB1cGRhdGUgLS1hc3N1bWV5ZXMKeXVt
|
13
|
-
IGluc3RhbGwgLS1hc3N1bWV5ZXMgcHVwcGV0MyBydWJ5LWRldmVsIHJ1Ynln
|
14
|
-
ZW1zIGdjYyB6bGliLWRldmVsIGxpYnhtbDItZGV2ZWwgcGF0Y2ggZ251cGcy
|
15
|
-
CgojIE5vdCBzdXJlIHdoeSB0aGlzIGRvZXNuJ3QgZ2V0IHB1bGxlZCBkb3du
|
16
|
-
IHByb3Blcmx5LCBtYXliZSBpdCdzIGNvcmUgYW5kCiMgQW1hem9uIGRpZG4n
|
17
|
-
dCBwYWNrYWdlIGl0IHByb3Blcmx5PyBOZWVkIGl0IGZvciBUaG9yIHdoaWNo
|
18
|
-
IGlzIHVzZWQgYnkgUHVwaXN0cnkKZ2VtIGluc3RhbGwgaW8tY29uc29sZQoK
|
19
|
-
Z2VtIGluc3RhbGwgcHVwaXN0cnkKbWtkaXIgLXAgL2V0Yy9wdXBpc3RyeQpt
|
20
|
-
a2RpciAtcCAvZXRjL3B1cHBldGxhYnMvY29kZS9lbnZpcm9ubWVudHMKY2F0
|
21
|
-
ID4gL2V0Yy9wdXBpc3RyeS9zZXR0aW5ncy55YW1sIDw8ICJFT0YiCmdlbmVy
|
22
|
-
YWw6CiAgYXBwX2NhY2hlOiB+Ly5wdXBpc3RyeS9jYWNoZQogIHMzX2J1Y2tl
|
23
|
-
dDogcHVwaXN0cnktcmVzb3VyY2VzCiAgczNfcHJlZml4OiAKICBncGdfZGlz
|
24
|
-
YWJsZTogZmFsc2UKICBncGdfc2lnbmluZ19rZXk6IEE4MEFDQTZGCmFnZW50
|
25
|
-
OgogIHB1cHBldGNvZGU6IC9ldGMvcHVwcGV0bGFicy9jb2RlL2Vudmlyb25t
|
26
|
-
ZW50cwogIGFjY2Vzc19rZXlfaWQ6IEFLSUFKMlhKQ01TNFJBUDNCVFpBCiAg
|
27
|
-
c2VjcmV0X2FjY2Vzc19rZXk6IHdoQWlFaCtZV1hzaUw4Y0NONitLSFovT1Zs
|
28
|
-
M1VCK3ZZb0FHZEd4eDkKICByZWdpb246IGFwLXNvdXRoZWFzdC0yCiAgcHJv
|
29
|
-
eHlfdXJpOiAKICBkYWVtb25fZnJlcXVlbmN5OiA2MAogIGRhZW1vbl9taW5p
|
30
|
-
bWFsOiB0cnVlCkVPRgpjaG1vZCA3MDAgL2V0Yy9wdXBpc3RyeS9zZXR0aW5n
|
31
|
-
cy55YW1sCmNobW9kIDcwMCAvZXRjL3B1cHBldGxhYnMvY29kZS9lbnZpcm9u
|
32
|
-
bWVudHMKcHVwaXN0cnkgYXBwbHkgLS12ZXJib3NlCgopCg==
|
33
|
-
-- Bootstrap End --
|