phut 0.7.7 → 0.7.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.rubocop.yml +14 -1
- data/.travis.yml +2 -6
- data/Gemfile +30 -2
- data/Gemfile.lock +156 -0
- data/README.md +7 -2
- data/Rakefile +4 -3
- data/bin/phut +35 -83
- data/bin/vhost +28 -26
- data/features/{dsl.feature → dsl/error.feature} +8 -6
- data/features/{dsl_link.feature → dsl/link.feature} +11 -14
- data/features/dsl/netns.feature +115 -0
- data/features/dsl/vhost.feature +37 -0
- data/features/{dsl_vswitch.feature → dsl/vswitch.feature} +12 -12
- data/features/phut_run.feature +15 -0
- data/features/shell/vswitch#destroy.feature +10 -0
- data/features/shell/vswitch#ports.feature +36 -0
- data/features/shell/vswitch.all.feature +26 -0
- data/features/shell/vswitch.create.feature +30 -0
- data/features/shell/vswitch.destroy.feature +19 -0
- data/features/shell/vswitch.destroy_all.feature +18 -0
- data/features/step_definitions/link_steps.rb +5 -0
- data/features/step_definitions/netns_steps.rb +31 -0
- data/features/step_definitions/phut_steps.rb +5 -34
- data/features/step_definitions/vhost_steps.rb +5 -0
- data/features/step_definitions/vswitch_steps.rb +17 -0
- data/features/support/env.rb +3 -3
- data/features/support/hooks.rb +23 -15
- data/lib/phut.rb +3 -0
- data/lib/phut/finder.rb +19 -0
- data/lib/phut/link.rb +84 -0
- data/lib/phut/netns.rb +111 -22
- data/lib/phut/open_vswitch.rb +98 -96
- data/lib/phut/parser.rb +39 -8
- data/lib/phut/raw_socket.rb +4 -0
- data/lib/phut/route.rb +34 -0
- data/lib/phut/setting.rb +21 -4
- data/lib/phut/shell_runner.rb +13 -2
- data/lib/phut/syntax.rb +31 -14
- data/lib/phut/syntax/directive.rb +9 -1
- data/lib/phut/syntax/netns_directive.rb +13 -2
- data/lib/phut/syntax/vhost_directive.rb +2 -0
- data/lib/phut/syntax/vswitch_directive.rb +3 -1
- data/lib/phut/version.rb +3 -1
- data/lib/phut/veth.rb +68 -0
- data/lib/phut/vhost.rb +99 -58
- data/lib/phut/vhost_daemon.rb +53 -11
- data/lib/phut/vsctl.rb +125 -0
- data/lib/phut/vswitch.rb +10 -0
- data/phut.gemspec +9 -31
- data/tasks/cucumber.rake +5 -1
- data/tasks/flay.rake +2 -0
- data/tasks/flog.rake +3 -1
- data/tasks/gem.rake +2 -0
- data/tasks/minitest.rake +7 -0
- data/tasks/reek.rake +2 -0
- data/tasks/rubocop.rake +2 -0
- data/tasks/yard.rake +2 -0
- data/test/phut/link_test.rb +85 -0
- data/test/phut/netns_test.rb +58 -0
- data/test/phut/open_vswitch_test.rb +125 -0
- data/test/phut/veth_test.rb +48 -0
- data/test/phut/vhost_test.rb +56 -0
- metadata +41 -287
- data/.rspec +0 -3
- data/Guardfile +0 -29
- data/features/dsl_vhost.feature +0 -37
- data/features/phut_kill.feature +0 -27
- data/features/shell.feature +0 -39
- data/lib/phut/configuration.rb +0 -92
- data/lib/phut/null_logger.rb +0 -14
- data/lib/phut/virtual_link.rb +0 -109
- data/spec/phut/parser_spec.rb +0 -66
- data/spec/phut_spec.rb +0 -45
- data/spec/spec_helper.rb +0 -14
- data/tasks/LICENSE +0 -675
- data/tasks/relish.rake +0 -8
- data/tasks/rspec.rake +0 -8
data/lib/phut/syntax.rb
CHANGED
@@ -1,36 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'phut/link'
|
1
4
|
require 'phut/netns'
|
2
5
|
require 'phut/syntax/netns_directive'
|
3
6
|
require 'phut/syntax/vhost_directive'
|
4
7
|
require 'phut/syntax/vswitch_directive'
|
5
8
|
require 'phut/vhost'
|
6
|
-
require 'phut/virtual_link'
|
7
9
|
|
8
10
|
module Phut
|
9
11
|
# DSL syntax definitions.
|
10
12
|
class Syntax
|
11
|
-
def initialize(
|
12
|
-
@
|
13
|
-
@logger = logger
|
13
|
+
def initialize(netns)
|
14
|
+
@netns = netns
|
14
15
|
end
|
15
16
|
|
17
|
+
# rubocop:disable MethodLength
|
18
|
+
# rubocop:disable LineLength
|
16
19
|
def vswitch(alias_name = nil, &block)
|
17
20
|
attrs = VswitchDirective.new(alias_name, &block)
|
18
|
-
|
21
|
+
openflow_version = case Pio::OpenFlow.version
|
22
|
+
when :OpenFlow10
|
23
|
+
1.0
|
24
|
+
when :OpenFlow13
|
25
|
+
1.3
|
26
|
+
else
|
27
|
+
raise "Unknown OpenFlow version: #{Pio::OpenFlow.version}"
|
28
|
+
end
|
29
|
+
Vswitch.create(dpid: attrs[:dpid],
|
30
|
+
name: attrs[:name],
|
31
|
+
tcp_port: attrs[:port],
|
32
|
+
openflow_version: openflow_version)
|
19
33
|
end
|
34
|
+
# rubocop:enable MethodLength
|
35
|
+
# rubocop:enable LineLength
|
20
36
|
|
21
|
-
def vhost(
|
22
|
-
attrs = VhostDirective.new(
|
23
|
-
Vhost.create(
|
24
|
-
|
37
|
+
def vhost(name = nil, &block)
|
38
|
+
attrs = VhostDirective.new(name, &block)
|
39
|
+
Vhost.create(name: attrs[:name],
|
40
|
+
ip_address: attrs[:ip],
|
41
|
+
mac_address: attrs[:mac],
|
42
|
+
promisc: attrs[:promisc])
|
25
43
|
end
|
26
44
|
|
27
|
-
def
|
28
|
-
|
29
|
-
Netns.create(attrs, attrs[:name], @logger)
|
45
|
+
def link(name_a, name_b)
|
46
|
+
Link.create(name_a, name_b)
|
30
47
|
end
|
31
48
|
|
32
|
-
def
|
33
|
-
|
49
|
+
def netns(name, &block)
|
50
|
+
@netns << NetnsDirective.new(name, &block)
|
34
51
|
end
|
35
52
|
end
|
36
53
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Phut
|
2
4
|
class Syntax
|
3
5
|
# Common DSL directive
|
@@ -9,8 +11,14 @@ module Phut
|
|
9
11
|
end
|
10
12
|
|
11
13
|
def [](key)
|
12
|
-
@attributes
|
14
|
+
@attributes[key]
|
15
|
+
end
|
16
|
+
|
17
|
+
# rubocop:disable MethodMissing
|
18
|
+
def method_missing(name)
|
19
|
+
@attributes.fetch name.to_sym
|
13
20
|
end
|
21
|
+
# rubocop:enable MethodMissing
|
14
22
|
end
|
15
23
|
end
|
16
24
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'phut/syntax/directive'
|
2
4
|
|
3
5
|
module Phut
|
@@ -7,8 +9,9 @@ module Phut
|
|
7
9
|
attribute :netmask
|
8
10
|
|
9
11
|
def initialize(alias_name, &block)
|
10
|
-
@attributes = { name: alias_name
|
11
|
-
|
12
|
+
@attributes = { name: alias_name,
|
13
|
+
netmask: '255.255.255.255' }
|
14
|
+
instance_eval(&block) if block
|
12
15
|
end
|
13
16
|
|
14
17
|
def ip(value)
|
@@ -20,6 +23,14 @@ module Phut
|
|
20
23
|
@attributes[:net] = options.fetch(:net)
|
21
24
|
@attributes[:gateway] = options.fetch(:gateway)
|
22
25
|
end
|
26
|
+
|
27
|
+
def mac(value)
|
28
|
+
@attributes[:mac_address] = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def vlan(value)
|
32
|
+
@attributes[:vlan] = value
|
33
|
+
end
|
23
34
|
end
|
24
35
|
end
|
25
36
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'phut/syntax/directive'
|
2
4
|
|
3
5
|
module Phut
|
@@ -20,7 +22,7 @@ module Phut
|
|
20
22
|
@attributes[:dpid] = dpid
|
21
23
|
@attributes[:name] ||= format('%#x', @attributes[:dpid])
|
22
24
|
end
|
23
|
-
|
25
|
+
alias datapath_id dpid
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
data/lib/phut/version.rb
CHANGED
data/lib/phut/veth.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'English'
|
4
|
+
require 'ipaddr'
|
5
|
+
require 'phut/shell_runner'
|
6
|
+
|
7
|
+
module Phut
|
8
|
+
# Virtual eth device
|
9
|
+
class Veth
|
10
|
+
PREFIX = 'L'
|
11
|
+
|
12
|
+
extend ShellRunner
|
13
|
+
|
14
|
+
# rubocop:disable Metrics/AbcSize
|
15
|
+
def self.all
|
16
|
+
link_devices = sh('ip link show').split("\n").map do |each|
|
17
|
+
case each
|
18
|
+
when /^\d+: #{PREFIX}(\d+)_(\h{8})[@:]/
|
19
|
+
ip_addr = IPAddr.new($LAST_MATCH_INFO[2].hex, Socket::AF_INET)
|
20
|
+
new(name: ip_addr, link_id: $LAST_MATCH_INFO[1].to_i)
|
21
|
+
when /^\d+: #{PREFIX}(\d+)_([^:]*?)[@:]/
|
22
|
+
new(name: $LAST_MATCH_INFO[2], link_id: $LAST_MATCH_INFO[1].to_i)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
(Netns.all.map(&:device) + link_devices).compact
|
26
|
+
end
|
27
|
+
# rubocop:enable Metrics/AbcSize
|
28
|
+
|
29
|
+
attr_reader :link_id
|
30
|
+
|
31
|
+
def initialize(name:, link_id:)
|
32
|
+
@name = valid_ipaddress?(name) ? IPAddr.new(name, Socket::AF_INET) : name
|
33
|
+
@link_id = link_id
|
34
|
+
end
|
35
|
+
|
36
|
+
def name
|
37
|
+
@name.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def device
|
41
|
+
if @name.is_a?(IPAddr)
|
42
|
+
hex = format('%x', @name.to_i)
|
43
|
+
"#{PREFIX}#{@link_id}_#{hex}"
|
44
|
+
else
|
45
|
+
"#{PREFIX}#{@link_id}_#{@name}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
alias to_s device
|
49
|
+
alias to_str device
|
50
|
+
|
51
|
+
def ==(other)
|
52
|
+
name == other.name && link_id == other.link_id
|
53
|
+
end
|
54
|
+
|
55
|
+
def <=>(other)
|
56
|
+
device <=> other.device
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def valid_ipaddress?(string)
|
62
|
+
IPAddr.new(string, Socket::AF_INET)
|
63
|
+
true
|
64
|
+
rescue
|
65
|
+
false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/phut/vhost.rb
CHANGED
@@ -1,102 +1,143 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'phut/finder'
|
3
4
|
require 'phut/setting'
|
4
5
|
require 'phut/shell_runner'
|
5
|
-
require '
|
6
|
+
require 'phut/vhost_daemon'
|
6
7
|
|
7
8
|
module Phut
|
8
|
-
#
|
9
|
+
# Virtual host for NetTester
|
10
|
+
# rubocop:disable ClassLength
|
9
11
|
class Vhost
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
extend Finder
|
13
|
+
|
14
|
+
attr_reader :ip_address
|
15
|
+
attr_reader :mac_address
|
16
|
+
|
17
|
+
def self.all
|
18
|
+
Dir.glob(File.join(Phut.socket_dir, 'vhost.*.ctl')).map do |each|
|
19
|
+
vhost = DRbObject.new_with_uri("drbunix:#{each}")
|
20
|
+
new(name: vhost.name,
|
21
|
+
ip_address: vhost.ip_address,
|
22
|
+
mac_address: vhost.mac_address,
|
23
|
+
device: vhost.device)
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
21
|
-
|
22
|
-
|
23
|
-
queries.inject(all) do |memo, (attr, value)|
|
24
|
-
memo.find_all { |vhost| vhost.__send__(attr) == value }
|
25
|
-
end.first
|
27
|
+
def self.create(*args)
|
28
|
+
new(*args).tap(&:start)
|
26
29
|
end
|
27
30
|
|
28
|
-
def self.
|
29
|
-
|
31
|
+
def self.destroy_all
|
32
|
+
::Dir.glob(File.join(Phut.socket_dir, 'vhost.*.ctl')).each do |each|
|
33
|
+
/vhost\.(\S+)\.ctl/=~ each
|
34
|
+
VhostDaemon.process(Regexp.last_match(1), Phut.socket_dir).kill
|
35
|
+
end
|
30
36
|
end
|
31
37
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
def self.connect_link
|
39
|
+
all.each do |each|
|
40
|
+
Link.all.each do |link|
|
41
|
+
device = link.device(each.name)
|
42
|
+
each.device = device if device
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
37
46
|
|
38
|
-
|
39
|
-
|
40
|
-
|
47
|
+
# rubocop:disable ParameterLists
|
48
|
+
def initialize(name:, ip_address:, mac_address:,
|
49
|
+
device: nil, promisc: false, arp_entries: nil)
|
41
50
|
@name = name
|
51
|
+
@ip_address = ip_address
|
42
52
|
@mac_address = mac_address
|
43
|
-
@
|
53
|
+
@device = device
|
54
|
+
@promisc = promisc
|
55
|
+
@arp_entries = arp_entries
|
44
56
|
end
|
57
|
+
# rubocop:enable ParameterLists
|
58
|
+
|
59
|
+
include ShellRunner
|
45
60
|
|
46
61
|
def name
|
47
62
|
@name || @ip_address
|
48
63
|
end
|
49
64
|
|
50
|
-
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
def run(all_hosts = Vhost.all)
|
55
|
-
@all_hosts ||= all_hosts
|
65
|
+
# rubocop:disable LineLength
|
66
|
+
def start
|
56
67
|
if ENV['rvm_path']
|
57
68
|
sh "rvmsudo vhost run #{run_options}"
|
58
69
|
else
|
59
|
-
vhost = File.
|
60
|
-
sh "bundle exec sudo #{vhost} run #{run_options}"
|
70
|
+
vhost = File.expand_path('../../bin/vhost', __dir__)
|
71
|
+
sh "bundle exec sudo env PATH=#{ENV['PATH']} #{vhost} run #{run_options}"
|
61
72
|
end
|
73
|
+
sleep 1
|
74
|
+
self.device = @device if @device
|
75
|
+
end
|
76
|
+
alias run start
|
77
|
+
# rubocop:enable LineLength
|
78
|
+
|
79
|
+
def running?
|
80
|
+
VhostDaemon.process(name, Phut.socket_dir).running?
|
62
81
|
end
|
63
82
|
|
64
83
|
def stop
|
65
|
-
|
66
|
-
stop!
|
84
|
+
VhostDaemon.process(name, Phut.socket_dir).stop
|
67
85
|
end
|
68
86
|
|
69
|
-
def
|
70
|
-
|
71
|
-
|
87
|
+
def kill
|
88
|
+
sh "bundle exec vhost stop -n #{name} -S #{Phut.socket_dir}"
|
89
|
+
sleep 1
|
72
90
|
end
|
73
91
|
|
74
|
-
def
|
75
|
-
|
92
|
+
def device
|
93
|
+
VhostDaemon.process(name, Phut.socket_dir).device
|
94
|
+
end
|
95
|
+
|
96
|
+
def device=(device_name)
|
97
|
+
VhostDaemon.process(name, Phut.socket_dir).device = device_name
|
98
|
+
end
|
99
|
+
|
100
|
+
def send_packet(destination)
|
101
|
+
VhostDaemon.process(name, Phut.socket_dir).send_packets(destination, 1)
|
102
|
+
end
|
103
|
+
|
104
|
+
def packets_sent_to(dest)
|
105
|
+
VhostDaemon.process(name, Phut.socket_dir).stats[:tx].select do |each|
|
106
|
+
(each[:destination_mac].to_s == dest.mac_address) &&
|
107
|
+
(each[:destination_ip_address].to_s == dest.ip_address)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def packets_received_from(source)
|
112
|
+
VhostDaemon.process(name, Phut.socket_dir).stats[:rx].select do |each|
|
113
|
+
(each[:source_mac].to_s == source.mac_address) &&
|
114
|
+
(each[:source_ip_address].to_s == source.ip_address)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def set_default_arp_table
|
119
|
+
arp_table = Vhost.all.each_with_object({}) do |each, hash|
|
120
|
+
hash[each.ip_address] = each.mac_address
|
121
|
+
end
|
122
|
+
VhostDaemon.process(name, Phut.socket_dir).arp_table = arp_table
|
123
|
+
end
|
124
|
+
|
125
|
+
def to_s
|
126
|
+
"vhost (name = #{name}, IP address = #{@ip_address})"
|
76
127
|
end
|
77
128
|
|
78
129
|
private
|
79
130
|
|
80
131
|
def run_options
|
81
132
|
["-n #{name}",
|
82
|
-
"-
|
83
|
-
"-
|
84
|
-
"-
|
85
|
-
"-a #{arp_entries}",
|
133
|
+
"-i #{ip_address}",
|
134
|
+
"-m #{mac_address}",
|
135
|
+
@arp_entries ? "-a #{@arp_entries}" : nil,
|
86
136
|
@promisc ? '--promisc' : nil,
|
87
|
-
"-P #{Phut.pid_dir}",
|
88
137
|
"-L #{Phut.log_dir}",
|
138
|
+
"-P #{Phut.pid_dir}",
|
89
139
|
"-S #{Phut.socket_dir}"].compact.join(' ')
|
90
140
|
end
|
91
|
-
|
92
|
-
def arp_entries
|
93
|
-
@all_hosts.map do |each|
|
94
|
-
"#{each.ip_address}/#{each.mac_address}"
|
95
|
-
end.join(',')
|
96
|
-
end
|
97
|
-
|
98
|
-
def pid_file
|
99
|
-
"#{Phut.pid_dir}/vhost.#{name}.pid"
|
100
|
-
end
|
101
141
|
end
|
142
|
+
# rubocop:enable ClassLength
|
102
143
|
end
|
data/lib/phut/vhost_daemon.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'drb'
|
2
4
|
require 'logger'
|
3
5
|
require 'phut/raw_socket'
|
@@ -16,22 +18,55 @@ module Phut
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def initialize(options)
|
19
|
-
@options = options
|
21
|
+
@options = options.dup
|
22
|
+
@options[:device] = @options.fetch(:interface)
|
23
|
+
@options[:log_dir] = File.expand_path(@options[:log_dir])
|
24
|
+
@options[:pid_dir] = File.expand_path(@options[:pid_dir])
|
25
|
+
@options[:socket_dir] = File.expand_path(@options[:socket_dir])
|
20
26
|
reset_stats
|
21
27
|
end
|
22
28
|
|
29
|
+
def name
|
30
|
+
@options.fetch :name
|
31
|
+
end
|
32
|
+
|
33
|
+
def ip_address
|
34
|
+
@options.fetch :ip_address
|
35
|
+
end
|
36
|
+
|
37
|
+
def mac_address
|
38
|
+
@options.fetch :mac_address
|
39
|
+
end
|
40
|
+
|
41
|
+
def device
|
42
|
+
@options[:device]
|
43
|
+
end
|
44
|
+
|
45
|
+
def device=(name)
|
46
|
+
@options[:device] = name
|
47
|
+
end
|
48
|
+
|
23
49
|
def run
|
24
50
|
start_logging
|
25
51
|
create_pid_file
|
26
52
|
start_daemon
|
53
|
+
@stop = false
|
27
54
|
rescue
|
28
55
|
shutdown
|
29
56
|
end
|
30
57
|
|
58
|
+
def running?
|
59
|
+
FileTest.exists?(pid_file)
|
60
|
+
end
|
61
|
+
|
31
62
|
def stop
|
32
63
|
@stop = true
|
33
64
|
end
|
34
65
|
|
66
|
+
def kill
|
67
|
+
@kill = true
|
68
|
+
end
|
69
|
+
|
35
70
|
def send_packets(dest, npackets)
|
36
71
|
return unless lookup_arp_table(dest.ip_address)
|
37
72
|
udp = create_udp_packet(dest)
|
@@ -50,19 +85,23 @@ module Phut
|
|
50
85
|
@packets_received = []
|
51
86
|
end
|
52
87
|
|
88
|
+
def arp_table=(arp_table)
|
89
|
+
@options[:arp_table] = arp_table
|
90
|
+
end
|
91
|
+
|
53
92
|
private
|
54
93
|
|
55
94
|
def start_logging
|
56
95
|
@logger = Logger.new(File.open(log_file, 'a'))
|
57
96
|
@logger.info("#{@options.fetch(:name)} started " \
|
58
|
-
"(interface = #{@options.fetch(:
|
97
|
+
"(interface = #{@options.fetch(:device)}," \
|
59
98
|
" IP address = #{@options.fetch(:ip_address)}," \
|
60
99
|
" MAC address = #{@options.fetch(:mac_address)}," \
|
61
100
|
" arp_entries = #{@options.fetch(:arp_entries)})")
|
62
101
|
end
|
63
102
|
|
64
103
|
def raw_socket
|
65
|
-
@raw_socket ||= RawSocket.new(@options.fetch(:
|
104
|
+
@raw_socket ||= RawSocket.new(@options.fetch(:device))
|
66
105
|
end
|
67
106
|
|
68
107
|
def lookup_arp_table(ip_address)
|
@@ -89,11 +128,17 @@ module Phut
|
|
89
128
|
end
|
90
129
|
|
91
130
|
# rubocop:disable MethodLength
|
131
|
+
# rubocop:disable AbcSize
|
92
132
|
def read_loop
|
93
133
|
loop do
|
134
|
+
unless @options.fetch(:device)
|
135
|
+
sleep 0.1
|
136
|
+
next
|
137
|
+
end
|
94
138
|
begin
|
95
139
|
raw_data, = raw_socket.recvfrom(8192)
|
96
140
|
udp = Pio::Udp.read(raw_data)
|
141
|
+
next if @stop
|
97
142
|
unless @options[:promisc]
|
98
143
|
next if udp.destination_ip_address != @options.fetch(:ip_address)
|
99
144
|
end
|
@@ -106,6 +151,7 @@ module Phut
|
|
106
151
|
end
|
107
152
|
end
|
108
153
|
# rubocop:enable MethodLength
|
154
|
+
# rubocop:enable AbcSize
|
109
155
|
|
110
156
|
def start_daemon
|
111
157
|
Process.daemon
|
@@ -118,7 +164,7 @@ module Phut
|
|
118
164
|
unix_domain_socket =
|
119
165
|
self.class.unix_domain_socket(@options.fetch(:name),
|
120
166
|
@options.fetch(:socket_dir))
|
121
|
-
DRb.start_service(unix_domain_socket, self, UNIXFileMode:
|
167
|
+
DRb.start_service(unix_domain_socket, self, UNIXFileMode: 0o666)
|
122
168
|
Thread.start { read_loop }.abort_on_exception = true
|
123
169
|
DRb.thread.join
|
124
170
|
end
|
@@ -128,7 +174,7 @@ module Phut
|
|
128
174
|
@logger.info 'Shutting down...'
|
129
175
|
FileUtils.rm pid_file if running?
|
130
176
|
DRb.stop_service
|
131
|
-
|
177
|
+
raise $ERROR_INFO if $ERROR_INFO
|
132
178
|
end
|
133
179
|
|
134
180
|
def trap_sigint
|
@@ -138,14 +184,14 @@ module Phut
|
|
138
184
|
|
139
185
|
def shutdown_loop
|
140
186
|
loop do
|
141
|
-
break if @
|
187
|
+
break if @kill
|
142
188
|
sleep 0.1
|
143
189
|
end
|
144
190
|
shutdown
|
145
191
|
end
|
146
192
|
|
147
193
|
def create_pid_file
|
148
|
-
|
194
|
+
raise "#{@options.fetch(:name)} is already running." if running?
|
149
195
|
update_pid_file
|
150
196
|
end
|
151
197
|
|
@@ -153,10 +199,6 @@ module Phut
|
|
153
199
|
File.open(pid_file, 'w') { |file| file << Process.pid }
|
154
200
|
end
|
155
201
|
|
156
|
-
def running?
|
157
|
-
FileTest.exists?(pid_file)
|
158
|
-
end
|
159
|
-
|
160
202
|
def pid_file
|
161
203
|
File.join @options.fetch(:pid_dir), "vhost.#{@options.fetch(:name)}.pid"
|
162
204
|
end
|