#!/usr/bin/env ruby # coding: utf-8 require "mcrain" require "optparse" opts = { verbose: false, config_file: ".mcrain.yml" } ARGV.options do |q| q.banner = < [n] [options] actions: start, stop or pull start: service: redis, rabbitmq, mysql or riak n: cluster size for riak stop: service: redis, rabbitmq, mysql or riak pull: service: redis, rabbitmq, mysql, riak or all [options] MESSAGE q.on("-c", "--config=file", "Path to mcrain config file, default: .mcrain.yml"){ |v| opts[:config_file] = v } q.on("-V", "--verbose"){ |v| opts[:verbose] = v } q.parse! end action, service, *args = *ARGV if action.nil? || service.nil? $stderr.puts ARGV.options exit(1) end unless opts[:verbose] require 'logger' Mcrain.logger = Logger.new("/dev/null") end if opts[:config_file] && File.exist?(opts[:config_file]) Mcrain.logger.debug "Loading config file from #{opts[:config_file]}" Mcrain.load_config opts[:config_file] else Mcrain.logger.debug "Skipped to load config file" end begin options = {} case service when "riak" then cluster_size = args.shift.to_i cluster_size = 1 if cluster_size == 0 options = {cluster_size: cluster_size, automatic_clustering: cluster_size > 1} end cid_filepath = ".mcrain.#{service}.cid" case action when "start" then if File.exist?(cid_filepath) $stderr.puts("\e[31m#{service} is already run on docker. Check #{cid_filepath}\e[0m") exit(1) else server = Mcrain.class_for(service.to_sym).new(options) server.start open(cid_filepath, "w"){|f| f.puts(server.container.id)} puts "To connect:\n#{server.client_script}" end when "stop" then if File.readable?(cid_filepath) cid = File.read(cid_filepath).strip if system("docker kill #{cid} && docker rm #{cid} >/dev/null") File.delete(cid_filepath) else $stderr.puts("\e[31mFailed to stop or rm container #{cid}. `rm #{cid_filepath}` unless the container exists.\e[0m") exit(1) end else $stderr.puts("\e[31m#{service} container is not found.\e[0m") exit(1) end when "pull" then services = (service == "all") ? Mcrain.configuration.images.keys : [service] services.map(&:to_sym).map{|s| Mcrain.class_for(s)}.each(&:pull_image) else raise "Unknown action: #{action.inspect}" end rescue => e $stderr.puts "\e[31m[#{e.class}] #{e.message}\e[0m" $stderr.puts e.backtrace.join("\n ") if opts[:verbose] exit(1) else $stderr.puts "\e[32mOK\e[0m" exit(0) end