landrush 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +12 -178
  3. data/.travis.yml +6 -1
  4. data/CHANGELOG.md +18 -1
  5. data/CONTRIBUTING.adoc +112 -0
  6. data/Gemfile +6 -9
  7. data/Guardfile +10 -0
  8. data/README.adoc +100 -0
  9. data/Rakefile +14 -2
  10. data/appveyor.yml +20 -0
  11. data/doc/Development.adoc +112 -0
  12. data/doc/ProxyMobile.adoc +66 -0
  13. data/doc/Troubleshooting.adoc +42 -0
  14. data/doc/Usage.adoc +271 -0
  15. data/features/commands.feature +35 -0
  16. data/features/dns_resolution.feature +6 -5
  17. data/features/{landrush-ip.feature → landrush_ip.feature} +0 -0
  18. data/features/step_definitions/landrush_custom_steps.rb +48 -0
  19. data/features/support/env.rb +25 -1
  20. data/landrush.gemspec +3 -3
  21. data/lib/landrush/action/common.rb +3 -11
  22. data/lib/landrush/action/install_prerequisites.rb +2 -3
  23. data/lib/landrush/action/redirect_dns.rb +1 -1
  24. data/lib/landrush/action/setup.rb +25 -30
  25. data/lib/landrush/action/teardown.rb +8 -11
  26. data/lib/landrush/cap/guest/all/read_host_visible_ip_address.rb +28 -4
  27. data/lib/landrush/cap/guest/linux/add_iptables_rule.rb +1 -1
  28. data/lib/landrush/cap/guest/linux/redirect_dns.rb +2 -2
  29. data/lib/landrush/cap/guest/suse/add_iptables_rule.rb +20 -0
  30. data/lib/landrush/cap/guest/suse/install_iptables.rb +14 -0
  31. data/lib/landrush/cap/guest/suse/iptables_installed.rb +11 -0
  32. data/lib/landrush/cap/host/suse/dnsmasq_installed.rb +11 -0
  33. data/lib/landrush/cap/host/suse/install_dnsmasq.rb +14 -0
  34. data/lib/landrush/cap/host/suse/restart_dnsmasq.rb +21 -0
  35. data/lib/landrush/cap/host/windows/configure_visibility_on_host.rb +1 -1
  36. data/lib/landrush/command.rb +42 -17
  37. data/lib/landrush/config.rb +29 -14
  38. data/lib/landrush/plugin.rb +30 -0
  39. data/lib/landrush/server.rb +96 -138
  40. data/lib/landrush/start_server.rb +11 -0
  41. data/lib/landrush/store.rb +6 -2
  42. data/lib/landrush/util/path.rb +32 -0
  43. data/lib/landrush/util/process_helper.rb +46 -0
  44. data/lib/landrush/util/retry.rb +2 -2
  45. data/lib/landrush/version.rb +1 -1
  46. data/test/landrush/action/setup_test.rb +19 -25
  47. data/test/landrush/action/teardown_test.rb +18 -15
  48. data/test/landrush/cap/guest/all/read_host_visible_ip_address_test.rb +35 -1
  49. data/test/landrush/cap/guest/linux/configured_dns_servers_test.rb +8 -8
  50. data/test/landrush/cap/guest/linux/redirect_dns_test.rb +4 -4
  51. data/test/landrush/config_test.rb +23 -2
  52. data/test/landrush/dependent_vms_test.rb +5 -5
  53. data/test/landrush/issues/255.rb +115 -0
  54. data/test/landrush/server_test.rb +22 -4
  55. data/test/landrush/store_test.rb +28 -13
  56. data/test/support/test_server_daemon.rb +2 -4
  57. data/test/test_helper.rb +37 -14
  58. metadata +30 -15
  59. data/CONTRIBUTING.md +0 -103
  60. data/NOTES.md +0 -28
  61. data/README.md +0 -406
  62. data/doc/proxy-mobile/README.md +0 -50
  63. data/features/step_definitions/dns.rb +0 -19
  64. data/features/step_definitions/ip.rb +0 -13
