vagrant-impressbox 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +21 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +31 -0
  8. data/Rakefile +9 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/lib/vagrant-impressbox.rb +21 -0
  12. data/lib/vagrant-impressbox/action_builder.rb +20 -0
  13. data/lib/vagrant-impressbox/actions/copy_git_settings.rb +38 -0
  14. data/lib/vagrant-impressbox/actions/insert_key.rb +56 -0
  15. data/lib/vagrant-impressbox/command.rb +165 -0
  16. data/lib/vagrant-impressbox/config.rb +38 -0
  17. data/lib/vagrant-impressbox/configs/command.yml +30 -0
  18. data/lib/vagrant-impressbox/configs/default.yml +13 -0
  19. data/lib/vagrant-impressbox/configs/for/impresscms.yml +8 -0
  20. data/lib/vagrant-impressbox/configurators/base.rb +21 -0
  21. data/lib/vagrant-impressbox/configurators/hyperv.rb +36 -0
  22. data/lib/vagrant-impressbox/configurators/virtualbox.rb +23 -0
  23. data/lib/vagrant-impressbox/objects/config_data.rb +62 -0
  24. data/lib/vagrant-impressbox/objects/config_file.rb +128 -0
  25. data/lib/vagrant-impressbox/objects/configurator.rb +135 -0
  26. data/lib/vagrant-impressbox/objects/ssh_key_detect.rb +116 -0
  27. data/lib/vagrant-impressbox/objects/template.rb +99 -0
  28. data/lib/vagrant-impressbox/plugin.rb +46 -0
  29. data/lib/vagrant-impressbox/provisioner.rb +103 -0
  30. data/lib/vagrant-impressbox/templates/Vagrantfile +37 -0
  31. data/lib/vagrant-impressbox/templates/config.yaml +76 -0
  32. data/lib/vagrant-impressbox/version.rb +4 -0
  33. data/locales/en.yml +28 -0
  34. data/spec/impressbox_spec.rb +11 -0
  35. data/spec/spec_helper.rb +2 -0
  36. data/vagrant-impressbox.gemspec +31 -0
  37. metadata +157 -0
