├── .gitignore ├── .rspec ├── .ruby-version ├── .travis.yml ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── Puppetfile ├── Puppetfile.lock ├── README.md ├── Rakefile ├── config ├── basic.rb ├── boxen.rb └── hiera.yaml ├── docs ├── faq.md ├── modules.md ├── personal-configuration.md ├── puppet.md ├── rails.md └── updates.md ├── facts.d └── example.yaml ├── hiera ├── common.yaml.example └── users │ └── README.md ├── lib └── .gitkeep ├── manifests └── site.pp ├── modules ├── people │ ├── README.md │ └── manifests │ │ └── .gitkeep └── projects │ ├── README.md │ ├── manifests │ ├── .gitkeep │ └── all.pp │ └── templates │ └── shared │ └── nginx.conf.erb ├── script ├── bootstrap ├── boxen ├── boxen-bootstrap ├── boxen-git-credential ├── boxen-my-config ├── nuke └── sync ├── shared └── README.md ├── spec ├── localhost │ ├── cli_spec.rb │ ├── directories_spec.rb │ ├── git_spec.rb │ ├── hub_spec.rb │ ├── packages_spec.rb │ └── services │ │ ├── dnsmasq_spec.rb │ │ └── nginx_spec.rb └── spec_helper.rb └── vendor ├── cache ├── CFPropertyList-2.2.8.gem ├── addressable-2.3.8.gem ├── ansi-1.5.0.gem ├── aws-sdk-core-2.0.46.gem ├── boxen-2.9.0.gem ├── builder-3.2.2.gem ├── deep_merge-1.0.1.gem ├── diff-lcs-1.2.5.gem ├── facter-2.4.4-universal-darwin.gem ├── faraday-0.9.2.gem ├── hiera-1.3.4.gem ├── highline-1.6.21.gem ├── jmespath-1.0.2.gem ├── json-2.1.0.gem ├── json_pure-1.8.2.gem ├── librarian-0.1.2.gem ├── librarian-puppet-1.0.9.gem ├── metaclass-0.0.4.gem ├── mocha-1.1.0.gem ├── multi_json-1.11.0.gem ├── multipart-post-2.0.0.gem ├── net-scp-1.2.1.gem ├── net-ssh-2.9.2.gem ├── net-telnet-0.1.1.gem ├── octokit-2.7.2.gem ├── open4-1.3.4.gem ├── puppet-3.7.1.gem ├── puppet-lint-0.3.2.gem ├── puppetlabs_spec_helper-0.4.1.gem ├── rake-10.3.2.gem ├── rspec-3.2.0.gem ├── rspec-core-3.2.3.gem ├── rspec-expectations-3.2.1.gem ├── rspec-its-1.2.0.gem ├── rspec-mocks-3.2.1.gem ├── rspec-puppet-1.0.1.gem ├── rspec-support-3.2.2.gem ├── sawyer-0.5.5.gem ├── serverspec-2.37.2.gem ├── sfl-2.3.gem ├── specinfra-2.66.3.gem └── thor-0.20.0.gem ├── puppet ├── cache │ ├── .gitkeep │ ├── boxen-puppet-autoconf-1.0.0.tar.gz │ ├── boxen-puppet-boxen-3.13.0.tar.gz │ ├── boxen-puppet-brewcask-0.0.10.tar.gz │ ├── boxen-puppet-dnsmasq-2.0.3.tar.gz │ ├── boxen-puppet-dnsmasq-2.0.4.tar.gz │ ├── boxen-puppet-foreman-1.2.0.tar.gz │ ├── boxen-puppet-gcc-3.0.2.tar.gz │ ├── boxen-puppet-git-2.13.0.tar.gz │ ├── boxen-puppet-go-2.1.0.tar.gz │ ├── boxen-puppet-homebrew-2.2.0.tar.gz │ ├── boxen-puppet-hub-1.4.5.tar.gz │ ├── boxen-puppet-inifile-0.0.1.tar.gz │ ├── boxen-puppet-nginx-1.9.0.tar.gz │ ├── boxen-puppet-nodejs-5.0.9.tar.gz │ ├── boxen-puppet-nvm-1.0.0.tar.gz │ ├── boxen-puppet-openssl-1.0.0.tar.gz │ ├── boxen-puppet-phantomjs-3.0.0.tar.gz │ ├── boxen-puppet-pkgconfig-1.0.0.tar.gz │ ├── boxen-puppet-rbenv-0.1.0.tar.gz │ ├── boxen-puppet-repository-2.4.1.tar.gz │ ├── boxen-puppet-ruby-8.6.0.tar.gz │ ├── boxen-puppet-sudo-1.0.0.tar.gz │ ├── boxen-puppet-xquartz-1.2.1.tar.gz │ ├── puppetlabs-puppetlabs-inifile-1.4.1.tar.gz │ ├── puppetlabs-puppetlabs-stdlib-4.7.0.tar.gz │ └── ripienaar-puppet-module-data-0.0.4.tar.gz └── source │ ├── .gitkeep │ ├── 20ee2f742d66e40fc34e9727fcd41b5854a86fe6.tar.gz │ ├── 4354afb53b59956dc85a49d267e2cadac62a3d4c.tar.gz │ ├── 7beaf6bd48cbd429e0325758b67846d137aba06f.tar.gz │ ├── 88d9d4930c3c754aed4e06d2f10247e61ba3db7d.tar.gz │ ├── 920d6b42c68603ffdc12427c93e1d647e8624fdd.tar.gz │ ├── 9332672d5396ea9d1c7f28ed70829d5dfb628d7d.tar.gz │ ├── abc7639a1e266cebbe37e4cd443c3b247e3832d7.tar.gz │ ├── bdc179a75ff935cca77142332ac91ed69d663750.tar.gz │ ├── c70468aa3e348cac81b18f7116ef6641ea8142c6.tar.gz │ ├── d32d778e8cf7062d87c470b2eecde3947ec74edd.tar.gz │ ├── dfcaffd5380c379b22058758948112ca20682337.tar.gz │ └── f0ce0a77db592eb8c646322a9339f4585459acf0.tar.gz └── shims └── xcrun /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle 2 | /.librarian 3 | /.projects 4 | /.snapshot 5 | /.tmp 6 | /bin 7 | /config/local.rb 8 | /log 9 | /tmp 10 | /shared/* 11 | !/shared/README.md 12 | /vendor/gems/ 13 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --color 2 | --format documentation 3 | --order random 4 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | system 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: 2 | - osx 3 | script: 4 | - rm -rf /usr/local/Homebrew 5 | - travis_wait 60 rvm implode --force 6 | - ./script/boxen --no-fde --stealth --no-pull --debug --profile --login $BOXEN_GITHUB_LOGIN --token $BOXEN_GITHUB_TOKEN || test $? -eq 2 7 | - source /opt/boxen/env.sh 8 | - bundle exec rspec spec 9 | before_install: 10 | - sudo gem install bundler -v '~> 1.13' 11 | env: 12 | global: 13 | - HOMEBREW_NO_AUTO_UPDATE=1 14 | - HOMEBREW_VERBOSE=1 15 | - secure: HoCPuAgujmw+tdH7qq9bSymtpE8o4gpp1uYRyFin2TB3px2JdOPCPCb754vddmE12zhhKKSy1j0Uj/qeW6tjy9hIhlAjLAGFuT+mNTURqu4nmojCgKO2ApcRWc3yv319XR2vjUDW1qmEyKm7il4q1c/dOFmGbVYeDixjUUfWVII= 16 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "boxen", "~> 2.9.0" 4 | gem "hiera", "~> 1.3.3" 5 | gem "librarian-puppet" 6 | gem "puppet", "3.7.1" 7 | gem "librarianp", 8 | git: "https://github.com/voxpupuli/librarian.git", 9 | branch: "librarianp" 10 | gem "puppet-lint", "0.3.2" 11 | gem "puppetlabs_spec_helper", "0.4.1" 12 | gem "open4", "~> 1.3.4" 13 | gem "rake", "10.3.2" 14 | gem "rspec-puppet", "1.0.1" 15 | gem "deep_merge", "~> 1.0" 16 | 17 | group :test do 18 | gem "serverspec" 19 | end 20 | 21 | group :development do 22 | gem "aws-sdk-core", "~> 2.0.11" 23 | gem "net-ssh" 24 | end 25 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GIT 2 | remote: https://github.com/voxpupuli/librarian.git 3 | revision: 4d78d88be2d7673a136e78760085fbf9664ff27d 4 | branch: librarianp 5 | specs: 6 | librarianp (0.6.3) 7 | thor (~> 0.15) 8 | 9 | GEM 10 | remote: https://rubygems.org/ 11 | specs: 12 | CFPropertyList (2.2.8) 13 | addressable (2.3.8) 14 | ansi (1.5.0) 15 | aws-sdk-core (2.0.46) 16 | builder (~> 3.0) 17 | jmespath (~> 1.0) 18 | multi_json (~> 1.0) 19 | boxen (2.9.0) 20 | ansi (~> 1.4) 21 | hiera (~> 1.0) 22 | highline (~> 1.6.0) 23 | json_pure (>= 1.7.7, < 2.0) 24 | librarian-puppet (~> 1.0.0) 25 | octokit (~> 2.7, >= 2.7.1) 26 | puppet (~> 3.7) 27 | builder (3.2.2) 28 | deep_merge (1.0.1) 29 | diff-lcs (1.2.5) 30 | facter (2.4.4) 31 | CFPropertyList (~> 2.2.6) 32 | faraday (0.9.2) 33 | multipart-post (>= 1.2, < 3) 34 | hiera (1.3.4) 35 | json_pure 36 | highline (1.6.21) 37 | jmespath (1.0.2) 38 | multi_json (~> 1.0) 39 | json (2.1.0) 40 | json_pure (1.8.2) 41 | librarian (0.1.2) 42 | highline 43 | thor (~> 0.15) 44 | librarian-puppet (1.0.9) 45 | json 46 | librarian (>= 0.1.2) 47 | metaclass (0.0.4) 48 | mocha (1.1.0) 49 | metaclass (~> 0.0.1) 50 | multi_json (1.11.0) 51 | multipart-post (2.0.0) 52 | net-scp (1.2.1) 53 | net-ssh (>= 2.6.5) 54 | net-ssh (2.9.2) 55 | net-telnet (0.1.1) 56 | octokit (2.7.2) 57 | sawyer (~> 0.5.2) 58 | open4 (1.3.4) 59 | puppet (3.7.1) 60 | facter (> 1.6, < 3) 61 | hiera (~> 1.0) 62 | json_pure 63 | puppet-lint (0.3.2) 64 | puppetlabs_spec_helper (0.4.1) 65 | mocha (>= 0.10.5) 66 | rake 67 | rspec (>= 2.9.0) 68 | rspec-puppet (>= 0.1.1) 69 | rake (10.3.2) 70 | rspec (3.2.0) 71 | rspec-core (~> 3.2.0) 72 | rspec-expectations (~> 3.2.0) 73 | rspec-mocks (~> 3.2.0) 74 | rspec-core (3.2.3) 75 | rspec-support (~> 3.2.0) 76 | rspec-expectations (3.2.1) 77 | diff-lcs (>= 1.2.0, < 2.0) 78 | rspec-support (~> 3.2.0) 79 | rspec-its (1.2.0) 80 | rspec-core (>= 3.0.0) 81 | rspec-expectations (>= 3.0.0) 82 | rspec-mocks (3.2.1) 83 | diff-lcs (>= 1.2.0, < 2.0) 84 | rspec-support (~> 3.2.0) 85 | rspec-puppet (1.0.1) 86 | rspec 87 | rspec-support (3.2.2) 88 | sawyer (0.5.5) 89 | addressable (~> 2.3.5) 90 | faraday (~> 0.8, < 0.10) 91 | serverspec (2.37.2) 92 | multi_json 93 | rspec (~> 3.0) 94 | rspec-its 95 | specinfra (~> 2.53) 96 | sfl (2.3) 97 | specinfra (2.66.3) 98 | net-scp 99 | net-ssh (>= 2.7, < 4.0) 100 | net-telnet 101 | sfl 102 | thor (0.20.0) 103 | 104 | PLATFORMS 105 | ruby 106 | 107 | DEPENDENCIES 108 | aws-sdk-core (~> 2.0.11) 109 | boxen (~> 2.9.0) 110 | deep_merge (~> 1.0) 111 | hiera (~> 1.3.3) 112 | librarian-puppet 113 | librarianp! 114 | net-ssh 115 | open4 (~> 1.3.4) 116 | puppet (= 3.7.1) 117 | puppet-lint (= 0.3.2) 118 | puppetlabs_spec_helper (= 0.4.1) 119 | rake (= 10.3.2) 120 | rspec-puppet (= 1.0.1) 121 | serverspec 122 | 123 | BUNDLED WITH 124 | 1.10.5 125 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 GitHub, Inc. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 17 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 18 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 19 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 20 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /Puppetfile: -------------------------------------------------------------------------------- 1 | # This file manages Puppet module dependencies. 2 | # 3 | # It works a lot like Bundler. We provide some core modules by 4 | # default. This ensures at least the ability to construct a basic 5 | # environment. 6 | 7 | # Shortcut for a module from GitHub's boxen organization 8 | def github(name, *args) 9 | options ||= if args.last.is_a? Hash 10 | args.last 11 | else 12 | {} 13 | end 14 | 15 | if path = options.delete(:path) 16 | mod name, :path => path 17 | else 18 | version = args.first 19 | options[:repo] ||= "boxen/puppet-#{name}" 20 | mod name, version, :github_tarball => options[:repo] 21 | end 22 | end 23 | 24 | # Shortcut for a module under development 25 | def dev(name, *args) 26 | mod "puppet-#{name}", :path => "#{ENV['HOME']}/src/boxen/puppet-#{name}" 27 | end 28 | 29 | # Includes many of our custom types and providers, as well as global 30 | # config. Required. 31 | 32 | github "boxen", "3.13.0" 33 | 34 | # Support for default hiera data in modules 35 | 36 | github "module_data", "0.0.4", :repo => "ripienaar/puppet-module-data" 37 | 38 | # Core modules for a basic development environment. You can replace 39 | # some/most of these if you want, but it's not recommended. 40 | 41 | github "brewcask", "0.0.10" 42 | github "dnsmasq", "2.0.4" 43 | github "foreman", "1.2.0" 44 | # mod "gcc", "0.0.1", :git => "https://github.com/boxen/puppet-gcc.git", :ref => "abc7639" 45 | github "git", "2.13.0" 46 | github "go", "2.1.0" 47 | github "homebrew", "2.2.0" 48 | github "hub", "1.4.5" 49 | github "inifile", "1.4.1", :repo => "puppetlabs/puppetlabs-inifile" 50 | github "nginx", "1.9.0" 51 | github "nodejs", "5.0.9" 52 | github "openssl", "1.0.0" 53 | github "phantomjs", "3.0.0" 54 | github "pkgconfig", "1.0.0" 55 | github "repository", "2.4.1" 56 | github "ruby", "8.6.0" 57 | github "stdlib", "4.7.0", :repo => "puppetlabs/puppetlabs-stdlib" 58 | github "sudo", "1.0.0" 59 | github "xquartz", "1.2.1" 60 | 61 | # Optional/custom modules. There are tons available at 62 | # https://github.com/boxen. 63 | # github "elasticsearch", "2.8.0" 64 | # github "mysql", "2.0.1" 65 | # github "postgresql", "4.0.1" 66 | # github "redis", "3.1.0" 67 | # github "sysctl", "1.0.1" 68 | -------------------------------------------------------------------------------- /Puppetfile.lock: -------------------------------------------------------------------------------- 1 | GITHUBTARBALL 2 | remote: boxen/puppet-boxen 3 | specs: 4 | boxen (3.13.0) 5 | 6 | GITHUBTARBALL 7 | remote: boxen/puppet-brewcask 8 | specs: 9 | brewcask (0.0.10) 10 | 11 | GITHUBTARBALL 12 | remote: boxen/puppet-dnsmasq 13 | specs: 14 | dnsmasq (2.0.4) 15 | 16 | GITHUBTARBALL 17 | remote: boxen/puppet-foreman 18 | specs: 19 | foreman (1.2.0) 20 | 21 | GITHUBTARBALL 22 | remote: boxen/puppet-git 23 | specs: 24 | git (2.13.0) 25 | 26 | GITHUBTARBALL 27 | remote: boxen/puppet-go 28 | specs: 29 | go (2.1.0) 30 | 31 | GITHUBTARBALL 32 | remote: boxen/puppet-homebrew 33 | specs: 34 | homebrew (2.2.0) 35 | 36 | GITHUBTARBALL 37 | remote: boxen/puppet-hub 38 | specs: 39 | hub (1.4.5) 40 | 41 | GITHUBTARBALL 42 | remote: boxen/puppet-nginx 43 | specs: 44 | nginx (1.9.0) 45 | 46 | GITHUBTARBALL 47 | remote: boxen/puppet-nodejs 48 | specs: 49 | nodejs (5.0.9) 50 | 51 | GITHUBTARBALL 52 | remote: boxen/puppet-openssl 53 | specs: 54 | openssl (1.0.0) 55 | 56 | GITHUBTARBALL 57 | remote: boxen/puppet-phantomjs 58 | specs: 59 | phantomjs (3.0.0) 60 | 61 | GITHUBTARBALL 62 | remote: boxen/puppet-pkgconfig 63 | specs: 64 | pkgconfig (1.0.0) 65 | 66 | GITHUBTARBALL 67 | remote: boxen/puppet-repository 68 | specs: 69 | repository (2.4.1) 70 | 71 | GITHUBTARBALL 72 | remote: boxen/puppet-ruby 73 | specs: 74 | ruby (8.6.0) 75 | 76 | GITHUBTARBALL 77 | remote: boxen/puppet-sudo 78 | specs: 79 | sudo (1.0.0) 80 | 81 | GITHUBTARBALL 82 | remote: boxen/puppet-xquartz 83 | specs: 84 | xquartz (1.2.1) 85 | 86 | GITHUBTARBALL 87 | remote: puppetlabs/puppetlabs-inifile 88 | specs: 89 | inifile (1.4.1) 90 | 91 | GITHUBTARBALL 92 | remote: puppetlabs/puppetlabs-stdlib 93 | specs: 94 | stdlib (4.7.0) 95 | 96 | GITHUBTARBALL 97 | remote: ripienaar/puppet-module-data 98 | specs: 99 | module_data (0.0.4) 100 | 101 | DEPENDENCIES 102 | boxen (= 3.13.0) 103 | brewcask (= 0.0.10) 104 | dnsmasq (= 2.0.4) 105 | foreman (= 1.2.0) 106 | git (= 2.13.0) 107 | go (= 2.1.0) 108 | homebrew (= 2.2.0) 109 | hub (= 1.4.5) 110 | inifile (= 1.4.1) 111 | module_data (= 0.0.4) 112 | nginx (= 1.9.0) 113 | nodejs (= 5.0.9) 114 | openssl (= 1.0.0) 115 | phantomjs (= 3.0.0) 116 | pkgconfig (= 1.0.0) 117 | repository (= 2.4.1) 118 | ruby (= 8.6.0) 119 | stdlib (= 4.7.0) 120 | sudo (= 1.0.0) 121 | xquartz (= 1.2.1) 122 | 123 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Our Boxen 2 | 3 | This is a template Boxen project designed for your organization to fork and 4 | modify appropriately. 5 | The Boxen rubygem and the Boxen puppet modules are only a framework for getting 6 | things done. 7 | This repository template is just a basic example of _how_ to do things with them. 8 | 9 | ## Getting Started 10 | 11 | To give you a brief overview, we're going to: 12 | 13 | * Install dependencies (basically Xcode) 14 | * Bootstrap a boxen for your self/team/org/company 15 | * Then convert your local copy of that boxen to the post-bootstrapped version 16 | 17 | There are a few potential conflicts to keep in mind. 18 | Boxen does its best not to get in the way of a dirty system, 19 | but you should check into the following before attempting to install your 20 | boxen on any machine (we do some checks before every Boxen run to try 21 | and detect most of these and tell you anyway): 22 | 23 | * Boxen __requires__ at least the Xcode Command Line Tools installed. 24 | * Boxen __will not__ work with an existing rvm install. 25 | * Boxen __may not__ play nice with a GitHub username that includes dash(-) 26 | * Boxen __may not__ play nice with an existing rbenv install. 27 | * Boxen __may not__ play nice with an existing chruby install. 28 | * Boxen __may not__ play nice with an existing homebrew install. 29 | * Boxen __may not__ play nice with an existing nvm install. 30 | * Boxen __recommends__ installing the full Xcode. 31 | 32 | ### Dependencies 33 | 34 | **Install the Xcode Command Line Tools and/or full Xcode.** 35 | This will grant you the most predictable behavior in building apps like 36 | MacVim. 37 | 38 | How do you do it? 39 | 40 | #### OS X 10.9 (Mavericks) 41 | 42 | If you are using [`b26abd0` of boxen-web](https://github.com/boxen/boxen-web/commit/b26abd0d681129eba0b5f46ed43110d873d8fdc2) 43 | or newer, it will be automatically installed as part of Boxen. 44 | Otherwise, follow instructions below. 45 | 46 | #### OS X < 10.9 47 | 48 | 1. Install Xcode from the Mac App Store. 49 | 1. Open Xcode. 50 | 1. Open the Preferences window (`Cmd-,`). 51 | 1. Go to the Downloads tab. 52 | 1. Install the Command Line Tools. 53 | 54 | ### Bootstrapping 55 | 56 | Create a **new** git repository somewhere on the internet. 57 | It can be private or public -- it really doesn't matter. 58 | If you're making a repository on GitHub, you _may not_ want to fork this repo 59 | to get started. 60 | The reason for that is that you can't really make private forks of public 61 | repositories easily. 62 | 63 | Once you've done that, you can run the following to bootstrap 64 | your boxen: 65 | 66 | ``` 67 | sudo mkdir -p /opt/boxen 68 | sudo chown ${USER}:staff /opt/boxen 69 | git clone https://github.com/boxen/our-boxen /opt/boxen/repo 70 | cd /opt/boxen/repo 71 | git remote rm origin 72 | git remote add origin 73 | git push -u origin master 74 | ``` 75 | 76 | Now that your boxen is bootstrapped, you can run the following to 77 | install the default configuration from this repo: 78 | 79 | ``` 80 | cd /opt/boxen/repo 81 | ./script/boxen 82 | ``` 83 | 84 | ### Distributing 85 | 86 | That's enough to get your boxen into a usable state on other machines, 87 | usually. 88 | From there, we recommend setting up 89 | [boxen-web](https://github.com/boxen/boxen-web) 90 | as an easy way to automate letting other folks install your boxen. 91 | 92 | If you _don't_ want to use boxen-web, folks can get using your boxen like so: 93 | 94 | ``` 95 | sudo mkdir -p /opt/boxen 96 | sudo chown ${USER}:staff /opt/boxen 97 | git clone /opt/boxen/repo 98 | cd /opt/boxen/repo 99 | ./script/boxen 100 | ``` 101 | 102 | Keep in mind this requires you to encrypt your hard drive by default. 103 | If you do not want to do encrypt your hard drive, you can use the `--no-fde`. 104 | 105 | ``` 106 | ./script/boxen --no-fde 107 | ``` 108 | 109 | It should run successfully, and should tell you to source a shell script 110 | in your environment. 111 | For users without a bash or zsh config or a `~/.profile` file, 112 | Boxen will create a shim for you that will work correctly. 113 | If you do have a `~/.bashrc` or `~/.zshrc`, your shell will not use 114 | `~/.profile` so you'll need to add a line like so at _the end of your config_: 115 | 116 | ``` sh 117 | [ -f /opt/boxen/env.sh ] && source /opt/boxen/env.sh 118 | ``` 119 | 120 | Once your shell is ready, open a new tab/window in your Terminal 121 | and you should be able to successfully run `boxen --env`. 122 | If that runs cleanly, you're in good shape. 123 | 124 | ## What You Get 125 | 126 | This template project provides the following by default: 127 | 128 | * Homebrew 129 | * Homebrew-Cask 130 | * Git 131 | * Hub 132 | * dnsmasq w/ .dev resolver for localhost 133 | * rbenv 134 | * Full Disk Encryption requirement 135 | * Node.js 0.8 136 | * Node.js 0.10 137 | * Node.js 0.12 138 | * Ruby 1.9.3 139 | * Ruby 2.0.0 140 | * Ruby 2.1.8 141 | * Ruby 2.2.4 142 | * ack 143 | * Findutils 144 | * GNU tar 145 | 146 | ## Customizing 147 | 148 | You can always check out the number of existing modules we already 149 | provide as optional installs under the 150 | [boxen organization](https://github.com/boxen). These modules are all 151 | tested to be compatible with Boxen. Use the `Puppetfile` to pull them 152 | in dependencies automatically whenever `boxen` is run. 153 | 154 | ### Including boxen modules from github (boxen/puppet-) 155 | 156 | You must add the github information for your added Puppet module into your Puppetfile at the root of your 157 | boxen repo (ex. /path/to/your-boxen/Puppetfile): 158 | 159 | # Core modules for a basic development environment. You can replace 160 | # some/most of these if you want, but it's not recommended. 161 | 162 | github "repository", "2.0.2" 163 | github "dnsmasq", "1.0.0" 164 | github "gcc", "1.0.0" 165 | github "git", "1.2.2" 166 | github "homebrew", "1.1.2" 167 | github "hub", "1.0.0" 168 | github "inifile", "0.9.0", :repo => "cprice404/puppetlabs-inifile" 169 | github "nginx", "1.4.0" 170 | github "nodejs", "2.2.0" 171 | github "ruby", "4.1.0" 172 | github "stdlib", "4.0.2", :repo => "puppetlabs/puppetlabs-stdlib" 173 | github "sudo", "1.0.0" 174 | 175 | # Optional/custom modules. There are tons available at 176 | # https://github.com/boxen. 177 | 178 | github "java", "1.6.0" 179 | 180 | In the above snippet of a customized Puppetfile, the bottom line 181 | includes the Java module from Github using the tag "1.6.0" from the github repository 182 | "[boxen/puppet-java/releases](https://github.com/boxen/puppet-java/releases)". The function "github" is defined at the top of the Puppetfile 183 | and takes the name of the module, the version, and optional repo location: 184 | 185 | def github(name, version, options = nil) 186 | options ||= {} 187 | options[:repo] ||= "boxen/puppet-#{name}" 188 | mod name, version, :github_tarball => options[:repo] 189 | end 190 | 191 | Now Puppet knows where to download the module from when you include it in your site.pp or mypersonal.pp file: 192 | 193 | # include the java module referenced in my Puppetfile with the line 194 | # github "java", "1.6.0" 195 | include java 196 | 197 | ### Hiera 198 | 199 | Hiera is preferred mechanism to make changes to module defaults (e.g. default 200 | global ruby version, service ports, etc). This repository supplies a 201 | starting point for your Hiera configuration at `config/hiera.yml`, and an 202 | example data file at `hiera/common.yaml`. See those files for more details. 203 | 204 | The default `config/hiera.yml` is configured with a hierarchy that allows 205 | individuals to have their own hiera data file in 206 | `hiera/users/{github_login}.yaml` which augments and overrides 207 | site-wide values in `hiera/common.yaml`. This default is, as with most of the 208 | configuration in the example repo, a great starting point for many 209 | organisations, but is totally up to you. You might want to, for 210 | example, have a set of values that can't be overridden by adding a file to 211 | the top of the hierarchy, or to have values set on specific OS 212 | versions: 213 | 214 | ```yaml 215 | # ... 216 | :hierarchy: 217 | - "global-overrides.yaml" 218 | - "users/%{::github_login}" 219 | - "osx-%{::macosx_productversion_major}" 220 | - common 221 | ``` 222 | 223 | ### Node definitions 224 | 225 | Puppet has the concept of a 226 | ['node'](http://docs.puppetlabs.com/references/glossary.html#agent), 227 | which is essentially the machine on which Puppet is running. Puppet looks for 228 | [node definitions](http://docs.puppetlabs.com/learning/agent_master_basic.html#node-definitions) 229 | in the `manifests/site.pp` file in the Boxen repo. You'll see a default node 230 | declaration that looks like the following: 231 | 232 | ``` puppet 233 | node default { 234 | # core modules, needed for most things 235 | include dnsmasq 236 | 237 | # more... 238 | } 239 | ``` 240 | 241 | ### How Boxen interacts with Puppet 242 | 243 | Boxen runs everything declared in `manifests/site.pp` by default. 244 | But just like any other source code, throwing all your work into one massive 245 | file is going to be difficult to work with. Instead, we recommend you 246 | use modules in the `Puppetfile` when you can and make new modules 247 | in the `modules/` directory when you can't. Then add `include $modulename` 248 | for each new module in `manifests/site.pp` to include them. 249 | One pattern that's very common is to create a module for your organization 250 | (e.g., `modules/github`) and put an environment class in that module 251 | to include all of the modules your organization wants to install for 252 | everyone by default. An example of this might look like so: 253 | 254 | ``` puppet 255 | # modules/github/manifests/environment.pp 256 | 257 | class github::environment { 258 | include github::apps::mac 259 | 260 | include ruby::1-8-7 261 | 262 | include projects::super-top-secret-project 263 | } 264 | ``` 265 | 266 | If you'd like to read more about how Puppet works, we recommend 267 | checking out [the official documentation](http://docs.puppetlabs.com/) 268 | for: 269 | 270 | * [Modules](http://docs.puppetlabs.com/learning/modules1.html#modules) 271 | * [Classes](http://docs.puppetlabs.com/learning/modules1.html#classes) 272 | * [Defined Types](http://docs.puppetlabs.com/learning/definedtypes.html) 273 | * [Facts](http://docs.puppetlabs.com/guides/custom_facts.html) 274 | 275 | ### Creating a personal module 276 | 277 | See [the documentation in the 278 | `modules/people`](modules/people/README.md) 279 | directory for creating per-user modules that don't need to be applied 280 | globally to everyone. 281 | 282 | ### Creating a project module 283 | 284 | See [the documentation in the 285 | `modules/projects`](modules/projects/README.md) 286 | directory for creating organization projects (i.e., repositories that people 287 | will be working in). 288 | 289 | ## Binary packages 290 | 291 | We support binary packaging for everything in Homebrew, rbenv, and nvm. 292 | See `config/boxen.rb` for the environment variables to define. 293 | 294 | ## Sharing Boxen Modules 295 | 296 | If you've got a Boxen module you'd like to be grouped under the Boxen org, 297 | (so it can easily be found by others), please file an issue on this 298 | repository with a link to your module. 299 | We'll review the code briefly, and if things look pretty all right, 300 | we'll fork it under the Boxen org and give you read+write access to our 301 | fork. 302 | You'll still be the maintainer, you'll still own the issues and PRs. 303 | It'll just be listed under the boxen org so folks can find it more easily. 304 | 305 | ## upgrading boxen 306 | 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). 307 | 308 | ## Integrating with Github Enterprise 309 | 310 | If you're using a Github Enterprise instance rather than github.com, 311 | you will need to set the `BOXEN_GITHUB_ENTERPRISE_URL` and 312 | `BOXEN_REPO_URL_TEMPLATE` variables in your 313 | [Boxen config](config/boxen.rb). 314 | 315 | ## Halp! 316 | 317 | See [FAQ](https://github.com/boxen/our-boxen/blob/master/docs/faq.md). 318 | 319 | Use Issues or #boxen on irc.freenode.net. 320 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'rake' 2 | require 'rspec/core/rake_task' 3 | 4 | task :spec => 'spec:all' 5 | task :default => :spec 6 | 7 | namespace :spec do 8 | targets = [] 9 | Dir.glob('./spec/*').each do |dir| 10 | next unless File.directory?(dir) 11 | target = File.basename(dir) 12 | target = "_#{target}" if target == "default" 13 | targets << target 14 | end 15 | 16 | task :all => targets 17 | task :default => :all 18 | 19 | targets.each do |target| 20 | original_target = target == "_default" ? target[1..-1] : target 21 | desc "Run serverspec tests to #{original_target}" 22 | RSpec::Core::RakeTask.new(target.to_sym) do |t| 23 | ENV['TARGET_HOST'] = original_target 24 | t.pattern = "spec/#{original_target}/*_spec.rb" 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /config/basic.rb: -------------------------------------------------------------------------------- 1 | # Set up the execution environment. Load this file before trying to do 2 | # anything else. This file assumes that the repo's been bootstrapped. 3 | 4 | require "pathname" 5 | 6 | # Make sure we're in the repo's root directory. 7 | 8 | Dir.chdir Pathname.new(__FILE__).realpath + "../.." 9 | 10 | # Load custom config. 11 | 12 | load File.expand_path "../boxen.rb", __FILE__ 13 | 14 | # Load local config if it exists. This file is ignored by Git, and can 15 | # be used for personal config. 16 | 17 | local = File.expand_path "../local.rb", __FILE__ 18 | load local if File.file? local 19 | 20 | # Add local deps to the load path. 21 | 22 | require "rubygems" 23 | require "bundler/setup" 24 | 25 | # Add local lib to the front of the load path if it exists. 26 | 27 | lib = File.expand_path "../../lib", __FILE__ 28 | $:.unshift lib if File.directory? lib 29 | -------------------------------------------------------------------------------- /config/boxen.rb: -------------------------------------------------------------------------------- 1 | # This file will be loaded by config/basic early in a Boxen run. Use 2 | # it to provide any custom code or behavior your Boxen setup requires. 3 | 4 | # Change the prefix boxen is installed to. 5 | # ENV['BOXEN_HOME'] = '/opt/boxen' 6 | 7 | # Change the repo boxen will use. 8 | # ENV['BOXEN_REPO_NAME'] = 'boxen/our-boxen' 9 | 10 | # Boxen binary packaging 11 | # ENV["BOXEN_S3_ACCESS_KEY"] = '' 12 | # ENV["BOXEN_S3_SECRET_KEY"] = '' 13 | # ENV["BOXEN_S3_BUCKET"] = '' 14 | 15 | # Auto-report issues on failed runs 16 | # ENV["BOXEN_ISSUES_ENABLED"] = 'yes' 17 | 18 | # Submit audit data to an arbitrary HTTP endpoint 19 | # ENV["BOXEN_WEB_HOOK_URL"] = 'https://some-uri.com/boxen' 20 | # 21 | # required for Github Enterprise 22 | # ENV["BOXEN_GITHUB_ENTERPRISE_URL"] = 'https://github.yourdomain.com' 23 | 24 | # required for Github Enterprise (defaults to "https://github.com/%s") 25 | # ENV['BOXEN_REPO_URL_TEMPLATE'] = 'https://github.yourdomain.com/%s' 26 | -------------------------------------------------------------------------------- /config/hiera.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # This file configures the hiera "database" for Boxen. As with most files in 3 | # this repo, it's just an example, and you should feel free to make any 4 | # changes suited to your organisation. 5 | 6 | # The defaults here should give you a solid start; put global defaults in 7 | # a file named hiera/common.yaml, and individuals can supplement and/or override 8 | # them in hiera/{github_login}.yaml 9 | 10 | :backends: 11 | - yaml 12 | :yaml: 13 | :datadir: "%{::boxen_home}/repo/hiera" 14 | :hierarchy: 15 | - "users/%{github_login}" 16 | - common 17 | 18 | # Many modules make their own hiera data available through the use of 19 | # puppet-module-data. Some depend on the 'deeper' merge_behavior setting, so 20 | # remove it at your own risk! 21 | # ... 22 | # besides the modules that use it, you might want to override deeply nested hash 23 | # values, too! 24 | :merge_behavior: deeper -------------------------------------------------------------------------------- /docs/faq.md: -------------------------------------------------------------------------------- 1 | # FAQ 2 | 3 | Below you can find common questions and answers. 4 | 5 | ### Q: Boxen Keychain Helper: Encountered error code: -25308 6 | 7 | If you run `boxen` in a session without GUI (e.g. via SSH), you will most likely need to unlock the keychain manually. 8 | 9 | ```bash 10 | security create-keychain -p $your_password $keychain_name 11 | security default-keychain -d user -s $keychain_name 12 | # if necessary.. 13 | security unlock-keychain -p $your_password # unlocks the default keychain, which boxen will use to store the token 14 | ``` 15 | 16 | ### Q: How do you uninstall an application and get it to reinstall in the application folder with boxen? 17 | 18 | When removing applications make sure to remove the corresponding `/var/db/.puppet_appdmg_installed_application` so that boxen will reinstall it. 19 | 20 | ### Q: How do you remove Boxen? 21 | 22 | Run `script/nuke` from inside the `/opt/boxen/repo` directory. 23 | 24 | ### Q: How do you upgrade your boxen from the public our-boxen? 25 | 26 | Answer distilled from http://grahamgilbert.com/blog/2014/04/04/updating-boxen/ 27 | 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: 28 | 29 | ```bash 30 | cd ~/src/our-boxen 31 | git remote add upstream https://github.com/boxen/our-boxen.git 32 | ``` 33 | Then we're going to fetch the stuff from the upstream repository: 34 | 35 | ```bash 36 | git fetch upstream 37 | ``` 38 | 39 | Now we're going to merge the updated repository with our own: 40 | 41 | ```bash 42 | git checkout master 43 | git merge upstream/master 44 | ``` 45 | 46 | Now deal with conflicts in (Puppetfile, manifests/site.pp), ignore any diffs in Puppetfile.lock and Gemfile.lock. 47 | 48 | ```bash 49 | git mergetool 50 | ``` 51 | 52 | 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: 53 | 54 | ```bash 55 | rm Puppetfile.lock Gemfile.lock 56 | bundle install --no-deployment --without development --path .bundle 57 | bundle exec librarian-puppet install --path=shared --clean 58 | ``` 59 | 60 | ### Q: What's a good approach to merging our-boxen back into my private fork? 61 | 62 | One approach is to delete the Gemfile.lock and Puppetfile.lock and run: 63 | 64 | # Regenerates Gemfile.lock and installs new Gems 65 | bundle install --without development --path .bundle 66 | 67 | # Regenerates Puppetfile.lock and caches tarballs 68 | bundle exec librarian-puppet install --path=shared --clean 69 | 70 | These will generate the respective lock files suitable for committing. Hope that helps. 71 | 72 | ### Q: Should you keep the cache of the module and gem in the repository? 73 | 74 | We recommend you to keep the files inside `vendor/cache` and `vendor/puppet/cache` inside 75 | the repository. 76 | 77 | It ends up adding a negligible amount of disk space in return for much faster runtimes 78 | for other folks on your team (since they don't have to fetch the tarballs one-by-one 79 | through the GitHub API any time a module version changes). 80 | -------------------------------------------------------------------------------- /docs/modules.md: -------------------------------------------------------------------------------- 1 | # Writing Puppet modules for Boxen 2 | 3 | Writing Puppet modules for Boxen is easy. 4 | 5 | ## Tooling 6 | 7 | * Always use Bundler 8 | * Always use librarian-puppet 9 | * Always use puppet-lint 10 | * Always use rspec-puppet 11 | 12 | ## Directory structure 13 | 14 | We follow Puppet's recommended structure very closely. 15 | Here's the directory structure from the boxen Puppet module: 16 | 17 | ``` 18 | ├── Gemfile 19 | ├── Gemfile.lock 20 | ├── README.md 21 | ├── files 22 | │   ├── README.md 23 | │   └── gemrc 24 | ├── lib 25 | │   ├── facter 26 | │   │   ├── boxen.rb 27 | │   │   └── root_encrypted.rb 28 | │   └── puppet 29 | │   ├── parser 30 | │   │   └── functions 31 | │   │   ├── file_exists.rb 32 | │   │   ├── include_all_projects.rb 33 | │   │   └── include_projects_from_boxen_cli.rb 34 | │   ├── provider 35 | │   │   ├── package 36 | │   │   │   ├── compressed_app.rb 37 | │   │   │   ├── hax.rb 38 | │   │   │   └── homebrew.rb 39 | │   │   ├── repository 40 | │   │   │   └── git.rb 41 | │   │   └── service 42 | │   │   └── ghlaunchd.rb 43 | │   └── type 44 | │   └── repository.rb 45 | ├── manifests 46 | │   ├── bin.pp 47 | │   ├── config.pp 48 | │   ├── development 49 | │   │   └── project.pp 50 | │   ├── development.pp 51 | │   ├── environment.pp 52 | │   ├── gemrc.pp 53 | │   ├── janitor.pp 54 | │   ├── osx_defaults.pp 55 | │   ├── personal.pp 56 | │   ├── profile.pp 57 | │   ├── project.pp 58 | │   ├── repo.pp 59 | │   ├── security.pp 60 | │   ├── sudoers.pp 61 | │   └── zipped_widget.pp 62 | ├── script 63 | │   ├── bootstrap 64 | │   ├── cibuild 65 | │   ├── lint 66 | │   ├── specs 67 | │   └── syntax 68 | ├── spec 69 | │   ├── classes 70 | │   │   ├── bin_spec.rb 71 | │   │   └── environment_spec.rb 72 | │   ├── fixtures 73 | │   │   ├── Puppetfile 74 | │   │   ├── Puppetfile.lock 75 | │   │   ├── manifests 76 | │   │   │   └── site.pp 77 | │   │   └── modules 78 | │   │   ├── boxen 79 | │   │   │   ├── files -> ../../../../files 80 | │   │   │   ├── lib -> ../../../../lib 81 | │   │   │   ├── manifests -> ../../../../manifests 82 | │   │   │   └── templates -> ../../../../templates 83 | │   │   └── projects 84 | │   │   └── manifests 85 | │   │   └── test.pp 86 | │   ├── spec_helper.rb 87 | │   └── unit 88 | │   └── puppet 89 | │   └── type 90 | │   └── repository_spec.rb 91 | └── templates 92 | ├── config.sh.erb 93 | ├── env.sh.erb 94 | └── gh_creds.sh.erb 95 | ``` 96 | 97 | Of note, we do not use things like `rake` to drive specs. 98 | Instead, we bias towards simple, portable shell scripts that can be consumed 99 | by other shell scripts. 100 | 101 | ## Facts and variables 102 | 103 | The core boxen module provides [a number of variables to use](https://github.com/boxen/puppet-boxen/blob/master/manifests/config.pp#L8-L21). 104 | 105 | In addition to these, you may always assume the presence of a `boxen_user` fact, 106 | which is the local user running Boxen. 107 | 108 | Other modules may provide their own globally available variables. 109 | The recommendation is to put any variables that might be consumed by 110 | multiple classes/manifests in a scoped config class 111 | (e.g. `modules/boxen/manifests/config.pp`). 112 | -------------------------------------------------------------------------------- /docs/personal-configuration.md: -------------------------------------------------------------------------------- 1 | # Personal Configuration 2 | 3 | One of the design choices of Boxen very early on was that we didn't want to 4 | dictate down to users "you can do this, but you can't do that". 5 | We do so as little as possible in the core, and we don't do it at all for 6 | per-user configurations. 7 | 8 | How? The personal manifest. 9 | 10 | ## What even is a personal manifest? 11 | 12 | Personal manifests live in `modules/people/manifests/.pp`, 13 | where `` is your GitHub username. 14 | 15 | The simplest personal manifest looks like this: 16 | 17 | ``` puppet 18 | class people::wfarr { 19 | notify { 'hello world': } 20 | } 21 | ``` 22 | 23 | Ah, the good old "Hello World". 24 | It's boring, but you can see there's really not much boilerplate involved. 25 | Let's try something *real* this time: 26 | 27 | ``` puppet 28 | class people::wfarr { 29 | include boxen::development 30 | } 31 | ``` 32 | 33 | So what does this do? 34 | It clones every repo in the Boxen org to `~/src/boxen/`. 35 | How? 36 | Well, we can refer to [the source code](https://github.com/boxen/puppet-boxen/blob/master/manifests/development.pp)! 37 | If you're new to Puppet, or are unsure of what that class is doing, check out 38 | the [intro to puppet](./puppet.md) we've put together. 39 | 40 | ## Running different code on multiple machines 41 | 42 | Puppet has conditionals and switching. 43 | Typically, the most reliable way to ensure some code runs on one machine but not 44 | others is to use the `case` statement on the `hostname` fact. 45 | Example: 46 | 47 | ``` puppet 48 | case $::hostname { 49 | 'scruffy': { 50 | notify { "I'm Scruffy. The Janitor.": } 51 | } 52 | 53 | 'bender': { 54 | notify { "My full name is Bender Bending Rodriguez": } 55 | } 56 | 57 | default: { 58 | notify { "Wha?": } 59 | } 60 | } 61 | ``` 62 | 63 | One thing to note here is that Puppet always **requires** a default path 64 | on a case statement. 65 | Default is equivalent to "anything that isn't matched above". 66 | -------------------------------------------------------------------------------- /docs/puppet.md: -------------------------------------------------------------------------------- 1 | # What is a puppet? 2 | 3 | Puppet is configuration management tool, written in Ruby, that compiles 4 | and runs code written in the Puppet language. 5 | 6 | But what does that actually mean in words a human can understand? 7 | Puppet is a tool that runs some code and that code can do all sorts of 8 | really powerful things to configure computers for you. 9 | 10 | Why do I want code mucking about with my laptop though? 11 | For the exact same reasons you want code configuring your server. 12 | In particular, homogeneity, reproducibility, reusability, and automation. 13 | When you use code to express how a machine should be configured, 14 | you know that all of your machines are configured the same way, 15 | that you can repeat that configuration any number of times, 16 | and that you don't have to do it manually each time. 17 | 18 | ## How does Puppet work? 19 | 20 | A Puppet run has two main steps: compilation and application. 21 | 22 | The compilations step starts with reading in what's called the site manifest. 23 | The site manifest is a single file that contains Puppet code that is responsible 24 | for telling the compiler what other Puppet code it should compile. 25 | 26 | Here are the first few lines of the default site manifest for Boxen: 27 | 28 | ``` 29 | include boxen::environment 30 | include homebrew 31 | include gcc 32 | ``` 33 | 34 | This tells the Puppet compiler that it must include the classes 35 | `boxen::environment`, `homebrew`, and `gcc`. 36 | Puppet will look for those classes on the modulepath. 37 | Typically, these files would be located at 38 | `$modulepath/boxen/manifests/environment.pp` and 39 | `$modulepath/homebrew/manifests/init.pp`. 40 | 41 | These might include other classes as well, or define **resources**. 42 | Resources are the building blocks of Puppet. 43 | A resource is an abstract description about a **thing** and the **state** 44 | that thing should be in. 45 | Every resource has a **type**, which is just a classification of resources. 46 | For example, we might have a resource `Package[mysql]` and its type would be 47 | `Package`. 48 | Puppet also supports multiple providers for types which act as pluggable 49 | backends depending on the operating system it's running on or the tools 50 | available on a particular system (in the case of the `Package` type, 51 | we might have providers for `yum` and for `aptget`). 52 | 53 | So now the Puppet compiler has finished tracking down and loading all the 54 | classes and resources it needs. 55 | Assuming we haven't encountered any compile-time errors, Puppet then begins 56 | the next phase of a run: applying the catalog. 57 | 58 | All of the resources Puppet has collected into the catalog have formed a 59 | DAG (directed, acyclic graph) that represents the order in which all these 60 | resources can be applied in a correct order. 61 | Puppet simply grabs the first "node" in this graph and traverses all nodes 62 | in the graph, applying each resource as it goes. 63 | 64 | Application of an individual resource starts with Puppet asking "is this 65 | resource in the state requested?" If the answer is yes, Puppet moves onto the 66 | next node and repeats this process. If the answer is no, Puppet will make 67 | whatever changes it can to reconcile the current state of the resource with 68 | what it should be, and then continues on. 69 | 70 | Once all resources have been applied, the Puppet run is complete. 71 | 72 | ## Declarative by nature 73 | 74 | One of the most confusing parts of the Puppet language to many newcomers is 75 | how the Puppet catalog orders and applies resources. 76 | The key thing to remember is that Puppet is a **declarative** language rather 77 | than a procedural one. 78 | In human words, the only order that matters in Puppet is order specified by 79 | relationships between resources. 80 | 81 | Here's an example of how someone new to Puppet might write a class: 82 | 83 | ``` puppet 84 | class mysql { 85 | file { '/etc/my.cnf': source => 'puppet:///modules/mysql/my.cnf.erb' ; } 86 | package { 'mysql': } 87 | service { 'mysql': } 88 | } 89 | ``` 90 | 91 | Someone expecting Puppet to be procedural would read this manifest as a list 92 | saying: 93 | 94 | * First create the my.cnf file 95 | * Then install the mysql package 96 | * Then start the mysql service 97 | 98 | The problem is, they would be **wrong**. 99 | There is no guarantee Puppet will apply these resources in that order, 100 | and it's quite likely that it won't. 101 | 102 | The proper way to ensure ordering in Puppet is to use one of the four 103 | **relationship metaparameters**: 104 | 105 | * before - Run this resource before another resource 106 | * notify - Same as before, but triggers a refresh on that resource 107 | * require - Run this resource after another resource 108 | * subscribe - Same as require, but triggers a refresh on that resource 109 | 110 | The behavior of these metaparameters should be pretty clear. 111 | Triggering a resource simply means that a resource will "refresh" itself. 112 | That typically means something like a `Service` resource restarting itself. 113 | It's important to remember that these metaparameters are valid on **any** resource. 114 | 115 | So, let's rewrite our example properly: 116 | 117 | ``` puppet 118 | class mysql { 119 | file { '/etc/my.cnf': 120 | source => 'puppet:///modules/mysql/my.cnf.erb', 121 | notify => Service['mysql'] 122 | } 123 | 124 | package { 'mysql': 125 | notify => Service['mysql'] 126 | } 127 | 128 | service { 'mysql': } 129 | } 130 | ``` 131 | 132 | Now we're telling Puppet what order to apply these resources in: 133 | 134 | * Make sure /etc/my.cnf is in place before we start the mysql service 135 | * If /etc/my.cnf changes, tell mysql to restart 136 | * Make sure the mysql package is in place before we start the mysql service 137 | * If the mysql package changes, tell mysql to restart 138 | 139 | It's important to note that we didn't tell Puppet if `File[/etc/my.cnf]` 140 | should come before or after `Package[mysql]`. 141 | This is intentional. 142 | Most package managers won't overwrite a configuration file that already exists 143 | at package install-time, so in this case, we can assume installing the mysql 144 | package won't clobber our custom `/etc/my.cnf` file. 145 | -------------------------------------------------------------------------------- /docs/rails.md: -------------------------------------------------------------------------------- 1 | # Using Boxen with Rails Projects 2 | 3 | Boxen is designed to work extremely well with Rails. 4 | Let's break down some of the basics: 5 | 6 | ## Project Management 7 | 8 | We make a few assumptions about how you run Rails in development for ease and consistency: 9 | 10 | * You use a web server that listens on a socket 11 | * You use environment variables and something like [dotenv](https://github.com/bkeepers/dotenv) for managing secrets 12 | 13 | A typical Rails app that uses things like MySQL, Resque, and phantomjs 14 | might have a [project definition](../modules/projects/README.md) like so: 15 | 16 | ``` puppet 17 | class projects::rails_app { 18 | include phantomjs 19 | 20 | boxen::project { 'rails_app': 21 | ruby => '1.9.3', 22 | mysql => true, 23 | redis => true, 24 | nginx => true, 25 | source => 'username/rails_app' 26 | } 27 | } 28 | ``` 29 | 30 | This does a few things for you: 31 | 32 | * Clones `https://github.com/username/rails_app.git` to `~/src/rails_app` 33 | * Ensures the default 1.9.3 version of Ruby is installed 34 | * Creates `~/src/rails_app/.ruby-version` with `1.9.3` in it 35 | * Ensures mysql is installed and running 36 | * Creates two mysql databases: `rails_app_test` and `rails_app_development` 37 | * Ensures redis is installed and running 38 | * Ensures nginx is installed and running 39 | * Copies the [template nginx config](../modules/projects/templates/shared/nginx.conf.erb) into the nginx config dir 40 | 41 | It won't necessarily do all of them in that order, but it will guarantee 42 | that if they run successfully they're all done in a correct order. 43 | 44 | See the section below for some handy configuration tips on how to configure 45 | your app best to work with Boxen. 46 | 47 | ## Configuration 48 | 49 | ### MySQL 50 | 51 | ``` yaml 52 | # config/database.yml 53 | 54 | <% 55 | socket = [ 56 | ENV["BOXEN_MYSQL_SOCKET"], 57 | "/var/run/mysql5/mysqld.sock", 58 | "/tmp/mysql.sock" 59 | ].compact.detect { |f| File.exist? f } 60 | 61 | port = ENV["BOXEN_MYSQL_PORT"] || "3306" 62 | %> 63 | 64 | development: 65 | adapter: mysql2 66 | database: rails_app_development 67 | username: root 68 | password: 69 | <% if socket %> 70 | host: localhost 71 | socket: <%= socket %> 72 | <% else %> 73 | host: 127.0.0.1 74 | port: <%= port %> 75 | <% end %> 76 | 77 | test: 78 | adapter: mysql2 79 | database: rails_app_test 80 | username: root 81 | password: 82 | <% if socket %> 83 | host: localhost 84 | socket: <%= socket %> 85 | <% else %> 86 | host: 127.0.0.1 87 | port: <%= port %> 88 | <% end %> 89 | ``` 90 | 91 | ### PostgreSQL 92 | 93 | ``` yaml 94 | # config/database.yml 95 | 96 | development: 97 | adapter: postgresql 98 | database: rails_app_development 99 | encoding: unicode 100 | port: <%= ENV["BOXEN_POSTGRESQL_PORT"] || 5432 %> 101 | host: localhost 102 | 103 | test: 104 | adapter: postgresql 105 | database: rails_app_test 106 | encoding: unicode 107 | port: <%= ENV["BOXEN_POSTGRESQL_PORT"] || 5432 %> 108 | host: localhost 109 | ``` 110 | 111 | ### Redis 112 | 113 | ``` ruby 114 | # config/initializers/redis.rb 115 | 116 | $redis = Redis.new(url: (ENV['BOXEN_REDIS_URL'] || 'redis://localhost:6379/')) 117 | ``` 118 | 119 | ### Elasticsearch 120 | 121 | ``` ruby 122 | # config/initializers/elasticsearch.rb 123 | 124 | Tire.configure do 125 | url (ENV['BOXEN_ELASTICSEARCH_URL'] || 'http://localhost:9200/') 126 | end 127 | ``` 128 | 129 | ### MongoDB 130 | 131 | ``` yaml 132 | # config/mongo.yml 133 | 134 | development: 135 | host: 127.0.0.1 136 | port: <%= ENV['BOXEN_MONGODB_PORT'] || 27017 %> 137 | database: rails_app_development 138 | 139 | test: 140 | host: 127.0.0.1 141 | port: <%= ENV['BOXEN_MONGODB_PORT'] || 27017 %> 142 | database: rails_app_test 143 | ``` 144 | 145 | ### Memcached 146 | 147 | ``` ruby 148 | # config/initializers/memcached.rb 149 | 150 | $memcached = Dalli::Client.new( 151 | ENV['BOXEN_MEMCACHED_URL'] || 'memcached://localhost:11211/' 152 | ) 153 | ``` 154 | 155 | ### Unicorn 156 | 157 | ``` ruby 158 | # config/unicorn.rb 159 | 160 | if ENV['RACK_ENV'] == 'development' 161 | worker_processes 1 162 | listen "#{ENV['BOXEN_SOCKET_DIR']}/rails_app", :backlog => 1024 163 | timeout 120 164 | end 165 | 166 | after_fork do |server, worker| 167 | ActiveRecord::Base.establish_connection if defined?(ActiveRecord) 168 | end 169 | ``` 170 | 171 | ``` shell 172 | # script/server 173 | 174 | #!/bin/sh 175 | 176 | set -e 177 | 178 | cd $(dirname "$0")/.. 179 | : ${RAILS_ENV:=development} 180 | : ${RACK_ENV:=development} 181 | 182 | export RAILS_ENV RACK_ENV 183 | 184 | bin/unicorn_rails -E "$RAILS_ENV" -c config/unicorn.rb 185 | ``` 186 | 187 | -------------------------------------------------------------------------------- /docs/updates.md: -------------------------------------------------------------------------------- 1 | # Updates 2 | 3 | When Boxen runs, it checks to see if your system matches a large set of 4 | statements (Puppet "resources"). If it doesn't, it knows how to make changes 5 | to your system to "converge" on that desired state. Those resources are all 6 | defined in Puppet `*.pp` manifest files in a git repository, github/boxen. 7 | We use a simple `git` workflow to keep those definitions up-to-date whenever 8 | you go to run Boxen. 9 | 10 | ## Where is this repository 11 | 12 | `/opt/boxen/repo`, which is also symlinked at `$HOME/src/our-boxen` for 13 | convenience. 14 | 15 | ## What does "up to date" mean? 16 | 17 | Unless you're actively working on Boxen, "up to date" means that your local 18 | working copy is on `master`, and up to date with (same revision as) 19 | `origin/master`. 20 | 21 | ## How do we keep up to date? 22 | 23 | At the earliest possible moment in a Boxen run, some checks are made to ensure 24 | that updating your working copy is going to be safe: 25 | 26 | * Are you on a non-master branch (or no branch at all)? (see `git symbolic-ref HEAD`) 27 | * Do you have any uncommitted changes? (see `git status --porcelain`) 28 | * Do you have any unpushed commits on master? (see `git log origin/master..master`) 29 | 30 | If your working copy is a "yes" to any of those checks, we won't touch a thing. 31 | Boxen will tell you why it's not going to auto-update, then offer to run Puppet 32 | with your working copy as-is. 33 | 34 | If, on the other hand, we are going to auto-update: 35 | 36 | ```sh 37 | # Get the most recent commits from upstream 38 | git fetch origin 39 | # Reset your working copy to look just like upstream's master 40 | git reset --hard origin/master 41 | git clean -qdf 42 | ``` 43 | 44 | ## Workflow tip 45 | 46 | If you're working on something in Boxen (e.g. your personal manifest, 47 | or adding a new project definition), move over to a branch. Working on 48 | a branch signals to Boxen that you're actively making changes, and that 49 | it shouldn't do things like try to auto-update, or to submit issues on 50 | failed runs. 51 | 52 | Once you're happy with your changes, the usual workflow of submitting a 53 | pull request, waiting for some review then a merge applies. Until then, 54 | you have the option of either leaving your working copy on the branch, 55 | or moving back to master and getting other updates. This should be a good 56 | incentive to get your branch merged quickly :) 57 | -------------------------------------------------------------------------------- /facts.d/example.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # Any yaml or json files in this directory may be used to set 3 | # facts. This is useful, primarily, for things like homebrew_root, 4 | # which must be a fact rather than configured with hiera because 5 | # of how Puppet's custom resource providers work. 6 | 7 | # homebrew_root: /usr/local 8 | -------------------------------------------------------------------------------- /hiera/common.yaml.example: -------------------------------------------------------------------------------- 1 | --- 2 | # This is an example of the kinds of things that you can configure via hiera. 3 | # If you've left the defaults in `/hiera.yml`, you might want to copy this file 4 | # to `hiera/common.yaml`, or feel free to start with a blank slate! 5 | 6 | # Have a gander at some of these examples to get an idea of some of the things 7 | # that you can affect 'out of the box', and then customise to your 8 | # heart's content. 9 | 10 | # See https://github.com/boxen/puppet-ruby for docs 11 | ruby::global::version: "2.2.3" 12 | ruby::build::ensure: "v20151024" 13 | ruby::rbenv_plugins: 14 | rbenv-vars: 15 | ensure: v1.0.0 16 | source: sstephenson/rbenv-vars 17 | ruby::version::alias: 18 | 2.0.0: 2.0.0-p647 19 | 20 | # See https://github.com/boxen/puppet-java for docs 21 | java::update_version: 51 22 | -------------------------------------------------------------------------------- /hiera/users/README.md: -------------------------------------------------------------------------------- 1 | # Per-user hiera configuration 2 | 3 | The example `hiera.yaml` includes an entry in the hierarchy for 4 | per-user configurations, allowing individuals to override many, many 5 | common puppet parameters for their own machines. 6 | 7 | Simply place a file in this directory named after your github 8 | login. For example, if your github login is `johndoe`, you would edit 9 | the file `johndoe.yaml` here. 10 | 11 | ## Example 12 | 13 | ```yaml 14 | boxen::personal::homebrew_packages: 15 | - pstree 16 | - htop 17 | 18 | boxen::personal::osx_apps: 19 | - google-chrome 20 | - spotify 21 | - things 22 | 23 | boxen::personal::projects: 24 | - project_a 25 | - secret_project 26 | ``` 27 | -------------------------------------------------------------------------------- /lib/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/lib/.gitkeep -------------------------------------------------------------------------------- /manifests/site.pp: -------------------------------------------------------------------------------- 1 | require boxen::environment 2 | require homebrew 3 | /* require gcc */ 4 | 5 | Exec { 6 | group => 'staff', 7 | logoutput => on_failure, 8 | user => $boxen_user, 9 | 10 | path => [ 11 | "${boxen::config::home}/rbenv/shims", 12 | "${boxen::config::home}/rbenv/bin", 13 | "${boxen::config::home}/rbenv/plugins/ruby-build/bin", 14 | "${boxen::config::homebrewdir}/bin", 15 | '/usr/bin', 16 | '/bin', 17 | '/usr/sbin', 18 | '/sbin' 19 | ], 20 | 21 | environment => [ 22 | "HOMEBREW_CACHE=${homebrew::config::cachedir}", 23 | "HOME=/Users/${::boxen_user}" 24 | ] 25 | } 26 | 27 | File { 28 | group => 'staff', 29 | owner => $boxen_user 30 | } 31 | 32 | Package { 33 | provider => homebrew, 34 | require => Class['homebrew'] 35 | } 36 | 37 | Repository { 38 | provider => git, 39 | extra => [ 40 | '--recurse-submodules' 41 | ], 42 | require => File["${boxen::config::bindir}/boxen-git-credential"], 43 | config => { 44 | 'credential.helper' => "${boxen::config::bindir}/boxen-git-credential" 45 | } 46 | } 47 | 48 | Service { 49 | provider => ghlaunchd 50 | } 51 | 52 | Homebrew::Formula <| |> -> Package <| |> 53 | 54 | node default { 55 | # core modules, needed for most things 56 | include dnsmasq 57 | include git 58 | include hub 59 | include nginx 60 | 61 | # fail if FDE is not enabled 62 | if $::root_encrypted == 'no' { 63 | fail('Please enable full disk encryption and try again') 64 | } 65 | 66 | # node versions 67 | nodejs::version { '0.8': } 68 | nodejs::version { '0.10': } 69 | nodejs::version { '0.12': } 70 | 71 | # default ruby versions 72 | ruby::version { '2.4.1': } 73 | 74 | # common, useful packages 75 | package { 76 | [ 77 | 'ack', 78 | 'findutils', 79 | 'gnu-tar' 80 | ]: 81 | } 82 | 83 | file { "${boxen::config::srcdir}/our-boxen": 84 | ensure => link, 85 | target => $boxen::config::repodir 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /modules/people/README.md: -------------------------------------------------------------------------------- 1 | # Personal Manifests 2 | 3 | Per-user manifests live in `modules/people/manifests/$login.pp`, where 4 | `$login` is a GitHub login. A simple user manifest example: 5 | 6 | ```puppet 7 | class people::jbarnette { 8 | include emacs # requires emacs module in Puppetfile 9 | include sparrow # requires sparrow module in Puppetfile 10 | 11 | $home = "/Users/${::boxen_user}" 12 | $my = "${home}/my" 13 | $dotfiles = "${my}/dotfiles" 14 | 15 | file { $my: 16 | ensure => directory 17 | } 18 | 19 | repository { $dotfiles: 20 | source => 'jbarnette/dotfiles', 21 | require => File[$my] 22 | } 23 | } 24 | ``` 25 | 26 | Note that if your GitHub username contains dashes, you should replace them by underscores in both the manifest name and the class name. 27 | 28 | ## Projects 29 | 30 | While you _can_ include projects one by one, sometimes you might just want 31 | all of them. 32 | You can do that easily with: 33 | 34 | ``` 35 | include projects::all 36 | ``` 37 | -------------------------------------------------------------------------------- /modules/people/manifests/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/modules/people/manifests/.gitkeep -------------------------------------------------------------------------------- /modules/projects/README.md: -------------------------------------------------------------------------------- 1 | # Project Manifests 2 | 3 | Project manifests live in `modules/projects/manifests/$project.pp`. A 4 | simple project manifest example: 5 | 6 | ```puppet 7 | class projects::trollin { 8 | include icu4c 9 | include phantomjs 10 | 11 | boxen::project { 'trollin': 12 | dotenv => true, 13 | elasticsearch => true, 14 | mysql => true, 15 | nginx => true, 16 | redis => true, 17 | ruby => '1.9.3', 18 | source => 'boxen/trollin' 19 | } 20 | } 21 | ``` 22 | 23 | With the above, as long as our app is configured to listen on a **socket** at 24 | `"#{ENV['BOXEN_SOCKET_DIR']}"/trollin`, you'll now be able to run its local 25 | server and visit http://trollin.dev/ to access the app in dev. 26 | 27 | Provide the full repository URL in the 'source' option when referencing 28 | code that is not hosted at github.com, such as Github Enterprise 29 | repositories. 30 | 31 | For further documentation on how to use the `boxen::project` type, 32 | take a look at the documentation in the 33 | [source](https://github.com/boxen/puppet-boxen/blob/master/manifests/project.pp#L1-L61). 34 | -------------------------------------------------------------------------------- /modules/projects/manifests/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/modules/projects/manifests/.gitkeep -------------------------------------------------------------------------------- /modules/projects/manifests/all.pp: -------------------------------------------------------------------------------- 1 | class projects::all { 2 | include_all_projects() 3 | } 4 | -------------------------------------------------------------------------------- /modules/projects/templates/shared/nginx.conf.erb: -------------------------------------------------------------------------------- 1 | upstream <%= @server_name %> { 2 | server unix:<%= scope.lookupvar "boxen::config::socketdir" %>/<%= @name %>; 3 | } 4 | 5 | server { 6 | access_log <%= scope.lookupvar "nginx::config::logdir" %>/<%= @name %>.access.log main; 7 | listen 80; 8 | root <%= @repo_dir %>/public; 9 | server_name <%= @server_name %> *.<%= @server_name %>; 10 | 11 | client_max_body_size 50M; 12 | error_page 500 502 503 504 /50x.html; 13 | 14 | location = /50x.html { 15 | root html; 16 | } 17 | 18 | try_files $uri/index.html $uri @<%= @server_name %>; 19 | location @<%= @server_name %> { 20 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 21 | proxy_set_header Host $http_host; 22 | proxy_redirect off; 23 | proxy_pass http://<%= @server_name %>; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /script/bootstrap: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Make sure all our local dependencies are available. 3 | 4 | set -e 5 | 6 | VERBOSE=1 7 | for arg in "$@"; do 8 | if [ "$arg" = "--quiet" ]; then 9 | VERBOSE=0 10 | elif [ "$arg" = "--without" ]; then 11 | WITHOUT=1 12 | fi 13 | done 14 | 15 | log() { 16 | if [ "$VERBOSE" = "1" ]; then 17 | echo "$@" 18 | fi 19 | } 20 | 21 | #Add fake group to fix GID/domain issues (https://github.com/boxen/our-boxen/issues/235) 22 | GID=`id -g` 23 | USERNAME=`id -u -nr` 24 | if !(grep $GID /etc/group >/dev/null) 25 | then 26 | echo "Looks like you have some issues with your domain and GID" 27 | echo "More details here: https://github.com/boxen/our-boxen/issues/235" 28 | read -p "Do you want to add a new GID to the group to get this to work? (y/n) " -n 1 29 | echo 30 | if [[ $REPLY =~ ^[Yy]$ ]]; then 31 | log "Adding GID ($GID) for $USERNAME into /etc/group" 32 | sudo sh -c "echo $USERNAME:*:$GID:$USERNAME >> /etc/group" 33 | log "$GID added to /etc/group!" 34 | fi 35 | fi 36 | 37 | # Put xcrun shim on PATH if on Mountain Lion 38 | set +e 39 | OSX_VERSION_CHECK=`sw_vers | grep ProductVersion | cut -f 2 -d ':' | egrep '10\.8'` 40 | if [ $? -eq 0 ]; then 41 | export PATH=$(pwd)/vendor/shims:$PATH 42 | fi 43 | set -e 44 | 45 | # Set ARCHFLAGS for XCode 5.1 so that installing some gems with 46 | # native extensions won't fail, e.g. json 47 | # See https://developer.apple.com/library/ios/releasenotes/developertools/rn-xcode/Introduction/Introduction.html 48 | set +e 49 | PATH=${PATH}:/usr/sbin 50 | CLTOOLS_VERSION_CHECK=`pkgutil --pkg-info=com.apple.pkg.CLTools_Executables | awk '/^version:/ {print $2}' | egrep -q '^5\.1' 2>/dev/null` 51 | if [ $? -eq 0 ]; then 52 | export ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future 53 | fi 54 | set -e 55 | 56 | # FIX: only sudo if gem home isn't writable 57 | (/usr/bin/gem spec bundler -v '~> 1.10.5' >/dev/null 2>&1) || { 58 | log "====> Installing bundler to system ruby" 59 | /usr/bin/sudo -p "Password for sudo to install bundler: " \ 60 | /usr/bin/gem install bundler -v '~> 1.10.5' --no-rdoc --no-ri 61 | } 62 | PATH="/Library/Ruby/bin:$(gem which bundler | sed -e 's!lib/bundler.rb!bin!'):$PATH" 63 | # Use checksums to quickly determine if we need to re-bundle 64 | PATH=${PATH}:/sbin 65 | checksum_bundle() { 66 | (((find Gemfile Gemfile.lock bin -type f) | xargs cat) && /usr/bin/ruby -v && bundle -v) | md5 67 | } 68 | 69 | write_checksum() { 70 | mkdir -p tmp 71 | checksum_bundle > tmp/bundle_checksum.txt 72 | } 73 | 74 | mkdir -p bin 75 | 76 | if [ "$1" = "--pristine" ]; then 77 | log "====> Cleaning installed gems" 78 | git clean -xdf bin/ vendor/gems/* tmp/bundle_checksum.txt 79 | shift 80 | fi 81 | 82 | if [ -z "$WITHOUT" ] && [ "$(checksum_bundle)" = "$(cat tmp/bundle_checksum.txt 2>/dev/null)" ]; then 83 | log "====> Bundle already up-to-date!" 84 | else 85 | # handle this not being a git repo (e.g. a brand new install!) 86 | if [ -d .git ]; then 87 | # always regenerate config and binstubs 88 | git clean -xdfq -- bin .bundle/config .librarian/puppet/config 89 | fi 90 | 91 | log "====> Installing gem dependencies" 92 | bundle install --binstubs bin --path .bundle --quiet "$@" && write_checksum 93 | fi 94 | 95 | # Fix the binstubs to use system ruby 96 | find bin -not -path 'bin/\.*' -type f -print0 | xargs -0 /usr/bin/sed -i '' 's|/usr/bin/env ruby|/usr/bin/ruby|g' 97 | -------------------------------------------------------------------------------- /script/boxen: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | # Run Boxen. 3 | 4 | require "pathname" 5 | 6 | if ENV["USER"] == "root" 7 | abort "Run this as a normal user, I'll sudo if I need to." 8 | end 9 | 10 | # Make sure only one boxen process runs at a time. 11 | 12 | myself = File.new __FILE__ 13 | 14 | unless myself.flock File::LOCK_EX | File::LOCK_NB 15 | abort "You're already running a boxen process! Know a patience." 16 | end 17 | 18 | # Yeah yeah, I like to be explicit. 19 | 20 | at_exit { myself.flock File::LOCK_UN } 21 | 22 | # Put us where we belong, in the root dir of our boxen repo. 23 | 24 | Dir.chdir Pathname.new(__FILE__).realpath + "../.." 25 | 26 | # Auto-update code. This is done as early as possible so that changes 27 | # to boxen support code or dependencies can be grabbed. 28 | 29 | puts "\e[0;36m--> Preparing to auto-update...\e[0m" 30 | 31 | def no_pull_arg?(arg) 32 | %w[--no-pull -h -? --help].include?(arg) || 33 | [/-service/].any? { |regex| regex.match(arg) } 34 | end 35 | 36 | def update_failed(*args) 37 | skip_auto_update(*args) 38 | 39 | puts "\e[1;31mWould you like to run Boxen anyway, without the latest updates?\e[0m [y/N]" 40 | if $stdin.gets.chomp.downcase != 'y' 41 | puts 42 | puts "Ok, bailing out!" 43 | exit 1 44 | end 45 | end 46 | 47 | def skip_auto_update(reason, long_description = nil) 48 | puts "\e[0;33m--> Skipping auto-update, #{reason}\e[0m" 49 | puts 50 | if long_description 51 | # Un-indent the long description, since it's usually come from an indented 52 | # HEREDOC style string 53 | indent = long_description.scan(/^\s*/).min_by{|l|l.length} 54 | long_description.each_line do |line| 55 | puts "\e[0m" + line.gsub(/^#{indent}/, '').chomp + "\e[0m" 56 | end 57 | puts 58 | puts "For more info on how the simple git-based updates work, have a gander at" 59 | puts "https://github.com/boxen/our-boxen/blob/master/docs/updates.md" 60 | puts 61 | end 62 | end 63 | 64 | current_branch = File.directory?('.git') ? %x(git symbolic-ref HEAD).chomp : '' 65 | 66 | if ENV["BOXEN_NO_PULL"] || ARGV.any? { |arg| no_pull_arg?(arg) } 67 | skip_auto_update "as requested" 68 | 69 | elsif !File.directory?(".git") 70 | skip_auto_update "since this isn't a git checkout yet" 71 | 72 | elsif current_branch.empty? 73 | update_failed "because your boxen checkout isn't on a branch", <<-END 74 | This is unusual, and will prevent me from updating in the future, too. 75 | 76 | Unless you know what you're doing, and expect to be in a "detached HEAD" 77 | state (which sounds quite uncomfortable!), I recommend that you do this 78 | to get sorted out: 79 | 80 | cd #{Dir.pwd} 81 | git checkout master 82 | boxen 83 | 84 | For serious, you probably don't want to run with a detached head. 85 | END 86 | 87 | elsif current_branch != "refs/heads/master" 88 | skip_auto_update "because your boxen checkout isn't on master", <<-END 89 | Working on something special, over here on a branch? That's cool! Once 90 | you're done, you'll probably want to submit a pull request and get back 91 | onto master so that you can get some sweet, sweet updates again, though. 92 | END 93 | 94 | elsif !%x(git status --porcelain).chomp.empty? 95 | update_failed "because you've got uncommitted changes:", <<-END 96 | #{%x(git status --porcelain)} 97 | Since you've got some uncommitted changes to those files, I'm 98 | going to take the safe road and not automatically update anything. 99 | If you're actively working on some Boxen, maybe you'd like to 100 | switch to a branch, rather than working on master? This way I'll 101 | know that you're trying something new, and won't do things like 102 | automatically update, or submit issues, while you're making 103 | changes. It makes everyone's life a bit easier \xE2\x9D\xA4 104 | 105 | Now, if you *weren't* expecting any changes, here's how to get 106 | back on the golden path: 107 | 108 | cd #{Dir.pwd} 109 | git reset --hard origin/master 110 | boxen 111 | END 112 | 113 | elsif !system("git fetch --quiet origin") 114 | update_failed "because running `git fetch` failed", <<-END 115 | Well that's disappointing! Are you having network trouble? Is github.com 116 | under attack? Given the potential for all sorts of boxen-y things failing 117 | without the ability to pull from github, I'm going to abort for now. 118 | 119 | Check that you can hit github, see if there are any ongoing issues with 120 | the site and/or your network, and try again ASAP! 121 | END 122 | 123 | elsif %x(git rev-list --count origin/master..master).chomp != "0" 124 | update_failed "because you have unpushed commits on master", <<-END 125 | Committing directly to master? You should be ashamed! 126 | 127 | ... 128 | 129 | It's ok, you're forgiven. But you probably want to push up your changes 130 | soon. Even better, move them to a branch, push it and open a pull request! 131 | 132 | git checkout -b my-cool-branch 133 | git push -u origin my-cool-branch 134 | git checkout master 135 | git reset --hard origin/master 136 | END 137 | 138 | elsif %x(git rev-list --count HEAD..origin/master).chomp == "0" 139 | puts "\e[0;36m--> Complete! Nothing new from upstream.\e[0m" 140 | 141 | elsif !system("git reset --hard origin/master 2>&1 >/dev/null") 142 | update_failed "because resetting to origin/master was unsuccessful" 143 | 144 | elsif !system("git clean -qdf") 145 | update_failed "because cleaning up your repo failed" 146 | 147 | else 148 | # Success! 149 | ref = %x(git log -1 --pretty=format:%h) 150 | puts "\e[0;32m--> Updated successfully to #{ref}!\e[0m" 151 | end 152 | 153 | # Make sure our local dependencies are up to date. 154 | 155 | strap = %w(script/bootstrap --quiet --deployment --local --without development --no-cache) 156 | abort "Can't bootstrap, dependencies are outdated." unless system *strap 157 | 158 | # Set up our local configuration, deps, and load path. 159 | 160 | load "config/basic.rb" 161 | require "boxen/cli" 162 | 163 | # Okay, let's run this thing. 164 | 165 | exit Boxen::CLI.run ARGV 166 | -------------------------------------------------------------------------------- /script/boxen-bootstrap: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # Make sure a project's deps are up-to-date. 3 | 4 | if File.executable? "script/bootstrap" 5 | exec "script/bootstrap", *ARGV 6 | end 7 | -------------------------------------------------------------------------------- /script/boxen-git-credential: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | # Provide git credentials using Boxen's config. 3 | 4 | unless command = ARGV[0] 5 | this = File.basename $0 6 | abort "Usage: #{this} " 7 | end 8 | 9 | require "pathname" 10 | 11 | # It's a UTF-8, UTF-8, UTF-8 world. 12 | 13 | Encoding.default_external = Encoding::UTF_8 if RUBY_VERSION > "1.9" 14 | 15 | credential = `/usr/bin/which git-credential-osxkeychain`.chomp 16 | 17 | # Put us where we belong, in the root dir of our boxen repo. 18 | 19 | Dir.chdir Pathname.new(__FILE__).realpath + "../.." 20 | 21 | # Because we can be called from inside other Ruby processes, unset any 22 | # `BUNDLE_` environment variables. 23 | 24 | ENV.keys.select { |k| /^BUNDLE_/i }.each { |k| ENV.delete k } 25 | 26 | # Set up our local configuration, deps, and load path. 27 | 28 | load "config/basic.rb" 29 | require "boxen/config" 30 | 31 | config = Boxen::Config.load 32 | input = $stdin.read 33 | attrs = Hash[input.split($/).map { |l| l.split("=", 2) }] 34 | # find GitHub or GitHub Enterprise host 35 | ghhost = URI(config.ghurl).host 36 | 37 | host_exp = Regexp.new "(^|\.)" + Regexp.escape(ghhost) 38 | if command == "get" && host_exp.match(attrs["host"]) 39 | puts "username=#{config.token}" 40 | puts "password=x-oauth-basic" 41 | else 42 | require "open4" 43 | 44 | fallback = ENV["BOXEN_GIT_CREDENTIAL_FALLBACK"] 45 | fallback ||= credential 46 | 47 | status = Open4.popen4 fallback, *ARGV do |pid, stdin, stdout, stderr| 48 | stdin.write input 49 | stdin.puts 50 | 51 | $stdout.write stdout.read 52 | end 53 | 54 | exit status.exitstatus 55 | end 56 | -------------------------------------------------------------------------------- /script/boxen-my-config: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # Show the path to your manifest in Boxen, creating if necessary. 3 | 4 | user = ENV["BOXEN_GITHUB_LOGIN"] 5 | 6 | unless user 7 | abort "BOXEN_GITHUB_LOGIN is not defined. Please re-run Boxen." 8 | end 9 | 10 | editor = ENV["VISUAL"] || ENV["EDITOR"] 11 | home = ENV["BOXEN_HOME"] + "/repo" 12 | user = user.downcase.tr('-', '_') 13 | path = "#{home}/modules/people/manifests/#{user}.pp" 14 | 15 | unless File.exist? path 16 | File.open path, "wb" do |f| 17 | f.puts "class people::#{user} {" 18 | f.puts "}" 19 | end 20 | end 21 | 22 | exec([editor, path].join(' ')) if editor && system("test -t 1") 23 | 24 | puts path 25 | -------------------------------------------------------------------------------- /script/nuke: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | 3 | require "optparse" 4 | 5 | unless ENV["USER"] == "root" 6 | exec "sudo", $0, *ARGV 7 | end 8 | 9 | all = false 10 | force = false 11 | opt = false 12 | services = false 13 | receipts = false 14 | gitconfig = false 15 | homebrew_config = false 16 | 17 | OptionParser.new do |o| 18 | o.banner = "Remove traces of Boxen from your machine." 19 | 20 | o.on("--all", "Remove everything possible.") { all = true } 21 | o.on("--force", "Actually do it.") { force = true } 22 | o.on("--help", "Show this help.") { abort o.to_s } 23 | o.on("--opt", "Remove /opt/boxen.") { opt = true } 24 | o.on("--services", "Remove and unload services.") { services = true } 25 | o.on("--receipts", "Remove package receipts used by Puppet.") { receipts = true } 26 | o.on("--gitconfig", "Remove Boxen-provided git credential helper config.") { gitconfig = true } 27 | o.on("--homebrew-config", "Remove Boxen managed Homebrew package configuration files.") { homebrew_config = true } 28 | 29 | o.parse! 30 | 31 | abort o.to_s unless all || opt || services || receipts || gitconfig || homebrew_config 32 | end 33 | 34 | unless force 35 | warn "** I won't actually do anything unless you pass --force." 36 | end 37 | 38 | if all || services 39 | boxen_services = [] 40 | boxen_services << Dir["/Library/Launch*/dev.*.plist"] 41 | 42 | boxen_services.flatten.each do |plist| 43 | warn "-> Removing #{plist}." 44 | 45 | if force 46 | system "launchctl", "unload", "-w", plist 47 | system "rm", "-f", plist 48 | end 49 | end 50 | 51 | system "rm", "-f", "/etc/resolver/dev" 52 | end 53 | 54 | if all || opt 55 | warn "-> Removing /opt/boxen." 56 | system "rm", "-rf", "/opt/boxen", "/usr/local/Library/Taps/boxen" if force 57 | end 58 | 59 | if all || receipts 60 | warn "-> Removing /var/db/.puppet_*." 61 | # can't use a bare system call here, because we need globbing. 62 | system 'sh -c "rm -rf /var/db/.puppet_*"' if force 63 | end 64 | 65 | if all || gitconfig 66 | warn "-> Removing git credential helper config." 67 | system "/usr/bin/git", "config", "--global", "--unset", "credential.helper" 68 | end 69 | 70 | if all || homebrew_config 71 | %w(/opt/boxen/config /usr/local/etc/boxen).each do |homebrew_path| 72 | if File.exist? homebrew_path 73 | warn "-> Removing Boxen managed Homebrew package configuration files from #{homebrew_path}" 74 | system "rm", "-rf", homebrew_path if force 75 | end 76 | end 77 | end 78 | -------------------------------------------------------------------------------- /script/sync: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | # Sync binary snapshots to S3. 3 | 4 | require "pathname" 5 | require "tempfile" 6 | require "base64" 7 | 8 | # Put us where we belong, in the root dir of our boxen repo. 9 | 10 | Dir.chdir Pathname.new(__FILE__).realpath + "../.." 11 | 12 | # Make sure our local dependencies are up to date. 13 | 14 | abort "Sorry, can't bootstrap." unless system "script/bootstrap --without ''" 15 | 16 | # Set up our local configuration, deps, and load path. 17 | 18 | load "config/basic.rb" 19 | 20 | require "aws-sdk-core" 21 | require "boxen/config" 22 | 23 | @access_key = ENV["BOXEN_S3_ACCESS_KEY"] 24 | @secret_key = ENV["BOXEN_S3_SECRET_KEY"] 25 | @bucket_name = ENV["BOXEN_S3_BUCKET"] || "boxen-downloads" 26 | @region = ENV["BOXEN_S3_REGION"] || "us-east-1" 27 | 28 | unless @access_key && @secret_key && @bucket_name 29 | abort "Please set the BOXEN_S3_{ACCESS_KEY,SECRET_KEY} env vars." 30 | end 31 | 32 | def os 33 | @os ||= `sw_vers -productVersion`.strip.split(".")[0..1].join(".") 34 | end 35 | 36 | def s3 37 | @s3 ||= Aws::S3::Client.new( 38 | access_key_id: @access_key, 39 | secret_access_key: @secret_key, 40 | region: @region 41 | ) 42 | end 43 | 44 | def config 45 | @config ||= Boxen::Config.load 46 | end 47 | 48 | def homebrew_cellar 49 | cellar ||= "#{ENV['HOMEBREW_ROOT'] || File.join(config.homedir, 'homebrew')}/Cellar" 50 | end 51 | 52 | def object_exists?(key) 53 | puts "Testing for #{key}" 54 | begin 55 | s3.head_object(bucket: @bucket_name, key: key) 56 | rescue Aws::S3::Errors::NoSuchKey, Aws::S3::Errors::NotFound 57 | # aws-sdk-core documentation claims that head_object will raise 58 | # NoSuchKey, but it seems to raise NotFound. We'll catch both for 59 | # now, as I suspect later versions will fix this 60 | false 61 | end 62 | end 63 | 64 | # Keep in sync with same-named functions in: 65 | # https://github.com/boxen/puppet-homebrew/blob/master/files/boxen-bottle-hooks.rb 66 | # https://github.com/boxen/puppet-ruby/blob/master/lib/puppet/provider/ruby/rubybuild.rb 67 | def s3_cellar 68 | case homebrew_cellar.to_s 69 | when "/opt/boxen/homebrew/Cellar" then "" 70 | when "/usr/local/Cellar" then "default/" 71 | else "#{Base64.strict_encode64(HOMEBREW_CELLAR.to_s)}/" 72 | end 73 | end 74 | 75 | def sync_brew(name, version) 76 | path = "homebrew/#{s3_cellar}#{os}/#{name}-#{version}.tar.bz2" 77 | return if object_exists?(path) 78 | 79 | dir = "#{name}/#{version}" 80 | receipt = IO.read "#{homebrew_cellar}/#{dir}/INSTALL_RECEIPT.json" 81 | json = JSON.parse receipt 82 | if json["poured_from_bottle"] 83 | puts "Skipping #{name} #{version}: installed from a Homebrew bottle" 84 | return 85 | elsif !json["built_as_bottle"] 86 | puts "Skipping #{name} #{version}: not built as a bottle" 87 | puts "Please set the HOMEBREW_BUILD_BOTTLE env var and reinstall." 88 | return 89 | end 90 | 91 | tempfile = Tempfile.new "homebrew" 92 | begin 93 | printf "Snapshotting #{name} #{version}... " 94 | $stdout.flush 95 | 96 | Dir.chdir(homebrew_cellar) do 97 | system "tar", "-cjf", tempfile.path, dir 98 | puts "done." 99 | end 100 | 101 | printf "Shipping #{name} #{version} to S3... " 102 | $stdout.flush 103 | 104 | File.open(tempfile, "r") do |tarball| 105 | s3.put_object(bucket: @bucket_name, key: path, acl: "public-read", body: tarball) 106 | end 107 | puts "done." 108 | ensure 109 | tempfile.unlink 110 | end 111 | end 112 | 113 | def sync_ruby(version) 114 | s3_key = "rubies/Darwin/#{s3_cellar}#{os}/#{version}.tar.bz2" 115 | tempfile = Tempfile.new "boxen-ruby" 116 | 117 | return if object_exists?(s3_key) 118 | 119 | printf "Snapshotting ruby #{version}... " 120 | $stdout.flush 121 | 122 | Dir.chdir("/opt/rubies") do 123 | system "tar", "-cjf", tempfile.path, version 124 | end 125 | puts "done." 126 | 127 | printf "Shipping ruby #{version} to S3... " 128 | $stdout.flush 129 | 130 | File.open(tempfile, "r") do |tarball| 131 | puts "s3.put_object(#{{bucket: @bucket_name, key: s3_key, acl: "public-read", body: tarball}.inspect})" 132 | s3.put_object(bucket: @bucket_name, key: s3_key, acl: "public-read", body: tarball) 133 | end 134 | puts "done." 135 | end 136 | 137 | def sync_node(version) 138 | s3_key = "nodes/Darwin/#{os}/#{version}.tar.bz2" 139 | tempfile = Tempfile.new "boxen-nodejs" 140 | 141 | return if object_exists?(s3_key) 142 | 143 | printf "Snapshotting node #{version}... " 144 | $stdout.flush 145 | 146 | Dir.chdir("/opt/nodes") do 147 | system "tar", "-cjf", tempfile.path, version 148 | end 149 | puts "done." 150 | 151 | printf "Shipping node #{version} to S3... " 152 | $stdout.flush 153 | 154 | File.open(tempfile, "r") do |tarball| 155 | puts "s3.put_object(#{{bucket: @bucket_name, key: s3_key, acl: "public-read", body: tarball}.inspect})" 156 | s3.put_object(bucket: @bucket_name, key: s3_key, acl: "public-read", body: tarball) 157 | end 158 | puts "done." 159 | end 160 | 161 | def sync_homebrew_packages 162 | Dir.chdir(homebrew_cellar) do 163 | Dir["*/*"].each do |dir| 164 | name, version = File.split dir 165 | sync_brew name, version 166 | end 167 | end 168 | end 169 | 170 | def sync_rubies 171 | Dir.chdir "/opt/rubies" do 172 | Dir["*"].each do |dir| 173 | next if File.symlink? dir 174 | sync_ruby File.split(dir).last 175 | end 176 | end 177 | end 178 | 179 | def sync_nodes 180 | Dir.chdir "/opt/nodes" do 181 | Dir["*"].each do |dir| 182 | next if File.symlink? dir 183 | sync_node File.split(dir).last 184 | end 185 | end 186 | end 187 | 188 | if ARGV.include? "--help" or ARGV.include? "-h" 189 | $stderr.puts "Usage: #{$0} [-h|--help] [1.9.3-p448] [emacs/24.3-boxen2]" 190 | $stderr.puts 191 | $stderr.puts "When no arguments are specified, sync everything. You can alternatively" 192 | $stderr.puts "sync a single package by either specifying a ruby version (eg `1.9.3-p448`)" 193 | $stderr.puts "or a specific homebrew package (eg `emacs/24.3-boxen2`)." 194 | exit 1 195 | elsif ARGV[0].nil? 196 | # sync everything 197 | sync_homebrew_packages 198 | sync_rubies 199 | sync_nodes 200 | else 201 | package, version = ARGV[0].split("/") 202 | 203 | if version 204 | sync_brew package, version 205 | else 206 | sync_ruby package 207 | end 208 | end 209 | -------------------------------------------------------------------------------- /shared/README.md: -------------------------------------------------------------------------------- 1 | # Shared Puppet Modules 2 | 3 | This module directory is managed by librarian-puppet. 4 | -------------------------------------------------------------------------------- /spec/localhost/cli_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | # describe 'script/nuke' do 4 | # describe command('/opt/boxen/repo/script/nuke --help') do 5 | # its(:stdout) { should include '--all' } 6 | # its(:stdout) { should include '--force' } 7 | # its(:stdout) { should include '--opt' } 8 | # its(:stdout) { should include '--services' } 9 | # its(:stdout) { should include '--receipts' } 10 | # its(:stdout) { should include '--gitconfig' } 11 | # its(:stdout) { should include '--homebrew-config' } 12 | # end 13 | 14 | # describe '--homebrew-config' do 15 | # it "cleans out $HOMEBREW_ROOT" do 16 | # creation_command_exit_status = command('touch $HOMEBREW_ROOT/etc/boxen/service.config').exit_status 17 | # cleanup_command_exit_status = command('/opt/boxen/repo/script/nuke --force --homebrew-config').exit_status 18 | # file_count_stdout = command('find $HOMEBREW_ROOT/etc/boxen -type f | wc -l').stdout.strip 19 | 20 | # expect(creation_command_exit_status).to eq(0) 21 | # expect(cleanup_command_exit_status).to eq(0) 22 | # expect(file_count_stdout).to eq("0") 23 | # end 24 | # end 25 | # end 26 | -------------------------------------------------------------------------------- /spec/localhost/directories_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe file('/opt/boxen/repo') do 4 | it { should be_directory } 5 | end 6 | 7 | describe 'Boxen managed configuration files' do 8 | describe file('/usr/local/etc/boxen') do 9 | it { should be_directory } 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /spec/localhost/git_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe package('git') do 4 | it { should be_installed } 5 | end 6 | -------------------------------------------------------------------------------- /spec/localhost/hub_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe package('hub') do 4 | it { should be_installed } 5 | end 6 | -------------------------------------------------------------------------------- /spec/localhost/packages_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | %w(ack findutils gnu-tar).each do |package_name| 4 | describe package(package_name) do 5 | it { should be_installed } 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /spec/localhost/services/dnsmasq_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'dnsmasq' do 4 | describe file('/usr/local/etc/boxen/dnsmasq') do 5 | it { should be_directory } 6 | end 7 | 8 | describe file('/usr/local/etc/boxen/dnsmasq/dnsmasq.conf') do 9 | it { should be_file } 10 | end 11 | 12 | describe file('/opt/boxen/data/dnsmasq') do 13 | it { should be_directory } 14 | end 15 | 16 | describe file('/opt/boxen/log/dnsmasq') do 17 | it { should be_directory } 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /spec/localhost/services/nginx_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'nginx' do 4 | describe file('/usr/local/etc/boxen/nginx') do 5 | it { should be_directory } 6 | end 7 | 8 | describe file('/usr/local/etc/boxen/nginx/sites') do 9 | it { should be_directory } 10 | end 11 | 12 | describe file('/usr/local/etc/boxen/nginx/public') do 13 | it { should be_directory } 14 | end 15 | 16 | describe file('/usr/local/etc/boxen/nginx/nginx.conf') do 17 | it { should be_file } 18 | end 19 | 20 | describe file('/opt/boxen/log/nginx') do 21 | it { should be_directory } 22 | end 23 | 24 | describe file('/opt/boxen/data/nginx') do 25 | it { should be_directory } 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'serverspec' 2 | 3 | set :backend, :exec 4 | -------------------------------------------------------------------------------- /vendor/cache/CFPropertyList-2.2.8.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/CFPropertyList-2.2.8.gem -------------------------------------------------------------------------------- /vendor/cache/addressable-2.3.8.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/addressable-2.3.8.gem -------------------------------------------------------------------------------- /vendor/cache/ansi-1.5.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/ansi-1.5.0.gem -------------------------------------------------------------------------------- /vendor/cache/aws-sdk-core-2.0.46.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/aws-sdk-core-2.0.46.gem -------------------------------------------------------------------------------- /vendor/cache/boxen-2.9.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/boxen-2.9.0.gem -------------------------------------------------------------------------------- /vendor/cache/builder-3.2.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/builder-3.2.2.gem -------------------------------------------------------------------------------- /vendor/cache/deep_merge-1.0.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/deep_merge-1.0.1.gem -------------------------------------------------------------------------------- /vendor/cache/diff-lcs-1.2.5.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/diff-lcs-1.2.5.gem -------------------------------------------------------------------------------- /vendor/cache/facter-2.4.4-universal-darwin.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/facter-2.4.4-universal-darwin.gem -------------------------------------------------------------------------------- /vendor/cache/faraday-0.9.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/faraday-0.9.2.gem -------------------------------------------------------------------------------- /vendor/cache/hiera-1.3.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/hiera-1.3.4.gem -------------------------------------------------------------------------------- /vendor/cache/highline-1.6.21.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/highline-1.6.21.gem -------------------------------------------------------------------------------- /vendor/cache/jmespath-1.0.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/jmespath-1.0.2.gem -------------------------------------------------------------------------------- /vendor/cache/json-2.1.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/json-2.1.0.gem -------------------------------------------------------------------------------- /vendor/cache/json_pure-1.8.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/json_pure-1.8.2.gem -------------------------------------------------------------------------------- /vendor/cache/librarian-0.1.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/librarian-0.1.2.gem -------------------------------------------------------------------------------- /vendor/cache/librarian-puppet-1.0.9.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/librarian-puppet-1.0.9.gem -------------------------------------------------------------------------------- /vendor/cache/metaclass-0.0.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/metaclass-0.0.4.gem -------------------------------------------------------------------------------- /vendor/cache/mocha-1.1.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/mocha-1.1.0.gem -------------------------------------------------------------------------------- /vendor/cache/multi_json-1.11.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/multi_json-1.11.0.gem -------------------------------------------------------------------------------- /vendor/cache/multipart-post-2.0.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/multipart-post-2.0.0.gem -------------------------------------------------------------------------------- /vendor/cache/net-scp-1.2.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/net-scp-1.2.1.gem -------------------------------------------------------------------------------- /vendor/cache/net-ssh-2.9.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/net-ssh-2.9.2.gem -------------------------------------------------------------------------------- /vendor/cache/net-telnet-0.1.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/net-telnet-0.1.1.gem -------------------------------------------------------------------------------- /vendor/cache/octokit-2.7.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/octokit-2.7.2.gem -------------------------------------------------------------------------------- /vendor/cache/open4-1.3.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/open4-1.3.4.gem -------------------------------------------------------------------------------- /vendor/cache/puppet-3.7.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/puppet-3.7.1.gem -------------------------------------------------------------------------------- /vendor/cache/puppet-lint-0.3.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/puppet-lint-0.3.2.gem -------------------------------------------------------------------------------- /vendor/cache/puppetlabs_spec_helper-0.4.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/puppetlabs_spec_helper-0.4.1.gem -------------------------------------------------------------------------------- /vendor/cache/rake-10.3.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/rake-10.3.2.gem -------------------------------------------------------------------------------- /vendor/cache/rspec-3.2.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/rspec-3.2.0.gem -------------------------------------------------------------------------------- /vendor/cache/rspec-core-3.2.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/rspec-core-3.2.3.gem -------------------------------------------------------------------------------- /vendor/cache/rspec-expectations-3.2.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/rspec-expectations-3.2.1.gem -------------------------------------------------------------------------------- /vendor/cache/rspec-its-1.2.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/rspec-its-1.2.0.gem -------------------------------------------------------------------------------- /vendor/cache/rspec-mocks-3.2.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/rspec-mocks-3.2.1.gem -------------------------------------------------------------------------------- /vendor/cache/rspec-puppet-1.0.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/rspec-puppet-1.0.1.gem -------------------------------------------------------------------------------- /vendor/cache/rspec-support-3.2.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/rspec-support-3.2.2.gem -------------------------------------------------------------------------------- /vendor/cache/sawyer-0.5.5.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/sawyer-0.5.5.gem -------------------------------------------------------------------------------- /vendor/cache/serverspec-2.37.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/serverspec-2.37.2.gem -------------------------------------------------------------------------------- /vendor/cache/sfl-2.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/sfl-2.3.gem -------------------------------------------------------------------------------- /vendor/cache/specinfra-2.66.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/specinfra-2.66.3.gem -------------------------------------------------------------------------------- /vendor/cache/thor-0.20.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/cache/thor-0.20.0.gem -------------------------------------------------------------------------------- /vendor/puppet/cache/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/.gitkeep -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-autoconf-1.0.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-autoconf-1.0.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-boxen-3.13.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-boxen-3.13.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-brewcask-0.0.10.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-brewcask-0.0.10.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.3.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.3.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-dnsmasq-2.0.4.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-foreman-1.2.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-foreman-1.2.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-gcc-3.0.2.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-gcc-3.0.2.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-git-2.13.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-git-2.13.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-go-2.1.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-go-2.1.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-homebrew-2.2.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-homebrew-2.2.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-hub-1.4.5.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-hub-1.4.5.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-inifile-0.0.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-inifile-0.0.1.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-nginx-1.9.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-nginx-1.9.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-nodejs-5.0.9.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-nodejs-5.0.9.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-nvm-1.0.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-nvm-1.0.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-openssl-1.0.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-openssl-1.0.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-phantomjs-3.0.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-phantomjs-3.0.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-pkgconfig-1.0.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-pkgconfig-1.0.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-rbenv-0.1.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-rbenv-0.1.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-repository-2.4.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-repository-2.4.1.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-ruby-8.6.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-ruby-8.6.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-sudo-1.0.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-sudo-1.0.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/boxen-puppet-xquartz-1.2.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/boxen-puppet-xquartz-1.2.1.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/puppetlabs-puppetlabs-inifile-1.4.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/puppetlabs-puppetlabs-inifile-1.4.1.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/puppetlabs-puppetlabs-stdlib-4.7.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/puppetlabs-puppetlabs-stdlib-4.7.0.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/cache/ripienaar-puppet-module-data-0.0.4.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/cache/ripienaar-puppet-module-data-0.0.4.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/.gitkeep -------------------------------------------------------------------------------- /vendor/puppet/source/20ee2f742d66e40fc34e9727fcd41b5854a86fe6.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/20ee2f742d66e40fc34e9727fcd41b5854a86fe6.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/4354afb53b59956dc85a49d267e2cadac62a3d4c.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/4354afb53b59956dc85a49d267e2cadac62a3d4c.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/7beaf6bd48cbd429e0325758b67846d137aba06f.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/7beaf6bd48cbd429e0325758b67846d137aba06f.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/88d9d4930c3c754aed4e06d2f10247e61ba3db7d.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/88d9d4930c3c754aed4e06d2f10247e61ba3db7d.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/920d6b42c68603ffdc12427c93e1d647e8624fdd.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/920d6b42c68603ffdc12427c93e1d647e8624fdd.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/9332672d5396ea9d1c7f28ed70829d5dfb628d7d.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/9332672d5396ea9d1c7f28ed70829d5dfb628d7d.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/abc7639a1e266cebbe37e4cd443c3b247e3832d7.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/abc7639a1e266cebbe37e4cd443c3b247e3832d7.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/bdc179a75ff935cca77142332ac91ed69d663750.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/bdc179a75ff935cca77142332ac91ed69d663750.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/c70468aa3e348cac81b18f7116ef6641ea8142c6.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/c70468aa3e348cac81b18f7116ef6641ea8142c6.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/d32d778e8cf7062d87c470b2eecde3947ec74edd.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/d32d778e8cf7062d87c470b2eecde3947ec74edd.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/dfcaffd5380c379b22058758948112ca20682337.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/dfcaffd5380c379b22058758948112ca20682337.tar.gz -------------------------------------------------------------------------------- /vendor/puppet/source/f0ce0a77db592eb8c646322a9339f4585459acf0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boxen/our-boxen/d277dd3dfcffd1024d3165bfd52e39542b3fc2e5/vendor/puppet/source/f0ce0a77db592eb8c646322a9339f4585459acf0.tar.gz -------------------------------------------------------------------------------- /vendor/shims/xcrun: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # A noop xcrun for initial Boxen runs. 3 | 4 | exec "$@" 5 | --------------------------------------------------------------------------------