@@ -0,0 +1,14 @@
1
+ module Landrush
2
+ module Cap
3
+ module Suse
4
+ module InstallIptables
5
+ def self.install_iptables(machine)
6
+ machine.communicate.tap do |c|
7
+ c.sudo('zypper -q clean')
8
+ c.sudo('zypper -n -q install iptables')
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Landrush
2
+ module Cap
3
+ module Suse
4
+ module IptablesInstalled
5
+ def self.iptables_installed(machine)
6
+ machine.communicate.test('rpm -qa | grep iptables')
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Landrush
2
+ module Cap
3
+ module Suse
4
+ module DnsmasqInstalled
5
+ def self.dnsmasq_installed(_env, *_args)
6
+ system('rpm -qa | grep dnsmasq > /dev/null 2>&1')
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module Landrush
2
+ module Cap
3
+ module Suse
4
+ module InstallDnsmasq
5
+ class << self
6
+ def install_dnsmasq(_env)
7
+ system('sudo zypper -q clean > /dev/null 2>&1')
8
+ system('sudo zypper -n -q install dnsmasq > /dev/null 2>&1')
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ module Landrush
2
+ module Cap
3
+ module Suse
4
+ module RestartDnsmasq
5
+ class << self
6
+ SED_COMMAND = <<-EOF.gsub(/^ +/, '')
7
+ sudo sed -i.orig '1 i\
8
+ # Added by landrush, a vagrant plugin \\
9
+ nameserver 127.0.0.1 \\
10
+ ' /etc/resolv.conf
11
+ EOF
12
+
13
+ def restart_dnsmasq(_env)
14
+ system(SED_COMMAND) unless system("cat /etc/resolv.conf | grep 'nameserver 127.0.0.1' > /dev/null 2>&1")
15
+ system('sudo systemctl restart dnsmasq')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -180,6 +180,6 @@ end
180
180
 
181
181
  # Only run the following code when this file is the main file being run
182
182
  # instead of having been required or loaded by another file
183
- if __FILE__ == $0
183
+ if __FILE__ == $PROGRAM_NAME
184
184
  Landrush::Cap::Windows::ConfigureVisibilityOnHost.configure_visibility_on_host(nil, ARGV[0], ARGV[1])
185
185
  end
@@ -3,33 +3,27 @@ module Landrush
3
3
  DAEMON_COMMANDS = %w(start stop restart status).freeze
4
4
 
5
5
  def self.synopsis
6
- "manages DNS for both guest and host"
6
+ 'manages DNS for both guest and host'
7
7
  end
8
8
 
9
9
  def execute
10
10
  # Make sure we use the right data directory for Landrush
11
11
  Server.working_dir = File.join(@env.data_dir, 'landrush')
12
+ Server.gems_dir = File.join(@env.gems_path, 'gems')
13
+ Server.ui = @env.ui
12
14
 
13
15
  ARGV.shift # flush landrush from ARGV
14
16
  command = ARGV.first || 'help'
15
17
  if DAEMON_COMMANDS.include?(command)
16
18
  Server.send(command)
17
19
  elsif command == 'dependentvms' || command == 'vms'
18
- if DependentVMs.any?
19
- @env.ui.info(DependentVMs.list.map { |dvm| " - #{dvm}" }.join("\n"))
20
- else
21
- @env.ui.info("No dependent VMs")
22
- end
20
+ dependent_vms
23
21
  elsif command == 'ls' || command == 'list'
24
- Landrush::Store.hosts.each do |key, value|
25
- printf "%-30s %s\n", key, value
26
- end
22
+ store_ls
27
23
  elsif command == 'set'
28
- host, ip = ARGV[1, 2]
29
- Landrush::Store.hosts.set(host, ip)
24
+ store_set
30
25
  elsif command == 'del' || command == 'rm'
31
- key = ARGV[1]
32
- Landrush::Store.hosts.delete(key)
26
+ store_del
33
27
  elsif command == 'help'
34
28
  @env.ui.info(help)
35
29
  else
@@ -40,7 +34,7 @@ module Landrush
40
34
  end
41
35
 
42
36
  def boom(msg)
43
- raise Vagrant::Errors::CLIInvalidOptions, :help => usage(msg)
37
+ raise Vagrant::Errors::CLIInvalidOptions, help: usage(msg)
44
38
  end
45
39
 
46
40
  def usage(msg); <<-EOS.gsub(/^ /, '')
