picobox 0.1.7

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 (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +5 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/DOCKER_INFO.md +3 -0
  7. data/Gemfile +5 -0
  8. data/Guardfile +47 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +138 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +14 -0
  13. data/bin/picobox +5 -0
  14. data/bin/picobox_dev +10 -0
  15. data/bin/rake +17 -0
  16. data/bin/setup +8 -0
  17. data/docs/demo_script.md +27 -0
  18. data/docs/testdrive +5658 -0
  19. data/docs/testdrive.gif +0 -0
  20. data/lib/picobox.rb +79 -0
  21. data/lib/picobox/box.rb +37 -0
  22. data/lib/picobox/boxes/manifest.rb +59 -0
  23. data/lib/picobox/boxes/packages/elixir/Dockerfile +47 -0
  24. data/lib/picobox/boxes/packages/elixir/docker-compose.yml +26 -0
  25. data/lib/picobox/boxes/packages/elixir/info +18 -0
  26. data/lib/picobox/boxes/packages/elixir/start +3 -0
  27. data/lib/picobox/boxes/packages/python/Dockerfile +33 -0
  28. data/lib/picobox/boxes/packages/python/docker-compose.yml +14 -0
  29. data/lib/picobox/boxes/packages/python/start +3 -0
  30. data/lib/picobox/boxes/packages/rails/Dockerfile +57 -0
  31. data/lib/picobox/boxes/packages/rails/docker-compose.yml +50 -0
  32. data/lib/picobox/boxes/packages/rails/start +9 -0
  33. data/lib/picobox/boxes/packages/ruby/Dockerfile +5 -0
  34. data/lib/picobox/boxes/packages/ruby/docker-compose.yml +22 -0
  35. data/lib/picobox/boxes/packages/ruby/start +3 -0
  36. data/lib/picobox/boxes/unpacker.rb +55 -0
  37. data/lib/picobox/cli.rb +163 -0
  38. data/lib/picobox/commands/add_box.rb +23 -0
  39. data/lib/picobox/commands/add_service.rb +25 -0
  40. data/lib/picobox/commands/build_service.rb +16 -0
  41. data/lib/picobox/commands/download_docker.rb +17 -0
  42. data/lib/picobox/commands/finish_install.rb +10 -0
  43. data/lib/picobox/commands/finish_uninstall.rb +9 -0
  44. data/lib/picobox/commands/initialize_project.rb +35 -0
  45. data/lib/picobox/commands/install_docker.rb +27 -0
  46. data/lib/picobox/commands/list_boxes.rb +16 -0
  47. data/lib/picobox/commands/list_services.rb +16 -0
  48. data/lib/picobox/commands/open_shell.rb +26 -0
  49. data/lib/picobox/commands/remove_service.rb +25 -0
  50. data/lib/picobox/commands/remove_setup_shell.rb +28 -0
  51. data/lib/picobox/commands/restart.rb +21 -0
  52. data/lib/picobox/commands/setup_shell.rb +19 -0
  53. data/lib/picobox/commands/start.rb +22 -0
  54. data/lib/picobox/commands/start_install.rb +9 -0
  55. data/lib/picobox/commands/start_uninstall.rb +20 -0
  56. data/lib/picobox/commands/stop.rb +24 -0
  57. data/lib/picobox/constants.rb +14 -0
  58. data/lib/picobox/dns.rb +8 -0
  59. data/lib/picobox/docker_compose/config.rb +59 -0
  60. data/lib/picobox/errors/picobox_error.rb +15 -0
  61. data/lib/picobox/handlers/stdout_handler.rb +142 -0
  62. data/lib/picobox/os/abstract.rb +29 -0
  63. data/lib/picobox/os/current_os.rb +14 -0
  64. data/lib/picobox/os/darwin.rb +15 -0
  65. data/lib/picobox/os/linux.rb +9 -0
  66. data/lib/picobox/os/unsupported_os.rb +9 -0
  67. data/lib/picobox/project.rb +19 -0
  68. data/lib/picobox/service.rb +64 -0
  69. data/lib/picobox/services/installer.rb +41 -0
  70. data/lib/picobox/services/manifest.rb +50 -0
  71. data/lib/picobox/services/packages/elasticsearch/config.yml +14 -0
  72. data/lib/picobox/services/packages/memcached/config.yml +9 -0
  73. data/lib/picobox/services/packages/mongodb/config.yml +13 -0
  74. data/lib/picobox/services/packages/mysql/config.yml +17 -0
  75. data/lib/picobox/services/packages/postgres/config.yml +16 -0
  76. data/lib/picobox/services/packages/redis/config.yml +7 -0
  77. data/lib/picobox/shell/dot_profile.rb +42 -0
  78. data/lib/picobox/shell/dot_zshrc.rb +42 -0
  79. data/lib/picobox/shell/startup_script.rb +18 -0
  80. data/lib/picobox/system.rb +83 -0
  81. data/lib/picobox/templates/shell_extensions.bash +125 -0
  82. data/lib/picobox/utils/domain_event_publisher.rb +11 -0
  83. data/lib/picobox/utils/output.rb +69 -0
  84. data/lib/picobox/utils/progress_bar.rb +31 -0
  85. data/lib/picobox/utils/project.rb +55 -0
  86. data/lib/picobox/utils/shell.rb +18 -0
  87. data/lib/picobox/utils/visitable.rb +9 -0
  88. data/lib/picobox/utils/visitor_by_os.rb +29 -0
  89. data/lib/runner.rb +51 -0
  90. data/picobox.gemspec +49 -0
  91. metadata +386 -0
@@ -0,0 +1,5 @@
1
+ # picobox with ruby 2.4, nodejs
2
+ #
3
+ # VERSION 0.1.0
4
+ FROM picobox/ruby:latest
5
+ MAINTAINER Stefan Surzycki <stefan.surzycki@gmail.com>
@@ -0,0 +1,22 @@
1
+ ---
2
+ version: '2'
3
+ volumes:
4
+ db-data:
5
+ external: false
6
+ bundle-data:
7
+ external: false
8
+ services:
9
+ dev:
10
+ build: "."
11
+ entrypoint: ".picobox/start"
12
+ volumes:
13
+ - ".:/var/www:cached"
14
+ volumes_from:
15
+ - bundle
16
+ environment:
17
+ BUNDLE_PATH: "/bundle"
18
+ hostname: picobox
19
+ bundle:
20
+ image: busybox
21
+ volumes:
22
+ - bundle-data:/bundle:cached
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ # make an infinite process so we can enter containers
3
+ tail -f /dev/null
@@ -0,0 +1,55 @@
1
+ module Picobox
2
+ module Boxes
3
+ class Unpacker
4
+ def initialize(os)
5
+ @os = os
6
+ end
7
+
8
+ def unpack(type)
9
+ @manifest = Manifest.new(os, type)
10
+ @manifest.check! # raises an exception if we can't find the type in the manifest
11
+
12
+ unpack_start_script
13
+ unpack_docker_files
14
+ unpack_additional_files
15
+ end
16
+
17
+ private
18
+ attr_reader :os, :manifest
19
+
20
+ def unpack_start_script
21
+ # start script
22
+ TTY::File.copy_file(
23
+ manifest.source.start_script,
24
+ manifest.dest.start_script
25
+ )
26
+
27
+ TTY::File.chmod(manifest.dest.start_script, 0777)
28
+ end
29
+
30
+ def unpack_docker_files
31
+ # docker-compose.yml
32
+ TTY::File.copy_file(
33
+ manifest.source.docker_compose,
34
+ manifest.dest.docker_compose
35
+ )
36
+
37
+ # Dockerfile
38
+ TTY::File.copy_file(
39
+ manifest.source.dockerfile,
40
+ manifest.dest.dockerfile
41
+ )
42
+ end
43
+
44
+ def unpack_additional_files
45
+ # unpack remaining in project root director
46
+ manifest.additional_files.each do |file|
47
+ TTY::File.copy_file(
48
+ file[:source],
49
+ file[:dest]
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,163 @@
1
+ module Picobox
2
+ class ServiceSubCommands < Thor
3
+ desc 'build [SERVICE] optional', 'builds the picobox'
4
+ long_desc <<-LONGDESC
5
+ LONGDESC
6
+ def build(service = nil)
7
+ Service.new(Os::CurrentOs.get).build service
8
+ end
9
+
10
+
11
+ desc 'add [SERVICE]', 'adds a service to your box'
12
+ long_desc <<-LONGDESC
13
+ LONGDESC
14
+ def add(*services)
15
+ Service.new(Os::CurrentOs.get).add services
16
+ end
17
+
18
+
19
+ desc 'remove [SERVICE]', 'removes a service from your box'
20
+ long_desc <<-LONGDESC
21
+ LONGDESC
22
+ def remove(service)
23
+ Service.new(Os::CurrentOs.get).remove service
24
+ end
25
+
26
+
27
+ desc 'list', 'list available services'
28
+ long_desc <<-LONGDESC
29
+ LONGDESC
30
+ def list()
31
+ Service.new(Os::CurrentOs.get).list
32
+ end
33
+ end
34
+
35
+ class DnsSubCommands < Thor
36
+ desc 'add', 'add entry to DNS'
37
+ long_desc <<-LONGDESC
38
+ LONGDESC
39
+ method_option :port, default: 3000
40
+ def add(entry)
41
+ puts "I'm a thor task! #{options}"
42
+ end
43
+ end
44
+
45
+ class CLI < Thor
46
+ include Utils::Output
47
+
48
+ desc 'dns SUBCOMMAND', 'do things with the DNS'
49
+ long_desc <<-LONGDESC
50
+ LONGDESC
51
+ subcommand 'dns', Picobox::DnsSubCommands
52
+
53
+
54
+ desc 'service SUBCOMMAND', 'do things with the SERVICES'
55
+ long_desc <<-LONGDESC
56
+ LONGDESC
57
+ subcommand 'service', Picobox::ServiceSubCommands
58
+
59
+
60
+ desc 'version', 'displays current version'
61
+ def version
62
+ say Picobox::VERSION
63
+ end
64
+
65
+
66
+ desc 'install', 'installs picobox'
67
+ long_desc <<-LONGDESC
68
+ LONGDESC
69
+ def install
70
+ System.new(Os::CurrentOs.get).install
71
+ Utils::Shell.new(Os::CurrentOs.get).reload
72
+ end
73
+
74
+
75
+ desc 'update', 'udpates picobox'
76
+ long_desc <<-LONGDESC
77
+ LONGDESC
78
+ def update
79
+ System.new(Os::CurrentOs.get).install
80
+ Utils::Shell.new(Os::CurrentOs.get).reload
81
+ end
82
+
83
+
84
+ desc 'uninstall', 'removes picobox'
85
+ long_desc <<-LONGDESC
86
+ LONGDESC
87
+ def uninstall
88
+ System.new(Os::CurrentOs.get).uninstall
89
+ end
90
+
91
+
92
+ desc 'init [BOX]', 'initialize directory for use with picobox'
93
+ long_desc <<-LONGDESC
94
+ LONGDESC
95
+ def init(box)
96
+ os = Os::CurrentOs.get
97
+
98
+ Project.new(os).init
99
+ Box.new(os).install box
100
+ Service.new(os).build
101
+ System.new(os).start
102
+ end
103
+
104
+
105
+ desc 'start', 'start picobox'
106
+ long_desc <<-LONGDESC
107
+ LONGDESC
108
+ def start()
109
+ System.new(Os::CurrentOs.get).start
110
+ end
111
+
112
+
113
+ desc 'stop', 'stop picobox'
114
+ long_desc <<-LONGDESC
115
+ LONGDESC
116
+ def stop()
117
+ System.new(Os::CurrentOs.get).stop
118
+ end
119
+
120
+
121
+ desc 'restart', 'restart picobox'
122
+ long_desc <<-LONGDESC
123
+ LONGDESC
124
+ def restart()
125
+ System.new(Os::CurrentOs.get).restart
126
+ end
127
+
128
+
129
+ desc 'ssh [SERVICE]', 'open shell to service'
130
+ long_desc <<-LONGDESC
131
+ LONGDESC
132
+ def ssh(service)
133
+ System.new(Os::CurrentOs.get).open_shell service
134
+ end
135
+
136
+
137
+ desc 'boxes', 'list of available boxes'
138
+ long_desc <<-LONGDESC
139
+ LONGDESC
140
+ def boxes()
141
+ Box.new(Os::CurrentOs.get).list
142
+ end
143
+
144
+
145
+ desc 'status', 'current status of containers'
146
+ long_desc <<-LONGDESC
147
+ LONGDESC
148
+ def status()
149
+ system "docker-compose ps"
150
+ end
151
+
152
+
153
+ desc 'clean', 'clean stop containers'
154
+ long_desc <<-LONGDESC
155
+ LONGDESC
156
+ def clean()
157
+ display_info('Cleaning stopped containers', :green)
158
+ display_status('execute', 'container prune')
159
+ system "docker container prune"
160
+ system "docker volume prune"
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,23 @@
1
+ module Picobox
2
+ module Commands
3
+ class AddBox < Picobox::Utils::VisitorByOs
4
+ def initialize(type)
5
+ @type = type
6
+ end
7
+
8
+ def visit_darwin subject
9
+ @os = subject.os
10
+ publish_event :add_box_start, type
11
+
12
+ raise Errors::ProjectNotInitialized unless project_initialized?
13
+
14
+ Boxes::Unpacker.new(os).unpack(type)
15
+ end
16
+
17
+ private
18
+ attr_reader :os, :type
19
+
20
+ def project_initialized?() Utils::Project.new(os).project_initialized? end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ module Picobox
2
+ module Commands
3
+ class AddService < Picobox::Utils::VisitorByOs
4
+ def initialize(service)
5
+ @service = service
6
+ end
7
+
8
+ def visit_darwin subject
9
+ @os = subject.os
10
+ publish_event :add_service_start, service
11
+
12
+ raise Errors::ProjectNotInitialized unless project_initialized?
13
+
14
+ Services::Installer.new(os).install(service)
15
+
16
+ publish_event :add_service_completed, service
17
+ end
18
+
19
+ private
20
+ attr_reader :os, :service
21
+
22
+ def project_initialized?() Utils::Project.new(os).project_initialized? end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ module Picobox
2
+ module Commands
3
+ class BuildService < Picobox::Utils::VisitorByOs
4
+ def initialize(service)
5
+ @service = service
6
+ end
7
+
8
+ def visit_darwin subject
9
+ system "docker-compose build #{service}"
10
+ end
11
+
12
+ private
13
+ attr_reader :service
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Picobox
2
+ module Commands
3
+ class DownloadDocker < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ unless subject.os.docker_installed?
6
+ stream = open(subject.os.docker_url,
7
+ content_length_proc: lambda { |total| publish_event :download_docker_start, total },
8
+ progress_proc: lambda { |step| publish_event :download_docker_progress, step }
9
+ )
10
+
11
+ IO.copy_stream( stream, subject.os.docker_installer )
12
+ publish_event :download_docker_complete
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ module Picobox
2
+ module Commands
3
+ class FinishInstall < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :install_complete
6
+ publish_event :post_install_messages
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Picobox
2
+ module Commands
3
+ class FinishUninstall < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ publish_event :uninstall_complete
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,35 @@
1
+ module Picobox
2
+ module Commands
3
+ class InitializeProject < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ publish_event :project_initialize_start
8
+
9
+ create_project_config_dir
10
+ create_project_ini
11
+
12
+ publish_event :project_initialize_complete
13
+ end
14
+
15
+ private
16
+ attr_reader :os
17
+
18
+ def create_project_config_dir
19
+ # for now just empty dir, but eventualy add flags with ini files 'ie enabled, etc'
20
+ # https://github.com/albfan/bash-ini-parser
21
+ TTY::File.create_dir project_config_dir
22
+ end
23
+
24
+ def create_project_ini
25
+ TTY::File.create_file "#{project_config_dir}/#{Picobox::PROJECT_INI}" do |content|
26
+ "[project]\nroot=#{os.current_dir}\n"
27
+ end
28
+ end
29
+
30
+ def project_config_dir
31
+ "#{os.current_dir}/#{Picobox::CONFIG_DIR}"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,27 @@
1
+ module Picobox
2
+ module Commands
3
+ class InstallDocker < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ unless subject.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, commands.length
14
+
15
+ commands.each do |command|
16
+ system(command)
17
+ publish_event :install_docker_progress
18
+ end
19
+
20
+ publish_event :install_docker_complete
21
+ else
22
+ publish_event :docker_present, subject.os.docker_version?
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module Picobox
2
+ module Commands
3
+ class ListBoxes < Picobox::Utils::VisitorByOs
4
+ def visit_darwin subject
5
+ @os = subject.os
6
+
7
+ boxes = Boxes::Manifest.new(os).list
8
+
9
+ publish_event :list_boxes, boxes
10
+ end
11
+
12
+ private
13
+ attr_reader :os
14
+ end
15
+ end
16
+ end