# We provide this Vagrantfile as a convenience. It is not officially
# supported.  If adding boxes, please limit sources to well-known
# organizations, not individual authors.

targets = {
  "debian7" => {
    "box" => "bento/debian-7"
  },
  "debian8" => {
    "box" => "bento/debian-8"
  },
  "debian9" => {
    "box" => "bento/debian-9"
  },
  "centos6" => {
    "box" => "elastic/centos-6-x86_64"
  },
  "centos7" => {
    "box" => "elastic/centos-7-x86_64"
  },
  "ubuntu15.04" => {
    "box" => "bento/ubuntu-15.04"
  },
  "ubuntu15.10" => {
    "box" => "bento/ubuntu-15.10"
  },
  "ubuntu16.04" => {
    "box" => "bento/ubuntu-16.04"
  },
  "ubuntu16.10" => {
    "box" => "bento/ubuntu-16.10"
  },
  "ubuntu17.04" => {
    "box" => "bento/ubuntu-17.04"
  },
  "ubuntu18.04" => {
    "box" => "ubuntu/bionic64"
  },
  "ubuntu12" => {
    "box" => "ubuntu/precise64"
  },
  "ubuntu14" => {
    "box" => "ubuntu/trusty64"
  },
  "ubuntu16" => {
    "box" => "ubuntu/xenial64"
  },
  "archlinux" => {
    "box" => "archlinux/archlinux"
  },
  "fedora33" => {
    "box" => "fedora/33-cloud-base"
  },
  "suse11" => {
    "box" => "elastic/sles-11-x86_64"
  },
  "suse12" => {
    "box" => "elastic/sles-12-x86_64"
  },
  "aws-amazon2015.03" => {
    "box" => "osquery/aws-dummy",
    "regions" => {
      "us-east-1" => "ami-1ecae776",
      "us-west-1" => "ami-d114f295",
      "us-west-2" => "ami-e7527ed7"
    },
    "username" => "ec2-user"
  },
  "aws-rhel7.1" => {
    "box" => "osquery/aws-dummy",
    "regions" => {
      "us-east-1" => "ami-12663b7a",
      "us-west-1" => "ami-a540a5e1",
      "us-west-2" => "ami-4dbf9e7d"
    },
    "username" => "ec2-user"
  },
  "aws-rhel6.5" => {
    "box" => "osquery/aws-dummy",
    "regions" => {
      "us-east-1" => "ami-1643ff7e",
      "us-west-1" => "ami-2b171d6e",
      "us-west-2" => "ami-7df0bd4d"
    },
    "username" => "ec2-user"
  },
  "aws-ubuntu10" => {
    "box" => "osquery/aws-dummy",
    "regions" => {
      "us-east-1" => "ami-1e6f6176",
      "us-west-1" => "ami-250fe361",
      "us-west-2" => "ami-1b2a1c2b"
    },
    "username" => "ubuntu"
  },
  "aws-oracle6.6" => {
    "box" => "osquery/aws-dummy",
    "regions" => {
      "us-east-1" => "ami-20e4b748",
      "us-west-1" => "ami-f3d83db7",
      "us-west-2" => "ami-b34f6e83"
    },
    "username" => "ec2-user"
  },
  "aws-oracle5.11" => {
    "box" => "osquery/aws-dummy",
    "regions" => {
      "us-east-1" => "ami-0ecd7766",
      "us-west-1" => "ami-4b00150e",
      "us-west-2" => "ami-6b57185b"
    },
    "username" => "root"
  },
}

Vagrant.configure("2") do |config|
  config.vm.provider "virtualbox" do |v|
    if ENV['OSQUERY_BUILD_CPUS']
      v.cpus = ENV['OSQUERY_BUILD_CPUS'].to_i
    else
      v.cpus = 2
    end
    if ENV['OSQUERY_BUILD_MEMORY']
      v.memory = ENV['OSQUERY_BUILD_MEMORY'].to_i
    else
      v.memory = 4096
    end
  end
  config.vm.provider "vmware_desktop" do |v|
    if ENV['OSQUERY_BUILD_CPUS']
      v.cpus = ENV['OSQUERY_BUILD_CPUS'].to_i
    else
      v.cpus = 2
    end
    if ENV['OSQUERY_BUILD_MEMORY']
      v.memory = ENV['OSQUERY_BUILD_MEMORY'].to_i
    else
      v.memory = 4096
    end
  end
  config.vm.provider :aws do |aws, override|
    # Required. Credentials for AWS API.
    aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
    aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
    # Name of AWS keypair for launching and accessing the EC2 instance.
    if [ ENV['AWS_KEYPAIR_NAME'] ]
      aws.keypair_name = ENV['AWS_KEYPAIR_NAME']
    end
    override.ssh.private_key_path = ENV['AWS_SSH_PRIVATE_KEY_PATH']
    # Name of AWS security group that allows TCP/22 from vagrant host.
    if [ ENV['AWS_SECURITY_GROUP'] ]
       aws.security_groups = [ ENV['AWS_SECURITY_GROUP'] ]
    end
    # Set this to the AWS region for EC2 instances.
    if ENV['AWS_DEFAULT_REGION']
      aws.region = ENV['AWS_DEFAULT_REGION']
    else
      aws.region = "us-east-1"
    end
    # Set this to the desired AWS instance type.
    if ENV['AWS_INSTANCE_TYPE']
      aws.instance_type = ENV['AWS_INSTANCE_TYPE']
    else
      aws.instance_type = "m3.large"
    end
    targets["active_region"] = aws.region
    # If using a VPC, optionally set a SUBNET_ID.
    if ENV['AWS_SUBNET_ID']
      aws.subnet_id = ENV['AWS_SUBNET_ID']
    end
  end

  targets.each do |name, target|
    box = target["box"]
    config.vm.define name do |build|
      build.vm.box = box
      if name.start_with?('aws-')
        build.vm.provider :aws do |aws, override|
          if aws.subnet_id != Vagrant::Plugin::V2::Config::UNSET_VALUE
            aws.associate_public_ip = true
          end
          aws.ami = target['regions'][targets["active_region"]]
          aws.user_data = [
            "#!/bin/bash",
            "echo 'Defaults:" + target['username'] +
              " !requiretty' > /etc/sudoers.d/999-vagrant-cloud-init-requiretty",
              "chmod 440 /etc/sudoers.d/999-vagrant-cloud-init-requiretty"
          ].join("\n")
          override.ssh.username = target['username']
          aws.tags = { 'Name' => 'osquery-vagrant-' + name }
        end
        build.vm.synced_folder ".", "/vagrant", type: "rsync",
          rsync__exclude: [
            "build",
            ".git/objects",
          ]
      end

      if name.start_with?('macos')
        config.vm.provision "shell",
          inline: "dseditgroup -o read vagrant || dseditgroup -o create vagrant"
        build.vm.synced_folder ".", "/vagrant", group: "staff", type: "rsync",
          rsync__exclude: [
            "build",
            ".git/objects",
          ]
      end

      if name.start_with?('ubuntu', 'debian')
        build.vm.provision 'bootstrap', type: 'shell' do |s|
          s.inline = 'sudo apt-get update;'\
                     'sudo apt-get install --yes git make python;'
        end
      end
    end
  end
end