@@ -62,12 +56,43 @@ module Landrush
62
56
  list vms currently dependent on the landrush server
63
57
  set { <host> <ip> | <alias> <host> }
64
58
  adds the given host-to-ip or alias-to-hostname mapping.
65
- existing host ip addresses will be overwritten
66
- rm, del { <host> | <alias> }
67
- delete the given hostname or alias from the server
59
+ Existing host ip addresses will be overwritten
60
+ rm, del { <host> | <alias> | --all }
61
+ delete the given hostname or alias from the server.
62
+ --all removes all entries
68
63
  help
69
64
  you're lookin at it!
70
65
  EOS
71
66
  end
67
+
68
+ private
69
+
70
+ def dependent_vms
71
+ if DependentVMs.any?
72
+ @env.ui.info(DependentVMs.list.map { |dvm| " - #{dvm}" }.join("\n"))
73
+ else
74
+ @env.ui.info('No dependent VMs')
75
+ end
76
+ end
77
+
78
+ def store_del
79
+ key = ARGV[1]
80
+ if key == '--all'
81
+ Landrush::Store.hosts.clear!
82
+ else
83
+ Landrush::Store.hosts.delete(key)
84
+ end
85
+ end
86
+
87
+ def store_set
88
+ host, ip = ARGV[1, 2]
89
+ Landrush::Store.hosts.set(host, ip)
90
+ end
91
+
92
+ def store_ls
93
+ Landrush::Store.hosts.each do |key, value|
94
+ printf "%-30s %s\n", key, value
95
+ end
96
+ end
72
97
  end
73
98
  end
@@ -7,18 +7,23 @@ module Landrush
7
7
  attr_accessor :host_ip_address
8
8
  attr_accessor :guest_redirect_dns
9
9
  attr_accessor :host_interface
10
+ attr_accessor :host_interface_class
10
11
  attr_accessor :host_interface_excludes
11
12
  attr_accessor :host_redirect_dns
12
13
 
14
+ INTERFACE_CLASSES = [:any, :ipv4, :ipv6].freeze
15
+ INTERFACE_CLASS_INVALID = "Invalid interface class, should be one of: #{INTERFACE_CLASSES.join(', ')}".freeze
16
+
13
17
  DEFAULTS = {
14
- :enabled => false,
15
- :tld => 'vagrant.test',
16
- :upstream_servers => [[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]],
17
- :host_ip_address => nil,
18
- :guest_redirect_dns => true,
19
- :host_interface => nil,
20
- :host_interface_excludes => [/lo[0-9]*/, /docker[0-9]+/, /tun[0-9]+/],
21
- :host_redirect_dns => true
18
+ enabled: false,
19
+ tld: 'vagrant.test',
20
+ upstream_servers: [[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]],
21
+ host_ip_address: nil,
22
+ guest_redirect_dns: true,
23
+ host_interface: nil,
24
+ host_interface_excludes: [/lo[0-9]*/, /docker[0-9]+/, /tun[0-9]+/],
25
+ host_interface_class: :ipv4,
26
+ host_redirect_dns: true
22
27
  }.freeze
23
28
 
24
29
  def initialize
@@ -30,6 +35,7 @@ module Landrush
30
35
  @guest_redirect_dns = UNSET_VALUE
31
36
  @host_interface = UNSET_VALUE
32
37
  @host_interface_excludes = UNSET_VALUE
38
+ @host_interface_class = UNSET_VALUE
33
39
  @host_redirect_dns = UNSET_VALUE
34
40
  end
35
41
 
@@ -53,14 +59,12 @@ module Landrush
53
59
  @host_redirect_dns
54
60
  end
55
61
 
56
- def host(hostname, ip_address=nil)
62
+ def host(hostname, ip_address = nil)
57
63
  @hosts[hostname] = ip_address
58
64
  end
59
65
 
60
- def upstream(ip, port=53, protocol=nil)
61
- if @upstream_servers == UNSET_VALUE
62
- @upstream_servers = []
63
- end
66
+ def upstream(ip, port = 53, protocol = nil)
67
+ @upstream_servers = [] if @upstream_servers == UNSET_VALUE
64
68
 
65
69
  if !protocol
