Skip to content

Instantly share code, notes, and snippets.

@dmarquezbh
Last active October 22, 2016 15:57
Show Gist options
  • Save dmarquezbh/526335184cdcd2abb5b2 to your computer and use it in GitHub Desktop.
Save dmarquezbh/526335184cdcd2abb5b2 to your computer and use it in GitHub Desktop.
Fancybox DAAS - Devbox As A Service
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'vagrant'
# Monkey patch VirtualBox provider to be able to remap shared folders after reboot.
module VagrantPlugins
module ProviderVirtualBox
module Action
class RemountSyncedFolders < SyncedFolders
def initialize(app,env)
super(app, env)
end
def call(env)
@env = env
@app.call(env)
folders = synced_folders(env[:machine])
folders.each do |impl_name, fs|
plugins[impl_name.to_sym][0].new.enable(env[:machine], fs, impl_opts(impl_name, env))
end
end
end
def self.action_remount_synced_folders
Vagrant::Action::Builder.new.tap do |b|
b.use RemountSyncedFolders
end
end
end
end
end
class RebootPlugin < Vagrant.plugin("2")
name "Reboot Plugin"
provisioner "reboot" do
class RebootProvisioner < Vagrant.plugin("2", :provisioner)
def initialize(machine, config)
super
end
def configure(root_config)
super(root_config)
end
def provision
command = 'shutdown -r now'
@machine.ui.info("Issuing command: #{command}")
@machine.communicate.sudo(command) do |type, data|
if type == :stderr
@machine.ui.error(data);
end
end
begin
sleep 10
end until @machine.communicate.ready?
@machine.action('remount_synced_folders')
end
def cleanup
super
end
end
RebootProvisioner
end
end
unless Vagrant.has_plugin?("vagrant-docker-compose")
puts "Install plugin vagrant-docker-compose first: vagrant plugin install vagrant-docker-compose"
exit
end
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
#config.vm.hostname = "fancybox"
config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'" # fix for warning messages
config.vm.synced_folder "../data", "/vagrant_data", create: true
config.ssh.forward_agent = true
config.ssh.forward_x11 = true
config.vm.provider "virtualbox" do |vb|
host = RbConfig::CONFIG['host_os']
# Give VM 1/2 system memory & access to all cpu cores on the host
if host =~ /darwin/
cpus = `sysctl -n hw.ncpu`.to_i
# sysctl returns Bytes and we need to convert to MB
mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024 / 2
vb.customize ["modifyvm", :id, '--audio', 'coreaudio', '--audiocontroller', 'hda']
elsif host =~ /linux/
cpus = `nproc`.to_i
# meminfo shows KB and we need to convert to MB
mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 / 4
else
cpus = 2
mem = 1024
end
vb.memory = mem
vb.gui = true if ENV['GUI']
vb.cpus = cpus
vb.customize ['modifyvm', :id, '--usb', 'on']
vb.customize ["modifyvm", :id, "--graphicscontroller", "vboxvga"]
vb.customize ["modifyvm", :id, "--accelerate3d", "on"]
vb.customize ["modifyvm", :id, "--ioapic", "on"]
vb.customize ["modifyvm", :id, "--vram", "128"]
vb.customize ["modifyvm", :id, "--pae", "on"]
vb.customize ["modifyvm", :id, "--chipset", "ich9"]
vb.customize ["modifyvm", :id, "--hwvirtex", "on"]
end
for i in 3000..3010
config.vm.network "forwarded_port", guest: i, host: i, auto_correct: true
end
config.vm.network "forwarded_port", guest: 5000, host: 3011, auto_correct: true
config.vm.network "forwarded_port", guest: 8888, host: 3012, auto_correct: true
config.vm.network "forwarded_port", guest: 8080, host: 3013, auto_correct: true
config.vm.network "forwarded_port", guest: 9000, host: 3014, auto_correct: true
config.vm.network "forwarded_port", guest: 22, host: 2222, host_ip: "0.0.0.0", id: "ssh", auto_correct: true
$swap = <<-SCRIPT
dd if=/dev/zero of=/swapfile bs=1024 count=2097152
mkswap /swapfile
swapon /swapfile
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
SCRIPT
$packages = <<-SCRIPT
HOST=`hostname`
key=`perl -e 'srand; printf int(rand(100000000000000000))'`
key=$key$key
xauth add ${HOST}/unix:0 . $key
sudo apt-get update
sudo apt-get -y install curl git wget tmux unzip build-essential
sudo apt-get -y autoremove
git config --global url."https://".insteadOf git://
git config --global url."https://github.com/".insteadOf git@github.com:
test -f /vagrant/apps && exit
mkdir -p /vagrant/apps
SCRIPT
$vim = <<-SCRIPT
sudo apt-get -y install vim
test -f ~/.vimrc && exit
mkdir -p ~/.vim/autoload ~/.vim/bundle
curl -LSso ~/.vim/autoload/pathogen.vim https://raw.githubusercontent.com/tpope/vim-pathogen/master/autoload/pathogen.vim
echo "execute pathogen#infect()
syntax on
filetype plugin indent on
Helptags
set autoindent
set smartindent
set expandtab
set shiftwidth=2
set softtabstop=2
set nu
set background=dark
" > ~/.vimrc
cd ~/.vim/bundle
git clone https://github.com/tpope/vim-rails
git clone https://github.com/tpope/vim-bundler
git clone https://github.com/vim-scripts/dbext.vim
git clone https://github.com/elixir-lang/vim-elixir.git ~/.vim/bundle/vim-elixir
git clone https://github.com/lambdatoast/elm.vim.git
SCRIPT
$nodejs = <<-SCRIPT
curl -so- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
echo "source /home/vagrant/.nvm/nvm.sh" >> /home/vagrant/.profile
source /home/vagrant/.profile
nvm install stable
nvm alias default stable
sudo apt-get -y install libfontconfig
if [ -z ${http_proxy+x} ]; then echo "proxy is unset"; else npm config set proxy $http_proxy; fi
if [ -z ${http_proxy+x} ]; then echo "proxy is unset"; else npm config set https-proxy $http_proxy; fi
npm install -g phantomjs
npm install -g yo
npm install -g bower
npm install -g grunt-cli
npm install -g gulp
npm install -g brunch
npm install -g generator-polymer
npm install -g elm
SCRIPT
$java = <<-SCRIPT
sudo apt-get -y install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections
sudo apt-get -qq install oracle-java8-installer
sudo sh -c 'echo "export JAVA_HOME=/usr/lib/jvm/java-8-oracle" >> /etc/environment'
sudo -E apt-get -qq install ant
sudo sh -c 'echo "export ANT_HOME=/usr/share/ant/bin" >> /etc/environment'
SCRIPT
$docker = <<-SCRIPT
usermod -aG docker vagrant
if [ -z "$(grep "cgroup_enable=memory swapaccount=1" /etc/default/grub)" ]; then
sed -Ei \'s/^(GRUB_CMDLINE_LINUX)=.+/\\1="cgroup_enable=memory swapaccount=1 quiet"/\' /etc/default/grub
fi
update-grub
SCRIPT
$heroku = <<-SCRIPT
wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh
SCRIPT
$rails = <<-SCRIPT
echo "gem: --no-document" > /home/vagrant/.gemrc
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
curl -sSL https://get.rvm.io | bash -s stable --rails
source /home/vagrant/.rvm/scripts/rvm
gem install cucumber rspec em-proxy volt
SCRIPT
$meteor = <<-SCRIPT
curl -s https://install.meteor.com/ | sh
SCRIPT
$aspnet = <<-SCRIPT
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
sudo apt-get -y install automake libtool mono-complete
curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | sudo tar zxfv - -C /usr/local/src > /dev/null 2>&1
cd /usr/local/src/libuv-1.4.2
sudo sh autogen.sh
sudo ./configure
sudo make
sudo make install
sudo rm -rf /usr/local/src/libuv-1.4.2 && cd ~/
sudo ldconfig
curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
yes | certmgr -ssl -m https://go.microsoft.com https://myget.org https://nuget.org
mozroots --import --sync --quiet
dnvm upgrade
SCRIPT
$welcome = <<-SCRIPT
echo cd \/vagrant\/apps > /home/vagrant/.bashrc
rm -rf /etc/motd
echo Fancybox DAAS - Devbox As A Service >> /etc/motd
echo +++++++++++++++++++++++++++++++++++ >> /etc/motd
echo Refactor thy programming skills! >> /etc/motd
echo >> /etc/motd
SCRIPT
$timezone = <<-SCRIPT
area="America"
zone="Sao_Paulo"
sudo echo "$area/$zone" > /tmp/timezone
sudo cp -f /tmp/timezone /etc/timezone
sudo cp -f /usr/share/zoneinfo/$area/$zone /etc/localtime
SCRIPT
$play = <<-SCRIPT
echo "var page = require('webpage').create();
page.onConsoleMessage = function(msg) {
console.log(msg);
};
page.open('http://www.typesafe.com/get-started', function(status) {
page.evaluate(function() {
console.log(document.getElementById('top').getElementsByClassName('minimal')[0].href);
});
phantom.exit();
});" > scrape.js
source .profile
url=$(phantomjs scrape.js)
zip=$(basename $url)
folder=$(grep -o 'activator-[0-9].[0-9].[0-9]-minimal' <<< $zip)
rm $zip & rm -rf $folder
wget $url
unzip $zip
echo "export PATH=$PATH:/home/vagrant/$folder" >> ~/.bashrc
sudo chmod a+x $folder/activator
rm $zip & rm scrape.js
unset url & unset zip & unset folder
SCRIPT
$elixir = <<-SCRIPT
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8
sed -ie 's/LC_ALL="en_US"/LC_ALL="en_US.UTF-8"/' /etc/default/locale
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
wget http://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update
sudo apt-get -y install elixir
yes Y | mix local.hex
yes Y | mix archive.install "https://github.com/phoenixframework/phoenix/releases/download/v1.2.1/phoenix_new-1.2.1.ez"
SCRIPT
$laravel = <<-SCRIPT
sudo apt-get -y install php5 php5-mcrypt
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
echo "export PATH=$PATH:/usr/local/bin/composer" >> ~/.bashrc
source ~/.bashrc
composer global require "laravel/installer=~1.1"
echo "export PATH=$PATH:export PATH=$PATH:~/.composer/vendor/bin" >> ~/.bashrc
SCRIPT
$laravel = <<-SCRIPT
sudo apt-get -y install erlang erlang-doc
SCRIPT
$mobile = <<-SCRIPT
sudo apt-get -y install lib32z1 lib32ncurses5 lib32stdc++6 expect
echo "var page = require('webpage').create();
page.onConsoleMessage = function(msg) {
console.log(msg);
};
page.onError = function(msg) {
}
page.open('https://developer.android.com/sdk/index.html#Other', function(status) {
page.evaluate(function() {
console.log(document.getElementsByClassName('download')[0].childNodes[1].childNodes[8].childNodes[3].childNodes[1].href);
});
phantom.exit();
});" > scrape.js
source .profile
ANDROID_SDK=$(phantomjs scrape.js)
ANDROID_SDK_FILENAME=$(basename $ANDROID_SDK)
curl -O $ANDROID_SDK
tar -xzvf $ANDROID_SDK_FILENAME
rm $ANDROID_SDK_FILENAME & rm scrape.js
unset ANDROID_SDK & unset ANDROID_SDDK_FILENAME
sudo chown -R vagrant android-sdk-linux/
echo 'export ANDROID_HOME=/home/vagrant/android-sdk-linux' >> /home/vagrant/.bashrc
echo 'export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools' >> /home/vagrant/.bashrc
expect -c '
set timeout -1 ;
spawn /home/vagrant/android-sdk-linux/tools/android update sdk -u --all --filter tools,platform-tools,build-tools-22.0.1,android-22,android-19,sys-img-armeabi-v7a-android-19
expect {
"Do you accept the license" { exp_send "y\r" ; exp_continue }
eof
}
'
expect -c '
set timeout -1 ;
spawn /home/vagrant/android-sdk-linux/tools/android create avd --name cordovakitkat --target android-19 --abi default/armeabi-v7a
expect {
"Do you wish to create a custom hardware profile" { exp_send "no\r" ; exp_continue }
eof
}
'
npm install -g cordova
npm install -g phonegap
npm install -g ionic
SCRIPT
$desktop = <<-SCRIPT
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
sudo apt-get update
#sudo apt-get -y install xfce4
sudo apt-get -y install lubuntu-core
sudo apt-get -y install virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11
#sudo apt-get -y install --no-install-recommends xubuntu-desktop
sudo apt-get -y install google-chrome-stable firefox
VBoxClient --seamless
SCRIPT
debug = "> /dev/null 2>&1" unless ENV['DEBUG']
config.vm.provision "shell", inline: $timezone, privileged: false
config.vm.provision "shell", inline: $swap, args: debug
config.vm.provision "shell", inline: $packages, privileged: false, args: debug
config.vm.provision "shell", inline: $vim, privileged: false, args: debug
#config.vm.provision "shell", inline: $desktop, privileged: false, args: debug
#config.vm.provision "shell", inline: $aspnet, privileged: false, args: debug
config.vm.provision "shell", inline: $nodejs, privileged: false, args: debug
#config.vm.provision "shell", inline: $java, privileged: false, args: debug
#config.vm.provision "shell", inline: $mobile, privileged: false, args: debug
#config.vm.provision "shell", inline: $play, privileged: false, args: debug
config.vm.provision :docker
config.vm.provision :docker_compose
config.vm.provision "shell", inline: $docker, args: debug
config.vm.provision "shell", inline: $rails, privileged: false, args: debug
config.vm.provision "shell", inline: $elixir, privileged: false, args: debug
#config.vm.provision "shell", inline: $laravel, privileged: false, args: debug
#config.vm.provision "shell", inline: $meteor, privileged: false, args: debug
config.vm.provision "shell", inline: $heroku, args: debug
config.vm.provision "shell", inline: $welcome
config.vm.provision :reboot
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment