linecook 0.6.2
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.
- data/History +60 -0
- data/License.txt +22 -0
- data/README +98 -0
- data/bin/linecook +58 -0
- data/cookbook +0 -0
- data/lib/linecook/attributes.rb +22 -0
- data/lib/linecook/commands/command.rb +48 -0
- data/lib/linecook/commands/command_error.rb +6 -0
- data/lib/linecook/commands/env.rb +23 -0
- data/lib/linecook/commands/helper.rb +51 -0
- data/lib/linecook/commands/helpers.rb +28 -0
- data/lib/linecook/commands/init.rb +82 -0
- data/lib/linecook/commands/package.rb +39 -0
- data/lib/linecook/commands/vbox.rb +85 -0
- data/lib/linecook/commands.rb +6 -0
- data/lib/linecook/cookbook.rb +104 -0
- data/lib/linecook/helper.rb +117 -0
- data/lib/linecook/package.rb +197 -0
- data/lib/linecook/recipe.rb +103 -0
- data/lib/linecook/shell/posix.rb +145 -0
- data/lib/linecook/shell/test.rb +254 -0
- data/lib/linecook/shell/unix.rb +117 -0
- data/lib/linecook/shell/utils.rb +138 -0
- data/lib/linecook/shell.rb +11 -0
- data/lib/linecook/template.rb +111 -0
- data/lib/linecook/test/file_test.rb +77 -0
- data/lib/linecook/test/regexp_escape.rb +86 -0
- data/lib/linecook/test.rb +172 -0
- data/lib/linecook/utils.rb +53 -0
- data/lib/linecook/version.rb +8 -0
- data/lib/linecook.rb +6 -0
- data/templates/Gemfile +2 -0
- data/templates/README +90 -0
- data/templates/Rakefile +149 -0
- data/templates/_gitignore +5 -0
- data/templates/attributes/project_name.rb +4 -0
- data/templates/cookbook +9 -0
- data/templates/files/file.txt +1 -0
- data/templates/helpers/project_name/echo.erb +5 -0
- data/templates/project_name.gemspec +30 -0
- data/templates/recipes/project_name.rb +20 -0
- data/templates/scripts/project_name.yml +7 -0
- data/templates/templates/template.txt.erb +3 -0
- data/templates/vbox/setup/virtual_box +86 -0
- data/templates/vbox/ssh/id_rsa +27 -0
- data/templates/vbox/ssh/id_rsa.pub +1 -0
- metadata +166 -0
data/History
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
== 0.6.2 2011/01/06
|
2
|
+
|
3
|
+
* added helper command to build a single helper
|
4
|
+
* improved rake tasks in template to build as-needed
|
5
|
+
* bugfix in Test#assert_content
|
6
|
+
|
7
|
+
== 0.6.1 2011/01/06
|
8
|
+
|
9
|
+
* added version flag to linecook
|
10
|
+
* updated/improved help
|
11
|
+
|
12
|
+
== 0.6.0 2011/01/06
|
13
|
+
|
14
|
+
Rework with a cleaner interface. Now package interfaces with env state, which
|
15
|
+
gets passed around, rather than the hodge-podge of state passed around
|
16
|
+
previously.
|
17
|
+
|
18
|
+
== 0.5.0 2010/12/28
|
19
|
+
|
20
|
+
* rework with the ability to test more
|
21
|
+
|
22
|
+
== 0.4.0 2010/12/27
|
23
|
+
|
24
|
+
* enhanced linecook executable with commands
|
25
|
+
* added sketches of default shell helpers
|
26
|
+
* bug fixes
|
27
|
+
|
28
|
+
== 0.3.1 2010/12/23
|
29
|
+
|
30
|
+
* prevent capture_path from stripping content
|
31
|
+
* added test tasks to template
|
32
|
+
|
33
|
+
== 0.3.0 2010/12/23
|
34
|
+
|
35
|
+
* improved configuration of cookbook manifest
|
36
|
+
* helpers are now created in lib directory, by
|
37
|
+
default under the Linebook namespace
|
38
|
+
* added bundler support to template
|
39
|
+
* renamed LineCook as Linecook
|
40
|
+
|
41
|
+
== 0.2.1 2010/12/21
|
42
|
+
|
43
|
+
* added missing line_cook executable
|
44
|
+
|
45
|
+
== 0.2.0 2010/12/20
|
46
|
+
|
47
|
+
Complete overhaul.
|
48
|
+
|
49
|
+
* reworked script generation using rake
|
50
|
+
* sketched out functionality for use of gems
|
51
|
+
* added line_cook executable to generate scaffold
|
52
|
+
|
53
|
+
== 0.1.1 2010/12/07
|
54
|
+
|
55
|
+
* added nodoc to definition templates
|
56
|
+
* added tap.yml for generator discover
|
57
|
+
|
58
|
+
== 0.1.0 2010/12/07
|
59
|
+
|
60
|
+
Initial release.
|
data/License.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2010 Pinnacol Assurance
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software. Except as contained in this
|
12
|
+
notice, the name(s) of the above copyright holders shall not be used in
|
13
|
+
advertising or otherwise to promote the sale, use or other dealings in this
|
14
|
+
Software without prior written authorization.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
|
+
SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
= Linecook
|
2
|
+
|
3
|
+
A shell script generator.
|
4
|
+
|
5
|
+
== Description
|
6
|
+
|
7
|
+
Linecook lets you generate shell scripts using an extensible set of tiny ERB
|
8
|
+
helpers. The helpers output a shell script that you can use to (for example)
|
9
|
+
provision a server.
|
10
|
+
|
11
|
+
The workflow is like this:
|
12
|
+
|
13
|
+
* define helpers
|
14
|
+
* write a recipe using the helpers
|
15
|
+
* generate a script from the recipe
|
16
|
+
|
17
|
+
Linecook provides very basic helpers for POSIX shells and a command-line tool
|
18
|
+
for generating scripts and running them on a test vm.
|
19
|
+
|
20
|
+
== Usage
|
21
|
+
|
22
|
+
Generate a cookbook.
|
23
|
+
|
24
|
+
% linecook init example
|
25
|
+
% cd example
|
26
|
+
|
27
|
+
Make some helpers.
|
28
|
+
|
29
|
+
[helpers/example/_head.rb]
|
30
|
+
COLOR_CODES = Hash[*%W{
|
31
|
+
black 0;30 red 0;31
|
32
|
+
white 1;37 green 0;32
|
33
|
+
light_gray 0;37 blue 0;34
|
34
|
+
}]
|
35
|
+
|
36
|
+
[helpers/example/color.erb]
|
37
|
+
Adds color to a string.
|
38
|
+
(color, str)
|
39
|
+
--
|
40
|
+
\033[<%= COLOR_CODES[color.to_s] %>m<%= str %>\033[0m
|
41
|
+
|
42
|
+
[helpers/example/echo.erb]
|
43
|
+
Echo a string in color
|
44
|
+
(str, options={})
|
45
|
+
color = options[:color]
|
46
|
+
--
|
47
|
+
echo -e '<%= color ? _color(color, str) : str %>'
|
48
|
+
|
49
|
+
Define default attributes.
|
50
|
+
|
51
|
+
[recipes/example.rb]
|
52
|
+
attrs['example']['n'] = 3
|
53
|
+
attrs['example']['color'] = 'blue'
|
54
|
+
|
55
|
+
Use them in a recipe.
|
56
|
+
|
57
|
+
[recipes/example.rb]
|
58
|
+
helpers "example"
|
59
|
+
attributes "example"
|
60
|
+
|
61
|
+
attrs['example']['n'].times do
|
62
|
+
echo "I will not manually configure my server", :color => attrs['example']['color']
|
63
|
+
end
|
64
|
+
|
65
|
+
Define a script using the recipe.
|
66
|
+
|
67
|
+
[scripts/example.yml]
|
68
|
+
linecook:
|
69
|
+
recipe_name: example
|
70
|
+
script_name: example.sh
|
71
|
+
example:
|
72
|
+
n: 100
|
73
|
+
|
74
|
+
Generate a script from the helpers, attributes, and recipe.
|
75
|
+
|
76
|
+
% rake scripts
|
77
|
+
|
78
|
+
Start the VM and run the scripts (see the docs for setting up a VM).
|
79
|
+
|
80
|
+
% rake vbox:start
|
81
|
+
% rake vbox:ssh
|
82
|
+
vm: bash /vbox/scripts/example.sh
|
83
|
+
vm: exit
|
84
|
+
|
85
|
+
Stop the VM.
|
86
|
+
|
87
|
+
% rake vbox:stop
|
88
|
+
|
89
|
+
== Installation
|
90
|
+
|
91
|
+
Linecook is available as a gem on {Gemcutter}[http://gemcutter.org/gems/linecook]
|
92
|
+
|
93
|
+
% gem install linecook
|
94
|
+
|
95
|
+
== Info
|
96
|
+
|
97
|
+
Developer:: {Simon Chiang}[http://bahuvrihi.wordpress.com]
|
98
|
+
License:: {MIT-Style}[link:files/License_txt.html]
|
data/bin/linecook
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'linecook/version'
|
4
|
+
require 'linecook/commands'
|
5
|
+
registry = Linecook::Commands::Command.registry
|
6
|
+
|
7
|
+
cmd = ARGV.shift
|
8
|
+
cmd_class = registry[cmd]
|
9
|
+
|
10
|
+
if cmd_class.nil?
|
11
|
+
case cmd
|
12
|
+
when nil, '-h', '--help'
|
13
|
+
puts "usage: linecook [options] COMMAND"
|
14
|
+
puts
|
15
|
+
puts "commands: "
|
16
|
+
registry.keys.sort.each do |key|
|
17
|
+
cmd_class = registry[key]
|
18
|
+
puts " %-16s %s" % [key, cmd_class.desc]
|
19
|
+
end
|
20
|
+
puts
|
21
|
+
puts "options:"
|
22
|
+
puts " -%s, --%-10s %s" % ['v', 'version', 'print version']
|
23
|
+
puts " -%s, --%-10s %s" % ['h', 'help', 'print this help']
|
24
|
+
|
25
|
+
exit
|
26
|
+
when '-v', '--version'
|
27
|
+
puts "version #{Linecook::VERSION} -- #{Linecook::WEBSITE}"
|
28
|
+
exit
|
29
|
+
else
|
30
|
+
puts "unknown command: #{cmd.inspect}"
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
parser = ConfigParser.new
|
36
|
+
parser.add cmd_class.configurations
|
37
|
+
parser.on '-h', '--help', 'print this help' do
|
38
|
+
puts "usage: linecook [options] #{cmd} #{cmd_class.args}"
|
39
|
+
|
40
|
+
desc = cmd_class.desc.wrap
|
41
|
+
unless desc.empty?
|
42
|
+
puts
|
43
|
+
puts cmd_class.desc.wrap
|
44
|
+
puts
|
45
|
+
end
|
46
|
+
|
47
|
+
puts "options:"
|
48
|
+
puts parser.to_s
|
49
|
+
exit
|
50
|
+
end
|
51
|
+
parser.parse! ARGV
|
52
|
+
|
53
|
+
begin
|
54
|
+
cmd_class.new(parser.config).call ARGV
|
55
|
+
rescue Linecook::Commands::CommandError
|
56
|
+
puts $!.message
|
57
|
+
exit 1
|
58
|
+
end
|
data/cookbook
ADDED
File without changes
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'linecook/utils'
|
2
|
+
|
3
|
+
module Linecook
|
4
|
+
class Attributes
|
5
|
+
attr_reader :attrs
|
6
|
+
attr_reader :context
|
7
|
+
|
8
|
+
def initialize(context={})
|
9
|
+
@context = context
|
10
|
+
reset(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def current
|
14
|
+
@current ||= Utils.serial_merge(attrs, context)
|
15
|
+
end
|
16
|
+
|
17
|
+
def reset(full=true)
|
18
|
+
@attrs = Utils.nest_hash if full
|
19
|
+
@current = nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'linecook/commands/command_error'
|
2
|
+
require 'configurable'
|
3
|
+
|
4
|
+
module Linecook
|
5
|
+
module Commands
|
6
|
+
class Command
|
7
|
+
class << self
|
8
|
+
def registry
|
9
|
+
REGISTRY
|
10
|
+
end
|
11
|
+
|
12
|
+
def inherited(base)
|
13
|
+
super
|
14
|
+
registry[base.to_s.split('::').last.downcase] = base
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
REGISTRY = {}
|
19
|
+
|
20
|
+
extend Lazydoc::Attributes
|
21
|
+
include Configurable
|
22
|
+
|
23
|
+
lazy_attr :desc
|
24
|
+
lazy_attr :args, :process
|
25
|
+
lazy_register :process, Lazydoc::Arguments
|
26
|
+
|
27
|
+
def initialize(config)
|
28
|
+
initialize_config(config)
|
29
|
+
end
|
30
|
+
|
31
|
+
def log(action, msg)
|
32
|
+
puts(" %s %s" % [action, msg])
|
33
|
+
end
|
34
|
+
|
35
|
+
def sh(cmd)
|
36
|
+
system cmd
|
37
|
+
end
|
38
|
+
|
39
|
+
def call(argv)
|
40
|
+
process(*argv)
|
41
|
+
end
|
42
|
+
|
43
|
+
def process(*args)
|
44
|
+
raise NotImplementedError
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'linecook/commands/command'
|
2
|
+
require 'linecook/cookbook'
|
3
|
+
|
4
|
+
module Linecook
|
5
|
+
module Commands
|
6
|
+
|
7
|
+
# ::desc prints the cookbook env
|
8
|
+
#
|
9
|
+
# Print the cookbook env.
|
10
|
+
#
|
11
|
+
class Env < Command
|
12
|
+
config :cookbook_dir, '.', :short => :d # the cookbook directory
|
13
|
+
config :path, nil # package path
|
14
|
+
|
15
|
+
def process(*keys)
|
16
|
+
current = Linecook::Cookbook.init(cookbook_dir).env(path)
|
17
|
+
keys.each {|key| current = current[key] if current }
|
18
|
+
|
19
|
+
YAML.dump(current, $stdout)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'linecook/commands/command'
|
2
|
+
require 'linecook/helper'
|
3
|
+
require 'linecook/utils'
|
4
|
+
|
5
|
+
module Linecook
|
6
|
+
module Commands
|
7
|
+
|
8
|
+
# ::desc generates a helper
|
9
|
+
class Helper < Command
|
10
|
+
config :cookbook_dir, '.', :short => :d # the cookbook directory
|
11
|
+
config :namespace, 'linebook', :short => :n # the helper namespace
|
12
|
+
config :force, false, :short => :f, &c.flag # force creation
|
13
|
+
|
14
|
+
include Utils
|
15
|
+
|
16
|
+
def process(name, *sources)
|
17
|
+
name = underscore(name)
|
18
|
+
|
19
|
+
const_path = namespace ? File.join(namespace, name) : name
|
20
|
+
const_name = camelize(const_path)
|
21
|
+
|
22
|
+
sources = default_sources(name) if sources.empty?
|
23
|
+
target = File.expand_path(File.join('lib', "#{const_path}.rb"), cookbook_dir)
|
24
|
+
|
25
|
+
if sources.empty?
|
26
|
+
raise CommandError, "no sources specified (and none could be found)"
|
27
|
+
end
|
28
|
+
|
29
|
+
if File.exists?(target) && !force
|
30
|
+
raise CommandError, "already exists: #{target}"
|
31
|
+
end
|
32
|
+
|
33
|
+
log :create, const_name
|
34
|
+
|
35
|
+
helper = Linecook::Helper.new(const_name, sources)
|
36
|
+
content = helper.build
|
37
|
+
|
38
|
+
target_dir = File.dirname(target)
|
39
|
+
unless File.exists?(target_dir)
|
40
|
+
FileUtils.mkdir_p(target_dir)
|
41
|
+
end
|
42
|
+
|
43
|
+
File.open(target, 'w') {|io| io << content }
|
44
|
+
end
|
45
|
+
|
46
|
+
def default_sources(name)
|
47
|
+
Dir.glob File.join(cookbook_dir, 'helpers', name, '**/*')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'linecook/commands/helper'
|
2
|
+
|
3
|
+
module Linecook
|
4
|
+
module Commands
|
5
|
+
|
6
|
+
# ::desc generates all helpers
|
7
|
+
#
|
8
|
+
# Generates helpers that match the input patterns (by default all,
|
9
|
+
# helpers).
|
10
|
+
#
|
11
|
+
class Helpers < Helper
|
12
|
+
def process
|
13
|
+
helpers_dir = File.expand_path('helpers', cookbook_dir)
|
14
|
+
|
15
|
+
sources = {}
|
16
|
+
Dir.glob("#{helpers_dir}/**/*").each do |source|
|
17
|
+
next if File.directory?(source)
|
18
|
+
(sources[File.dirname(source)] ||= []) << source
|
19
|
+
end
|
20
|
+
|
21
|
+
sources.each_pair do |dir, sources|
|
22
|
+
name = dir[(helpers_dir.length+1)..-1]
|
23
|
+
super(name, *sources)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'linecook/commands/command'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'erb'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
module Linecook
|
7
|
+
module Commands
|
8
|
+
|
9
|
+
# ::desc init a linecook scaffold
|
10
|
+
#
|
11
|
+
# Initializes a linecook scaffold in the specified directory. This
|
12
|
+
# initializer is currently very basic; it is not a true generator.
|
13
|
+
#
|
14
|
+
class Init < Command
|
15
|
+
config :force, false, :short => :f, &c.flag # force creation
|
16
|
+
|
17
|
+
def source_dir
|
18
|
+
@source_dir ||= File.expand_path('../../../../templates', __FILE__)
|
19
|
+
end
|
20
|
+
|
21
|
+
def process(project_dir)
|
22
|
+
project_dir = File.expand_path(project_dir)
|
23
|
+
|
24
|
+
prepare project_dir
|
25
|
+
template project_dir
|
26
|
+
end
|
27
|
+
|
28
|
+
def prepare(project_dir)
|
29
|
+
if File.exists?(project_dir)
|
30
|
+
unless force
|
31
|
+
raise CommandError.new("already exists: #{project_dir}")
|
32
|
+
end
|
33
|
+
|
34
|
+
current_dir = File.expand_path('.')
|
35
|
+
unless project_dir.index(current_dir) == 0 && project_dir.length > current_dir.length
|
36
|
+
raise CommandError.new("cannot force creation of current or parent directory (safety issue)")
|
37
|
+
end
|
38
|
+
|
39
|
+
FileUtils.rm_rf(project_dir)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def template(project_dir, project_name=nil)
|
44
|
+
project_name ||= File.basename(project_dir)
|
45
|
+
context = OpenStruct.new(:project_name => project_name).send(:binding)
|
46
|
+
|
47
|
+
#
|
48
|
+
# Copy template files into place
|
49
|
+
#
|
50
|
+
|
51
|
+
Dir.glob("#{source_dir}/**/*").each do |source|
|
52
|
+
if File.directory?(source)
|
53
|
+
next
|
54
|
+
end
|
55
|
+
|
56
|
+
path = source[(source_dir.length + 1)..-1]
|
57
|
+
path = path.sub('project_name', project_name).sub(/^_/, '.')
|
58
|
+
target = File.join(project_dir, path)
|
59
|
+
|
60
|
+
log :create, path
|
61
|
+
|
62
|
+
target_dir = File.dirname(target)
|
63
|
+
unless File.exists?(target_dir)
|
64
|
+
FileUtils.mkdir_p(target_dir)
|
65
|
+
end
|
66
|
+
|
67
|
+
File.open(target, 'w') do |io|
|
68
|
+
erb = ERB.new(File.read(source), nil, '<>')
|
69
|
+
erb.filename = source
|
70
|
+
io << erb.result(context)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Link up scripts into vbox
|
75
|
+
source = File.join(project_dir, 'scripts')
|
76
|
+
target = File.join(project_dir, 'vbox/scripts')
|
77
|
+
FileUtils.ln_s source, target
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'linecook/commands/command'
|
2
|
+
require 'linecook/cookbook'
|
3
|
+
require 'linecook/recipe'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
module Linecook
|
7
|
+
module Commands
|
8
|
+
|
9
|
+
# ::desc generates a package
|
10
|
+
#
|
11
|
+
# Generates a package.
|
12
|
+
#
|
13
|
+
class Package < Command
|
14
|
+
config :cookbook_dir, '.', :short => :d # the cookbook directory
|
15
|
+
config :force, false, :short => :f, &c.flag # force creation
|
16
|
+
|
17
|
+
def process(source, target=nil)
|
18
|
+
target ||= default_target(source)
|
19
|
+
|
20
|
+
if File.exists?(target)
|
21
|
+
if force
|
22
|
+
FileUtils.rm_r(target)
|
23
|
+
else
|
24
|
+
raise "already exists: #{target}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
log :create, File.basename(target)
|
29
|
+
|
30
|
+
env = Linecook::Cookbook.init(cookbook_dir).env(source)
|
31
|
+
Linecook::Recipe.build(env).export(target)
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_target(source)
|
35
|
+
source.chomp(File.extname(source))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Linecook
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
# Linecook::Commands::Start::desc start the vm
|
5
|
+
class Start < Command
|
6
|
+
config :type, 'headless'
|
7
|
+
|
8
|
+
def process(vmname='vbox')
|
9
|
+
unless `VBoxManage -q list runningvms`.include?(VMNAME)
|
10
|
+
sh "VBoxManage -q startvm #{vmname} --type #{type}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Linecook::Commands::Stop::desc stop the vm
|
16
|
+
class Stop < Command
|
17
|
+
def process(vmname='vbox')
|
18
|
+
if `VBoxManage -q list runningvms`.include?(vmname)
|
19
|
+
sh "VBoxManage -q controlvm #{vmname} poweroff"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Linecook::Commands::Reset::desc reset vm to a snapshot
|
25
|
+
class Reset < Command
|
26
|
+
|
27
|
+
config :type, 'headless'
|
28
|
+
config :snapshot, 'BASE'
|
29
|
+
|
30
|
+
def process(vmname='vbox')
|
31
|
+
if `VBoxManage -q list runningvms`.include?(vmname)
|
32
|
+
sh "VBoxManage -q controlvm #{vmname} poweroff"
|
33
|
+
end
|
34
|
+
|
35
|
+
sh "VBoxManage -q snapshot #{vmname} restore #{snapshot.upcase}"
|
36
|
+
sh "VBoxManage -q startvm #{vmname} --type #{type}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Linecook::Commands::Snapshot::desc take a snapshop
|
41
|
+
class Snapshot < Command
|
42
|
+
def process(snapshot, vmname='vbox')
|
43
|
+
`VBoxManage -q snapshot #{vmname} delete #{snapshot.upcase} > /dev/null`
|
44
|
+
sh "VBoxManage -q snapshot #{vmname} take #{snapshot.upcase}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Linecook::Commands::State::desc print the vm state
|
49
|
+
class State < Command
|
50
|
+
def process(vmname='vbox')
|
51
|
+
if `VBoxManage -q list runningvms`.include?(vmname)
|
52
|
+
puts "running"
|
53
|
+
else
|
54
|
+
puts "stopped"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Linecook::Commands::Ssh::desc ssh to vm
|
60
|
+
class Ssh < Command
|
61
|
+
|
62
|
+
config :port, 2222, &c.integer
|
63
|
+
config :user, 'vbox'
|
64
|
+
config :keypath, File.expand_path('../../../../vbox/ssh/id_rsa', __FILE__)
|
65
|
+
|
66
|
+
def process(cmd=nil)
|
67
|
+
# To prevent ssh errors, protect the private key
|
68
|
+
FileUtils.chmod(0600, keypath)
|
69
|
+
|
70
|
+
# Patterned after vagrant/ssh.rb (circa 0.6.6)
|
71
|
+
platform = RUBY_PLATFORM.to_s.downcase
|
72
|
+
ssh = "ssh -p #{port} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i #{keypath} #{user}@localhost #{cmd}"
|
73
|
+
|
74
|
+
# Some hackery going on here. On Mac OS X Leopard (10.5), exec fails
|
75
|
+
# (GH-51). As a workaround, we fork and wait. On all other platforms, we
|
76
|
+
# simply exec.
|
77
|
+
|
78
|
+
pid = nil
|
79
|
+
pid = fork if platform.include?("darwin9") || platform.include?("darwin8")
|
80
|
+
Kernel.exec(ssh) if pid.nil?
|
81
|
+
Process.wait(pid) if pid
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|