picobox 0.1.7 → 0.2.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 +4 -4
- data/.gitignore +1 -1
- data/README.md +1 -1
- data/lib/picobox.rb +9 -4
- data/lib/picobox/box.rb +2 -2
- data/lib/picobox/boxes/manifest.rb +1 -1
- data/lib/picobox/cli.rb +62 -10
- data/lib/picobox/commands/add_box.rb +6 -2
- data/lib/picobox/commands/add_service.rb +6 -2
- data/lib/picobox/commands/build_service.rb +8 -1
- data/lib/picobox/commands/download_docker.rb +23 -5
- data/lib/picobox/commands/finish_install.rb +6 -0
- data/lib/picobox/commands/finish_uninstall.rb +5 -0
- data/lib/picobox/commands/get_root_permission.rb +14 -0
- data/lib/picobox/commands/initialize_project.rb +6 -4
- data/lib/picobox/commands/install_docker.rb +31 -5
- data/lib/picobox/commands/list_boxes.rb +4 -4
- data/lib/picobox/commands/list_services.rb +4 -4
- data/lib/picobox/commands/reload_shell.rb +15 -0
- data/lib/picobox/commands/remove_service.rb +6 -2
- data/lib/picobox/commands/remove_setup_shell.rb +6 -4
- data/lib/picobox/commands/restart.rb +8 -7
- data/lib/picobox/commands/setup_shell.rb +7 -4
- data/lib/picobox/commands/{open_shell.rb → ssh_instance.rb} +8 -4
- data/lib/picobox/commands/start.rb +6 -5
- data/lib/picobox/commands/start_install.rb +5 -0
- data/lib/picobox/commands/start_uninstall.rb +5 -4
- data/lib/picobox/commands/stop.rb +6 -5
- data/lib/picobox/constants.rb +14 -1
- data/lib/picobox/errors/picobox_error.rb +1 -0
- data/lib/picobox/handlers/stdout_handler.rb +40 -16
- data/lib/picobox/os/abstract.rb +4 -4
- data/lib/picobox/os/current_os.rb +1 -0
- data/lib/picobox/os/distro.rb +32 -0
- data/lib/picobox/os/linux.rb +14 -0
- data/lib/picobox/project.rb +2 -2
- data/lib/picobox/service.rb +4 -4
- data/lib/picobox/services/manifest.rb +1 -1
- data/lib/picobox/shell/dot_bashrc.rb +9 -0
- data/lib/picobox/shell/dot_profile.rb +1 -34
- data/lib/picobox/shell/dot_zshrc.rb +1 -34
- data/lib/picobox/shell/startup_script.rb +40 -1
- data/lib/picobox/system.rb +13 -8
- data/lib/picobox/utils/output.rb +5 -0
- data/lib/picobox/utils/spinner.rb +27 -0
- data/lib/picobox/utils/visitor_by_os.rb +6 -3
- data/picobox.gemspec +4 -2
- metadata +42 -9
data/lib/picobox/os/abstract.rb
CHANGED
@@ -8,6 +8,7 @@ module Picobox
|
|
8
8
|
def config_dir() "#{home_dir}/#{Picobox::CONFIG_DIR}" end
|
9
9
|
|
10
10
|
def shell_extensions() "#{config_dir}/#{Picobox::SHELL_EXTENSIONS}" end
|
11
|
+
def user_shell() "#{ENV['SHELL']}" end
|
11
12
|
|
12
13
|
# download and install
|
13
14
|
def docker_filename() end
|
@@ -15,14 +16,13 @@ module Picobox
|
|
15
16
|
def docker_installer() end
|
16
17
|
def docker_installed?() end
|
17
18
|
|
18
|
-
def docker_version?()
|
19
|
-
def
|
20
|
-
|
19
|
+
def docker_version?() `docker --version`.strip end
|
20
|
+
def docker_compose_version?() `docker-compose --version`.strip end
|
21
|
+
|
21
22
|
def to_s() raise ::NotImplementedError, 'must override to_s' end
|
22
23
|
|
23
24
|
def project_root() Utils::Project.new(self).root end
|
24
25
|
def reload_shell() system("exec #{user_shell} -l") end
|
25
|
-
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Picobox
|
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 os.user == 'root'
|
20
|
+
'sh -c'
|
21
|
+
elsif TTY::Which.exist?('sudo')
|
22
|
+
'sudo -E sh -c'
|
23
|
+
elsif TTY::Which.exist?('su')
|
24
|
+
'su -c'
|
25
|
+
else
|
26
|
+
raise StandardError, "Error: this installer needs the ability to run commands as root.\n We are unable to find either 'sudo' or 'su' available to make this happen."
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/picobox/os/linux.rb
CHANGED
@@ -3,6 +3,20 @@ module Picobox
|
|
3
3
|
class Linux < Abstract
|
4
4
|
class << self
|
5
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 user() "#{ENV['USER']}" end
|
14
|
+
|
15
|
+
def release() `lsb_release -cs`.strip end
|
16
|
+
def kernel() `uname -r`.strip end
|
17
|
+
def arch() `uname -m`.strip end
|
18
|
+
def distro() Os::Distro.distro end
|
19
|
+
def su() Os::Distro.su(self) end
|
6
20
|
end
|
7
21
|
end
|
8
22
|
end
|
data/lib/picobox/project.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Picobox
|
2
2
|
class Project
|
3
3
|
include Utils::Visitable
|
4
|
-
|
4
|
+
include Utils::Output
|
5
5
|
|
6
6
|
attr_reader :os
|
7
7
|
|
@@ -11,7 +11,7 @@ module Picobox
|
|
11
11
|
|
12
12
|
def init
|
13
13
|
accept(Commands::InitializeProject.new)
|
14
|
-
rescue
|
14
|
+
rescue StandardError => e
|
15
15
|
display_info(e, :red)
|
16
16
|
exit 1
|
17
17
|
end
|
data/lib/picobox/service.rb
CHANGED
@@ -11,7 +11,7 @@ module Picobox
|
|
11
11
|
|
12
12
|
def build(service=nil)
|
13
13
|
accept(Commands::BuildService.new(service))
|
14
|
-
rescue
|
14
|
+
rescue StandardError => e
|
15
15
|
display_info(e, :red)
|
16
16
|
exit 1
|
17
17
|
end
|
@@ -28,7 +28,7 @@ module Picobox
|
|
28
28
|
rescue Picobox::Errors::FileNotFoundError => e
|
29
29
|
display_file_not_found e.message
|
30
30
|
exit 1
|
31
|
-
rescue
|
31
|
+
rescue StandardError => e
|
32
32
|
display_info(e, :red)
|
33
33
|
exit 1
|
34
34
|
end
|
@@ -48,7 +48,7 @@ module Picobox
|
|
48
48
|
rescue Picobox::Errors::FileNotFoundError => e
|
49
49
|
display_file_not_found e.message
|
50
50
|
exit
|
51
|
-
rescue
|
51
|
+
rescue StandardError => e
|
52
52
|
display_info(e, :red)
|
53
53
|
exit 1
|
54
54
|
end
|
@@ -56,7 +56,7 @@ module Picobox
|
|
56
56
|
|
57
57
|
def list()
|
58
58
|
accept(Commands::ListServices.new)
|
59
|
-
rescue
|
59
|
+
rescue StandardError => e
|
60
60
|
display_info(e, :red)
|
61
61
|
exit 1
|
62
62
|
end
|
@@ -1,42 +1,9 @@
|
|
1
1
|
module Picobox
|
2
2
|
module Shell
|
3
|
-
class DotProfile
|
4
|
-
attr_reader :os
|
5
|
-
|
6
|
-
def initialize(os)
|
7
|
-
@os = os
|
8
|
-
end
|
9
|
-
|
10
|
-
def install_extensions
|
11
|
-
source = "#{Picobox.template_dir}/shell_extensions.bash"
|
12
|
-
dest = os.shell_extensions
|
13
|
-
|
14
|
-
TTY::File.copy_file source, dest
|
15
|
-
|
16
|
-
TTY::File.append_to_file(
|
17
|
-
filename,
|
18
|
-
"\n#{extension}\n"
|
19
|
-
)
|
20
|
-
end
|
21
|
-
|
22
|
-
def uninstall_extensions
|
23
|
-
TTY::File.gsub_file filename, /#{Regexp.escape(extension)}/ do
|
24
|
-
"# picobox removed #{Time.now}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
3
|
+
class DotProfile < StartupScript
|
28
4
|
def filename
|
29
5
|
"#{os.home_dir}/.profile"
|
30
6
|
end
|
31
|
-
|
32
|
-
private
|
33
|
-
def source_file
|
34
|
-
"~/#{Picobox::CONFIG_DIR}/#{Picobox::SHELL_EXTENSIONS}"
|
35
|
-
end
|
36
|
-
|
37
|
-
def extension
|
38
|
-
"# added by picobox\nsource #{source_file}"
|
39
|
-
end
|
40
7
|
end
|
41
8
|
end
|
42
9
|
end
|
@@ -1,42 +1,9 @@
|
|
1
1
|
module Picobox
|
2
2
|
module Shell
|
3
|
-
class
|
4
|
-
attr_reader :os
|
5
|
-
|
6
|
-
def initialize(os)
|
7
|
-
@os = os
|
8
|
-
end
|
9
|
-
|
10
|
-
def install_extensions
|
11
|
-
source = "#{Picobox.template_dir}/shell_extensions.bash"
|
12
|
-
dest = os.shell_extensions
|
13
|
-
|
14
|
-
TTY::File.copy_file source, dest
|
15
|
-
|
16
|
-
TTY::File.append_to_file(
|
17
|
-
filename,
|
18
|
-
"\n#{extension}\n"
|
19
|
-
)
|
20
|
-
end
|
21
|
-
|
22
|
-
def uninstall_extensions
|
23
|
-
TTY::File.gsub_file filename, /#{Regexp.escape(extension)}/ do
|
24
|
-
"# picobox removed #{Time.now}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
3
|
+
class DotZshRC < StartupScript
|
28
4
|
def filename
|
29
5
|
"#{os.home_dir}/.zshrc"
|
30
6
|
end
|
31
|
-
|
32
|
-
private
|
33
|
-
def source_file
|
34
|
-
"~/#{Picobox::CONFIG_DIR}/#{Picobox::SHELL_EXTENSIONS}"
|
35
|
-
end
|
36
|
-
|
37
|
-
def extension
|
38
|
-
"# added by picobox\nsource #{source_file}"
|
39
|
-
end
|
40
7
|
end
|
41
8
|
end
|
42
9
|
end
|
@@ -7,12 +7,51 @@ module Picobox
|
|
7
7
|
when '/bin/bash:darwin'
|
8
8
|
Shell::DotProfile.new(os)
|
9
9
|
when '/bin/zsh:darwin'
|
10
|
-
Shell::
|
10
|
+
Shell::DotZshRC.new(os)
|
11
|
+
when '/bin/bash:linux'
|
12
|
+
Shell::DotBashRC.new(os)
|
11
13
|
else
|
12
14
|
raise Errors::ShellNotSupported, "#{os.user_shell}:#{os.to_s}"
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
18
|
+
|
19
|
+
attr_reader :os
|
20
|
+
|
21
|
+
def initialize(os)
|
22
|
+
@os = os
|
23
|
+
end
|
24
|
+
|
25
|
+
def install_extensions
|
26
|
+
source = "#{Picobox.template_dir}/shell_extensions.bash"
|
27
|
+
dest = os.shell_extensions
|
28
|
+
|
29
|
+
TTY::File.copy_file source, dest
|
30
|
+
|
31
|
+
TTY::File.append_to_file(
|
32
|
+
filename,
|
33
|
+
"\n#{extension}\n"
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def uninstall_extensions
|
38
|
+
TTY::File.gsub_file filename, /#{Regexp.escape(extension)}/ do
|
39
|
+
"# picobox removed #{Time.now}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def filename
|
44
|
+
raise ::NotImplementedError, 'must filename'
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def source_file
|
49
|
+
"~/#{Picobox::CONFIG_DIR}/#{Picobox::SHELL_EXTENSIONS}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def extension
|
53
|
+
"# added by picobox\nsource #{source_file}"
|
54
|
+
end
|
16
55
|
end
|
17
56
|
end
|
18
57
|
end
|
data/lib/picobox/system.rb
CHANGED
@@ -11,14 +11,19 @@ module Picobox
|
|
11
11
|
|
12
12
|
def install
|
13
13
|
accept(Commands::StartInstall.new)
|
14
|
+
accept(Commands::GetRootPermission.new)
|
14
15
|
accept(Commands::DownloadDocker.new)
|
15
16
|
accept(Commands::InstallDocker.new)
|
16
17
|
accept(Commands::SetupShell.new)
|
17
18
|
accept(Commands::FinishInstall.new)
|
19
|
+
accept(Commands::ReloadShell.new)
|
18
20
|
rescue Errors::ShellNotSupported => e
|
19
21
|
display_shell_not_supported e.message
|
20
22
|
exit 1
|
21
|
-
rescue
|
23
|
+
rescue Errors::DistroNotSupported => e
|
24
|
+
display_distro_not_supported
|
25
|
+
exit 1
|
26
|
+
rescue StandardError => e
|
22
27
|
display_info(e, :red)
|
23
28
|
exit 1
|
24
29
|
end
|
@@ -31,7 +36,7 @@ module Picobox
|
|
31
36
|
rescue Errors::PicoboxNotInstalled
|
32
37
|
display_picobox_not_installed
|
33
38
|
exit 1
|
34
|
-
rescue
|
39
|
+
rescue StandardError => e
|
35
40
|
display_info(e, :red)
|
36
41
|
exit 1
|
37
42
|
end
|
@@ -42,7 +47,7 @@ module Picobox
|
|
42
47
|
rescue Errors::ProjectNotInitialized
|
43
48
|
display_project_not_initialized
|
44
49
|
exit 1
|
45
|
-
rescue
|
50
|
+
rescue StandardError => e
|
46
51
|
display_info(e, :red)
|
47
52
|
exit 1
|
48
53
|
end
|
@@ -53,7 +58,7 @@ module Picobox
|
|
53
58
|
rescue Errors::ProjectNotInitialized
|
54
59
|
display_project_not_initialized
|
55
60
|
exit 1
|
56
|
-
rescue
|
61
|
+
rescue StandardError => e
|
57
62
|
display_info(e, :red)
|
58
63
|
exit 1
|
59
64
|
end
|
@@ -61,21 +66,21 @@ module Picobox
|
|
61
66
|
|
62
67
|
def restart
|
63
68
|
accept(Commands::Restart.new)
|
64
|
-
rescue
|
69
|
+
rescue StandardError => e
|
65
70
|
display_info(e, :red)
|
66
71
|
exit 1
|
67
72
|
end
|
68
73
|
|
69
74
|
|
70
|
-
def
|
71
|
-
accept(Commands::
|
75
|
+
def ssh(service)
|
76
|
+
accept(Commands::SshInstance.new(service))
|
72
77
|
rescue Errors::SystemDownError
|
73
78
|
display_system_down
|
74
79
|
exit 1
|
75
80
|
rescue Errors::ProjectNotInitialized
|
76
81
|
display_project_not_initialized
|
77
82
|
exit 1
|
78
|
-
rescue
|
83
|
+
rescue StandardError => e
|
79
84
|
display_info(e, :red)
|
80
85
|
exit 1
|
81
86
|
end
|
data/lib/picobox/utils/output.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Picobox
|
2
|
+
module Utils
|
3
|
+
class Spinner
|
4
|
+
class << self
|
5
|
+
def new(message)
|
6
|
+
pastel = Pastel.new
|
7
|
+
format = " #{message} [:spinner]"
|
8
|
+
|
9
|
+
@spinner = TTY::Spinner.new(pastel.green(format),
|
10
|
+
hide_cursor: true,
|
11
|
+
clear: true
|
12
|
+
)
|
13
|
+
|
14
|
+
Picobox.verbose? ? puts(format) : spinner.auto_spin
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def stop()
|
19
|
+
spinner.stop
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
attr_accessor :spinner
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -4,7 +4,8 @@ module Picobox
|
|
4
4
|
include Utils::DomainEventPublisher
|
5
5
|
|
6
6
|
def visit subject
|
7
|
-
|
7
|
+
@os = subject.os
|
8
|
+
method_name = "visit_#{os.to_s}".intern
|
8
9
|
send(method_name, subject )
|
9
10
|
end
|
10
11
|
|
@@ -21,9 +22,11 @@ module Picobox
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def visit_unsupported subject
|
24
|
-
|
25
|
-
raise Errors::UnsupportedOsError, "#{os} is not yet supported :("
|
25
|
+
raise Errors::UnsupportedOsError, "#{TTY::Platform.new.os} is not yet supported :("
|
26
26
|
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
attr_reader :os
|
27
30
|
end
|
28
31
|
end
|
29
32
|
end
|