kapten 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a12301a0450644f79a5e7cccff56fb4bf25d7903
4
+ data.tar.gz: 80eb062eabdf84778f079912b10c245ef0ea497a
5
+ SHA512:
6
+ metadata.gz: 00b93967c2d698f1dd6b17db04c6764399ccb9279aa536d5007738deb939edfba37e47c29a460448ad2f198e5651d3e20e7578cb31dee095394717bb8c5b8d8a
7
+ data.tar.gz: e4e720f309b7c75d385a1f9d30ee1bda8cfec240b0d4d9cf5f6c23e447eca12be05b537284ff2bbb670abdf480e0488b3fc0153fe8ddab5d21affe2c5e086f16
data/bin/kapten ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "kapten"
4
+
5
+ Kapten::CLI.start
@@ -0,0 +1,39 @@
1
+ require 'json'
2
+
3
+ module Kapten::Config
4
+
5
+ CONFIG_FILE = ".kapten.json"
6
+
7
+
8
+ # Get config from current directory (.kapten.json file)
9
+ def self.get
10
+
11
+ return false unless File.file?( Kapten::Config::CONFIG_FILE )
12
+
13
+ config_contents = File.read( Kapten::Config::CONFIG_FILE )
14
+
15
+ config = JSON.parse(config_contents)
16
+
17
+ end
18
+
19
+
20
+ # Generate a basic config file
21
+ def self.generate(type, name)
22
+
23
+ config = {
24
+ type: type,
25
+ name: name,
26
+ }
27
+
28
+ return config
29
+
30
+ end
31
+
32
+
33
+ # Update config file with new data
34
+ def self.save(config)
35
+ File.write( Kapten::Config::CONFIG_FILE, config.to_json )
36
+ return true
37
+ end
38
+
39
+ end
@@ -0,0 +1,145 @@
1
+ require 'docker'
2
+ require 'colorize'
3
+
4
+ module Kapten::DockerApi
5
+
6
+ # Check if Docker is installed
7
+ def self.has_docker?
8
+
9
+ begin
10
+
11
+ version = Docker.version
12
+ return true if version
13
+
14
+ rescue
15
+
16
+ return false
17
+
18
+ end
19
+
20
+ return false
21
+
22
+ end
23
+
24
+
25
+ # Get Docker container by Kapten name
26
+ def self.get_container(name)
27
+
28
+ begin
29
+
30
+ container = Docker::Container.get('kapten_' + name)
31
+ return container
32
+
33
+ rescue
34
+
35
+ return false
36
+
37
+ end
38
+
39
+ end
40
+
41
+
42
+ # Get Docker image by name
43
+ def self.get_image(image)
44
+
45
+ begin
46
+
47
+ image = Docker::Image.get( image )
48
+ return image
49
+
50
+ rescue
51
+
52
+ return false
53
+
54
+ end
55
+
56
+ end
57
+
58
+
59
+ # Start Docker container, attaches STDIN and STDOUT
60
+ def self.start(name, image)
61
+
62
+ container = Kapten::DockerApi::get_container(name)
63
+
64
+ if not container
65
+
66
+ # Pull image if not installed
67
+ docker_image = Kapten::DockerApi::get_image( image )
68
+
69
+ unless docker_image
70
+
71
+ puts "First time running, installing environment (this might take a few minutes)...".green
72
+ docker_image = Docker::Image.create( 'fromImage' => image )
73
+
74
+ end
75
+
76
+
77
+ puts "Creating environment...".green
78
+
79
+ container = Docker::Container.create(
80
+ 'Image' => image,
81
+ 'name' => 'kapten_' + name,
82
+ 'Hostname' => name,
83
+ 'Cmd' => ['/bin/bash'],
84
+ "OpenStdin" => true,
85
+ "StdinOnce" => true,
86
+ "Tty" => true,
87
+ "WorkingDir" => "/usr/src/" + name,
88
+ "Hostconfig" => {
89
+ "Binds" => [Dir.pwd + ":/usr/src/" + name]
90
+ }
91
+ )
92
+
93
+ end
94
+
95
+ container.start
96
+ puts "---------------------------------".green
97
+ puts 'Kapten: You\'re now inside the development environment, go wild! (use "exit" to get out of here)'.green
98
+
99
+
100
+ # Connect to container shell with both STDIN and STDOUT
101
+ require "io/console"
102
+ STDIN.raw do |stdin|
103
+ container.exec(["bash"], stdin: stdin, tty: true) do |chunk|
104
+ print chunk
105
+ end
106
+ end
107
+
108
+ end
109
+
110
+
111
+ # Stop running container
112
+ def self.stop(name)
113
+
114
+ container = Kapten::DockerApi::get_container(name)
115
+
116
+ if container
117
+
118
+ container.stop
119
+ return true
120
+
121
+ end
122
+
123
+ return false
124
+
125
+ end
126
+
127
+
128
+ # Fully remove container
129
+ def self.destroy(name)
130
+
131
+ container = Kapten::DockerApi::get_container(name)
132
+
133
+ if container
134
+
135
+ container.stop
136
+ container.delete(:force => true)
137
+ return true
138
+
139
+ end
140
+
141
+ return false
142
+
143
+ end
144
+
145
+ end
@@ -0,0 +1,67 @@
1
+ require 'colorize'
2
+
3
+ module Kapten::Helpers
4
+
5
+ TYPES = {
6
+ 'ruby' => 'ruby:latest',
7
+ 'python' => 'python:latest',
8
+ 'node' => 'node:latest',
9
+ 'elixir' => 'elixir:latest',
10
+ 'php' => 'php:latest',
11
+ 'go' => 'golang:latest',
12
+ 'haskell' => 'haskell:latest',
13
+ 'java' => 'openjdk:latest',
14
+ 'perl' => 'perl:latest',
15
+ }
16
+
17
+
18
+ # Validate that Kapten is initalized and Docker is installed
19
+ def self.validate_install
20
+
21
+ config = Kapten::Config::get
22
+
23
+ # Make sure a config exists (Kapten has been initialized)
24
+ unless config
25
+ puts 'Kapten not initalized'.red
26
+ puts 'Run "kapten init" to get started'.red
27
+ return false
28
+ end
29
+
30
+ # Make sure Docker is instsalled
31
+ unless Kapten::DockerApi::has_docker?
32
+ puts 'Kapten requires Docker'.red
33
+ puts 'Install and then try running command again: https://www.docker.com'.red
34
+ return false
35
+ end
36
+
37
+ return config
38
+
39
+ end
40
+
41
+
42
+ # Get Docker image by environment type
43
+ def self.get_image(type)
44
+
45
+ return Kapten::Helpers::TYPES[ type ]
46
+
47
+ end
48
+
49
+
50
+ # Get all available environment types
51
+ def self.get_types
52
+
53
+ return Kapten::Helpers::TYPES.keys
54
+
55
+ end
56
+
57
+
58
+ # Remove all traces of Kapten (stop and destory container, delete config file)
59
+ def self.remove(name)
60
+
61
+ Kapten::DockerApi::destroy( name )
62
+
63
+ File.delete( Kapten::Config::CONFIG_FILE )
64
+
65
+ end
66
+
67
+ end
data/lib/kapten.rb ADDED
@@ -0,0 +1,135 @@
1
+ require 'thor'
2
+ require 'colorize'
3
+
4
+ module Kapten;end
5
+
6
+ require 'kapten/helpers'
7
+ require 'kapten/docker'
8
+ require 'kapten/config'
9
+
10
+ class Kapten::CLI < Thor
11
+
12
+ desc 'init [TYPE]', 'Initalize Kapten in the current directory'
13
+ method_option :name, :aliases => "-n", :desc => "Specify a name. Defaults to the current directory name."
14
+ long_desc <<-LONGDESC
15
+ Initalize Kapten in the current directory with a specified environment type
16
+
17
+ Available types are: #{Kapten::Helpers::get_types.join(', ')}
18
+ LONGDESC
19
+ def init(type)
20
+
21
+ if Kapten::Config.get
22
+ puts 'Environment already initialized'
23
+ puts 'Use "kapten start" to get developing'
24
+ return
25
+ end
26
+
27
+ types = Kapten::Helpers::get_types
28
+
29
+ if not types.include?(type)
30
+ puts 'No such environment type'.red
31
+ puts 'Available environment types are: ' + types.join(', ')
32
+ return
33
+ end
34
+
35
+ name = options[:name] || File.basename(Dir.getwd)
36
+
37
+ config = Kapten::Config::generate(type, name)
38
+
39
+ Kapten::Config::save(config)
40
+
41
+ puts 'Kapten initialized!'.green
42
+ puts 'Use "kapten start" to load your environment'
43
+
44
+ end
45
+
46
+
47
+ desc 'start', 'Run and attach environemnt'
48
+ def start
49
+
50
+ config = Kapten::Helpers::validate_install
51
+ return unless config
52
+
53
+ image = Kapten::Helpers::get_image( config['type'] )
54
+
55
+ Kapten::DockerApi::start( config['name'], image )
56
+
57
+ end
58
+
59
+
60
+ desc 'stop', 'Stop environment'
61
+ def stop
62
+
63
+ config = Kapten::Helpers::validate_install
64
+ return unless config
65
+
66
+ puts 'Stopping Kapten environment...'
67
+
68
+ results = Kapten::DockerApi::stop( config['name'] )
69
+
70
+ puts 'Environment no longer active!'.green
71
+
72
+ end
73
+
74
+
75
+ desc 'destroy', 'Destroy environment (use "kapten start" to recreate)'
76
+ def destroy
77
+
78
+ config = Kapten::Helpers::validate_install
79
+ return unless config
80
+
81
+ unless Kapten::DockerApi::get_container( config['name'] )
82
+
83
+ puts 'No environment to destroy!'
84
+ puts 'Run "kapten start" to set it up'
85
+ return
86
+
87
+ end
88
+
89
+
90
+ puts 'Destroying environment...'
91
+
92
+ results = Kapten::DockerApi::destroy( config['name'] )
93
+
94
+ puts 'Environment destroyed! Rebuild it by running "kapten start".'.green
95
+
96
+ end
97
+
98
+
99
+ desc 'info', 'Info about current environment'
100
+ def info
101
+
102
+ config = Kapten::Helpers::validate_install
103
+ return unless config
104
+
105
+ container = Kapten::DockerApi::get_container( config["name"] )
106
+
107
+ if not container
108
+ status = 'Not created'
109
+ else
110
+ status = "Not running".yellow
111
+ status = "Running".green if container.json["State"]["Running"]
112
+ end
113
+
114
+ puts ''
115
+ puts 'Name: ' + config['name']
116
+ puts 'Type: ' + config['type']
117
+ puts 'Status: ' + status
118
+ puts ''
119
+
120
+ end
121
+
122
+
123
+ desc 'remove', 'Fully remove Kapten from the current project'
124
+ def remove
125
+
126
+ config = Kapten::Helpers::validate_install
127
+ return unless config
128
+
129
+ Kapten::Helpers::remove( config['name'] )
130
+
131
+ puts 'All traces of Kapten have been removed'.green
132
+
133
+ end
134
+
135
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kapten
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Fabian Lindfors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-04-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ''
14
+ email: fabian@flapplabs.se
15
+ executables:
16
+ - kapten
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/kapten
21
+ - lib/kapten.rb
22
+ - lib/kapten/config.rb
23
+ - lib/kapten/docker.rb
24
+ - lib/kapten/helpers.rb
25
+ homepage: https://github.com/fabianlindfors/kapten
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 2.5.1
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: Simple containerized development environments directly from the command line
49
+ test_files: []