linecook 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/{History → History.rdoc} +3 -2
  2. data/README.rdoc +93 -0
  3. data/bin/linecook +32 -56
  4. data/bin/linecook_run +19 -6
  5. data/bin/linecook_scp +12 -4
  6. data/doc/vm_setup.rdoc +75 -0
  7. data/lib/linecook.rb +3 -2
  8. data/lib/linecook/attributes.rb +33 -8
  9. data/lib/linecook/command.rb +61 -0
  10. data/lib/linecook/command_set.rb +85 -0
  11. data/lib/linecook/command_utils.rb +20 -0
  12. data/lib/linecook/commands/build.rb +108 -57
  13. data/lib/linecook/commands/compile.rb +181 -0
  14. data/lib/linecook/commands/{helper.rb → compile_helper.rb} +123 -94
  15. data/lib/linecook/commands/run.rb +43 -39
  16. data/lib/linecook/commands/snapshot.rb +24 -24
  17. data/lib/linecook/commands/ssh.rb +7 -7
  18. data/lib/linecook/commands/start.rb +10 -10
  19. data/lib/linecook/commands/state.rb +7 -7
  20. data/lib/linecook/commands/stop.rb +3 -3
  21. data/lib/linecook/commands/{vbox_command.rb → virtual_box_command.rb} +31 -29
  22. data/lib/linecook/cookbook.rb +149 -131
  23. data/lib/linecook/executable.rb +28 -0
  24. data/lib/linecook/package.rb +177 -361
  25. data/lib/linecook/proxy.rb +4 -10
  26. data/lib/linecook/recipe.rb +289 -369
  27. data/lib/linecook/test.rb +114 -98
  28. data/lib/linecook/utils.rb +31 -41
  29. data/lib/linecook/version.rb +2 -6
  30. metadata +120 -68
  31. data/HowTo/Control Virtual Machines +0 -106
  32. data/HowTo/Generate Scripts +0 -268
  33. data/HowTo/Run Scripts +0 -87
  34. data/HowTo/Setup Virtual Machines +0 -76
  35. data/README +0 -117
  36. data/lib/linecook/commands.rb +0 -11
  37. data/lib/linecook/commands/command.rb +0 -58
  38. data/lib/linecook/commands/command_error.rb +0 -12
  39. data/lib/linecook/commands/env.rb +0 -89
  40. data/lib/linecook/commands/init.rb +0 -86
  41. data/lib/linecook/commands/package.rb +0 -57
  42. data/lib/linecook/template.rb +0 -17
  43. data/lib/linecook/test/command_parser.rb +0 -75
  44. data/lib/linecook/test/file_test.rb +0 -197
  45. data/lib/linecook/test/regexp_escape.rb +0 -86
  46. data/lib/linecook/test/shell_test.rb +0 -177
  47. data/lib/linecook/test/shim.rb +0 -71
  48. data/templates/Gemfile +0 -3
  49. data/templates/Rakefile +0 -146
  50. data/templates/_gitignore +0 -4
  51. data/templates/attributes/project_name.rb +0 -3
  52. data/templates/config/ssh +0 -14
  53. data/templates/cookbook +0 -10
  54. data/templates/files/example.txt +0 -1
  55. data/templates/helpers/project_name/echo.erb +0 -4
  56. data/templates/packages/abox.yml +0 -2
  57. data/templates/project_name.gemspec +0 -30
  58. data/templates/recipes/abox.rb +0 -16
  59. data/templates/templates/example.erb +0 -1
  60. data/templates/test/project_name_test.rb +0 -24
  61. data/templates/test/test_helper.rb +0 -14
