automateit 0.70923

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. data.tar.gz.sig +1 -0
  2. data/CHANGES.txt +100 -0
  3. data/Hoe.rake +35 -0
  4. data/Manifest.txt +111 -0
  5. data/README.txt +44 -0
  6. data/Rakefile +284 -0
  7. data/TESTING.txt +57 -0
  8. data/TODO.txt +26 -0
  9. data/TUTORIAL.txt +390 -0
  10. data/bin/ai +3 -0
  11. data/bin/aifield +82 -0
  12. data/bin/aitag +128 -0
  13. data/bin/automateit +117 -0
  14. data/docs/friendly_errors.txt +50 -0
  15. data/docs/previews.txt +86 -0
  16. data/env.sh +4 -0
  17. data/examples/basic/Rakefile +26 -0
  18. data/examples/basic/config/automateit_env.rb +16 -0
  19. data/examples/basic/config/fields.yml +3 -0
  20. data/examples/basic/config/tags.yml +13 -0
  21. data/examples/basic/dist/README.txt +9 -0
  22. data/examples/basic/dist/myapp_server.erb +30 -0
  23. data/examples/basic/install.log +15 -0
  24. data/examples/basic/lib/README.txt +10 -0
  25. data/examples/basic/recipes/README.txt +4 -0
  26. data/examples/basic/recipes/install.rb +53 -0
  27. data/examples/basic/recipes/uninstall.rb +6 -0
  28. data/gpl.txt +674 -0
  29. data/lib/automateit.rb +66 -0
  30. data/lib/automateit/account_manager.rb +106 -0
  31. data/lib/automateit/account_manager/linux.rb +171 -0
  32. data/lib/automateit/account_manager/passwd.rb +69 -0
  33. data/lib/automateit/account_manager/portable.rb +136 -0
  34. data/lib/automateit/address_manager.rb +165 -0
  35. data/lib/automateit/address_manager/linux.rb +80 -0
  36. data/lib/automateit/address_manager/portable.rb +37 -0
  37. data/lib/automateit/cli.rb +80 -0
  38. data/lib/automateit/common.rb +65 -0
  39. data/lib/automateit/constants.rb +33 -0
  40. data/lib/automateit/edit_manager.rb +292 -0
  41. data/lib/automateit/error.rb +10 -0
  42. data/lib/automateit/field_manager.rb +103 -0
  43. data/lib/automateit/interpreter.rb +641 -0
  44. data/lib/automateit/package_manager.rb +242 -0
  45. data/lib/automateit/package_manager/apt.rb +63 -0
  46. data/lib/automateit/package_manager/egg.rb +64 -0
  47. data/lib/automateit/package_manager/gem.rb +179 -0
  48. data/lib/automateit/package_manager/portage.rb +69 -0
  49. data/lib/automateit/package_manager/yum.rb +65 -0
  50. data/lib/automateit/platform_manager.rb +47 -0
  51. data/lib/automateit/platform_manager/darwin.rb +30 -0
  52. data/lib/automateit/platform_manager/debian.rb +26 -0
  53. data/lib/automateit/platform_manager/freebsd.rb +25 -0
  54. data/lib/automateit/platform_manager/gentoo.rb +26 -0
  55. data/lib/automateit/platform_manager/lsb.rb +40 -0
  56. data/lib/automateit/platform_manager/struct.rb +78 -0
  57. data/lib/automateit/platform_manager/uname.rb +29 -0
  58. data/lib/automateit/platform_manager/windows.rb +33 -0
  59. data/lib/automateit/plugin.rb +7 -0
  60. data/lib/automateit/plugin/base.rb +32 -0
  61. data/lib/automateit/plugin/driver.rb +218 -0
  62. data/lib/automateit/plugin/manager.rb +232 -0
  63. data/lib/automateit/project.rb +460 -0
  64. data/lib/automateit/root.rb +14 -0
  65. data/lib/automateit/service_manager.rb +79 -0
  66. data/lib/automateit/service_manager/chkconfig.rb +39 -0
  67. data/lib/automateit/service_manager/rc_update.rb +37 -0
  68. data/lib/automateit/service_manager/sysv.rb +126 -0
  69. data/lib/automateit/service_manager/update_rcd.rb +35 -0
  70. data/lib/automateit/shell_manager.rb +261 -0
  71. data/lib/automateit/shell_manager/base_link.rb +67 -0
  72. data/lib/automateit/shell_manager/link.rb +24 -0
  73. data/lib/automateit/shell_manager/portable.rb +421 -0
  74. data/lib/automateit/shell_manager/symlink.rb +32 -0
  75. data/lib/automateit/shell_manager/which.rb +25 -0
  76. data/lib/automateit/tag_manager.rb +63 -0
  77. data/lib/automateit/tag_manager/struct.rb +101 -0
  78. data/lib/automateit/tag_manager/tag_parser.rb +91 -0
  79. data/lib/automateit/tag_manager/yaml.rb +29 -0
  80. data/lib/automateit/template_manager.rb +55 -0
  81. data/lib/automateit/template_manager/base.rb +172 -0
  82. data/lib/automateit/template_manager/erb.rb +17 -0
  83. data/lib/ext/metaclass.rb +17 -0
  84. data/lib/ext/object.rb +18 -0
  85. data/lib/hashcache.rb +22 -0
  86. data/lib/helpful_erb.rb +63 -0
  87. data/lib/nested_error.rb +33 -0
  88. data/lib/queued_logger.rb +68 -0
  89. data/lib/tempster.rb +239 -0
  90. data/misc/index_gem_repository.rb +303 -0
  91. data/misc/setup_egg.rb +12 -0
  92. data/misc/setup_gem_dependencies.sh +7 -0
  93. data/misc/setup_rubygems.sh +21 -0
  94. data/misc/which.cmd +6 -0
  95. data/spec/extras/automateit_service_sysv_test +50 -0
  96. data/spec/extras/scratch.rb +15 -0
  97. data/spec/extras/simple_recipe.rb +8 -0
  98. data/spec/integration/account_manager_spec.rb +218 -0
  99. data/spec/integration/address_manager_linux_spec.rb +119 -0
  100. data/spec/integration/address_manager_portable_spec.rb +30 -0
  101. data/spec/integration/cli_spec.rb +215 -0
  102. data/spec/integration/examples_spec.rb +54 -0
  103. data/spec/integration/examples_spec_editor.rb +71 -0
  104. data/spec/integration/package_manager_spec.rb +104 -0
  105. data/spec/integration/platform_manager_spec.rb +69 -0
  106. data/spec/integration/service_manager_sysv_spec.rb +115 -0
  107. data/spec/integration/shell_manager_spec.rb +471 -0
  108. data/spec/integration/template_manager_erb_spec.rb +31 -0
  109. data/spec/spec_helper.rb +23 -0
  110. data/spec/unit/edit_manager_spec.rb +162 -0
  111. data/spec/unit/field_manager_spec.rb +79 -0
  112. data/spec/unit/hashcache_spec.rb +28 -0
  113. data/spec/unit/interpreter_spec.rb +98 -0
  114. data/spec/unit/platform_manager_spec.rb +44 -0
  115. data/spec/unit/plugins_spec.rb +253 -0
  116. data/spec/unit/tag_manager_spec.rb +189 -0
  117. data/spec/unit/template_manager_erb_spec.rb +137 -0
  118. metadata +249 -0
  119. metadata.gz.sig +0 -0
