picobox 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.rspec +5 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/DOCKER_INFO.md +3 -0
- data/Gemfile +5 -0
- data/Guardfile +47 -0
- data/LICENSE.txt +21 -0
- data/README.md +138 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/picobox +5 -0
- data/bin/picobox_dev +10 -0
- data/bin/rake +17 -0
- data/bin/setup +8 -0
- data/docs/demo_script.md +27 -0
- data/docs/testdrive +5658 -0
- data/docs/testdrive.gif +0 -0
- data/lib/picobox.rb +79 -0
- data/lib/picobox/box.rb +37 -0
- data/lib/picobox/boxes/manifest.rb +59 -0
- data/lib/picobox/boxes/packages/elixir/Dockerfile +47 -0
- data/lib/picobox/boxes/packages/elixir/docker-compose.yml +26 -0
- data/lib/picobox/boxes/packages/elixir/info +18 -0
- data/lib/picobox/boxes/packages/elixir/start +3 -0
- data/lib/picobox/boxes/packages/python/Dockerfile +33 -0
- data/lib/picobox/boxes/packages/python/docker-compose.yml +14 -0
- data/lib/picobox/boxes/packages/python/start +3 -0
- data/lib/picobox/boxes/packages/rails/Dockerfile +57 -0
- data/lib/picobox/boxes/packages/rails/docker-compose.yml +50 -0
- data/lib/picobox/boxes/packages/rails/start +9 -0
- data/lib/picobox/boxes/packages/ruby/Dockerfile +5 -0
- data/lib/picobox/boxes/packages/ruby/docker-compose.yml +22 -0
- data/lib/picobox/boxes/packages/ruby/start +3 -0
- data/lib/picobox/boxes/unpacker.rb +55 -0
- data/lib/picobox/cli.rb +163 -0
- data/lib/picobox/commands/add_box.rb +23 -0
- data/lib/picobox/commands/add_service.rb +25 -0
- data/lib/picobox/commands/build_service.rb +16 -0
- data/lib/picobox/commands/download_docker.rb +17 -0
- data/lib/picobox/commands/finish_install.rb +10 -0
- data/lib/picobox/commands/finish_uninstall.rb +9 -0
- data/lib/picobox/commands/initialize_project.rb +35 -0
- data/lib/picobox/commands/install_docker.rb +27 -0
- data/lib/picobox/commands/list_boxes.rb +16 -0
- data/lib/picobox/commands/list_services.rb +16 -0
- data/lib/picobox/commands/open_shell.rb +26 -0
- data/lib/picobox/commands/remove_service.rb +25 -0
- data/lib/picobox/commands/remove_setup_shell.rb +28 -0
- data/lib/picobox/commands/restart.rb +21 -0
- data/lib/picobox/commands/setup_shell.rb +19 -0
- data/lib/picobox/commands/start.rb +22 -0
- data/lib/picobox/commands/start_install.rb +9 -0
- data/lib/picobox/commands/start_uninstall.rb +20 -0
- data/lib/picobox/commands/stop.rb +24 -0
- data/lib/picobox/constants.rb +14 -0
- data/lib/picobox/dns.rb +8 -0
- data/lib/picobox/docker_compose/config.rb +59 -0
- data/lib/picobox/errors/picobox_error.rb +15 -0
- data/lib/picobox/handlers/stdout_handler.rb +142 -0
- data/lib/picobox/os/abstract.rb +29 -0
- data/lib/picobox/os/current_os.rb +14 -0
- data/lib/picobox/os/darwin.rb +15 -0
- data/lib/picobox/os/linux.rb +9 -0
- data/lib/picobox/os/unsupported_os.rb +9 -0
- data/lib/picobox/project.rb +19 -0
- data/lib/picobox/service.rb +64 -0
- data/lib/picobox/services/installer.rb +41 -0
- data/lib/picobox/services/manifest.rb +50 -0
- data/lib/picobox/services/packages/elasticsearch/config.yml +14 -0
- data/lib/picobox/services/packages/memcached/config.yml +9 -0
- data/lib/picobox/services/packages/mongodb/config.yml +13 -0
- data/lib/picobox/services/packages/mysql/config.yml +17 -0
- data/lib/picobox/services/packages/postgres/config.yml +16 -0
- data/lib/picobox/services/packages/redis/config.yml +7 -0
- data/lib/picobox/shell/dot_profile.rb +42 -0
- data/lib/picobox/shell/dot_zshrc.rb +42 -0
- data/lib/picobox/shell/startup_script.rb +18 -0
- data/lib/picobox/system.rb +83 -0
- data/lib/picobox/templates/shell_extensions.bash +125 -0
- data/lib/picobox/utils/domain_event_publisher.rb +11 -0
- data/lib/picobox/utils/output.rb +69 -0
- data/lib/picobox/utils/progress_bar.rb +31 -0
- data/lib/picobox/utils/project.rb +55 -0
- data/lib/picobox/utils/shell.rb +18 -0
- data/lib/picobox/utils/visitable.rb +9 -0
- data/lib/picobox/utils/visitor_by_os.rb +29 -0
- data/lib/runner.rb +51 -0
- data/picobox.gemspec +49 -0
- metadata +386 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class ListServices < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
services = Services::Manifest.new(os).list
|
|
8
|
+
|
|
9
|
+
publish_event :list_services, services
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
attr_reader :os
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class OpenShell < Picobox::Utils::VisitorByOs
|
|
4
|
+
def initialize(service)
|
|
5
|
+
@service = service
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def visit_darwin subject
|
|
9
|
+
@os = subject.os
|
|
10
|
+
|
|
11
|
+
publish_event :opening_shell, service
|
|
12
|
+
|
|
13
|
+
raise Errors::ProjectNotInitialized unless project_initialized?
|
|
14
|
+
raise Errors::SystemDownError unless project_running?
|
|
15
|
+
|
|
16
|
+
system "bash", "-c", "docker-compose exec #{service} bash"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
attr_reader :service, :os
|
|
21
|
+
|
|
22
|
+
def project_initialized?() Utils::Project.new(os).project_initialized? end
|
|
23
|
+
def project_running?() Utils::Project.new(os).running? end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class RemoveService < Picobox::Utils::VisitorByOs
|
|
4
|
+
def initialize(type)
|
|
5
|
+
@type = type
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def visit_darwin subject
|
|
9
|
+
@os = subject.os
|
|
10
|
+
publish_event :remove_service_start, type
|
|
11
|
+
|
|
12
|
+
raise Errors::ProjectNotInitialized unless project_initialized?
|
|
13
|
+
|
|
14
|
+
Services::Installer.new(os).uninstall(type)
|
|
15
|
+
|
|
16
|
+
publish_event :remove_service_completed, type
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
attr_reader :os, :type
|
|
21
|
+
|
|
22
|
+
def project_initialized?() Utils::Project.new(os).project_initialized? end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class RemoveSetupShell < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
publish_event :remove_shell_setup_start
|
|
8
|
+
|
|
9
|
+
delete_config_directory
|
|
10
|
+
uninstall_shell_extensions
|
|
11
|
+
|
|
12
|
+
publish_event :remove_shell_setup_complete
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
attr_reader :os
|
|
17
|
+
|
|
18
|
+
def delete_config_directory
|
|
19
|
+
TTY::File.remove_file os.config_dir, force: true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def uninstall_shell_extensions
|
|
23
|
+
script = Shell::StartupScript.get(os)
|
|
24
|
+
script.uninstall_extensions
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class Restart < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
if project_running?
|
|
8
|
+
Picobox::CLI.new.stop
|
|
9
|
+
Picobox::CLI.new.start
|
|
10
|
+
else
|
|
11
|
+
Picobox::CLI.new.start
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
attr_reader :os
|
|
17
|
+
|
|
18
|
+
def project_running?() Utils::Project.new(os).running? end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class SetupShell < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
publish_event :shell_setup_start
|
|
8
|
+
|
|
9
|
+
start_up_script = Shell::StartupScript.get(@os)
|
|
10
|
+
|
|
11
|
+
TTY::File.create_dir @os.config_dir
|
|
12
|
+
|
|
13
|
+
start_up_script.install_extensions
|
|
14
|
+
|
|
15
|
+
publish_event :shell_setup_complete
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class Start < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
publish_event :starting
|
|
8
|
+
|
|
9
|
+
raise Errors::ProjectNotInitialized unless project_initialized?
|
|
10
|
+
|
|
11
|
+
system('docker-compose up -d 2>/dev/null') unless project_running?
|
|
12
|
+
publish_event :started
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
attr_reader :os
|
|
17
|
+
|
|
18
|
+
def project_initialized?() Utils::Project.new(os).project_initialized? end
|
|
19
|
+
def project_running?() Utils::Project.new(os).running? end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class StartUninstall < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
raise Errors::PicoboxNotInstalled unless picobox_installed?
|
|
8
|
+
|
|
9
|
+
publish_event :uninstall_started
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
attr_reader :os
|
|
14
|
+
|
|
15
|
+
def picobox_installed?
|
|
16
|
+
File.exist? os.config_dir
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class Stop < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
publish_event :stopping
|
|
8
|
+
|
|
9
|
+
raise Errors::ProjectNotInitialized unless project_initialized?
|
|
10
|
+
|
|
11
|
+
system('docker-compose down 2>/dev/null') if project_running?
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
publish_event :stopped
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
attr_reader :os
|
|
19
|
+
|
|
20
|
+
def project_initialized?() Utils::Project.new(os).project_initialized? end
|
|
21
|
+
def project_running?() Utils::Project.new(os).running? end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
# names for files / directories
|
|
3
|
+
VERSION = '0.1.7'
|
|
4
|
+
HOMEPAGE = 'https://github.com/surzycki/picobox'
|
|
5
|
+
CONFIG_DIR = '.picobox'
|
|
6
|
+
PROJECT_INI = 'project.ini'
|
|
7
|
+
SHELL_EXTENSIONS = 'shell_extensions'
|
|
8
|
+
|
|
9
|
+
module_function
|
|
10
|
+
def root() File.expand_path('../../..', __FILE__) end
|
|
11
|
+
def template_dir() "#{Picobox.root}/lib/picobox/templates" end
|
|
12
|
+
def box_packages_dir() "#{Picobox.root}/lib/picobox/boxes/packages" end
|
|
13
|
+
def service_packages_dir() "#{Picobox.root}/lib/picobox/services/packages" end
|
|
14
|
+
end
|
data/lib/picobox/dns.rb
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module DockerCompose
|
|
3
|
+
class Config
|
|
4
|
+
def initialize(filename)
|
|
5
|
+
@config = YAML.load_file(filename)
|
|
6
|
+
@filename = filename
|
|
7
|
+
rescue SystemCallError
|
|
8
|
+
raise Picobox::Errors::FileNotFoundError, "could not open #{filename}"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def check!(type)
|
|
13
|
+
unless config['services'].keys.include? type
|
|
14
|
+
raise Picobox::Errors::ServiceNotInstalled
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def add_service(service, links)
|
|
20
|
+
service_name = service.keys.first
|
|
21
|
+
|
|
22
|
+
services = config['services'].merge! service
|
|
23
|
+
|
|
24
|
+
links.each do |link|
|
|
25
|
+
existing_service = services[link]
|
|
26
|
+
if existing_service
|
|
27
|
+
existing_service['links'] = (existing_service['links'] || Array.new).push service_name
|
|
28
|
+
existing_service['links'].uniq!
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def remove_service(service)
|
|
35
|
+
service_name = service.keys.first
|
|
36
|
+
services = config['services']
|
|
37
|
+
|
|
38
|
+
services.delete(service_name)
|
|
39
|
+
|
|
40
|
+
services.each_value do |service|
|
|
41
|
+
if service['links']
|
|
42
|
+
service['links'].delete(service_name)
|
|
43
|
+
service.delete('links') if service['links'].empty?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def save
|
|
50
|
+
File.open(filename,'w') do |h|
|
|
51
|
+
h.write config.to_yaml
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
attr_accessor :config, :filename, :package
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Errors
|
|
3
|
+
class PicoboxError < StandardError; end
|
|
4
|
+
class UnknownError < PicoboxError; end
|
|
5
|
+
class BoxNotImplemented < PicoboxError; end
|
|
6
|
+
class ServiceNotImplemented < PicoboxError; end
|
|
7
|
+
class ServiceNotInstalled < PicoboxError; end
|
|
8
|
+
class ShellNotSupported < PicoboxError; end
|
|
9
|
+
class ProjectNotInitialized < PicoboxError; end
|
|
10
|
+
class SystemDownError < PicoboxError; end
|
|
11
|
+
class UnsupportedOsError < PicoboxError; end
|
|
12
|
+
class FileNotFoundError < PicoboxError; end
|
|
13
|
+
class PicoboxNotInstalled < PicoboxError; end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Handlers
|
|
3
|
+
class StdoutHandler
|
|
4
|
+
include Utils::Output
|
|
5
|
+
|
|
6
|
+
def install_started
|
|
7
|
+
display_line ''
|
|
8
|
+
display_line 'INSTALL PICOBOX'
|
|
9
|
+
display_line '-------------------------------'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def install_complete
|
|
13
|
+
display_info 'Install Complete', :green
|
|
14
|
+
display_line '-------------------------------'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def post_install_messages
|
|
18
|
+
display_line ''
|
|
19
|
+
display_line 'You should reload open shells to pick up shell changes'
|
|
20
|
+
display_line ''
|
|
21
|
+
display_status 'opening', 'new shell'
|
|
22
|
+
display_line ''
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def docker_present(version)
|
|
27
|
+
display_info("#{version.strip} present", :green)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def download_docker_start(size)
|
|
31
|
+
display_info('Downloading Docker', :green)
|
|
32
|
+
Utils::ProgressBar.new(size)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def download_docker_progress(progress)
|
|
36
|
+
Utils::ProgressBar.step(progress)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def download_docker_complete()
|
|
40
|
+
display_info('[green]Preparing to install Docker[/]')
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def install_docker_start(size)
|
|
44
|
+
display_info('Installing Docker', :green)
|
|
45
|
+
Utils::ProgressBar.new(size)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def install_docker_progress
|
|
49
|
+
Utils::ProgressBar.increment
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def install_docker_complete()
|
|
53
|
+
display_info('Installed Docker', :green)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def shell_setup_start
|
|
57
|
+
display_info('Setting up Shell', :green)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def remove_shell_setup_start
|
|
61
|
+
display_info('Removing shell extentions', :green)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def uninstall_started
|
|
65
|
+
display_line ''
|
|
66
|
+
display_line 'UNINSTALL PICOBOX'
|
|
67
|
+
display_line '-------------------------------'
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def uninstall_complete
|
|
71
|
+
display_info('Uninstall Complete', :green)
|
|
72
|
+
display_line '-------------------------------'
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def project_initialize_start
|
|
76
|
+
display_info('Initializing Project', :green)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def project_initialize_complete
|
|
80
|
+
display_info('Project Initialized', :green)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def add_box_start(type)
|
|
84
|
+
display_info("Adding #{type} box", :green)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def list_boxes(boxes)
|
|
88
|
+
display_info("Available boxes:", :green)
|
|
89
|
+
|
|
90
|
+
boxes.each do |box|
|
|
91
|
+
display_info(" #{box}")
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def list_services(services)
|
|
96
|
+
display_info("Available services:", :green)
|
|
97
|
+
|
|
98
|
+
services.each do |service|
|
|
99
|
+
display_info(" #{service}")
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def add_service_start(type)
|
|
104
|
+
display_info("Adding #{type} service", :green)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def add_service_completed(type)
|
|
108
|
+
display_info("Service #{type} added", :green)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def remove_service_start(type)
|
|
113
|
+
display_info("Removing #{type} service", :green)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def remove_service_completed(type)
|
|
117
|
+
display_info("Service #{type} removed", :green)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def stopping
|
|
121
|
+
display_info("Picobox stopping...", :green)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def stopped
|
|
125
|
+
display_info("Picobox stopped!", :green)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def starting
|
|
129
|
+
display_info("Picobox starting...", :green)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def started
|
|
133
|
+
display_info("Picobox started!", :green)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def opening_shell(service)
|
|
137
|
+
display_info("Getting shell", :green)
|
|
138
|
+
display_status('open', "Running \e[33m#{service}\e[0m shell", :green)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|