lib/invoker/power/setup.rb in invoker-1.1.0 vs lib/invoker/power/setup.rb in invoker-1.2.0.pre
- old
+ new
@@ -1,188 +1,51 @@
require "eventmachine"
module Invoker
module Power
class Setup
- RESOLVER_FILE = "/etc/resolver/dev"
- RESOLVER_DIR = "/etc/resolver"
-
- FIREWALL_PLIST_FILE = "/Library/LaunchDaemons/com.codemancers.invoker.firewall.plist"
+ attr_accessor :port_finder
def self.install
- installer = new
- if Invoker.darwin?
- if installer.check_if_setup_can_run?
- installer.setup_invoker
- else
- Invoker::Logger.puts("The setup has been already run.".color(:red))
- end
- else
- Invoker::Logger.puts("Domain feature is currently not supported on systems other than OSX".color(:red))
- end
- installer
+ selected_installer_klass = installer_klass
+ selected_installer_klass.new.install
end
def self.uninstall
- installer = new
- installer.uninstall_invoker
+ selected_installer_klass = installer_klass
+ selected_installer_klass.new.uninstall_invoker
end
- def setup_invoker
- if setup_resolver_file
- find_open_ports
- install_resolver(port_finder.dns_port)
- install_firewall(port_finder.http_port)
- flush_dns_rules()
- # Before writing the config file, drop down to a normal user
- drop_to_normal_user()
- create_config_file()
+ def self.installer_klass
+ if Invoker.darwin?
+ Invoker::Power::OsxSetup
else
- Invoker::Logger.puts("Invoker is not configured to serve from subdomains".color(:red))
+ Invoker::Power::LinuxSetup
end
- self
end
- def uninstall_invoker
- uninstall_invoker_flag = Invoker::CLI::Question.agree("Are you sure you want to uninstall firewall rules created by setup (y/n) : ")
-
- if uninstall_invoker_flag
- remove_resolver_file
- unload_firewall_rule(true)
- flush_dns_rules
- Invoker::Power::Config.delete
- Invoker::Logger.puts("Firewall rules were removed")
+ def install
+ if check_if_setup_can_run?
+ setup_invoker
+ else
+ Invoker::Logger.puts("The setup has been already run.".color(:red))
end
+ self
end
def drop_to_normal_user
EventMachine.set_effective_user(ENV["SUDO_USER"])
end
- def flush_dns_rules
- system("dscacheutil -flushcache")
- end
-
- def create_config_file
- Invoker.setup_config_location
- Invoker::Power::Config.create(
- dns_port: port_finder.dns_port,
- http_port: port_finder.http_port
- )
- end
-
def find_open_ports
port_finder.find_ports()
end
def port_finder
@port_finder ||= Invoker::Power::PortFinder.new()
end
- def install_resolver(dns_port)
- open_resolver_for_write { |fl|
- fl.write(resolve_string(dns_port))
- }
- rescue Errno::EACCES
- Invoker::Logger.puts("Running setup requires root access, please rerun it with sudo".color(:red))
- raise
- end
-
- def remove_resolver_file
- if File.exists?(RESOLVER_FILE)
- File.delete(RESOLVER_FILE)
- end
- rescue Errno::EACCES
- Invoker::Logger.puts("Running uninstall requires root access, please rerun it with sudo".color(:red))
- raise
- end
-
def check_if_setup_can_run?
!File.exists?(Invoker::Power::Config::CONFIG_LOCATION)
end
-
- def install_firewall(balancer_port)
- File.open(FIREWALL_PLIST_FILE, "w") { |fl|
- fl.write(plist_string(balancer_port))
- }
- unload_firewall_rule
- load_firewall_rule
- end
-
- def load_firewall_rule
- system("launchctl load -Fw #{FIREWALL_PLIST_FILE} 2>/dev/null")
- end
-
- def unload_firewall_rule(remove = false)
- system("launchctl unload -w #{FIREWALL_PLIST_FILE} 2>/dev/null")
- system("rm -rf #{FIREWALL_PLIST_FILE}") if remove
- end
-
- # Ripped from POW code
- def plist_string(balancer_port)
- plist =<<-EOD
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-<key>Label</key>
-<string>com.codemancers.invoker</string>
-<key>ProgramArguments</key>
-<array>
-<string>sh</string>
-<string>-c</string>
-<string>#{firewall_command(balancer_port)}</string>
-</array>
-<key>RunAtLoad</key>
-<true/>
-<key>UserName</key>
-<string>root</string>
-</dict>
-</plist>
- EOD
- plist
- end
-
- def resolve_string(dns_port)
- string =<<-EOD
-nameserver 127.0.0.1
-port #{dns_port}
- EOD
- string
- end
-
- # Ripped from Pow code
- def firewall_command(balancer_port)
- "ipfw add fwd 127.0.0.1,#{balancer_port} tcp from any to me dst-port 80 in"\
- "&& sysctl -w net.inet.ip.forwarding=1"
- end
-
- def setup_resolver_file
- return true unless File.exists?(RESOLVER_FILE)
- Invoker::Logger.puts "Invoker has detected an existing Pow installation. We recommend "\
- "that you uninstall pow and rerun this setup.".color(:red)
-
- Invoker::Logger.puts "If you have already uninstalled Pow, proceed with installation"\
- " by pressing y/n."
-
- replace_resolver_flag = Invoker::CLI::Question.agree("Replace Pow configuration (y/n) : ")
-
- if replace_resolver_flag
- Invoker::Logger.puts "Invoker has overwritten one or more files created by Pow. "\
- "If .dev domains still don't resolve locally. Try turning off the wi-fi"\
- " and turning it on. It will force OSX to reload network configuration".color(:green)
- end
- replace_resolver_flag
- end
-
- private
-
- def open_resolver_for_write
- FileUtils.mkdir(RESOLVER_DIR) unless Dir.exists?(RESOLVER_DIR)
- fl = File.open(RESOLVER_FILE, "w")
- yield fl
- ensure
- fl && fl.close
- end
-
end
end
end