66
70
  @upstream_servers.push [:udp, ip, port]
@@ -84,9 +88,20 @@ module Landrush
84
88
  end
85
89
  end
86
90
 
87
- def validate(machine)
91
+ def validate(_machine)
88
92
  errors = _detected_errors
93
+ errors.concat validate_host_interface_class
94
+
89
95
  { 'landrush' => errors }
90
96
  end
97
+
98
+ def validate_host_interface_class
99
+ @host_interface_class = @host_interface_class.intern if @host_interface_class.is_a? String
100
+
101
+ return [] if INTERFACE_CLASSES.include? @host_interface_class
102
+
103
+ # TODO: Should really be using I18n; makes testing a lot cleaner too.
104
+ [INTERFACE_CLASS_INVALID, fields: 'host_interface_class']
105
+ end
91
106
  end
92
107
  end
@@ -87,6 +87,21 @@ module Landrush
87
87
  Cap::Redhat::InstallIptables
88
88
  end
89
89
 
90
+ guest_capability('suse', 'add_iptables_rule') do
91
+ require_relative 'cap/guest/suse/add_iptables_rule'
92
+ Cap::Suse::AddIptablesRule
93
+ end
94
+
95
+ guest_capability('suse', 'iptables_installed') do
96
+ require_relative 'cap/guest/suse/iptables_installed'
97
+ Cap::Suse::IptablesInstalled
98
+ end
99
+
100
+ guest_capability('suse', 'install_iptables') do
101
+ require_relative 'cap/guest/suse/install_iptables'
102
+ Cap::Suse::InstallIptables
103
+ end
104
+
90
105
  guest_capability('linux', 'configured_dns_servers') do
91
106
  require_relative 'cap/guest/linux/configured_dns_servers'
92
107
  Cap::Linux::ConfiguredDnsServers
@@ -166,5 +181,20 @@ module Landrush
166
181
  require_relative 'cap/host/redhat/restart_dnsmasq'
167
182
  Cap::Redhat::RestartDnsmasq
168
183
  end
184
+
185
+ host_capability('suse', 'dnsmasq_installed') do
186
+ require_relative 'cap/host/suse/dnsmasq_installed'
187
+ Cap::Suse::DnsmasqInstalled
188
+ end
189
+
190
+ host_capability('suse', 'install_dnsmasq') do
191
+ require_relative 'cap/host/suse/install_dnsmasq'
192
+ Cap::Suse::InstallDnsmasq
193
+ end
194
+
195
+ host_capability('suse', 'restart_dnsmasq') do
196
+ require_relative 'cap/host/suse/restart_dnsmasq'
197
+ Cap::Suse::RestartDnsmasq
198
+ end
169
199
  end
170
200
  end
@@ -1,29 +1,56 @@
1
1
  require 'rubydns'
2
2
  require 'ipaddr'
3
- require 'vagrant/util/platform'
4
-
3
+ require 'win32/process' unless (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM).nil? # only require on Windows
5
4
  require_relative 'store'
5
+ require_relative 'util/path'
6
+ require_relative 'util/process_helper'
6
7
 
7
8
  module Landrush
8
9
  class Server
10
+ extend Landrush::Util::ProcessHelper
11
+
9
12
  Name = Resolv::DNS::Name
10
13
  IN = Resolv::DNS::Resource::IN
11
14
 
12
- def self.working_dir
13
- # TODO, https://github.com/vagrant-landrush/landrush/issues/178
14
- # Due to the fact that the whole server is just a bunch of static methods,
15
- # there is no initalize method to ensure that the working directory is
16
- # set prior to making calls to this method. Things work, since at the appropriate
17
- # Vagrant plugin integrtion points (e.g. setup.rb) we set the working dir based
18
- # on the enviroment passed to us.
19
- if @working_dir.nil?
20
- raise 'The Server\s working directory needs to be explicitly set prior to calling this method'
15
+ class << self
16
+ attr_reader :gems_dir
17
+
18
+ def gems_dir=(gems_dir)
19
+ @gems_dir = Pathname(gems_dir)
20
+ end
21
+
22
+ attr_reader :ui
23
+ attr_writer :ui
24
+
25
+ def working_dir
26
+ # TODO, https://github.com/vagrant-landrush/landrush/issues/178
27
+ # Due to the fact that the whole server is just a bunch of static methods,
28
+ # there is no initalize method to ensure that the working directory is
29
+ # set prior to making calls to this method. Things work, since at the appropriate
30
+ # Vagrant plugin integration points (e.g. setup.rb) we set the working dir based
31
+ # on the enviroment passed to us.
32
+ if @working_dir.nil?
33
+ raise 'The Server\s working directory needs to be explicitly set prior to calling this method'
34
+ end
35
+ @working_dir
21
36
  end
