pull/930/head
Rick Carlino 2018-07-24 15:01:57 -05:00
parent f4925356fe
commit 428f216dd1
6 changed files with 92 additions and 28 deletions

View File

@ -3,12 +3,18 @@ require "bunny"
# A wrapper around AMQP to stay DRY. Will make life easier if we ever need to
# change protocols
class Transport
OPTS = { read_timeout: 10, heartbeat: 10, log_level: 'info' }
# Temporary until production RMQ is properly vetted - RC 24 JUL 18
LEGACY = "amqp://guest:guest@localhost:5672"
PW = ENV["ADMIN_PASSWORD"]
HOST = ENV["MQTT_HOST"]
LOCAL = PW && HOST && "amqp://admin:#{PW}@#{HOST}:5672"
OPTS = { read_timeout: 10, heartbeat: 10, log_level: "info" }
def self.amqp_url
@amqp_url ||= ENV['CLOUDAMQP_URL'] ||
ENV['RABBITMQ_URL'] ||
"amqp://admin:#{ENV.fetch("ADMIN_PASSWORD")}@#{ENV.fetch("MQTT_HOST")}:5672"
@amqp_url ||= ENV["CLOUDAMQP_URL"] ||
ENV["RABBITMQ_URL"] ||
LOCAL ||
LEGACY
end
def self.default_amqp_adapter=(value)
@ -76,6 +82,7 @@ class Transport
require "rabbitmq/http/client"
def self.username
binding.pry
@username ||= URI(Transport.amqp_url).user || "admin"
end

View File

@ -12,9 +12,15 @@ namespace :api do
sh "PORT=3000 bundle exec foreman start --procfile=Procfile.dev"
end
desc "Run __LEGACY__ Webpack and Rails"
task legacy_start: :environment do
sh "PORT=3000 bundle exec foreman start --procfile=mqtt_legacy/Procfile.legacy"
end
desc "Pull the latest Farmbot API version"
task(update: :environment) { same_thing }
desc "Pull the latest Farmbot API version"
task(upgrade: :environment) { same_thing }
end

View File

@ -10,4 +10,15 @@ namespace :mqtt do
retry
end
end
desc "Bootstraps the old MQTT server"
task legacy_start: :environment do
begin
require_relative '../../mqtt_legacy/server.rb'
rescue Errno::ECONNREFUSED
puts "API is not up yet. Waiting 5 seconds..."
sleep 5
retry
end
end
end

View File

@ -0,0 +1,5 @@
# Run Rails & Webpack concurrently
rails: rails s -e development -p ${API_PORT:-3000} -b 0.0.0.0
log_service: rails r lib/log_service_runner.rb
webpack: npm run webpack
worker: rake jobs:work

View File

@ -0,0 +1,30 @@
% THIS FILE IS AUTO GENERATED BY `rabbitmq.config.erb`.
% DO NOT MODIFY `rabbitmq.config` MANUALLY!
[
{
rabbit, [
{ loopback_users, [] },
{ tcp_listeners, [5672] },
{ ssl_listeners, [ ] },
{ hipe_compile, false },
{
auth_backends, [
rabbit_auth_backend_internal,
rabbit_auth_backend_jwt
]}
] },
{ rabbitmq_mqtt, [
{vhost, <<"/">>},
{retained_message_store, rabbit_mqtt_retained_msg_store_noop}
]
},
{ rabbitmq_web_mqtt, [{ port, 3002 }, {vhost, <<"/">>}]},
{
rabbitmq_management, [{listener, [ { port, 15672 }, { ssl, false }] } ] },
{ rabbit_auth_backend_jwt, [
{ farmbot_api_key_url, "http://192.168.1.207:3000/api/public_key" },
{ farmbot_vhost, <<"/">>}
]}
].

View File

