akaer 1.0.0 → 1.5.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.
- data/.gitignore +6 -21
- data/.yardopts +1 -1
- data/Gemfile.lock +19 -19
- data/akaer.gemspec +2 -5
- data/bin/akaer +33 -74
- data/doc/Akaer/Application.html +2134 -0
- data/doc/Akaer/Configuration.html +282 -0
- data/doc/Akaer/Errors/InvalidConfiguration.html +123 -0
- data/doc/Akaer/Errors.html +115 -0
- data/doc/Akaer/Logger.html +596 -0
- data/doc/Akaer/Version.html +189 -0
- data/doc/Akaer.html +130 -0
- data/doc/Fixnum.html +200 -0
- data/doc/_index.html +147 -0
- data/doc/class_list.html +53 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +328 -0
- data/doc/file.README.html +140 -0
- data/doc/file_list.html +55 -0
- data/doc/frames.html +28 -0
- data/doc/index.html +140 -0
- data/doc/js/app.js +214 -0
- data/doc/js/full_list.js +173 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +204 -0
- data/doc/top-level-namespace.html +112 -0
- data/lib/akaer/application.rb +28 -35
- data/lib/akaer/version.rb +1 -1
- data/lib/akaer.rb +1 -1
- data/spec/akaer/application_spec.rb +32 -16
- data/spec/coverage_helper.rb +3 -2
- metadata +29 -23
data/lib/akaer/application.rb
CHANGED
@@ -11,49 +11,44 @@ module Akaer
|
|
11
11
|
# The {Configuration Configuration} of this application.
|
12
12
|
attr_reader :config
|
13
13
|
|
14
|
-
# The
|
15
|
-
attr_reader :
|
14
|
+
# The Mamertes command.
|
15
|
+
attr_reader :command
|
16
16
|
|
17
17
|
# The logger for this application.
|
18
18
|
attr_accessor :logger
|
19
19
|
|
20
20
|
# Creates a new application.
|
21
21
|
#
|
22
|
-
# @param
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
@args = {
|
27
|
-
:global => globals,
|
28
|
-
:local => locals,
|
29
|
-
:args => args
|
30
|
-
}
|
22
|
+
# @param command [Mamertes::Command] The current Mamertes command.
|
23
|
+
def initialize(command)
|
24
|
+
@command = command
|
25
|
+
application = @command.application
|
31
26
|
|
32
27
|
# Setup logger
|
33
28
|
Bovem::Logger.start_time = Time.now
|
34
|
-
@logger = Bovem::Logger.create(Bovem::Logger.get_real_file(
|
29
|
+
@logger = Bovem::Logger.create(Bovem::Logger.get_real_file(application.options["log-file"].value) || Bovem::Logger.default_file, Logger::INFO)
|
35
30
|
|
36
31
|
# Open configuration
|
37
32
|
begin
|
38
33
|
overrides = {
|
39
|
-
:interface =>
|
40
|
-
:addresses =>
|
41
|
-
:start_address =>
|
42
|
-
:aliases =>
|
43
|
-
:add_command =>
|
44
|
-
:remove_command =>
|
45
|
-
:log_file =>
|
46
|
-
:log_level =>
|
47
|
-
:dry_run =>
|
48
|
-
:quiet =>
|
34
|
+
:interface => application.options["interface"].value,
|
35
|
+
:addresses => application.options["addresses"].value,
|
36
|
+
:start_address => application.options["start-address"].value,
|
37
|
+
:aliases => application.options["aliases"].value,
|
38
|
+
:add_command => application.options["add-command"].value,
|
39
|
+
:remove_command => application.options["remove-command"].value,
|
40
|
+
:log_file => application.options["log-file"].value,
|
41
|
+
:log_level => application.options["log-level"].value,
|
42
|
+
:dry_run => application.options["dry-run"].value,
|
43
|
+
:quiet => application.options["quiet"].value
|
49
44
|
}.reject {|k,v| v.nil? }
|
50
45
|
|
51
|
-
@config = Akaer::Configuration.new(
|
46
|
+
@config = Akaer::Configuration.new(application.options["configuration"].value, overrides, @logger)
|
52
47
|
|
53
48
|
@logger = nil
|
54
49
|
@logger = self.get_logger
|
55
50
|
rescue Bovem::Errors::InvalidConfiguration => e
|
56
|
-
@logger ? @logger.fatal(e.message) : Bovem::Logger.create("STDERR").fatal("Cannot log to #{config.log_file}. Exiting...")
|
51
|
+
@logger ? @logger.fatal(e.message) : Bovem::Logger.create("STDERR").fatal("Cannot log to {mark=bright}#{config.log_file}{/mark}. Exiting...")
|
57
52
|
raise ::SystemExit
|
58
53
|
end
|
59
54
|
|
@@ -182,16 +177,15 @@ module Akaer
|
|
182
177
|
@addresses ||= self.compute_addresses
|
183
178
|
length = self.pad_number(@addresses.length)
|
184
179
|
index = (@addresses.index(address) || 0) + 1
|
185
|
-
prefix =
|
180
|
+
prefix = "{mark=blue}[{mark=bright white}#{self.pad_number(index, length.length)}{mark=reset blue}/{/mark}#{length}{/mark}]{/mark}"
|
186
181
|
|
187
182
|
# Now execute
|
188
183
|
if !self.config.dry_run then
|
189
|
-
@logger.info("#{prefix} #{(type == :remove ? "Removing" : "Adding")
|
184
|
+
@logger.info(@command.application.console.replace_markers("#{prefix} {mark=bright}#{(type == :remove ? "Removing" : "Adding")}{/mark} address {mark=bright}#{address}{/mark} #{type != :remove ? "to" : "from"} interface {mark=bright}#{self.config.interface}{/mark}...")) if !self.config.quiet
|
190
185
|
rv = self.execute_command(command)
|
191
|
-
|
192
|
-
# TODO: The end badge.
|
186
|
+
@logger.error(@command.application.console.replace_markers("Cannot {mark=bright}#{(type == :remove ? "remove" : "add")}{/mark} address {mark=bright}#{address}{/mark} #{type != :remove ? "to" : "from"} interface {mark=bright}#{self.config.interface}{/mark}.")) if !rv
|
193
187
|
else
|
194
|
-
@logger.info("#{prefix} I will #{(type == :remove ? "remove" : "add")
|
188
|
+
@logger.info(@command.application.console.replace_markers("#{prefix} I will {mark=bright}#{(type == :remove ? "remove" : "add")}{/mark} address {mark=bright}#{address}{/mark} #{type != :remove ? "to" : "from"} interface {mark=bright}#{self.config.interface}{/mark}.")) if !self.config.quiet
|
195
189
|
end
|
196
190
|
|
197
191
|
rv
|
@@ -243,7 +237,7 @@ module Akaer
|
|
243
237
|
launch_agent = self.launch_agent_path
|
244
238
|
|
245
239
|
begin
|
246
|
-
logger.info("Creating the launch agent in #{launch_agent} ...") if !self.config.quiet
|
240
|
+
logger.info("Creating the launch agent in {mark=bright}#{launch_agent}{/mark} ...") if !self.config.quiet
|
247
241
|
|
248
242
|
args = $ARGV ? $ARGV[0, $ARGV.length - 1] : []
|
249
243
|
|
@@ -302,14 +296,13 @@ module Akaer
|
|
302
296
|
end
|
303
297
|
|
304
298
|
# Returns a unique (singleton) instance of the application.
|
305
|
-
#
|
306
|
-
# @param
|
307
|
-
# @param args [Array] Extra arguments.
|
299
|
+
#
|
300
|
+
# @param command [Mamertes::Command] The current Mamertes command.
|
308
301
|
# @param force [Boolean] If to force recreation of the instance.
|
309
302
|
# @return [Application] The unique (singleton) instance of the application.
|
310
|
-
def self.instance(
|
303
|
+
def self.instance(command, force = false)
|
311
304
|
@instance = nil if force
|
312
|
-
@instance ||= Akaer::Application.new(
|
305
|
+
@instance ||= Akaer::Application.new(command)
|
313
306
|
end
|
314
307
|
end
|
315
308
|
end
|
data/lib/akaer/version.rb
CHANGED
data/lib/akaer.rb
CHANGED
@@ -7,12 +7,29 @@
|
|
7
7
|
require "spec_helper"
|
8
8
|
|
9
9
|
describe Akaer::Application do
|
10
|
+
def create_application(overrides)
|
11
|
+
mamertes_app = Mamertes::App(:run => false) do
|
12
|
+
option "configuration", [], {:default => overrides["configuration"] || "~/.akaer_config"}
|
13
|
+
option "interface", [], {:default => overrides["interface"] || "lo0"}
|
14
|
+
option "addresses", [], {:type => Array, :default => overrides["addresses"] || []}
|
15
|
+
option "start-address", [], {:default => overrides["start-address"] || "10.0.0.1"}
|
16
|
+
option "aliases", [:S], {:type => Integer, :default => overrides["aliases"] || 5}
|
17
|
+
option "add-command", [:A], {:default => overrides["add-command"] || "sudo ifconfig @INTERFACE@ alias @ALIAS@"}
|
18
|
+
option "remove-command", [:R], {:default => overrides["remove-command"] || "sudo ifconfig @INTERFACE@ -alias @ALIAS@"}
|
19
|
+
option "log-file", [], {:default => overrides["log-file"] || "STDOUT"}
|
20
|
+
option "log-level", [:L], {:type => Integer, :default => overrides["log-level"] || 1}
|
21
|
+
option "dry-run", [:n], {:default => overrides["dry-run"] || false}
|
22
|
+
option "quiet", [], {:default => overrides["quiet"] || false}
|
23
|
+
end
|
24
|
+
|
25
|
+
Akaer::Application.new(mamertes_app)
|
26
|
+
end
|
27
|
+
|
10
28
|
before(:each) do
|
11
29
|
Bovem::Logger.stub(:default_file).and_return("/dev/null")
|
12
30
|
end
|
13
|
-
|
14
31
|
let(:log_file) { "/dev/null" }
|
15
|
-
let(:application){
|
32
|
+
let(:application){ create_application({"log-file" => log_file}) }
|
16
33
|
let(:launch_agent_path) { "/tmp/akaer-test-agent-#{Time.now.strftime("%Y%m%d-%H%M%S")}" }
|
17
34
|
|
18
35
|
describe "#initialize" do
|
@@ -30,7 +47,7 @@ describe Akaer::Application do
|
|
30
47
|
file.write("config.aliases = ")
|
31
48
|
file.close
|
32
49
|
|
33
|
-
expect {
|
50
|
+
expect { create_application({"configuration" => file.path, "log-file" => log_file}) }.to raise_error(::SystemExit)
|
34
51
|
::File.unlink(path)
|
35
52
|
end
|
36
53
|
end
|
@@ -94,7 +111,7 @@ describe Akaer::Application do
|
|
94
111
|
|
95
112
|
describe "#compute_addresses" do
|
96
113
|
describe "should use only the explicit list if given" do
|
97
|
-
let(:other_application){
|
114
|
+
let(:other_application){ create_application({"log-file" => log_file, "addresses" => ["10.0.0.1", "::1", "INVALID 1", "10.0.0.2", "INVALID 2", "2001:0db8:0::0:1428:57ab"]}) }
|
98
115
|
|
99
116
|
it "considering all address" do
|
100
117
|
expect(other_application.compute_addresses).to eq(["10.0.0.1", "::1", "10.0.0.2", "2001:0db8:0::0:1428:57ab"])
|
@@ -102,28 +119,28 @@ describe Akaer::Application do
|
|
102
119
|
|
103
120
|
it "considering only IPv4" do
|
104
121
|
expect(other_application.compute_addresses(:ipv4)).to eq(["10.0.0.1", "10.0.0.2"])
|
105
|
-
expect(
|
122
|
+
expect(create_application({"log-file" => log_file, "addresses" => ["::1", "INVALID 1"]}).compute_addresses(:ipv4)).to eq([])
|
106
123
|
end
|
107
124
|
|
108
125
|
it "considering only IPv6" do
|
109
126
|
expect(other_application.compute_addresses(:ipv6)).to eq(["::1", "2001:0db8:0::0:1428:57ab"])
|
110
|
-
expect(
|
127
|
+
expect(create_application({"log-file" => log_file, "addresses" => ["10.0.0.1", "INVALID 1"]}).compute_addresses(:ipv6)).to eq([])
|
111
128
|
end
|
112
129
|
end
|
113
130
|
|
114
131
|
describe "should compute a sequential list of address" do
|
115
132
|
it "considering all address" do
|
116
|
-
expect(
|
117
|
-
expect(
|
118
|
-
expect(
|
133
|
+
expect(create_application({"log-file" => log_file, "start-address" => "10.0.1.1"}).compute_addresses).to eq(["10.0.1.1", "10.0.1.2", "10.0.1.3", "10.0.1.4", "10.0.1.5"])
|
134
|
+
expect(create_application({"log-file" => log_file, "aliases" => 3}).compute_addresses).to eq(["10.0.0.1", "10.0.0.2", "10.0.0.3"])
|
135
|
+
expect(create_application({"log-file" => log_file, "start-address" => "10.0.1.1", :aliases => -1}).compute_addresses).to eq(["10.0.1.1", "10.0.1.2", "10.0.1.3", "10.0.1.4", "10.0.1.5"])
|
119
136
|
end
|
120
137
|
|
121
138
|
it "considering only IPv4" do
|
122
|
-
expect(
|
139
|
+
expect(create_application({"log-file" => log_file, "start-address" => "::1"}).compute_addresses(:ipv4)).to eq([])
|
123
140
|
end
|
124
141
|
|
125
142
|
it "considering only IPv6" do
|
126
|
-
expect(
|
143
|
+
expect(create_application({"log-file" => log_file, "start-address" => "10.0.0.1"}).compute_addresses(:ipv6)).to eq([])
|
127
144
|
end
|
128
145
|
end
|
129
146
|
end
|
@@ -153,7 +170,7 @@ describe Akaer::Application do
|
|
153
170
|
end
|
154
171
|
|
155
172
|
it "should return true if the command succeded" do
|
156
|
-
other_application =
|
173
|
+
other_application = create_application({"add-command" => "echo @INTERFACE@", "quiet" => true})
|
157
174
|
expect(other_application.manage(:add, "10.0.0.3")).to be_true
|
158
175
|
end
|
159
176
|
|
@@ -162,7 +179,7 @@ describe Akaer::Application do
|
|
162
179
|
end
|
163
180
|
|
164
181
|
it "should respect dry-run mode" do
|
165
|
-
other_application =
|
182
|
+
other_application = create_application({"log-file" => log_file, "dry-run" => true})
|
166
183
|
|
167
184
|
other_application.logger.should_receive(:info).with(/.+.*03.*\/.*05.*.+ I will .*add.* address .*10.0.0.3.* to interface .*lo0.*/)
|
168
185
|
other_application.should_not_receive(:execute_command)
|
@@ -174,7 +191,6 @@ describe Akaer::Application do
|
|
174
191
|
end
|
175
192
|
end
|
176
193
|
|
177
|
-
|
178
194
|
describe "#action_add" do
|
179
195
|
it("should compute addresses to manage") do
|
180
196
|
application.should_receive(:compute_addresses)
|
@@ -192,7 +208,7 @@ describe Akaer::Application do
|
|
192
208
|
|
193
209
|
it("should show an error there's no address to manage") do
|
194
210
|
application.stub(:compute_addresses).and_return([])
|
195
|
-
other_application =
|
211
|
+
other_application = create_application({"log-file" => log_file, "quiet" => true})
|
196
212
|
other_application.stub(:compute_addresses).and_return([])
|
197
213
|
|
198
214
|
application.logger.should_receive(:error).with("No valid addresses to add to the interface found.")
|
@@ -219,7 +235,7 @@ describe Akaer::Application do
|
|
219
235
|
|
220
236
|
it("should show an error there's no address to manage") do
|
221
237
|
application.stub(:compute_addresses).and_return([])
|
222
|
-
other_application =
|
238
|
+
other_application = create_application({"log-file" => log_file, "quiet" => true})
|
223
239
|
other_application.stub(:compute_addresses).and_return([])
|
224
240
|
|
225
241
|
application.logger.should_receive(:error).with("No valid addresses to remove from the interface found.")
|
data/spec/coverage_helper.rb
CHANGED
@@ -4,10 +4,11 @@
|
|
4
4
|
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
5
|
#
|
6
6
|
|
7
|
-
require "simplecov"
|
8
7
|
require "pathname"
|
9
8
|
|
10
|
-
if ENV["AKAER_COVERAGE"] == "TRUE" then
|
9
|
+
if ENV["AKAER_COVERAGE"] == "TRUE" && RUBY_VERSION >= "1.9" then
|
10
|
+
require "simplecov"
|
11
|
+
|
11
12
|
root = Pathname.new(File.dirname(__FILE__)) + ".."
|
12
13
|
|
13
14
|
SimpleCov.start do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: akaer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,16 +9,16 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: mamertes
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 1.1.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,23 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: gli
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 1.6.0
|
38
|
-
type: :runtime
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 1.6.0
|
29
|
+
version: 1.1.0
|
46
30
|
- !ruby/object:Gem::Dependency
|
47
31
|
name: rspec
|
48
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -172,6 +156,28 @@ files:
|
|
172
156
|
- Rakefile
|
173
157
|
- akaer.gemspec
|
174
158
|
- bin/akaer
|
159
|
+
- doc/Akaer.html
|
160
|
+
- doc/Akaer/Application.html
|
161
|
+
- doc/Akaer/Configuration.html
|
162
|
+
- doc/Akaer/Errors.html
|
163
|
+
- doc/Akaer/Errors/InvalidConfiguration.html
|
164
|
+
- doc/Akaer/Logger.html
|
165
|
+
- doc/Akaer/Version.html
|
166
|
+
- doc/Fixnum.html
|
167
|
+
- doc/_index.html
|
168
|
+
- doc/class_list.html
|
169
|
+
- doc/css/common.css
|
170
|
+
- doc/css/full_list.css
|
171
|
+
- doc/css/style.css
|
172
|
+
- doc/file.README.html
|
173
|
+
- doc/file_list.html
|
174
|
+
- doc/frames.html
|
175
|
+
- doc/index.html
|
176
|
+
- doc/js/app.js
|
177
|
+
- doc/js/full_list.js
|
178
|
+
- doc/js/jquery.js
|
179
|
+
- doc/method_list.html
|
180
|
+
- doc/top-level-namespace.html
|
175
181
|
- lib/akaer.rb
|
176
182
|
- lib/akaer/application.rb
|
177
183
|
- lib/akaer/configuration.rb
|
@@ -194,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
194
200
|
version: '0'
|
195
201
|
segments:
|
196
202
|
- 0
|
197
|
-
hash: -
|
203
|
+
hash: -2611377790548200103
|
198
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
205
|
none: false
|
200
206
|
requirements:
|
@@ -203,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
209
|
version: '0'
|
204
210
|
segments:
|
205
211
|
- 0
|
206
|
-
hash: -
|
212
|
+
hash: -2611377790548200103
|
207
213
|
requirements: []
|
208
214
|
rubyforge_project: akaer
|
209
215
|
rubygems_version: 1.8.24
|