22
- @working_dir
23
- end
24
37
 
25
- def self.working_dir=(working_dir)
26
- @working_dir = Pathname(working_dir).tap(&:mkpath)
38
+ def working_dir=(working_dir)
39
+ @working_dir = Pathname(working_dir).tap(&:mkpath)
40
+ end
41
+
42
+ def port
43
+ @port unless @port.nil?
44
+ if (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM).nil?
45
+ # Default Landrush port for non Windows OS
46
+ 100_53
47
+ else
48
+ # On Windows we need to use the default DNS port, since there seems to be no way to configure it otherwise
49
+ 53
50
+ end
51
+ end
52
+
53
+ attr_writer :port
27
54
  end
28
55
 
29
56
  def self.log_directory
@@ -34,22 +61,9 @@ module Landrush
34
61
  File.join(log_directory, 'landrush.log')
35
62
  end
36
63
 
37
- def self.port
38
- if Vagrant::Util::Platform.windows?
39
- # On Windows we need to use the default DNS port, since there seems to be no way to configure it otherwise
40
- @port ||= 53
41
- else
42
- @port ||= 100_53
43
- end
44
- end
45
-
46
- def self.port=(port)
47
- @port = port
48
- end
49
-
50
64
  def self.upstream_servers
51
65
  # Doing collect to cast protocol to symbol because JSON store doesn't know about symbols
52
- @upstream_servers ||= Store.config.get('upstream').collect {|i| [i[0].to_sym, i[1], i[2]]}
66
+ @upstream_servers ||= Store.config.get('upstream').collect { |i| [i[0].to_sym, i[1], i[2]] }
53
67
  end
54
68
 
55
69
  def self.interfaces
@@ -65,7 +79,14 @@ module Landrush
65
79
 
66
80
  # Used to start the Landrush DNS server as a child process using ChildProcess gem
67
81
  def self.start
68
- ensure_ruby_on_path
82
+ # On a machine with just Vagrant installed there might be no other Ruby except the
83
+ # one bundled with Vagrant. Let's make sure the embedded bin directory containing
84
+ # the Ruby executable is added to the PATH.
85
+ Landrush::Util::Path.ensure_ruby_on_path
86
+
87
+ ruby_bin = Landrush::Util::Path.embedded_vagrant_ruby.nil? ? 'ruby' : Landrush::Util::Path.embedded_vagrant_ruby
88
+ start_server_script = Pathname(__dir__).join('start_server.rb').to_s
89
+ @ui.detail("[landrush] '#{ruby_bin} #{start_server_script} #{port} #{working_dir} #{gems_dir}'") unless @ui.nil?
69
90
  if Vagrant::Util::Platform.windows?
70
91
  # Need to handle Windows differently. Kernel.spawn fails to work, if
71
92
  # the shell creating the process is closed.
@@ -79,31 +100,33 @@ module Landrush
79
100
  # inherited by default, but if any filehandle is passed to
80
101
  # a spawned process then all files that are
81
102
  # set as inheritable will get inherited. In another project this
82
- # created a problem (see:
83
- # https://github.com/dustymabe/vagrant-sshfs/issues/41).
103
+ # created a problem (see: https://github.com/dustymabe/vagrant-sshfs/issues/41).
84
104
  #
85
105
  # Today we don't pass any filehandles, so it isn't a problem.
86
106
  # Future self, make sure this doesn't become a problem.