@ -1,24 +1,26 @@
require 'erb'
puts "\n" * 10
puts "=== THIS IS A LEGACY BROKER. DONT USE THIS UNLESS YOU HAVE A GOOD REASON."
puts "\n" * 10
puts "=== Retrieving container info"
PLUGIN_PATH = "mqtt/jwt_plugin/plugins/rabbit_auth_backend*"
PLUGIN_IS_BUILT = Dir[PLUGIN_PATH].any?
FORCE_REBUILD = ENV["FORCE_REBUILD"].present?
DOCKER_IMG_NAME = "farmbot-mqtt"
IMG_IS_BUILT = `cd mqtt; sudo docker images`.include?(DOCKER_IMG_NAME)
PLUGIN_PATH ||= "mqtt_legacy/jwt_plugin/plugins/rabbit_auth_backend*"
PLUGIN_IS_BUILT ||= Dir[PLUGIN_PATH].any?
FORCE_REBUILD ||= ENV["FORCE_REBUILD"].present?
DOCKER_IMG_NAME ||= "farmbot-mqtt-legacy"
IMG_IS_BUILT ||= `cd mqtt_legacy; sudo docker images`.include?(DOCKER_IMG_NAME)
puts "=== Setting config data"
CONFIG_PATH = "./mqtt"
CONFIG_FILENAME = "rabbitmq.config"
CONFIG_OUTPUT = "#{CONFIG_PATH}/#{CONFIG_FILENAME}"
NO_API_HOST = "\nYou MUST set API_HOST to a real IP address or " +
CONFIG_PATH ||= "./mqtt_legacy"
CONFIG_FILENAME ||= "rabbitmq.config"
CONFIG_OUTPUT ||= "#{CONFIG_PATH}/#{CONFIG_FILENAME}"
NO_API_HOST ||= "\nYou MUST set API_HOST to a real IP address or " +
"domain name (not localhost).\n" +
"API_PORT is also mandatory."
TEMPLATE_FILE = "./mqtt/rabbitmq.config.erb"
TEMPLATE = File.read(TEMPLATE_FILE)
RENDERER = ERB.new(TEMPLATE)
PROTO = ENV["FORCE_SSL"] ? "https:" : "http:"
VHOST = ENV.fetch("MQTT_VHOST") { "/" }
TEMPLATE_FILE ||= "./mqtt_legacy/rabbitmq.config.erb"
TEMPLATE ||= File.read(TEMPLATE_FILE)
RENDERER ||= ERB.new(TEMPLATE)
PROTO ||= ENV["FORCE_SSL"] ? "https:" : "http:"
VHOST ||= ENV.fetch("MQTT_VHOST") { "/" }
if !ENV["API_HOST"] || !ENV["API_PORT"]
puts NO_API_HOST
@ -31,35 +33,38 @@ farmbot_api_key_url = ENV.fetch("API_PUBLIC_KEY_PATH") do
end
# Write the config file.
File.write(CONFIG_OUTPUT, RENDERER.result(binding))
conf = RENDERER.result(binding)
file = CONFIG_OUTPUT
File.write(file, conf)
# Re-init docker stuff
processes = `sudo docker ps -a -f "name=farmbot-mqtt" -q`
processes = `sudo docker ps -a -f "name=farmbot-mqtt-legacy" -q`
if processes.present?
puts "=== Stopping pre-existing farmbot containers"
sh "cd mqtt && sudo docker stop #{processes}"
sh "cd mqtt && sudo docker rm #{processes}"
sh "cd mqtt_legacy && sudo docker stop #{processes}"
sh "cd mqtt_legacy && sudo docker rm #{processes}"
end
if IMG_IS_BUILT
puts "=== Destroying old docker images"
sh "cd mqtt; sudo docker rmi #{DOCKER_IMG_NAME} --force"
sh "cd mqtt_legacy; sudo docker rmi #{DOCKER_IMG_NAME} --force"
end
puts "=== Building docker image"
sh "cd mqtt; sudo docker build -t farmbot-mqtt ."
sh "cd mqtt_legacy; sudo docker build -t farmbot-mqtt-legacy ."
puts "=== Starting MQTT"
exec [
'cd mqtt;',
'cd mqtt_legacy;',
'sudo docker run',
'-p "5672:5672"', # AMQP (RabbitMQ)
'-p "1883:1883"', # MQTT
'-p "8883:8883"', # MQTT over TLS/SSL
'-p "3002:15675"', # MQTT over WebSockets
'--name "farmbot-mqtt"',
'farmbot-mqtt'
'--name "farmbot-mqtt-legacy"',
'farmbot-mqtt-legacy'
].join(" ")