automate-it 0.9.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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.hgignore +10 -0
- data/.loadpath +5 -0
- data/.project +17 -0
- data/CHANGES.txt +314 -0
- data/Hoe.rake +40 -0
- data/Manifest.txt +164 -0
- data/README.txt +40 -0
- data/Rakefile +256 -0
- data/TESTING.txt +57 -0
- data/TODO.txt +50 -0
- data/TUTORIAL.txt +391 -0
- data/automate-it.gemspec +25 -0
- data/bin/ai +3 -0
- data/bin/aifield +75 -0
- data/bin/aissh +93 -0
- data/bin/aitag +134 -0
- data/bin/automateit +133 -0
- data/docs/friendly_errors.txt +50 -0
- data/docs/previews.txt +86 -0
- data/examples/basic/Rakefile +26 -0
- data/examples/basic/config/automateit_env.rb +16 -0
- data/examples/basic/config/fields.yml +3 -0
- data/examples/basic/config/tags.yml +7 -0
- data/examples/basic/dist/README.txt +9 -0
- data/examples/basic/dist/myapp_server.erb +30 -0
- data/examples/basic/install.log +15 -0
- data/examples/basic/lib/README.txt +10 -0
- data/examples/basic/recipes/README.txt +4 -0
- data/examples/basic/recipes/install.rb +61 -0
- data/examples/basic/recipes/uninstall.rb +6 -0
- data/gpl.txt +674 -0
- data/helpers/cpan_wrapper.pl +220 -0
- data/helpers/which.cmd +7 -0
- data/lib/automateit.rb +55 -0
- data/lib/automateit/account_manager.rb +114 -0
- data/lib/automateit/account_manager/base.rb +138 -0
- data/lib/automateit/account_manager/etc.rb +128 -0
- data/lib/automateit/account_manager/nscd.rb +33 -0
- data/lib/automateit/account_manager/passwd_expect.rb +40 -0
- data/lib/automateit/account_manager/passwd_pty.rb +69 -0
- data/lib/automateit/account_manager/posix.rb +138 -0
- data/lib/automateit/address_manager.rb +88 -0
- data/lib/automateit/address_manager/base.rb +171 -0
- data/lib/automateit/address_manager/bsd.rb +28 -0
- data/lib/automateit/address_manager/freebsd.rb +59 -0
- data/lib/automateit/address_manager/linux.rb +42 -0
- data/lib/automateit/address_manager/openbsd.rb +66 -0
- data/lib/automateit/address_manager/portable.rb +37 -0
- data/lib/automateit/address_manager/sunos.rb +34 -0
- data/lib/automateit/cli.rb +85 -0
- data/lib/automateit/common.rb +65 -0
- data/lib/automateit/constants.rb +35 -0
- data/lib/automateit/download_manager.rb +48 -0
- data/lib/automateit/edit_manager.rb +321 -0
- data/lib/automateit/error.rb +10 -0
- data/lib/automateit/field_manager.rb +103 -0
- data/lib/automateit/interpreter.rb +631 -0
- data/lib/automateit/package_manager.rb +257 -0
- data/lib/automateit/package_manager/apt.rb +27 -0
- data/lib/automateit/package_manager/cpan.rb +101 -0
- data/lib/automateit/package_manager/dpkg.rb +54 -0
- data/lib/automateit/package_manager/egg.rb +64 -0
- data/lib/automateit/package_manager/gem.rb +201 -0
- data/lib/automateit/package_manager/pear.rb +95 -0
- data/lib/automateit/package_manager/pecl.rb +80 -0
- data/lib/automateit/package_manager/portage.rb +69 -0
- data/lib/automateit/package_manager/yum.rb +65 -0
- data/lib/automateit/platform_manager.rb +49 -0
- data/lib/automateit/platform_manager/darwin.rb +30 -0
- data/lib/automateit/platform_manager/debian.rb +26 -0
- data/lib/automateit/platform_manager/freebsd.rb +29 -0
- data/lib/automateit/platform_manager/gentoo.rb +26 -0
- data/lib/automateit/platform_manager/lsb.rb +44 -0
- data/lib/automateit/platform_manager/openbsd.rb +28 -0
- data/lib/automateit/platform_manager/struct.rb +80 -0
- data/lib/automateit/platform_manager/sunos.rb +39 -0
- data/lib/automateit/platform_manager/uname.rb +29 -0
- data/lib/automateit/platform_manager/windows.rb +40 -0
- data/lib/automateit/plugin.rb +7 -0
- data/lib/automateit/plugin/base.rb +32 -0
- data/lib/automateit/plugin/driver.rb +256 -0
- data/lib/automateit/plugin/manager.rb +224 -0
- data/lib/automateit/project.rb +493 -0
- data/lib/automateit/root.rb +17 -0
- data/lib/automateit/service_manager.rb +93 -0
- data/lib/automateit/service_manager/chkconfig.rb +39 -0
- data/lib/automateit/service_manager/rc_update.rb +37 -0
- data/lib/automateit/service_manager/sysv.rb +139 -0
- data/lib/automateit/service_manager/update_rcd.rb +35 -0
- data/lib/automateit/shell_manager.rb +316 -0
- data/lib/automateit/shell_manager/base_link.rb +67 -0
- data/lib/automateit/shell_manager/link.rb +24 -0
- data/lib/automateit/shell_manager/portable.rb +523 -0
- data/lib/automateit/shell_manager/symlink.rb +32 -0
- data/lib/automateit/shell_manager/which_base.rb +30 -0
- data/lib/automateit/shell_manager/which_unix.rb +16 -0
- data/lib/automateit/shell_manager/which_windows.rb +20 -0
- data/lib/automateit/tag_manager.rb +127 -0
- data/lib/automateit/tag_manager/struct.rb +121 -0
- data/lib/automateit/tag_manager/tag_parser.rb +93 -0
- data/lib/automateit/tag_manager/yaml.rb +29 -0
- data/lib/automateit/template_manager.rb +56 -0
- data/lib/automateit/template_manager/base.rb +181 -0
- data/lib/automateit/template_manager/erb.rb +17 -0
- data/lib/ext/metaclass.rb +17 -0
- data/lib/ext/object.rb +18 -0
- data/lib/ext/shell_escape.rb +7 -0
- data/lib/hashcache.rb +22 -0
- data/lib/helpful_erb.rb +63 -0
- data/lib/inactive_support.rb +53 -0
- data/lib/inactive_support/basic_object.rb +6 -0
- data/lib/inactive_support/clean_logger.rb +127 -0
- data/lib/inactive_support/core_ext/array/extract_options.rb +19 -0
- data/lib/inactive_support/core_ext/blank.rb +50 -0
- data/lib/inactive_support/core_ext/class/attribute_accessors.rb +48 -0
- data/lib/inactive_support/core_ext/class/inheritable_attributes.rb +140 -0
- data/lib/inactive_support/core_ext/enumerable.rb +63 -0
- data/lib/inactive_support/core_ext/hash/keys.rb +54 -0
- data/lib/inactive_support/core_ext/module/aliasing.rb +70 -0
- data/lib/inactive_support/core_ext/numeric/time.rb +91 -0
- data/lib/inactive_support/core_ext/string/inflections.rb +153 -0
- data/lib/inactive_support/core_ext/symbol.rb +14 -0
- data/lib/inactive_support/core_ext/time/conversions.rb +96 -0
- data/lib/inactive_support/duration.rb +96 -0
- data/lib/inactive_support/inflections.rb +53 -0
- data/lib/inactive_support/inflector.rb +282 -0
- data/lib/nested_error.rb +33 -0
- data/lib/nitpick.rb +33 -0
- data/lib/queued_logger.rb +68 -0
- data/lib/tempster.rb +250 -0
- data/misc/index_gem_repository.rb +304 -0
- data/misc/setup_egg.rb +12 -0
- data/misc/setup_gem_dependencies.sh +6 -0
- data/misc/setup_rubygems.sh +21 -0
- metadata +279 -0
@@ -0,0 +1,171 @@
|
|
1
|
+
# == AddressManager::BaseDriver
|
2
|
+
#
|
3
|
+
# Base class for all AddressManager drivers.
|
4
|
+
class AutomateIt::AddressManager::BaseDriver< AutomateIt::Plugin::Driver
|
5
|
+
public
|
6
|
+
|
7
|
+
# See AddressManager#hostnames
|
8
|
+
def hostnames()
|
9
|
+
# NOTE: depends on driver's implementation of addresses
|
10
|
+
names = manager.addresses.inject(Set.new) do |sum, address|
|
11
|
+
# Some addresses can't be resolved, bummer.
|
12
|
+
sum.merge(Resolv.getnames(address)) rescue Resolv::ResolvError; sum
|
13
|
+
end
|
14
|
+
names << Socket.gethostname
|
15
|
+
names.merge(Socket.gethostbyname(Socket.gethostname)[1]) rescue SocketError
|
16
|
+
|
17
|
+
names.each{|name| names.merge(hostnames_for(name))}
|
18
|
+
names << "localhost"
|
19
|
+
return names.to_a.sort
|
20
|
+
end
|
21
|
+
|
22
|
+
# See AddressManager#hostname_for
|
23
|
+
def hostnames_for(hostname)
|
24
|
+
results = []
|
25
|
+
elements = hostname.split(".")
|
26
|
+
for i in 1..elements.size
|
27
|
+
results << elements[0..i-1].join(".")
|
28
|
+
end
|
29
|
+
return results.to_a.sort
|
30
|
+
end
|
31
|
+
|
32
|
+
# See AddressManager#has?
|
33
|
+
def has?(opts)
|
34
|
+
raise ArgumentError.new(":device or :address must be specified") unless opts[:device] or opts[:address]
|
35
|
+
result = true
|
36
|
+
result &= manager.interfaces.include?(opts[:device]) if opts[:device] and not opts[:label]
|
37
|
+
result &= manager.interfaces.include?(opts[:device]+":"+opts[:label]) if opts[:device] and opts[:label]
|
38
|
+
result &= manager.addresses.include?(opts[:address]) if opts[:address]
|
39
|
+
return result
|
40
|
+
end
|
41
|
+
|
42
|
+
#-----------------------------------------------------------------------
|
43
|
+
|
44
|
+
protected
|
45
|
+
|
46
|
+
# Convert a mask to a CIDR.
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
# mask_to_cidr("255.255.255.0") # => 24
|
50
|
+
def mask_to_cidr(mask)
|
51
|
+
# TODO Find less horrible solution which can handle IPv6.
|
52
|
+
result = ''
|
53
|
+
for chunk in mask.split(".")
|
54
|
+
result += dec2bin(chunk.to_i)
|
55
|
+
end
|
56
|
+
return result.scan(/1/).size
|
57
|
+
end
|
58
|
+
|
59
|
+
# Convert CIDR to mask.
|
60
|
+
#
|
61
|
+
# Example:
|
62
|
+
# cidr_to_mask(24) # => "255.255.255.0"
|
63
|
+
def cidr_to_mask(cidr)
|
64
|
+
# TODO Find less horrible solution which can handle IPv6.
|
65
|
+
require 'ipaddr'
|
66
|
+
IPAddr.new("0.0.0.0/#{cidr}").inspect.match(%r{/([\d\.]+)>})[1]
|
67
|
+
end
|
68
|
+
|
69
|
+
# Convert a decimal number to binary notation.
|
70
|
+
#
|
71
|
+
# Example:
|
72
|
+
# dec2bin(255) # => "11111111"
|
73
|
+
def dec2bin(n)
|
74
|
+
# dec2bin(255)
|
75
|
+
return "%b" % n
|
76
|
+
end
|
77
|
+
|
78
|
+
# Convert a binary number to decimal.
|
79
|
+
#
|
80
|
+
# Example:
|
81
|
+
# bin2dec("11111111") # => 255
|
82
|
+
def bin2dec(s)
|
83
|
+
return s.to_i(2)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Helper for #add method.
|
87
|
+
def _add_helper(opts, &block)
|
88
|
+
opts[:announcements] = opts[:announcements].to_i || AutomateIt::AddressManager::DEFAULT_ANNOUNCEMENTS
|
89
|
+
raise SecurityError.new("you must be root") unless superuser?
|
90
|
+
raise ArgumentError.new(":device and :address must be specified") unless opts[:device] and opts[:address]
|
91
|
+
return false if manager.has?(opts)
|
92
|
+
block.call(opts)
|
93
|
+
return true
|
94
|
+
end
|
95
|
+
|
96
|
+
# Helper for #remove method.
|
97
|
+
def _remove_helper(opts, &block)
|
98
|
+
return false unless manager.has?(opts)
|
99
|
+
raise SecurityError.new("you must be root") unless superuser?
|
100
|
+
raise ArgumentError.new(":device and :address must be specified") unless opts[:device] and opts[:address]
|
101
|
+
return block.call(opts)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Alter +opts+ hash to add alternative names for various options.
|
105
|
+
def _normalize_opts(opts)
|
106
|
+
# Accept common alternative names
|
107
|
+
opts[:mask] ||= opts[:netmask] if opts[:netmask]
|
108
|
+
opts[:alias] ||= opts[:alias] if opts[:alias]
|
109
|
+
opts[:device] ||= opts[:interface] if opts[:interface]
|
110
|
+
|
111
|
+
if opts[:mask] and not opts[:mask].match(/\./)
|
112
|
+
opts[:mask] = cidr_to_mask(opts[:mask])
|
113
|
+
end
|
114
|
+
|
115
|
+
return opts
|
116
|
+
end
|
117
|
+
|
118
|
+
# Return the interface and label specified in +opts+ hash, e.g., "eth0:1".
|
119
|
+
def _interface_and_label(opts)
|
120
|
+
return(
|
121
|
+
if opts[:device] and not opts[:label]
|
122
|
+
opts[:device]
|
123
|
+
elsif opts[:device] and opts[:label]
|
124
|
+
"%s:%s" % [opts[:device], opts[:label]]
|
125
|
+
else
|
126
|
+
raise ArgumentError.new("Can't derive interface and label for: #{opts.inspect}")
|
127
|
+
end
|
128
|
+
)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Returns a string used to construct an ifconfig command, e.g.
|
132
|
+
# ifconfig hme0 192.9.2.106 netmask 255.255.255.0 up
|
133
|
+
# ifconfig hme0:1 172.40.30.4 netmask 255.255.0.0 up
|
134
|
+
#
|
135
|
+
# Options:
|
136
|
+
# * :device -- Interface, e.g., "eth0". String.
|
137
|
+
# * :label -- Alias label, e.g., "1". String.
|
138
|
+
# * :address -- IP address, e.g., "127.0.0.1". String.
|
139
|
+
# * :mask -- Netmask, e.g., "255.255.255.0" or 24. String or Fixnum.
|
140
|
+
#
|
141
|
+
# Helper options:
|
142
|
+
# * :append -- Array of strings to append to end of command, e.g., ["-alias"].
|
143
|
+
# * :prepend -- Array of strings to prepend to string, adding them after after "ifconfig", e.g., ["inet"].
|
144
|
+
# * :state -- Whether to list "up" and "down" in command. Defaults to true.
|
145
|
+
def _ifconfig_helper(action, opts, helper_opts={})
|
146
|
+
_raise_unless_available
|
147
|
+
|
148
|
+
# Translate common names
|
149
|
+
action = :del if action.to_sym == :remove
|
150
|
+
|
151
|
+
# Defaults
|
152
|
+
_normalize_opts(opts)
|
153
|
+
helper_opts[:state] = true unless helper_opts[:state] == false
|
154
|
+
|
155
|
+
ipcmd = "ifconfig"
|
156
|
+
ipcmd << " " << _interface_and_label(opts)
|
157
|
+
if helper_opts[:prepend]
|
158
|
+
ipcmd << " " << [helper_opts[:prepend]].flatten.join(" ")
|
159
|
+
end
|
160
|
+
ipcmd << " %s" % opts[:address]
|
161
|
+
ipcmd << " netmask %s" % opts[:mask] if opts[:mask]
|
162
|
+
if helper_opts[:state]
|
163
|
+
ipcmd << " up" if action == :add
|
164
|
+
ipcmd << " down" if action == :del
|
165
|
+
end
|
166
|
+
if helper_opts[:append]
|
167
|
+
ipcmd << " " << [helper_opts[:append]].flatten.join(" ")
|
168
|
+
end
|
169
|
+
return ipcmd
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# == AddressManager::BSD
|
2
|
+
#
|
3
|
+
# An AddressManager driver for operating systems using a BSD-like ifconfig.
|
4
|
+
# Driver provides querying addresses and interfaces.
|
5
|
+
class AutomateIt::AddressManager::BSD < AutomateIt::AddressManager::BaseDriver
|
6
|
+
def self.token
|
7
|
+
:bsd
|
8
|
+
end
|
9
|
+
|
10
|
+
depends_on :programs => %w(ifconfig uname),
|
11
|
+
:callbacks => lambda{`uname -s 2>&1`.match(/openbsd|freebsd|sunos/i)}
|
12
|
+
|
13
|
+
def suitability(method, *args) # :nodoc:
|
14
|
+
available? ? 2 : 0
|
15
|
+
end
|
16
|
+
|
17
|
+
# See AddressManager#interfaces
|
18
|
+
def interfaces()
|
19
|
+
_raise_unless_available
|
20
|
+
return `ifconfig -a`.scan(/^([^\s]+):\s+/s).flatten
|
21
|
+
end
|
22
|
+
|
23
|
+
# See AddressManager#addresses
|
24
|
+
def addresses()
|
25
|
+
_raise_unless_available
|
26
|
+
return `ifconfig -a`.scan(/\s+inet\s+([^\s]+)\s+/).flatten
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# == AddressManager::FreeBSD
|
2
|
+
#
|
3
|
+
# A FreeBSD-specific driver for the AddressManager provides complete support for
|
4
|
+
# querying, adding and removing addresses.
|
5
|
+
class AutomateIt::AddressManager::FreeBSD < AutomateIt::AddressManager::BaseDriver
|
6
|
+
def self.token
|
7
|
+
:freebsd
|
8
|
+
end
|
9
|
+
|
10
|
+
depends_on :programs => %w(ifconfig uname),
|
11
|
+
:callbacks => lambda{`uname -s 2>&1`.match(/freebsd/i)}
|
12
|
+
|
13
|
+
def suitability(method, *args) # :nodoc:
|
14
|
+
# Must be higher than AddressManager::BSD
|
15
|
+
available? ? 3 : 0
|
16
|
+
end
|
17
|
+
|
18
|
+
# See AddressManager#add
|
19
|
+
def add(opts)
|
20
|
+
_add_helper(opts) do |opts|
|
21
|
+
interpreter.sh(_freebsd_ifconfig_helper(:add, opts))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# See AddressManager#remove
|
26
|
+
def remove(opts)
|
27
|
+
_remove_helper(opts) do |opts|
|
28
|
+
interpreter.sh(_freebsd_ifconfig_helper(:remove, opts))
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# See AddressManager#has?
|
34
|
+
def has?(opts)
|
35
|
+
opts2 = opts.clone
|
36
|
+
is_alias = opts2.delete(:label)
|
37
|
+
return super(opts2)
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
# ifconfig fxp0 inet 172.16.1.3 netmask 255.255.255.255 alias
|
43
|
+
def _freebsd_ifconfig_helper(action, opts)
|
44
|
+
helper_opts = {:state => false, :prepend => %w(inet)}
|
45
|
+
opts2 = opts.clone
|
46
|
+
if opts2.delete(:label)
|
47
|
+
helper_opts[:append] = \
|
48
|
+
case action
|
49
|
+
when :add
|
50
|
+
%w(alias)
|
51
|
+
when :remove, :del
|
52
|
+
%w(-alias)
|
53
|
+
else
|
54
|
+
ArgumentError.new("Unknown action: #{action}")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
return _ifconfig_helper(action, opts2, helper_opts)
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,42 @@
|
|
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#add
|
15
|
+
def add(opts)
|
16
|
+
_add_helper(opts) do |opts|
|
17
|
+
interpreter.sh(_ifconfig_helper(:add, opts))
|
18
|
+
if interpreter.which("arping")
|
19
|
+
interpreter.sh("arping -q -c #{opts[:announcements]} -w #{opts[:announcements]} -I #{opts[:device]} #{opts[:address]}")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# See AddressManager#remove
|
25
|
+
def remove(opts)
|
26
|
+
_remove_helper(opts) do |opts|
|
27
|
+
interpreter.sh(_ifconfig_helper(:remove, opts))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# See AddressManager#interfaces
|
32
|
+
def interfaces()
|
33
|
+
_raise_unless_available
|
34
|
+
return `ifconfig`.scan(/^(\w+?(?::\w+)?)\b\s+Link/).flatten
|
35
|
+
end
|
36
|
+
|
37
|
+
# See AddressManager#addresses
|
38
|
+
def addresses()
|
39
|
+
_raise_unless_available
|
40
|
+
return `ifconfig`.scan(/inet6? addr:\s*(.+?)\s+/).flatten
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# == AddressManager::OpenBSD
|
2
|
+
#
|
3
|
+
# A OpenBSD-specific driver for the AddressManager provides complete support for
|
4
|
+
# querying, adding and removing addresses.
|
5
|
+
class AutomateIt::AddressManager::OpenBSD < AutomateIt::AddressManager::BaseDriver
|
6
|
+
def self.token
|
7
|
+
:openbsd
|
8
|
+
end
|
9
|
+
|
10
|
+
depends_on :programs => %w(ifconfig uname),
|
11
|
+
:callbacks => lambda{`uname -s 2>&1`.match(/openbsd/i)}
|
12
|
+
|
13
|
+
def suitability(method, *args) # :nodoc:
|
14
|
+
# Must be higher than AddressManager::BSD
|
15
|
+
available? ? 3 : 0
|
16
|
+
end
|
17
|
+
|
18
|
+
# See AddressManager#add
|
19
|
+
def add(opts)
|
20
|
+
_add_helper(opts) do |opts|
|
21
|
+
interpreter.sh(_openbsd_ifconfig_helper(:add, opts))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# See AddressManager#remove
|
26
|
+
def remove(opts)
|
27
|
+
_remove_helper(opts) do |opts|
|
28
|
+
interpreter.sh(_openbsd_ifconfig_helper(:remove, opts))
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# See AddressManager#addresses
|
34
|
+
def addresses()
|
35
|
+
_raise_unless_available
|
36
|
+
# OpenBSD requires an "-A" to display aliases, not the usual "-a"
|
37
|
+
return `ifconfig -A`.scan(/\s+inet\s+([^\s]+)\s+/).flatten
|
38
|
+
end
|
39
|
+
|
40
|
+
# See AddressManager#has?
|
41
|
+
def has?(opts)
|
42
|
+
opts2 = opts.clone
|
43
|
+
is_alias = opts2.delete(:label)
|
44
|
+
return super(opts2)
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
# ifconfig dc0 inet alias 192.168.0.3 netmask 255.255.255.255
|
50
|
+
def _openbsd_ifconfig_helper(action, opts)
|
51
|
+
helper_opts = {:state => false, :prepend => %w(inet)}
|
52
|
+
opts2 = opts.clone
|
53
|
+
if opts2.delete(:label)
|
54
|
+
helper_opts[:prepend] << \
|
55
|
+
case action
|
56
|
+
when :add
|
57
|
+
"alias"
|
58
|
+
when :remove, :del
|
59
|
+
"delete"
|
60
|
+
else
|
61
|
+
ArgumentError.new("Unknown action: #{action}")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
return _ifconfig_helper(action, opts2, helper_opts)
|
65
|
+
end
|
66
|
+
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,34 @@
|
|
1
|
+
# == AddressManager::SunOS
|
2
|
+
#
|
3
|
+
# A SunOS-specific driver for the AddressManager provides complete support for
|
4
|
+
# querying, adding and removing addresses.
|
5
|
+
class AutomateIt::AddressManager::SunOS < AutomateIt::AddressManager::BaseDriver
|
6
|
+
def self.token
|
7
|
+
:sunos
|
8
|
+
end
|
9
|
+
|
10
|
+
depends_on :programs => %w(ifconfig uname),
|
11
|
+
:callbacks => lambda{`uname -s 2>&1`.match(/sunos/i)}
|
12
|
+
|
13
|
+
def suitability(method, *args) # :nodoc:
|
14
|
+
# Must be higher than AddressManager::BSD
|
15
|
+
available? ? 3 : 0
|
16
|
+
end
|
17
|
+
|
18
|
+
# See AddressManager#add
|
19
|
+
def add(opts)
|
20
|
+
_add_helper(opts) do |opts|
|
21
|
+
interpreter.sh("ifconfig %s plumb" % _interface_and_label(opts))
|
22
|
+
interpreter.sh(_ifconfig_helper(:add, opts))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# See AddressManager#remove
|
27
|
+
def remove(opts)
|
28
|
+
_remove_helper(opts) do |opts|
|
29
|
+
interpreter.sh(_ifconfig_helper(:remove, opts))
|
30
|
+
interpreter.sh("ifconfig %s unplumb" % _interface_and_label(opts))
|
31
|
+
true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,85 @@
|
|
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
|
+
# * :tags -- Array of tags to add for this run.
|
19
|
+
# * :project -- Project directory to load.
|
20
|
+
# * :recipe -- Recipe file to execute.
|
21
|
+
# * :eval -- Evaluate this string.
|
22
|
+
# * :quiet -- Don't print shell header.
|
23
|
+
def self.run(*a)
|
24
|
+
args, opts = args_and_opts(*a)
|
25
|
+
recipe = args.first || opts[:recipe]
|
26
|
+
if recipe and not opts[:project]
|
27
|
+
opts[:project] = File.join(File.dirname(recipe), "..")
|
28
|
+
opts[:guessed_project] = true
|
29
|
+
end
|
30
|
+
|
31
|
+
opts[:verbosity] ||= Logger::INFO
|
32
|
+
|
33
|
+
if opts[:create]
|
34
|
+
Project::create(opts)
|
35
|
+
elsif code = opts.delete(:eval)
|
36
|
+
interpreter = AutomateIt.new(opts)
|
37
|
+
interpreter.instance_eval(code)
|
38
|
+
elsif recipe
|
39
|
+
AutomateIt.invoke(recipe, opts)
|
40
|
+
else
|
41
|
+
# Welcome messages
|
42
|
+
display = lambda{|msg| puts msg if opts[:verbosity] <= Logger::INFO}
|
43
|
+
display.call PNOTE+"AutomateIt Shell v#{AutomateIt::VERSION} #{$0}"
|
44
|
+
|
45
|
+
# Create and connect instances
|
46
|
+
require "irb"
|
47
|
+
IRB.setup(__FILE__)
|
48
|
+
# XXX irb: warn: can't alias context from irb_context.
|
49
|
+
irb = IRB::Irb.new
|
50
|
+
opts[:irb] = irb
|
51
|
+
IRB.conf[:MAIN_CONTEXT] = irb.context
|
52
|
+
interpreter = AutomateIt.new(opts)
|
53
|
+
irb.context.workspace.instance_variable_set(:@binding, interpreter.send(:binding))
|
54
|
+
|
55
|
+
# Tab completion
|
56
|
+
message = "<CTRL-D> to quit"
|
57
|
+
begin
|
58
|
+
require 'irb/completion'
|
59
|
+
irb.context.auto_indent_mode = true
|
60
|
+
irb.context.load_modules << 'irb/completion' unless irb.context.load_modules.include?('irb/completion')
|
61
|
+
irb.context.instance_eval{ @use_readline = true }
|
62
|
+
message << ", <Tab> to auto-complete"
|
63
|
+
rescue LoadError
|
64
|
+
# Ignore
|
65
|
+
end
|
66
|
+
display.call PNOTE+message
|
67
|
+
|
68
|
+
# Set prompt
|
69
|
+
unless opts[:custom_prompt] == false
|
70
|
+
irb.context.prompt_i = "ai> "
|
71
|
+
irb.context.prompt_s = "ai%l "
|
72
|
+
irb.context.prompt_c = "ai* "
|
73
|
+
begin
|
74
|
+
irb.context.prompt_n = "ai%i "
|
75
|
+
rescue NoMethodError
|
76
|
+
# Not available on Ruby 1.8.2 bundled with Mac OS X 10.4 Tiger
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Run loop to read user input
|
81
|
+
irb.eval_input
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|