pixiebox 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 +17 -0
- data/.rspec +4 -0
- data/DOCKER_INFO.md +3 -0
- data/Gemfile +4 -0
- data/Guardfile +47 -0
- data/LICENSE.txt +21 -0
- data/README.md +146 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/pixiebox +5 -0
- data/bin/pixiebox_dev +10 -0
- data/bin/rake +17 -0
- data/bin/setup +8 -0
- data/lib/pixiebox.rb +88 -0
- data/lib/pixiebox/box.rb +31 -0
- data/lib/pixiebox/boxes/installer.rb +55 -0
- data/lib/pixiebox/boxes/manifest.rb +59 -0
- data/lib/pixiebox/cli.rb +214 -0
- data/lib/pixiebox/commands/add_box.rb +25 -0
- data/lib/pixiebox/commands/add_service.rb +27 -0
- data/lib/pixiebox/commands/build_service.rb +23 -0
- data/lib/pixiebox/commands/download_docker.rb +35 -0
- data/lib/pixiebox/commands/finish_install.rb +16 -0
- data/lib/pixiebox/commands/finish_uninstall.rb +14 -0
- data/lib/pixiebox/commands/get_root_permission.rb +14 -0
- data/lib/pixiebox/commands/initialize_project.rb +32 -0
- data/lib/pixiebox/commands/install_config.rb +17 -0
- data/lib/pixiebox/commands/install_docker.rb +55 -0
- data/lib/pixiebox/commands/list_boxes.rb +16 -0
- data/lib/pixiebox/commands/list_services.rb +16 -0
- data/lib/pixiebox/commands/reload_shell.rb +15 -0
- data/lib/pixiebox/commands/remove_service.rb +27 -0
- data/lib/pixiebox/commands/remove_setup_shell.rb +19 -0
- data/lib/pixiebox/commands/restart.rb +21 -0
- data/lib/pixiebox/commands/setup_shell.rb +18 -0
- data/lib/pixiebox/commands/ssh_instance.rb +27 -0
- data/lib/pixiebox/commands/start.rb +20 -0
- data/lib/pixiebox/commands/start_install.rb +14 -0
- data/lib/pixiebox/commands/start_uninstall.rb +16 -0
- data/lib/pixiebox/commands/stop.rb +20 -0
- data/lib/pixiebox/commands/update_packages.rb +46 -0
- data/lib/pixiebox/constants.rb +26 -0
- data/lib/pixiebox/dns.rb +8 -0
- data/lib/pixiebox/docker_compose/config.rb +59 -0
- data/lib/pixiebox/errors/pixiebox_error.rb +17 -0
- data/lib/pixiebox/handlers/stdout_handler.rb +179 -0
- data/lib/pixiebox/os/abstract.rb +40 -0
- data/lib/pixiebox/os/current_os.rb +15 -0
- data/lib/pixiebox/os/darwin.rb +20 -0
- data/lib/pixiebox/os/distro.rb +45 -0
- data/lib/pixiebox/os/linux.rb +21 -0
- data/lib/pixiebox/os/unsupported_os.rb +9 -0
- data/lib/pixiebox/project.rb +19 -0
- data/lib/pixiebox/service.rb +50 -0
- data/lib/pixiebox/services/installer.rb +41 -0
- data/lib/pixiebox/services/manifest.rb +50 -0
- data/lib/pixiebox/shell/bash.rb +18 -0
- data/lib/pixiebox/shell/ini_file.rb +38 -0
- data/lib/pixiebox/shell/startup_script.rb +53 -0
- data/lib/pixiebox/shell/zsh.rb +9 -0
- data/lib/pixiebox/system.rb +69 -0
- data/lib/pixiebox/utils/domain_event_publisher.rb +11 -0
- data/lib/pixiebox/utils/output.rb +105 -0
- data/lib/pixiebox/utils/packages.rb +35 -0
- data/lib/pixiebox/utils/progress_bar.rb +31 -0
- data/lib/pixiebox/utils/project.rb +55 -0
- data/lib/pixiebox/utils/shell.rb +18 -0
- data/lib/pixiebox/utils/spinner.rb +27 -0
- data/lib/pixiebox/utils/visitable.rb +9 -0
- data/lib/pixiebox/utils/visitor_by_os.rb +32 -0
- data/lib/runner.rb +51 -0
- data/pixiebox.gemspec +52 -0
- metadata +424 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
module Pixiebox
|
2
|
+
# names for files / directories
|
3
|
+
VERSION = '0.1.0'
|
4
|
+
HOMEPAGE = 'https://github.com/aimerib/pixiebox'
|
5
|
+
PACKAGES_INFO_URL = 'https://api.github.com/repos/aimerib/packages/releases/latest'
|
6
|
+
CONFIG_DIR = '.pixiebox'
|
7
|
+
PROJECT_INI = 'project.ini'
|
8
|
+
PIXIEBOX_INI = 'pixiebox.ini'
|
9
|
+
SHELL_EXTENSIONS = 'extensions.bash'
|
10
|
+
|
11
|
+
|
12
|
+
module_function
|
13
|
+
def root() File.expand_path('../../..', __FILE__) end
|
14
|
+
|
15
|
+
def output() @output end
|
16
|
+
def verbose?() @verbose end
|
17
|
+
|
18
|
+
def set_verbosity(value)
|
19
|
+
@verbose = value
|
20
|
+
if @verbose
|
21
|
+
@output = '2>&1'
|
22
|
+
else
|
23
|
+
@output = '> /dev/null 2>&1'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/pixiebox/dns.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
module Pixiebox
|
2
|
+
module DockerCompose
|
3
|
+
class Config
|
4
|
+
def initialize(filename)
|
5
|
+
@config = YAML.load_file(filename)
|
6
|
+
@filename = filename
|
7
|
+
rescue SystemCallError
|
8
|
+
raise Pixiebox::Errors::FileNotFoundError, "could not open #{filename}"
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def check!(type)
|
13
|
+
unless config['services'].keys.include? type
|
14
|
+
raise Pixiebox::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,17 @@
|
|
1
|
+
module Pixiebox
|
2
|
+
module Errors
|
3
|
+
class PixieboxError < StandardError; end
|
4
|
+
class UnknownError < PixieboxError; end
|
5
|
+
class BoxNotImplemented < PixieboxError; end
|
6
|
+
class ServiceNotImplemented < PixieboxError; end
|
7
|
+
class ServiceNotInstalled < PixieboxError; end
|
8
|
+
class ShellNotSupported < PixieboxError; end
|
9
|
+
class ProjectNotInitialized < PixieboxError; end
|
10
|
+
class SystemDownError < PixieboxError; end
|
11
|
+
class UnsupportedOsError < PixieboxError; end
|
12
|
+
class FileNotFoundError < PixieboxError; end
|
13
|
+
class PixieboxNotInstalled < PixieboxError; end
|
14
|
+
class DistroNotSupported < PixieboxError; end
|
15
|
+
class DockerError < PixieboxError; end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
module Pixiebox
|
2
|
+
module Handlers
|
3
|
+
class StdoutHandler
|
4
|
+
include Utils::Output
|
5
|
+
|
6
|
+
def install_started
|
7
|
+
display_line ''
|
8
|
+
display_line 'INSTALL PIXIEBOX'
|
9
|
+
display_line '-------------------------------'
|
10
|
+
end
|
11
|
+
|
12
|
+
def install_complete
|
13
|
+
display_info 'Install Complete', :green
|
14
|
+
display_line '-------------------------------'
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_post_install_message(message)
|
18
|
+
@post_install_messages = (@post_install_messages || Array.new).push message
|
19
|
+
end
|
20
|
+
|
21
|
+
def post_install_messages
|
22
|
+
display_line ''
|
23
|
+
|
24
|
+
@post_install_messages.each do |message|
|
25
|
+
display_line message
|
26
|
+
display_line ''
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def docker_present(version)
|
31
|
+
display_info("#{version.capitalize} present", :green)
|
32
|
+
end
|
33
|
+
|
34
|
+
def download_docker_start(size)
|
35
|
+
display_info('Downloading Docker', :green)
|
36
|
+
Utils::ProgressBar.new(size)
|
37
|
+
end
|
38
|
+
|
39
|
+
def download_progress(progress)
|
40
|
+
Utils::ProgressBar.step(progress)
|
41
|
+
end
|
42
|
+
|
43
|
+
def download_docker_complete()
|
44
|
+
display_info('Preparing to install Docker', :green)
|
45
|
+
end
|
46
|
+
|
47
|
+
def download_docker_compose_start(size)
|
48
|
+
display_info('Downloading Docker Compose', :green)
|
49
|
+
Utils::ProgressBar.new(size)
|
50
|
+
end
|
51
|
+
|
52
|
+
def download_docker_compose_complete()
|
53
|
+
display_info('Preparing to install Docker Compose', :green)
|
54
|
+
end
|
55
|
+
|
56
|
+
def install_docker_start()
|
57
|
+
Utils::Spinner.new('Installing Docker')
|
58
|
+
end
|
59
|
+
|
60
|
+
def install_docker_complete()
|
61
|
+
Utils::Spinner.stop
|
62
|
+
display_info('Installed Docker', :green)
|
63
|
+
end
|
64
|
+
|
65
|
+
def shell_setup_start
|
66
|
+
display_info('Setting up Shell', :green)
|
67
|
+
end
|
68
|
+
|
69
|
+
def reload_shell
|
70
|
+
display_status 'opening', 'new shell'
|
71
|
+
display_line ''
|
72
|
+
end
|
73
|
+
|
74
|
+
def remove_shell_setup_start
|
75
|
+
display_info('Removing shell extentions', :green)
|
76
|
+
end
|
77
|
+
|
78
|
+
def uninstall_started
|
79
|
+
display_line ''
|
80
|
+
display_line 'UNINSTALL PIXIEBOX'
|
81
|
+
display_line '-------------------------------'
|
82
|
+
end
|
83
|
+
|
84
|
+
def uninstall_complete
|
85
|
+
display_info('Uninstall Complete', :green)
|
86
|
+
display_line '-------------------------------'
|
87
|
+
end
|
88
|
+
|
89
|
+
def project_initialize_start
|
90
|
+
display_info('Initializing Project', :green)
|
91
|
+
end
|
92
|
+
|
93
|
+
def project_initialize_complete
|
94
|
+
display_info('Project Initialized', :green)
|
95
|
+
end
|
96
|
+
|
97
|
+
def add_box_start(type)
|
98
|
+
display_info("Adding #{type} box", :green)
|
99
|
+
end
|
100
|
+
|
101
|
+
def build_service_start(service)
|
102
|
+
Utils::Spinner.new("Building Service #{service} (5-10min)")
|
103
|
+
end
|
104
|
+
|
105
|
+
def build_service_stop
|
106
|
+
Utils::Spinner.stop
|
107
|
+
display_info("Service built", :green)
|
108
|
+
end
|
109
|
+
|
110
|
+
def list_boxes(boxes)
|
111
|
+
display_info("Available boxes:", :green)
|
112
|
+
|
113
|
+
boxes.each do |box|
|
114
|
+
display_info(" #{box}")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def list_services(services)
|
119
|
+
display_info("Available services:", :green)
|
120
|
+
|
121
|
+
services.each do |service|
|
122
|
+
display_info(" #{service}")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def add_service_start(type)
|
127
|
+
display_info("Adding #{type} service", :green)
|
128
|
+
end
|
129
|
+
|
130
|
+
def add_service_completed(type)
|
131
|
+
display_info("Service #{type} added", :green)
|
132
|
+
end
|
133
|
+
|
134
|
+
def remove_service_start(type)
|
135
|
+
display_info("Removing #{type} service", :green)
|
136
|
+
end
|
137
|
+
|
138
|
+
def remove_service_completed(type)
|
139
|
+
display_info("Service #{type} removed", :green)
|
140
|
+
end
|
141
|
+
|
142
|
+
def stopping
|
143
|
+
Utils::Spinner.new('Pixiebox stopping')
|
144
|
+
end
|
145
|
+
|
146
|
+
def stopped
|
147
|
+
Utils::Spinner.stop
|
148
|
+
display_info("Pixiebox stopped!", :green)
|
149
|
+
end
|
150
|
+
|
151
|
+
def starting
|
152
|
+
Utils::Spinner.new('Pixiebox starting')
|
153
|
+
end
|
154
|
+
|
155
|
+
def started
|
156
|
+
Utils::Spinner.stop
|
157
|
+
display_info("Pixiebox started!", :green)
|
158
|
+
end
|
159
|
+
|
160
|
+
def opening_shell(service)
|
161
|
+
display_info("Getting shell", :green)
|
162
|
+
display_status('open', "Running \e[33m#{service}\e[0m shell", :green)
|
163
|
+
end
|
164
|
+
|
165
|
+
def update_packages_start
|
166
|
+
Utils::Spinner.new('Updating packages')
|
167
|
+
end
|
168
|
+
|
169
|
+
def update_packages_stop
|
170
|
+
Utils::Spinner.stop
|
171
|
+
display_info("Packages updated!", :green)
|
172
|
+
end
|
173
|
+
|
174
|
+
def config_setup_start
|
175
|
+
display_info("Setting up Config", :green)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Pixiebox
|
2
|
+
module Os
|
3
|
+
class Abstract
|
4
|
+
class << self
|
5
|
+
def tmp_dir() '/tmp' end
|
6
|
+
def home_dir() "#{ENV['HOME']}" end
|
7
|
+
def current_dir() `pwd`.strip end
|
8
|
+
|
9
|
+
def config_dir() "#{home_dir}/#{Pixiebox::CONFIG_DIR}" end
|
10
|
+
def packages_dir() "#{config_dir}/packages" end
|
11
|
+
def box_packages_dir() "#{packages_dir}/boxes" end
|
12
|
+
def service_packages_dir() "#{packages_dir}/services" end
|
13
|
+
def extensions_dir() "#{packages_dir}/shell" end
|
14
|
+
def shell_extensions() "#{extensions_dir}/#{Pixiebox::SHELL_EXTENSIONS}" end
|
15
|
+
|
16
|
+
def user() "#{ENV['USER']}" end
|
17
|
+
def user_shell() "#{ENV['SHELL']}" end
|
18
|
+
|
19
|
+
# download and install
|
20
|
+
def docker_filename() end
|
21
|
+
def docker_url() end
|
22
|
+
def docker_installer() end
|
23
|
+
def docker_installed?() end
|
24
|
+
def docker_compose_installed?() end
|
25
|
+
|
26
|
+
def docker_version?() `docker --version`.strip end
|
27
|
+
def docker_compose_version?() `docker-compose --version`.strip end
|
28
|
+
|
29
|
+
def to_s() raise ::NotImplementedError, 'must override to_s' end
|
30
|
+
|
31
|
+
def project_root() Utils::Project.new(self).root end
|
32
|
+
def reload_shell() system("exec #{user_shell} -l") end
|
33
|
+
|
34
|
+
def pixiebox_installed?() File.exist? config_dir end
|
35
|
+
def project_initialized?() Utils::Project.new(self).project_initialized? end
|
36
|
+
def project_running?() Utils::Project.new(self).running? end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Pixiebox
|
2
|
+
module Os
|
3
|
+
class Darwin < Abstract
|
4
|
+
class << self
|
5
|
+
# download and install
|
6
|
+
def docker_filename() 'Docker.dmg' end
|
7
|
+
def docker_url() "https://download.docker.com/mac/stable/#{docker_filename}" end
|
8
|
+
def docker_installer() "#{tmp_dir}/#{docker_filename}" end
|
9
|
+
|
10
|
+
def docker_installed?() File.exist?('/Applications/Docker.app') end
|
11
|
+
def docker_compose_installed() true end
|
12
|
+
|
13
|
+
def distro() :darwin end
|
14
|
+
def su() Os::Distro.su(self) end
|
15
|
+
|
16
|
+
def to_s() :darwin end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Pixiebox
|
2
|
+
module Os
|
3
|
+
class Distro
|
4
|
+
class << self
|
5
|
+
def distro
|
6
|
+
case `lsb_release -ids`.strip
|
7
|
+
when /(Ubuntu)/
|
8
|
+
:ubuntu
|
9
|
+
when /(Debian)/
|
10
|
+
:debian
|
11
|
+
when /(Fedora)/
|
12
|
+
:fedora
|
13
|
+
else
|
14
|
+
:unknown
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def su(os)
|
19
|
+
su ||= if TTY::Which.exist?('sudo') && os.user != 'root'
|
20
|
+
'sudo -E sh -c'
|
21
|
+
elsif os.user == 'root'
|
22
|
+
message = <<-END.gsub(/^\s+\|/, '')
|
23
|
+
|Not a great idea to install things as root user.
|
24
|
+
|
|
25
|
+
| You need to:
|
26
|
+
| * Install sudo and add yourself to sudoers
|
27
|
+
|
|
28
|
+
END
|
29
|
+
raise StandardError, message
|
30
|
+
else
|
31
|
+
message = <<-END.gsub(/^\s+\|/, '')
|
32
|
+
|This installer needs the ability to run commands as root.
|
33
|
+
| We are unable to find 'sudo' available to make this happen.
|
34
|
+
|
|
35
|
+
| You need to:
|
36
|
+
| * Install sudo and add yourself to sudoers
|
37
|
+
|
|
38
|
+
END
|
39
|
+
raise StandardError, message
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pixiebox
|
2
|
+
module Os
|
3
|
+
class Linux < Abstract
|
4
|
+
class << self
|
5
|
+
def to_s() :linux end
|
6
|
+
|
7
|
+
def docker_installed?() TTY::Which.exist?('docker') end
|
8
|
+
def docker_compose_installed?() TTY::Which.exist?('docker-compose') end
|
9
|
+
|
10
|
+
def docker_compose_url() "https://github.com/docker/compose/releases/download/1.16.1/docker-compose-Linux-#{self.arch}" end
|
11
|
+
def docker_compose() "/usr/local/bin/docker-compose" end
|
12
|
+
|
13
|
+
def release() `lsb_release -cs`.strip end
|
14
|
+
def kernel() `uname -r`.strip end
|
15
|
+
def arch() `uname -m`.strip end
|
16
|
+
def distro() Os::Distro.distro end
|
17
|
+
def su() Os::Distro.su(self) end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|