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,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