@@ -1,76 +0,0 @@
1
- = Setup Virtual Machines
2
-
3
- {VirtualBox}[http://www.virtualbox.org] runs virtual machines on your local
4
- box. Local VMs help minimize development cycles because they are quick to
5
- access and reset. In addition, VirtualBox allows snapshots which can save and
6
- restore a particular server state - this functionality enables iterative
7
- development.
8
-
9
- To set up a Ubuntu VM using VirtualBox:
10
-
11
- 1. Download and Install VirtualBox (http://www.virtualbox.org)
12
- 2. Download a Ubuntu ISO (http://www.ubuntu.com/server/get-ubuntu/download)
13
- 3. Build the Box
14
-
15
- When done, see the documentation for {controlling
16
- VMs}[link:files/HowTo/Control%20Virtual%20Machines.html]
17
-
18
- == Building a Ubuntu Box
19
-
20
- Use the VirtualBox wizard to get started. The name and other settings (ex
21
- user, ssh port) may be changed but be sure to propagate changes throughout the
22
- setup process.
23
-
24
- - name: abox
25
- - Linux/Ubuntu
26
- - 512 MB memory
27
- - 8 GB dynamically resizing drive
28
-
29
- Add the Ubuntu iso to the cd/dvd device under Settings > Storage. Now start
30
- the server and install Ubuntu (use default settings unless specified):
31
-
32
- - hostname: abox-ubuntu
33
- - user/password: linecook
34
- - select 'OpenSSH server' in packages to install
35
-
36
- When the server has rebooted and is at the login screen, remove the install
37
- iso, take a snapshot, and setup port forwarding. Port forwarding allows you to
38
- access the ssh port (22) on the VM via a port on your local box (2220).
39
-
40
- (Devices > CD/DVD Devices > Remove disk from virtual drive)
41
- VBoxManage snapshot abox take RAW
42
- VBoxManage controlvm abox poweroff
43
- # wait to fully power off
44
- VBoxManage modifyvm abox --natpf1 'abox-ssh,tcp,,2220,,22'
45
- VBoxManage -q snapshot abox restore RAW
46
- VBoxManage startvm abox
47
-
48
- Transfer your ssh key to the VM (notice port 2220). Help to generate ssh keys
49
- can be found on {GitHub}[http://help.github.com/key-setup-redirect]:
50
-
51
- scp -P 2220 -o UserKnownHostsFile=/dev/null ~/.ssh/id_rsa.pub linecook@localhost:id_rsa.pub
52
-
53
- Login as linecook and setup SSH access:
54
-
55
- vm: mkdir .ssh
56
- vm: mv id_rsa.pub .ssh/authorized_keys
57
- vm: chmod 0700 .ssh
58
- vm: chmod 0600 .ssh/authorized_keys
59
-
60
- Remove the login banner (as a convenience) and exit:
61
-
62
- vm: sudo rm /etc/motd
63
- vm: exit
64
-
65
- Now take a base snapshot:
66
-
67
- VBoxManage snapshot abox take BASE
68
- VBoxManage controlvm abox poweroff
69
-
70
- To cleanup port forwarding (run later, if ever):
71
-
72
- VBoxManage modifyvm abox --natpf1 delete 'abox-ssh'
73
-
74
- The same procedure can be repeated to build other VMs. Nothing is special
75
- about this setup. The os, name, port, and other settings may be changed to
76
- your liking - all that Linecook requires is ssh access.
data/README DELETED
@@ -1,117 +0,0 @@
1
- = Linecook
2
-
3
- A shell script generator.
4
-
5
- == Description
6
-
7
- Linecook generates shell scripts using an extensible set of ERB helpers. The
8
- shell scripts and associated resources (files, subscripts, etc) make up
9
- packages that can be used, for example, to provision servers.
10
-
11
- Linecook provides a command line tool to manage development servers, generate
12
- scripts, and run scripts on servers. Helpers and recipes can be shared as
13
- gems; the canonical shell helpers are available through
14
- {Linebook}[http://rubygems.org/gems/linebook/].
15
-
16
- See the documentation for help to:
17
-
18
- * {Setup}[link:files/HowTo/Setup%20Virtual%20Machines.html] and {Control}[link:files/HowTo/Control%20Virtual%20Machines.html] Virtual Machines
19
- * {Generate Scripts}[link:files/HowTo/Generate%20Scripts.html]
20
- * {Run Scripts}[link:files/HowTo/Run%20Scripts.html]
21
-
22
- == Usage
23
-
24
- Generate a project.
25
-
26
- % linecook init chalkboard
27
- % cd chalkboard
28
-
29
- Define default attributes.
30
-
31
- [attributes/chalkboard.rb]
32
- attrs['chalkboard']['n'] = 3
33
- attrs['chalkboard']['color'] = 'white'
34
- attrs['chalkboard']['message'] = 'I will not manually configure my server'
35
-
36
- Define a helper.
37
-
38
- [helpers/chalkboard/echo_in_color.erb]
39
- Echo a string in color.
40
- (color, str)
41
- color_codes = Hash[*%W{
42
- black 0;30 red 0;31
43
- white 1;37 green 0;32
44
- light_gray 0;37 blue 0;34
45
- }]
46
- --
47
- echo -e '\033[<%= color_codes[color.to_s] %>m<%= str %>\033[0m'
48
-
49
- Use both in a recipe.
50
-
51
- [recipes/chalkboard.rb]
52
- attributes "chalkboard"
53
- helpers "chalkboard"
54
-
55
- attrs['chalkboard']['n'].times do
56
- echo_in_color attrs['chalkboard']['color'], attrs['chalkboard']['message']
57
- end
58
-
59
- Define a package to use the recipe; set non-default attributes as needed.
60
-
61
- [packages/chalkboard.yml]
62
- chalkboard:
63
- n: 5
64
- color: blue
65
-
66
- Generate the package from the attributes, helpers, and recipe.
67
-
68
- % linecook build
69
-
70
- Check the packages directory to see the resulting script.
71
-
72
- % cat packages/chalkboard/run
73
- echo -e '\033[0;34mI will not manually configure my server\033[0m'
74
- echo -e '\033[0;34mI will not manually configure my server\033[0m'
75
- echo -e '\033[0;34mI will not manually configure my server\033[0m'
76
- echo -e '\033[0;34mI will not manually configure my server\033[0m'
77
- echo -e '\033[0;34mI will not manually configure my server\033[0m'
78
-
79
- Now run the package.
80
-
81
- % linecook run
82
-
83
- The package can be run on any server accessible via ssh. See the generated
84
- 'config/ssh' file as well as the documentation for {Running Scripts on
85
- Servers}[link:files/HowTo/Run%20Scripts.html].
86
-
87
- == Composition
88
-
89
- Linecook consists of the following.
90
-
91
- = Components =
92
- attributes
93
- helpers
94
- |-----> recipes -> packages -a-> (scripts) -b-> (servers) <-c- server setup
95
- files
96
- templates
97
-
98
- = Commands =
99
- ex: 'linecook build' on the command line
100
-
101
- a) env, helper, package, build # build scripts
102
- b) run # run scripts
103
- c) start, stop, ssh, snapshot, reset # server setup/control
104
-
105
- Everything to the left of 'scripts' has to do with generating scripts;
106
- everything to the right with running scripts on servers.
107
-
108
- == Installation
109
-
110
- Linecook is available as a {gem}[http://rubygems.org/gems/linecook].
111
-
112
- % gem install linecook
113
-
114
- == Info
115
-
116
- Developer:: {Simon Chiang}[http://github.com/thinkerbot]
117
- License:: {MIT-Style}[link:files/License_txt.html]
@@ -1,11 +0,0 @@
1
- require 'linecook/commands/build'
2
- require 'linecook/commands/env'
3
- require 'linecook/commands/helper'
4
- require 'linecook/commands/init'
5
- require 'linecook/commands/package'
6
- require 'linecook/commands/snapshot'
7
- require 'linecook/commands/ssh'
8
- require 'linecook/commands/start'
9
- require 'linecook/commands/state'
10
- require 'linecook/commands/stop'
11
- require 'linecook/commands/run'
@@ -1,58 +0,0 @@
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
- attr_accessor :quiet
28
-
29
- def initialize(config={})
30
- @quiet = true
31
- initialize_config(config)
32
- end
33
-
34
- def log(action, msg)
35
- $stderr.puts(" %s %s" % [action, msg])
36
- end
37
-
38
- def sh(cmd)
39
- puts "% #{cmd}" unless quiet
40
- system(cmd)
41
- end
42
-
43
- def sh!(cmd)
44
- unless sh(cmd)
45
- raise CommandError.new("", $?.exitstatus)
46
- end
47
- end
48
-
49
- def call(argv)
50
- process(*argv)
51
- end
52
-
53
- def process(*args)
54
- raise NotImplementedError
55
- end
56
- end
57
- end
58
- end
@@ -1,12 +0,0 @@
1
- module Linecook
2
- module Commands
3
- class CommandError < RuntimeError
4
- attr_reader :exitstatus
5
-
6
- def initialize(msg, exitstatus=1)
7
- @exitstatus = exitstatus
8
- super(msg)
9
- end
10
- end
11
- end
12
- end
@@ -1,89 +0,0 @@
1
- require 'linecook/commands/command'
2
- require 'linecook/cookbook'
3
- require 'yaml'
4
-
5
- module Linecook
6
- module Commands
7
-
8
- # :startdoc::desc prints a package env
9
- #
10
- # Prints the env for the current project directory. Specifically the
11
- # cookbook file is loaded and used to determine all resources that are
12
- # current available. The full build env for a package can be viewed by
13
- # specifying the package file as an option.
14
- #
15
- # A specific env value can be printed by specifying the key path to it.
16
- class Env < Command
17
- config :project_dir, '.', :short => :d # the project directory
18
- config :package_file, nil, :short => :p # the package file
19
-
20
- # :stopdoc:
21
- # Evaluate to replace the to_yaml function on Hash so that it will
22
- # serialize keys in order. Evaluate the OFF code to turn this hack off
23
- # (and thereby ease up on the code pollution)
24
- #
25
- # Modified from: http://snippets.dzone.com/posts/show/5811 Original
26
- # func: /usr/lib/ruby/1.8/yaml/rubytypes.rb
27
- ORIGINAL_TO_YAML = 'linecook_original_to_yaml'
28
- SORTED_HASH_ON_LINE = __LINE__ + 1
29
- SORTED_HASH_ON = %{
30
- class Hash
31
- unless instance_methods.include?('#{ORIGINAL_TO_YAML}')
32
- alias #{ORIGINAL_TO_YAML} to_yaml
33
- undef_method :to_yaml
34
- def to_yaml( opts = {} )
35
- YAML::quick_emit( object_id, opts ) do |out|
36
- out.map( taguri, to_yaml_style ) do |map|
37
- keys.sort_by do |k|
38
- k.to_s
39
- end.each do |k|
40
- map.add( k, fetch(k) )
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end}
47
-
48
- SORTED_HASH_OFF_LINE = __LINE__ + 1
49
- SORTED_HASH_OFF = %{
50
- class Hash
51
- if instance_methods.include?('#{ORIGINAL_TO_YAML}')
52
- undef_method :to_yaml
53
- alias to_yaml #{ORIGINAL_TO_YAML}
54
- undef_method :#{ORIGINAL_TO_YAML}
55
- end
56
- end}
57
- # :startdoc:
58
-
59
- def select(current, *keys)
60
- keys.each do |key|
61
- unless current.kind_of?(Hash)
62
- return nil
63
- end
64
-
65
- current = current[key]
66
- end
67
-
68
- current
69
- end
70
-
71
- # Serializes the env to the target as YAML. Ensures hashes are
72
- # serialized with their keys sorted by their to_s value.
73
- def serialize(env, target="")
74
- begin
75
- eval SORTED_HASH_ON, TOPLEVEL_BINDING, __FILE__, SORTED_HASH_ON_LINE
76
- YAML.dump(env, target)
77
- ensure
78
- eval SORTED_HASH_OFF, TOPLEVEL_BINDING, __FILE__, SORTED_HASH_OFF_LINE
79
- end
80
- end
81
-
82
- def process(*keys)
83
- package = Linecook::Package.init(package_file, project_dir)
84
- env = select(package.env, *keys)
85
- serialize(env, $stdout)
86
- end
87
- end
88
- end
89
- end
@@ -1,86 +0,0 @@
1
- require 'linecook/commands/command'
2
- require 'linecook/utils'
3
- require 'fileutils'
4
- require 'erb'
5
- require 'ostruct'
6
-
7
- module Linecook
8
- module Commands
9
-
10
- # :startdoc::desc create a linecook scaffold
11
- #
12
- # Initializes a linecook scaffold in the specified directory. This
13
- # initializer is currently very basic; it is not a true generator.
14
- #
15
- class Init < Command
16
- config :force, false, :short => :f, &c.flag # force creation
17
-
18
- def source_dir
19
- @source_dir ||= File.expand_path('../../../../templates', __FILE__)
20
- end
21
-
22
- def process(project_dir)
23
- project_dir = File.expand_path(project_dir)
24
-
25
- prepare project_dir
26
- template project_dir
27
- end
28
-
29
- def prepare(project_dir)
30
- if File.exists?(project_dir)
31
- unless force
32
- raise CommandError.new("already exists: #{project_dir}")
33
- end
34
-
35
- current_dir = File.expand_path('.')
36
- unless project_dir.index(current_dir) == 0 && project_dir.length > current_dir.length
37
- raise CommandError.new("cannot force creation of current or parent directory (safety issue)")
38
- end
39
-
40
- FileUtils.rm_rf(project_dir)
41
- end
42
- end
43
-
44
- def template(project_dir, project_name=nil)
45
- project_name ||= File.basename(project_dir)
46
- context = OpenStruct.new(
47
- :project_name => project_name,
48
- :const_name => Utils.camelize(project_name)
49
- ).instance_eval('binding')
50
-
51
- #
52
- # Copy template files into place
53
- #
54
-
55
- Dir.glob("#{source_dir}/**/*").each do |source|
56
- if File.directory?(source)
57
- next
58
- end
59
-
60
- path = source[(source_dir.length + 1)..-1]
61
- path = path.sub('project_name', project_name).sub(/^_/, '.')
62
- target = File.join(project_dir, path)
63
-
64
- log :create, path
65
-
66
- target_dir = File.dirname(target)
67
- unless File.exists?(target_dir)
68
- FileUtils.mkdir_p(target_dir)
69
- end
70
-
71
- File.open(target, 'w') do |io|
72
- erb = ERB.new(File.read(source), nil, '<>')
73
- erb.filename = source
74
- io << erb.result(context)
75
- end
76
- end
77
-
78
- # Link up project dir into test
79
- target = File.join(project_dir, 'test', "#{project_name}_test", "test_#{project_name}")
80
- FileUtils.mkdir_p File.dirname(target)
81
- FileUtils.ln_s project_dir, target
82
- end
83
- end
84
- end
85
- end
86
-