linecook 1.2.1 → 2.0.0

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 (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
-