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,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: '2'
|
|
3
|
+
volumes:
|
|
4
|
+
db-data:
|
|
5
|
+
external: false
|
|
6
|
+
bundle-data:
|
|
7
|
+
external: false
|
|
8
|
+
services:
|
|
9
|
+
dev:
|
|
10
|
+
build: "."
|
|
11
|
+
entrypoint: ".picobox/start"
|
|
12
|
+
volumes:
|
|
13
|
+
- ".:/var/www:cached"
|
|
14
|
+
volumes_from:
|
|
15
|
+
- bundle
|
|
16
|
+
environment:
|
|
17
|
+
BUNDLE_PATH: "/bundle"
|
|
18
|
+
hostname: picobox
|
|
19
|
+
bundle:
|
|
20
|
+
image: busybox
|
|
21
|
+
volumes:
|
|
22
|
+
- bundle-data:/bundle:cached
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Boxes
|
|
3
|
+
class Unpacker
|
|
4
|
+
def initialize(os)
|
|
5
|
+
@os = os
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def unpack(type)
|
|
9
|
+
@manifest = Manifest.new(os, type)
|
|
10
|
+
@manifest.check! # raises an exception if we can't find the type in the manifest
|
|
11
|
+
|
|
12
|
+
unpack_start_script
|
|
13
|
+
unpack_docker_files
|
|
14
|
+
unpack_additional_files
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
attr_reader :os, :manifest
|
|
19
|
+
|
|
20
|
+
def unpack_start_script
|
|
21
|
+
# start script
|
|
22
|
+
TTY::File.copy_file(
|
|
23
|
+
manifest.source.start_script,
|
|
24
|
+
manifest.dest.start_script
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
TTY::File.chmod(manifest.dest.start_script, 0777)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def unpack_docker_files
|
|
31
|
+
# docker-compose.yml
|
|
32
|
+
TTY::File.copy_file(
|
|
33
|
+
manifest.source.docker_compose,
|
|
34
|
+
manifest.dest.docker_compose
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Dockerfile
|
|
38
|
+
TTY::File.copy_file(
|
|
39
|
+
manifest.source.dockerfile,
|
|
40
|
+
manifest.dest.dockerfile
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def unpack_additional_files
|
|
45
|
+
# unpack remaining in project root director
|
|
46
|
+
manifest.additional_files.each do |file|
|
|
47
|
+
TTY::File.copy_file(
|
|
48
|
+
file[:source],
|
|
49
|
+
file[:dest]
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
data/lib/picobox/cli.rb
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
class ServiceSubCommands < Thor
|
|
3
|
+
desc 'build [SERVICE] optional', 'builds the picobox'
|
|
4
|
+
long_desc <<-LONGDESC
|
|
5
|
+
LONGDESC
|
|
6
|
+
def build(service = nil)
|
|
7
|
+
Service.new(Os::CurrentOs.get).build service
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
desc 'add [SERVICE]', 'adds a service to your box'
|
|
12
|
+
long_desc <<-LONGDESC
|
|
13
|
+
LONGDESC
|
|
14
|
+
def add(*services)
|
|
15
|
+
Service.new(Os::CurrentOs.get).add services
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
desc 'remove [SERVICE]', 'removes a service from your box'
|
|
20
|
+
long_desc <<-LONGDESC
|
|
21
|
+
LONGDESC
|
|
22
|
+
def remove(service)
|
|
23
|
+
Service.new(Os::CurrentOs.get).remove service
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
desc 'list', 'list available services'
|
|
28
|
+
long_desc <<-LONGDESC
|
|
29
|
+
LONGDESC
|
|
30
|
+
def list()
|
|
31
|
+
Service.new(Os::CurrentOs.get).list
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class DnsSubCommands < Thor
|
|
36
|
+
desc 'add', 'add entry to DNS'
|
|
37
|
+
long_desc <<-LONGDESC
|
|
38
|
+
LONGDESC
|
|
39
|
+
method_option :port, default: 3000
|
|
40
|
+
def add(entry)
|
|
41
|
+
puts "I'm a thor task! #{options}"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class CLI < Thor
|
|
46
|
+
include Utils::Output
|
|
47
|
+
|
|
48
|
+
desc 'dns SUBCOMMAND', 'do things with the DNS'
|
|
49
|
+
long_desc <<-LONGDESC
|
|
50
|
+
LONGDESC
|
|
51
|
+
subcommand 'dns', Picobox::DnsSubCommands
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
desc 'service SUBCOMMAND', 'do things with the SERVICES'
|
|
55
|
+
long_desc <<-LONGDESC
|
|
56
|
+
LONGDESC
|
|
57
|
+
subcommand 'service', Picobox::ServiceSubCommands
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
desc 'version', 'displays current version'
|
|
61
|
+
def version
|
|
62
|
+
say Picobox::VERSION
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
desc 'install', 'installs picobox'
|
|
67
|
+
long_desc <<-LONGDESC
|
|
68
|
+
LONGDESC
|
|
69
|
+
def install
|
|
70
|
+
System.new(Os::CurrentOs.get).install
|
|
71
|
+
Utils::Shell.new(Os::CurrentOs.get).reload
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
desc 'update', 'udpates picobox'
|
|
76
|
+
long_desc <<-LONGDESC
|
|
77
|
+
LONGDESC
|
|
78
|
+
def update
|
|
79
|
+
System.new(Os::CurrentOs.get).install
|
|
80
|
+
Utils::Shell.new(Os::CurrentOs.get).reload
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
desc 'uninstall', 'removes picobox'
|
|
85
|
+
long_desc <<-LONGDESC
|
|
86
|
+
LONGDESC
|
|
87
|
+
def uninstall
|
|
88
|
+
System.new(Os::CurrentOs.get).uninstall
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
desc 'init [BOX]', 'initialize directory for use with picobox'
|
|
93
|
+
long_desc <<-LONGDESC
|
|
94
|
+
LONGDESC
|
|
95
|
+
def init(box)
|
|
96
|
+
os = Os::CurrentOs.get
|
|
97
|
+
|
|
98
|
+
Project.new(os).init
|
|
99
|
+
Box.new(os).install box
|
|
100
|
+
Service.new(os).build
|
|
101
|
+
System.new(os).start
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
desc 'start', 'start picobox'
|
|
106
|
+
long_desc <<-LONGDESC
|
|
107
|
+
LONGDESC
|
|
108
|
+
def start()
|
|
109
|
+
System.new(Os::CurrentOs.get).start
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
desc 'stop', 'stop picobox'
|
|
114
|
+
long_desc <<-LONGDESC
|
|
115
|
+
LONGDESC
|
|
116
|
+
def stop()
|
|
117
|
+
System.new(Os::CurrentOs.get).stop
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
desc 'restart', 'restart picobox'
|
|
122
|
+
long_desc <<-LONGDESC
|
|
123
|
+
LONGDESC
|
|
124
|
+
def restart()
|
|
125
|
+
System.new(Os::CurrentOs.get).restart
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
desc 'ssh [SERVICE]', 'open shell to service'
|
|
130
|
+
long_desc <<-LONGDESC
|
|
131
|
+
LONGDESC
|
|
132
|
+
def ssh(service)
|
|
133
|
+
System.new(Os::CurrentOs.get).open_shell service
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
desc 'boxes', 'list of available boxes'
|
|
138
|
+
long_desc <<-LONGDESC
|
|
139
|
+
LONGDESC
|
|
140
|
+
def boxes()
|
|
141
|
+
Box.new(Os::CurrentOs.get).list
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
desc 'status', 'current status of containers'
|
|
146
|
+
long_desc <<-LONGDESC
|
|
147
|
+
LONGDESC
|
|
148
|
+
def status()
|
|
149
|
+
system "docker-compose ps"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
desc 'clean', 'clean stop containers'
|
|
154
|
+
long_desc <<-LONGDESC
|
|
155
|
+
LONGDESC
|
|
156
|
+
def clean()
|
|
157
|
+
display_info('Cleaning stopped containers', :green)
|
|
158
|
+
display_status('execute', 'container prune')
|
|
159
|
+
system "docker container prune"
|
|
160
|
+
system "docker volume prune"
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class AddBox < 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 :add_box_start, type
|
|
11
|
+
|
|
12
|
+
raise Errors::ProjectNotInitialized unless project_initialized?
|
|
13
|
+
|
|
14
|
+
Boxes::Unpacker.new(os).unpack(type)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
attr_reader :os, :type
|
|
19
|
+
|
|
20
|
+
def project_initialized?() Utils::Project.new(os).project_initialized? end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class AddService < Picobox::Utils::VisitorByOs
|
|
4
|
+
def initialize(service)
|
|
5
|
+
@service = service
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def visit_darwin subject
|
|
9
|
+
@os = subject.os
|
|
10
|
+
publish_event :add_service_start, service
|
|
11
|
+
|
|
12
|
+
raise Errors::ProjectNotInitialized unless project_initialized?
|
|
13
|
+
|
|
14
|
+
Services::Installer.new(os).install(service)
|
|
15
|
+
|
|
16
|
+
publish_event :add_service_completed, service
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
attr_reader :os, :service
|
|
21
|
+
|
|
22
|
+
def project_initialized?() Utils::Project.new(os).project_initialized? end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class BuildService < Picobox::Utils::VisitorByOs
|
|
4
|
+
def initialize(service)
|
|
5
|
+
@service = service
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def visit_darwin subject
|
|
9
|
+
system "docker-compose build #{service}"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
attr_reader :service
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class DownloadDocker < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
unless subject.os.docker_installed?
|
|
6
|
+
stream = open(subject.os.docker_url,
|
|
7
|
+
content_length_proc: lambda { |total| publish_event :download_docker_start, total },
|
|
8
|
+
progress_proc: lambda { |step| publish_event :download_docker_progress, step }
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
IO.copy_stream( stream, subject.os.docker_installer )
|
|
12
|
+
publish_event :download_docker_complete
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class InitializeProject < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
publish_event :project_initialize_start
|
|
8
|
+
|
|
9
|
+
create_project_config_dir
|
|
10
|
+
create_project_ini
|
|
11
|
+
|
|
12
|
+
publish_event :project_initialize_complete
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
attr_reader :os
|
|
17
|
+
|
|
18
|
+
def create_project_config_dir
|
|
19
|
+
# for now just empty dir, but eventualy add flags with ini files 'ie enabled, etc'
|
|
20
|
+
# https://github.com/albfan/bash-ini-parser
|
|
21
|
+
TTY::File.create_dir project_config_dir
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def create_project_ini
|
|
25
|
+
TTY::File.create_file "#{project_config_dir}/#{Picobox::PROJECT_INI}" do |content|
|
|
26
|
+
"[project]\nroot=#{os.current_dir}\n"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def project_config_dir
|
|
31
|
+
"#{os.current_dir}/#{Picobox::CONFIG_DIR}"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class InstallDocker < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
unless subject.os.docker_installed?
|
|
6
|
+
commands = [
|
|
7
|
+
"/usr/bin/hdiutil attach -noidme -nobrowse -quiet #{subject.os.docker_installer}",
|
|
8
|
+
"cp -R /Volumes/Docker/Docker.app /Applications",
|
|
9
|
+
"open -a Docker",
|
|
10
|
+
"/usr/bin/hdiutil unmount -quiet /Volumes/Docker"
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
publish_event :install_docker_start, commands.length
|
|
14
|
+
|
|
15
|
+
commands.each do |command|
|
|
16
|
+
system(command)
|
|
17
|
+
publish_event :install_docker_progress
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
publish_event :install_docker_complete
|
|
21
|
+
else
|
|
22
|
+
publish_event :docker_present, subject.os.docker_version?
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Picobox
|
|
2
|
+
module Commands
|
|
3
|
+
class ListBoxes < Picobox::Utils::VisitorByOs
|
|
4
|
+
def visit_darwin subject
|
|
5
|
+
@os = subject.os
|
|
6
|
+
|
|
7
|
+
boxes = Boxes::Manifest.new(os).list
|
|
8
|
+
|
|
9
|
+
publish_event :list_boxes, boxes
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
attr_reader :os
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|