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 |