pixiebox 0.1.0
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 +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
|