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
Binary file
@@ -0,0 +1,79 @@
1
+ require 'thor'
2
+ require 'ruby-progressbar'
3
+ require 'wisper'
4
+ require 'open-uri'
5
+ require 'uri'
6
+ require 'tty-file'
7
+ require 'tty-command'
8
+ require 'tty-platform'
9
+ require 'ostruct'
10
+ require 'yaml'
11
+ require 'inifile'
12
+ require 'pathname'
13
+
14
+ require 'picobox/utils/progress_bar'
15
+ require 'picobox/utils/project'
16
+ require 'picobox/utils/visitable'
17
+ require 'picobox/utils/domain_event_publisher'
18
+ require 'picobox/utils/visitor_by_os'
19
+ require 'picobox/utils/output'
20
+ require 'picobox/utils/shell'
21
+
22
+ require 'picobox/docker_compose/config'
23
+
24
+ require 'picobox/errors/picobox_error'
25
+
26
+ require 'picobox/handlers/stdout_handler'
27
+
28
+ require 'picobox/commands/download_docker'
29
+ require 'picobox/commands/install_docker'
30
+ require 'picobox/commands/setup_shell'
31
+ require 'picobox/commands/remove_setup_shell'
32
+ require 'picobox/commands/start_install'
33
+ require 'picobox/commands/build_service'
34
+ require 'picobox/commands/start_uninstall'
35
+ require 'picobox/commands/finish_install'
36
+ require 'picobox/commands/finish_uninstall'
37
+ require 'picobox/commands/initialize_project'
38
+ require 'picobox/commands/add_box'
39
+ require 'picobox/commands/list_boxes'
40
+ require 'picobox/commands/list_services'
41
+ require 'picobox/commands/add_service'
42
+ require 'picobox/commands/remove_service'
43
+ require 'picobox/commands/start'
44
+ require 'picobox/commands/stop'
45
+ require 'picobox/commands/restart'
46
+ require 'picobox/commands/open_shell'
47
+
48
+ require 'picobox/boxes/manifest'
49
+ require 'picobox/boxes/unpacker'
50
+
51
+ require 'picobox/services/manifest'
52
+ require 'picobox/services/installer'
53
+
54
+ require 'picobox/os/abstract'
55
+ require 'picobox/os/darwin'
56
+ require 'picobox/os/linux'
57
+ require 'picobox/os/unsupported_os'
58
+ require 'picobox/os/current_os'
59
+
60
+ require 'picobox/shell/startup_script'
61
+ require 'picobox/shell/dot_profile'
62
+ require 'picobox/shell/dot_zshrc'
63
+
64
+ require 'picobox/constants'
65
+ require 'picobox/cli'
66
+ require 'picobox/system'
67
+ require 'picobox/project'
68
+ require 'picobox/box'
69
+ require 'picobox/service'
70
+
71
+ Wisper.subscribe(
72
+ Picobox::Handlers::StdoutHandler.new,
73
+ scope: Picobox::Utils::DomainEventPublisher
74
+ )
75
+
76
+ # silence warnings found in tty-file-0.3.0 for forwarding to private method
77
+ $VERBOSE=nil
78
+
79
+
@@ -0,0 +1,37 @@
1
+ module Picobox
2
+ class Box
3
+ include Utils::Visitable
4
+ include Utils::Output
5
+
6
+ attr_reader :os
7
+
8
+ def initialize(os)
9
+ @os = os
10
+ end
11
+
12
+ def install(type = nil)
13
+ return if type.nil?
14
+ # TODO place to inject unpacker for different types
15
+ # of unpacking (ie net), could first search locally
16
+ # then on the net
17
+ # accept(Commands::AddBox.new(type, FileUnpacker, NetUnpacker))
18
+ accept(Commands::AddBox.new(type))
19
+ rescue Errors::BoxNotImplemented
20
+ display_box_not_available type
21
+ list # called like for exception handling
22
+ rescue Errors::ProjectNotInitialized
23
+ display_project_not_initialized
24
+ exit 1
25
+ rescue Exception => e
26
+ display_info(e, :red)
27
+ exit 1
28
+ end
29
+
30
+ def list()
31
+ accept(Commands::ListBoxes.new)
32
+ rescue Exception => e
33
+ display_info(e, :red)
34
+ exit 1
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,59 @@
1
+ module Picobox
2
+ module Boxes
3
+ class Manifest
4
+ def initialize(os, type = nil)
5
+ @os, @type = os, type
6
+ end
7
+
8
+ def list
9
+ result = Dir.glob("#{Picobox.box_packages_dir}/*").select {|f| File.directory? f}
10
+ result.map {|r| strip_path(r) }
11
+ end
12
+
13
+
14
+ def package_contents
15
+ @package_contents ||= Dir.glob(File.join(package_dir, "*"))
16
+ end
17
+
18
+
19
+ def check!
20
+ raise Errors::BoxNotImplemented unless list.include?(type)
21
+ end
22
+
23
+
24
+ def source
25
+ @source ||= OpenStruct.new(
26
+ start_script: "#{package_dir}/start",
27
+ docker_compose: "#{package_dir}/docker-compose.yml",
28
+ dockerfile: "#{package_dir}/Dockerfile"
29
+ )
30
+ end
31
+
32
+
33
+ def dest
34
+ @dest ||= OpenStruct.new(
35
+ start_script: "#{os.project_root}/#{Picobox::CONFIG_DIR}/start",
36
+ docker_compose: "#{os.project_root}/docker-compose.yml",
37
+ dockerfile: "#{os.project_root}/Dockerfile"
38
+ )
39
+ end
40
+
41
+ def additional_files
42
+ (package_contents - source.to_h.values).map do |file|
43
+ { source: file, dest: "#{os.project_root}/#{strip_path(file)}" }
44
+ end
45
+ end
46
+
47
+ private
48
+ attr_reader :os, :type
49
+
50
+ def package_dir
51
+ "#{Picobox.box_packages_dir}/#{type}"
52
+ end
53
+
54
+ def strip_path(file)
55
+ file.split('/').last
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,47 @@
1
+ # picobox with elixir
2
+ #
3
+ # VERSION 0.1.0
4
+ FROM elixir:latest
5
+ MAINTAINER Stefan Surzycki <stefan.surzycki@gmail.com>
6
+
7
+ ENV HOSTNAME picobox
8
+ ENV APP_HOME /var/www
9
+
10
+ # silence deb warnings
11
+ ENV DEBIAN_FRONTEND noninteractive
12
+ ENV HOSTNAME picobox
13
+
14
+ # do install here
15
+ RUN mkdir -p /tmp
16
+ WORKDIR /tmp
17
+
18
+ # add repository software
19
+ RUN apt-get update
20
+
21
+ # install nodejs
22
+ # nodejs
23
+ RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
24
+ RUN apt-get install -y nodejs
25
+
26
+ # utils
27
+ RUN apt-get install -y nano git
28
+
29
+ # make nano work
30
+ RUN echo "export TERM=xterm" >> /etc/bash.bashrc
31
+
32
+ # get inotify
33
+ RUN apt-get install -y inotify-tools
34
+
35
+ # update mix
36
+ RUN mix local.hex --force
37
+ RUN mix local.rebar --force
38
+
39
+ # phoenix
40
+ RUN mix archive.install --force https://github.com/phoenixframework/archives/raw/master/phx_new.ez
41
+
42
+ # working dir
43
+ RUN mkdir -p $APP_HOME
44
+ WORKDIR $APP_HOME
45
+
46
+ # hook up source
47
+ ONBUILD ADD . $APP_HOME
@@ -0,0 +1,26 @@
1
+ ---
2
+ version: '2'
3
+ volumes:
4
+ db-data:
5
+ external: false
6
+ services:
7
+ dev:
8
+ build: "."
9
+ entrypoint: ".picobox/start"
10
+ volumes:
11
+ - ".:/var/www:cached"
12
+ hostname: picobox
13
+ environment:
14
+ MIX_ENV: dev
15
+ ports:
16
+ - 80:4000
17
+ - 4000:4000
18
+ test:
19
+ build: "."
20
+ entrypoint: ".picobox/start"
21
+ volumes:
22
+ - ".:/var/www:cached"
23
+ environment:
24
+ MIX_ENV: test
25
+ hostname: picobox_test
26
+
@@ -0,0 +1,18 @@
1
+ To create new phoenix project:
2
+
3
+ $ picobox add postgres
4
+ $ mix phx.new . --app helloworld
5
+
6
+ Configure database:
7
+
8
+ config/dev.exs:
9
+ --------------------------------
10
+ config :hello, Hello.Repo,
11
+ adapter: Ecto.Adapters.Postgres,
12
+ username: "picobox",
13
+ password: "picobox",
14
+ database: "helloworld_dev",
15
+ hostname: "postgres",
16
+ pool_size: 10
17
+ --------------------------------
18
+
@@ -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,33 @@
1
+ # python
2
+ #
3
+ # VERSION 0.0.2
4
+ FROM ubuntu
5
+ MAINTAINER Stefan Surzycki <stefan.surzycki@gmail.com>
6
+
7
+ ENV APP_HOME ~
8
+
9
+ # silence deb warnings
10
+ ENV DEBIAN_FRONTEND noninteractive
11
+ ENV HOSTNAME picobox
12
+
13
+ # add repository software
14
+ RUN apt-get update
15
+
16
+ # replace default interpreter to bash
17
+ RUN rm /bin/sh && ln -s /bin/bash /bin/sh
18
+
19
+ ## Languages
20
+
21
+ # install python
22
+ RUN apt-get install -y python-pip python-yaml gcc python-dev libffi-dev libssl-dev sshpass openssh-client git
23
+
24
+ ## Tools
25
+
26
+ # utils
27
+ RUN apt-get install -y sudo nano wget
28
+
29
+ # set working dir
30
+ WORKDIR $APP_HOME
31
+
32
+ # hook up source files
33
+ ADD . $APP_HOME
@@ -0,0 +1,14 @@
1
+ version: '2'
2
+ volumes:
3
+ db-data:
4
+ external: false
5
+
6
+ services:
7
+ dev:
8
+ build: .
9
+ entrypoint: ".picobox/start"
10
+ environment:
11
+ SSH_AUTH_SOCK: $SSH_AUTH_SOCK
12
+ hostname: picobox
13
+ volumes:
14
+ - ".:/~: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,57 @@
1
+ # picobox for use with rails containing ruby and nodejs
2
+ #
3
+ # VERSION 0.1.0
4
+ FROM picobox/ruby:latest
5
+ MAINTAINER Stefan Surzycki <stefan.surzycki@gmail.com>
6
+
7
+ ENV APP_HOME /var/www
8
+ ENV PATH $APP_HOME/bin:$PATH
9
+
10
+ # silence deb warnings
11
+ ENV DEBIAN_FRONTEND noninteractive
12
+ ENV HOSTNAME picobox
13
+
14
+ # do install here
15
+ RUN mkdir -p /tmp
16
+ WORKDIR /tmp
17
+
18
+ ## Database dependencies
19
+
20
+ # postgres client
21
+ RUN apt-get install -y libpq-dev postgresql-client
22
+
23
+ # sql-lite
24
+ RUN apt-get install -y libsqlite3-dev
25
+
26
+ # mysql
27
+ RUN apt-get install -y libmysqlclient-dev
28
+
29
+ ## Tools
30
+
31
+ # phantomjs pre-requisites
32
+ RUN apt-get install -y chrpath libssl-dev libxft-dev
33
+ RUN apt-get install -y libfreetype6 libfreetype6-dev
34
+ RUN apt-get install -y libfontconfig1 libfontconfig1-dev
35
+
36
+ # phantomjs latest
37
+ RUN npm -g install phantomjs-prebuilt
38
+
39
+ # install yarn
40
+ RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
41
+ RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
42
+ RUN apt-get update && apt-get install -y yarn
43
+
44
+ # utils
45
+ RUN apt-get install -y nano git
46
+
47
+ # hook up cache volume
48
+ ENV BUNDLE_PATH /bundle
49
+
50
+ # working dir
51
+ WORKDIR $APP_HOME
52
+
53
+ # add gemfile
54
+ ONBUILD ADD Gemfile* $APP_HOME/
55
+
56
+ # hook up source
57
+ ONBUILD ADD . $APP_HOME
@@ -0,0 +1,50 @@
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
+ RAILS_ENV: development
18
+ BUNDLE_PATH: "/bundle"
19
+ hostname: picobox
20
+ ports:
21
+ - 80:3000
22
+ - 3000:3000
23
+ test:
24
+ build: "."
25
+ entrypoint: ".picobox/start"
26
+ volumes:
27
+ - ".:/var/www:cached"
28
+ volumes_from:
29
+ - bundle
30
+ environment:
31
+ RAILS_ENV: test
32
+ BUNDLE_PATH: "/bundle"
33
+ hostname: picobox_test
34
+ webpack:
35
+ image: picobox/webpack_rails
36
+ entrypoint: ".picobox/start"
37
+ volumes_from:
38
+ - bundle
39
+ volumes:
40
+ - ".:/var/www:cached"
41
+ environment:
42
+ RAILS_ENV: development
43
+ BUNDLE_PATH: "/bundle"
44
+ hostname: picobox
45
+ ports:
46
+ - 8080:8080
47
+ bundle:
48
+ image: busybox
49
+ volumes:
50
+ - bundle-data:/bundle:cached
@@ -0,0 +1,9 @@
1
+ #!/bin/bash
2
+ if [ -f tmp/pids/server.pid ]; then
3
+ rm tmp/pids/server.pid
4
+ fi
5
+
6
+ bundle check || bundle install
7
+
8
+ # make an infinite process so we can enter containers
9
+ tail -f /dev/null