87
-
88
- info = Process.create(:command_line => "ruby #{__FILE__} #{port} #{working_dir}",
89
- :creation_flags => Process::DETACHED_PROCESS,
90
- :process_inherit => false,
91
- :thread_inherit => true,
92
- :cwd => working_dir.to_path)
107
+ info = Process.create(command_line: "#{ruby_bin} #{start_server_script} #{port} #{working_dir} #{gems_dir}",
108
+ creation_flags: Process::DETACHED_PROCESS,
109
+ process_inherit: false,
110
+ thread_inherit: true,
111
+ cwd: working_dir.to_path)
93
112
  pid = info.process_id
94
113
  else
95
114
  # Fix https://github.com/vagrant-landrush/landrush/issues/249)
96
115
  # by turning of filehandle inheritance with :close_others => true
97
116
  # and by explicitly closing STDIN, STDOUT, and STDERR
98
-
99
- pid = spawn('ruby', __FILE__, port.to_s, working_dir.to_s,
100
- :in => :close, :out => :close, :err => :close,
101
- :close_others => true, :chdir => working_dir.to_path,
102
- :pgroup => true)
117
+ pid = spawn(ruby_bin, start_server_script, port.to_s, working_dir.to_s, gems_dir.to_s,
118
+ in: :close,
119
+ out: :close,
120
+ err: :close,
121
+ close_others: true,
122
+ chdir: working_dir.to_path,
123
+ pgroup: true)
103
124
  Process.detach pid
104
125
  end
105
126
 
106
- write_pid(pid)
127
+ write_pid(pid, pid_file)
128
+ # As of Vagrant 1.8.6 this additonal sleep is needed, otherwise the child process dies!?
129
+ sleep 1
107
130
  end
108
131
 
109
132
  def self.stop
@@ -115,7 +138,7 @@ module Landrush
115
138
  return
116
139
  end
117
140
 
118
- pid = read_pid
141
+ pid = read_pid(pid_file)
119
142
 
120
143
  # Check if the daemon is already stopped...
121
144
  unless running?
@@ -132,7 +155,7 @@ module Landrush
132
155
  end
133
156
 
134
157
  # Otherwise the daemon has been stopped.
135
- delete_pid_file
158
+ delete_pid_file(pid_file)
136
159
  end
137
160
 
138
161
  def self.restart
@@ -141,11 +164,13 @@ module Landrush
141
164
  end
142
165
 
143
166
  def self.pid
144
- IO.read(pid_file).to_i rescue nil
167
+ IO.read(pid_file).to_i
168
+ rescue
169
+ nil
145
170
  end
146
171
 
147
172
  def self.running?
148
- pid = read_pid
173
+ pid = read_pid(pid_file)
149
174
  return false if pid.nil?
150
175
  if Vagrant::Util::Platform.windows?
151
176
  begin
@@ -155,20 +180,24 @@ module Landrush
155
180
  raise e unless e.class.name.start_with?('Errno::ENXIO')
156
181
  end
157
182
  else
158
- !!Process.kill(0, pid) rescue false
183
+ begin
184
+ !!Process.kill(0, pid)
185
+ rescue
186
+ false
187
+ end
159
188
  end
160
189
  end
161
190
 
162
191
  def self.status
163
- case process_status
164
- when :running
165
- puts "Daemon status: running pid=#{read_pid}"
166
- when :stopped
167
- puts 'Daemon status: stopped'
168
- else
169
- puts 'Daemon status: unknown'
170
- puts "#{pid_file} exists, but process is not running"
171
- puts "Check log file: #{log_file_path}"
192
+ case process_status(pid_file)
193
+ when :running
194
+ puts "Daemon status: running pid=#{read_pid(pid_file)}"
195
+ when :stopped
196
+ puts 'Daemon status: stopped'
197
+ else
198
+ puts 'Daemon status: unknown'
199
+ puts "#{pid_file} exists, but process is not running"
200
+ puts "Check log file: #{log_file_path}"
172
201
  end
173
202
  end
174
203
 
@@ -184,7 +213,7 @@ module Landrush
184
213
  @logger.level = Logger::INFO
185
214
 
186
215
  # Start the DNS server
187
- run_dns_server(:listen => interfaces, :logger => @logger) do
216
+ run_dns_server(listen: interfaces, logger: @logger) do
188
217
  match(/.*/, IN::A) do |transaction|
189
218
  host = Store.hosts.find(transaction.name)
190
219
  if host
