diff --git a/.gitignore b/.gitignore index af9acac9d8..5723164b18 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /.bundle /.librarian +/.projects /.snapshot /.tmp /bin diff --git a/.rspec b/.rspec new file mode 100644 index 0000000000..36222154ca --- /dev/null +++ b/.rspec @@ -0,0 +1,3 @@ +--color +--format documentation +--order random diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..a288cad8eb --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +os: +- osx +script: +- rm -rf /usr/local/Homebrew +- travis_wait 60 rvm implode --force +- ./script/boxen --no-fde --stealth --no-pull --debug --profile --login $BOXEN_GITHUB_LOGIN --token $BOXEN_GITHUB_TOKEN || test $? -eq 2 +- source /opt/boxen/env.sh +- bundle exec rspec spec +before_install: +- sudo gem install bundler -v '~> 1.13' +env: + global: + - HOMEBREW_NO_AUTO_UPDATE=1 + - HOMEBREW_VERBOSE=1 + - secure: HoCPuAgujmw+tdH7qq9bSymtpE8o4gpp1uYRyFin2TB3px2JdOPCPCb754vddmE12zhhKKSy1j0Uj/qeW6tjy9hIhlAjLAGFuT+mNTURqu4nmojCgKO2ApcRWc3yv319XR2vjUDW1qmEyKm7il4q1c/dOFmGbVYeDixjUUfWVII= diff --git a/Gemfile b/Gemfile index 81835265d1..be0b02c145 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,24 @@ source "https://rubygems.org" -gem "boxen", "~> 1.0" -gem "open4", "~> 1.3" +gem "boxen", "~> 2.9.0" +gem "hiera", "~> 1.3.3" +gem "librarian-puppet" +gem "puppet", "3.7.1" +gem "librarianp", + git: "https://github.com/voxpupuli/librarian.git", + branch: "librarianp" +gem "puppet-lint", "0.3.2" +gem "puppetlabs_spec_helper", "0.4.1" +gem "open4", "~> 1.3.4" +gem "rake", "10.3.2" +gem "rspec-puppet", "1.0.1" +gem "deep_merge", "~> 1.0" + +group :test do + gem "serverspec" +end group :development do - gem "aws-sdk" + gem "aws-sdk-core", "~> 2.0.11" gem "net-ssh" - gem "rbvmomi" end diff --git a/Gemfile.lock b/Gemfile.lock index 07c980f3d2..e1de360229 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,64 +1,124 @@ +GIT + remote: https://github.com/voxpupuli/librarian.git + revision: 4d78d88be2d7673a136e78760085fbf9664ff27d + branch: librarianp + specs: + librarianp (0.6.3) + thor (~> 0.15) + GEM remote: https://rubygems.org/ specs: - addressable (2.3.2) - ansi (1.4.3) - aws-sdk (1.8.2) - json (~> 1.4) - nokogiri (>= 1.4.4) - uuidtools (~> 2.1) - boxen (1.0.1) + CFPropertyList (2.2.8) + addressable (2.3.8) + ansi (1.5.0) + aws-sdk-core (2.0.46) + builder (~> 3.0) + jmespath (~> 1.0) + multi_json (~> 1.0) + boxen (2.9.0) ansi (~> 1.4) - hiera (~> 1.0.0) - highline (~> 1.6) + hiera (~> 1.0) + highline (~> 1.6.0) json_pure (>= 1.7.7, < 2.0) - librarian-puppet (~> 0.9) - octokit (~> 1.15) - puppet (~> 3.0) - builder (3.1.4) - facter (1.6.17) - faraday (0.8.5) - multipart-post (~> 1.1) - faraday_middleware (0.9.0) - faraday (>= 0.7.4, < 0.9) - hashie (1.2.0) - hiera (1.0.0) - highline (1.6.15) - json (1.7.7) - json_pure (1.7.7) - librarian-puppet (0.9.8) - json + librarian-puppet (~> 1.0.0) + octokit (~> 2.7, >= 2.7.1) + puppet (~> 3.7) + builder (3.2.2) + deep_merge (1.0.1) + diff-lcs (1.2.5) + facter (2.4.4) + CFPropertyList (~> 2.2.6) + faraday (0.9.2) + multipart-post (>= 1.2, < 3) + hiera (1.3.4) + json_pure + highline (1.6.21) + jmespath (1.0.2) + multi_json (~> 1.0) + json (2.1.0) + json_pure (1.8.2) + librarian (0.1.2) + highline thor (~> 0.15) - multi_json (1.6.1) - multipart-post (1.1.5) - net-ssh (2.6.5) - netrc (0.7.7) - nokogiri (1.5.6) - octokit (1.23.0) - addressable (~> 2.2) - faraday (~> 0.8) - faraday_middleware (~> 0.9) - hashie (~> 1.2) - multi_json (~> 1.3) - netrc (~> 0.7.7) - open4 (1.3.0) - puppet (3.1.0) - facter (~> 1.6) + librarian-puppet (1.0.9) + json + librarian (>= 0.1.2) + metaclass (0.0.4) + mocha (1.1.0) + metaclass (~> 0.0.1) + multi_json (1.11.0) + multipart-post (2.0.0) + net-scp (1.2.1) + net-ssh (>= 2.6.5) + net-ssh (2.9.2) + net-telnet (0.1.1) + octokit (2.7.2) + sawyer (~> 0.5.2) + open4 (1.3.4) + puppet (3.7.1) + facter (> 1.6, < 3) hiera (~> 1.0) - rbvmomi (1.6.0) - builder - nokogiri (>= 1.4.1) - trollop - thor (0.17.0) - trollop (2.0) - uuidtools (2.1.3) + json_pure + puppet-lint (0.3.2) + puppetlabs_spec_helper (0.4.1) + mocha (>= 0.10.5) + rake + rspec (>= 2.9.0) + rspec-puppet (>= 0.1.1) + rake (10.3.2) + rspec (3.2.0) + rspec-core (~> 3.2.0) + rspec-expectations (~> 3.2.0) + rspec-mocks (~> 3.2.0) + rspec-core (3.2.3) + rspec-support (~> 3.2.0) + rspec-expectations (3.2.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.2.0) + rspec-its (1.2.0) + rspec-core (>= 3.0.0) + rspec-expectations (>= 3.0.0) + rspec-mocks (3.2.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.2.0) + rspec-puppet (1.0.1) + rspec + rspec-support (3.2.2) + sawyer (0.5.5) + addressable (~> 2.3.5) + faraday (~> 0.8, < 0.10) + serverspec (2.37.2) + multi_json + rspec (~> 3.0) + rspec-its + specinfra (~> 2.53) + sfl (2.3) + specinfra (2.66.3) + net-scp + net-ssh (>= 2.7, < 4.0) + net-telnet + sfl + thor (0.20.0) PLATFORMS ruby DEPENDENCIES - aws-sdk - boxen (~> 1.0) + aws-sdk-core (~> 2.0.11) + boxen (~> 2.9.0) + deep_merge (~> 1.0) + hiera (~> 1.3.3) + librarian-puppet + librarianp! net-ssh - open4 (~> 1.3) - rbvmomi + open4 (~> 1.3.4) + puppet (= 3.7.1) + puppet-lint (= 0.3.2) + puppetlabs_spec_helper (= 0.4.1) + rake (= 10.3.2) + rspec-puppet (= 1.0.1) + serverspec + +BUNDLED WITH + 1.10.5 diff --git a/Puppetfile b/Puppetfile index 1fdc2c33d7..ec7bbd035d 100644 --- a/Puppetfile +++ b/Puppetfile @@ -4,32 +4,64 @@ # default. This ensures at least the ability to construct a basic # environment. -def github(name, version, options = nil) - options ||= {} - options[:repo] ||= "boxen/puppet-#{name}" - mod name, version, :github_tarball => options[:repo] +# Shortcut for a module from GitHub's boxen organization +def github(name, *args) + options ||= if args.last.is_a? Hash + args.last + else + {} + end + + if path = options.delete(:path) + mod name, :path => path + else + version = args.first + options[:repo] ||= "boxen/puppet-#{name}" + mod name, version, :github_tarball => options[:repo] + end +end + +# Shortcut for a module under development +def dev(name, *args) + mod "puppet-#{name}", :path => "#{ENV['HOME']}/src/boxen/puppet-#{name}" end # Includes many of our custom types and providers, as well as global # config. Required. -github "boxen", "1.2.0" +github "boxen", "3.13.0" + +# Support for default hiera data in modules + +github "module_data", "0.0.4", :repo => "ripienaar/puppet-module-data" # Core modules for a basic development environment. You can replace # some/most of these if you want, but it's not recommended. -github "dnsmasq", "1.0.0" -github "gcc", "1.0.0" -github "git", "1.0.0" -github "homebrew", "1.1.2" -github "hub", "1.0.0" -github "inifile", "0.9.0", :repo => "cprice-puppet/puppetlabs-inifile" -github "nginx", "1.1.0" -github "nodejs", "1.0.0" -github "nvm", "1.0.0" -github "ruby", "3.1.0" -github "stdlib", "3.0.0", :repo => "puppetlabs/puppetlabs-stdlib" -github "sudo", "1.0.0" +github "brewcask", "0.0.10" +github "dnsmasq", "2.0.4" +github "foreman", "1.2.0" +# mod "gcc", "0.0.1", :git => "https://github.com/boxen/puppet-gcc.git", :ref => "abc7639" +github "git", "2.13.0" +github "go", "2.1.0" +github "homebrew", "2.2.0" +github "hub", "1.4.5" +github "inifile", "1.4.1", :repo => "puppetlabs/puppetlabs-inifile" +github "nginx", "1.9.0" +github "nodejs", "5.0.9" +github "openssl", "1.0.0" +github "phantomjs", "3.0.0" +github "pkgconfig", "1.0.0" +github "repository", "2.4.1" +github "ruby", "8.6.0" +github "stdlib", "4.7.0", :repo => "puppetlabs/puppetlabs-stdlib" +github "sudo", "1.0.0" +github "xquartz", "1.2.1" # Optional/custom modules. There are tons available at # https://github.com/boxen. +# github "elasticsearch", "2.8.0" +# github "mysql", "2.0.1" +# github "postgresql", "4.0.1" +# github "redis", "3.1.0" +# github "sysctl", "1.0.1" diff --git a/Puppetfile.lock b/Puppetfile.lock index b8c3409bf7..7e288dbc28 100644 --- a/Puppetfile.lock +++ b/Puppetfile.lock @@ -1,52 +1,77 @@ GITHUBTARBALL remote: boxen/puppet-boxen specs: - boxen (1.2.0) + boxen (3.13.0) + +GITHUBTARBALL + remote: boxen/puppet-brewcask + specs: + brewcask (0.0.10) GITHUBTARBALL remote: boxen/puppet-dnsmasq specs: - dnsmasq (1.0.0) + dnsmasq (2.0.4) GITHUBTARBALL - remote: boxen/puppet-gcc + remote: boxen/puppet-foreman specs: - gcc (1.0.0) + foreman (1.2.0) GITHUBTARBALL remote: boxen/puppet-git specs: - git (1.0.0) + git (2.13.0) + +GITHUBTARBALL + remote: boxen/puppet-go + specs: + go (2.1.0) GITHUBTARBALL remote: boxen/puppet-homebrew specs: - homebrew (1.1.2) + homebrew (2.2.0) GITHUBTARBALL remote: boxen/puppet-hub specs: - hub (1.0.0) + hub (1.4.5) GITHUBTARBALL remote: boxen/puppet-nginx specs: - nginx (1.1.0) + nginx (1.9.0) GITHUBTARBALL remote: boxen/puppet-nodejs specs: - nodejs (1.0.0) + nodejs (5.0.9) GITHUBTARBALL - remote: boxen/puppet-nvm + remote: boxen/puppet-openssl specs: - nvm (1.0.0) + openssl (1.0.0) + +GITHUBTARBALL + remote: boxen/puppet-phantomjs + specs: + phantomjs (3.0.0) + +GITHUBTARBALL + remote: boxen/puppet-pkgconfig + specs: + pkgconfig (1.0.0) + +GITHUBTARBALL + remote: boxen/puppet-repository + specs: + repository (2.4.1) GITHUBTARBALL remote: boxen/puppet-ruby specs: - ruby (3.1.0) + ruby (8.6.0) GITHUBTARBALL remote: boxen/puppet-sudo @@ -54,27 +79,44 @@ GITHUBTARBALL sudo (1.0.0) GITHUBTARBALL - remote: cprice-puppet/puppetlabs-inifile + remote: boxen/puppet-xquartz + specs: + xquartz (1.2.1) + +GITHUBTARBALL + remote: puppetlabs/puppetlabs-inifile specs: - inifile (0.9.0) + inifile (1.4.1) GITHUBTARBALL remote: puppetlabs/puppetlabs-stdlib specs: - stdlib (3.0.0) + stdlib (4.7.0) + +GITHUBTARBALL + remote: ripienaar/puppet-module-data + specs: + module_data (0.0.4) DEPENDENCIES - boxen (= 1.2.0) - dnsmasq (= 1.0.0) - gcc (= 1.0.0) - git (= 1.0.0) - homebrew (= 1.1.2) - hub (= 1.0.0) - inifile (= 0.9.0) - nginx (= 1.1.0) - nodejs (= 1.0.0) - nvm (= 1.0.0) - ruby (= 3.1.0) - stdlib (= 3.0.0) + boxen (= 3.13.0) + brewcask (= 0.0.10) + dnsmasq (= 2.0.4) + foreman (= 1.2.0) + git (= 2.13.0) + go (= 2.1.0) + homebrew (= 2.2.0) + hub (= 1.4.5) + inifile (= 1.4.1) + module_data (= 0.0.4) + nginx (= 1.9.0) + nodejs (= 5.0.9) + openssl (= 1.0.0) + phantomjs (= 3.0.0) + pkgconfig (= 1.0.0) + repository (= 2.4.1) + ruby (= 8.6.0) + stdlib (= 4.7.0) sudo (= 1.0.0) + xquartz (= 1.2.1) diff --git a/README.md b/README.md index b2b6ffdde5..2c2786c15f 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,20 @@ and detect most of these and tell you anyway): ### Dependencies -**Install the Xcode Command Lines Tools and/or full Xcode.** +**Install the Xcode Command Line Tools and/or full Xcode.** This will grant you the most predictable behavior in building apps like MacVim. How do you do it? +#### OS X 10.9 (Mavericks) + +If you are using [`b26abd0` of boxen-web](https://github.com/boxen/boxen-web/commit/b26abd0d681129eba0b5f46ed43110d873d8fdc2) +or newer, it will be automatically installed as part of Boxen. +Otherwise, follow instructions below. + +#### OS X < 10.9 + 1. Install Xcode from the Mac App Store. 1. Open Xcode. 1. Open the Preferences window (`Cmd-,`). @@ -45,19 +53,19 @@ How do you do it? ### Bootstrapping -Create a **new** git repository somewhere. +Create a **new** git repository somewhere on the internet. It can be private or public -- it really doesn't matter. If you're making a repository on GitHub, you _may not_ want to fork this repo to get started. The reason for that is that you can't really make private forks of public repositories easily. -Once you've done that, you can run the following to get bootstrap +Once you've done that, you can run the following to bootstrap your boxen: ``` sudo mkdir -p /opt/boxen -sudo chown ${USER}:admin /opt/boxen +sudo chown ${USER}:staff /opt/boxen git clone https://github.com/boxen/our-boxen /opt/boxen/repo cd /opt/boxen/repo git remote rm origin @@ -65,6 +73,14 @@ git remote add origin git push -u origin master ``` +Now that your boxen is bootstrapped, you can run the following to +install the default configuration from this repo: + +``` +cd /opt/boxen/repo +./script/boxen +``` + ### Distributing That's enough to get your boxen into a usable state on other machines, @@ -77,10 +93,17 @@ If you _don't_ want to use boxen-web, folks can get using your boxen like so: ``` sudo mkdir -p /opt/boxen -sudo chown ${USER}:admin /opt/boxen +sudo chown ${USER}:staff /opt/boxen git clone /opt/boxen/repo cd /opt/boxen/repo -script/boxen +./script/boxen +``` + +Keep in mind this requires you to encrypt your hard drive by default. +If you do not want to do encrypt your hard drive, you can use the `--no-fde`. + +``` +./script/boxen --no-fde ``` It should run successfully, and should tell you to source a shell script @@ -103,21 +126,22 @@ If that runs cleanly, you're in good shape. This template project provides the following by default: * Homebrew +* Homebrew-Cask * Git * Hub -* DNSMasq w/ .dev resolver for localhost -* NVM -* RBenv +* dnsmasq w/ .dev resolver for localhost +* rbenv * Full Disk Encryption requirement -* NodeJS 0.4 -* NodeJS 0.6 -* NodeJS 0.8 -* Ruby 1.8.7 -* Ruby 1.9.2 +* Node.js 0.8 +* Node.js 0.10 +* Node.js 0.12 * Ruby 1.9.3 -* Ack +* Ruby 2.0.0 +* Ruby 2.1.8 +* Ruby 2.2.4 +* ack * Findutils -* GNU-Tar +* GNU tar ## Customizing @@ -135,27 +159,27 @@ boxen repo (ex. /path/to/your-boxen/Puppetfile): # Core modules for a basic development environment. You can replace # some/most of these if you want, but it's not recommended. - github "dnsmasq", "1.0.0" - github "gcc", "1.0.0" - github "git", "1.0.0" - github "homebrew", "1.0.0" - github "hub", "1.0.0" - github "inifile", "0.9.0", :repo => "cprice-puppet/puppetlabs-inifile" - github "nginx", "1.0.0" - github "nodejs", "1.0.0" - github "nvm", "1.0.0" - github "ruby", "1.0.0" - github "stdlib", "3.0.0", :repo => "puppetlabs/puppetlabs-stdlib" - github "sudo", "1.0.0" + github "repository", "2.0.2" + github "dnsmasq", "1.0.0" + github "gcc", "1.0.0" + github "git", "1.2.2" + github "homebrew", "1.1.2" + github "hub", "1.0.0" + github "inifile", "0.9.0", :repo => "cprice404/puppetlabs-inifile" + github "nginx", "1.4.0" + github "nodejs", "2.2.0" + github "ruby", "4.1.0" + github "stdlib", "4.0.2", :repo => "puppetlabs/puppetlabs-stdlib" + github "sudo", "1.0.0" # Optional/custom modules. There are tons available at # https://github.com/boxen. - github "java", "1.0.5" + github "java", "1.6.0" In the above snippet of a customized Puppetfile, the bottom line -includes the Java module from Github using the tag "1.0.5" from the github repository -"boxen/puppet-java". The function "github" is defined at the top of the Puppetfile +includes the Java module from Github using the tag "1.6.0" from the github repository +"[boxen/puppet-java/releases](https://github.com/boxen/puppet-java/releases)". The function "github" is defined at the top of the Puppetfile and takes the name of the module, the version, and optional repo location: def github(name, version, options = nil) @@ -167,9 +191,35 @@ and takes the name of the module, the version, and optional repo location: Now Puppet knows where to download the module from when you include it in your site.pp or mypersonal.pp file: # include the java module referenced in my Puppetfile with the line - # github "java", "1.0.5" + # github "java", "1.6.0" include java +### Hiera + +Hiera is preferred mechanism to make changes to module defaults (e.g. default +global ruby version, service ports, etc). This repository supplies a +starting point for your Hiera configuration at `config/hiera.yml`, and an +example data file at `hiera/common.yaml`. See those files for more details. + +The default `config/hiera.yml` is configured with a hierarchy that allows +individuals to have their own hiera data file in +`hiera/users/{github_login}.yaml` which augments and overrides +site-wide values in `hiera/common.yaml`. This default is, as with most of the +configuration in the example repo, a great starting point for many +organisations, but is totally up to you. You might want to, for +example, have a set of values that can't be overridden by adding a file to +the top of the hierarchy, or to have values set on specific OS +versions: + +```yaml +# ... +:hierarchy: + - "global-overrides.yaml" + - "users/%{::github_login}" + - "osx-%{::macosx_productversion_major}" + - common +``` + ### Node definitions Puppet has the concept of a @@ -211,7 +261,7 @@ everyone by default. An example of this might look like so: include projects::super-top-secret-project } - ``` +``` If you'd like to read more about how Puppet works, we recommend checking out [the official documentation](http://docs.puppetlabs.com/) @@ -238,7 +288,7 @@ will be working in). ## Binary packages -We support binary packaging for everything in Homebrew, RBEnv, and NVM. +We support binary packaging for everything in Homebrew, rbenv, and nvm. See `config/boxen.rb` for the environment variables to define. ## Sharing Boxen Modules @@ -252,6 +302,16 @@ fork. You'll still be the maintainer, you'll still own the issues and PRs. It'll just be listed under the boxen org so folks can find it more easily. +## upgrading boxen +See [FAQ-Upgrading](https://github.com/boxen/our-boxen/blob/master/docs/faq.md#q-how-do-you-upgrade-your-boxen-from-the-public-our-boxen). + +## Integrating with Github Enterprise + +If you're using a Github Enterprise instance rather than github.com, +you will need to set the `BOXEN_GITHUB_ENTERPRISE_URL` and +`BOXEN_REPO_URL_TEMPLATE` variables in your +[Boxen config](config/boxen.rb). + ## Halp! See [FAQ](https://github.com/boxen/our-boxen/blob/master/docs/faq.md). diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..11ba8674a4 --- /dev/null +++ b/Rakefile @@ -0,0 +1,27 @@ +require 'rake' +require 'rspec/core/rake_task' + +task :spec => 'spec:all' +task :default => :spec + +namespace :spec do + targets = [] + Dir.glob('./spec/*').each do |dir| + next unless File.directory?(dir) + target = File.basename(dir) + target = "_#{target}" if target == "default" + targets << target + end + + task :all => targets + task :default => :all + + targets.each do |target| + original_target = target == "_default" ? target[1..-1] : target + desc "Run serverspec tests to #{original_target}" + RSpec::Core::RakeTask.new(target.to_sym) do |t| + ENV['TARGET_HOST'] = original_target + t.pattern = "spec/#{original_target}/*_spec.rb" + end + end +end diff --git a/config/boxen.rb b/config/boxen.rb index 2ea5e8be33..7c33af678e 100644 --- a/config/boxen.rb +++ b/config/boxen.rb @@ -17,3 +17,9 @@ # Submit audit data to an arbitrary HTTP endpoint # ENV["BOXEN_WEB_HOOK_URL"] = 'https://some-uri.com/boxen' +# +# required for Github Enterprise +# ENV["BOXEN_GITHUB_ENTERPRISE_URL"] = 'https://github.yourdomain.com' + +# required for Github Enterprise (defaults to "https://github.com/%s") +# ENV['BOXEN_REPO_URL_TEMPLATE'] = 'https://github.yourdomain.com/%s' diff --git a/config/hiera.yaml b/config/hiera.yaml new file mode 100644 index 0000000000..2cac61bf09 --- /dev/null +++ b/config/hiera.yaml @@ -0,0 +1,24 @@ +--- +# This file configures the hiera "database" for Boxen. As with most files in +# this repo, it's just an example, and you should feel free to make any +# changes suited to your organisation. + +# The defaults here should give you a solid start; put global defaults in +# a file named hiera/common.yaml, and individuals can supplement and/or override +# them in hiera/{github_login}.yaml + +:backends: + - yaml +:yaml: + :datadir: "%{::boxen_home}/repo/hiera" +:hierarchy: + - "users/%{github_login}" + - common + +# Many modules make their own hiera data available through the use of +# puppet-module-data. Some depend on the 'deeper' merge_behavior setting, so +# remove it at your own risk! +# ... +# besides the modules that use it, you might want to override deeply nested hash +# values, too! +:merge_behavior: deeper \ No newline at end of file diff --git a/docs/faq.md b/docs/faq.md index 685103c4bf..a03af4dd9c 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -2,6 +2,17 @@ Below you can find common questions and answers. +### Q: Boxen Keychain Helper: Encountered error code: -25308 + +If you run `boxen` in a session without GUI (e.g. via SSH), you will most likely need to unlock the keychain manually. + +```bash +security create-keychain -p $your_password $keychain_name +security default-keychain -d user -s $keychain_name +# if necessary.. +security unlock-keychain -p $your_password # unlocks the default keychain, which boxen will use to store the token +``` + ### Q: How do you uninstall an application and get it to reinstall in the application folder with boxen? When removing applications make sure to remove the corresponding `/var/db/.puppet_appdmg_installed_application` so that boxen will reinstall it. @@ -9,3 +20,60 @@ When removing applications make sure to remove the corresponding `/var/db/.puppe ### Q: How do you remove Boxen? Run `script/nuke` from inside the `/opt/boxen/repo` directory. + +### Q: How do you upgrade your boxen from the public our-boxen? + +Answer distilled from http://grahamgilbert.com/blog/2014/04/04/updating-boxen/ +As Boxen is made by GitHub, updating it is much like updating any other project on there that you’ve made a fork of. First we’re going to add it as a remote repository: + +```bash +cd ~/src/our-boxen +git remote add upstream https://github.com/boxen/our-boxen.git +``` +Then we're going to fetch the stuff from the upstream repository: + +```bash +git fetch upstream +``` + +Now we're going to merge the updated repository with our own: + +```bash +git checkout master +git merge upstream/master +``` + +Now deal with conflicts in (Puppetfile, manifests/site.pp), ignore any diffs in Puppetfile.lock and Gemfile.lock. + +```bash +git mergetool +``` + +The next step is to update your Puppet modules and RubyGems. First delete Puppetfile.lock and Gemfile.lock. Now go back to your trusty Terminal and: + +```bash +rm Puppetfile.lock Gemfile.lock +bundle install --no-deployment --without development --path .bundle +bundle exec librarian-puppet install --path=shared --clean +``` + +### Q: What's a good approach to merging our-boxen back into my private fork? + +One approach is to delete the Gemfile.lock and Puppetfile.lock and run: + + # Regenerates Gemfile.lock and installs new Gems + bundle install --without development --path .bundle + + # Regenerates Puppetfile.lock and caches tarballs + bundle exec librarian-puppet install --path=shared --clean + +These will generate the respective lock files suitable for committing. Hope that helps. + +### Q: Should you keep the cache of the module and gem in the repository? + +We recommend you to keep the files inside `vendor/cache` and `vendor/puppet/cache` inside +the repository. + +It ends up adding a negligible amount of disk space in return for much faster runtimes +for other folks on your team (since they don't have to fetch the tarballs one-by-one +through the GitHub API any time a module version changes). diff --git a/docs/modules.md b/docs/modules.md index 9c59c212ef..be59476961 100644 --- a/docs/modules.md +++ b/docs/modules.md @@ -100,7 +100,7 @@ by other shell scripts. ## Facts and variables -The core boxen module provides [a number of variables to use](https://github.com/boxen/puppet-boxen/blob/master/manifests/config.pp#L2-L14). +The core boxen module provides [a number of variables to use](https://github.com/boxen/puppet-boxen/blob/master/manifests/config.pp#L8-L21). In addition to these, you may always assume the presence of a `boxen_user` fact, which is the local user running Boxen. diff --git a/docs/puppet.md b/docs/puppet.md index b8f2e314bc..bd0e08dcb0 100644 --- a/docs/puppet.md +++ b/docs/puppet.md @@ -1,4 +1,4 @@ -# wtf is a puppet? +# What is a puppet? Puppet is configuration management tool, written in Ruby, that compiles and runs code written in the Puppet language. diff --git a/docs/rails.md b/docs/rails.md index e834a2132c..096ef0b4ad 100644 --- a/docs/rails.md +++ b/docs/rails.md @@ -52,8 +52,6 @@ your app best to work with Boxen. # config/database.yml <% - def boxen?; ENV['BOXEN_HOME']; end - socket = [ ENV["BOXEN_MYSQL_SOCKET"], "/var/run/mysql5/mysqld.sock", @@ -115,7 +113,7 @@ test: ``` ruby # config/initializers/redis.rb -$redis = Redis.new(ENV['BOXEN_REDIS_URL'] || 'redis://localhost:6379/') +$redis = Redis.new(url: (ENV['BOXEN_REDIS_URL'] || 'redis://localhost:6379/')) ``` ### Elasticsearch diff --git a/docs/updates.md b/docs/updates.md new file mode 100644 index 0000000000..e3041486d6 --- /dev/null +++ b/docs/updates.md @@ -0,0 +1,56 @@ +# Updates + +When Boxen runs, it checks to see if your system matches a large set of +statements (Puppet "resources"). If it doesn't, it knows how to make changes +to your system to "converge" on that desired state. Those resources are all +defined in Puppet `*.pp` manifest files in a git repository, github/boxen. +We use a simple `git` workflow to keep those definitions up-to-date whenever +you go to run Boxen. + +## Where is this repository + +`/opt/boxen/repo`, which is also symlinked at `$HOME/src/our-boxen` for +convenience. + +## What does "up to date" mean? + +Unless you're actively working on Boxen, "up to date" means that your local +working copy is on `master`, and up to date with (same revision as) +`origin/master`. + +## How do we keep up to date? + +At the earliest possible moment in a Boxen run, some checks are made to ensure +that updating your working copy is going to be safe: + +* Are you on a non-master branch (or no branch at all)? (see `git symbolic-ref HEAD`) +* Do you have any uncommitted changes? (see `git status --porcelain`) +* Do you have any unpushed commits on master? (see `git log origin/master..master`) + +If your working copy is a "yes" to any of those checks, we won't touch a thing. +Boxen will tell you why it's not going to auto-update, then offer to run Puppet +with your working copy as-is. + +If, on the other hand, we are going to auto-update: + +```sh +# Get the most recent commits from upstream +git fetch origin +# Reset your working copy to look just like upstream's master +git reset --hard origin/master +git clean -qdf +``` + +## Workflow tip + +If you're working on something in Boxen (e.g. your personal manifest, +or adding a new project definition), move over to a branch. Working on +a branch signals to Boxen that you're actively making changes, and that +it shouldn't do things like try to auto-update, or to submit issues on +failed runs. + +Once you're happy with your changes, the usual workflow of submitting a +pull request, waiting for some review then a merge applies. Until then, +you have the option of either leaving your working copy on the branch, +or moving back to master and getting other updates. This should be a good +incentive to get your branch merged quickly :) diff --git a/facts.d/example.yaml b/facts.d/example.yaml new file mode 100644 index 0000000000..ed866f5da2 --- /dev/null +++ b/facts.d/example.yaml @@ -0,0 +1,7 @@ +--- +# Any yaml or json files in this directory may be used to set +# facts. This is useful, primarily, for things like homebrew_root, +# which must be a fact rather than configured with hiera because +# of how Puppet's custom resource providers work. + +# homebrew_root: /usr/local diff --git a/hiera/common.yaml.example b/hiera/common.yaml.example new file mode 100644 index 0000000000..d4dde6fe77 --- /dev/null +++ b/hiera/common.yaml.example @@ -0,0 +1,21 @@ +--- +# This is an example of the kinds of things that you can configure via hiera. +# If you've left the defaults in `/hiera.yml`, you might want to copy this file +# to `hiera/common.yaml`, or feel free to start with a blank slate! + +# Have a gander at some of these examples to get an idea of some of the things +# that you can affect 'out of the box', and then customise to your +# heart's content. + +# See https://github.com/boxen/puppet-ruby for docs +ruby::global::version: "2.2.3" +ruby::build::ensure: "v20151024" +ruby::rbenv_plugins: + rbenv-vars: + ensure: v1.0.0 + source: sstephenson/rbenv-vars +ruby::version::alias: + 2.0.0: 2.0.0-p647 + +# See https://github.com/boxen/puppet-java for docs +java::update_version: 51 diff --git a/hiera/users/README.md b/hiera/users/README.md new file mode 100644 index 0000000000..96e772a700 --- /dev/null +++ b/hiera/users/README.md @@ -0,0 +1,26 @@ +# Per-user hiera configuration + +The example `hiera.yaml` includes an entry in the hierarchy for +per-user configurations, allowing individuals to override many, many +common puppet parameters for their own machines. + +Simply place a file in this directory named after your github +login. For example, if your github login is `johndoe`, you would edit +the file `johndoe.yaml` here. + +## Example + +```yaml +boxen::personal::homebrew_packages: + - pstree + - htop + +boxen::personal::osx_apps: + - google-chrome + - spotify + - things + +boxen::personal::projects: + - project_a + - secret_project +``` diff --git a/manifests/site.pp b/manifests/site.pp index 32475b644d..49ec972703 100644 --- a/manifests/site.pp +++ b/manifests/site.pp @@ -1,17 +1,17 @@ require boxen::environment require homebrew -require gcc +/* require gcc */ Exec { group => 'staff', logoutput => on_failure, - user => $luser, + user => $boxen_user, path => [ "${boxen::config::home}/rbenv/shims", "${boxen::config::home}/rbenv/bin", "${boxen::config::home}/rbenv/plugins/ruby-build/bin", - "${boxen::config::home}/homebrew/bin", + "${boxen::config::homebrewdir}/bin", '/usr/bin', '/bin', '/usr/sbin', @@ -20,13 +20,13 @@ environment => [ "HOMEBREW_CACHE=${homebrew::config::cachedir}", - "HOME=/Users/${::luser}" + "HOME=/Users/${::boxen_user}" ] } File { group => 'staff', - owner => $luser + owner => $boxen_user } Package { @@ -39,7 +39,10 @@ extra => [ '--recurse-submodules' ], - require => Class['git'] + require => File["${boxen::config::bindir}/boxen-git-credential"], + config => { + 'credential.helper' => "${boxen::config::bindir}/boxen-git-credential" + } } Service { @@ -54,7 +57,6 @@ include git include hub include nginx - include nvm # fail if FDE is not enabled if $::root_encrypted == 'no' { @@ -62,15 +64,12 @@ } # node versions - include nodejs::0-4 - include nodejs::0-6 - include nodejs::0-8 + nodejs::version { '0.8': } + nodejs::version { '0.10': } + nodejs::version { '0.12': } # default ruby versions - include ruby::1_8_7 - include ruby::1_9_2 - include ruby::1_9_3 - include ruby::2_0_0 + ruby::version { '2.4.1': } # common, useful packages package { diff --git a/modules/people/README.md b/modules/people/README.md index d3e2e76260..16f06be68f 100644 --- a/modules/people/README.md +++ b/modules/people/README.md @@ -8,9 +8,13 @@ class people::jbarnette { include emacs # requires emacs module in Puppetfile include sparrow # requires sparrow module in Puppetfile - $home = "/Users/${::luser}" + $home = "/Users/${::boxen_user}" $my = "${home}/my" $dotfiles = "${my}/dotfiles" + + file { $my: + ensure => directory + } repository { $dotfiles: source => 'jbarnette/dotfiles', @@ -19,6 +23,8 @@ class people::jbarnette { } ``` +Note that if your GitHub username contains dashes, you should replace them by underscores in both the manifest name and the class name. + ## Projects While you _can_ include projects one by one, sometimes you might just want diff --git a/modules/projects/README.md b/modules/projects/README.md index f6a5f38b55..61536d1fdc 100644 --- a/modules/projects/README.md +++ b/modules/projects/README.md @@ -24,6 +24,10 @@ With the above, as long as our app is configured to listen on a **socket** at `"#{ENV['BOXEN_SOCKET_DIR']}"/trollin`, you'll now be able to run its local server and visit http://trollin.dev/ to access the app in dev. +Provide the full repository URL in the 'source' option when referencing +code that is not hosted at github.com, such as Github Enterprise +repositories. + For further documentation on how to use the `boxen::project` type, take a look at the documentation in the -[source](https://github.com/boxen/puppet-boxen/blob/master/manifests/project.pp#L1-L46). +[source](https://github.com/boxen/puppet-boxen/blob/master/manifests/project.pp#L1-L61). diff --git a/modules/projects/templates/shared/nginx.conf.erb b/modules/projects/templates/shared/nginx.conf.erb index 9acd8f4c6f..7add4c19bc 100644 --- a/modules/projects/templates/shared/nginx.conf.erb +++ b/modules/projects/templates/shared/nginx.conf.erb @@ -1,38 +1,25 @@ -upstream <%= server_name %> { - server unix:<%= scope.lookupvar "boxen::config::socketdir" %>/<%= name %>; +upstream <%= @server_name %> { + server unix:<%= scope.lookupvar "boxen::config::socketdir" %>/<%= @name %>; } server { - access_log <%= scope.lookupvar "nginx::config::logdir" %>/<%= name %>.access.log main; + access_log <%= scope.lookupvar "nginx::config::logdir" %>/<%= @name %>.access.log main; listen 80; - root <%= scope.lookupvar "boxen::config::srcdir" %>/<%= name %>/public; - server_name <%= server_name %>; + root <%= @repo_dir %>/public; + server_name <%= @server_name %> *.<%= @server_name %>; client_max_body_size 50M; - error_page 500 502 503 504 /50x.html; - if ($host ~* "www") { - rewrite ^(.*)$ http://<%= server_name %>$1 permanent; - break; - } - location = /50x.html { root html; } - location / { - if (-f $request_filename/index.html) { - rewrite (.*) $1/index.html break; - } - - if (-f $request_filename.html) { - rewrite (.*) $1.html break; - } - - if (!-f $request_filename) { - proxy_pass http://<%= server_name %>; - break; - } + try_files $uri/index.html $uri @<%= @server_name %>; + location @<%= @server_name %> { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_redirect off; + proxy_pass http://<%= @server_name %>; } } diff --git a/script/bootstrap b/script/bootstrap index 29c729b05b..dc551ffe90 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -3,19 +3,94 @@ set -e +VERBOSE=1 +for arg in "$@"; do + if [ "$arg" = "--quiet" ]; then + VERBOSE=0 + elif [ "$arg" = "--without" ]; then + WITHOUT=1 + fi +done + +log() { + if [ "$VERBOSE" = "1" ]; then + echo "$@" + fi +} + +#Add fake group to fix GID/domain issues (https://github.com/boxen/our-boxen/issues/235) +GID=`id -g` +USERNAME=`id -u -nr` +if !(grep $GID /etc/group >/dev/null) +then + echo "Looks like you have some issues with your domain and GID" + echo "More details here: https://github.com/boxen/our-boxen/issues/235" + read -p "Do you want to add a new GID to the group to get this to work? (y/n) " -n 1 + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + log "Adding GID ($GID) for $USERNAME into /etc/group" + sudo sh -c "echo $USERNAME:*:$GID:$USERNAME >> /etc/group" + log "$GID added to /etc/group!" + fi +fi + +# Put xcrun shim on PATH if on Mountain Lion +set +e +OSX_VERSION_CHECK=`sw_vers | grep ProductVersion | cut -f 2 -d ':' | egrep '10\.8'` +if [ $? -eq 0 ]; then + export PATH=$(pwd)/vendor/shims:$PATH +fi +set -e + +# Set ARCHFLAGS for XCode 5.1 so that installing some gems with +# native extensions won't fail, e.g. json +# See https://developer.apple.com/library/ios/releasenotes/developertools/rn-xcode/Introduction/Introduction.html +set +e +PATH=${PATH}:/usr/sbin +CLTOOLS_VERSION_CHECK=`pkgutil --pkg-info=com.apple.pkg.CLTools_Executables | awk '/^version:/ {print $2}' | egrep -q '^5\.1' 2>/dev/null` +if [ $? -eq 0 ]; then + export ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future +fi +set -e + # FIX: only sudo if gem home isn't writable +(/usr/bin/gem spec bundler -v '~> 1.10.5' >/dev/null 2>&1) || { + log "====> Installing bundler to system ruby" + /usr/bin/sudo -p "Password for sudo to install bundler: " \ + /usr/bin/gem install bundler -v '~> 1.10.5' --no-rdoc --no-ri +} +PATH="/Library/Ruby/bin:$(gem which bundler | sed -e 's!lib/bundler.rb!bin!'):$PATH" +# Use checksums to quickly determine if we need to re-bundle +PATH=${PATH}:/sbin +checksum_bundle() { + (((find Gemfile Gemfile.lock bin -type f) | xargs cat) && /usr/bin/ruby -v && bundle -v) | md5 +} -(/usr/bin/gem spec bundler -v '~> 1.2.0' > /dev/null 2>&1) || { - /usr/bin/sudo -p "Need to install Bundler for system ruby, password for sudo: " \ - /usr/bin/gem install bundler -v '~> 1.2.0' --no-rdoc --no-ri +write_checksum() { + mkdir -p tmp + checksum_bundle > tmp/bundle_checksum.txt } -# We don't want old config hanging around. +mkdir -p bin + +if [ "$1" = "--pristine" ]; then + log "====> Cleaning installed gems" + git clean -xdf bin/ vendor/gems/* tmp/bundle_checksum.txt + shift +fi -rm -rf .bundle/config -rm -rf .librarian/puppet/config +if [ -z "$WITHOUT" ] && [ "$(checksum_bundle)" = "$(cat tmp/bundle_checksum.txt 2>/dev/null)" ]; then + log "====> Bundle already up-to-date!" +else + # handle this not being a git repo (e.g. a brand new install!) + if [ -d .git ]; then + # always regenerate config and binstubs + git clean -xdfq -- bin .bundle/config .librarian/puppet/config + fi -# Bundle install unless we're already up to date. + log "====> Installing gem dependencies" + bundle install --binstubs bin --path .bundle --quiet "$@" && write_checksum +fi -export PATH=$(pwd)/vendor/shims:$PATH -/usr/bin/bundle install --binstubs bin --path .bundle --quiet "$@" +# Fix the binstubs to use system ruby +find bin -not -path 'bin/\.*' -type f -print0 | xargs -0 /usr/bin/sed -i '' 's|/usr/bin/env ruby|/usr/bin/ruby|g' diff --git a/script/boxen b/script/boxen index e856a7a518..6239d9ea82 100755 --- a/script/boxen +++ b/script/boxen @@ -26,47 +26,133 @@ Dir.chdir Pathname.new(__FILE__).realpath + "../.." # Auto-update code. This is done as early as possible so that changes # to boxen support code or dependencies can be grabbed. -unless ENV["BOXEN_NO_PULL"] || ARGV.include?("--no-pull") - quietly = "> /dev/null 2>&1" - - if system("which git > /dev/null") && File.directory?(".git") \ - && fetch = system("git fetch -q origin") - - clean = `git status --porcelain`.empty? - current_branch = `git symbolic-ref HEAD`.chomp - master = current_branch == "refs/heads/master" - - upstream_changes = `git rev-list --count master..origin/master`.chomp != '0' - fast_forwardable = `git rev-list --count origin/master..master`.chomp == '0' - - if current_branch.empty? - ref = `git log -1 --pretty=format:%h` - warn "Boxen not currently on any branch (ref: #{ref}), won't auto-update!" - elsif !master - local_branch = current_branch.split('/')[2..-1].join('/') - warn "Boxen on a non-master branch '#{local_branch}', won't auto-update!" - elsif !fast_forwardable - warn "Boxen's master branch is out of sync, won't auto-update!" - elsif !clean - warn "Boxen has a dirty tree, won't auto-update!" - elsif !upstream_changes - warn "Boxen is up-to-date." - end +puts "\e[0;36m--> Preparing to auto-update...\e[0m" + +def no_pull_arg?(arg) + %w[--no-pull -h -? --help].include?(arg) || + [/-service/].any? { |regex| regex.match(arg) } +end + +def update_failed(*args) + skip_auto_update(*args) - if clean && master && fast_forwardable && upstream_changes - reset = "(git reset --hard origin/master #{quietly})" - reclean = "(git clean -qdf)" + puts "\e[1;31mWould you like to run Boxen anyway, without the latest updates?\e[0m [y/N]" + if $stdin.gets.chomp.downcase != 'y' + puts + puts "Ok, bailing out!" + exit 1 + end +end - unless system "#{reset} && #{reclean}" - warn "Auto-update of Boxen FAILED, continuing." - end +def skip_auto_update(reason, long_description = nil) + puts "\e[0;33m--> Skipping auto-update, #{reason}\e[0m" + puts + if long_description + # Un-indent the long description, since it's usually come from an indented + # HEREDOC style string + indent = long_description.scan(/^\s*/).min_by{|l|l.length} + long_description.each_line do |line| + puts "\e[0m" + line.gsub(/^#{indent}/, '').chomp + "\e[0m" end + puts + puts "For more info on how the simple git-based updates work, have a gander at" + puts "https://github.com/boxen/our-boxen/blob/master/docs/updates.md" + puts end end +current_branch = File.directory?('.git') ? %x(git symbolic-ref HEAD).chomp : '' + +if ENV["BOXEN_NO_PULL"] || ARGV.any? { |arg| no_pull_arg?(arg) } + skip_auto_update "as requested" + +elsif !File.directory?(".git") + skip_auto_update "since this isn't a git checkout yet" + +elsif current_branch.empty? + update_failed "because your boxen checkout isn't on a branch", <<-END + This is unusual, and will prevent me from updating in the future, too. + + Unless you know what you're doing, and expect to be in a "detached HEAD" + state (which sounds quite uncomfortable!), I recommend that you do this + to get sorted out: + + cd #{Dir.pwd} + git checkout master + boxen + + For serious, you probably don't want to run with a detached head. + END + +elsif current_branch != "refs/heads/master" + skip_auto_update "because your boxen checkout isn't on master", <<-END + Working on something special, over here on a branch? That's cool! Once + you're done, you'll probably want to submit a pull request and get back + onto master so that you can get some sweet, sweet updates again, though. + END + +elsif !%x(git status --porcelain).chomp.empty? + update_failed "because you've got uncommitted changes:", <<-END + #{%x(git status --porcelain)} + Since you've got some uncommitted changes to those files, I'm + going to take the safe road and not automatically update anything. + If you're actively working on some Boxen, maybe you'd like to + switch to a branch, rather than working on master? This way I'll + know that you're trying something new, and won't do things like + automatically update, or submit issues, while you're making + changes. It makes everyone's life a bit easier \xE2\x9D\xA4 + + Now, if you *weren't* expecting any changes, here's how to get + back on the golden path: + + cd #{Dir.pwd} + git reset --hard origin/master + boxen + END + +elsif !system("git fetch --quiet origin") + update_failed "because running `git fetch` failed", <<-END + Well that's disappointing! Are you having network trouble? Is github.com + under attack? Given the potential for all sorts of boxen-y things failing + without the ability to pull from github, I'm going to abort for now. + + Check that you can hit github, see if there are any ongoing issues with + the site and/or your network, and try again ASAP! + END + +elsif %x(git rev-list --count origin/master..master).chomp != "0" + update_failed "because you have unpushed commits on master", <<-END + Committing directly to master? You should be ashamed! + + ... + + It's ok, you're forgiven. But you probably want to push up your changes + soon. Even better, move them to a branch, push it and open a pull request! + + git checkout -b my-cool-branch + git push -u origin my-cool-branch + git checkout master + git reset --hard origin/master + END + +elsif %x(git rev-list --count HEAD..origin/master).chomp == "0" + puts "\e[0;36m--> Complete! Nothing new from upstream.\e[0m" + +elsif !system("git reset --hard origin/master 2>&1 >/dev/null") + update_failed "because resetting to origin/master was unsuccessful" + +elsif !system("git clean -qdf") + update_failed "because cleaning up your repo failed" + +else + # Success! + ref = %x(git log -1 --pretty=format:%h) + puts "\e[0;32m--> Updated successfully to #{ref}!\e[0m" +end + # Make sure our local dependencies are up to date. -strap = %w(script/bootstrap --deployment --local --without development:test --no-cache) +strap = %w(script/bootstrap --quiet --deployment --local --without development --no-cache) abort "Can't bootstrap, dependencies are outdated." unless system *strap # Set up our local configuration, deps, and load path. diff --git a/script/boxen-git-credential b/script/boxen-git-credential index 1960ff4637..1638aa8f37 100755 --- a/script/boxen-git-credential +++ b/script/boxen-git-credential @@ -8,6 +8,12 @@ end require "pathname" +# It's a UTF-8, UTF-8, UTF-8 world. + +Encoding.default_external = Encoding::UTF_8 if RUBY_VERSION > "1.9" + +credential = `/usr/bin/which git-credential-osxkeychain`.chomp + # Put us where we belong, in the root dir of our boxen repo. Dir.chdir Pathname.new(__FILE__).realpath + "../.." @@ -24,13 +30,19 @@ require "boxen/config" config = Boxen::Config.load input = $stdin.read -attrs = Hash[input.split($/).map { |l| l.split("=") }] - -if command != "get" || attrs["host"] != "github.com" +attrs = Hash[input.split($/).map { |l| l.split("=", 2) }] +# find GitHub or GitHub Enterprise host +ghhost = URI(config.ghurl).host + +host_exp = Regexp.new "(^|\.)" + Regexp.escape(ghhost) +if command == "get" && host_exp.match(attrs["host"]) + puts "username=#{config.token}" + puts "password=x-oauth-basic" +else require "open4" fallback = ENV["BOXEN_GIT_CREDENTIAL_FALLBACK"] - fallback ||= "#{config.homedir}/homebrew/bin/git-credential-osxkeychain" + fallback ||= credential status = Open4.popen4 fallback, *ARGV do |pid, stdin, stdout, stderr| stdin.write input @@ -41,6 +53,3 @@ if command != "get" || attrs["host"] != "github.com" exit status.exitstatus end - -puts "username=#{config.login}" -puts "password=#{config.password}" diff --git a/script/boxen-my-config b/script/boxen-my-config index cfe20d8b12..bc51f79359 100755 --- a/script/boxen-my-config +++ b/script/boxen-my-config @@ -9,7 +9,7 @@ end editor = ENV["VISUAL"] || ENV["EDITOR"] home = ENV["BOXEN_HOME"] + "/repo" -user = user.downcase +user = user.downcase.tr('-', '_') path = "#{home}/modules/people/manifests/#{user}.pp" unless File.exist? path diff --git a/script/nuke b/script/nuke index d62e098715..0e5bdcb361 100755 --- a/script/nuke +++ b/script/nuke @@ -6,25 +6,29 @@ unless ENV["USER"] == "root" exec "sudo", $0, *ARGV end -all = false -force = false -opt = false -services = false +all = false +force = false +opt = false +services = false +receipts = false +gitconfig = false +homebrew_config = false OptionParser.new do |o| - o.banner = "Remove most traces of Boxen from your machine." + o.banner = "Remove traces of Boxen from your machine." - o.on("--all", "Remove everything possible.") { all = true } - o.on("--force", "Actually do it.") { force = true } - o.on("--help", "Show this help.") { abort o.to_s } - o.on("--opt", "Remove /opt/boxen.") { opt = true } - o.on("--services", "Remove and unload services.") { services = true } - o.on("--receipts", "Remove package receipts used by Puppet.") { receipts = true } - o.on("--gitconfig", "Remove Boxen-provided git credential helper config.") { gitconfig = true } + o.on("--all", "Remove everything possible.") { all = true } + o.on("--force", "Actually do it.") { force = true } + o.on("--help", "Show this help.") { abort o.to_s } + o.on("--opt", "Remove /opt/boxen.") { opt = true } + o.on("--services", "Remove and unload services.") { services = true } + o.on("--receipts", "Remove package receipts used by Puppet.") { receipts = true } + o.on("--gitconfig", "Remove Boxen-provided git credential helper config.") { gitconfig = true } + o.on("--homebrew-config", "Remove Boxen managed Homebrew package configuration files.") { homebrew_config = true } o.parse! - abort o.to_s unless all || opt || services + abort o.to_s unless all || opt || services || receipts || gitconfig || homebrew_config end unless force @@ -49,7 +53,7 @@ end if all || opt warn "-> Removing /opt/boxen." - system "rm", "-rf", "/opt/boxen" if force + system "rm", "-rf", "/opt/boxen", "/usr/local/Library/Taps/boxen" if force end if all || receipts @@ -62,3 +66,12 @@ if all || gitconfig warn "-> Removing git credential helper config." system "/usr/bin/git", "config", "--global", "--unset", "credential.helper" end + +if all || homebrew_config + %w(/opt/boxen/config /usr/local/etc/boxen).each do |homebrew_path| + if File.exist? homebrew_path + warn "-> Removing Boxen managed Homebrew package configuration files from #{homebrew_path}" + system "rm", "-rf", homebrew_path if force + end + end +end diff --git a/script/sync b/script/sync index 46281170e7..842135c6c2 100755 --- a/script/sync +++ b/script/sync @@ -3,6 +3,7 @@ require "pathname" require "tempfile" +require "base64" # Put us where we belong, in the root dir of our boxen repo. @@ -10,103 +11,198 @@ Dir.chdir Pathname.new(__FILE__).realpath + "../.." # Make sure our local dependencies are up to date. -abort "Sorry, can't bootstrap." unless system "script/bootstrap" +abort "Sorry, can't bootstrap." unless system "script/bootstrap --without ''" # Set up our local configuration, deps, and load path. load "config/basic.rb" -require "aws-sdk" +require "aws-sdk-core" require "boxen/config" -access_key = ENV["BOXEN_S3_ACCESS_KEY"] -secret_key = ENV["BOXEN_S3_SECRET_KEY"] -bucket_name = ENV["BOXEN_S3_BUCKET"] +@access_key = ENV["BOXEN_S3_ACCESS_KEY"] +@secret_key = ENV["BOXEN_S3_SECRET_KEY"] +@bucket_name = ENV["BOXEN_S3_BUCKET"] || "boxen-downloads" +@region = ENV["BOXEN_S3_REGION"] || "us-east-1" -unless access_key && secret_key && bucket_name - abort "Please set the BOXEN_S3_{ACCESS_KEY,SECRET_KEY,BUCKET} env vars." +unless @access_key && @secret_key && @bucket_name + abort "Please set the BOXEN_S3_{ACCESS_KEY,SECRET_KEY} env vars." end -s3 = AWS::S3.new :access_key_id => access_key, :secret_access_key => secret_key -os = `sw_vers -productVersion`.strip.split(".")[0..1].join "." +def os + @os ||= `sw_vers -productVersion`.strip.split(".")[0..1].join(".") +end -bucket = s3.buckets[bucket_name] -config = Boxen::Config.load +def s3 + @s3 ||= Aws::S3::Client.new( + access_key_id: @access_key, + secret_access_key: @secret_key, + region: @region + ) +end -# Sync Homebrew packages. +def config + @config ||= Boxen::Config.load +end -Dir.chdir "#{config.homedir}/homebrew/Cellar" do - Dir["*/*"].each do |dir| - name, version = File.split dir +def homebrew_cellar + cellar ||= "#{ENV['HOMEBREW_ROOT'] || File.join(config.homedir, 'homebrew')}/Cellar" +end - file = "homebrew/#{os}/#{name}-#{version}.tar.bz2" - temp = Tempfile.new "homebrew" - obj = bucket.objects[file] +def object_exists?(key) + puts "Testing for #{key}" + begin + s3.head_object(bucket: @bucket_name, key: key) + rescue Aws::S3::Errors::NoSuchKey, Aws::S3::Errors::NotFound + # aws-sdk-core documentation claims that head_object will raise + # NoSuchKey, but it seems to raise NotFound. We'll catch both for + # now, as I suspect later versions will fix this + false + end +end - next if obj.exists? +# Keep in sync with same-named functions in: +# https://github.com/boxen/puppet-homebrew/blob/master/files/boxen-bottle-hooks.rb +# https://github.com/boxen/puppet-ruby/blob/master/lib/puppet/provider/ruby/rubybuild.rb +def s3_cellar + case homebrew_cellar.to_s + when "/opt/boxen/homebrew/Cellar" then "" + when "/usr/local/Cellar" then "default/" + else "#{Base64.strict_encode64(HOMEBREW_CELLAR.to_s)}/" + end +end +def sync_brew(name, version) + path = "homebrew/#{s3_cellar}#{os}/#{name}-#{version}.tar.bz2" + return if object_exists?(path) + + dir = "#{name}/#{version}" + receipt = IO.read "#{homebrew_cellar}/#{dir}/INSTALL_RECEIPT.json" + json = JSON.parse receipt + if json["poured_from_bottle"] + puts "Skipping #{name} #{version}: installed from a Homebrew bottle" + return + elsif !json["built_as_bottle"] + puts "Skipping #{name} #{version}: not built as a bottle" + puts "Please set the HOMEBREW_BUILD_BOTTLE env var and reinstall." + return + end + + tempfile = Tempfile.new "homebrew" + begin printf "Snapshotting #{name} #{version}... " $stdout.flush - system "tar", "-cjf", temp.path, dir - puts "done." + Dir.chdir(homebrew_cellar) do + system "tar", "-cjf", tempfile.path, dir + puts "done." + end printf "Shipping #{name} #{version} to S3... " $stdout.flush - obj.write :acl => :public_read, :file => temp.path + File.open(tempfile, "r") do |tarball| + s3.put_object(bucket: @bucket_name, key: path, acl: "public-read", body: tarball) + end puts "done." + ensure + tempfile.unlink end end -# Sync rbenv rubies. - -Dir.chdir "#{config.homedir}/rbenv/versions" do - Dir["*"].each do |dir| - next if File.symlink? dir - - version = File.basename dir - file = "rbenv/#{os}/#{version}.tar.bz2" - temp = Tempfile.new "rbenv" - obj = bucket.objects[file] +def sync_ruby(version) + s3_key = "rubies/Darwin/#{s3_cellar}#{os}/#{version}.tar.bz2" + tempfile = Tempfile.new "boxen-ruby" - next if obj.exists? + return if object_exists?(s3_key) - printf "Snapshotting ruby #{version}... " - $stdout.flush + printf "Snapshotting ruby #{version}... " + $stdout.flush - system "tar -cjf #{temp.path} #{version}" - puts "done." + Dir.chdir("/opt/rubies") do + system "tar", "-cjf", tempfile.path, version + end + puts "done." - printf "Shipping ruby #{version} to S3... " - $stdout.flush + printf "Shipping ruby #{version} to S3... " + $stdout.flush - obj.write :acl => :public_read, :file => temp.path - puts "done." + File.open(tempfile, "r") do |tarball| + puts "s3.put_object(#{{bucket: @bucket_name, key: s3_key, acl: "public-read", body: tarball}.inspect})" + s3.put_object(bucket: @bucket_name, key: s3_key, acl: "public-read", body: tarball) end + puts "done." end -# Sync NVM nodes. +def sync_node(version) + s3_key = "nodes/Darwin/#{os}/#{version}.tar.bz2" + tempfile = Tempfile.new "boxen-nodejs" -Dir.chdir "#{config.homedir}/nvm" do - Dir["v*"].each do |dir| - version = File.basename dir - file = "nvm/#{os}/#{version}.tar.bz2" - temp = Tempfile.new "nvm" - obj = bucket.objects[file] + return if object_exists?(s3_key) - next if obj.exists? + printf "Snapshotting node #{version}... " + $stdout.flush - printf "Snapshotting node.js #{version}... " - $stdout.flush + Dir.chdir("/opt/nodes") do + system "tar", "-cjf", tempfile.path, version + end + puts "done." - system "tar -cjf #{temp.path} #{version}" - puts "done." + printf "Shipping node #{version} to S3... " + $stdout.flush - printf "Shipping node.js #{version} to S3... " - $stdout.flush + File.open(tempfile, "r") do |tarball| + puts "s3.put_object(#{{bucket: @bucket_name, key: s3_key, acl: "public-read", body: tarball}.inspect})" + s3.put_object(bucket: @bucket_name, key: s3_key, acl: "public-read", body: tarball) + end + puts "done." +end - obj.write :acl => :public_read, :file => temp.path - puts "done." +def sync_homebrew_packages + Dir.chdir(homebrew_cellar) do + Dir["*/*"].each do |dir| + name, version = File.split dir + sync_brew name, version + end + end +end + +def sync_rubies + Dir.chdir "/opt/rubies" do + Dir["*"].each do |dir| + next if File.symlink? dir + sync_ruby File.split(dir).last + end + end +end + +def sync_nodes + Dir.chdir "/opt/nodes" do + Dir["*"].each do |dir| + next if File.symlink? dir + sync_node File.split(dir).last + end + end +end + +if ARGV.include? "--help" or ARGV.include? "-h" + $stderr.puts "Usage: #{$0} [-h|--help] [1.9.3-p448] [emacs/24.3-boxen2]" + $stderr.puts + $stderr.puts "When no arguments are specified, sync everything. You can alternatively" + $stderr.puts "sync a single package by either specifying a ruby version (eg `1.9.3-p448`)" + $stderr.puts "or a specific homebrew package (eg `emacs/24.3-boxen2`)." + exit 1 +elsif ARGV[0].nil? + # sync everything + sync_homebrew_packages + sync_rubies + sync_nodes +else + package, version = ARGV[0].split("/") + + if version + sync_brew package, version + else + sync_ruby package end end diff --git a/spec/localhost/cli_spec.rb b/spec/localhost/cli_spec.rb new file mode 100644 index 0000000000..31f6d01d72 --- /dev/null +++ b/spec/localhost/cli_spec.rb @@ -0,0 +1,25 @@ +require 'spec_helper' + +# describe 'script/nuke' do +# describe command('/opt/boxen/repo/script/nuke --help') do +# its(:stdout) { should include '--all' } +# its(:stdout) { should include '--force' } +# its(:stdout) { should include '--opt' } +# its(:stdout) { should include '--services' } +# its(:stdout) { should include '--receipts' } +# its(:stdout) { should include '--gitconfig' } +# its(:stdout) { should include '--homebrew-config' } +# end + +# describe '--homebrew-config' do +# it "cleans out $HOMEBREW_ROOT" do +# creation_command_exit_status = command('touch $HOMEBREW_ROOT/etc/boxen/service.config').exit_status +# cleanup_command_exit_status = command('/opt/boxen/repo/script/nuke --force --homebrew-config').exit_status +# file_count_stdout = command('find $HOMEBREW_ROOT/etc/boxen -type f | wc -l').stdout.strip + +# expect(creation_command_exit_status).to eq(0) +# expect(cleanup_command_exit_status).to eq(0) +# expect(file_count_stdout).to eq("0") +# end +# end +# end diff --git a/spec/localhost/directories_spec.rb b/spec/localhost/directories_spec.rb new file mode 100644 index 0000000000..661ea8ecb0 --- /dev/null +++ b/spec/localhost/directories_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe file('/opt/boxen/repo') do + it { should be_directory } +end + +describe 'Boxen managed configuration files' do + describe file('/usr/local/etc/boxen') do + it { should be_directory } + end +end diff --git a/spec/localhost/git_spec.rb b/spec/localhost/git_spec.rb new file mode 100644 index 0000000000..68a3089845 --- /dev/null +++ b/spec/localhost/git_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe package('git') do + it { should be_installed } +end diff --git a/spec/localhost/hub_spec.rb b/spec/localhost/hub_spec.rb new file mode 100644 index 0000000000..0db4e06de2 --- /dev/null +++ b/spec/localhost/hub_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe package('hub') do + it { should be_installed } +end diff --git a/spec/localhost/packages_spec.rb b/spec/localhost/packages_spec.rb new file mode 100644 index 0000000000..0f83da1018 --- /dev/null +++ b/spec/localhost/packages_spec.rb @@ -0,0 +1,7 @@ +require 'spec_helper' + +%w(ack findutils gnu-tar).each do |package_name| + describe package(package_name) do + it { should be_installed } + end +end diff --git a/spec/localhost/services/dnsmasq_spec.rb b/spec/localhost/services/dnsmasq_spec.rb new file mode 100644 index 0000000000..dfe0687e4e --- /dev/null +++ b/spec/localhost/services/dnsmasq_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe 'dnsmasq' do + describe file('/usr/local/etc/boxen/dnsmasq') do + it { should be_directory } + end + + describe file('/usr/local/etc/boxen/dnsmasq/dnsmasq.conf') do + it { should be_file } + end + + describe file('/opt/boxen/data/dnsmasq') do + it { should be_directory } + end + + describe file('/opt/boxen/log/dnsmasq') do + it { should be_directory } + end +end diff --git a/spec/localhost/services/nginx_spec.rb b/spec/localhost/services/nginx_spec.rb new file mode 100644 index 0000000000..c29a74b829 --- /dev/null +++ b/spec/localhost/services/nginx_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe 'nginx' do + describe file('/usr/local/etc/boxen/nginx') do + it { should be_directory } + end + + describe file('/usr/local/etc/boxen/nginx/sites') do + it { should be_directory } + end + + describe file('/usr/local/etc/boxen/nginx/public') do + it { should be_directory } + end + + describe file('/usr/local/etc/boxen/nginx/nginx.conf') do + it { should be_file } + end + + describe file('/opt/boxen/log/nginx') do + it { should be_directory } + end + + describe file('/opt/boxen/data/nginx') do + it { should be_directory } + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000000..37af1b4599 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,3 @@ +require 'serverspec' + +set :backend, :exec diff --git a/vendor/cache/CFPropertyList-2.2.8.gem b/vendor/cache/CFPropertyList-2.2.8.gem new file mode 100644 index 0000000000..adf1cf0caf Binary files /dev/null and b/vendor/cache/CFPropertyList-2.2.8.gem differ diff --git a/vendor/cache/addressable-2.3.2.gem b/vendor/cache/addressable-2.3.2.gem deleted file mode 100644 index a17dfdc51e..0000000000 Binary files a/vendor/cache/addressable-2.3.2.gem and /dev/null differ diff --git a/vendor/cache/addressable-2.3.8.gem b/vendor/cache/addressable-2.3.8.gem new file mode 100644 index 0000000000..21974aa4c8 Binary files /dev/null and b/vendor/cache/addressable-2.3.8.gem differ diff --git a/vendor/cache/ansi-1.4.3.gem b/vendor/cache/ansi-1.4.3.gem deleted file mode 100644 index 786fb43eb6..0000000000 Binary files a/vendor/cache/ansi-1.4.3.gem and /dev/null differ diff --git a/vendor/cache/ansi-1.5.0.gem b/vendor/cache/ansi-1.5.0.gem new file mode 100644 index 0000000000..8c0e14519a Binary files /dev/null and b/vendor/cache/ansi-1.5.0.gem differ diff --git a/vendor/cache/aws-sdk-1.8.2.gem b/vendor/cache/aws-sdk-1.8.2.gem deleted file mode 100644 index 23c460c2f4..0000000000 Binary files a/vendor/cache/aws-sdk-1.8.2.gem and /dev/null differ diff --git a/vendor/cache/aws-sdk-core-2.0.46.gem b/vendor/cache/aws-sdk-core-2.0.46.gem new file mode 100644 index 0000000000..854711db09 Binary files /dev/null and b/vendor/cache/aws-sdk-core-2.0.46.gem differ diff --git a/vendor/cache/boxen-1.0.1.gem b/vendor/cache/boxen-1.0.1.gem deleted file mode 100644 index 8ee017574a..0000000000 Binary files a/vendor/cache/boxen-1.0.1.gem and /dev/null differ diff --git a/vendor/cache/boxen-2.9.0.gem b/vendor/cache/boxen-2.9.0.gem new file mode 100644 index 0000000000..d85a2d56f3 Binary files /dev/null and b/vendor/cache/boxen-2.9.0.gem differ diff --git a/vendor/cache/builder-3.1.4.gem b/vendor/cache/builder-3.1.4.gem deleted file mode 100644 index b6090be96c..0000000000 Binary files a/vendor/cache/builder-3.1.4.gem and /dev/null differ diff --git a/vendor/cache/builder-3.2.2.gem b/vendor/cache/builder-3.2.2.gem new file mode 100644 index 0000000000..b59ef922eb Binary files /dev/null and b/vendor/cache/builder-3.2.2.gem differ diff --git a/vendor/cache/deep_merge-1.0.1.gem b/vendor/cache/deep_merge-1.0.1.gem new file mode 100644 index 0000000000..e15e82ba0a Binary files /dev/null and b/vendor/cache/deep_merge-1.0.1.gem differ diff --git a/vendor/cache/diff-lcs-1.2.5.gem b/vendor/cache/diff-lcs-1.2.5.gem new file mode 100644 index 0000000000..e4436ccc54 Binary files /dev/null and b/vendor/cache/diff-lcs-1.2.5.gem differ diff --git a/vendor/cache/facter-1.6.17.gem b/vendor/cache/facter-1.6.17.gem deleted file mode 100644 index 7cd8b93a44..0000000000 Binary files a/vendor/cache/facter-1.6.17.gem and /dev/null differ diff --git a/vendor/cache/facter-2.4.4-universal-darwin.gem b/vendor/cache/facter-2.4.4-universal-darwin.gem new file mode 100644 index 0000000000..9923d6fa00 Binary files /dev/null and b/vendor/cache/facter-2.4.4-universal-darwin.gem differ diff --git a/vendor/cache/faraday-0.8.5.gem b/vendor/cache/faraday-0.8.5.gem deleted file mode 100644 index d041185395..0000000000 Binary files a/vendor/cache/faraday-0.8.5.gem and /dev/null differ diff --git a/vendor/cache/faraday-0.9.2.gem b/vendor/cache/faraday-0.9.2.gem new file mode 100644 index 0000000000..35a1675ee1 Binary files /dev/null and b/vendor/cache/faraday-0.9.2.gem differ diff --git a/vendor/cache/faraday_middleware-0.9.0.gem b/vendor/cache/faraday_middleware-0.9.0.gem deleted file mode 100644 index e911cb35e4..0000000000 Binary files a/vendor/cache/faraday_middleware-0.9.0.gem and /dev/null differ diff --git a/vendor/cache/hashie-1.2.0.gem b/vendor/cache/hashie-1.2.0.gem deleted file mode 100644 index b7a4d3f71e..0000000000 Binary files a/vendor/cache/hashie-1.2.0.gem and /dev/null differ diff --git a/vendor/cache/hiera-1.0.0.gem b/vendor/cache/hiera-1.0.0.gem deleted file mode 100644 index 74a7dbe12e..0000000000 Binary files a/vendor/cache/hiera-1.0.0.gem and /dev/null differ diff --git a/vendor/cache/hiera-1.3.4.gem b/vendor/cache/hiera-1.3.4.gem new file mode 100644 index 0000000000..c7c1a52744 Binary files /dev/null and b/vendor/cache/hiera-1.3.4.gem differ diff --git a/vendor/cache/highline-1.6.15.gem b/vendor/cache/highline-1.6.15.gem deleted file mode 100644 index 7ef4b0c636..0000000000 Binary files a/vendor/cache/highline-1.6.15.gem and /dev/null differ diff --git a/vendor/cache/highline-1.6.21.gem b/vendor/cache/highline-1.6.21.gem new file mode 100644 index 0000000000..8ec6132bbc Binary files /dev/null and b/vendor/cache/highline-1.6.21.gem differ diff --git a/vendor/cache/jmespath-1.0.2.gem b/vendor/cache/jmespath-1.0.2.gem new file mode 100644 index 0000000000..61ed08f1e1 Binary files /dev/null and b/vendor/cache/jmespath-1.0.2.gem differ diff --git a/vendor/cache/json-1.7.7.gem b/vendor/cache/json-1.7.7.gem deleted file mode 100644 index db6f006f3c..0000000000 Binary files a/vendor/cache/json-1.7.7.gem and /dev/null differ diff --git a/vendor/cache/json-2.1.0.gem b/vendor/cache/json-2.1.0.gem new file mode 100644 index 0000000000..23d69ffecc Binary files /dev/null and b/vendor/cache/json-2.1.0.gem differ diff --git a/vendor/cache/json_pure-1.7.7.gem b/vendor/cache/json_pure-1.7.7.gem deleted file mode 100644 index b7d8d117d6..0000000000 Binary files a/vendor/cache/json_pure-1.7.7.gem and /dev/null differ diff --git a/vendor/cache/json_pure-1.8.2.gem b/vendor/cache/json_pure-1.8.2.gem new file mode 100644 index 0000000000..f766dc2589 Binary files /dev/null and b/vendor/cache/json_pure-1.8.2.gem differ diff --git a/vendor/cache/librarian-0.1.2.gem b/vendor/cache/librarian-0.1.2.gem new file mode 100644 index 0000000000..16bcc72df3 Binary files /dev/null and b/vendor/cache/librarian-0.1.2.gem differ diff --git a/vendor/cache/librarian-puppet-0.9.8.gem b/vendor/cache/librarian-puppet-0.9.8.gem deleted file mode 100644 index b5f8b698be..0000000000 Binary files a/vendor/cache/librarian-puppet-0.9.8.gem and /dev/null differ diff --git a/vendor/cache/librarian-puppet-1.0.9.gem b/vendor/cache/librarian-puppet-1.0.9.gem new file mode 100644 index 0000000000..94557c291b Binary files /dev/null and b/vendor/cache/librarian-puppet-1.0.9.gem differ diff --git a/vendor/cache/metaclass-0.0.4.gem b/vendor/cache/metaclass-0.0.4.gem new file mode 100644 index 0000000000..b32424b08c Binary files /dev/null and b/vendor/cache/metaclass-0.0.4.gem differ diff --git a/vendor/cache/mocha-1.1.0.gem b/vendor/cache/mocha-1.1.0.gem new file mode 100644 index 0000000000..39128ca4c2 Binary files /dev/null and b/vendor/cache/mocha-1.1.0.gem differ diff --git a/vendor/cache/multi_json-1.11.0.gem b/vendor/cache/multi_json-1.11.0.gem new file mode 100644 index 0000000000..6d687e3dbe Binary files /dev/null and b/vendor/cache/multi_json-1.11.0.gem differ diff --git a/vendor/cache/multi_json-1.6.1.gem b/vendor/cache/multi_json-1.6.1.gem deleted file mode 100644 index a147212e5b..0000000000 Binary files a/vendor/cache/multi_json-1.6.1.gem and /dev/null differ diff --git a/vendor/cache/multipart-post-1.1.5.gem b/vendor/cache/multipart-post-1.1.5.gem deleted file mode 100644 index b8c6daa3e1..0000000000 Binary files a/vendor/cache/multipart-post-1.1.5.gem and /dev/null differ diff --git a/vendor/cache/multipart-post-2.0.0.gem b/vendor/cache/multipart-post-2.0.0.gem new file mode 100644 index 0000000000..abfff3d207 Binary files /dev/null and b/vendor/cache/multipart-post-2.0.0.gem differ diff --git a/vendor/cache/net-scp-1.2.1.gem b/vendor/cache/net-scp-1.2.1.gem new file mode 100644 index 0000000000..edd853008e Binary files /dev/null and b/vendor/cache/net-scp-1.2.1.gem differ diff --git a/vendor/cache/net-ssh-2.6.5.gem b/vendor/cache/net-ssh-2.6.5.gem deleted file mode 100644 index bba429d6f3..0000000000 Binary files a/vendor/cache/net-ssh-2.6.5.gem and /dev/null differ diff --git a/vendor/cache/net-ssh-2.9.2.gem b/vendor/cache/net-ssh-2.9.2.gem new file mode 100644 index 0000000000..c71622e678 Binary files /dev/null and b/vendor/cache/net-ssh-2.9.2.gem differ diff --git a/vendor/cache/net-telnet-0.1.1.gem b/vendor/cache/net-telnet-0.1.1.gem new file mode 100644 index 0000000000..66a804cdbb Binary files /dev/null and b/vendor/cache/net-telnet-0.1.1.gem differ diff --git a/vendor/cache/netrc-0.7.7.gem b/vendor/cache/netrc-0.7.7.gem deleted file mode 100644 index c99f9137e1..0000000000 Binary files a/vendor/cache/netrc-0.7.7.gem and /dev/null differ diff --git a/vendor/cache/nokogiri-1.5.6.gem b/vendor/cache/nokogiri-1.5.6.gem deleted file mode 100644 index cb13200d1c..0000000000 Binary files a/vendor/cache/nokogiri-1.5.6.gem and /dev/null differ diff --git a/vendor/cache/octokit-1.23.0.gem b/vendor/cache/octokit-1.23.0.gem deleted file mode 100644 index f5bff1aa14..0000000000 Binary files a/vendor/cache/octokit-1.23.0.gem and /dev/null differ diff --git a/vendor/cache/octokit-2.7.2.gem b/vendor/cache/octokit-2.7.2.gem new file mode 100644 index 0000000000..82506ace88 Binary files /dev/null and b/vendor/cache/octokit-2.7.2.gem differ diff --git a/vendor/cache/open4-1.3.0.gem b/vendor/cache/open4-1.3.0.gem deleted file mode 100644 index e979c9b2b3..0000000000 Binary files a/vendor/cache/open4-1.3.0.gem and /dev/null differ diff --git a/vendor/cache/open4-1.3.4.gem b/vendor/cache/open4-1.3.4.gem new file mode 100644 index 0000000000..34dc1fb71b Binary files /dev/null and b/vendor/cache/open4-1.3.4.gem differ diff --git a/vendor/cache/puppet-3.1.0.gem b/vendor/cache/puppet-3.1.0.gem deleted file mode 100644 index 8ad660e543..0000000000 Binary files a/vendor/cache/puppet-3.1.0.gem and /dev/null differ diff --git a/vendor/cache/puppet-3.7.1.gem b/vendor/cache/puppet-3.7.1.gem new file mode 100644 index 0000000000..00f730c5c3 Binary files /dev/null and b/vendor/cache/puppet-3.7.1.gem differ diff --git a/vendor/cache/puppet-lint-0.3.2.gem b/vendor/cache/puppet-lint-0.3.2.gem new file mode 100644 index 0000000000..e87018399e Binary files /dev/null and b/vendor/cache/puppet-lint-0.3.2.gem differ diff --git a/vendor/cache/puppetlabs_spec_helper-0.4.1.gem b/vendor/cache/puppetlabs_spec_helper-0.4.1.gem new file mode 100644 index 0000000000..a82b0469bf Binary files /dev/null and b/vendor/cache/puppetlabs_spec_helper-0.4.1.gem differ diff --git a/vendor/cache/rake-10.3.2.gem b/vendor/cache/rake-10.3.2.gem new file mode 100644 index 0000000000..59f5fb6344 Binary files /dev/null and b/vendor/cache/rake-10.3.2.gem differ diff --git a/vendor/cache/rbvmomi-1.6.0.gem b/vendor/cache/rbvmomi-1.6.0.gem deleted file mode 100644 index e2f5ddd283..0000000000 Binary files a/vendor/cache/rbvmomi-1.6.0.gem and /dev/null differ diff --git a/vendor/cache/rspec-3.2.0.gem b/vendor/cache/rspec-3.2.0.gem new file mode 100644 index 0000000000..a98dff43bd Binary files /dev/null and b/vendor/cache/rspec-3.2.0.gem differ diff --git a/vendor/cache/rspec-core-3.2.3.gem b/vendor/cache/rspec-core-3.2.3.gem new file mode 100644 index 0000000000..7ed2dcff97 Binary files /dev/null and b/vendor/cache/rspec-core-3.2.3.gem differ diff --git a/vendor/cache/rspec-expectations-3.2.1.gem b/vendor/cache/rspec-expectations-3.2.1.gem new file mode 100644 index 0000000000..c8cbc6ceac Binary files /dev/null and b/vendor/cache/rspec-expectations-3.2.1.gem differ diff --git a/vendor/cache/rspec-its-1.2.0.gem b/vendor/cache/rspec-its-1.2.0.gem new file mode 100644 index 0000000000..ef4ed505e7 Binary files /dev/null and b/vendor/cache/rspec-its-1.2.0.gem differ diff --git a/vendor/cache/rspec-mocks-3.2.1.gem b/vendor/cache/rspec-mocks-3.2.1.gem new file mode 100644 index 0000000000..12eec5c163 Binary files /dev/null and b/vendor/cache/rspec-mocks-3.2.1.gem differ diff --git a/vendor/cache/rspec-puppet-1.0.1.gem b/vendor/cache/rspec-puppet-1.0.1.gem new file mode 100644 index 0000000000..122a14b85f Binary files /dev/null and b/vendor/cache/rspec-puppet-1.0.1.gem differ diff --git a/vendor/cache/rspec-support-3.2.2.gem b/vendor/cache/rspec-support-3.2.2.gem new file mode 100644 index 0000000000..612a74c6c3 Binary files /dev/null and b/vendor/cache/rspec-support-3.2.2.gem differ diff --git a/vendor/cache/sawyer-0.5.5.gem b/vendor/cache/sawyer-0.5.5.gem new file mode 100644 index 0000000000..ad493b3cce Binary files /dev/null and b/vendor/cache/sawyer-0.5.5.gem differ diff --git a/vendor/cache/serverspec-2.37.2.gem b/vendor/cache/serverspec-2.37.2.gem new file mode 100644 index 0000000000..101a258140 Binary files /dev/null and b/vendor/cache/serverspec-2.37.2.gem differ diff --git a/vendor/cache/sfl-2.3.gem b/vendor/cache/sfl-2.3.gem new file mode 100644 index 0000000000..c0cdb96297 Binary files /dev/null and b/vendor/cache/sfl-2.3.gem differ diff --git a/vendor/cache/specinfra-2.66.3.gem b/vendor/cache/specinfra-2.66.3.gem new file mode 100644 index 0000000000..c5ca4e13f0 Binary files /dev/null and b/vendor/cache/specinfra-2.66.3.gem differ diff --git a/vendor/cache/thor-0.17.0.gem b/vendor/cache/thor-0.17.0.gem deleted file mode 100644 index 6dff561904..0000000000 Binary files a/vendor/cache/thor-0.17.0.gem and /dev/null differ diff --git a/vendor/cache/thor-0.20.0.gem b/vendor/cache/thor-0.20.0.gem new file mode 100644 index 0000000000..8618f62875 Binary files /dev/null and b/vendor/cache/thor-0.20.0.gem differ diff --git a/vendor/cache/trollop-2.0.gem b/vendor/cache/trollop-2.0.gem deleted file mode 100644 index 40f0c9fbaa..0000000000 Binary files a/vendor/cache/trollop-2.0.gem and /dev/null differ diff --git a/vendor/cache/uuidtools-2.1.3.gem b/vendor/cache/uuidtools-2.1.3.gem deleted file mode 100644 index a489d97c00..0000000000 Binary files a/vendor/cache/uuidtools-2.1.3.gem and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-autoconf-1.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-autoconf-1.0.0.tar.gz new file mode 100644 index 0000000000..73765292d0 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-autoconf-1.0.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-boxen-1.2.0.tar.gz b/vendor/puppet/cache/boxen-puppet-boxen-1.2.0.tar.gz deleted file mode 100644 index 556e693050..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-boxen-1.2.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-boxen-3.13.0.tar.gz b/vendor/puppet/cache/boxen-puppet-boxen-3.13.0.tar.gz new file mode 100644 index 0000000000..1b0fdd265c Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-boxen-3.13.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-brewcask-0.0.10.tar.gz b/vendor/puppet/cache/boxen-puppet-brewcask-0.0.10.tar.gz new file mode 100644 index 0000000000..a28e3a4769 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-brewcask-0.0.10.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-dnsmasq-1.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-dnsmasq-1.0.0.tar.gz deleted file mode 100644 index ce4fa286e1..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-dnsmasq-1.0.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.3.tar.gz b/vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.3.tar.gz new file mode 100644 index 0000000000..573e964da9 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.3.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.4.tar.gz b/vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.4.tar.gz new file mode 100644 index 0000000000..df887e7391 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.4.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-foreman-1.2.0.tar.gz b/vendor/puppet/cache/boxen-puppet-foreman-1.2.0.tar.gz new file mode 100644 index 0000000000..058e18094c Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-foreman-1.2.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-gcc-1.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-gcc-1.0.0.tar.gz deleted file mode 100644 index fdb165cd99..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-gcc-1.0.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-gcc-3.0.2.tar.gz b/vendor/puppet/cache/boxen-puppet-gcc-3.0.2.tar.gz new file mode 100644 index 0000000000..63a6c0de0d Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-gcc-3.0.2.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-git-1.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-git-1.0.0.tar.gz deleted file mode 100644 index 97bc98cc42..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-git-1.0.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-git-2.13.0.tar.gz b/vendor/puppet/cache/boxen-puppet-git-2.13.0.tar.gz new file mode 100644 index 0000000000..d2e000a9fa Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-git-2.13.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-go-2.1.0.tar.gz b/vendor/puppet/cache/boxen-puppet-go-2.1.0.tar.gz new file mode 100644 index 0000000000..0cb0b058a3 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-go-2.1.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-homebrew-1.1.2.tar.gz b/vendor/puppet/cache/boxen-puppet-homebrew-1.1.2.tar.gz deleted file mode 100644 index 1bb6682f30..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-homebrew-1.1.2.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-homebrew-2.2.0.tar.gz b/vendor/puppet/cache/boxen-puppet-homebrew-2.2.0.tar.gz new file mode 100644 index 0000000000..a60832c0ac Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-homebrew-2.2.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-hub-1.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-hub-1.0.0.tar.gz deleted file mode 100644 index 26cf70828c..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-hub-1.0.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-hub-1.4.5.tar.gz b/vendor/puppet/cache/boxen-puppet-hub-1.4.5.tar.gz new file mode 100644 index 0000000000..bf5ada7155 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-hub-1.4.5.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-nginx-1.1.0.tar.gz b/vendor/puppet/cache/boxen-puppet-nginx-1.1.0.tar.gz deleted file mode 100644 index 2acbe288cc..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-nginx-1.1.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-nginx-1.9.0.tar.gz b/vendor/puppet/cache/boxen-puppet-nginx-1.9.0.tar.gz new file mode 100644 index 0000000000..57697a62a6 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-nginx-1.9.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-nodejs-1.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-nodejs-1.0.0.tar.gz deleted file mode 100644 index 093cc8ebaf..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-nodejs-1.0.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-nodejs-5.0.9.tar.gz b/vendor/puppet/cache/boxen-puppet-nodejs-5.0.9.tar.gz new file mode 100644 index 0000000000..1277147d96 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-nodejs-5.0.9.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-openssl-1.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-openssl-1.0.0.tar.gz new file mode 100644 index 0000000000..1b57d05644 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-openssl-1.0.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-phantomjs-3.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-phantomjs-3.0.0.tar.gz new file mode 100644 index 0000000000..48f22111f9 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-phantomjs-3.0.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-pkgconfig-1.0.0.tar.gz b/vendor/puppet/cache/boxen-puppet-pkgconfig-1.0.0.tar.gz new file mode 100644 index 0000000000..0241a74918 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-pkgconfig-1.0.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-repository-2.4.1.tar.gz b/vendor/puppet/cache/boxen-puppet-repository-2.4.1.tar.gz new file mode 100644 index 0000000000..bfa61ab5a6 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-repository-2.4.1.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-ruby-3.1.0.tar.gz b/vendor/puppet/cache/boxen-puppet-ruby-3.1.0.tar.gz deleted file mode 100644 index cd9f50c0e5..0000000000 Binary files a/vendor/puppet/cache/boxen-puppet-ruby-3.1.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/boxen-puppet-ruby-8.6.0.tar.gz b/vendor/puppet/cache/boxen-puppet-ruby-8.6.0.tar.gz new file mode 100644 index 0000000000..bf4bde5420 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-ruby-8.6.0.tar.gz differ diff --git a/vendor/puppet/cache/boxen-puppet-xquartz-1.2.1.tar.gz b/vendor/puppet/cache/boxen-puppet-xquartz-1.2.1.tar.gz new file mode 100644 index 0000000000..0dd9cdfa44 Binary files /dev/null and b/vendor/puppet/cache/boxen-puppet-xquartz-1.2.1.tar.gz differ diff --git a/vendor/puppet/cache/cprice-puppet-puppetlabs-inifile-0.9.0.tar.gz b/vendor/puppet/cache/cprice-puppet-puppetlabs-inifile-0.9.0.tar.gz deleted file mode 100644 index 770591e66c..0000000000 Binary files a/vendor/puppet/cache/cprice-puppet-puppetlabs-inifile-0.9.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/puppetlabs-puppetlabs-inifile-1.4.1.tar.gz b/vendor/puppet/cache/puppetlabs-puppetlabs-inifile-1.4.1.tar.gz new file mode 100644 index 0000000000..c30905cbe9 Binary files /dev/null and b/vendor/puppet/cache/puppetlabs-puppetlabs-inifile-1.4.1.tar.gz differ diff --git a/vendor/puppet/cache/puppetlabs-puppetlabs-stdlib-3.0.0.tar.gz b/vendor/puppet/cache/puppetlabs-puppetlabs-stdlib-3.0.0.tar.gz deleted file mode 100644 index 29f051e47a..0000000000 Binary files a/vendor/puppet/cache/puppetlabs-puppetlabs-stdlib-3.0.0.tar.gz and /dev/null differ diff --git a/vendor/puppet/cache/puppetlabs-puppetlabs-stdlib-4.7.0.tar.gz b/vendor/puppet/cache/puppetlabs-puppetlabs-stdlib-4.7.0.tar.gz new file mode 100644 index 0000000000..9a12802402 Binary files /dev/null and b/vendor/puppet/cache/puppetlabs-puppetlabs-stdlib-4.7.0.tar.gz differ diff --git a/vendor/puppet/cache/ripienaar-puppet-module-data-0.0.4.tar.gz b/vendor/puppet/cache/ripienaar-puppet-module-data-0.0.4.tar.gz new file mode 100644 index 0000000000..1f9baeaa8c Binary files /dev/null and b/vendor/puppet/cache/ripienaar-puppet-module-data-0.0.4.tar.gz differ diff --git a/vendor/puppet/source/.gitkeep b/vendor/puppet/source/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/puppet/source/20ee2f742d66e40fc34e9727fcd41b5854a86fe6.tar.gz b/vendor/puppet/source/20ee2f742d66e40fc34e9727fcd41b5854a86fe6.tar.gz new file mode 100644 index 0000000000..8acd96e086 Binary files /dev/null and b/vendor/puppet/source/20ee2f742d66e40fc34e9727fcd41b5854a86fe6.tar.gz differ diff --git a/vendor/puppet/source/4354afb53b59956dc85a49d267e2cadac62a3d4c.tar.gz b/vendor/puppet/source/4354afb53b59956dc85a49d267e2cadac62a3d4c.tar.gz new file mode 100644 index 0000000000..502f231627 Binary files /dev/null and b/vendor/puppet/source/4354afb53b59956dc85a49d267e2cadac62a3d4c.tar.gz differ diff --git a/vendor/puppet/source/7beaf6bd48cbd429e0325758b67846d137aba06f.tar.gz b/vendor/puppet/source/7beaf6bd48cbd429e0325758b67846d137aba06f.tar.gz new file mode 100644 index 0000000000..635b38cb68 Binary files /dev/null and b/vendor/puppet/source/7beaf6bd48cbd429e0325758b67846d137aba06f.tar.gz differ diff --git a/vendor/puppet/source/88d9d4930c3c754aed4e06d2f10247e61ba3db7d.tar.gz b/vendor/puppet/source/88d9d4930c3c754aed4e06d2f10247e61ba3db7d.tar.gz new file mode 100644 index 0000000000..5756f28989 Binary files /dev/null and b/vendor/puppet/source/88d9d4930c3c754aed4e06d2f10247e61ba3db7d.tar.gz differ diff --git a/vendor/puppet/source/920d6b42c68603ffdc12427c93e1d647e8624fdd.tar.gz b/vendor/puppet/source/920d6b42c68603ffdc12427c93e1d647e8624fdd.tar.gz new file mode 100644 index 0000000000..08dd8196cb Binary files /dev/null and b/vendor/puppet/source/920d6b42c68603ffdc12427c93e1d647e8624fdd.tar.gz differ diff --git a/vendor/puppet/source/9332672d5396ea9d1c7f28ed70829d5dfb628d7d.tar.gz b/vendor/puppet/source/9332672d5396ea9d1c7f28ed70829d5dfb628d7d.tar.gz new file mode 100644 index 0000000000..e980ee8e30 Binary files /dev/null and b/vendor/puppet/source/9332672d5396ea9d1c7f28ed70829d5dfb628d7d.tar.gz differ diff --git a/vendor/puppet/source/abc7639a1e266cebbe37e4cd443c3b247e3832d7.tar.gz b/vendor/puppet/source/abc7639a1e266cebbe37e4cd443c3b247e3832d7.tar.gz new file mode 100644 index 0000000000..e6f80b07cc Binary files /dev/null and b/vendor/puppet/source/abc7639a1e266cebbe37e4cd443c3b247e3832d7.tar.gz differ diff --git a/vendor/puppet/source/bdc179a75ff935cca77142332ac91ed69d663750.tar.gz b/vendor/puppet/source/bdc179a75ff935cca77142332ac91ed69d663750.tar.gz new file mode 100644 index 0000000000..35bb6cb792 Binary files /dev/null and b/vendor/puppet/source/bdc179a75ff935cca77142332ac91ed69d663750.tar.gz differ diff --git a/vendor/puppet/source/c70468aa3e348cac81b18f7116ef6641ea8142c6.tar.gz b/vendor/puppet/source/c70468aa3e348cac81b18f7116ef6641ea8142c6.tar.gz new file mode 100644 index 0000000000..b4fc71ba0d Binary files /dev/null and b/vendor/puppet/source/c70468aa3e348cac81b18f7116ef6641ea8142c6.tar.gz differ diff --git a/vendor/puppet/source/d32d778e8cf7062d87c470b2eecde3947ec74edd.tar.gz b/vendor/puppet/source/d32d778e8cf7062d87c470b2eecde3947ec74edd.tar.gz new file mode 100644 index 0000000000..a918c4c524 Binary files /dev/null and b/vendor/puppet/source/d32d778e8cf7062d87c470b2eecde3947ec74edd.tar.gz differ diff --git a/vendor/puppet/source/dfcaffd5380c379b22058758948112ca20682337.tar.gz b/vendor/puppet/source/dfcaffd5380c379b22058758948112ca20682337.tar.gz new file mode 100644 index 0000000000..184e07e369 Binary files /dev/null and b/vendor/puppet/source/dfcaffd5380c379b22058758948112ca20682337.tar.gz differ diff --git a/vendor/puppet/source/f0ce0a77db592eb8c646322a9339f4585459acf0.tar.gz b/vendor/puppet/source/f0ce0a77db592eb8c646322a9339f4585459acf0.tar.gz new file mode 100644 index 0000000000..a3dafa6ce9 Binary files /dev/null and b/vendor/puppet/source/f0ce0a77db592eb8c646322a9339f4585459acf0.tar.gz differ