pixiebox 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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