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,16 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class FinishInstall < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :add_post_install_message, 'You should reload open shells to pick up shell changes'
6
+ publish_event :install_complete
7
+ publish_event :post_install_messages
8
+ end
9
+
10
+
11
+ def visit_linux subject
12
+ visit_darwin subject
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class FinishUninstall < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :uninstall_complete
6
+ end
7
+
8
+
9
+ def visit_linux subject
10
+ publish_event :uninstall_complete
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class GetRootPermission < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+
6
+ end
7
+
8
+
9
+ def visit_linux subject
10
+ system "#{os.su} 'echo 1 > /dev/null'"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class InitializeProject < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ raise Errors::PixieboxNotInstalled unless os.pixiebox_installed?
6
+
7
+ publish_event :project_initialize_start
8
+
9
+ # create project config_dir
10
+ TTY::File.create_dir project_config_dir
11
+
12
+ # create project ini
13
+ TTY::File.create_file "#{project_config_dir}/#{Pixiebox::PROJECT_INI}" do |content|
14
+ "[project]\nenabled=true\n"
15
+ end
16
+
17
+ publish_event :project_initialize_complete
18
+ end
19
+
20
+
21
+ def visit_linux subject
22
+ visit_darwin subject
23
+ end
24
+
25
+
26
+ private
27
+ def project_config_dir
28
+ "#{os.current_dir}/#{Pixiebox::CONFIG_DIR}"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class InstallConfig < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :config_setup_start
6
+
7
+ TTY::File.create_dir os.config_dir
8
+ Shell::IniFile.get(os).install
9
+ end
10
+
11
+
12
+ def visit_linux subject
13
+ visit_darwin subject
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,55 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class InstallDocker < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ unless 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
14
+
15
+ commands.each do |command|
16
+ system(command)
17
+ end
18
+
19
+ publish_event :install_docker_complete
20
+ else
21
+ publish_event :docker_present, os.docker_version?
22
+ end
23
+ end
24
+
25
+
26
+ def visit_linux subject
27
+ unless os.docker_installed?
28
+ publish_event :install_docker_start
29
+
30
+ stream = open('https://get.docker.com')
31
+
32
+ IO.copy_stream( stream, 'get-docker.sh' )
33
+
34
+ commands = [
35
+ "sh get-docker.sh #{Pixiebox.output}",
36
+ "rm get-docker.sh",
37
+ "#{os.su} 'usermod -aG docker #{os.user}'"
38
+ ]
39
+
40
+ commands.each do |command|
41
+ system(command)
42
+ end
43
+
44
+ publish_event :add_post_install_message, "If you would like to use Docker as a non-root user\nyou will have to log out and back in for this to take effect!"
45
+
46
+ publish_event :install_docker_complete
47
+
48
+ else
49
+ publish_event :docker_present, os.docker_version?
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+
@@ -0,0 +1,16 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class ListBoxes < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ boxes = Boxes::Manifest.new(os).list
6
+
7
+ publish_event :list_boxes, boxes
8
+ end
9
+
10
+
11
+ def visit_linux subject
12
+ visit_darwin subject
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class ListServices < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ services = Services::Manifest.new(os).list
6
+
7
+ publish_event :list_services, services
8
+ end
9
+
10
+
11
+ def visit_linux subject
12
+ visit_darwin subject
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class ReloadShell < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :reload_shell
6
+ Utils::Shell.new(Os::CurrentOs.get).reload
7
+ end
8
+
9
+
10
+ def visit_linux subject
11
+ visit_darwin subject
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class RemoveService < Pixiebox::Utils::VisitorByOs
4
+ def initialize(type)
5
+ @type = type
6
+ end
7
+
8
+ def visit_darwin subject
9
+ publish_event :remove_service_start, type
10
+
11
+ raise Errors::ProjectNotInitialized unless os.project_initialized?
12
+
13
+ Services::Installer.new(os).uninstall(type)
14
+
15
+ publish_event :remove_service_completed, type
16
+ end
17
+
18
+
19
+ def visit_linux subject
20
+ visit_darwin subject
21
+ end
22
+
23
+ private
24
+ attr_reader :type
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class RemoveSetupShell < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :remove_shell_setup_start
6
+
7
+ TTY::File.remove_file os.config_dir, force: true
8
+ Shell::StartupScript.get(os).uninstall_extensions
9
+
10
+ publish_event :remove_shell_setup_complete
11
+ end
12
+
13
+
14
+ def visit_linux subject
15
+ visit_darwin subject
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class Restart < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ raise Errors::ProjectNotInitialized unless os.project_initialized?
6
+
7
+ if os.project_running?
8
+ System.new(Os::CurrentOs.get).stop
9
+ System.new(Os::CurrentOs.get).start
10
+ else
11
+ System.new(Os::CurrentOs.get).start
12
+ end
13
+ end
14
+
15
+
16
+ def visit_linux subject
17
+ visit_darwin subject
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class SetupShell < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :shell_setup_start
6
+
7
+ Shell::StartupScript.get(os).install_extensions
8
+
9
+ publish_event :shell_setup_complete
10
+ end
11
+
12
+
13
+ def visit_linux subject
14
+ visit_darwin subject
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class SshInstance < Pixiebox::Utils::VisitorByOs
4
+ def initialize(service)
5
+ @service = service
6
+ end
7
+
8
+ def visit_darwin subject
9
+ publish_event :opening_shell, service
10
+
11
+ raise Errors::ProjectNotInitialized unless os.project_initialized?
12
+ raise Errors::SystemDownError unless os.project_running?
13
+
14
+ system "bash", "-c", "docker-compose exec #{service} bash"
15
+ end
16
+
17
+
18
+ def visit_linux subject
19
+ visit_darwin subject
20
+ end
21
+
22
+
23
+ private
24
+ attr_reader :service
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class Start < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :starting
6
+
7
+ raise Errors::ProjectNotInitialized unless os.project_initialized?
8
+
9
+ system("docker-compose up -d #{Pixiebox.output}") or raise Errors::DockerError
10
+
11
+ publish_event :started
12
+ end
13
+
14
+
15
+ def visit_linux subject
16
+ visit_darwin subject
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class StartInstall < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :install_started
6
+ end
7
+
8
+
9
+ def visit_linux subject
10
+ publish_event :install_started
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class StartUninstall < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ raise Errors::PixieboxNotInstalled unless os.pixiebox_installed?
6
+
7
+ publish_event :uninstall_started
8
+ end
9
+
10
+
11
+ def visit_linux subject
12
+ visit_darwin subject
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class Stop < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :stopping
6
+
7
+ raise Errors::ProjectNotInitialized unless os.project_initialized?
8
+
9
+ system("docker-compose down #{Pixiebox.output}") or raise Errors::DockerError
10
+
11
+ publish_event :stopped
12
+ end
13
+
14
+
15
+ def visit_linux subject
16
+ visit_darwin subject
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,46 @@
1
+ module Pixiebox
2
+ module Commands
3
+ class UpdatePackages < Pixiebox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ raise Errors::PixieboxNotInstalled unless os.pixiebox_installed?
6
+
7
+ packages = Utils::Packages.new(os)
8
+
9
+ if packages.update?
10
+ publish_event :update_packages_start
11
+
12
+ filename = packages.download
13
+
14
+ system("rm -rf #{os.packages_dir}")
15
+ system("mkdir #{os.packages_dir}")
16
+ system("tar xvf #{filename} -C #{os.packages_dir} --strip-components=1 #{Pixiebox.output}")
17
+
18
+ Shell::IniFile.get(os)[:packages] = { version: packages.current_version, last_update: Time.now.to_i }
19
+
20
+ publish_event :update_packages_stop
21
+ end
22
+ end
23
+
24
+
25
+ def visit_linux subject
26
+ raise Errors::PixieboxNotInstalled unless os.pixiebox_installed?
27
+
28
+ packages = Utils::Packages.new(os)
29
+
30
+ if packages.update?
31
+ publish_event :update_packages_start
32
+
33
+ filename = packages.download
34
+
35
+ system("sudo rm -rf #{os.packages_dir}")
36
+ system("sudo mkdir #{os.packages_dir}")
37
+ system("sudo tar xvf #{filename} -C #{os.packages_dir} --strip-components=1 #{Pixiebox.output}")
38
+
39
+ Shell::IniFile.get(os)[:packages] = { version: packages.current_version, last_update: Time.now.to_i }
40
+
41
+ publish_event :update_packages_stop
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end