@@ -0,0 +1,38 @@
1
+ # Loads all requirements
2
+ require 'vagrant'
3
+
4
+ # Impressbox namepsace
5
+ module Impressbox
6
+ # Vagrant config class
7
+ class Config < Vagrant.plugin('2', :config)
8
+ # @!attribute file
9
+ # @return [string] Filename from where to read all config data
10
+ attr_reader :file
11
+
12
+ def initialize
13
+ @file = UNSET_VALUE
14
+ end
15
+
16
+ def finalize!
17
+ @file = 'config.yaml' if @file == UNSET_VALUE
18
+ end
19
+
20
+ def file_config
21
+ unless @file_config_data
22
+ require_relative File.join('objects', 'config_file')
23
+ @file_config_data = Impressbox::Objects::ConfigFile.new(@file)
24
+ end
25
+ @file_config_data
26
+ end
27
+
28
+ def validate(_machine)
29
+ errors = []
30
+
31
+ unless File.exist?(@file)
32
+ errors << I18n.t('config.not_exist', file: @file)
33
+ end
34
+
35
+ { 'Impressbox' => errors }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,30 @@
1
+ box:
2
+ short: -b
3
+ full: --box=BOX_NAME
4
+ description: command.impressbox.arguments.box
5
+
6
+ ip:
7
+ description: command.impressbox.arguments.ip
8
+ full: --ip=IP
9
+
10
+ hostname:
11
+ full: --url=HOSTNAME
12
+ description: command.impressbox.arguments.hostname
13
+
14
+ memory:
15
+ full: --memory=RAM
16
+ description: command.impressbox.arguments.memory
17
+
18
+ cpus:
19
+ full: --cpus=CPU_NUMBER
20
+ description: command.impressbox.arguments.cpus
21
+
22
+ ___recreate___:
23
+ short: -r
24
+ full: --recreate
25
+ description: command.impressbox.arguments.special.recreate
26
+
27
+ ___use_template___:
28
+ short: -f
29
+ full: --for=NAME
30
+ description: command.impressbox.arguments.special.use_template
@@ -0,0 +1,13 @@
1
+ box: ImpressCMS/DevBox-Ubuntu
2
+ ip:
3
+ hostname: impresscms.dev
4
+ memory: 512
5
+ cpus: 1
6
+ ports:
7
+ - host: 80
8
+ guest: 80
9
+ smb:
10
+ user: ENTER_YOUR_USERNAME
11
+ pass: ENTER_YOUR_PASS
12
+ ip: ENTER_YOUR_PC_IP
13
+ provision:
@@ -0,0 +1,8 @@
1
+ box: ImpressCMS/DevBox-Ubuntu
2
+ ip: nil
3
+ hostname: impresscms.dev
4
+ name: impresscms.dev
5
+ cmd: php /vagrant/www/htdocs/cmd.php
6
+ ports:
7
+ - host: 80
8
+ guest: 80
@@ -0,0 +1,21 @@
1
+ # Impressbox namespace
2
+ module Impressbox
3
+ # Configurators namespace
4
+ module Configurators
5
+ # Base configurator
6
+ class Base
7
+ # @!attribute [rw] config
8
+ attr_accessor :config
9
+
10
+ # initializer
11
+ def initialize(config)
12
+ @config = config
13
+ end
14
+
15
+ # Is with same name?
16
+ def same?(name)
17
+ self.class.name.eql?(name)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'base'
2
+
3
+ module Impressbox
4
+ # Configurators namespace
5
+ module Configurators
6
+ # HyperV configurator
7
+ class HyperV < Impressbox::Configurators::Base
8
+ # Configure basic settings
9
+ def basic_configure(vmname, cpus, memory, _gui)
10
+ @config.vm.provider 'hyperv' do |v|
11
+ v.vmname = vmname
12
+ v.cpus = cpus
13
+ v.memory = memory
14
+ end
15
+ end
16
+
17
+ # Configure specific
18
+ def specific_configure(cfg)
19
+ samba_configure cfg.ip, cfg.pass, cfg.user
20
+ end
21
+
22
+ private
23
+
24
+ # Configure samba
25
+ def samba_configure(ip, password, username)
26
+ @config.vm.synced_folder '.', '/vagrant',
27
+ id: 'vagrant',
28
+ smb_host: ip,
29
+ smb_password: password,
30
+ smb_username: username,
31
+ user: 'www-data',
32
+ owner: 'www-data'
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ require_relative 'base'
2
+
3
+ module Impressbox
4
+ # Configurators namespace
5
+ module Configurators
6
+ # Virtualbox configurator
7
+ class VirtualBox < Impressbox::Configurators::Base
8
+ # Configure basic settings
9
+ def basic_configure(vmname, cpus, memory, gui)
10
+ @config.vm.provider 'virtualbox' do |v|
11
+ v.gui = gui
12
+ v.vmname = vmname
13
+ v.cpus = cpus
14
+ v.memory = memory
15
+ end
16
+ end
17
+
18
+ # Configure specific
19
+ def specific_configure(cfg)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,62 @@
1
+ module Impressbox
2
+ module Objects
3
+ # This class is used for deal with configs subfolder contents
4
+ class ConfigData
5
+ def self.list_of_type(name)
6
+ ret = []
7
+ Dir.entries(real_path(name)).select do |f|
8
+ next if File.directory?(f)
9
+ ret.push File.basename(f, '.*')
10
+ end
11
+ ret
12
+ end
13
+
14
+ def self.real_path(filename)
15
+ File.join File.dirname(File.dirname(__FILE__)), 'configs', filename
16
+ end
17
+
18
+ def self.real_type_filename(type, filename)
19
+ real_path File.join(type, filename + '.yml')
20
+ end
21
+
22
+ def initialize(filename)
23
+ @filename = ConfigData.real_path(filename)
24
+ @data = symbolize_keys(load_yaml)
25
+ end
26
+
27
+ def [](key)
28
+ @data[key]
29
+ end
30
+
31
+ def all
32
+ @data
33
+ end
34
+
35
+ private
36
+
37
+ def load_yaml
38
+ YAML.load(File.open(@filename))
39
+ end
40
+
41
+ def symbolize_make_new_key(key)
42
+ case key
43
+ when String then key.to_sym
44
+ else key
45
+ end
46
+ end
47
+
48
+ # Code from http://devblog.avdi.org/2009/07/14/recursively-symbolize-keys/
49
+ def symbolize_keys(hash)
50
+ hash.inject({}) do |result, (key, value)|
51
+ new_key = symbolize_make_new_key(key)
52
+ new_value = case value
53
+ when Hash then symbolize_keys(value)
54
+ else value
55
+ end
56
+ result[new_key] = new_value
57
+ result
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,128 @@
1
+ require 'vagrant'
2
+ require 'yaml'
3
+ require_relative 'config_data'
4
+
5
+ # Impressbox namespace
6
+ module Impressbox
7
+ # Objects namepsace
8
+ module Objects
9
+ # Config reader
10
+ class ConfigFile
11
+ UNSET_VALUE = ::Vagrant::Plugin::V2::Config::UNSET_VALUE
12
+
13
+ # @!attribute [rw] ip
14
+ attr_accessor :ip
15
+
16
+ # @!attribute [rw] hostname
17
+ attr_accessor :hostname
18
+
19
+ # @!attribute [rw] name
20
+ attr_accessor :name
21
+
22
+ # @!attribute [rw] cpus
23
+ attr_accessor :cpus
24
+
25
+ # @!attribute [rw] memory
26
+ attr_accessor :memory
27
+
28
+ # @!attribute [rw] check_update
29
+ attr_accessor :check_update
30
+
31
+ # @!attribute [rw] keys
32
+ attr_accessor :keys
33
+
34
+ # @!attribute [rw] smb
35
+ attr_accessor :smb
36
+
37
+ # @!attribute [rw] ports
38
+ attr_accessor :ports
39
+
40
+ # @!attribute [rw] gui
41
+ attr_accessor :gui
42
+
43
+ # @!attribute [rw] provision
44
+ attr_accessor :provision
45
+
46
+ def initialize(file)
47
+ @default = ConfigData.new('default.yml')
48
+ map_values YAML.load(File.open(file))
49
+ end
50
+
51
+ private
52
+
53
+ def map_values(config)
54
+ %w(
55
+ cpus memory check_update ip hostname name
56
+ ports keys smb provision).each do |attr|
57
+ method_name = 'convert_' + attr
58
+ instance_variable_set '@' + attr, method(method_name).call(config)
59
+ end
60
+ end
61
+
62
+ def convert_provision(config)
63
+ select_value(config, 'provision', @default[:provision]).to_s
64
+ end
65
+
66
+ def convert_name(config)
67
+ select_value(config, 'name', @default[:name]).to_s
68
+ end
69
+
70
+ def convert_ip(config)
71
+ select_value(config, 'ip', @default[:ip])
72
+ end
73
+
74
+ def convert_cpus(config)
75
+ select_value(config, 'cpus', @default[:cpus]).to_s.to_i
76
+ end
77
+
78
+ def convert_memory(config)
79
+ select_value(config, 'memory', @default[:memory]).to_s.to_i
80
+ end
81
+
82
+ def convert_hostname(config)
83
+ value = select_value(config, 'hostname', @default[:hostname])
84
+ return @default[:hostname] if value.nil?
85
+ unless value.is_a?(String) && value.is_a?(Array)
86
+ return @default[:hostname]
87
+ end
88
+ value
89
+ end
90
+
91
+ def convert_ports(config)
92
+ select_value(config, 'ports', @default[:ports])
93
+ end
94
+
95
+ def convert_check_update(config)
96
+ value = select_value(config, 'check_update', @default[:check_update])
97
+ to_b(value)
98
+ end
99
+
100
+ def to_b(value)
101
+ return true if value
102
+ false
103
+ end
104
+
105
+ def convert_keys(config)
106
+ value = select_value(config, 'keys', {})
107
+ value = {} unless value.is_a?(Hash)
108
+ value[:private] = nil unless value.key?('private')
109
+ value[:public] = nil unless value.key?('public')
110
+ value
111
+ end
112
+
113
+ def convert_smb(config)
114
+ value = select_value(config, 'smb', {})
115
+ value = {} unless value.is_a?(Hash)
116
+ value[:ip] = nil unless value.key?('ip')
117
+ value[:user] = nil unless value.key?('user')
118
+ value[:pass] = nil unless value.key?('pass')
119
+ value
120
+ end
121
+
122
+ def select_value(config, key, default_value)
123
+ return config[key] if config.key?(key)
124
+ default_value
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,135 @@
1
+ require_relative 'template'
2
+
3
+ # Impressbox namespace
4
+ module Impressbox
5
+ # Objects Namespace
6
+ module Objects
7
+ # Class used to configure instance
8
+ class Configurator
9
+ CONFIGURATORS = %w(
10
+ HyperV
11
+ VirtualBox
12
+ ).freeze
13
+
14
+ # Initializator
15
+ def initialize(root_config, machine, provider)
16
+ @config = root_config
17
+ @machine = machine
18
+ @template = Impressbox::Objects::Template.new
19
+ load_configurators provider
20
+ end
21
+
22
+ def load_configurators(provider)
23
+ @configurators = []
24
+ CONFIGURATORS.each do |name|
25
+ require_relative File.join('..', 'configurators', name.downcase)
26
+ class_name = 'Impressbox::Configurators::' + name
27
+ clazz = class_name.split('::').inject(Object) do |o, c|
28
+ o.const_get c
29
+ end
30
+ instance = clazz.new(@config)
31
+ @configurators.push instance if instance.same?(provider)
32
+ end
33
+ end
34
+
35
+ # Provision
36
+ # cd /srv/www/phpmyadmin
37
+ # chown -R www-data ./
38
+ # chgrp www-data ./
39
+ # git pull
40
+ # chown -R www-data ./
41
+ # chgrp www-data ./
42
+ # cd /srv/www/Memchaced-Dashboard
43
+ # chown -R www-data ./
44
+ # chgrp www-data ./
45
+ # git pull
46
+ # chown -R www-data ./
47
+ # chgrp www-data ./
48
+
49
+ # Basic configure
50
+ def basic_configure(vmname, cpus, memory, gui)
51
+ @configurators.each do |configurator|
52
+ configurator.basic_configure vmname, cpus, memory, gui
53
+ end
54
+ end
55
+
56
+ # Specific configure
57
+ def specific_configure(config)
58
+ @configurators.each do |configurator|
59
+ configurator.specific_configure config
60
+ end
61
+ end
62
+
63
+ # Box name to use for this vagrant configuration
64
+ def name(name)
65
+ @config.vm.box = name
66
+ end
67
+
68
+ # Configure SSH
69
+ def configure_ssh(public_key, private_key)
70
+ # @config.ssh.insert_key = true
71
+ @config.ssh.pty = false
72
+ @config.ssh.forward_x11 = false
73
+ @config.ssh.forward_agent = false
74
+ Impressbox::Plugin.set_item :public_key, public_key
75
+ Impressbox::Plugin.set_item :private_key, private_key
76
+ end
77
+
78
+ # configure hostnames
79
+ def configure_hostnames(hostname, aliases)
80
+ require 'vagrant-hostmanager'
81
+ @config.vm.hostname = hostname
82
+ @config.hostmanager.enabled = true
83
+ @config.hostmanager.manage_host = true
84
+ @config.hostmanager.manage_guest = true
85
+ @config.hostmanager.ignore_private_ip = false
86
+ @config.hostmanager.include_offline = true
87
+ @config.hostmanager.aliases = aliases unless aliases.empty?
88
+ end
89
+
90
+ # Configure network
91
+ def configure_network(ip)
92
+ return unless ip
93
+ @config.vm.network 'private_network',
94
+ ip: ip
95
+ end
96
+
97
+ # Forward vars
98
+ def forward_vars(vars)
99
+ @config.ssh.forward_env = vars
100
+ end
101
+
102
+ # Automatically check for update for this box ?
103
+ def check_for_update(check)
104
+ @config.vm.box_check_update = check
105
+ end
106
+
107
+ # forward one port
108
+ def forward_port(guest_port, host_port, protocol = 'tcp')
109
+ @config.vm.network 'forwarded_port',
110
+ guest: guest_port,
111
+ host: host_port,
112
+ protocol: protocol,
113
+ auto_correct: true
114
+ end
115
+
116
+ # Forward ports
117
+ def forward_ports(ports)
118
+ ports.each do |pgroup|
119
+ forward_port pgroup['guest'],
120
+ pgroup['host'],
121
+ extract_protocol(pgroup)
122
+ end
123
+ end
124
+
125
+ private
126
+
127
+ def extract_protocol(pgroup)
128
+ possible = %w(tcp udp)
129
+ return 'tcp' unless pgroup.key?('protocol')
130
+ return 'tcp' unless possible.include?(pgroup['protocol'])
131
+ pgroup[protocol]
132
+ end
133
+ end
134
+ end
135
+ end