cachivache 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +324 -0
- data/Rakefile +2 -0
- data/bin/cachivache +3 -0
- data/bin/setup +7 -0
- data/bin/template/.gitignore +1 -0
- data/bin/template/Gemfile +4 -0
- data/bin/template/README.md +324 -0
- data/bin/template/Rakefile +34 -0
- data/bin/template/Vagrantfile +70 -0
- data/bin/template/cachivache.rb +57 -0
- data/bin/template/lib/rake-helper.rb +50 -0
- data/bin/template/lib/shell-contexts/shell-context.rb +54 -0
- data/bin/template/lib/shell-contexts/shell-exec.rb +7 -0
- data/bin/template/lib/shell-contexts/shell_buffer.rb +18 -0
- data/bin/template/lib/shell-file-context.rb +36 -0
- data/bin/template/lib/shell-if-context.rb +21 -0
- data/bin/template/lib/stuff-api-behaviour.rb +134 -0
- data/bin/template/lib/stuff-configuration.rb +64 -0
- data/bin/template/lib/stuff-reminders-behaviour.rb +17 -0
- data/bin/template/stuff/.gitkeep +0 -0
- data/bin/template/stuff/stuff_sample.rb +42 -0
- data/cachivache.gemspec +27 -0
- data/lib/cachivache.rb +41 -0
- data/lib/cachivache/add-stuff-libraries-command.rb +12 -0
- data/lib/cachivache/command.rb +33 -0
- data/lib/cachivache/configure-command.rb +11 -0
- data/lib/cachivache/init-command.rb +40 -0
- data/lib/cachivache/remove-stuff-libraries-command.rb +18 -0
- data/lib/cachivache/update-stuff-libraries-command.rb +17 -0
- data/lib/cachivache/version.rb +3 -0
- metadata +134 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative 'lib/rake-helper'
|
2
|
+
|
3
|
+
raise_validation_error "Please define the parameter Cachivache.git_user_email in './cachivache.rb' run 'vagrant provision' again" unless Cachivache.is_defined?(:git_user_email)
|
4
|
+
raise_validation_error "Please define the parameter Cachivache.git_user_name in './cachivache.rb' run 'vagrant provision' again" unless Cachivache.is_defined?(:git_user_name)
|
5
|
+
raise_validation_error "Please define some Cachivache.stuff_to_install in './cachivache.rb' run 'vagrant provision' again" if Cachivache.stuff_to_install.empty?
|
6
|
+
|
7
|
+
def install_cachivache_stuff_with(&block)
|
8
|
+
Cachivache.stuff_to_install.each do |stuff_name|
|
9
|
+
show_info "Provisioning #{stuff_name}"
|
10
|
+
|
11
|
+
block.call stuff_name
|
12
|
+
end
|
13
|
+
|
14
|
+
show_info "All done!!!"
|
15
|
+
end
|
16
|
+
|
17
|
+
stuff :provision do
|
18
|
+
install_cachivache_stuff_with do |stuff_name|
|
19
|
+
invoke stuff_name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
stuff :explain do
|
24
|
+
install_cachivache_stuff_with do |stuff_name|
|
25
|
+
explained = during_shell_buffer { invoke stuff_name }
|
26
|
+
puts explained.green
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
stuff default: :provision
|
31
|
+
|
32
|
+
at_exit do
|
33
|
+
show_reminders
|
34
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
require_relative 'cachivache'
|
5
|
+
|
6
|
+
Vagrant.configure(2) do |config|
|
7
|
+
# Every Vagrant development environment requires a box. You can search for
|
8
|
+
# boxes at https://atlas.hashicorp.com/search.
|
9
|
+
config.vm.box = "ubuntu/trusty32"
|
10
|
+
|
11
|
+
# Create a private network, which allows host-only access to the machine
|
12
|
+
# using a specific IP.
|
13
|
+
config.vm.network "private_network", ip: Cachivache.vagrant_ip_address
|
14
|
+
|
15
|
+
# Map the source folder
|
16
|
+
config.vm.synced_folder "../", Cachivache.src_folder
|
17
|
+
|
18
|
+
# Map the host ~/.ssh folder
|
19
|
+
config.vm.synced_folder "~/.ssh", Cachivache.ssh_keys_folder
|
20
|
+
|
21
|
+
# Provider-specific configuration so you can fine-tune various
|
22
|
+
# backing providers for Vagrant. These expose provider-specific options.
|
23
|
+
|
24
|
+
config.vm.provider "virtualbox" do |vb|
|
25
|
+
# Display the VirtualBox GUI when booting the machine
|
26
|
+
vb.gui = Cachivache.wants_gui?
|
27
|
+
|
28
|
+
# Customize the amount of memory on the VM:
|
29
|
+
vb.memory = Cachivache.wants_gui? ? "4096" : "1024"
|
30
|
+
end
|
31
|
+
|
32
|
+
# Enable provisioning with a shell script. Additional provisioners such as
|
33
|
+
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
|
34
|
+
# documentation for more information about their specific syntax and use.
|
35
|
+
|
36
|
+
# Provisioning the VM with the custom provision-scripts
|
37
|
+
|
38
|
+
config.vm.provision "rbenv",
|
39
|
+
type: "shell",
|
40
|
+
privileged: false,
|
41
|
+
inline: %Q{
|
42
|
+
# From https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-ubuntu-14-04
|
43
|
+
if [ ! -d $HOME/.rbenv/ ]; then
|
44
|
+
|
45
|
+
sudo apt-get install git-core -y
|
46
|
+
|
47
|
+
git clone git://github.com/sstephenson/rbenv.git .rbenv
|
48
|
+
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
|
49
|
+
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
|
50
|
+
|
51
|
+
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
|
52
|
+
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bash_profile
|
53
|
+
source ~/.bash_profile
|
54
|
+
|
55
|
+
git clone git://github.com/carsomyr/rbenv-bundler.git ~/.rbenv/plugins/bundler
|
56
|
+
|
57
|
+
sudo gem install bundler
|
58
|
+
fi
|
59
|
+
}
|
60
|
+
|
61
|
+
config.vm.provision "rake-provision",
|
62
|
+
type: "shell",
|
63
|
+
privileged: false,
|
64
|
+
inline: %Q{
|
65
|
+
cd #{Cachivache.cachivache_folder}
|
66
|
+
|
67
|
+
bundle install
|
68
|
+
rake provision
|
69
|
+
}
|
70
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative 'lib/stuff-configuration'
|
2
|
+
|
3
|
+
class Cachivache < Stuff::Configuration
|
4
|
+
# Vagrant params
|
5
|
+
|
6
|
+
let(:vagrant_ip_address) { '192.168.0.101' }
|
7
|
+
|
8
|
+
let(:home_folder) { '/home/vagrant' }
|
9
|
+
|
10
|
+
let(:src_folder) { home_folder + '/src' }
|
11
|
+
let(:ssh_keys_folder) { home_folder + '/ssh-keys' }
|
12
|
+
let(:bin_folder) { home_folder + '/bin-cachivache' }
|
13
|
+
|
14
|
+
# Cachivache folders
|
15
|
+
|
16
|
+
let(:cachivache_folder) { src_folder + '/cachivache' }
|
17
|
+
let(:stuff_library_folder) { cachivache_folder + '/stuff-library' }
|
18
|
+
let(:stuff_folder) { cachivache_folder + '/stuff' }
|
19
|
+
|
20
|
+
let(:wants_gui?) { false }
|
21
|
+
|
22
|
+
# Developer params
|
23
|
+
|
24
|
+
####################################
|
25
|
+
# Define what stuff to install
|
26
|
+
####################################
|
27
|
+
|
28
|
+
let(:stuff_to_install) {
|
29
|
+
[
|
30
|
+
# Put the stuff you want to install here
|
31
|
+
]
|
32
|
+
}
|
33
|
+
|
34
|
+
####################################
|
35
|
+
# Define your git user
|
36
|
+
####################################
|
37
|
+
|
38
|
+
let(:git_user_email) { }
|
39
|
+
let(:git_user_name) { }
|
40
|
+
|
41
|
+
####################################
|
42
|
+
# Define your git credentials
|
43
|
+
####################################
|
44
|
+
|
45
|
+
let(:git_credentials) { %Q{
|
46
|
+
host github.com
|
47
|
+
HostName github.com
|
48
|
+
IdentityFile #{Cachivache.ssh_keys_folder}/id_rsa
|
49
|
+
User git
|
50
|
+
|
51
|
+
host bitbucket.org
|
52
|
+
HostName bitbucket.org
|
53
|
+
IdentityFile #{Cachivache.ssh_keys_folder}/id_rsa
|
54
|
+
User git
|
55
|
+
}
|
56
|
+
}
|
57
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'colorize'
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
require_relative '../cachivache'
|
6
|
+
|
7
|
+
# Helper - Iterate all .rb files in a folder
|
8
|
+
def all_rb_files_in(folder, &block)
|
9
|
+
Dir[Pathname.new(folder) + '**/*.rb'].each do |file|
|
10
|
+
block.call(file)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
public
|
15
|
+
|
16
|
+
######################################
|
17
|
+
# require all the files in /lib first
|
18
|
+
######################################
|
19
|
+
|
20
|
+
all_rb_files_in Cachivache.cachivache_folder + '/lib' do |file|
|
21
|
+
require file
|
22
|
+
end
|
23
|
+
|
24
|
+
######################################
|
25
|
+
# Stuff Api behaviour
|
26
|
+
######################################
|
27
|
+
|
28
|
+
# Raname :task just for fun
|
29
|
+
def stuff(*args, &block)
|
30
|
+
task(*args, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def execute_shell_command(command)
|
34
|
+
sh command
|
35
|
+
end
|
36
|
+
|
37
|
+
include Stuff::ApiBehaviour
|
38
|
+
include Stuff::RemindersBehaviour
|
39
|
+
|
40
|
+
ShellContext.set_current( ShellExec.new(self) )
|
41
|
+
|
42
|
+
######################################
|
43
|
+
# Load the rest of the files
|
44
|
+
######################################
|
45
|
+
|
46
|
+
all_rb_files_in Cachivache.cachivache_folder do |file|
|
47
|
+
Stuff::Configuration.creating_undefined_subclasses do
|
48
|
+
require file
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
class ShellContext
|
2
|
+
@current = nil
|
3
|
+
|
4
|
+
def self.current()
|
5
|
+
@current
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.set_current(shell_context)
|
9
|
+
@current = shell_context
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.during_shell_context(new_shell_context, &block)
|
13
|
+
current_shell_context = @current
|
14
|
+
|
15
|
+
@current = new_shell_context
|
16
|
+
|
17
|
+
block.call
|
18
|
+
|
19
|
+
@current = current_shell_context
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(scope)
|
23
|
+
@scope = scope
|
24
|
+
end
|
25
|
+
|
26
|
+
def scope()
|
27
|
+
@scope
|
28
|
+
end
|
29
|
+
|
30
|
+
def shell(command)
|
31
|
+
raise 'Subclass responsibility'
|
32
|
+
end
|
33
|
+
|
34
|
+
def shell!(command)
|
35
|
+
scope.execute_shell_command(command)
|
36
|
+
end
|
37
|
+
|
38
|
+
def invoke(task_name, *args)
|
39
|
+
Rake::Task[task_name].invoke(*args)
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute(task_name, *args)
|
43
|
+
Rake::Task[task_name].execute(*args)
|
44
|
+
end
|
45
|
+
|
46
|
+
def remind_to(text)
|
47
|
+
reminders << text
|
48
|
+
end
|
49
|
+
|
50
|
+
def raise_validation_error(message)
|
51
|
+
show_info(message)
|
52
|
+
exit
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'shell-context'
|
2
|
+
|
3
|
+
class ShellBuffer < ShellContext
|
4
|
+
def initialize(*args)
|
5
|
+
super(*args)
|
6
|
+
|
7
|
+
@contents = ''
|
8
|
+
end
|
9
|
+
|
10
|
+
def contents
|
11
|
+
@contents
|
12
|
+
end
|
13
|
+
|
14
|
+
def shell(command)
|
15
|
+
contents << "\n" unless contents.empty?
|
16
|
+
contents << command
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'stuff-api-behaviour'
|
2
|
+
|
3
|
+
class ShellFileContext
|
4
|
+
include Stuff::ApiBehaviour
|
5
|
+
|
6
|
+
def self.with(args, &block)
|
7
|
+
new(args).evaluate_with block
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(args)
|
11
|
+
@filename = args[:file]
|
12
|
+
end
|
13
|
+
|
14
|
+
def evaluate_with(block)
|
15
|
+
instance_eval(&block)
|
16
|
+
end
|
17
|
+
|
18
|
+
# replace pattern: "user: ''", with: "user: 'admin'"
|
19
|
+
def replace(params)
|
20
|
+
pattern = params[:pattern]
|
21
|
+
replacement = params[:with]
|
22
|
+
%Q{
|
23
|
+
sudo sed -i 's|#{pattern}|#{replacement}|g' #{@filename}
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
# append '[mongo]'
|
28
|
+
# append :new_line
|
29
|
+
def append(text)
|
30
|
+
text = "\n" if text == :new_line
|
31
|
+
|
32
|
+
%Q{
|
33
|
+
echo "#{text}" | sudo tee -a #{@filename}
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'stuff-api-behaviour'
|
2
|
+
|
3
|
+
class ShellIfContext
|
4
|
+
include Stuff::ApiBehaviour
|
5
|
+
|
6
|
+
def self.with(args, &block)
|
7
|
+
new(args).evaluate_with block
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(args)
|
11
|
+
@guard = args[:guard]
|
12
|
+
end
|
13
|
+
|
14
|
+
def evaluate_with(block)
|
15
|
+
shell "if #{@guard}; then"
|
16
|
+
|
17
|
+
instance_eval(&block)
|
18
|
+
|
19
|
+
shell "fi"
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
module Stuff
|
2
|
+
module ApiBehaviour
|
3
|
+
def shell_context()
|
4
|
+
ShellContext.current
|
5
|
+
end
|
6
|
+
|
7
|
+
def invoke(task_name, *args)
|
8
|
+
shell_context.invoke(task_name, *args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute(task_name, *args)
|
12
|
+
shell_context.execute(task_name, *args)
|
13
|
+
end
|
14
|
+
|
15
|
+
def shell(command)
|
16
|
+
shell_context.shell(command)
|
17
|
+
end
|
18
|
+
|
19
|
+
def shell!(command)
|
20
|
+
shell_context.shell!(command)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Examples:
|
24
|
+
#
|
25
|
+
# shell_unless file_exists: '/bla.conf' do
|
26
|
+
# shell %Q{
|
27
|
+
# ls -la
|
28
|
+
# rm -rf bla
|
29
|
+
# }
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# shell_unless folder_exists: '/bla' do
|
33
|
+
# shell %Q{
|
34
|
+
# ls -la
|
35
|
+
# rm -rf bla
|
36
|
+
# }
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# shell_unless file: '/bla', contains: 'some regex' do
|
40
|
+
# shell %Q{
|
41
|
+
# ls -la
|
42
|
+
# rm -rf bla
|
43
|
+
# }
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# shell_unless command: 'java -version', contains: 'java 1.8' do
|
47
|
+
# shell %Q{
|
48
|
+
# ls -la
|
49
|
+
# rm -rf bla
|
50
|
+
# }
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
def shell_unless(params, &block)
|
54
|
+
if params.key?(:file_exists)
|
55
|
+
shell unless_file_exists(params[:file_exists], &block)
|
56
|
+
return
|
57
|
+
end
|
58
|
+
if params.key?(:folder_exists)
|
59
|
+
shell unless_folder_exists(params[:folder_exists], &block)
|
60
|
+
return
|
61
|
+
end
|
62
|
+
if params.key?(:file) && params.key?(:contains)
|
63
|
+
shell unless_regex_in_file(params[:contains], params[:file], &block)
|
64
|
+
return
|
65
|
+
end
|
66
|
+
if params.key?(:command) && params.key?(:contains)
|
67
|
+
shell unless_regex_in_command(params[:contains], params[:command], &block)
|
68
|
+
return
|
69
|
+
end
|
70
|
+
raise 'Invalid unless option'
|
71
|
+
end
|
72
|
+
|
73
|
+
# Examples:
|
74
|
+
#
|
75
|
+
# in_file "/bla.conf" do
|
76
|
+
# shell replace pattern: "%user%", with: "admin"
|
77
|
+
#
|
78
|
+
# shell append "[cachivache]"
|
79
|
+
# shell append "path='/bla'"
|
80
|
+
# end
|
81
|
+
def in_file(filename, &block)
|
82
|
+
script = during_shell_buffer do
|
83
|
+
ShellFileContext.with(file: filename, &block)
|
84
|
+
end
|
85
|
+
|
86
|
+
shell script
|
87
|
+
end
|
88
|
+
|
89
|
+
# Examples:
|
90
|
+
#
|
91
|
+
# remind_to 'This is shown when the provision ends'
|
92
|
+
def remind_to(text)
|
93
|
+
shell_context.remind_to(text)
|
94
|
+
end
|
95
|
+
|
96
|
+
def raise_validation_error(message)
|
97
|
+
shell_context.raise_validation_error(message)
|
98
|
+
end
|
99
|
+
|
100
|
+
protected
|
101
|
+
|
102
|
+
def during_shell_buffer(&block)
|
103
|
+
temporary_shell_buffer = ShellBuffer.new(shell_context.scope)
|
104
|
+
|
105
|
+
ShellContext.during_shell_context(temporary_shell_buffer, &block)
|
106
|
+
|
107
|
+
temporary_shell_buffer.contents
|
108
|
+
end
|
109
|
+
|
110
|
+
def unless_file_exists(filename, &block)
|
111
|
+
during_shell_buffer do
|
112
|
+
ShellIfContext.with(guard: "[ ! -e #{filename} ]", &block)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def unless_folder_exists(folder, &block)
|
117
|
+
during_shell_buffer do
|
118
|
+
ShellIfContext.with(guard: "[ ! -d #{folder} ]", &block)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def unless_regex_in_file(regex, filename, &block)
|
123
|
+
during_shell_buffer do
|
124
|
+
ShellIfContext.with(guard: "! grep -q \"#{regex}\" \"#{filename}\"", &block)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def unless_regex_in_command(regex, command, &block)
|
129
|
+
during_shell_buffer do
|
130
|
+
ShellIfContext.with(guard: "! #{command} | grep -q \"#{regex}\"", &block)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|