182 lines
5.4 KiB
Ruby
182 lines
5.4 KiB
Ruby
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")
|
|
#CONFIG_FILE="#{ENV["HOME"]}/.devops/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, :password].each do |key|
|
|
if config[key].nil?
|
|
abort(I18n.t("config.invalid.empty", :file => @@config_file, :key => key))
|
|
end
|
|
end
|
|
configure_proxy config
|
|
|
|
host = config[:host]
|
|
default = {:username => config[:username], :api => config[:api], :host => config[:host]}
|
|
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
|
|
end
|
|
rescue OptionParser::InvalidOption => e
|
|
puts e.message
|
|
exit(11)
|
|
rescue NotFound => e
|
|
puts "Not found: #{e.message}"
|
|
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
|
|
puts I18n.t("log.warn", :msg => I18n.t("config.not_exist", :file => file))
|
|
config = set_default_config(file)
|
|
end
|
|
config
|
|
end
|
|
|
|
def self.set_default_config file
|
|
locales = I18n.locales
|
|
config = {:api => "v2.0", :locale => "en"}
|
|
I18n.language = config[:locale]
|
|
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"))
|
|
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
|