@@ -0,0 +1,165 @@
1
+ # == AddressManager
2
+ #
3
+ # The AddressManager provides a way to query, add and remove network
4
+ # addresses on a host.
5
+ class AutomateIt::AddressManager < AutomateIt::Plugin::Manager
6
+ # Does host have an address or interface? Arguments hash must include
7
+ # either a :device (e.g., "eth0") or :address (e.g., "10.0.0.10"), and an
8
+ # optional :label (e.g., "foo"). Note that an interface is the combination
9
+ # of a :device and :label, so "eth0" isn't the same as "eth0:foo".
10
+ #
11
+ # Examples on a host with address "10.0.0.10" on interface "eth0:foo":
12
+ # has?(:address => "10.0.0.10")
13
+ # => true
14
+ # has?(:address => "10.0.0.10", :device => "eth0")
15
+ # => false
16
+ # has?(:address => "10.0.0.10", :device => "eth0", :label => "foo")
17
+ # => true
18
+ # has?(:device => "eth0")
19
+ # => false
20
+ # has?(:device => "eth0", :label => "foo")
21
+ # => true
22
+ def has?(opts) dispatch(opts) end
23
+
24
+ # Add address to host if it doesn't have it. Requires root-level access.
25
+ # Returns +true+ if action was taken and succeeded.
26
+ #
27
+ # Arguments hash must include either a :device (e.g., "eth0") or :address
28
+ # (e.g., "10.0.0.10"), and an optional :label (e.g., "foo") and :mask (e.g.
29
+ # "24").
30
+ #
31
+ # An optional number of ARP :announcements may be specified, defaulting to
32
+ # AutomateIt::AddressManager::DEFAULT_ANNOUNCEMENTS. Drivers that handle
33
+ # announcements will block an extra second while making each announcement.
34
+ #
35
+ # Example:
36
+ # add(:address => "10.0.0.10", :mask => 24, :device => "eth0",
37
+ # :label => "foo", :announcements => 3)
38
+ def add(opts) dispatch(opts) end
39
+
40
+ # Number of ARP announcements to make by default during #add.
41
+ DEFAULT_ANNOUNCEMENTS = 3
42
+
43
+ # Remove address from host if it has it. Requires root-level access.
44
+ # Returns +true+ if action was taken and succeeded.
45
+ #
46
+ # Arguments hash must include either a :device (e.g., "eth0") or :address
47
+ # (e.g., "10.0.0.10"), and an optional :label (e.g., "foo") and :mask (e.g.
48
+ # "24").
49
+ #
50
+ # Example:
51
+ # remove(:address => "10.0.0.10", :mask => 24, :device => "eth0",
52
+ # :label => "foo")
53
+ def remove(opts) dispatch(opts) end
54
+
55
+ # Array of addresses for this host. Example:
56
+ # addresses
57
+ # => ["10.0.0.10", "127.0.0.1"]
58
+ def addresses() dispatch() end
59
+
60
+ # Array of interfaces for this host. Example:
61
+ # interfaces
62
+ # => ["eth0", "lo"]
63
+ def interfaces() dispatch() end
64
+
65
+ # Array of hostnames for this host, including variants by trying to resolve
66
+ # names for all addresses owned by this host. Example:
67
+ # hostnames
68
+ # => ["kagami", "kagami.lucky-channel", "kagami.lucky-channel.jp"]
69
+ def hostnames() dispatch() end
70
+
71
+ # Array of hostname variants for this +hostname+. This method performs no
72
+ # name resolution and simply infers a less qualified name from a more
73
+ # qualified hostname argument. Example:
74
+ # hostnames_for("kagami.lucky-channel")
75
+ # => ["kagami", "kagami.lucky-channel"]
76
+ # hostnames_for("kagami")
77
+ # => ["kagami"]
78
+ def hostnames_for(hostname) dispatch(hostname) end
79
+
80
+ # Convert a mask to a CIDR.
81
+ #
82
+ # Example:
83
+ # mask_to_cidr("255.255.255.0") # => 24
84
+ def mask_to_cidr(mask) dispatch(mask) end
85
+
86
+ # Convert CIDR to mask.
87
+ #
88
+ # Example:
89
+ # cidr_to_mask(24) # => "255.255.255.0"
90
+ def cidr_to_mask(cidr) dispatch(cidr) end
91
+
92
+ # Convert a decimal number to binary notation.
93
+ #
94
+ # Example:
95
+ # dec2bin(255) # => "11111111"
96
+ def dec2bin(n) dispatch(n) end
97
+
98
+ # Convert a binary number to decimal.
99
+ #
100
+ # Example:
101
+ # bin2dec("11111111") # => 255
102
+ def bin2dec(s) dispatch(s) end
103
+ end
104
+
105
+ # == AddressManager::BaseDriver
106
+ #
107
+ # Base class for all AddressManager drivers.
108
+ class AutomateIt::AddressManager::BaseDriver< AutomateIt::Plugin::Driver
109
+ # See AddressManager#hostnames
110
+ def hostnames()
111
+ # NOTE: depends on driver's implementation of addresses
112
+ names = addresses.inject(Set.new) do |sum, address|
113
+ # Some addresses can't be resolved, bummer.
114
+ sum.merge(Resolv.getnames(address)) rescue Resolv::ResolvError; sum
115
+ end
116
+ names << Socket.gethostname
117
+ names.merge(Socket.gethostbyname(Socket.gethostname)[1]) rescue SocketError
118
+
119
+ names.each{|name| names.merge(hostnames_for(name))}
120
+ names << "localhost"
121
+ return names.to_a.sort
122
+ end
123
+
124
+ # See AddressManager#hostname_for
125
+ def hostnames_for(hostname)
126
+ results = []
127
+ elements = hostname.split(".")
128
+ for i in 1..elements.size
129
+ results << elements[0..i-1].join(".")
130
+ end
131
+ return results.to_a.sort
132
+ end
133
+
134
+ # See AddressManager#mask_to_cidr
135
+ def mask_to_cidr(mask)
136
+ # TODO Find less horrible solution which can handle IPv6.
137
+ result = ''
138
+ for chunk in mask.split(".")
139
+ result += dec2bin(chunk.to_i)
140
+ end
141
+ return result.scan(/1/).size
142
+ end
143
+
144
+ # See AddressManager#cidr_to_mask
145
+ def cidr_to_mask(cidr)
146
+ # TODO Find less horrible solution which can handle IPv6.
147
+ require 'ipaddr'
148
+ IPAddr.new("0.0.0.0/#{cidr}").inspect.match(%r{/([\d\.]+)>})[1]
149
+ end
150
+
151
+ # See AddressManager#dec2bin
152
+ def dec2bin(n)
153
+ # dec2bin(255)
154
+ return "%b" % n
155
+ end
156
+
157
+ # See AddressManager#bin2dec
158
+ def bin2dec(s)
159
+ return s.to_i(2)
160
+ end
161
+ end
162
+
163
+ # Drivers
164
+ require 'automateit/address_manager/portable'
165
+ require 'automateit/address_manager/linux'
@@ -0,0 +1,80 @@
1
+ # == AddressManager::Linux
2
+ #
3
+ # A Linux-specific driver for the AddressManager provides complete support for
4
+ # querying, adding and removing addresses on platforms that feature Linux-like
5
+ # tools.
6
+ class AutomateIt::AddressManager::Linux < AutomateIt::AddressManager::BaseDriver
7
+ depends_on :programs => "ifconfig",
8
+ :callbacks => lambda{`ifconfig --version 2>&1`.match(/net-tools/)}
9
+
10
+ def suitability(method, *args) # :nodoc:
11
+ available? ? 2 : 0
12
+ end
13
+
14
+ # See AddressManager#has?
15
+ def has?(opts)
16
+ raise ArgumentError.new(":device or :address must be specified") unless opts[:device] or opts[:address]
17
+ result = true
18
+ result &= interfaces.include?(opts[:device]) if opts[:device] and not opts[:label]
19
+ result &= interfaces.include?(opts[:device]+":"+opts[:label]) if opts[:device] and opts[:label]
20
+ result &= addresses.include?(opts[:address]) if opts[:address]
21
+ return result
22
+ end
23
+
24
+ # See AddressManager#add
25
+ def add(opts)
26
+ announcements = opts[:announcements].to_i || AutomateIt::AddressManager::DEFAULT_ANNOUNCEMENTS
27
+ raise SecurityError.new("you must be root") unless superuser?
28
+ raise ArgumentError.new(":device and :address must be specified") unless opts[:device] and opts[:address]
29
+ return false if has?(opts)
30
+ interpreter.sh(_add_or_remove_command(:add, opts))
31
+ if interpreter.which("arping")
32
+ interpreter.sh("arping -q -c #{announcements} -w #{announcements} -I #{opts[:device]} #{opts[:address]}")
33
+ end
34
+ return true
35
+ end
36
+
37
+ # See AddressManager#remove
38
+ def remove(opts)
39
+ return false unless has?(opts)
40
+ raise SecurityError.new("you must be root") unless superuser?
41
+ raise ArgumentError.new(":device and :address must be specified") unless opts[:device] and opts[:address]
42
+ return interpreter.sh(_add_or_remove_command(:remove, opts))
43
+ end
44
+
45
+ def _add_or_remove_command(action, opts)
46
+ _raise_unless_available
47
+ action = :del if action.to_sym == :remove
48
+
49
+ # Accept common alternative names
50
+ opts[:mask] ||= opts[:netmask] if opts[:netmask]
51
+ opts[:alias] ||= opts[:alias] if opts[:alias]
52
+ opts[:device] ||= opts[:interface] if opts[:interface]
53
+
54
+ if opts[:mask] and not opts[:mask].match(/\./)
55
+ opts[:mask] = cidr_to_mask(opts[:mask])
56
+ end
57
+
58
+ ipcmd = "ifconfig"
59
+ ipcmd << " %s" % opts[:device] if opts[:device] and not opts[:label]
60
+ ipcmd << " %s:%s" % [opts[:device], opts[:label]] if opts[:device] and opts[:label]
61
+ ipcmd << " %s" % opts[:address]
62
+ ipcmd << " netmask %s" % opts[:mask] if opts[:mask]
63
+ ipcmd << " up" if action == :add
64
+ ipcmd << " down" if action == :del
65
+ return ipcmd
66
+ end
67
+ private :_add_or_remove_command
68
+
69
+ # See AddressManager#interfaces
70
+ def interfaces()
71
+ _raise_unless_available
72
+ return `ifconfig`.scan(/^(\w+?(?::\w+)?)\b\s+Link/).flatten
73
+ end
74
+
75
+ # See AddressManager#addresses
76
+ def addresses()
77
+ _raise_unless_available
78
+ return `ifconfig`.scan(/inet6? addr:\s*(.+?)\s+/).flatten
79
+ end
80
+ end
@@ -0,0 +1,37 @@
1
+ # == AddressManager::Portable
2
+ #
3
+ # A pure-Ruby, portable driver for the AddressManager which provides
4
+ # minimal support for querying the hostname using sockets. Although it
5
+ # lacks advanced features found in other drivers, it will work on all
6
+ # platforms.
7
+ class AutomateIt::AddressManager::Portable < AutomateIt::AddressManager::BaseDriver
8
+ def suitability(method, *args) # :nodoc:
9
+ return 1
10
+ end
11
+
12
+ # See AddressManager#has?
13
+ def has?(opts)
14
+ raise NotImplementedError.new("this driver doesn't support queries for devices or labels") if opts[:device] or opts[:label]
15
+ result = true
16
+ result &= addresses.include?(opts[:address]) if opts[:address]
17
+ return result
18
+ end
19
+
20
+ # See AddressManager#hostnames
21
+ def hostnames
22
+ results = Set.new
23
+ results << Socket.gethostname
24
+ results.merge(Socket.gethostbyname(Socket.gethostname)[1]) rescue SocketError
25
+
26
+ results.each{|name| results.merge(hostnames_for(name))}
27
+ results << "localhost"
28
+ return results.to_a.sort
29
+ end
30
+
31
+ # See AddressManager#addresses
32
+ def addresses
33
+ results = Set.new("127.0.0.1")
34
+ results.merge(TCPSocket.gethostbyname(Socket.gethostname)[3]) rescue SocketError
35
+ return results.flatten
36
+ end
37
+ end
@@ -0,0 +1,80 @@
1
+ module AutomateIt
2
+ # == CLI
3
+ #
4
+ # The CLI class provides AutomateIt's command-line interface. It's
5
+ # responsible for invoking recipes from the command line, starting the
6
+ # interactive shell and creating projects. It's run from
7
+ # <tt>bin/automate</tt>.
8
+ class CLI < Common
9
+ # Create a new CLI interpreter. If no :recipe or :eval option is provided,
10
+ # it starts an interactive IRB session for the Interpreter.
11
+ #
12
+ # Examples:
13
+ # AutomateIt::CLI.run("myrecipe.rb")
14
+ # AutomateIt::CLI.run(:recipe => "myrecipe.rb")
15
+ # AutomateIt::CLI.run(:eval => "42")
16
+ #
17
+ # Options:
18
+ # * :project -- Project directory to load.
19
+ # * :recipe -- Recipe file to execute.
20
+ # * :eval -- Evaluate this string.
21
+ # * :quiet -- Don't print shell header.
22
+ def self.run(*a)
23
+ args, opts = args_and_opts(*a)
24
+ recipe = args.first || opts[:recipe]
25
+ if recipe and not opts[:project]
26
+ opts[:project] = File.join(File.dirname(recipe), "..")
27
+ opts[:guessed_project] = true
28
+ end
29
+ opts[:verbosity] ||= Logger::INFO
30
+ if opts[:create]
31
+ Project::create(opts)
32
+ elsif code = opts.delete(:eval)
33
+ interpreter = AutomateIt.new(opts)
34
+ interpreter.instance_eval(code)
35
+ elsif recipe
36
+ AutomateIt.invoke(recipe, opts)
37
+ else
38
+ # Welcome messages
39
+ display = lambda{|msg| puts msg if opts[:verbosity] <= Logger::INFO}
40
+ display.call PNOTE+"AutomateIt Shell v#{AutomateIt::VERSION} #{$0}"
41
+
42
+ # Create and connect instances
43
+ require "irb"
44
+ IRB.setup(__FILE__)
45
+ # XXX irb: warn: can't alias context from irb_context.
46
+ irb = IRB::Irb.new
47
+ opts[:irb] = irb
48
+ IRB.conf[:MAIN_CONTEXT] = irb.context
49
+ interpreter = AutomateIt.new(opts)
50
+ irb.context.workspace.instance_variable_set(:@binding, interpreter.send(:binding))
51
+
52
+ # Tab completion
53
+ begin
54
+ require 'irb/completion'
55
+ irb.context.auto_indent_mode = true
56
+ irb.context.load_modules << 'irb/completion' unless irb.context.load_modules.include?('irb/completion')
57
+ irb.context.instance_eval{ @use_readline = true }
58
+ display.call PNOTE+"<CTRL-D> to quit, <Tab> to auto-complete"
59
+ rescue LoadError
60
+ display.call PNOTE+"<CTRL-D> to quit"
61
+ end
62
+
63
+ # Set prompt
64
+ unless opts[:custom_prompt] == false
65
+ irb.context.prompt_i = "ai> "
66
+ irb.context.prompt_s = "ai%l "
67
+ irb.context.prompt_c = "ai* "
68
+ begin
69
+ irb.context.prompt_n = "ai%i "
70
+ rescue NoMethodError
71
+ # Not available on Ruby 1.8.2 bundled with Mac OS X 10.4 Tiger
72
+ end
73
+ end
74
+
75
+ # Run loop to read user input
76
+ irb.eval_input
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,65 @@
1
+ module AutomateIt
2
+ # == Common
3
+ #
4
+ # Common is the abstract class that most AutomateIt classes inherit from.
5
+ class Common
6
+ include AutomateIt::Constants
7
+
8
+ # Interpreter instance for this class.
9
+ attr_accessor :interpreter
10
+
11
+ # Calls #setup with +options+ for processing.
12
+ def initialize(options={})
13
+ setup(options)
14
+ end
15
+
16
+ # Setup the class. Options:
17
+ # * :interpreter - Set the Interpreter.
18
+ def setup(options={})
19
+ @interpreter = options[:interpreter] if options[:interpreter]
20
+ end
21
+
22
+ #---[ Interpreter aliases ]---------------------------------------------
23
+
24
+ unless defined?(AutomateIt::Interpreter) and AutomateIt::Interpreter === self
25
+ # See Interpreter#log
26
+ def log() @interpreter.log end
27
+
28
+ # See Interpreter#noop=
29
+ def noop=(value) @interpreter.noop=(value) end
30
+
31
+ # See Interpreter#noop
32
+ def noop(value) @interpreter.noop(value) end
33
+
34
+ # See Interpreter#noop?
35
+ def noop?() @interpreter.noop?() end
36
+
37
+ # See Interpreter#writing=
38
+ def writing=(value) @interpreter.writing=(value) end
39
+
40
+ # See Interpreter#writing
41
+ def writing(value) @interpreter.writing(value) end
42
+
43
+ # See Interpreter#writing?
44
+ def writing?() @interpreter.writing?() end
45
+
46
+ # See Interpreter#preview?
47
+ def preview?() @interpreter.preview?() end
48
+
49
+ # See Interpreter#preview
50
+ def preview(value=nil) @interpreter.preview(value) end
51
+
52
+ # See Interpreter#preview=
53
+ def preview=(value) @interpreter.preview=(value) end
54
+
55
+ # See Interpreter#preview_for
56
+ def preview_for(message, &block) @interpreter.preview_for(message, &block) end
57
+
58
+ # See Interpreter#superuser?
59
+ def superuser?() @interpreter.superuser? end
60
+
61
+ # See Interpreter#nitpick
62
+ def nitpick(value=nil) @interpreter.nitpick(value) end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,33 @@
1
+ module AutomateIt # :nodoc:
2
+ # === AutomateIt::Constants
3
+ #
4
+ # Various constants.
5
+ module AutomateIt::Constants
6
+ # AutomateIt version
7
+ VERSION=Gem::Version.new("0.70923")
8
+
9
+ # Output prefix for command execution, e.g., "** ls -la"
10
+ PEXEC = "** "
11
+
12
+ # Output prefix for notes, e.g., "=> Something happened"
13
+ PNOTE = "=> "
14
+
15
+ # Output prefix for errors, e.g., "!! Something bad happened"
16
+ PERROR = "!! "
17
+
18
+ # Boilerplate to add to tops of generated files, warning people not to edit
19
+ # them directly.
20
+ WARNING_BOILERPLATE = "# +---------------------------------------------------------------------+
21
+ # | WARNING: Do NOT edit this file directly or your changes will be |
22
+ # | lost. If you need to change this file, you must incorporate your |
23
+ # | changes into the AutomateIt project that created it. If you don't |
24
+ # | know what this means, please talk to your system administrator. |
25
+ # +---------------------------------------------------------------------+
26
+ #
27
+ "
28
+ end
29
+
30
+ # Inject constants back into top, providing AutomateIt::VERSION and such.
31
+ module_eval { include Constants }
32
+ end
33
+