fluke/devops-client/lib/devops-client.rb

181 lines
5.5 KiB
Ruby
Raw Normal View History

2014-05-08 15:34:26 +04:00
require 'devops-client/name'
require "devops-client/version"
require "devops-client/handler/handler_factory"
require "exceptions/not_found"
require "exceptions/invalid_query"
require "exceptions/devops_exception"
require "optparse"
require "devops-client/i18n"
module DevopsClient
DEVOPS_HOME = "#{ENV["HOME"]}/.devops/"
# properties file key=value
@@config_file = File.join(DEVOPS_HOME, "devops-client.conf")
def self.config_file
@@config_file
end
def self.run
DevopsClient::get_config_file_option
config = DevopsClient::read_config(@@config_file)
I18n.language=(config[:locale] || "en")
if ARGV.include? "--completion"
init_completion
exit
end
if config[:host].nil?
abort(I18n.t("config.invalid.host"), :file => @@config_file)
end
[:api, :username].each do |key|
2014-07-11 11:19:01 +04:00
if config[key].nil? or config[key].empty?
2014-05-08 15:34:26 +04:00
abort(I18n.t("config.invalid.empty", :file => @@config_file, :key => key))
end
end
configure_proxy config
host = config[:host]
2014-07-11 11:19:01 +04:00
default = {:username => config[:username], :api => config[:api], :host => config[:host], :prefix => ((config[:prefix].nil? or config[:prefix].empty?) ? nil : config[:prefix])}
2014-05-08 15:34:26 +04:00
auth = {:username => config[:username], :password => config[:password], :type => "basic"}
handler = HandlerFactory.create(ARGV[0], host, auth, default)
result = handler.handle
if result.is_a?(Hash)
puts result["message"]
else
puts result if result
2014-05-08 15:34:26 +04:00
end
rescue OptionParser::InvalidOption => e
puts e.message
exit(11)
rescue NotFound => e
2018-04-04 22:44:39 +03:00
puts e.message
2014-05-08 15:34:26 +04:00
exit(12)
rescue InvalidQuery => e
puts "Invalid query: #{e.message}"
exit(13)
rescue DevopsException => e
puts I18n.t("log.error", :msg => e.message)
exit(14)
rescue => e
puts I18n.t("log.error", :msg => e.message)
raise e
rescue Interrupt
puts "\nInterrupted"
exit(15)
end
PROXY_TYPE_NONE = "none"
PROXY_TYPE_SYSTEM = "system"
PROXY_TYPE_CUSTOM = "custom"
PROXY_TYPES = [PROXY_TYPE_NONE, PROXY_TYPE_SYSTEM, PROXY_TYPE_CUSTOM]
PROXY_ENV = ["all_proxy", "ALL_PROXY", "proxy", "PROXY", "http_proxy", "HTTP_PROXY", "https_proxy", "HTTPS_PROXY"]
def self.configure_proxy config
config[:proxy_type] = PROXY_TYPE_NONE if config[:proxy_type].nil?
case config[:proxy_type]
when PROXY_TYPE_SYSTEM
nil
when PROXY_TYPE_NONE
PROXY_ENV.each {|k| ENV[k] = nil}
when PROXY_TYPE_CUSTOM
["http_proxy", "HTTP_PROXY"].each {|k| ENV[k] = config[:http_proxy]}
else
abort(I18n.t("config.invalid.proxy_type", :file => @@config_file, :values => PROXY_TYPES.join(", ")))
end
end
def self.read_config file
config = {}
if File.exists? file
File.open(file, "r") do |f|
f.each_line do |line|
line.strip!
next if line.empty? or line.start_with?("#")
buf = line.split("=")
config[buf[0].strip.to_sym] = buf[1].strip if !(buf[1].nil? or buf[1].empty?)
end
end
else
config = set_default_config(file)
end
config
end
def self.set_default_config file
locales = I18n.locales
2018-04-04 22:44:39 +03:00
config = {:api => "v3", :locale => "en"}
2014-05-08 15:34:26 +04:00
I18n.language = config[:locale]
2014-07-11 11:19:01 +04:00
puts I18n.t("log.warn", :msg => I18n.t("config.not_exist", :file => file))
2014-05-08 15:34:26 +04:00
config[:locale] = begin
l = get_config_parameter(I18n.t("config.property.lang", :langs => locales.join(", ")), config[:locale])
raise ArgumentError unless locales.include?(l)
I18n.language = l
l
rescue ArgumentError
retry
end
config[:host] = get_config_parameter(I18n.t("config.property.host"))
2014-07-11 11:19:01 +04:00
config[:prefix] = get_config_parameter(I18n.t("config.property.prefix"))
2014-05-08 15:34:26 +04:00
config[:api] = get_config_parameter(I18n.t("config.property.api"), config[:api])
config[:username] = get_config_parameter(I18n.t("config.property.username"))
config[:password] = get_config_parameter(I18n.t("config.property.password"))
begin
config[:proxy_type] = get_config_parameter(I18n.t("config.property.proxy_type"))
raise ArgumentError unless PROXY_TYPES.include?(config[:proxy_type])
rescue ArgumentError
retry
end
if config[:proxy_type] == PROXY_TYPE_CUSTOM
config[:http_proxy] = get_config_parameter(I18n.t("config.property.http_proxy"))
end
dir = File.dirname(@@config_file)
require "fileutils"
FileUtils.mkdir(dir) unless File.exists? dir
File.open(file, "w") do |f|
config.each do |k,v|
f.puts "#{k.to_s}=#{v}"
end
end
puts I18n.t("config.created", :file => file)
config
end
def self.get_config_parameter msg, default=nil
print(msg + (default.nil? ? ": " : "(#{default}): "))
p = STDIN.gets.strip
return (p.empty? ? default : p)
end
def self.get_config_file_option
ARGV.each_index do |i|
if ARGV[i] == "-c" or ARGV[i] == "--config"
if ARGV[i+1] !~ /^-.*/ and ARGV[i+i] !~ /^--.*/
@@config_file = ARGV[i+1]
ARGV.delete_at(i)
ARGV.delete_at(i)
else
puts I18n.t("log.error", :msg => I18n.t("config.invalid.parameter"))
exit(3)
end
end
end
end
def self.init_completion
spec = Gem::Specification.find_by_name(DevopsClient::NAME)
gem_root = spec.gem_dir
path = File.join(gem_root, "completion", "devops_complete.sh")
require "fileutils"
FileUtils.cp(path, DEVOPS_HOME)
file = File.join(DEVOPS_HOME, "devops_complete.sh")
puts I18n.t("completion.message", :file => file)
puts "\n\e[32m#{I18n.t("completion.put", :file => file)}\e[0m"
end
end