@@ -215,7 +244,7 @@ module Landrush
215
244
  server = RubyDNS::RuleBasedServer.new(options, &block)
216
245
 
217
246
  EventMachine.run do
218
- trap("INT") do
247
+ trap('INT') do
219
248
  EventMachine.stop
220
249
  end
221
250
 
@@ -227,94 +256,23 @@ module Landrush
227
256
 
228
257
  def self.check_a_record(host, transaction)
229
258
  value = Store.hosts.get(host)
230
- if value.nil?
231
- return
232
- end
259
+ return if value.nil?
233
260
 
234
- if (IPAddr.new(value) rescue nil)
261
+ if begin
262
+ IPAddr.new(value)
263
+ rescue
264
+ nil
265
+ end
235
266
  name = transaction.name =~ /#{host}/ ? transaction.name : host
236
- transaction.respond!(value, :ttl => 0, :name => name)
267
+ transaction.respond!(value, ttl: 0, name: name)
237
268
  else
238
269
  transaction.respond!(Name.create(value), resource_class: IN::CNAME, ttl: 0)
239
270
  check_a_record(value, transaction)
240
271
  end
241
272
  end
242
273
 
243
- # private methods
244
- def self.write_pid(pid)
245
- ensure_path_exits(pid_file)
246
- File.open(pid_file, 'w') {|f| f << pid.to_s}
247
- end
248
-
249
- def self.read_pid
250
- IO.read(pid_file).to_i rescue nil
251
- end
252
-
253
- def self.delete_pid_file
254
- if File.exist? pid_file
255
- FileUtils.rm(pid_file)
256
- end
257
- end
258
-
259
274
  def self.pid_file
260
275
  File.join(working_dir, 'run', 'landrush.pid')
261
276
  end
262
-
263
- def self.process_status
264
- if File.exist? pid_file
265
- return running? ? :running : :unknown
266
- else
267
- return :stopped
268
- end
269
- end
270
-
271
- def self.ensure_path_exits(file_name)
272
- dirname = File.dirname(file_name)
273
- unless File.directory?(dirname)
274
- FileUtils.mkdir_p(dirname)
275
- end
276
- end
277
-
278
- def self.terminate_process(pid)
279
- # Kill/Term loop - if the daemon didn't die easily, shoot
280
- # it a few more times.
281
- attempts = 5
282
- while running? && attempts > 0
283
- sig = (attempts >= 2) ? 'KILL' : 'TERM'
284
-
285
- puts "Sending #{sig} to process #{pid}..."
286
- Process.kill(sig, pid)
287
-
288
- attempts -= 1
289
- sleep 1
290
- end
291
- end
292
-
293
- # On a machine with just Vagrant installed there might be no other Ruby except the
294
- # one bundled with Vagrant. Let's make sure the embedded bin directory containing
295
- # the Ruby executable is added to the PATH.
296
- def self.ensure_ruby_on_path
297
- vagrant_binary = Vagrant::Util::Which.which('vagrant')
298
- vagrant_binary = File.realpath(vagrant_binary) if File.symlink?(vagrant_binary)
299
- # in a Vagrant installation the Ruby executable is in ../embedded/bin relative to the vagrant executable
300
- # we don't use File.join here, since even on Cygwin we want a Windows path - see https://github.com/vagrant-landrush/landrush/issues/237
301
- if Vagrant::Util::Platform.windows?
302
- separator = '\\'
303
- else
304
- separator = '/'
305
- end
306
- embedded_bin_dir = File.dirname(File.dirname(vagrant_binary)) + separator + 'embedded' + separator + 'bin'
307
- ENV['PATH'] = embedded_bin_dir + File::PATH_SEPARATOR + ENV['PATH'] if File.exist?(embedded_bin_dir)
308
- end
309
-
310
- private_class_method :write_pid, :read_pid, :delete_pid_file, :pid_file, :process_status, :ensure_path_exits,
311
- :terminate_process, :ensure_ruby_on_path
312
277
  end
313
278
  end
314
-
315
- # Only run the following code when this file is the main file being run
316
- # instead of having been required or loaded by another file
317
- if __FILE__ == $0
318
- # TODO, Add some argument checks
319
- Landrush::Server.run(ARGV[0], ARGV[1])
320
- end