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.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +4 -0
  4. data/DOCKER_INFO.md +3 -0
  5. data/Gemfile +4 -0
  6. data/Guardfile +47 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +146 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/pixiebox +5 -0
  12. data/bin/pixiebox_dev +10 -0
  13. data/bin/rake +17 -0
  14. data/bin/setup +8 -0
  15. data/lib/pixiebox.rb +88 -0
  16. data/lib/pixiebox/box.rb +31 -0
  17. data/lib/pixiebox/boxes/installer.rb +55 -0
  18. data/lib/pixiebox/boxes/manifest.rb +59 -0
  19. data/lib/pixiebox/cli.rb +214 -0
  20. data/lib/pixiebox/commands/add_box.rb +25 -0
  21. data/lib/pixiebox/commands/add_service.rb +27 -0
  22. data/lib/pixiebox/commands/build_service.rb +23 -0
  23. data/lib/pixiebox/commands/download_docker.rb +35 -0
  24. data/lib/pixiebox/commands/finish_install.rb +16 -0
  25. data/lib/pixiebox/commands/finish_uninstall.rb +14 -0
  26. data/lib/pixiebox/commands/get_root_permission.rb +14 -0
  27. data/lib/pixiebox/commands/initialize_project.rb +32 -0
  28. data/lib/pixiebox/commands/install_config.rb +17 -0
  29. data/lib/pixiebox/commands/install_docker.rb +55 -0
  30. data/lib/pixiebox/commands/list_boxes.rb +16 -0
  31. data/lib/pixiebox/commands/list_services.rb +16 -0
  32. data/lib/pixiebox/commands/reload_shell.rb +15 -0
  33. data/lib/pixiebox/commands/remove_service.rb +27 -0
  34. data/lib/pixiebox/commands/remove_setup_shell.rb +19 -0
  35. data/lib/pixiebox/commands/restart.rb +21 -0
  36. data/lib/pixiebox/commands/setup_shell.rb +18 -0
  37. data/lib/pixiebox/commands/ssh_instance.rb +27 -0
  38. data/lib/pixiebox/commands/start.rb +20 -0
  39. data/lib/pixiebox/commands/start_install.rb +14 -0
  40. data/lib/pixiebox/commands/start_uninstall.rb +16 -0
  41. data/lib/pixiebox/commands/stop.rb +20 -0
  42. data/lib/pixiebox/commands/update_packages.rb +46 -0
  43. data/lib/pixiebox/constants.rb +26 -0
  44. data/lib/pixiebox/dns.rb +8 -0
  45. data/lib/pixiebox/docker_compose/config.rb +59 -0
  46. data/lib/pixiebox/errors/pixiebox_error.rb +17 -0
  47. data/lib/pixiebox/handlers/stdout_handler.rb +179 -0
  48. data/lib/pixiebox/os/abstract.rb +40 -0
  49. data/lib/pixiebox/os/current_os.rb +15 -0
  50. data/lib/pixiebox/os/darwin.rb +20 -0
  51. data/lib/pixiebox/os/distro.rb +45 -0
  52. data/lib/pixiebox/os/linux.rb +21 -0
  53. data/lib/pixiebox/os/unsupported_os.rb +9 -0
  54. data/lib/pixiebox/project.rb +19 -0
  55. data/lib/pixiebox/service.rb +50 -0
  56. data/lib/pixiebox/services/installer.rb +41 -0
  57. data/lib/pixiebox/services/manifest.rb +50 -0
  58. data/lib/pixiebox/shell/bash.rb +18 -0
  59. data/lib/pixiebox/shell/ini_file.rb +38 -0
  60. data/lib/pixiebox/shell/startup_script.rb +53 -0
  61. data/lib/pixiebox/shell/zsh.rb +9 -0
  62. data/lib/pixiebox/system.rb +69 -0
  63. data/lib/pixiebox/utils/domain_event_publisher.rb +11 -0
  64. data/lib/pixiebox/utils/output.rb +105 -0
  65. data/lib/pixiebox/utils/packages.rb +35 -0
  66. data/lib/pixiebox/utils/progress_bar.rb +31 -0
  67. data/lib/pixiebox/utils/project.rb +55 -0
  68. data/lib/pixiebox/utils/shell.rb +18 -0
  69. data/lib/pixiebox/utils/spinner.rb +27 -0
  70. data/lib/pixiebox/utils/visitable.rb +9 -0
  71. data/lib/pixiebox/utils/visitor_by_os.rb +32 -0
  72. data/lib/runner.rb +51 -0
  73. data/pixiebox.gemspec +52 -0
  74. 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
@@ -0,0 +1,8 @@
1
+ module Pixiebox
2
+ #class Dns < Thor
3
+ # desc "command", "an example task"
4
+ # def command
5
+ # puts "I'm a thor task!"
6
+ # end
7
+ #end
8
+ end
@@ -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,15 @@
1
+ module Pixiebox
2
+ module Os
3
+ class CurrentOs
4
+ class << self
5
+ def get
6
+ os = TTY::Platform.new.os
7
+ case os
8
+ when 'darwin' then Darwin
9
+ when 'linux' then Linux
10
+ else UnsupportedOs end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ 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